From b5b1fa5f1388f5614f6d443bcb24ed0c371c4585 Mon Sep 17 00:00:00 2001 From: Juan Tejada Date: Fri, 15 Oct 2021 12:55:08 -0700 Subject: [PATCH 001/628] Update React DevTools v4.20.0 Summary: Update `react-devtools-core` and `react-devtools` dependencies for RN, VSCode, Flipper, etc. `js1 upgrade react-devtools -v 4.20.0` # Changelog: [General][Changed] - Upgraded react-devtools-core dependency to 4.20.0 Reviewed By: bvaughn Differential Revision: D31694359 fbshipit-source-id: d05d75e9473878828617c5cd0db8d6008b6abd4d --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 50cfac09c649..9a1c7f65d12c 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "pretty-format": "^26.5.2", "promise": "^8.0.3", "prop-types": "^15.7.2", - "react-devtools-core": "4.19.1", + "react-devtools-core": "4.20.0", "react-refresh": "^0.4.0", "regenerator-runtime": "^0.13.2", "scheduler": "^0.20.2", diff --git a/yarn.lock b/yarn.lock index 591bd1f14869..1aeb15ae1c4a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5554,10 +5554,10 @@ range-parser@~1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= -react-devtools-core@4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.19.1.tgz#bc37c2ef2f48f28c6af4c7292be9dca1b63deace" - integrity sha512-2wJiGffPWK0KggBjVwnTaAk+Z3MSxKInHmdzPTrBh1mAarexsa93Kw+WMX88+XjN+TtYgAiLe9xeTqcO5FfJTw== +react-devtools-core@4.20.0: + version "4.20.0" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.20.0.tgz#49640f374bcf541cd86410d86c2cb07392005b33" + integrity sha512-85889TaQpU4HImySgOjVwsGE1vkS9dgEjtruRHutnXlBN3IZN8lDRuqRBLmhFkS50BEmfpTR28qV7bHAqwHooA== dependencies: shell-quote "^1.6.1" ws "^7" From aeca339f3fb5f0286f558dec3a234eabf5b2e7df Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Fri, 15 Oct 2021 15:37:36 -0700 Subject: [PATCH 002/628] Add upgrade regression form Summary: Changelog: [Internal] - Move issues away from upgrade-support repo Reviewed By: fkgozali Differential Revision: D31701556 fbshipit-source-id: 45e8da922798fb4323dda7d3d06dfa9bfc8191d0 --- .github/ISSUE_TEMPLATE/config.yml | 3 -- .../ISSUE_TEMPLATE/release_blocker_form.yml | 2 +- .../upgrade-regression-form.yml | 46 +++++++++++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/upgrade-regression-form.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 7821e038ec89..c50c3e2a4f2f 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -3,9 +3,6 @@ contact_links: - name: 📃 Documentation Issue url: https://github.com/facebook/react-native-website/issues about: Please report documentation issues in the React Native website repository. - - name: ⤴️ Upgrade Issue - url: https://github.com/react-native-community/upgrade-support - about: Need help upgrading to a newer React Native version? Visit the Upgrade Support repository. - name: 🤔 Questions and Help url: https://reactnative.dev/help about: Looking for help with your app? Please refer to the React Native community's support resources. diff --git a/.github/ISSUE_TEMPLATE/release_blocker_form.yml b/.github/ISSUE_TEMPLATE/release_blocker_form.yml index c0310da2a80f..82e40388dd17 100644 --- a/.github/ISSUE_TEMPLATE/release_blocker_form.yml +++ b/.github/ISSUE_TEMPLATE/release_blocker_form.yml @@ -1,5 +1,5 @@ name: Release Candidate Blocker -description: File an issue against the current release candidate. +description: If you are testing a release candidate (0.XX.0-rc.Y) and run into an issue. labels: ["Needs: Triage :mag:", "pre-release"] body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml b/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml new file mode 100644 index 000000000000..fc1276697393 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml @@ -0,0 +1,46 @@ +name: Upgrade Regression +description: If you are upgrading/upgraded to a [stable release](https://github.com/facebook/react-native/releases/latest) and encounter a regression. +labels: ["Needs: Triage :mag:", "Type: Upgrade Issue"] +body: + - type: markdown + attributes: + value: | + Please use this form to file an issue if you have upgarded or are upgrading to [latest stable release](https://github.com/facebook/react-native/releases/latest) and have experienced a regression (something that used to work in previous version). + - type: input + id: new-version + attributes: + label: New Version + description: This is the version you are attempting to upgrade to. + placeholder: ex. 0.66.1 + validations: + required: true + - type: input + id: old-version + attributes: + label: Old Version + description: This is the version you were on where the behavior was working. + placeholder: ex. 0.65.1 + validations: + required: true + - type: input + id: target + attributes: + label: Build Target(s) + description: What target(s) are encountering this issue? + placeholder: iOS simulator in release flavor + validations: + required: true + - type: textarea + id: environment + attributes: + label: Developer Environment + description: Please list relevant versions of system, tooling. Ex. OS, processor, Xcode, etc. + validations: + required: true + - type: textarea + id: reproduction + attributes: + label: Issue and Reproduction Steps + description: Please describe the issue and list out commands run to reproduce. + validations: + required: true From f3eb675d23943dfd40e5b73bf6cd80a8859057d9 Mon Sep 17 00:00:00 2001 From: Phillip Pan Date: Fri, 15 Oct 2021 16:13:50 -0700 Subject: [PATCH 003/628] clean up RCTFabricSurface imports Summary: Changelog: [Internal] making these imports a little more optimal & clean Reviewed By: javache Differential Revision: D31594240 fbshipit-source-id: 076610454a6f3c35ac58e97bd9f887b05b86f5bb --- React/Fabric/Surface/RCTFabricSurface.h | 3 --- React/Fabric/Surface/RCTFabricSurface.mm | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/React/Fabric/Surface/RCTFabricSurface.h b/React/Fabric/Surface/RCTFabricSurface.h index 77b3c906cc7d..637970dce888 100644 --- a/React/Fabric/Surface/RCTFabricSurface.h +++ b/React/Fabric/Surface/RCTFabricSurface.h @@ -6,8 +6,6 @@ */ #import -#import -#import #import NS_ASSUME_NONNULL_BEGIN @@ -15,7 +13,6 @@ NS_ASSUME_NONNULL_BEGIN @class RCTBridge; @class RCTSurfaceView; @class RCTSurfacePresenter; -@protocol RCTSurfaceDelegate; /** * (This is Fabric-compatible RCTSurface implementation.) diff --git a/React/Fabric/Surface/RCTFabricSurface.mm b/React/Fabric/Surface/RCTFabricSurface.mm index 686e7794c472..12dd5dd4bc86 100644 --- a/React/Fabric/Surface/RCTFabricSurface.mm +++ b/React/Fabric/Surface/RCTFabricSurface.mm @@ -22,6 +22,7 @@ #import #import #import +#import #import "RCTSurfacePresenter.h" From f319c1aa61977cfc6e64bbbe1f9c710eccbfdf9b Mon Sep 17 00:00:00 2001 From: Kevin Gozali Date: Fri, 15 Oct 2021 17:29:04 -0700 Subject: [PATCH 004/628] OSS CI: skip bundle size reporting for *-stable branches Summary: The size information is currently not used for release branches. Further, the CI step failed because there is no PR associated with commits in RC branch. This commit fixed that error by skipping the entire work altogether. Sample error: https://app.circleci.com/pipelines/github/facebook/react-native/10161/workflows/3625732a-531f-435d-83b6-1dbc638e1bab/jobs/215405/parallel-runs/0/steps/0-125 In theory, we should be storing RC bundle sizes as well, but the current backing Firebase DB has not been configured with proper index: ``` Error [FirebaseError]: The query requires an index. ... ``` Changelog: [Internal] Reviewed By: lunaleaps Differential Revision: D31705912 fbshipit-source-id: 26757174f7937cb23d8e55066b833ae15ec011e3 --- bots/report-bundle-size.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bots/report-bundle-size.js b/bots/report-bundle-size.js index 5d422483909e..75cc461c150f 100644 --- a/bots/report-bundle-size.js +++ b/bots/report-bundle-size.js @@ -47,6 +47,7 @@ async function reportSizeStats(stats, replacePattern) { ); const collection = datastore.getBinarySizesCollection(store); + // Collect the current sizes for main branch only. if (GITHUB_REF === 'main') { // Ensure we only store numbers greater than zero. const validatedStats = Object.keys(stats).reduce((validated, key) => { @@ -65,6 +66,8 @@ async function reportSizeStats(stats, replacePattern) { validatedStats, ); } + } else if (GITHUB_REF.endsWith('-stable')) { + console.log(`Skipping bundle size reporting for branch: ${GITHUB_REF}`); } else { const document = await datastore.getLatestDocument(collection); From e1b698c5f2b1d689fb3940f8c6a3e298d381ea3a Mon Sep 17 00:00:00 2001 From: Jordan Becker Date: Fri, 15 Oct 2021 18:54:47 -0700 Subject: [PATCH 005/628] fix(RCTBlobManager): Prevent RCTConvert error for allowed null blob types (#32397) Summary: While reworking our media picker, I ended up replacing the RNFetchBlob library to use `fetch()`, leveraging React Native's file resolver (especially to interpret `photos://` URI paths). The migration process was pretty straightforward, however I kept getting RCTConvert errors when calling `fetch` with a `PUT` method and a blob body: ``` JSON value '' of type NSNull cannot be converted to NSString +[RCTConvert NSString:] RCTConvert.m:59 -[RCTBlobManager handleNetworkingRequest:] -[RCTNetworking processDataForHTTPQuery:callback:] -[RCTNetworking buildRequest:completionBlock:] -[RCTNetworking sendRequest:callback:] __invoking___ -[NSInvocation invoke] -[NSInvocation invokeWithTarget:] -[RCTModuleMethod invokeWithBridge:module:arguments:] Test Plan: I'll put my `fetch` snippet here. This is using a third-party library in order to get a signed URL, but it is otherwise pretty straightforward. This snippet would trigger an error before the changes introduced by this PR. ```js // Setup (specific to third-party lib) const key = `file/path/in/bucket` const params = { Key: key, Bucket: 'my.awesome.bucket', } const s3url = await s3.getSignedUrl('putObject', params) // Letting RN handle how to retrieve a platform-specific resource URI const localFetch = await fetch(localPath) // Getting the blob to upload as octet-stream const blob = await localFetch.blob() // Actually uploading await fetch(s3url, { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/octet-stream', }, body: blob, }) ``` Reviewed By: RSNara Differential Revision: D31625636 Pulled By: sota000 fbshipit-source-id: a7770018bc3ff2f41321b1bd26ec145b86b18784 --- Libraries/Blob/RCTBlobManager.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Libraries/Blob/RCTBlobManager.mm b/Libraries/Blob/RCTBlobManager.mm index 425dc73fb6c0..f156461a78aa 100755 --- a/Libraries/Blob/RCTBlobManager.mm +++ b/Libraries/Blob/RCTBlobManager.mm @@ -262,7 +262,7 @@ - (NSDictionary *)handleNetworkingRequest:(NSDictionary *)data NSDictionary *blob = [RCTConvert NSDictionary:data[@"blob"]]; NSString *contentType = @"application/octet-stream"; - NSString *blobType = [RCTConvert NSString:blob[@"type"]]; + NSString *blobType = [RCTConvert NSString:RCTNilIfNull(blob[@"type"])]; if (blobType != nil && blobType.length > 0) { contentType = blob[@"type"]; } From f1b5fe1d3ea49294d8c89accfa27d76a1a97ccea Mon Sep 17 00:00:00 2001 From: Lulu Wu Date: Sun, 17 Oct 2021 02:53:44 -0700 Subject: [PATCH 006/628] Prevent NPE on ThemedReactContext Summary: When pre-prerendering a surface without rendering it, "SurfaceMountingManager.getContext()" will return null since no ThemedReactContext is passed into it: https://www.internalfb.com/code/fbsource/[0f4812c8039d975b3651dfa756d60a882bf8e193]/xplat/js/react-native-github/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java?lines=298-317 Changelog: [Android][Fixed] - Prevent NPE on ThemedReactContext Reviewed By: ShikaSD Differential Revision: D31691022 fbshipit-source-id: 4cca6c4550a77075f8fd754dbf21fe5bf5da77e6 --- .../main/java/com/facebook/react/fabric/FabricUIManager.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java index 270b9466b0d3..a16127039522 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -559,6 +559,11 @@ public boolean getThemeData(int surfaceId, float[] defaultTextInputPadding) { SurfaceMountingManager surfaceMountingManager = mMountingManager.getSurfaceManagerEnforced(surfaceId, "getThemeData"); ThemedReactContext themedReactContext = surfaceMountingManager.getContext(); + + if (themedReactContext == null) { + FLog.w(TAG, "\"themedReactContext\" is null when call \"getThemeData\""); + return false; + } float[] defaultTextInputPaddingForTheme = UIManagerHelper.getDefaultTextInputPadding(themedReactContext); defaultTextInputPadding[0] = defaultTextInputPaddingForTheme[PADDING_START_INDEX]; From 61755aced131d5625da38ca0ae19efc6ebdc0205 Mon Sep 17 00:00:00 2001 From: Rob Hogan Date: Mon, 18 Oct 2021 02:14:33 -0700 Subject: [PATCH 007/628] Merge textDecoration(LineStyle|LinePattern) into textDecorationStyle Summary: The [first implementation of `TextAttributes` in Fabric](https://github.com/facebook/react-native/commit/62576bcb7832e08c6fd9f9482285882c37a2ece5) included two separate props instead of `textDecorationStyle`: `textDecorationLineStyle` (single, double, ...) and `textDecorationLinePattern` (dot, dash, dotdash, ...). These two props were implemented in C++ and iOS but never supported in JS. Pre-Fabric (and CSS) on the other hand use a single prop `textDecorationStyle: 'solid' | 'double' | 'dotted' | 'dashed'`. This diff implements this same API in Fabric, and removes the unused `textDecorationLineStyle` and `textDecorationLinePattern` props. Changelog: [iOS][Fixed] - Implement `textDecorationStyle` on iOS and remove unused `textDecorationLineStyle` and `textDecorationLinePattern` from Fabric. Reviewed By: dmitryrykun Differential Revision: D31617598 fbshipit-source-id: f5173e7ecdd31aafa0e5f0e50137eefa0505e007 --- .../react/views/text/TextAttributeProps.java | 7 +- .../attributedstring/TextAttributes.cpp | 21 +--- .../attributedstring/TextAttributes.h | 6 +- .../renderer/attributedstring/conversions.h | 118 +++++------------- .../renderer/attributedstring/primitives.h | 21 +--- .../components/text/BaseTextProps.cpp | 14 +-- .../platform/ios/RCTAttributedTextUtils.mm | 5 +- .../ios/RCTTextPrimitivesConversions.h | 45 ++----- 8 files changed, 58 insertions(+), 179 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.java index 6c93d200e857..7c4419c68ee1 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.java @@ -47,8 +47,7 @@ public class TextAttributeProps { public static final short TA_KEY_BEST_WRITING_DIRECTION = 13; public static final short TA_KEY_TEXT_DECORATION_COLOR = 14; public static final short TA_KEY_TEXT_DECORATION_LINE = 15; - public static final short TA_KEY_TEXT_DECORATION_LINE_STYLE = 16; - public static final short TA_KEY_TEXT_DECORATION_LINE_PATTERN = 17; + public static final short TA_KEY_TEXT_DECORATION_STYLE = 16; public static final short TA_KEY_TEXT_SHADOW_RAIDUS = 18; public static final short TA_KEY_TEXT_SHADOW_COLOR = 19; public static final short TA_KEY_IS_HIGHLIGHTED = 20; @@ -192,9 +191,7 @@ public static TextAttributeProps fromReadableMapBuffer(ReadableMapBuffer props) case TA_KEY_TEXT_DECORATION_LINE: result.setTextDecorationLine(entry.getString()); break; - case TA_KEY_TEXT_DECORATION_LINE_STYLE: - break; - case TA_KEY_TEXT_DECORATION_LINE_PATTERN: + case TA_KEY_TEXT_DECORATION_STYLE: break; case TA_KEY_TEXT_SHADOW_RAIDUS: result.setTextShadowRadius(entry.getInt(1)); diff --git a/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp b/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp index 9aaea5aec5a9..8c014d5a443c 100644 --- a/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp +++ b/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp @@ -71,13 +71,9 @@ void TextAttributes::apply(TextAttributes textAttributes) { textDecorationLineType = textAttributes.textDecorationLineType.hasValue() ? textAttributes.textDecorationLineType : textDecorationLineType; - textDecorationLineStyle = textAttributes.textDecorationLineStyle.hasValue() - ? textAttributes.textDecorationLineStyle - : textDecorationLineStyle; - textDecorationLinePattern = - textAttributes.textDecorationLinePattern.hasValue() - ? textAttributes.textDecorationLinePattern - : textDecorationLinePattern; + textDecorationStyle = textAttributes.textDecorationStyle.hasValue() + ? textAttributes.textDecorationStyle + : textDecorationStyle; // Shadow textShadowOffset = textAttributes.textShadowOffset.hasValue() @@ -117,8 +113,7 @@ bool TextAttributes::operator==(const TextAttributes &rhs) const { baseWritingDirection, textDecorationColor, textDecorationLineType, - textDecorationLineStyle, - textDecorationLinePattern, + textDecorationStyle, textShadowOffset, textShadowColor, isHighlighted, @@ -137,8 +132,7 @@ bool TextAttributes::operator==(const TextAttributes &rhs) const { rhs.baseWritingDirection, rhs.textDecorationColor, rhs.textDecorationLineType, - rhs.textDecorationLineStyle, - rhs.textDecorationLinePattern, + rhs.textDecorationStyle, rhs.textShadowOffset, rhs.textShadowColor, rhs.isHighlighted, @@ -199,10 +193,7 @@ SharedDebugStringConvertibleList TextAttributes::getDebugProps() const { debugStringConvertibleItem("textDecorationColor", textDecorationColor), debugStringConvertibleItem( "textDecorationLineType", textDecorationLineType), - debugStringConvertibleItem( - "textDecorationLineStyle", textDecorationLineStyle), - debugStringConvertibleItem( - "textDecorationLinePattern", textDecorationLinePattern), + debugStringConvertibleItem("textDecorationStyle", textDecorationStyle), // Shadow debugStringConvertibleItem("textShadowOffset", textShadowOffset), diff --git a/ReactCommon/react/renderer/attributedstring/TextAttributes.h b/ReactCommon/react/renderer/attributedstring/TextAttributes.h index b7f07b962dae..56c30652179e 100644 --- a/ReactCommon/react/renderer/attributedstring/TextAttributes.h +++ b/ReactCommon/react/renderer/attributedstring/TextAttributes.h @@ -61,8 +61,7 @@ class TextAttributes : public DebugStringConvertible { // Decoration SharedColor textDecorationColor{}; better::optional textDecorationLineType{}; - better::optional textDecorationLineStyle{}; - better::optional textDecorationLinePattern{}; + better::optional textDecorationStyle{}; // Shadow // TODO: Use `Point` type instead of `Size` for `textShadowOffset` attribute. @@ -124,8 +123,7 @@ struct hash { textAttributes.baseWritingDirection, textAttributes.textDecorationColor, textAttributes.textDecorationLineType, - textAttributes.textDecorationLineStyle, - textAttributes.textDecorationLinePattern, + textAttributes.textDecorationStyle, textAttributes.textShadowOffset, textAttributes.textShadowRadius, textAttributes.textShadowColor, diff --git a/ReactCommon/react/renderer/attributedstring/conversions.h b/ReactCommon/react/renderer/attributedstring/conversions.h index 56ab6bdef943..576b8f008bb6 100644 --- a/ReactCommon/react/renderer/attributedstring/conversions.h +++ b/ReactCommon/react/renderer/attributedstring/conversions.h @@ -475,94 +475,45 @@ inline std::string toString( inline void fromRawValue( const PropsParserContext &context, const RawValue &value, - TextDecorationLineStyle &result) { - react_native_assert(value.hasType()); - if (value.hasType()) { - auto string = (std::string)value; - if (string == "single") { - result = TextDecorationLineStyle::Single; - } else if (string == "thick") { - result = TextDecorationLineStyle::Thick; - } else if (string == "double") { - result = TextDecorationLineStyle::Double; - } else { - LOG(ERROR) << "Unsupported TextDecorationLineStyle value: " << string; - react_native_assert(false); - // sane default for prod - result = TextDecorationLineStyle::Single; - } - return; - } - - LOG(ERROR) << "Unsupported TextDecorationLineStyle type"; - // sane default for prod - result = TextDecorationLineStyle::Single; -} - -inline std::string toString( - const TextDecorationLineStyle &textDecorationLineStyle) { - switch (textDecorationLineStyle) { - case TextDecorationLineStyle::Single: - return "single"; - case TextDecorationLineStyle::Thick: - return "thick"; - case TextDecorationLineStyle::Double: - return "double"; - } - - LOG(ERROR) << "Unsupported TextDecorationLineStyle value"; - react_native_assert(false); - // sane default for prod - return "single"; -} - -inline void fromRawValue( - const PropsParserContext &context, - const RawValue &value, - TextDecorationLinePattern &result) { + TextDecorationStyle &result) { react_native_assert(value.hasType()); if (value.hasType()) { auto string = (std::string)value; if (string == "solid") { - result = TextDecorationLinePattern::Solid; - } else if (string == "dot") { - result = TextDecorationLinePattern::Dot; - } else if (string == "dash") { - result = TextDecorationLinePattern::Dash; - } else if (string == "dash-dot") { - result = TextDecorationLinePattern::DashDot; - } else if (string == "dash-dot-dot") { - result = TextDecorationLinePattern::DashDotDot; + result = TextDecorationStyle::Solid; + } else if (string == "double") { + result = TextDecorationStyle::Double; + } else if (string == "dotted") { + result = TextDecorationStyle::Dotted; + } else if (string == "dashed") { + result = TextDecorationStyle::Dashed; } else { - LOG(ERROR) << "Unsupported TextDecorationLinePattern value: " << string; + LOG(ERROR) << "Unsupported TextDecorationStyle value: " << string; react_native_assert(false); // sane default for prod - result = TextDecorationLinePattern::Solid; + result = TextDecorationStyle::Solid; } return; } - LOG(ERROR) << "Unsupported TextDecorationLineStyle type"; + LOG(ERROR) << "Unsupported TextDecorationStyle type"; // sane default for prod - result = TextDecorationLinePattern::Solid; + result = TextDecorationStyle::Solid; } -inline std::string toString( - const TextDecorationLinePattern &textDecorationLinePattern) { - switch (textDecorationLinePattern) { - case TextDecorationLinePattern::Solid: +inline std::string toString(const TextDecorationStyle &textDecorationStyle) { + switch (textDecorationStyle) { + case TextDecorationStyle::Solid: return "solid"; - case TextDecorationLinePattern::Dot: - return "dot"; - case TextDecorationLinePattern::Dash: - return "dash"; - case TextDecorationLinePattern::DashDot: - return "dash-dot"; - case TextDecorationLinePattern::DashDotDot: - return "dash-dot-dot"; + case TextDecorationStyle::Double: + return "double"; + case TextDecorationStyle::Dotted: + return "dotted"; + case TextDecorationStyle::Dashed: + return "dashed"; } - LOG(ERROR) << "Unsupported TextDecorationLinePattern value"; + LOG(ERROR) << "Unsupported TextDecorationStyle value"; react_native_assert(false); // sane default for prod return "solid"; @@ -931,15 +882,9 @@ inline folly::dynamic toDynamic(const TextAttributes &textAttributes) { _textAttributes( "textDecorationLine", toString(*textAttributes.textDecorationLineType)); } - if (textAttributes.textDecorationLineStyle.has_value()) { - _textAttributes( - "textDecorationLineStyle", - toString(*textAttributes.textDecorationLineStyle)); - } - if (textAttributes.textDecorationLinePattern.has_value()) { + if (textAttributes.textDecorationStyle.has_value()) { _textAttributes( - "textDecorationLinePattern", - toString(*textAttributes.textDecorationLinePattern)); + "textDecorationStyle", toString(*textAttributes.textDecorationStyle)); } // Shadow // textShadowOffset = textAttributes.textShadowOffset.has_value() ? @@ -1030,8 +975,7 @@ constexpr static Key TA_KEY_ALIGNMENT = 12; constexpr static Key TA_KEY_BEST_WRITING_DIRECTION = 13; constexpr static Key TA_KEY_TEXT_DECORATION_COLOR = 14; constexpr static Key TA_KEY_TEXT_DECORATION_LINE = 15; -constexpr static Key TA_KEY_TEXT_DECORATION_LINE_STYLE = 16; -constexpr static Key TA_KEY_TEXT_DECORATION_LINE_PATTERN = 17; +constexpr static Key TA_KEY_TEXT_DECORATION_STYLE = 16; constexpr static Key TA_KEY_TEXT_SHADOW_RAIDUS = 18; constexpr static Key TA_KEY_TEXT_SHADOW_COLOR = 19; constexpr static Key TA_KEY_IS_HIGHLIGHTED = 20; @@ -1150,16 +1094,12 @@ inline MapBuffer toMapBuffer(const TextAttributes &textAttributes) { TA_KEY_TEXT_DECORATION_LINE, toString(*textAttributes.textDecorationLineType)); } - if (textAttributes.textDecorationLineStyle.has_value()) { - builder.putString( - TA_KEY_TEXT_DECORATION_LINE_STYLE, - toString(*textAttributes.textDecorationLineStyle)); - } - if (textAttributes.textDecorationLinePattern.has_value()) { + if (textAttributes.textDecorationStyle.has_value()) { builder.putString( - TA_KEY_TEXT_DECORATION_LINE_PATTERN, - toString(*textAttributes.textDecorationLinePattern)); + TA_KEY_TEXT_DECORATION_STYLE, + toString(*textAttributes.textDecorationStyle)); } + // Shadow if (!std::isnan(textAttributes.textShadowRadius)) { builder.putDouble( diff --git a/ReactCommon/react/renderer/attributedstring/primitives.h b/ReactCommon/react/renderer/attributedstring/primitives.h index d4be52366132..ebf4616f5e65 100644 --- a/ReactCommon/react/renderer/attributedstring/primitives.h +++ b/ReactCommon/react/renderer/attributedstring/primitives.h @@ -81,15 +81,7 @@ enum class TextDecorationLineType { UnderlineStrikethrough }; -enum class TextDecorationLineStyle { Single, Thick, Double }; - -enum class TextDecorationLinePattern { - Solid, - Dot, - Dash, - DashDot, - DashDotDot, -}; +enum class TextDecorationStyle { Solid, Double, Dotted, Dashed }; enum class AccessibilityRole { None, @@ -176,15 +168,8 @@ struct hash { }; template <> -struct hash { - size_t operator()(const facebook::react::TextDecorationLinePattern &v) const { - return hash()(static_cast(v)); - } -}; - -template <> -struct hash { - size_t operator()(const facebook::react::TextDecorationLineStyle &v) const { +struct hash { + size_t operator()(const facebook::react::TextDecorationStyle &v) const { return hash()(static_cast(v)); } }; diff --git a/ReactCommon/react/renderer/components/text/BaseTextProps.cpp b/ReactCommon/react/renderer/components/text/BaseTextProps.cpp index d8079cf4b812..735904974351 100644 --- a/ReactCommon/react/renderer/components/text/BaseTextProps.cpp +++ b/ReactCommon/react/renderer/components/text/BaseTextProps.cpp @@ -131,18 +131,12 @@ static TextAttributes convertRawProp( "textDecorationLine", sourceTextAttributes.textDecorationLineType, defaultTextAttributes.textDecorationLineType); - textAttributes.textDecorationLineStyle = convertRawProp( + textAttributes.textDecorationStyle = convertRawProp( context, rawProps, - "textDecorationLineStyle", - sourceTextAttributes.textDecorationLineStyle, - defaultTextAttributes.textDecorationLineStyle); - textAttributes.textDecorationLinePattern = convertRawProp( - context, - rawProps, - "textDecorationLinePattern", - sourceTextAttributes.textDecorationLinePattern, - defaultTextAttributes.textDecorationLinePattern); + "textDecorationStyle", + sourceTextAttributes.textDecorationStyle, + defaultTextAttributes.textDecorationStyle); // Shadow textAttributes.textShadowOffset = convertRawProp( diff --git a/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm b/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm index 7e63b2df90b3..11ef92858ec0 100644 --- a/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm +++ b/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm @@ -171,9 +171,8 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex if (textAttributes.textDecorationLineType.value_or(TextDecorationLineType::None) != TextDecorationLineType::None) { auto textDecorationLineType = textAttributes.textDecorationLineType.value(); - NSUnderlineStyle style = RCTNSUnderlineStyleFromStyleAndPattern( - textAttributes.textDecorationLineStyle.value_or(TextDecorationLineStyle::Single), - textAttributes.textDecorationLinePattern.value_or(TextDecorationLinePattern::Solid)); + NSUnderlineStyle style = RCTNSUnderlineStyleFromTextDecorationStyle( + textAttributes.textDecorationStyle.value_or(TextDecorationStyle::Solid)); UIColor *textDecorationColor = RCTUIColorFromSharedColor(textAttributes.textDecorationColor); diff --git a/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTTextPrimitivesConversions.h b/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTTextPrimitivesConversions.h index c78daec7b7a3..9788d8ebb00c 100644 --- a/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTTextPrimitivesConversions.h +++ b/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTTextPrimitivesConversions.h @@ -57,43 +57,18 @@ inline static RCTFontVariant RCTFontVariantFromFontVariant(FontVariant fontVaria return (RCTFontVariant)fontVariant; } -inline static NSUnderlineStyle RCTNSUnderlineStyleFromStyleAndPattern( - TextDecorationLineStyle textDecorationLineStyle, - TextDecorationLinePattern textDecorationLinePattern) +inline static NSUnderlineStyle RCTNSUnderlineStyleFromTextDecorationStyle(TextDecorationStyle textDecorationStyle) { - NSUnderlineStyle style = NSUnderlineStyleNone; - - switch (textDecorationLineStyle) { - case TextDecorationLineStyle::Single: - style = NSUnderlineStyle(style | NSUnderlineStyleSingle); - break; - case TextDecorationLineStyle::Thick: - style = NSUnderlineStyle(style | NSUnderlineStyleThick); - break; - case TextDecorationLineStyle::Double: - style = NSUnderlineStyle(style | NSUnderlineStyleDouble); - break; - } - - switch (textDecorationLinePattern) { - case TextDecorationLinePattern::Solid: - style = NSUnderlineStyle(style | NSUnderlinePatternSolid); - break; - case TextDecorationLinePattern::Dash: - style = NSUnderlineStyle(style | NSUnderlinePatternDash); - break; - case TextDecorationLinePattern::Dot: - style = NSUnderlineStyle(style | NSUnderlinePatternDot); - break; - case TextDecorationLinePattern::DashDot: - style = NSUnderlineStyle(style | NSUnderlinePatternDashDot); - break; - case TextDecorationLinePattern::DashDotDot: - style = NSUnderlineStyle(style | NSUnderlinePatternDashDotDot); - break; + switch (textDecorationStyle) { + case TextDecorationStyle::Solid: + return NSUnderlineStyleSingle; + case TextDecorationStyle::Double: + return NSUnderlineStyleDouble; + case TextDecorationStyle::Dashed: + return NSUnderlinePatternDash | NSUnderlineStyleSingle; + case TextDecorationStyle::Dotted: + return NSUnderlinePatternDot | NSUnderlineStyleSingle; } - - return style; } inline static UIColor *RCTUIColorFromSharedColor(const SharedColor &sharedColor) From dfe42d6b75005f519c0e2c87c75e7886dce3345c Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Mon, 18 Oct 2021 02:29:42 -0700 Subject: [PATCH 008/628] Fix incorrect hitState when non-React views are hit Summary: Changelog: [Android][Changed] Improved logic of findTargetPathAndCoordinatesForTouch Reviewed By: Guad Differential Revision: D31688645 fbshipit-source-id: b9ba91e135b6359e49998a314bf6c91a67fae5ed --- .../react/uimanager/TouchTargetHelper.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/TouchTargetHelper.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/TouchTargetHelper.java index 05d2b48971b4..bf9a6207c772 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/TouchTargetHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/TouchTargetHelper.java @@ -7,6 +7,7 @@ package com.facebook.react.uimanager; +import android.annotation.SuppressLint; import android.graphics.Matrix; import android.graphics.PointF; import android.graphics.Rect; @@ -107,6 +108,7 @@ public static int findTargetTagAndCoordinatesForTouch( * @return If a target was found, returns a path through the view tree of all react tags that are * a container for the touch target, ordered from target to root (last element) */ + @SuppressLint("ResourceType") public static List findTargetPathAndCoordinatesForTouch( float eventX, float eventY, ViewGroup viewGroup, float[] viewCoords) { UiThreadUtil.assertOnUiThread(); @@ -119,9 +121,21 @@ public static List findTargetPathAndCoordinatesForTouch( View targetView = findTouchTargetViewWithPointerEvents(viewCoords, viewGroup, pathAccumulator); if (targetView != null) { - View reactTargetView = findClosestReactAncestor(targetView); - int targetTag = getTouchTargetForView(reactTargetView, viewCoords[0], viewCoords[1]); - if (targetTag != pathAccumulator.get(0)) { + View reactTargetView = targetView; + int firstReactAncestor = 0; + // Same logic as findClosestReactAncestor but also track the index + while (reactTargetView != null && reactTargetView.getId() <= 0) { + reactTargetView = (View) reactTargetView.getParent(); + firstReactAncestor++; + } + + if (firstReactAncestor > 0) { + // Drop non-React views from the path trace + pathAccumulator = pathAccumulator.subList(firstReactAncestor, pathAccumulator.size()); + } + + int targetTag = getTouchTargetForView(reactTargetView, eventX, eventY); + if (targetTag != reactTargetView.getId()) { pathAccumulator.add(0, targetTag); } } @@ -129,6 +143,7 @@ public static List findTargetPathAndCoordinatesForTouch( return pathAccumulator; } + @SuppressLint("ResourceType") private static View findClosestReactAncestor(View view) { while (view != null && view.getId() <= 0) { view = (View) view.getParent(); From 79e72e05cec26fee6ff96ef8b3b2a9580de0a3c6 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 18 Oct 2021 04:32:45 -0700 Subject: [PATCH 009/628] Fix applyAppPlugin being accessed too early in the React App Gradle Plugin (#32420) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32420 While working on the NDK AGP Apis, I realized the the `applyAppPlugin` is accessed too early inside the Gradle plugin. Specifically is accessed once the plugin is applied, and the extension is not configured afterwards. This means that the extension is always set the default values. I'm fixing it moving it inside the `project.afterEvaluate` that was already need to access the variant informations. Changelog: [Internal] [Changed] - Fix applyAppPlugin being accessed too early in the React App Gradle Plugin Reviewed By: ShikaSD Differential Revision: D31652984 fbshipit-source-id: e7ead3f8acb24372bf953fd90ad2a5dfbbeeeec0 --- .../kotlin/com/facebook/react/ReactPlugin.kt | 4 +- .../com/facebook/react/ReactPluginTest.kt | 56 +++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/ReactPluginTest.kt 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 ebad04dab807..ce9743eb3981 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 @@ -27,8 +27,8 @@ class ReactPlugin : Plugin { } private fun applyAppPlugin(project: Project, config: ReactExtension) { - if (config.applyAppPlugin.getOrElse(false)) { - project.afterEvaluate { + project.afterEvaluate { + if (config.applyAppPlugin.getOrElse(false)) { val androidConfiguration = project.extensions.getByType(BaseExtension::class.java) project.configureDevPorts(androidConfiguration) diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/ReactPluginTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/ReactPluginTest.kt new file mode 100644 index 000000000000..602dd522f409 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/ReactPluginTest.kt @@ -0,0 +1,56 @@ +/* + * 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 + +import com.android.build.gradle.AppExtension +import org.gradle.testfixtures.ProjectBuilder +import org.junit.Assert.assertTrue +import org.junit.Test + +class ReactPluginTest { + + @Test + fun reactPlugin_withApplyAppPluginSetToTrue_addsARelevantTask() { + val project = ProjectBuilder.builder().build() + project.plugins.apply("com.android.application") + project.plugins.apply("com.facebook.react") + + project.extensions.getByType(AppExtension::class.java).apply { compileSdkVersion(30) } + project.extensions.getByType(ReactExtension::class.java).apply { + applyAppPlugin.set(true) + cliPath.set(".") + } + + // We check if the App Plugin si applied by finding one of the added task. + assertTrue(project.getTasksByName("bundleDebugJsAndAssets", false).isNotEmpty()) + } + + @Test + fun reactPlugin_withApplyAppPluginSetToFalse_doesNotApplyTheAppPlugin() { + val project = ProjectBuilder.builder().build() + project.plugins.apply("com.android.application") + project.plugins.apply("com.facebook.react") + + project.extensions.getByType(AppExtension::class.java).apply { compileSdkVersion(30) } + project.extensions.getByType(ReactExtension::class.java).apply { applyAppPlugin.set(false) } + + assertTrue(project.getTasksByName("bundleDebugJsAndAssets", false).isEmpty()) + } + + @Test + fun reactPlugin_withApplyAppPluginSetToFalse_codegenPluginIsApplied() { + val project = ProjectBuilder.builder().build() + project.plugins.apply("com.android.application") + project.plugins.apply("com.facebook.react") + + project.extensions.getByType(AppExtension::class.java).apply { compileSdkVersion(30) } + project.extensions.getByType(ReactExtension::class.java).apply { applyAppPlugin.set(false) } + + assertTrue(project.getTasksByName("buildCodegenCLI", false).isNotEmpty()) + } +} From a2b5e4cd825a358419cef1e3823b72215b689686 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 18 Oct 2021 04:32:45 -0700 Subject: [PATCH 010/628] Fix enableVmCleanup not working for apps with product flavors. (#32422) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32422 While working on the NDK AGP Api I realized that the `enableVmCleanup` function, that is supposed to cleanup the extra `.so` files from the final artifacts, is broken for apps with variants. Specifically say for a `liteDebug` app it tries to search for `.so` files inside: ``` intermediates/stripped_native_libs/lite/debug/out/lib ``` while the `.so` files are located inside: ``` intermediates/stripped_native_libs/liteDebug/out/lib ``` I've fixed changing the token of the path from `targetPath` to `variant.name` Changelog: [Android] [Fixed] - Fix enableVmCleanup not working for apps with product flavors Reviewed By: ShikaSD Differential Revision: D31654704 fbshipit-source-id: 4af3478a3079ebcde4bd8e0c62bf4df7b6c75c0f --- .../kotlin/com/facebook/react/TaskConfiguration.kt | 10 +++++----- react.gradle | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt index eefaef68a873..b14b138cc72b 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt @@ -165,23 +165,23 @@ internal fun Project.configureReactTasks(variant: BaseVariant, config: ReactExte packageTask.configure { if (config.enableVmCleanup.get()) { val libDir = "$buildDir/intermediates/transforms/" - val targetVariant = ".*/transforms/[^/]*/$targetPath/.*".toRegex() + val targetVariant = ".*/transforms/[^/]*/${variant.name}/.*".toRegex() it.doFirst { cleanupVMFiles(libDir, targetVariant, enableHermes, cleanup) } } } stripDebugSymbolsTask?.configure { if (config.enableVmCleanup.get()) { - val libDir = "$buildDir/intermediates/stripped_native_libs/${targetPath}/out/lib/" - val targetVariant = ".*/stripped_native_libs/$targetPath/out/lib/.*".toRegex() + val libDir = "$buildDir/intermediates/stripped_native_libs/${variant.name}/out/lib/" + val targetVariant = ".*/stripped_native_libs/${variant.name}/out/lib/.*".toRegex() it.doLast { cleanupVMFiles(libDir, targetVariant, enableHermes, cleanup) } } } mergeNativeLibsTask?.configure { if (config.enableVmCleanup.get()) { - val libDir = "$buildDir/intermediates/merged_native_libs/${targetPath}/out/lib/" - val targetVariant = ".*/merged_native_libs/$targetPath/out/lib/.*".toRegex() + val libDir = "$buildDir/intermediates/merged_native_libs/${variant.name}/out/lib/" + val targetVariant = ".*/merged_native_libs/${variant.name}/out/lib/.*".toRegex() it.doLast { cleanupVMFiles(libDir, targetVariant, enableHermes, cleanup) } } } diff --git a/react.gradle b/react.gradle index d9e27140aeaf..528b7a0c36b1 100644 --- a/react.gradle +++ b/react.gradle @@ -369,9 +369,9 @@ afterEvaluate { } } }.visit { details -> - def targetVariant1 = ".*/transforms/[^/]*/${targetPath}/.*" - def targetVariant2 = ".*/merged_native_libs/${targetPath}/out/lib/.*" - def targetVariant3 = ".*/stripped_native_libs/${targetPath}/out/lib/.*" + def targetVariant1 = ".*/transforms/[^/]*/${variant.name}/.*" + def targetVariant2 = ".*/merged_native_libs/${variant.name}/out/lib/.*" + def targetVariant3 = ".*/stripped_native_libs/${variant.name}/out/lib/.*" def path = details.file.getAbsolutePath().replace(File.separatorChar, '/' as char) if ((path.matches(targetVariant1) || path.matches(targetVariant2) || path.matches(targetVariant3)) && details.file.isFile()) { details.file.delete() @@ -386,13 +386,13 @@ afterEvaluate { def sTask = tasks.findByName("strip${targetName}DebugSymbols") if (sTask != null) { - def strippedLibDir = "$buildDir/intermediates/stripped_native_libs/${targetPath}/out/lib/" + def strippedLibDir = "$buildDir/intermediates/stripped_native_libs/${variant.name}/out/lib/" sTask.doLast { vmSelectionAction(strippedLibDir) } } def mTask = tasks.findByName("merge${targetName}NativeLibs") if (mTask != null) { - def mergedLibDir = "$buildDir/intermediates/merged_native_libs/${targetPath}/out/lib/" + def mergedLibDir = "$buildDir/intermediates/merged_native_libs/${variant.name}/out/lib/" mTask.doLast { vmSelectionAction(mergedLibDir) } } } From c3e7ea0b5b487a943ac60437a059e387ea2ddeea Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 18 Oct 2021 04:32:45 -0700 Subject: [PATCH 011/628] Export prepareGlog to an internal task (#32421) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32421 This diff refactors the `prepareGlog` task to a separate Gradle task in the `.internal` package. The reason for this change is that `prepareGlog` was defining a `doLast` action and would result in being invalidated whenever the `build.gradle` file would change. This means that the Glog headers/source files would have been extracted again, effectively invalidating the timestamps for the native build. Changelog: [Internal] [Changed] - Export prepareGlog to an internal task Reviewed By: ShikaSD Differential Revision: D31661668 fbshipit-source-id: efcd5505a67d6c9f02fcab7a5c3255a160215661 --- ReactAndroid/build.gradle | 42 +----- .../react/tasks/internal/PrepareGlogTask.kt | 79 +++++++++++ .../tasks/internal/PrepareGlogTaskTest.kt | 130 ++++++++++++++++++ 3 files changed, 216 insertions(+), 35 deletions(-) create mode 100644 packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareGlogTask.kt create mode 100644 packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareGlogTaskTest.kt diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index 513d76c64f11..e385fe40855e 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -12,6 +12,8 @@ plugins { id("de.undercouch.download") } +import com.facebook.react.tasks.internal.* + import java.nio.file.Paths import de.undercouch.gradle.tasks.download.Download @@ -169,41 +171,11 @@ task downloadGlog(dependsOn: createNativeDepsDirectories, type: Download) { // 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 -task prepareGlog(dependsOn: dependenciesPath ? [] : [downloadGlog], type: Copy) { - duplicatesStrategy("warn") - from(dependenciesPath ?: tarTree(downloadGlog.dest)) - from("src/main/jni/third-party/glog/") - include("glog-${GLOG_VERSION}/src/**/*", "Android.mk", "config.h") - includeEmptyDirs = false - filesMatching("**/*.h.in") { - filter(ReplaceTokens, tokens: [ - ac_cv_have_unistd_h : "1", - ac_cv_have_stdint_h : "1", - ac_cv_have_systypes_h : "1", - ac_cv_have_inttypes_h : "1", - ac_cv_have_libgflags : "0", - ac_google_start_namespace : "namespace google {", - ac_cv_have_uint16_t : "1", - ac_cv_have_u_int16_t : "1", - ac_cv_have___uint16 : "0", - ac_google_end_namespace : "}", - ac_cv_have___builtin_expect : "1", - ac_google_namespace : "google", - ac_cv___attribute___noinline : "__attribute__ ((noinline))", - ac_cv___attribute___noreturn : "__attribute__ ((noreturn))", - ac_cv___attribute___printf_4_5: "__attribute__((__format__ (__printf__, 4, 5)))" - ]) - it.path = (it.name - ".in") - } - into("$thirdPartyNdkDir/glog") - - doLast { - copy { - from(fileTree(dir: "$thirdPartyNdkDir/glog", includes: ["stl_logging.h", "logging.h", "raw_logging.h", "vlog_is_on.h", "**/src/glog/log_severity.h"]).files) - includeEmptyDirs = false - into("$thirdPartyNdkDir/glog/exported/glog") - } - } +final def prepareGlog = tasks.register("prepareGlog", PrepareGlogTask) { + it.dependsOn(dependenciesPath ? [] : [downloadGlog]) + it.glogPath.setFrom(dependenciesPath ?: tarTree(downloadGlog.dest)) + it.glogVersion.set(GLOG_VERSION) + it.outputDir.set(new File(thirdPartyNdkDir, "glog")) } // Create Android.mk library module based on jsc from npm diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareGlogTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareGlogTask.kt new file mode 100644 index 000000000000..6344b66f4299 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareGlogTask.kt @@ -0,0 +1,79 @@ +/* + * 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.tasks.internal + +import java.io.File +import org.apache.tools.ant.filters.ReplaceTokens +import org.gradle.api.DefaultTask +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.DuplicatesStrategy +import org.gradle.api.provider.Property +import org.gradle.api.tasks.* + +/** + * A task that takes care of extracting Glog from a source folder/zip and preparing it to be + * consumed by the NDK. This task will also take care of applying the mapping for Glog parameters. + */ +abstract class PrepareGlogTask : DefaultTask() { + + @get:InputFiles abstract val glogPath: ConfigurableFileCollection + + @get:Input abstract val glogVersion: Property + + @get:OutputDirectory abstract val outputDir: DirectoryProperty + + @TaskAction + fun taskAction() { + project.copy { + it.from(glogPath) + it.from(project.file("src/main/jni/third-party/glog/")) + it.include("glog-${glogVersion.get()}/src/**/*", "Android.mk", "config.h") + it.duplicatesStrategy = DuplicatesStrategy.WARN + it.includeEmptyDirs = false + it.filesMatching("**/*.h.in") { matchedFile -> + matchedFile.filter( + mapOf( + "tokens" to + mapOf( + "ac_cv_have_unistd_h" to "1", + "ac_cv_have_stdint_h" to "1", + "ac_cv_have_systypes_h" to "1", + "ac_cv_have_inttypes_h" to "1", + "ac_cv_have_libgflags" to "0", + "ac_google_start_namespace" to "namespace google {", + "ac_cv_have_uint16_t" to "1", + "ac_cv_have_u_int16_t" to "1", + "ac_cv_have___uint16" to "0", + "ac_google_end_namespace" to "}", + "ac_cv_have___builtin_expect" to "1", + "ac_google_namespace" to "google", + "ac_cv___attribute___noinline" to "__attribute__ ((noinline))", + "ac_cv___attribute___noreturn" to "__attribute__ ((noreturn))", + "ac_cv___attribute___printf_4_5" to + "__attribute__((__format__ (__printf__, 4, 5)))")), + ReplaceTokens::class.java) + matchedFile.path = (matchedFile.name.removeSuffix(".in")) + } + it.into(outputDir) + } + val exportedDir = File(outputDir.asFile.get(), "exported/glog/").apply { mkdirs() } + project.copy { + it.from(outputDir) + it.include( + "stl_logging.h", + "logging.h", + "raw_logging.h", + "vlog_is_on.h", + "**/src/glog/log_severity.h") + it.eachFile { file -> file.path = file.name } + it.includeEmptyDirs = false + it.into(exportedDir) + } + } +} diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareGlogTaskTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareGlogTaskTest.kt new file mode 100644 index 000000000000..782bac3dce74 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareGlogTaskTest.kt @@ -0,0 +1,130 @@ +/* + * 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.tasks.internal + +import com.facebook.react.tests.createProject +import com.facebook.react.tests.createTestTask +import java.io.* +import org.junit.Assert.* +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +class PrepareGlogTaskTest { + + @get:Rule val tempFolder = TemporaryFolder() + + @Test(expected = IllegalStateException::class) + fun prepareGlogTask_withMissingConfiguration_fails() { + val task = createTestTask() + + task.taskAction() + } + + @Test + fun prepareGlogTask_copiesMakefile() { + val glogpath = tempFolder.newFolder("glogpath") + val output = tempFolder.newFolder("output") + val project = createProject() + val task = + createTestTask(project = project) { + it.glogPath.setFrom(glogpath) + it.glogVersion.set("1.0.0") + it.outputDir.set(output) + } + File(project.projectDir, "src/main/jni/third-party/glog/Android.mk").apply { + parentFile.mkdirs() + createNewFile() + } + task.taskAction() + + assertTrue(output.listFiles()!!.any { it.name == "Android.mk" }) + } + + @Test + fun prepareGlogTask_copiesConfigHeaderFile() { + val glogpath = tempFolder.newFolder("glogpath") + val output = tempFolder.newFolder("output") + val project = createProject() + val task = + createTestTask(project = project) { + it.glogPath.setFrom(glogpath) + it.glogVersion.set("1.0.0") + it.outputDir.set(output) + } + File(project.projectDir, "src/main/jni/third-party/glog/config.h").apply { + parentFile.mkdirs() + createNewFile() + } + task.taskAction() + + assertTrue(output.listFiles()!!.any { it.name == "config.h" }) + } + + @Test + fun prepareGlogTask_copiesSourceCode() { + val glogpath = tempFolder.newFolder("glogpath") + val output = tempFolder.newFolder("output") + val task = + createTestTask { + it.glogPath.setFrom(glogpath) + it.glogVersion.set("1.0.0") + it.outputDir.set(output) + } + File(glogpath, "glog-1.0.0/src/glog.cpp").apply { + parentFile.mkdirs() + createNewFile() + } + + task.taskAction() + + assertTrue(File(output, "glog-1.0.0/src/glog.cpp").exists()) + } + + @Test + fun prepareGlogTask_replacesTokenCorrectly() { + val glogpath = tempFolder.newFolder("glogpath") + val output = tempFolder.newFolder("output") + val task = + createTestTask { + it.glogPath.setFrom(glogpath) + it.glogVersion.set("1.0.0") + it.outputDir.set(output) + } + File(glogpath, "glog-1.0.0/src/glog.h.in").apply { + parentFile.mkdirs() + writeText("ac_google_start_namespace") + } + + task.taskAction() + + val expectedFile = File(output, "glog.h") + assertTrue(expectedFile.exists()) + assertEquals("ac_google_start_namespace", expectedFile.readText()) + } + + @Test + fun prepareGlogTask_exportsHeaderCorrectly() { + val glogpath = tempFolder.newFolder("glogpath") + val output = tempFolder.newFolder("output") + val task = + createTestTask { + it.glogPath.setFrom(glogpath) + it.glogVersion.set("1.0.0") + it.outputDir.set(output) + } + File(glogpath, "glog-1.0.0/src/logging.h.in").apply { + parentFile.mkdirs() + writeText("ac_google_start_namespace") + } + + task.taskAction() + + assertTrue(File(output, "exported/glog/logging.h").exists()) + } +} From bb981b205518bea6ea1993594cad49d1212e2ba0 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 18 Oct 2021 04:32:45 -0700 Subject: [PATCH 012/628] Export prepareLibevent to an internal task (#32425) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32425 This diff refactors the `prepareLibevent` task to a separate Gradle task in the `.internal` package. The reason for this change is that `prepareLibevent` was defining a `doLast` action and would result in being invalidated whenever the `build.gradle` file would change. This means that the Libevent headers/source files would have been extracted again, effectively invalidating the timestamps for the native build. Changelog: [Internal] [Changed] - Export prepareLibevent to an internal task Reviewed By: ShikaSD Differential Revision: D31661988 fbshipit-source-id: e55c2179a187fa156f701c25bae3b48a796e2660 --- ReactAndroid/build.gradle | 24 +---- .../tasks/internal/PrepareLibeventTask.kt | 53 +++++++++ .../tasks/internal/PrepareLibeventTaskTest.kt | 101 ++++++++++++++++++ 3 files changed, 159 insertions(+), 19 deletions(-) create mode 100644 packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTask.kt create mode 100644 packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTaskTest.kt diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index e385fe40855e..806c032ffe89 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -122,26 +122,12 @@ task downloadLibevent(dependsOn: createNativeDepsDirectories, type: Download) { dest(new File(downloadsDir, "libevent-${LIBEVENT_VERSION}.tar.gz")) } -task prepareLibevent(dependsOn: dependenciesPath ? [] : [downloadLibevent], type: Copy) { - from(dependenciesPath ?: tarTree(downloadLibevent.dest)) - from("src/main/jni/third-party/libevent/Android.mk") - from("src/main/jni/third-party/libevent/event-config.h") - from("src/main/jni/third-party/libevent/evconfig-private.h") - include( - "libevent-${LIBEVENT_VERSION}-stable/*.c", - "libevent-${LIBEVENT_VERSION}-stable/*.h", - "libevent-${LIBEVENT_VERSION}-stable/include/**/*", - "evconfig-private.h", - "event-config.h", - "Android.mk" - ) - eachFile { fname -> fname.path = (fname.path - "libevent-${LIBEVENT_VERSION}-stable/") } - includeEmptyDirs = false - into("$thirdPartyNdkDir/libevent") - doLast { - ant.move(file: "$thirdPartyNdkDir/libevent/event-config.h", tofile: "$thirdPartyNdkDir/libevent/include/event2/event-config.h") - } +final def prepareLibevent = tasks.register("prepareLibevent", PrepareLibeventTask) { + it.dependsOn(dependenciesPath ? [] : [downloadLibevent]) + it.libeventPath.setFrom(dependenciesPath ?: tarTree(downloadLibevent.dest)) + it.libeventVersion.set(LIBEVENT_VERSION) + it.outputDir.set(new File(thirdPartyNdkDir, "libevent")) } task prepareHermes(dependsOn: createNativeDepsDirectories, type: Copy) { diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTask.kt new file mode 100644 index 000000000000..416f77f17cdb --- /dev/null +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTask.kt @@ -0,0 +1,53 @@ +/* + * 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.tasks.internal + +import java.io.File +import org.gradle.api.DefaultTask +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.* + +/** + * A task that takes care of extracting Libevent from a source folder/zip and preparing it to be + * consumed by the NDK. + */ +abstract class PrepareLibeventTask : DefaultTask() { + + @get:InputFiles abstract val libeventPath: ConfigurableFileCollection + + @get:Input abstract val libeventVersion: Property + + @get:OutputDirectory abstract val outputDir: DirectoryProperty + + @TaskAction + fun taskAction() { + project.copy { it -> + it.from(libeventPath) + it.from(project.file("src/main/jni/third-party/libevent/Android.mk")) + it.from(project.file("src/main/jni/third-party/libevent/event-config.h")) + it.from(project.file("src/main/jni/third-party/libevent/evconfig-private.h")) + it.include( + "libevent-${libeventVersion.get()}-stable/*.c", + "libevent-${libeventVersion.get()}-stable/*.h", + "libevent-${libeventVersion.get()}-stable/include/**/*", + "evconfig-private.h", + "event-config.h", + "Android.mk") + it.eachFile { it.path = it.path.removePrefix("libevent-${libeventVersion.get()}-stable/") } + it.includeEmptyDirs = false + it.into(outputDir) + } + File(outputDir.asFile.get(), "event-config.h").apply { + val destination = + File(this.parentFile, "include/event2/event-config.h").apply { parentFile.mkdirs() } + renameTo(destination) + } + } +} diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTaskTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTaskTest.kt new file mode 100644 index 000000000000..7a126edb6b9d --- /dev/null +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareLibeventTaskTest.kt @@ -0,0 +1,101 @@ +/* + * 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.tasks.internal + +import com.facebook.react.tests.createProject +import com.facebook.react.tests.createTestTask +import java.io.* +import org.junit.Assert.* +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +class PrepareLibeventTaskTest { + + @get:Rule val tempFolder = TemporaryFolder() + + @Test(expected = IllegalStateException::class) + fun prepareBoostTask_withMissingConfiguration_fails() { + val task = createTestTask() + + task.taskAction() + } + + @Test + fun prepareBoostTask_copiesMakefile() { + val libeventPath = tempFolder.newFolder("libeventPath") + val output = tempFolder.newFolder("output") + val project = createProject() + val task = + createTestTask(project = project) { + it.libeventPath.setFrom(libeventPath) + it.libeventVersion.set("1.0.0") + it.outputDir.set(output) + } + File(project.projectDir, "src/main/jni/third-party/libevent/Android.mk").apply { + parentFile.mkdirs() + createNewFile() + } + task.taskAction() + + assertTrue(File(output, "Android.mk").exists()) + } + + @Test + fun prepareBoostTask_copiesConfigFiles() { + val libeventPath = tempFolder.newFolder("libeventPath") + val output = tempFolder.newFolder("output") + val project = createProject() + val task = + createTestTask(project = project) { + it.libeventPath.setFrom(libeventPath) + it.libeventVersion.set("1.0.0") + it.outputDir.set(output) + } + File(project.projectDir, "src/main/jni/third-party/libevent/event-config.h").apply { + parentFile.mkdirs() + createNewFile() + } + File(project.projectDir, "src/main/jni/third-party/libevent/evconfig-private.h").createNewFile() + + task.taskAction() + + assertTrue(File(output, "evconfig-private.h").exists()) + assertTrue(File(output, "include/event2/event-config.h").exists()) + } + + @Test + fun prepareBoostTask_copiesSourceFiles() { + val libeventPath = tempFolder.newFolder("libeventPath") + val output = tempFolder.newFolder("output") + val task = + createTestTask { + it.libeventPath.setFrom(libeventPath) + it.libeventVersion.set("1.0.0") + it.outputDir.set(output) + } + File(libeventPath, "libevent-1.0.0-stable/sample.c").apply { + parentFile.mkdirs() + createNewFile() + } + File(libeventPath, "libevent-1.0.0-stable/sample.h").apply { + parentFile.mkdirs() + createNewFile() + } + File(libeventPath, "libevent-1.0.0-stable/include/sample.h").apply { + parentFile.mkdirs() + createNewFile() + } + + task.taskAction() + + assertTrue(File(output, "sample.c").exists()) + assertTrue(File(output, "sample.h").exists()) + assertTrue(File(output, "include/sample.h").exists()) + } +} From 52b0cc035507178ee02433f109d3ae483c9ba7cf Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 18 Oct 2021 04:32:45 -0700 Subject: [PATCH 013/628] Export prepareBoost to an internal task (#32424) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32424 This diff refactors the `prepareBoost` task to a separate Gradle task in the `.internal` package. The reason for this change is that `prepareBoost` was defining a `doLast` action and would result in being invalidated whenever the `build.gradle` file would change. This means that the Boost headers/source files would have been extracted again, effectively invalidating the timestamps for the native build. Changelog: [Internal] [Changed] - Export prepareBoost to an internal task Reviewed By: ShikaSD Differential Revision: D31662120 fbshipit-source-id: 87ba82c634da832ee54c3d13561df45d3fd71381 --- ReactAndroid/build.gradle | 14 +-- .../react/tasks/internal/PrepareBoostTask.kt | 46 ++++++++ .../tasks/internal/PrepareBoostTaskTest.kt | 105 ++++++++++++++++++ 3 files changed, 156 insertions(+), 9 deletions(-) create mode 100644 packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareBoostTask.kt create mode 100644 packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareBoostTaskTest.kt diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index 806c032ffe89..da9a786b3a6d 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -56,15 +56,11 @@ task downloadBoost(dependsOn: createNativeDepsDirectories, type: Download) { dest(new File(downloadsDir, "boost_${BOOST_VERSION}.tar.gz")) } -task prepareBoost(dependsOn: boostPath ? [] : [downloadBoost], type: Copy) { - from(boostPath ?: tarTree(resources.gzip(downloadBoost.dest))) - from("src/main/jni/third-party/boost") - include("Android.mk", "boost_${BOOST_VERSION}/boost/**/*.hpp", "boost/boost/**/*.hpp", "asm/**/*.S") - includeEmptyDirs = false - into("$thirdPartyNdkDir/boost") - doLast { - file("$thirdPartyNdkDir/boost/boost").renameTo("$thirdPartyNdkDir/boost/boost_${BOOST_VERSION}") - } +final def prepareBoost = tasks.register("prepareBoost", PrepareBoostTask) { + it.dependsOn(boostPath ? [] : [downloadBoost]) + it.boostPath.setFrom(boostPath ?: tarTree(resources.gzip(downloadBoost.dest))) + it.boostVersion.set(BOOST_VERSION) + it.outputDir.set(new File(thirdPartyNdkDir, "boost")) } task downloadDoubleConversion(dependsOn: createNativeDepsDirectories, type: Download) { diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareBoostTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareBoostTask.kt new file mode 100644 index 000000000000..ff81e8ceb064 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareBoostTask.kt @@ -0,0 +1,46 @@ +/* + * 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.tasks.internal + +import java.io.File +import org.gradle.api.DefaultTask +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.* + +/** + * A task that takes care of extracting Boost from a source folder/zip and preparing it to be + * consumed by the NDK + */ +abstract class PrepareBoostTask : DefaultTask() { + + @get:InputFiles abstract val boostPath: ConfigurableFileCollection + + @get:Input abstract val boostVersion: Property + + @get:OutputDirectory abstract val outputDir: DirectoryProperty + + @TaskAction + fun taskAction() { + project.copy { it -> + it.from(boostPath) + it.from(project.file("src/main/jni/third-party/boost")) + it.include( + "Android.mk", + "boost_${boostVersion.get()}/boost/**/*.hpp", + "boost/boost/**/*.hpp", + "asm/**/*.S") + it.includeEmptyDirs = false + it.into(outputDir) + } + File(outputDir.asFile.get(), "boost").apply { + renameTo(File(this.parentFile, "boost_${boostVersion.get()}")) + } + } +} diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareBoostTaskTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareBoostTaskTest.kt new file mode 100644 index 000000000000..ff9829de2b94 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareBoostTaskTest.kt @@ -0,0 +1,105 @@ +/* + * 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.tasks.internal + +import com.facebook.react.tests.createProject +import com.facebook.react.tests.createTestTask +import java.io.* +import org.junit.Assert.* +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +class PrepareBoostTaskTest { + + @get:Rule val tempFolder = TemporaryFolder() + + @Test(expected = IllegalStateException::class) + fun prepareBoostTask_withMissingConfiguration_fails() { + val task = createTestTask() + + task.taskAction() + } + + @Test + fun prepareBoostTask_copiesMakefile() { + val boostpath = tempFolder.newFolder("boostpath") + val output = tempFolder.newFolder("output") + val project = createProject() + val task = + createTestTask(project = project) { + it.boostPath.setFrom(boostpath) + it.boostVersion.set("1.0.0") + it.outputDir.set(output) + } + File(project.projectDir, "src/main/jni/third-party/boost/Android.mk").apply { + parentFile.mkdirs() + createNewFile() + } + task.taskAction() + + assertTrue(output.listFiles()!!.any { it.name == "Android.mk" }) + } + + @Test + fun prepareBoostTask_copiesAsmFiles() { + val boostpath = tempFolder.newFolder("boostpath") + val output = tempFolder.newFolder("output") + val task = + createTestTask() { + it.boostPath.setFrom(boostpath) + it.boostVersion.set("1.0.0") + it.outputDir.set(output) + } + File(boostpath, "asm/asm.S").apply { + parentFile.mkdirs() + createNewFile() + } + task.taskAction() + + assertTrue(File(output, "asm/asm.S").exists()) + } + + @Test + fun prepareBoostTask_copiesBoostSourceFiles() { + val boostpath = tempFolder.newFolder("boostpath") + val output = tempFolder.newFolder("output") + val task = + createTestTask { + it.boostPath.setFrom(boostpath) + it.boostVersion.set("1.0.0") + it.outputDir.set(output) + } + File(boostpath, "boost_1.0.0/boost/config.hpp").apply { + parentFile.mkdirs() + createNewFile() + } + task.taskAction() + + assertTrue(File(output, "boost_1.0.0/boost/config.hpp").exists()) + } + + @Test + fun prepareBoostTask_copiesVersionlessBoostSourceFiles() { + val boostpath = tempFolder.newFolder("boostpath") + val output = tempFolder.newFolder("output") + val task = + createTestTask { + it.boostPath.setFrom(boostpath) + it.boostVersion.set("1.0.0") + it.outputDir.set(output) + } + File(boostpath, "boost/boost/config.hpp").apply { + parentFile.mkdirs() + createNewFile() + } + task.taskAction() + + assertTrue(File(output, "boost_1.0.0/boost/config.hpp").exists()) + } +} From 75b2e5cc9734bb3db49ce118b9e2935ed7d90e77 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 18 Oct 2021 04:32:45 -0700 Subject: [PATCH 014/628] Export prepareJSC to an internal task (#32427) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32427 This diff refactors the `prepareJSC` task to a separate Gradle task in the `.internal` package. The reason for this change is that `prepareJSC` was just a plain `Task` and not a `Copy` task. It was defining a top level `doLast` action and would result in being invalidated whenever the `build.gradle` file would change. This means that the JSC headers/source files would have been extracted again, effectively invalidating the timestamps for the native build. Changelog: [Internal] [Changed] - Export prepareJSC to an internal task Reviewed By: ShikaSD Differential Revision: D31682293 fbshipit-source-id: 3d4cd9d9ce2fcd45e61f3c8c6685b69a622a1912 --- ReactAndroid/build.gradle | 32 +---- .../react/tasks/internal/PrepareJSCTask.kt | 50 +++++++ .../tasks/internal/PrepareJSCTaskTest.kt | 128 ++++++++++++++++++ .../com/facebook/react/tests/TaskTestUtils.kt | 18 +++ 4 files changed, 200 insertions(+), 28 deletions(-) create mode 100644 packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareJSCTask.kt create mode 100644 packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareJSCTaskTest.kt diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index da9a786b3a6d..5994a02f3fe4 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -161,35 +161,11 @@ final def prepareGlog = tasks.register("prepareGlog", PrepareGlogTask) { } // Create Android.mk library module based on jsc from npm -task prepareJSC { - doLast { - def jscPackagePath = findNodeModulePath(projectDir, "jsc-android") - if (!jscPackagePath) { - throw new GradleScriptException("Could not find the jsc-android npm package", null) - } - - def jscDist = file("$jscPackagePath/dist") - if (!jscDist.exists()) { - throw new GradleScriptException("The jsc-android npm package is missing its \"dist\" directory", null) - } - - def jscAAR = fileTree(jscDist).matching({ it.include "**/android-jsc/**/*.aar" }).singleFile - def soFiles = zipTree(jscAAR).matching({ it.include "**/*.so" }) - - def headerFiles = fileTree(jscDist).matching({ it.include "**/include/*.h" }) - - copy { - from(soFiles) - from(headerFiles) - from("src/main/jni/third-party/jsc/Android.mk") - - filesMatching("**/*.h", { it.path = "JavaScriptCore/${it.name}" }) - - includeEmptyDirs(false) - into("$thirdPartyNdkDir/jsc") - } - } +tasks.register('prepareJSC', PrepareJSCTask) { + it.jscPackagePath.set(findNodeModulePath(projectDir, "jsc-android")) + it.outputDir = project.layout.buildDirectory.dir("third-party-ndk/jsc") } + task downloadNdkBuildDependencies { if (!boostPath) { dependsOn(downloadBoost) diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareJSCTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareJSCTask.kt new file mode 100644 index 000000000000..b4701df42233 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/PrepareJSCTask.kt @@ -0,0 +1,50 @@ +/* + * 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.tasks.internal + +import java.io.File +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.* + +/** + * A task that takes care of unbundling JSC and preparing it for be consumed by the Android NDK. + * Specifically it will unbundle shared libs, headers and will copy over the Makefile from + * `src/main/jni/third-party/jsc/` + */ +abstract class PrepareJSCTask : DefaultTask() { + + @get:Input abstract val jscPackagePath: Property + + @get:OutputDirectory abstract val outputDir: DirectoryProperty + + @TaskAction + fun taskAction() { + if (!jscPackagePath.isPresent || jscPackagePath.orNull == null) { + error("Could not find the jsc-android npm package") + } + val jscDist = File(jscPackagePath.get(), "dist") + if (!jscDist.exists()) { + error("The jsc-android npm package is missing its \"dist\" directory") + } + val jscAAR = + project.fileTree(jscDist).matching { it.include("**/android-jsc/**/*.aar") }.singleFile + val soFiles = project.zipTree(jscAAR).matching { it.include("**/*.so") } + val headerFiles = project.fileTree(jscDist).matching { it.include("**/include/*.h") } + + project.copy { it -> + it.from(soFiles) + it.from(headerFiles) + it.from(project.file("src/main/jni/third-party/jsc/Android.mk")) + it.filesMatching("**/*.h") { it.path = "JavaScriptCore/${it.name}" } + it.includeEmptyDirs = false + it.into(outputDir) + } + } +} diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareJSCTaskTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareJSCTaskTest.kt new file mode 100644 index 000000000000..f420c80d00b9 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareJSCTaskTest.kt @@ -0,0 +1,128 @@ +/* + * 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.tasks.internal + +import com.facebook.react.tests.createProject +import com.facebook.react.tests.createTestTask +import com.facebook.react.tests.zipFiles +import java.io.* +import org.junit.Assert.* +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +class PrepareJSCTaskTest { + + @get:Rule val tempFolder = TemporaryFolder() + + @Test(expected = IllegalStateException::class) + fun prepareJSCTask_withMissingPackage_fails() { + val task = createTestTask() + + task.taskAction() + } + + @Test(expected = IllegalStateException::class) + fun prepareJSCTask_withNullPackage_fails() { + val task = createTestTask { it.jscPackagePath.set(null as String?) } + + task.taskAction() + } + + @Test(expected = IllegalStateException::class) + fun prepareJSCTask_withMissingDistFolder_fails() { + val task = + createTestTask { it.jscPackagePath.set(tempFolder.root.absolutePath) } + + task.taskAction() + } + + @Test + fun prepareJSCTask_ignoresEmptyDirs() { + prepareInputFolder() + val output = tempFolder.newFolder("output") + File(tempFolder.root, "dist/just/an/empty/folders/").apply { mkdirs() } + + val task = + createTestTask { + it.jscPackagePath.set(tempFolder.root.absolutePath) + it.outputDir.set(output) + } + + task.taskAction() + + assertFalse(File(output, "just/an/empty/folders/").exists()) + } + + @Test + fun prepareJSCTask_copiesSoFiles() { + val soFile = tempFolder.newFile("libsomething.so") + prepareInputFolder(aarContent = listOf(soFile)) + val output = tempFolder.newFolder("output") + + val task = + createTestTask { + it.jscPackagePath.set(tempFolder.root.absolutePath) + it.outputDir.set(output) + } + + task.taskAction() + + assertEquals("libsomething.so", output.listFiles()?.first()?.name) + } + + @Test + fun prepareJSCTask_copiesHeaderFilesToCorrectFolder() { + prepareInputFolder() + File(tempFolder.root, "dist/include/justaheader.h").apply { + parentFile.mkdirs() + createNewFile() + } + val output = tempFolder.newFolder("output") + + val task = + createTestTask { + it.jscPackagePath.set(tempFolder.root.absolutePath) + it.outputDir.set(output) + } + + task.taskAction() + + assertTrue(File(output, "JavaScriptCore/justaheader.h").exists()) + } + + @Test + fun prepareJSCTask_copiesMakefile() { + val project = createProject() + prepareInputFolder() + File(project.projectDir, "src/main/jni/third-party/jsc/Android.mk").apply { + parentFile.mkdirs() + createNewFile() + } + val output = tempFolder.newFolder("output") + + val task = + createTestTask(project = project) { + it.jscPackagePath.set(tempFolder.root.absolutePath) + it.outputDir.set(output) + } + + task.taskAction() + + assertTrue(File(output, "Android.mk").exists()) + } + + private fun prepareInputFolder(aarContent: List = listOf(tempFolder.newFile())) { + val dist = tempFolder.newFolder("dist") + File(dist, "android-jsc/android-library.aar").apply { + parentFile.mkdirs() + createNewFile() + } + zipFiles(File(dist, "android-jsc/android-library.aar"), aarContent) + } +} diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tests/TaskTestUtils.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tests/TaskTestUtils.kt index 67e89e1fa142..57d247ee99fa 100644 --- a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tests/TaskTestUtils.kt +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tests/TaskTestUtils.kt @@ -7,6 +7,9 @@ package com.facebook.react.tests +import java.io.* +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream import org.gradle.api.Project import org.gradle.api.Task import org.gradle.testfixtures.ProjectBuilder @@ -23,3 +26,18 @@ internal inline fun createTestTask( taskName: String = T::class.java.simpleName, crossinline block: (T) -> Unit = {} ): T = project.tasks.register(taskName, T::class.java) { block(it) }.get() + +/** A util function to zip a list of files from [contents] inside the zipfile at [destination]. */ +internal fun zipFiles(destination: File, contents: List) { + ZipOutputStream(BufferedOutputStream(FileOutputStream(destination.absolutePath))).use { out -> + for (file in contents) { + FileInputStream(file).use { fi -> + BufferedInputStream(fi).use { origin -> + val entry = ZipEntry(file.name) + out.putNextEntry(entry) + origin.copyTo(out, 1024) + } + } + } + } +} From bc93fefe130480ab77405ce1fae46efee5ab0cff Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 18 Oct 2021 04:32:45 -0700 Subject: [PATCH 015/628] Refactor Extract Headers and JNI from AARs to an internal task (#32426) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32426 This diff refactors the extractHeader and extractJni tasks to a single Gradle task in the `.internal` package. The reason for this change is that those two tasks were always running, therefore invalidating the whole native build cache. Changelog: [Internal] [Changed] - Refactor Extract Headers and JNI from AARs to an internal task Reviewed By: mdvacca, ShikaSD Differential Revision: D31682942 fbshipit-source-id: 191cc77902e82c0425949cee743d240ded790137 --- ReactAndroid/build.gradle | 40 ++++------- .../internal/ExtractJniAndHeadersTask.kt | 49 +++++++++++++ .../internal/ExtractJniAndHeadersTaskTest.kt | 72 +++++++++++++++++++ 3 files changed, 134 insertions(+), 27 deletions(-) create mode 100644 packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/ExtractJniAndHeadersTask.kt create mode 100644 packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/ExtractJniAndHeadersTaskTest.kt diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index 5994a02f3fe4..6a00b15402b0 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -284,7 +284,7 @@ def getNdkBuildFullPath() { } def buildReactNdkLib = tasks.register("buildReactNdkLib", Exec) { - dependsOn(prepareJSC, prepareHermes, prepareBoost, prepareDoubleConversion, prepareFmt, prepareFolly, prepareGlog, prepareLibevent, extractAARHeaders, extractJNIFiles) + dependsOn(prepareJSC, prepareHermes, prepareBoost, prepareDoubleConversion, prepareFmt, prepareFolly, prepareGlog, prepareLibevent, extractNativeDependencies) dependsOn("generateCodegenArtifactsFromSchema"); inputs.dir("$projectDir/../ReactCommon") @@ -343,32 +343,18 @@ def packageReactNdkLibsForBuck = tasks.register("packageReactNdkLibsForBuck", Co into("src/main/jni/prebuilt/lib") } -task extractAARHeaders { - doLast { - configurations.extractHeaders.files.each { - def file = it.absoluteFile - def packageName = file.name.tokenize('-')[0] - copy { - from zipTree(file) - into "$projectDir/src/main/jni/first-party/$packageName/headers" - include "**/*.h" - } - } - } -} - -task extractJNIFiles { - doLast { - configurations.extractJNI.files.each { - def file = it.absoluteFile - def packageName = file.name.tokenize('-')[0] - copy { - from zipTree(file) - into "$projectDir/src/main/jni/first-party/$packageName/" - include "jni/**/*" - } - } - } +final def extractNativeDependencies = tasks.register('extractNativeDependencies', ExtractJniAndHeadersTask) { + it.extractHeadersConfiguration.setFrom(configurations.extractHeaders) + it.extractJniConfiguration.setFrom(configurations.extractJNI) + it.baseOutputDir = project.file("src/main/jni/first-party/") + // Sadly this task as an output folder path that is directly dependent on + // the task input (i.e. src/main/jni/first-party//... + // This means that this task is using the parent folder (first-party/) as + // @OutputFolder. The `prepareHermes` task will also output inside that + // folder and if the two tasks happen to be inside the same run, we want + // `extractNativeDependencies` to run after `prepareHermes` to do not + // invalidate the input/output calculation for this task. + it.mustRunAfter(prepareHermes) } task installArchives { diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/ExtractJniAndHeadersTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/ExtractJniAndHeadersTask.kt new file mode 100644 index 000000000000..b7ffce9a3f7a --- /dev/null +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/internal/ExtractJniAndHeadersTask.kt @@ -0,0 +1,49 @@ +/* + * 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.tasks.internal + +import org.gradle.api.DefaultTask +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.tasks.* + +/** + * A task that takes care of extracting JNIs and Headers from a custom Gradle configuration into an + * output folder. Users are most likely not going to use this task but it will be used when building + * the React Native project. + */ +abstract class ExtractJniAndHeadersTask : DefaultTask() { + + @get:InputFiles abstract val extractHeadersConfiguration: ConfigurableFileCollection + + @get:InputFiles abstract val extractJniConfiguration: ConfigurableFileCollection + + @get:OutputDirectory abstract val baseOutputDir: DirectoryProperty + + @TaskAction + fun taskAction() { + extractJniConfiguration.files.forEach { + val file = it.absoluteFile + val packageName = file.name.split("-", ".").first() + project.copy { copySpec -> + copySpec.from(project.zipTree(file)) + copySpec.into(baseOutputDir.dir(packageName)) + copySpec.include("jni/**/*") + } + } + extractHeadersConfiguration.files.forEach { + val file = it.absoluteFile + val packageName = file.name.split("-", ".").first() + project.copy { copySpec -> + copySpec.from(project.zipTree(file)) + copySpec.into(baseOutputDir.get().dir("$packageName/headers")) + copySpec.include("**/*.h") + } + } + } +} diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/ExtractJniAndHeadersTaskTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/ExtractJniAndHeadersTaskTest.kt new file mode 100644 index 000000000000..c207d6daae03 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/ExtractJniAndHeadersTaskTest.kt @@ -0,0 +1,72 @@ +/* + * 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.tasks.internal + +import com.facebook.react.tests.createProject +import com.facebook.react.tests.createTestTask +import com.facebook.react.tests.zipFiles +import java.io.* +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +class ExtractJniAndHeadersTaskTest { + + @get:Rule val tempFolder = TemporaryFolder() + + @Test + fun extractJniAndHeadersTask_extractsHeadersCorrectly() { + val project = createProject() + val aarFile = File(project.projectDir, "libheader.aar") + val headerFile = tempFolder.newFile("justaheader.h") + val output = tempFolder.newFolder("output") + zipFiles(aarFile, listOf(headerFile)) + + val task = + createTestTask(project = project) { + it.extractHeadersConfiguration.setFrom(aarFile) + it.baseOutputDir.set(output) + } + + task.taskAction() + + assertTrue(File(output, "libheader/headers/justaheader.h").exists()) + } + + @Test + fun extractJniAndHeadersTask_extractsJniCorrectly() { + val project = createProject() + val aarFile = File(project.projectDir, "something.aar") + File(tempFolder.root, "jni/libsomething.so").apply { + parentFile.mkdirs() + createNewFile() + } + val output = tempFolder.newFolder("output") + ZipOutputStream(BufferedOutputStream(FileOutputStream(aarFile.absolutePath))).use { out -> + FileInputStream(aarFile).use { fi -> + BufferedInputStream(fi).use { origin -> + out.putNextEntry(ZipEntry("jni/")) + out.putNextEntry(ZipEntry("jni/libsomething.so")) + origin.copyTo(out, 1024) + } + } + } + val task = + createTestTask(project = project) { + it.extractJniConfiguration.setFrom(aarFile) + it.baseOutputDir.set(output) + } + + task.taskAction() + + assertTrue(File(output, "something/jni/libsomething.so").exists()) + } +} From 0c075001832c937940009c105dca4de17fe612dc Mon Sep 17 00:00:00 2001 From: Kevin Gozali Date: Mon, 18 Oct 2021 11:04:22 -0700 Subject: [PATCH 016/628] OSS CI: Store bundle size info for release branch as well (#32418) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32418 This commit does 2 things: * Process and store stats for *-stable branches, in addition to main * Print out the new stats to stdout, so that CI jobs can display them for verification purpose This also means a new field `branch` is used for the Firestore data. Changelog: [Internal] Reviewed By: hramos Differential Revision: D31717251 fbshipit-source-id: 9dbfa8fb8f0243c013dcd822230400d26c09eaa4 --- bots/datastore.js | 8 ++- bots/report-bundle-size.js | 115 +++++++++++++++++++++---------------- 2 files changed, 73 insertions(+), 50 deletions(-) diff --git a/bots/datastore.js b/bots/datastore.js index ca04ca66d408..04fbd69acc4c 100644 --- a/bots/datastore.js +++ b/bots/datastore.js @@ -92,12 +92,14 @@ function getBinarySizesCollection(db) { * @param {firebase.firestore.CollectionReference} collection * @param {string} sha The Git SHA used to identify the entry * @param {firebase.firestore.UpdateData} data The data to be inserted/updated + * @param {string} branch The Git branch where this data was computed for * @returns {Promise} */ -function createOrUpdateDocument(collectionRef, sha, data) { +function createOrUpdateDocument(collectionRef, sha, data, branch) { const stampedData = { ...data, timestamp: firestore.Timestamp.now(), + branch, }; const docRef = firestore.doc(collectionRef, sha); return firestore.updateDoc(docRef, stampedData).catch(async error => { @@ -115,14 +117,16 @@ function createOrUpdateDocument(collectionRef, sha, data) { * Returns the latest document in collection. * * @param {firebase.firestore.CollectionReference} collection + * @param {string} branch The Git branch for the data * @returns {Promise} */ -async function getLatestDocument(collectionRef) { +async function getLatestDocument(collectionRef, branch) { try { const querySnapshot = await firestore.getDocs( firestore.query( collectionRef, firestore.orderBy('timestamp', 'desc'), + firestore.where('branch', '==', branch), firestore.limit(1), ), ); diff --git a/bots/report-bundle-size.js b/bots/report-bundle-size.js index 75cc461c150f..fc9161688f8b 100644 --- a/bots/report-bundle-size.js +++ b/bots/report-bundle-size.js @@ -25,7 +25,7 @@ const datastore = require('./datastore'); const {createOrUpdateComment} = require('./make-comment'); /** - * Generates and submits a comment. If this is run on main branch, data is + * Generates and submits a comment. If this is run on the main or release branch, data is * committed to the store instead. * @param {{ 'android-hermes-arm64-v8a'?: number; @@ -47,8 +47,7 @@ async function reportSizeStats(stats, replacePattern) { ); const collection = datastore.getBinarySizesCollection(store); - // Collect the current sizes for main branch only. - if (GITHUB_REF === 'main') { + if (GITHUB_REF === 'main' || GITHUB_REF.endsWith('-stable')) { // Ensure we only store numbers greater than zero. const validatedStats = Object.keys(stats).reduce((validated, key) => { const value = stats[key]; @@ -59,65 +58,85 @@ async function reportSizeStats(stats, replacePattern) { validated[key] = value; return validated; }, {}); + if (Object.keys(validatedStats).length > 0) { + // Print out the new stats + const document = + (await datastore.getLatestDocument(collection, GITHUB_REF)) || {}; + const formattedStats = formatBundleStats(document, validatedStats); + console.log(formattedStats); + await datastore.createOrUpdateDocument( collection, GITHUB_SHA, validatedStats, + GITHUB_REF, ); } - } else if (GITHUB_REF.endsWith('-stable')) { - console.log(`Skipping bundle size reporting for branch: ${GITHUB_REF}`); } else { - const document = await datastore.getLatestDocument(collection); - - const diffFormatter = new Intl.NumberFormat('en', {signDisplay: 'always'}); - const sizeFormatter = new Intl.NumberFormat('en', {}); - - // | Platform | Engine | Arch | Size (bytes) | Diff | - // |:---------|:-------|:------------|-------------:|-----:| - // | android | hermes | arm64-v8a | 9437184 | ±0 | - // | android | hermes | armeabi-v7a | 9015296 | ±0 | - // | android | hermes | x86 | 9498624 | ±0 | - // | android | hermes | x86_64 | 9965568 | ±0 | - // | android | jsc | arm64-v8a | 9236480 | ±0 | - // | android | jsc | armeabi-v7a | 8814592 | ±0 | - // | android | jsc | x86 | 9297920 | ±0 | - // | android | jsc | x86_64 | 9764864 | ±0 | - // | android | jsc | x86_64 | 9764864 | ±0 | - // | ios | - | universal | 10715136 | ±0 | - const comment = [ - '| Platform | Engine | Arch | Size (bytes) | Diff |', - '|:---------|:-------|:-----|-------------:|-----:|', - ...Object.keys(stats).map(identifier => { - const [size, diff] = (() => { - const statSize = stats[identifier]; - if (!statSize) { - return ['n/a', '--']; - } else if (!(identifier in document)) { - return [statSize, 'n/a']; - } else { - return [ - sizeFormatter.format(statSize), - diffFormatter.format(statSize - document[identifier]), - ]; - } - })(); - - const [platform, engineOrArch, ...archParts] = identifier.split('-'); - const arch = archParts.join('-') || engineOrArch; - const engine = arch === engineOrArch ? '-' : engineOrArch; // e.g. 'ios-universal' - return `| ${platform} | ${engine} | ${arch} | ${size} | ${diff} |`; - }), - '', - `Base commit: ${document.commit}`, - ].join('\n'); + // For PRs, always compare vs main. + const document = + (await datastore.getLatestDocument(collection, 'main')) || {}; + const comment = formatBundleStats(document, stats); createOrUpdateComment(comment, replacePattern); } await datastore.terminateStore(store); } +/** + * Format the new bundle stats as compared to the latest stored entry. + * @param {firebase.firestore.DocumentData} document the latest entry to compare against + * @param {firebase.firestore.UpdateData} stats The stats to be formatted + * @returns {string} + */ +function formatBundleStats(document, stats) { + const diffFormatter = new Intl.NumberFormat('en', {signDisplay: 'always'}); + const sizeFormatter = new Intl.NumberFormat('en', {}); + + // | Platform | Engine | Arch | Size (bytes) | Diff | + // |:---------|:-------|:------------|-------------:|-----:| + // | android | hermes | arm64-v8a | 9437184 | ±0 | + // | android | hermes | armeabi-v7a | 9015296 | ±0 | + // | android | hermes | x86 | 9498624 | ±0 | + // | android | hermes | x86_64 | 9965568 | ±0 | + // | android | jsc | arm64-v8a | 9236480 | ±0 | + // | android | jsc | armeabi-v7a | 8814592 | ±0 | + // | android | jsc | x86 | 9297920 | ±0 | + // | android | jsc | x86_64 | 9764864 | ±0 | + // | android | jsc | x86_64 | 9764864 | ±0 | + // | ios | - | universal | 10715136 | ±0 | + const formatted = [ + '| Platform | Engine | Arch | Size (bytes) | Diff |', + '|:---------|:-------|:-----|-------------:|-----:|', + ...Object.keys(stats).map(identifier => { + const [size, diff] = (() => { + const statSize = stats[identifier]; + if (!statSize) { + return ['n/a', '--']; + } else if (!(identifier in document)) { + return [statSize, 'n/a']; + } else { + return [ + sizeFormatter.format(statSize), + diffFormatter.format(statSize - document[identifier]), + ]; + } + })(); + + const [platform, engineOrArch, ...archParts] = identifier.split('-'); + const arch = archParts.join('-') || engineOrArch; + const engine = arch === engineOrArch ? '-' : engineOrArch; // e.g. 'ios-universal' + return `| ${platform} | ${engine} | ${arch} | ${size} | ${diff} |`; + }), + '', + `Base commit: ${document.commit || ''}`, + `Branch: ${document.branch || ''}`, + ].join('\n'); + + return formatted; +} + /** * Returns the size of the file at specified path in bytes. * @param {fs.PathLike} path From 63f66fce49f90abe3ed23235f2605b9fc9c67a64 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 18 Oct 2021 13:32:53 -0700 Subject: [PATCH 017/628] Fixes documantion for back Easing Summary: The documentation of back easing contains a old link that is now stale. I'm updating it to link to https://easings.net/#easeInBack Fixes https://github.com/facebook/react-native/issues/32419 Changelog: [Android] [Fixed] - Fixes documentation for back Easing animation Reviewed By: hramos Differential Revision: D31728560 fbshipit-source-id: 99f7aa60d3748af5429b4ae1aa6cbd79326c5fe6 --- Libraries/Animated/Easing.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Libraries/Animated/Easing.js b/Libraries/Animated/Easing.js index 253a3e785aaa..39f873b902c2 100644 --- a/Libraries/Animated/Easing.js +++ b/Libraries/Animated/Easing.js @@ -171,9 +171,7 @@ class Easing { * Use with `Animated.parallel()` to create a simple effect where the object * animates back slightly as the animation starts. * - * Wolfram Plot: - * - * - http://tiny.cc/back_default (s = 1.70158, default) + * https://easings.net/#easeInBack */ static back(s: number = 1.70158): (t: number) => number { return t => t * t * ((s + 1) * t - s); From 1121ed94ab470be27207b0c8dbae5d19860c08da Mon Sep 17 00:00:00 2001 From: luism3861 Date: Mon, 18 Oct 2021 14:33:04 -0700 Subject: [PATCH 018/628] remove accessibilityStates validAttributes config from ReactNativeViewViewConfig.js (#29656) Summary: this little PR remove `accesibilityStates` config in validAttributes, like comment says it can be removed after next release. ## Changelog [General][Removed] - `accessibilityStates` no longer passed through to RCTView. Pull Request resolved: https://github.com/facebook/react-native/pull/29656 Reviewed By: philIip Differential Revision: D31732866 Pulled By: yungsters fbshipit-source-id: 83b6eb223e76537a09c13ccdb382317421ab4585 --- Libraries/Components/View/ReactNativeViewViewConfig.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Libraries/Components/View/ReactNativeViewViewConfig.js b/Libraries/Components/View/ReactNativeViewViewConfig.js index ff0b6d837e17..aa708ddb39a4 100644 --- a/Libraries/Components/View/ReactNativeViewViewConfig.js +++ b/Libraries/Components/View/ReactNativeViewViewConfig.js @@ -122,7 +122,6 @@ const ReactNativeViewConfig: ViewConfig = { accessibilityLabel: true, accessibilityLiveRegion: true, accessibilityRole: true, - accessibilityStates: true, // TODO: Can be removed after next release accessibilityState: true, accessibilityValue: true, accessibilityViewIsModal: true, From eebc829b23d87290603103595380a8069c8f7cef Mon Sep 17 00:00:00 2001 From: Sota Ogo Date: Mon, 18 Oct 2021 15:32:45 -0700 Subject: [PATCH 019/628] Add a method to generate a temp podspec Summary: The new architecture generates code that needs to be included in the xcode project. This diff adds a method that will be called when calling "pod install". There will be following diffs that will add the usage of this function. Changelog: [internal] Reviewed By: hramos Differential Revision: D31699330 fbshipit-source-id: 491de7f60afee69aae750bbda6a687cea2526cc0 --- scripts/react_native_pods.rb | 61 ++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/scripts/react_native_pods.rb b/scripts/react_native_pods.rb index 3c6a21eacc81..348b45f4c357 100644 --- a/scripts/react_native_pods.rb +++ b/scripts/react_native_pods.rb @@ -3,6 +3,8 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. +$CODEGEN_TEMP_DIR = 'build/generated' + def use_react_native! (options={}) # The prefix to react-native prefix = options[:path] ||= "../node_modules/react-native" @@ -190,6 +192,65 @@ def react_native_post_install(installer) fix_library_search_paths(installer) end + +def generate_temp_pod_spec_for_codegen!() + output_dir = "#{Pod::Config.instance.installation_root}/#{$CODEGEN_TEMP_DIR}" + Pod::Executable.execute_command("mkdir", ["-p", output_dir]); + + package = JSON.parse(File.read(File.join(__dir__, "..", "package.json"))) + version = package['version'] + + folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' + folly_version = '2021.06.28.00' + boost_version = '1.76.0' + boost_compiler_flags = '-Wno-documentation' + + spec = { + 'name' => "ReactNative-Codegen", + 'version' => version, + 'summary' => 'Temp pod for generated files for React Native', + 'homepage' => 'https://facebook.com/', + 'license' => 'Unlicense', + 'authors' => 'Facebook', + 'compiler_flags' => "#{folly_compiler_flags} #{boost_compiler_flags} -Wno-nullability-completeness", + 'source' => { :git => '' }, + 'platforms' => { + 'ios' => '11.0', + }, + 'source_files' => "**/*.{h,mm,cpp}", + 'pod_target_xcconfig' => { "HEADER_SEARCH_PATHS" => + [ + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/RCT-Folly\"", + "\"$(PODS_ROOT)/Headers/Private/React-Fabric\"" + ].join(' ') + }, + 'dependencies': { + "React-graphics": [version], + "React-jsiexecutor": [version], + "RCT-Folly": [folly_version], + "RCTRequired": [version], + "RCTTypeSafety": [version], + "React-Core": [version], + "React-jsi": [version], + "ReactCommon/turbomodule/core": [version] + } + } + podspec_path = File.join(output_dir, 'ReactNative-Codegen.podspec.json') + Pod::UI.puts "[Codegene] Generating #{podspec_path}" + + File.open(podspec_path, 'w') do |f| + f.write(spec.to_json) + f.fsync + end + + return { + "spec" => spec, + "path" => output_dir, + } +end + + def use_react_native_codegen!(spec, options={}) return if ENV['DISABLE_CODEGEN'] == '1' From addf4dab512aafd52964f9b21f4fd9560e1d51c6 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Tue, 19 Oct 2021 00:23:22 -0700 Subject: [PATCH 020/628] RN: Strict Static View Config Validator Summary: Creates a new `StaticViewConfigValidator` module that does strict, bidirectional validation. This is notably different from `verifyComponentAttributeEquivalence`, which is undirectional validation. This will enforce that two configs are equivalent so we can start addressing the inconsistencies (especially per platform). It also improves upon the reporting format by providing more details about the invalidations. It is hidden behind a `strict` runtime configuration parameter. Changelog: [Internal] Reviewed By: RSNara Differential Revision: D29024229 fbshipit-source-id: 10271945e089183f505205bd41de5e01faea7568 --- .../NativeComponentRegistry.js | 40 +++- .../StaticViewConfigValidator.js | 110 +++++++++ .../StaticViewConfigValidator-test.js | 222 ++++++++++++++++++ 3 files changed, 362 insertions(+), 10 deletions(-) create mode 100644 Libraries/NativeComponent/StaticViewConfigValidator.js create mode 100644 Libraries/NativeComponent/__tests__/StaticViewConfigValidator-test.js diff --git a/Libraries/NativeComponent/NativeComponentRegistry.js b/Libraries/NativeComponent/NativeComponentRegistry.js index 0dce50704b55..2e90c650a02c 100644 --- a/Libraries/NativeComponent/NativeComponentRegistry.js +++ b/Libraries/NativeComponent/NativeComponentRegistry.js @@ -8,6 +8,7 @@ * @format */ +import * as StaticViewConfigValidator from './StaticViewConfigValidator'; import {createViewConfig} from './ViewConfig'; import UIManager from '../ReactNative/UIManager'; import type { @@ -36,6 +37,7 @@ export function setRuntimeConfigProvider( name: string, ) => ?{ native: boolean, + strict: boolean, verify: boolean, }, ): void { @@ -57,8 +59,9 @@ export function get( viewConfigProvider: () => PartialViewConfig, ): HostComponent { ReactNativeViewConfigRegistry.register(name, () => { - const {native, verify} = getRuntimeConfig?.(name) ?? { + const {native, strict, verify} = getRuntimeConfig?.(name) ?? { native: true, + strict: false, verify: false, }; @@ -67,16 +70,33 @@ export function get( : createViewConfig(viewConfigProvider()); if (verify) { - if (native) { - verifyComponentAttributeEquivalence( - viewConfig, - createViewConfig(viewConfigProvider()), - ); + if (strict) { + const results = native + ? StaticViewConfigValidator.validate( + name, + viewConfig, + createViewConfig(viewConfigProvider()), + ) + : StaticViewConfigValidator.validate( + name, + getNativeComponentAttributes(name), + viewConfig, + ); + if (results != null) { + console.error(results); + } } else { - verifyComponentAttributeEquivalence( - getNativeComponentAttributes(name), - viewConfig, - ); + if (native) { + verifyComponentAttributeEquivalence( + viewConfig, + createViewConfig(viewConfigProvider()), + ); + } else { + verifyComponentAttributeEquivalence( + getNativeComponentAttributes(name), + viewConfig, + ); + } } } diff --git a/Libraries/NativeComponent/StaticViewConfigValidator.js b/Libraries/NativeComponent/StaticViewConfigValidator.js new file mode 100644 index 000000000000..8eadb748b900 --- /dev/null +++ b/Libraries/NativeComponent/StaticViewConfigValidator.js @@ -0,0 +1,110 @@ +/** + * 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. + * + * @flow strict + * @format + */ + +import {type ViewConfig} from '../Renderer/shims/ReactNativeTypes'; + +type Difference = { + path: $ReadOnlyArray, + type: 'missing' | 'unequal' | 'unexpected', +}; + +/** + * During the migration from native view configs to static view configs, this is + * used to validate that the two are equivalent. + */ +export function validate( + name: string, + nativeViewConfig: ViewConfig, + staticViewConfig: ViewConfig, +): ?string { + const differences = []; + accumulateDifferences( + differences, + [], + { + bubblingEventTypes: nativeViewConfig.bubblingEventTypes, + directEventTypes: nativeViewConfig.directEventTypes, + uiViewClassName: nativeViewConfig.uiViewClassName, + validAttributes: nativeViewConfig.validAttributes, + }, + { + bubblingEventTypes: staticViewConfig.bubblingEventTypes, + directEventTypes: staticViewConfig.directEventTypes, + uiViewClassName: staticViewConfig.uiViewClassName, + validAttributes: staticViewConfig.validAttributes, + }, + ); + if (differences.length === 0) { + return null; + } + return [ + `StaticViewConfigValidator: Invalid static view config for '${name}'.`, + '', + ...differences.map(({path, type}) => { + switch (type) { + case 'missing': + return `- '${path.join('.')}' is missing.`; + case 'unequal': + return `- '${path.join('.')}' is the wrong value.`; + case 'unexpected': + return `- '${path.join('.')}' is present but not expected to be.`; + } + }), + '', + ].join('\n'); +} + +function accumulateDifferences( + differences: Array, + path: Array, + nativeObject: {...}, + staticObject: {...}, +): void { + for (const nativeKey in nativeObject) { + const nativeValue = nativeObject[nativeKey]; + + if (!staticObject.hasOwnProperty(nativeKey)) { + differences.push({path: [...path, nativeKey], type: 'missing'}); + continue; + } + + const staticValue = staticObject[nativeKey]; + + const nativeValueIfObject = ifObject(nativeValue); + if (nativeValueIfObject != null) { + const staticValueIfObject = ifObject(staticValue); + if (staticValueIfObject != null) { + path.push(nativeKey); + accumulateDifferences( + differences, + path, + nativeValueIfObject, + staticValueIfObject, + ); + path.pop(); + continue; + } + } + + if (nativeValue !== staticValue) { + differences.push({path: [...path, nativeKey], type: 'unequal'}); + } + } + + for (const staticKey in staticObject) { + if (!nativeObject.hasOwnProperty(staticKey)) { + differences.push({path: [...path, staticKey], type: 'unexpected'}); + } + } +} + +function ifObject(value: mixed): ?{...} { + return typeof value === 'object' && !Array.isArray(value) ? value : null; +} diff --git a/Libraries/NativeComponent/__tests__/StaticViewConfigValidator-test.js b/Libraries/NativeComponent/__tests__/StaticViewConfigValidator-test.js new file mode 100644 index 000000000000..05c6a5dd2757 --- /dev/null +++ b/Libraries/NativeComponent/__tests__/StaticViewConfigValidator-test.js @@ -0,0 +1,222 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict + * @format + */ + +import * as StaticViewConfigValidator from '../StaticViewConfigValidator'; + +test('passes for identical configs', () => { + const name = 'RCTView'; + const nativeViewConfig = { + bubblingEventTypes: { + topBlur: { + phasedRegistrationNames: { + bubbled: 'onBlur', + captured: 'onBlurCapture', + }, + }, + topFocus: { + phasedRegistrationNames: { + bubbled: 'onFocus', + captured: 'onFocusCapture', + }, + }, + }, + directEventTypes: { + topLayout: { + registrationName: 'onLayout', + }, + }, + uiViewClassName: 'RCTView', + validAttributes: { + collapsable: true, + nativeID: true, + style: { + height: true, + width: true, + }, + }, + }; + const staticViewConfig = { + bubblingEventTypes: { + topBlur: { + phasedRegistrationNames: { + bubbled: 'onBlur', + captured: 'onBlurCapture', + }, + }, + topFocus: { + phasedRegistrationNames: { + bubbled: 'onFocus', + captured: 'onFocusCapture', + }, + }, + }, + directEventTypes: { + topLayout: { + registrationName: 'onLayout', + }, + }, + uiViewClassName: 'RCTView', + validAttributes: { + collapsable: true, + nativeID: true, + style: { + height: true, + width: true, + }, + }, + }; + + expect( + StaticViewConfigValidator.validate( + name, + nativeViewConfig, + staticViewConfig, + ), + ).toBe(null); +}); + +test('fails for mismatched names', () => { + const name = 'RCTView'; + const nativeViewConfig = { + uiViewClassName: 'RCTView', + validAttributes: { + style: {}, + }, + }; + const staticViewConfig = { + uiViewClassName: 'RCTImage', + validAttributes: { + style: {}, + }, + }; + + expect( + StaticViewConfigValidator.validate( + name, + nativeViewConfig, + staticViewConfig, + ), + ).toBe( + ` +StaticViewConfigValidator: Invalid static view config for 'RCTView'. + +- 'uiViewClassName' is the wrong value. +`.trimStart(), + ); +}); + +test('fails for unequal attributes', () => { + const name = 'RCTView'; + const nativeViewConfig = { + uiViewClassName: 'RCTView', + validAttributes: { + nativeID: true, + style: {}, + }, + }; + const staticViewConfig = { + uiViewClassName: 'RCTView', + validAttributes: { + nativeID: {}, + style: {}, + }, + }; + + expect( + StaticViewConfigValidator.validate( + name, + nativeViewConfig, + staticViewConfig, + ), + ).toBe( + ` +StaticViewConfigValidator: Invalid static view config for 'RCTView'. + +- 'validAttributes.nativeID' is the wrong value. +`.trimStart(), + ); +}); + +test('fails for missing attributes', () => { + const name = 'RCTView'; + const nativeViewConfig = { + uiViewClassName: 'RCTView', + validAttributes: { + collapsable: true, + nativeID: true, + style: { + height: true, + width: true, + }, + }, + }; + const staticViewConfig = { + uiViewClassName: 'RCTView', + validAttributes: { + style: {}, + }, + }; + + expect( + StaticViewConfigValidator.validate( + name, + nativeViewConfig, + staticViewConfig, + ), + ).toBe( + ` +StaticViewConfigValidator: Invalid static view config for 'RCTView'. + +- 'validAttributes.collapsable' is missing. +- 'validAttributes.nativeID' is missing. +- 'validAttributes.style.height' is missing. +- 'validAttributes.style.width' is missing. +`.trimStart(), + ); +}); + +test('fails for unexpected attributes', () => { + const name = 'RCTView'; + const nativeViewConfig = { + uiViewClassName: 'RCTView', + validAttributes: { + style: {}, + }, + }; + const staticViewConfig = { + uiViewClassName: 'RCTView', + validAttributes: { + collapsable: true, + nativeID: true, + style: { + height: true, + width: true, + }, + }, + }; + + expect( + StaticViewConfigValidator.validate( + name, + nativeViewConfig, + staticViewConfig, + ), + ).toBe( + ` +StaticViewConfigValidator: Invalid static view config for 'RCTView'. + +- 'validAttributes.style.height' is present but not expected to be. +- 'validAttributes.style.width' is present but not expected to be. +- 'validAttributes.collapsable' is present but not expected to be. +- 'validAttributes.nativeID' is present but not expected to be. +`.trimStart(), + ); +}); From ba7424d4d219324292571262548ad99abe60c243 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Tue, 19 Oct 2021 01:50:05 -0700 Subject: [PATCH 021/628] RN: Normalize Prettier Configuration Summary: Changelog: [Internal] Reviewed By: zertosh Differential Revision: D31745469 fbshipit-source-id: b930e4aefd8d21021b7c43a48ee84d0546fb56eb --- .prettierrc | 8 ++++---- packages/react-native-codegen/.prettierrc | 7 ++++--- template/_prettierrc.js | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.prettierrc b/.prettierrc index bc951b8e09ab..f45d2b8c574e 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,8 +1,8 @@ { - "requirePragma": true, - "singleQuote": true, - "trailingComma": "all", + "arrowParens": "avoid", "bracketSpacing": false, "jsxBracketSameLine": true, - "arrowParens": "avoid" + "requirePragma": true, + "singleQuote": true, + "trailingComma": "all" } diff --git a/packages/react-native-codegen/.prettierrc b/packages/react-native-codegen/.prettierrc index 20374fd919f0..f45d2b8c574e 100644 --- a/packages/react-native-codegen/.prettierrc +++ b/packages/react-native-codegen/.prettierrc @@ -1,7 +1,8 @@ { + "arrowParens": "avoid", + "bracketSpacing": false, + "jsxBracketSameLine": true, "requirePragma": true, "singleQuote": true, - "trailingComma": "all", - "bracketSpacing": false, - "jsxBracketSameLine": true + "trailingComma": "all" } diff --git a/template/_prettierrc.js b/template/_prettierrc.js index 84196d95f40b..645abb25811b 100644 --- a/template/_prettierrc.js +++ b/template/_prettierrc.js @@ -1,7 +1,7 @@ module.exports = { + arrowParens: 'avoid', bracketSpacing: false, jsxBracketSameLine: true, singleQuote: true, trailingComma: 'all', - arrowParens: 'avoid', }; From ce74aa4ed335d4c36ce722d47937b582045e05c4 Mon Sep 17 00:00:00 2001 From: Lulu Wu Date: Tue, 19 Oct 2021 04:09:43 -0700 Subject: [PATCH 022/628] Add ReactInstanceEventListener for Venice and expose in FbReactInstanceHolder Summary: Add ```ReactInstanceEventListener``` for Venice and migrate Bridge-only callsites from - FbReactInstanceHolder.getReactInstanceManager().addReactInstanceEventListener() - FbReactInstanceHolder.getReactInstanceManager().removeReactInstanceEventListener() To: - FbReactInstanceHolder.addReactInstanceEventListener() - FbReactInstanceHolder.removeReactInstanceEventListener() Changelog: [Android][Changed] - Add ReactInstanceEventListenerV2 for migration Reviewed By: RSNara Differential Revision: D31501785 fbshipit-source-id: e1cd03f07e28fbb995ea0a1bb76400089a461879 --- .../testing/rule/ReactNativeTestRule.java | 3 +- .../facebook/react/HeadlessJsTaskService.java | 2 +- .../react/ReactInstanceEventListener.java | 23 +++++++++++ .../facebook/react/ReactInstanceManager.java | 40 +++++++++++-------- .../react/uiapp/ReactNativeFlipper.java | 4 +- .../com/helloworld/ReactNativeFlipper.java | 3 +- 6 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/ReactInstanceEventListener.java diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/rule/ReactNativeTestRule.java b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/rule/ReactNativeTestRule.java index 8d6252f28b8c..9c8cc0f9020a 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/testing/rule/ReactNativeTestRule.java +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/testing/rule/ReactNativeTestRule.java @@ -10,6 +10,7 @@ import android.app.Activity; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import androidx.test.rule.ActivityTestRule; +import com.facebook.react.ReactInstanceEventListener; import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactPackage; import com.facebook.react.ReactRootView; @@ -90,7 +91,7 @@ public void run() { // This threading garbage will be replaced by Surface final AtomicBoolean isLayoutUpdated = new AtomicBoolean(false); mReactInstanceManager.addReactInstanceEventListener( - new ReactInstanceManager.ReactInstanceEventListener() { + new ReactInstanceEventListener() { @Override public void onReactContextInitialized(ReactContext reactContext) { final UIManagerModule uiManagerModule = diff --git a/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java b/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java index 10d9328150a3..d92812688391 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java +++ b/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java @@ -99,7 +99,7 @@ protected void startTask(final HeadlessJsTaskConfig taskConfig) { ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); if (reactContext == null) { reactInstanceManager.addReactInstanceEventListener( - new ReactInstanceManager.ReactInstanceEventListener() { + new ReactInstanceEventListener() { @Override public void onReactContextInitialized(ReactContext reactContext) { invokeStartTask(reactContext, taskConfig); diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceEventListener.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceEventListener.java new file mode 100644 index 000000000000..4ea99c508d9f --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceEventListener.java @@ -0,0 +1,23 @@ +/* + * 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; + +import com.facebook.react.bridge.ReactContext; + +/** + * New Listener interface for react instance events. {@Link + * ReactInstanceManager.ReactInstanceEventListener will be deprecated.} + */ +public interface ReactInstanceEventListener { + + /** + * Called when the react context is initialized (all modules registered). Always called on the UI + * thread. + */ + void onReactContextInitialized(ReactContext context); +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index 63b237f25f57..c80602f6dea2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -138,15 +138,17 @@ public class ReactInstanceManager { private static final String TAG = ReactInstanceManager.class.getSimpleName(); - /** Listener interface for react instance events. */ - public interface ReactInstanceEventListener { - - /** - * Called when the react context is initialized (all modules registered). Always called on the - * UI thread. - */ - void onReactContextInitialized(ReactContext context); - } + + /** + * Listener interface for react instance events. This class extends {@Link + * com.facebook.react.ReactInstanceEventListener} as a mitigation for both bridgeless and OSS + * compatibility: We create a separate ReactInstanceEventListener class to remove dependency on + * ReactInstanceManager which is a bridge-specific class, but in the mean time we have to keep + * ReactInstanceManager.ReactInstanceEventListener so OSS won't break. + */ + @Deprecated + public interface ReactInstanceEventListener + extends com.facebook.react.ReactInstanceEventListener {} private final Set mAttachedReactRoots = Collections.synchronizedSet(new HashSet()); @@ -173,8 +175,10 @@ public interface ReactInstanceEventListener { private final Context mApplicationContext; private @Nullable @ThreadConfined(UI) DefaultHardwareBackBtnHandler mDefaultBackButtonImpl; private @Nullable Activity mCurrentActivity; - private final Collection mReactInstanceEventListeners = - Collections.synchronizedList(new ArrayList()); + private final Collection + mReactInstanceEventListeners = + Collections.synchronizedList( + new ArrayList()); // Identifies whether the instance manager is or soon will be initialized (on background thread) private volatile boolean mHasStartedCreatingInitialContext = false; // Identifies whether the instance manager destroy function is in process, @@ -1001,12 +1005,14 @@ public List getOrCreateViewManagers( } /** Add a listener to be notified of react instance events. */ - public void addReactInstanceEventListener(ReactInstanceEventListener listener) { + public void addReactInstanceEventListener( + com.facebook.react.ReactInstanceEventListener listener) { mReactInstanceEventListeners.add(listener); } /** Remove a listener previously added with {@link #addReactInstanceEventListener}. */ - public void removeReactInstanceEventListener(ReactInstanceEventListener listener) { + public void removeReactInstanceEventListener( + com.facebook.react.ReactInstanceEventListener listener) { mReactInstanceEventListeners.remove(listener); } @@ -1177,16 +1183,16 @@ private void setupReactContext(final ReactApplicationContext reactContext) { // There is a race condition here - `finalListeners` can contain null entries // See usage below for more details. - ReactInstanceEventListener[] listeners = - new ReactInstanceEventListener[mReactInstanceEventListeners.size()]; - final ReactInstanceEventListener[] finalListeners = + com.facebook.react.ReactInstanceEventListener[] listeners = + new com.facebook.react.ReactInstanceEventListener[mReactInstanceEventListeners.size()]; + final com.facebook.react.ReactInstanceEventListener[] finalListeners = mReactInstanceEventListeners.toArray(listeners); UiThreadUtil.runOnUiThread( new Runnable() { @Override public void run() { - for (ReactInstanceEventListener listener : finalListeners) { + for (com.facebook.react.ReactInstanceEventListener listener : finalListeners) { // Sometimes this listener is null - probably due to race // condition between allocating listeners with a certain // size, and getting a `final` version of the array on 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 index 4a9072566f64..2f927231e731 100644 --- 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 @@ -4,6 +4,7 @@ * 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; @@ -19,6 +20,7 @@ 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; @@ -51,7 +53,7 @@ public void apply(OkHttpClient.Builder builder) { ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); if (reactContext == null) { reactInstanceManager.addReactInstanceEventListener( - new ReactInstanceManager.ReactInstanceEventListener() { + new ReactInstanceEventListener() { @Override public void onReactContextInitialized(ReactContext reactContext) { reactInstanceManager.removeReactInstanceEventListener(this); diff --git a/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.java b/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.java index 8b7f0913d121..c3310bac32f5 100644 --- a/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.java +++ b/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.java @@ -19,6 +19,7 @@ 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; @@ -51,7 +52,7 @@ public void apply(OkHttpClient.Builder builder) { ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); if (reactContext == null) { reactInstanceManager.addReactInstanceEventListener( - new ReactInstanceManager.ReactInstanceEventListener() { + new ReactInstanceEventListener() { @Override public void onReactContextInitialized(ReactContext reactContext) { reactInstanceManager.removeReactInstanceEventListener(this); From 288ca225839a6f49a30a8a0fb0d69abbbac8b13e Mon Sep 17 00:00:00 2001 From: Juan Tejada Date: Tue, 19 Oct 2021 09:59:22 -0700 Subject: [PATCH 023/628] Update React DevTools v4.20.1 Summary: Update `react-devtools-core` and `react-devtools` dependencies for RN, VSCode, Flipper, etc. `js1 upgrade react-devtools -v 4.20.1` # Changelog: [General][Changed] - Upgraded react-devtools-core dependency to 4.20.1 Reviewed By: lunaruan Differential Revision: D31762360 fbshipit-source-id: 9269a49afb263c78916852f51ebbd48ceaf531b0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9a1c7f65d12c..0a56e66c3e68 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "pretty-format": "^26.5.2", "promise": "^8.0.3", "prop-types": "^15.7.2", - "react-devtools-core": "4.20.0", + "react-devtools-core": "4.20.1", "react-refresh": "^0.4.0", "regenerator-runtime": "^0.13.2", "scheduler": "^0.20.2", diff --git a/yarn.lock b/yarn.lock index 1aeb15ae1c4a..3a9eeab7a674 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5554,10 +5554,10 @@ range-parser@~1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= -react-devtools-core@4.20.0: - version "4.20.0" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.20.0.tgz#49640f374bcf541cd86410d86c2cb07392005b33" - integrity sha512-85889TaQpU4HImySgOjVwsGE1vkS9dgEjtruRHutnXlBN3IZN8lDRuqRBLmhFkS50BEmfpTR28qV7bHAqwHooA== +react-devtools-core@4.20.1: + version "4.20.1" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.20.1.tgz#77e8aacd93ca34cf908c11e6c72151b79217b618" + integrity sha512-HBcLfLi2R6VxlWFF2i5lONYlr3KLh324RPFeApZ3G6GGaJrcS/qtk9M/iESw7fRTlgPHEg+A4j6e1j9oXpvi5w== dependencies: shell-quote "^1.6.1" ws "^7" From d5689b959a56e719ca6db9abf3d0c4d4db9aa914 Mon Sep 17 00:00:00 2001 From: Xuan Huang Date: Tue, 19 Oct 2021 11:29:19 -0700 Subject: [PATCH 024/628] Inherit type of queueMicrotask from Flow Summary: Changelog: [Internal] Now that Flow releases include a type def of `queueMicrotask`, we can just inherit it from Flow Reviewed By: yungsters Differential Revision: D31754482 fbshipit-source-id: f42f8ec955f898d7a964ff85b6061d4840590d4d --- flow/global.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/flow/global.js b/flow/global.js index b2e76fe8d232..3d5166f9ca82 100644 --- a/flow/global.js +++ b/flow/global.js @@ -49,11 +49,7 @@ declare var global: { +requestIdleCallback: typeof requestIdleCallback, +cancelIdleCallback: typeof cancelIdleCallback, +setTimeout: typeof setTimeout, - // TODO(T97509743): use `typeof` when the next Flow release is available. - +queueMicrotask: >( - jobCallback: (...args: TArguments) => mixed, - ) => void, - + +queueMicrotask: typeof queueMicrotask, +console: typeof console, // JavaScript environments specific From e494e4beb6a124008fd116178cbc38335bd87809 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 19 Oct 2021 15:47:26 -0700 Subject: [PATCH 025/628] Fix onPress event for nested Text in RN Android Summary: This bug is caused by RNAndroid dispatching an incorrect sequence of events to JS when the user taps on a Text. Taking into consideration the example P462662009, when the user taps of the "Inner" text, RN Android is dispatching three events: topTouchStart, topTouchStart and topTouchEnd. The information stored on the first two JS events is correct, but the problem is that it is duplicated. This sequence of events makes Pressability to dispatch the event to the incorrect target. This was originally introduced in D3035589 (https://github.com/facebook/react-native/commit/39fdce259dd46de8fd715efbfd12ede4bc24c8c2) (2016) In this diff I'm changing the way RN Android bubbles events when the user taps on a ReactTextView. From now on, events won't be bubbled anymore, and they will be handled by the ReactRootView.onInterceptTouchEvent: https://fburl.com/code/rbt8$ Additionally, I'm creating a FeatureFlag in case this change has a unknown side effect that's only detected in production. I will create a MC for FB4A in the next diffs of the stack changelog: [Fixed][Android] Fix onPress event for nested Text in RN Android Reviewed By: javache Differential Revision: D31628461 fbshipit-source-id: 177397d4369191a3c97e2f86e801757b27ee5121 --- .../com/facebook/react/config/ReactFeatureFlags.java | 3 +++ .../com/facebook/react/views/text/ReactTextView.java | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java index 446ea326ac96..c42be6e1d4ef 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -105,4 +105,7 @@ public static boolean isMapBufferSerializationEnabled() { public static boolean useDispatchUniqueForCoalescableEvents = false; public static boolean useUpdatedTouchPreprocessing = false; + + /** TODO: T103427072 Delete ReactFeatureFlags.enableNestedTextOnPressEventFix */ + public static boolean enableNestedTextOnPressEventFix = true; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java index a6d48f57d17a..5d928bb9a313 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java @@ -19,6 +19,7 @@ import android.text.method.LinkMovementMethod; import android.text.util.Linkify; import android.view.Gravity; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import androidx.annotation.Nullable; @@ -31,6 +32,7 @@ import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.ReactConstants; +import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.ReactCompoundView; import com.facebook.react.uimanager.UIManagerModule; @@ -382,6 +384,16 @@ public int reactTagForTouch(float touchX, float touchY) { return target; } + @Override + public boolean onTouchEvent(MotionEvent ev) { + // The root view always assumes any view that was tapped wants the touch + // and sends the event to JS as such. + // We don't need to do bubbling in native (it's already happening in JS). + // For an explanation of bubbling and capturing, see + // http://javascript.info/tutorial/bubbling-and-capturing#capturing + return ReactFeatureFlags.enableNestedTextOnPressEventFix; + } + @Override protected boolean verifyDrawable(Drawable drawable) { if (mContainsImages && getText() instanceof Spanned) { From d291a7efdda5997180d1e9bd18d836c1bd2005c5 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Tue, 19 Oct 2021 17:16:10 -0700 Subject: [PATCH 026/628] Allow disabling RTTI/exceptions for android builds; disable by default on Android Summary: For fbandroid builds only, disable RTTI and exceptions by default. Changelog: [Internal] Reviewed By: philIip Differential Revision: D31632757 fbshipit-source-id: cfe0e43486df19fcaacc2b5b818b9d00ec2d427f --- .../java/com/facebook/react/fabric/jni/BUCK | 4 +-- ReactCommon/react/config/BUCK | 2 ++ .../react/renderer/components/view/BUCK | 2 ++ ReactCommon/react/renderer/core/BUCK | 4 +-- .../renderer/core/LayoutableShadowNode.cpp | 36 +++++++------------ .../renderer/core/LayoutableShadowNode.h | 4 +-- ReactCommon/react/renderer/debug/BUCK | 2 ++ tools/build_defs/oss/rn_defs.bzl | 24 ++++++++++--- 8 files changed, 44 insertions(+), 34 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK index 7ea630148b4c..693f6f967a51 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK @@ -11,8 +11,8 @@ rn_xplat_cxx_library( ], prefix = "react/fabric", ), - compiler_flags_enable_exceptions = True, - compiler_flags_enable_rtti = True, # dynamic_cast used within Binding.cpp + compiler_flags_enable_exceptions = False, + compiler_flags_enable_rtti = False, # for YogaLayoutableShadowNode? fbandroid_allow_jni_merging = True, labels = ["supermodule:xplat/default/public.react_native.infra"], platforms = ANDROID, diff --git a/ReactCommon/react/config/BUCK b/ReactCommon/react/config/BUCK index 3fec8b7c1d5d..1d81785820c4 100644 --- a/ReactCommon/react/config/BUCK +++ b/ReactCommon/react/config/BUCK @@ -18,6 +18,8 @@ rn_xplat_cxx_library( ], prefix = "react/config", ), + compiler_flags_enable_exceptions = True, + compiler_flags_enable_rtti = True, # for ReactNativeConfig fbobjc_compiler_flags = APPLE_COMPILER_FLAGS, fbobjc_preprocessor_flags = get_preprocessor_flags_for_build_mode() + get_apple_inspector_flags(), force_static = True, diff --git a/ReactCommon/react/renderer/components/view/BUCK b/ReactCommon/react/renderer/components/view/BUCK index d78b21f2cf89..b82e163974fe 100644 --- a/ReactCommon/react/renderer/components/view/BUCK +++ b/ReactCommon/react/renderer/components/view/BUCK @@ -35,6 +35,8 @@ rn_xplat_cxx_library( ], prefix = "react/renderer/components/view", ), + compiler_flags_enable_exceptions = False, + compiler_flags_enable_rtti = False, # YogaLayoutableShadowNode fbobjc_compiler_flags = APPLE_COMPILER_FLAGS, fbobjc_preprocessor_flags = get_preprocessor_flags_for_build_mode() + get_apple_inspector_flags(), force_static = True, diff --git a/ReactCommon/react/renderer/core/BUCK b/ReactCommon/react/renderer/core/BUCK index feb8f6569be0..d4d9420c193e 100644 --- a/ReactCommon/react/renderer/core/BUCK +++ b/ReactCommon/react/renderer/core/BUCK @@ -32,8 +32,8 @@ rn_xplat_cxx_library( ], prefix = "react/renderer/core", ), - compiler_flags_enable_exceptions = True, - compiler_flags_enable_rtti = True, # Needed for DebugStringConvertible - need to find a non-RTTI way to do this / enable RTTI for debug builds only + compiler_flags_enable_exceptions = False, + compiler_flags_enable_rtti = False, # Needed for DebugStringConvertible - need to find a non-RTTI way to do this / enable RTTI for debug builds only. Also EventBeat/AsyncEventBeat fbobjc_compiler_flags = APPLE_COMPILER_FLAGS, fbobjc_preprocessor_flags = get_preprocessor_flags_for_build_mode() + get_apple_inspector_flags(), force_static = True, diff --git a/ReactCommon/react/renderer/core/LayoutableShadowNode.cpp b/ReactCommon/react/renderer/core/LayoutableShadowNode.cpp index a1ad4dda15f7..3e8a531306a0 100644 --- a/ReactCommon/react/renderer/core/LayoutableShadowNode.cpp +++ b/ReactCommon/react/renderer/core/LayoutableShadowNode.cpp @@ -17,6 +17,19 @@ namespace facebook { namespace react { +LayoutableShadowNode::LayoutableShadowNode( + ShadowNodeFragment const &fragment, + ShadowNodeFamily::Shared const &family, + ShadowNodeTraits traits) + : ShadowNode(fragment, family, traits), layoutMetrics_({}) {} + +LayoutableShadowNode::LayoutableShadowNode( + ShadowNode const &sourceShadowNode, + ShadowNodeFragment const &fragment) + : ShadowNode(sourceShadowNode, fragment), + layoutMetrics_(static_cast(sourceShadowNode) + .layoutMetrics_) {} + LayoutMetrics LayoutableShadowNode::computeRelativeLayoutMetrics( ShadowNodeFamily const &descendantNodeFamily, LayoutableShadowNode const &ancestorNode, @@ -118,19 +131,6 @@ LayoutMetrics LayoutableShadowNode::computeRelativeLayoutMetrics( return layoutMetrics; } -LayoutableShadowNode::LayoutableShadowNode( - ShadowNodeFragment const &fragment, - ShadowNodeFamily::Shared const &family, - ShadowNodeTraits traits) - : ShadowNode(fragment, family, traits), layoutMetrics_({}) {} - -LayoutableShadowNode::LayoutableShadowNode( - ShadowNode const &sourceShadowNode, - ShadowNodeFragment const &fragment) - : ShadowNode(sourceShadowNode, fragment), - layoutMetrics_(static_cast(sourceShadowNode) - .layoutMetrics_) {} - ShadowNodeTraits LayoutableShadowNode::BaseTraits() { auto traits = ShadowNodeTraits{}; traits.set(ShadowNodeTraits::Trait::LayoutableKind); @@ -202,16 +202,6 @@ Float LayoutableShadowNode::lastBaseline(Size size) const { return 0; } -void LayoutableShadowNode::layoutTree( - LayoutContext layoutContext, - LayoutConstraints layoutConstraints) { - // Default implementation does nothing. -} - -void LayoutableShadowNode::layout(LayoutContext layoutContext) { - // Default implementation does nothing. -} - ShadowNode::Shared LayoutableShadowNode::findNodeAtPoint( ShadowNode::Shared node, Point point) { diff --git a/ReactCommon/react/renderer/core/LayoutableShadowNode.h b/ReactCommon/react/renderer/core/LayoutableShadowNode.h index b816b54a2cfc..0844a1c563c5 100644 --- a/ReactCommon/react/renderer/core/LayoutableShadowNode.h +++ b/ReactCommon/react/renderer/core/LayoutableShadowNode.h @@ -70,7 +70,7 @@ class LayoutableShadowNode : public ShadowNode { */ virtual void layoutTree( LayoutContext layoutContext, - LayoutConstraints layoutConstraints); + LayoutConstraints layoutConstraints)=0; /* * Measures the node (and node content, probably recursively) with @@ -101,7 +101,7 @@ class LayoutableShadowNode : public ShadowNode { * - Calculate and assign `LayoutMetrics` for the children; * - Call itself recursively on every child if needed. */ - virtual void layout(LayoutContext layoutContext); + virtual void layout(LayoutContext layoutContext)=0; /* * Returns layout metrics computed during previous layout pass. diff --git a/ReactCommon/react/renderer/debug/BUCK b/ReactCommon/react/renderer/debug/BUCK index e4b2ee230358..73bed3edf811 100644 --- a/ReactCommon/react/renderer/debug/BUCK +++ b/ReactCommon/react/renderer/debug/BUCK @@ -31,6 +31,8 @@ rn_xplat_cxx_library( ], prefix = "react/renderer/debug", ), + compiler_flags_enable_exceptions = True, + compiler_flags_enable_rtti = True, # DebugStringConvertible fbobjc_compiler_flags = APPLE_COMPILER_FLAGS, fbobjc_preprocessor_flags = get_preprocessor_flags_for_build_mode() + get_apple_inspector_flags(), force_static = True, diff --git a/tools/build_defs/oss/rn_defs.bzl b/tools/build_defs/oss/rn_defs.bzl index 45a732449dad..ea1cfb6e5057 100644 --- a/tools/build_defs/oss/rn_defs.bzl +++ b/tools/build_defs/oss/rn_defs.bzl @@ -80,7 +80,7 @@ def get_react_native_preprocessor_flags(): return [] # Building is not supported in OSS right now -def rn_xplat_cxx_library(name, compiler_flags_enable_exceptions = True, compiler_flags_enable_rtti = True, **kwargs): +def rn_xplat_cxx_library(name, compiler_flags_enable_exceptions = False, compiler_flags_enable_rtti = False, **kwargs): visibility = kwargs.get("visibility", []) kwargs = { k: v @@ -97,17 +97,31 @@ def rn_xplat_cxx_library(name, compiler_flags_enable_exceptions = True, compiler # or being overridden in compiler_flags, it's very likely that the flag is set # app-wide or that we're otherwise in some special mode. kwargs["compiler_flags"] = kwargs.get("compiler_flags", []) + kwargs["fbobjc_compiler_flags"] = kwargs.get("fbobjc_compiler_flags", []) + kwargs["fbandroid_compiler_flags"] = kwargs.get("fbandroid_compiler_flags", []) + kwargs["windows_compiler_flags"] = kwargs.get("windows_compiler_flags", []) kwargs["compiler_flags"] = ["-std=c++17"] + kwargs["compiler_flags"] kwargs["compiler_flags"] = ["-Wall"] + kwargs["compiler_flags"] kwargs["compiler_flags"] = ["-Werror"] + kwargs["compiler_flags"] + + # RTTI and exceptions allowed for ObjC/iOS, macos, Windows unconditionally for now + kwargs["fbobjc_compiler_flags"] = ["-fexceptions"] + kwargs["fbobjc_compiler_flags"] + kwargs["windows_compiler_flags"] = ["-fno-exceptions"] + kwargs["windows_compiler_flags"] + kwargs["fbobjc_compiler_flags"] = ["-frtti"] + kwargs["fbobjc_compiler_flags"] + kwargs["windows_compiler_flags"] = ["-frtti"] + kwargs["windows_compiler_flags"] + + # For now, we allow turning off RTTI and exceptions for android builds only if compiler_flags_enable_exceptions: - kwargs["compiler_flags"] = ["-fexceptions"] + kwargs["compiler_flags"] + kwargs["fbandroid_compiler_flags"] = ["-fexceptions"] + kwargs["fbandroid_compiler_flags"] else: - kwargs["compiler_flags"] = ["-fno-exceptions"] + kwargs["compiler_flags"] + # TODO: fbjni currently DOES NOT WORK with -fno-exceptions, which breaks MOST RN Android modules + kwargs["fbandroid_compiler_flags"] = ["-fexceptions"] + kwargs["fbandroid_compiler_flags"] + #kwargs["fbandroid_compiler_flags"] = ["-fno-exceptions"] + kwargs["fbandroid_compiler_flags"] + if compiler_flags_enable_rtti: - kwargs["compiler_flags"] = ["-frtti"] + kwargs["compiler_flags"] + kwargs["fbandroid_compiler_flags"] = ["-frtti"] + kwargs["fbandroid_compiler_flags"] else: - kwargs["compiler_flags"] = ["-fno-rtti"] + kwargs["compiler_flags"] + kwargs["fbandroid_compiler_flags"] = ["-fno-rtti"] + kwargs["fbandroid_compiler_flags"] native.cxx_library( name = name, From 8fcc2fa31ab2763e218b489fc59d69fb7050b69e Mon Sep 17 00:00:00 2001 From: Sota Ogo Date: Tue, 19 Oct 2021 18:33:30 -0700 Subject: [PATCH 027/628] Update the path to use the full path so that they can be found in the OSS environment. Summary: I had to make this change when enabling Fabric in OSS. Without the full path, it can't find the modules like processColor within node_modules. Changelog: Internal Reviewed By: motiz88 Differential Revision: D31300424 fbshipit-source-id: 59b82470ec1ce63b63704931786e22b98f4bf046 --- .../components/GenerateViewConfigJs.js | 13 ++++++++----- .../GenerateViewConfigJs-test.js.snap | 18 +++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js index 8a16c6742753..a1cc70506524 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js +++ b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js @@ -54,14 +54,17 @@ function getReactDiffProcessValue(typeAnnotation) { case 'ReservedPropTypeAnnotation': switch (typeAnnotation.name) { case 'ColorPrimitive': - return j.template.expression`{ process: require('processColor') }`; + return j.template + .expression`{ process: require('react-native/Libraries/StyleSheet/processColor') }`; case 'ImageSourcePrimitive': return j.template - .expression`{ process: require('resolveAssetSource') }`; + .expression`{ process: require('react-native/Libraries/Image/resolveAssetSource') }`; case 'PointPrimitive': - return j.template.expression`{ diff: require('pointsDiffer') }`; + return j.template + .expression`{ diff: require('react-native/Libraries/Utilities/differ/pointsDiffer') }`; case 'EdgeInsetsPrimitive': - return j.template.expression`{ diff: require('insetsDiffer') }`; + return j.template + .expression`{ diff: require('react-native/Libraries/Utilities/differ/insetsDiffer') }`; default: (typeAnnotation.name: empty); throw new Error( @@ -73,7 +76,7 @@ function getReactDiffProcessValue(typeAnnotation) { switch (typeAnnotation.elementType.name) { case 'ColorPrimitive': return j.template - .expression`{ process: require('processColorArray') }`; + .expression`{ process: require('react-native/Libraries/StyleSheet/processColorArray') }`; case 'ImageSourcePrimitive': return j.literal(true); case 'PointPrimitive': diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap index cf218e0b23e7..2bb735544c88 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap @@ -30,7 +30,7 @@ export default NativeComponentRegistry.get(nativeComponentName, () => ({ radii: true, colors: { - process: require('processColorArray'), + process: require('react-native/Libraries/StyleSheet/processColorArray'), }, srcs: true, @@ -132,7 +132,7 @@ export default NativeComponentRegistry.get(nativeComponentName, () => ({ validAttributes: { tintColor: { - process: require('processColor'), + process: require('react-native/Libraries/StyleSheet/processColor'), }, }, })); @@ -534,7 +534,7 @@ export default NativeComponentRegistry.get(nativeComponentName, () => ({ validAttributes: { thumbImage: { - process: require('resolveAssetSource'), + process: require('react-native/Libraries/Image/resolveAssetSource'), }, }, })); @@ -567,7 +567,7 @@ export default NativeComponentRegistry.get(nativeComponentName, () => ({ validAttributes: { contentInset: { - diff: require('insetsDiffer'), + diff: require('react-native/Libraries/Utilities/differ/insetsDiffer'), }, }, })); @@ -705,19 +705,19 @@ export default NativeComponentRegistry.get(nativeComponentName, () => ({ validAttributes: { thumbImage: { - process: require('resolveAssetSource'), + process: require('react-native/Libraries/Image/resolveAssetSource'), }, color: { - process: require('processColor'), + process: require('react-native/Libraries/StyleSheet/processColor'), }, thumbTintColor: { - process: require('processColor'), + process: require('react-native/Libraries/StyleSheet/processColor'), }, point: { - diff: require('pointsDiffer'), + diff: require('react-native/Libraries/Utilities/differ/pointsDiffer'), }, }, })); @@ -809,7 +809,7 @@ export default NativeComponentRegistry.get(nativeComponentName, () => ({ validAttributes: { startPoint: { - diff: require('pointsDiffer'), + diff: require('react-native/Libraries/Utilities/differ/pointsDiffer'), }, }, })); From a110de9b0e39617dcb1c516c4c1a0827ae45451f Mon Sep 17 00:00:00 2001 From: CodemodService FBSourceClangFormatLinterBot <> Date: Tue, 19 Oct 2021 21:15:14 -0700 Subject: [PATCH 028/628] Daily `arc lint --take CLANGFORMAT` Reviewed By: zertosh Differential Revision: D31785584 fbshipit-source-id: 6e73901bdeaec659fbf46f1a5559f18cd09ae091 --- ReactCommon/react/renderer/core/LayoutableShadowNode.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReactCommon/react/renderer/core/LayoutableShadowNode.h b/ReactCommon/react/renderer/core/LayoutableShadowNode.h index 0844a1c563c5..a2653102cbfe 100644 --- a/ReactCommon/react/renderer/core/LayoutableShadowNode.h +++ b/ReactCommon/react/renderer/core/LayoutableShadowNode.h @@ -70,7 +70,7 @@ class LayoutableShadowNode : public ShadowNode { */ virtual void layoutTree( LayoutContext layoutContext, - LayoutConstraints layoutConstraints)=0; + LayoutConstraints layoutConstraints) = 0; /* * Measures the node (and node content, probably recursively) with @@ -101,7 +101,7 @@ class LayoutableShadowNode : public ShadowNode { * - Calculate and assign `LayoutMetrics` for the children; * - Call itself recursively on every child if needed. */ - virtual void layout(LayoutContext layoutContext)=0; + virtual void layout(LayoutContext layoutContext) = 0; /* * Returns layout metrics computed during previous layout pass. From 3dc5dc11f6919c9a6215c01d25a480f10ddd0dd3 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Tue, 19 Oct 2021 21:42:43 -0700 Subject: [PATCH 029/628] Fix CircleCI build: OSS cxx_library BUCK macro cannot take platform-specific compiler flags Summary: Fix CircleCI build. Changelog: [Internal] Reviewed By: sota000 Differential Revision: D31785389 fbshipit-source-id: 75676e787760b40e0b262c4475c9a20bdcef5234 --- tools/build_defs/oss/rn_defs.bzl | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/tools/build_defs/oss/rn_defs.bzl b/tools/build_defs/oss/rn_defs.bzl index ea1cfb6e5057..f25325754676 100644 --- a/tools/build_defs/oss/rn_defs.bzl +++ b/tools/build_defs/oss/rn_defs.bzl @@ -96,32 +96,25 @@ def rn_xplat_cxx_library(name, compiler_flags_enable_exceptions = False, compile # For all of these, we PREPEND to compiler_flags: if these are already set # or being overridden in compiler_flags, it's very likely that the flag is set # app-wide or that we're otherwise in some special mode. + # OSS builds cannot have platform-specific flags here, so these are the same + # for all platforms. kwargs["compiler_flags"] = kwargs.get("compiler_flags", []) - kwargs["fbobjc_compiler_flags"] = kwargs.get("fbobjc_compiler_flags", []) - kwargs["fbandroid_compiler_flags"] = kwargs.get("fbandroid_compiler_flags", []) - kwargs["windows_compiler_flags"] = kwargs.get("windows_compiler_flags", []) kwargs["compiler_flags"] = ["-std=c++17"] + kwargs["compiler_flags"] kwargs["compiler_flags"] = ["-Wall"] + kwargs["compiler_flags"] kwargs["compiler_flags"] = ["-Werror"] + kwargs["compiler_flags"] - # RTTI and exceptions allowed for ObjC/iOS, macos, Windows unconditionally for now - kwargs["fbobjc_compiler_flags"] = ["-fexceptions"] + kwargs["fbobjc_compiler_flags"] - kwargs["windows_compiler_flags"] = ["-fno-exceptions"] + kwargs["windows_compiler_flags"] - kwargs["fbobjc_compiler_flags"] = ["-frtti"] + kwargs["fbobjc_compiler_flags"] - kwargs["windows_compiler_flags"] = ["-frtti"] + kwargs["windows_compiler_flags"] - # For now, we allow turning off RTTI and exceptions for android builds only if compiler_flags_enable_exceptions: - kwargs["fbandroid_compiler_flags"] = ["-fexceptions"] + kwargs["fbandroid_compiler_flags"] + kwargs["compiler_flags"] = ["-fexceptions"] + kwargs["fbandroid_compiler_flags"] else: # TODO: fbjni currently DOES NOT WORK with -fno-exceptions, which breaks MOST RN Android modules - kwargs["fbandroid_compiler_flags"] = ["-fexceptions"] + kwargs["fbandroid_compiler_flags"] - #kwargs["fbandroid_compiler_flags"] = ["-fno-exceptions"] + kwargs["fbandroid_compiler_flags"] + kwargs["compiler_flags"] = ["-fexceptions"] + kwargs["fbandroid_compiler_flags"] + kwargs["compiler_flags"] = ["-fno-exceptions"] + kwargs["fbandroid_compiler_flags"] if compiler_flags_enable_rtti: - kwargs["fbandroid_compiler_flags"] = ["-frtti"] + kwargs["fbandroid_compiler_flags"] + kwargs["compiler_flags"] = ["-frtti"] + kwargs["fbandroid_compiler_flags"] else: - kwargs["fbandroid_compiler_flags"] = ["-fno-rtti"] + kwargs["fbandroid_compiler_flags"] + kwargs["compiler_flags"] = ["-fno-rtti"] + kwargs["fbandroid_compiler_flags"] native.cxx_library( name = name, From 1486b31b2bc140208d8d71898f5cb37b507b4f35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Wed, 20 Oct 2021 04:04:36 -0700 Subject: [PATCH 030/628] Re-apply: [RN] Make runtime initialization from React renderers a no-op Summary: Changelog: [internal] Reviewed By: yungsters Differential Revision: D31760907 fbshipit-source-id: ba145a30ead52abeb8affca84c3dec21dfefe30c --- .../ReactPrivate/ReactNativePrivateInitializeCore.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Libraries/ReactPrivate/ReactNativePrivateInitializeCore.js b/Libraries/ReactPrivate/ReactNativePrivateInitializeCore.js index e34e6271f2f7..975e17353797 100644 --- a/Libraries/ReactPrivate/ReactNativePrivateInitializeCore.js +++ b/Libraries/ReactPrivate/ReactNativePrivateInitializeCore.js @@ -8,4 +8,13 @@ * @flow strict-local */ -import '../Core/InitializeCore'; +// TODO: Remove this module when the import is removed from the React renderers. + +// This module is used by React to initialize the React Native runtime, +// but it is now a no-op. + +// This is redundant because all React Native apps are already executing +// `InitializeCore` before the entrypoint of the JS bundle +// (see https://github.com/react-native-community/cli/blob/e1da64317a1178c2b262d82c2f14210cdfa3ebe1/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts#L93) +// and importing it unconditionally from React only prevents users from +// customizing what they want to include in their apps (re: app size). From afc96ab126af34d5687db00c788bde0be8c47f89 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 20 Oct 2021 06:05:44 -0700 Subject: [PATCH 031/628] Safely access the project NDK properties Summary: This diff is making sure that we're not failing the build if either `ANDROID_NDK_PATH` or `ANDROID_NDK_VERSION` are missing. Currently if any of the two is missing, a Gradle sync will fail. This is problematic for the New Arch Rollout playbook as users will import the `:ReactAndroid` project to build from source, and those properties are instead defined at the `react-native` top level project. Changelog: [Internal] [Changed] - Safely access the project NDK properties Reviewed By: sshic Differential Revision: D31731291 fbshipit-source-id: ce4b762998ed545b3ec7ddcc07abbe4452602190 --- ReactAndroid/build.gradle | 8 +++++--- packages/rn-tester/android/app/build.gradle | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index 6a00b15402b0..e79b7510cd3b 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -363,9 +363,11 @@ task installArchives { android { compileSdkVersion 30 - ndkVersion ANDROID_NDK_VERSION - if (ANDROID_NDK_PATH != null) { - ndkPath ANDROID_NDK_PATH + if (project.hasProperty("ANDROID_NDK_VERSION")) { + ndkVersion project.property("ANDROID_NDK_VERSION") + } + if (project.hasProperty("ANDROID_NDK_PATH")) { + ndkPath project.property("ANDROID_NDK_PATH") } defaultConfig { diff --git a/packages/rn-tester/android/app/build.gradle b/packages/rn-tester/android/app/build.gradle index 2bed0844b1a1..4209522fee39 100644 --- a/packages/rn-tester/android/app/build.gradle +++ b/packages/rn-tester/android/app/build.gradle @@ -139,9 +139,11 @@ def nativeArchitectures = project.getProperties().get("reactNativeDebugArchitect android { compileSdkVersion 29 - ndkVersion ANDROID_NDK_VERSION - if (ANDROID_NDK_PATH != null) { - ndkPath ANDROID_NDK_PATH + if (project.hasProperty("ANDROID_NDK_VERSION")) { + ndkVersion project.property("ANDROID_NDK_VERSION") + } + if (project.hasProperty("ANDROID_NDK_PATH")) { + ndkPath project.property("ANDROID_NDK_PATH") } dexOptions { From e5ad0b403e14a83f12ccb85f35ae5aa64b5bae38 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 20 Oct 2021 06:07:16 -0700 Subject: [PATCH 032/628] useJavaGenerator output should override the react-native-codegen one Summary: Turns out that the Java generator is (as expected) outputting only Java code. Therefore the C++ and the Markdown files are still generated by `react-native-codegen`. I'm updating the logic to make sure the Java generator is not mutually exclusive and overrides the output of `react-native-codegen` Changelog: [Internal] [Changed] - useJavaGenerator output should override the react-native-codegen one Reviewed By: sshic Differential Revision: D31754428 fbshipit-source-id: 3e6dae8212fbfebd28247ec17e88243871265808 --- ReactAndroid/build.gradle | 2 +- .../tasks/GenerateCodegenArtifactsTask.kt | 28 +++++++++---------- packages/rn-tester/android/app/build.gradle | 2 +- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index e79b7510cd3b..a0e4610aefca 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -460,7 +460,7 @@ react { libraryName = "rncore" jsRootDir = file("../Libraries") reactRoot = file("$projectDir/..") - useJavaGenerator = System.getenv("USE_CODEGEN_JAVAPOET") ?: false + useJavaGenerator = System.getenv("USE_CODEGEN_JAVAPOET")?.toBoolean() ?: false } afterEvaluate { diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt index d6890c310edf..599741c57b42 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt @@ -48,12 +48,9 @@ abstract class GenerateCodegenArtifactsTask : Exec() { override fun exec() { setupCommandLine() super.exec() - } - - internal fun setupCommandLine() { if (useJavaGenerator.getOrElse(false)) { // Use Java-based generator implementation to produce the source files, - // instead of using the JS-based generator. + // this will override the JS-based generator output (for the Java files only). try { JavaGenerator( generatedSchemaFile.get().asFile, @@ -63,17 +60,18 @@ abstract class GenerateCodegenArtifactsTask : Exec() { } catch (e: Exception) { throw GradleException("Failed to generate Java from schema.", e) } - commandLine("echo", "Used JavaGenerator to generate files instead of generate-specs-cli.js") - } else { - commandLine( - windowsAwareYarn( - *nodeExecutableAndArgs.get().toTypedArray(), - reactRoot.file("scripts/generate-specs-cli.js").get().asFile.absolutePath, - "android", - generatedSchemaFile.get().asFile.absolutePath, - generatedSrcDir.get().asFile.absolutePath, - libraryName.get(), - codegenJavaPackageName.get())) } } + + internal fun setupCommandLine() { + commandLine( + windowsAwareYarn( + *nodeExecutableAndArgs.get().toTypedArray(), + reactRoot.file("scripts/generate-specs-cli.js").get().asFile.absolutePath, + "android", + generatedSchemaFile.get().asFile.absolutePath, + generatedSrcDir.get().asFile.absolutePath, + libraryName.get(), + codegenJavaPackageName.get())) + } } diff --git a/packages/rn-tester/android/app/build.gradle b/packages/rn-tester/android/app/build.gradle index 4209522fee39..0ec74b694e72 100644 --- a/packages/rn-tester/android/app/build.gradle +++ b/packages/rn-tester/android/app/build.gradle @@ -88,7 +88,7 @@ react { // Codegen Configs jsRootDir = file("$rootDir/packages/rn-tester") - useJavaGenerator = System.getenv("USE_CODEGEN_JAVAPOET") ?: false + useJavaGenerator = System.getenv("USE_CODEGEN_JAVAPOET")?.toBoolean() ?: false } project.ext.react = [ From 928519e4bd8b9f576f8b72da55ed7d6feb0883e5 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Wed, 20 Oct 2021 08:20:56 -0700 Subject: [PATCH 033/628] Remove extra invariant Summary: Remove extra invariant in Text.js changelog: [internal] internal Reviewed By: philIip Differential Revision: D31628462 fbshipit-source-id: ec703c7b77dc842890865d79095b357a80dfa33d --- Libraries/Text/Text.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Libraries/Text/Text.js b/Libraries/Text/Text.js index f2dc30651eaf..f55209404ef3 100644 --- a/Libraries/Text/Text.js +++ b/Libraries/Text/Text.js @@ -18,7 +18,6 @@ import {NativeText, NativeVirtualText} from './TextNativeComponent'; import {type TextProps} from './TextProps'; import * as React from 'react'; import {useContext, useMemo, useState} from 'react'; -import invariant from 'invariant'; /** * Text is the fundamental component for displaying text. From d9689b90a4023efaa8c35824d63e8fe0c692b9fb Mon Sep 17 00:00:00 2001 From: Andrei Shikov Date: Wed, 20 Oct 2021 08:26:43 -0700 Subject: [PATCH 034/628] Fix memory corruption issue in SurfaceHandler Summary: SurfaceHandlerBinding uses string from JVM memory when initializing, which is released before it is used. If JVM manages to collect this memory before instance init, it can lead to use-after-free. Changelog: [Internal] - fix memory corruption in cxx binding of surface handler Reviewed By: mdvacca Differential Revision: D31794515 fbshipit-source-id: 3944ebd065f42a516f036096d07c0126a43c912f --- .../com/facebook/react/fabric/jni/SurfaceHandlerBinding.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.cpp index 0df81d2a8992..bf16b1999223 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.cpp @@ -58,11 +58,13 @@ SurfaceHandlerBinding::initHybrid( jint surfaceId, jni::alias_ref moduleName) { auto env = jni::Environment::current(); + const char *moduleNameValue = env->GetStringUTFChars(moduleName.get(), JNI_FALSE); + auto instance = makeCxxInstance(surfaceId, moduleNameValue); env->ReleaseStringUTFChars(moduleName.get(), moduleNameValue); - return makeCxxInstance(surfaceId, moduleNameValue); + return instance; } void SurfaceHandlerBinding::setLayoutConstraints( From 30df66c648caca3fd9863d15c8c056651f882ce3 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 20 Oct 2021 09:32:14 -0700 Subject: [PATCH 035/628] Use explicit codegen path in ReactAndroid Summary: This Diff is adapting the codegen configuration for ReactAndroid to specify a path for the codegen package. I've used the `findNodeModulePath` so this will work for both: * The top level OSS project as `node_modules` will be at the top level * The scenario where ReactAndroid will be included and built from source (as `node_modules` is in the `..` folder). Changelog: [Internal] [Changed] - Use explicit codegen path in ReactAndroid Reviewed By: mdvacca Differential Revision: D31730920 fbshipit-source-id: 6637da5d0098114f4379bcaeb8a40e976c46f194 --- ReactAndroid/build.gradle | 3 +++ .../src/main/kotlin/com/facebook/react/ReactExtension.kt | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index a0e4610aefca..779bdea62d02 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -461,6 +461,9 @@ react { jsRootDir = file("../Libraries") reactRoot = file("$projectDir/..") useJavaGenerator = System.getenv("USE_CODEGEN_JAVAPOET")?.toBoolean() ?: false + // We search for the codegen in either one of the `node_modules` folder or in the + // root packages folder (that's for when we build from source without calling `yarn install`). + codegenDir = file(findNodeModulePath(projectDir, "react-native-codegen") ?: "../packages/react-native-codegen/") } afterEvaluate { diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt index f898c9d37fe4..c6c85ba26e57 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt @@ -173,10 +173,10 @@ abstract class ReactExtension @Inject constructor(project: Project) { /** * The path to the react-native-codegen folder. * - * Default: $projectDir/../../packages/react-native-codegen + * Default: $projectDir/../../node_modules/react-native-codegen */ val codegenDir: DirectoryProperty = - objects.directoryProperty().convention(reactRoot.dir("packages/react-native-codegen")) + objects.directoryProperty().convention(reactRoot.dir("node_modules/react-native-codegen")) /** * The root directory for all JS files for the app. From cd0dae00b1cd2407165c04dd9fed7e133c416424 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Wed, 20 Oct 2021 09:59:59 -0700 Subject: [PATCH 036/628] Followup: fix rn_defs CircleCI build failures Summary: I missed some spots where an unsupported key (fbandroid_compiler_flags) was being referenced. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D31796826 fbshipit-source-id: 491b5121ef6461bef4a59c6aef65ce61f683341f --- tools/build_defs/oss/rn_defs.bzl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/build_defs/oss/rn_defs.bzl b/tools/build_defs/oss/rn_defs.bzl index f25325754676..492fc2082ddf 100644 --- a/tools/build_defs/oss/rn_defs.bzl +++ b/tools/build_defs/oss/rn_defs.bzl @@ -105,16 +105,16 @@ def rn_xplat_cxx_library(name, compiler_flags_enable_exceptions = False, compile # For now, we allow turning off RTTI and exceptions for android builds only if compiler_flags_enable_exceptions: - kwargs["compiler_flags"] = ["-fexceptions"] + kwargs["fbandroid_compiler_flags"] + kwargs["compiler_flags"] = ["-fexceptions"] + kwargs["compiler_flags"] else: # TODO: fbjni currently DOES NOT WORK with -fno-exceptions, which breaks MOST RN Android modules - kwargs["compiler_flags"] = ["-fexceptions"] + kwargs["fbandroid_compiler_flags"] - kwargs["compiler_flags"] = ["-fno-exceptions"] + kwargs["fbandroid_compiler_flags"] + kwargs["compiler_flags"] = ["-fexceptions"] + kwargs["compiler_flags"] + kwargs["compiler_flags"] = ["-fno-exceptions"] + kwargs["compiler_flags"] if compiler_flags_enable_rtti: - kwargs["compiler_flags"] = ["-frtti"] + kwargs["fbandroid_compiler_flags"] + kwargs["compiler_flags"] = ["-frtti"] + kwargs["compiler_flags"] else: - kwargs["compiler_flags"] = ["-fno-rtti"] + kwargs["fbandroid_compiler_flags"] + kwargs["compiler_flags"] = ["-fno-rtti"] + kwargs["compiler_flags"] native.cxx_library( name = name, From c980d0d5b866681b52012df77d3ddeca8f5daa6c Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 20 Oct 2021 10:08:15 -0700 Subject: [PATCH 037/628] Move Bug Report Issue template to Issue Form Summary: Similary to the `release_blocker_form` we already have, this is migrating the Bug report template to be an issue form. Changelog: [Internal] [Changed] - Move Bug Report Issue template to Issue Form Reviewed By: lunaleaps Differential Revision: D31729676 fbshipit-source-id: e78d5f4e8776fead17d45d340d98932cc41681e9 --- .github/ISSUE_TEMPLATE/bug_report.md | 30 ----------------- .github/ISSUE_TEMPLATE/bug_report.yml | 47 +++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 30 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 083ab18aa096..000000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -name: "🐛 Bug Report" -about: Report a reproducible bug or regression in React Native. -title: '' -labels: 'Needs: Triage :mag:' - ---- - -Please provide all the information requested. Issues that do not follow this format are likely to stall. - -## Description -Please provide a clear and concise description of what the bug is. Include screenshots if needed. -Please test using the latest React Native release to make sure your issue has not already been fixed: https://reactnative.dev/docs/upgrading.html - -## React Native version: -Run `react-native info` in your terminal and copy the results here. - -## Steps To Reproduce -Provide a detailed list of steps that reproduce the issue. - -1. -2. - -## Expected Results -Describe what you expected to happen. - -## Snack, code example, screenshot, or link to a repository: -Please provide a Snack (https://snack.expo.io/), a link to a repository on GitHub, or provide a minimal code example 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 diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 000000000000..6af131b9f5b5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,47 @@ +name: 🐛 Bug Report +description: Report a reproducible bug or regression in React Native. +labels: ["Needs: Triage :mag:"] +body: + - type: markdown + attributes: + value: | + Please provide all the information requested. Issues that do not follow this format are likely to stall. + - type: textarea + id: description + attributes: + label: Description + description: Please provide a clear and concise description of what the bug is. Include screenshots if needed. Please test using the latest React Native release to make sure your issue has not already been fixed - https://reactnative.dev/docs/upgrading.html + validations: + required: true + - type: input + id: version + attributes: + label: Version + description: What react-native version does this appear on? + placeholder: ex. 0.66.0 + validations: + required: true + - type: textarea + id: react-native-info + attributes: + label: Output of `react-native info` + description: Run `react-native info` in your terminal and copy the results here. + validations: + required: true + - type: textarea + id: reproduction + attributes: + label: Steps to reproduce + description: Provide a detailed list of steps that reproduce the issue. + validations: + required: true + - type: textarea + id: extra + attributes: + label: Snack, code example, screenshot, or link to a repository + description: | + Please provide a Snack (https://snack.expo.io/), a link to a repository on GitHub, or provide a minimal code example 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 + validations: + required: false From c7d0c94bf98850776af1a3e36939acacdacec5ed Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 20 Oct 2021 10:17:11 -0700 Subject: [PATCH 038/628] Update codegen template to include correct native modules and C++17 Summary: This diff updates the Makefile generated by `react-native-codegen` to include the correct list of modules. Specifically I've removed some modules that are unused like `libreact_debug` and added others that are necessary for the build to compile correctly such as `libfbjni`. Plus I've bumped the C++ version to 17 as we had a mixture of 14 and 17 across the codebase. Changelog: [Internal] [Changed] - Update codegen template to include correct native modules and C++17 Reviewed By: mdvacca Differential Revision: D31754427 fbshipit-source-id: 8490fa5c5ad298689b564f760c3fc65550c94547 --- .../generators/modules/GenerateModuleJniH.js | 4 ++-- .../GenerateModuleJniH-test.js.snap | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js index a893fea829f1..fbf4160f7b7e 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js @@ -80,12 +80,12 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/${libraryName} -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libreact_debug libreact_render_debug +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore LOCAL_CFLAGS := \\ -DLOG_TAG=\\"ReactNative\\" -LOCAL_CFLAGS += -fexceptions -frtti -std=c++14 -Wall +LOCAL_CFLAGS += -fexceptions -frtti -std=c++17 -Wall include $(BUILD_SHARED_LIBRARY) `; diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap index 5f68533849b1..abee97d4e738 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap @@ -52,12 +52,12 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/complex_objects -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libreact_debug libreact_render_debug +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" -LOCAL_CFLAGS += -fexceptions -frtti -std=c++14 -Wall +LOCAL_CFLAGS += -fexceptions -frtti -std=c++17 -Wall include $(BUILD_SHARED_LIBRARY) ", @@ -116,12 +116,12 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/empty_native_modules -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libreact_debug libreact_render_debug +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" -LOCAL_CFLAGS += -fexceptions -frtti -std=c++14 -Wall +LOCAL_CFLAGS += -fexceptions -frtti -std=c++17 -Wall include $(BUILD_SHARED_LIBRARY) ", @@ -180,12 +180,12 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/native_modules_with_type_aliases -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libreact_debug libreact_render_debug +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" -LOCAL_CFLAGS += -fexceptions -frtti -std=c++14 -Wall +LOCAL_CFLAGS += -fexceptions -frtti -std=c++17 -Wall include $(BUILD_SHARED_LIBRARY) ", @@ -252,12 +252,12 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/real_module_example -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libreact_debug libreact_render_debug +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" -LOCAL_CFLAGS += -fexceptions -frtti -std=c++14 -Wall +LOCAL_CFLAGS += -fexceptions -frtti -std=c++17 -Wall include $(BUILD_SHARED_LIBRARY) ", @@ -316,12 +316,12 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/simple_native_modules -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libreact_debug libreact_render_debug +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" -LOCAL_CFLAGS += -fexceptions -frtti -std=c++14 -Wall +LOCAL_CFLAGS += -fexceptions -frtti -std=c++17 -Wall include $(BUILD_SHARED_LIBRARY) ", @@ -388,12 +388,12 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/two_modules_different_files -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libreact_debug libreact_render_debug +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" -LOCAL_CFLAGS += -fexceptions -frtti -std=c++14 -Wall +LOCAL_CFLAGS += -fexceptions -frtti -std=c++17 -Wall include $(BUILD_SHARED_LIBRARY) ", From f1aabc51646ac98e29df5a351b900b8799948283 Mon Sep 17 00:00:00 2001 From: Phillip Pan Date: Wed, 20 Oct 2021 15:40:37 -0700 Subject: [PATCH 039/628] remove unnecessary public methods on RCTFabricSurface Summary: Changelog: [Internal] `start` and `stop` are already part of `RCTSurfaceProtocol` which is a public protocol conformance, we don't need to add these to this header, it's just extra work for the compiler Reviewed By: RSNara Differential Revision: D31776005 fbshipit-source-id: d89ad4dbe35e1b67cfa750c6414c40f9b4fc7f24 --- React/Fabric/Surface/RCTFabricSurface.h | 30 ++++++++----------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/React/Fabric/Surface/RCTFabricSurface.h b/React/Fabric/Surface/RCTFabricSurface.h index 637970dce888..24e487108e3d 100644 --- a/React/Fabric/Surface/RCTFabricSurface.h +++ b/React/Fabric/Surface/RCTFabricSurface.h @@ -38,6 +38,15 @@ NS_ASSUME_NONNULL_BEGIN moduleName:(NSString *)moduleName initialProperties:(NSDictionary *)initialProperties; +#pragma mark - Surface presenter + +/** + * EXPERIMENTAL + * Reset's the Surface to it's initial stage. + * It uses the passed in surface presenter, and whatever else was passed in init. + */ +- (void)resetWithSurfacePresenter:(RCTSurfacePresenter *)surfacePresenter; + #pragma mark - Dealing with UIView representation, the Main thread only access /** @@ -54,27 +63,6 @@ NS_ASSUME_NONNULL_BEGIN */ - (RCTSurfaceView *)view; -#pragma mark - Start & Stop - -/** - * Starts or stops the Surface. - * A Surface object can be stopped and then restarted. - * The starting process includes initializing all underlying React Native - * infrastructure and running React app. - * Surface stops itself on deallocation automatically. - * Returns YES in case of success. Returns NO if the Surface is already - * started or stopped. - */ -- (BOOL)start; -- (BOOL)stop; - -/** - * EXPERIMENTAL - * Reset's the Surface to it's initial stage. - * It uses the passed in surface presenter, and whatever else was passed in init. - */ -- (void)resetWithSurfacePresenter:(RCTSurfacePresenter *)surfacePresenter; - #pragma mark - Layout: Setting the size constrains /** From 6acb18ca5ddda26cc3649ae8b589bd9d23b583a1 Mon Sep 17 00:00:00 2001 From: Phillip Pan Date: Wed, 20 Oct 2021 15:40:37 -0700 Subject: [PATCH 040/628] do not return BOOL for start and stop methods Summary: Changelog: [Internal] these are returning bools for some reason even though no one is using the returned value. changing them to return void Reviewed By: RSNara Differential Revision: D31594241 fbshipit-source-id: 04c115b573b74996eaf2fef631eedb12c6734ea8 --- React/Base/Surface/RCTSurface.mm | 6 ++---- React/Base/Surface/RCTSurfaceProtocol.h | 5 ++--- React/Fabric/Surface/RCTFabricSurface.mm | 11 ++++------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/React/Base/Surface/RCTSurface.mm b/React/Base/Surface/RCTSurface.mm index 67c56cb86dc0..82781d05ebe5 100644 --- a/React/Base/Surface/RCTSurface.mm +++ b/React/Base/Surface/RCTSurface.mm @@ -567,18 +567,16 @@ - (void)uiManagerDidPerformMounting:(__unused RCTUIManager *)manager } } -- (BOOL)start +- (void)start { // Does nothing. // The Start&Stop feature is not implemented for regular Surface yet. - return YES; } -- (BOOL)stop +- (void)stop { // Does nothing. // The Start&Stop feature is not implemented for regular Surface yet. - return YES; } #pragma mark - Mounting/Unmounting of React components diff --git a/React/Base/Surface/RCTSurfaceProtocol.h b/React/Base/Surface/RCTSurfaceProtocol.h index c274df73b17d..a645ae9eac25 100644 --- a/React/Base/Surface/RCTSurfaceProtocol.h +++ b/React/Base/Surface/RCTSurfaceProtocol.h @@ -68,13 +68,12 @@ NS_ASSUME_NONNULL_BEGIN @property (atomic, assign, readonly) CGSize intrinsicSize; #pragma mark - Start & Stop - /** * Starts or stops the Surface. * Those methods are a no-op for regular RCTSurface (for now), but all call sites must call them appropriately. */ -- (BOOL)start; -- (BOOL)stop; +- (void)start; +- (void)stop; @end diff --git a/React/Fabric/Surface/RCTFabricSurface.mm b/React/Fabric/Surface/RCTFabricSurface.mm index 12dd5dd4bc86..f3b445347075 100644 --- a/React/Fabric/Surface/RCTFabricSurface.mm +++ b/React/Fabric/Surface/RCTFabricSurface.mm @@ -89,12 +89,12 @@ - (void)dealloc #pragma mark - Life-cycle management -- (BOOL)start +- (void)start { std::lock_guard lock(_surfaceMutex); if (_surfaceHandler->getStatus() != SurfaceHandler::Status::Registered) { - return NO; + return; } // We need to register a root view component here synchronously because right after @@ -108,15 +108,14 @@ - (BOOL)start [self _propagateStageChange]; [_surfacePresenter setupAnimationDriverWithSurfaceHandler:*_surfaceHandler]; - return YES; } -- (BOOL)stop +- (void)stop { std::lock_guard lock(_surfaceMutex); if (_surfaceHandler->getStatus() != SurfaceHandler::Status::Running) { - return NO; + return; } _surfaceHandler->stop(); @@ -126,8 +125,6 @@ - (BOOL)stop [self->_surfacePresenter.mountingManager detachSurfaceFromView:self.view surfaceId:self->_surfaceHandler->getSurfaceId()]; }); - - return YES; } #pragma mark - Immutable Properties (no need to enforce synchronization) From d839b24b06d31b4ce91fb459742831b942972f56 Mon Sep 17 00:00:00 2001 From: Tuomas Jaakola Date: Wed, 20 Oct 2021 17:51:49 -0700 Subject: [PATCH 041/628] Load jsc or hermes lib in static method (#30749) Summary: Many have reported about the misguiding error `Fatal Exception: java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so` even though they don't use Hermes (for example issues https://github.com/facebook/react-native/issues/26075 #25923). **The current code does not handle errors correctly when loading JSC or Hermes in `ReactInstanceManagerBuilder`**. **ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java:** ```java try { return new HermesExecutorFactory(); } catch (UnsatisfiedLinkError hermesE) { // We never get here because "new HermesExecutorFactory()" does not throw an exception! hermesE.printStackTrace(); throw jscE; } ``` In Java, when an exception is thrown in static block, it will be RuntimeException and it can't be caught. For example the exception from `SoLoader.loadLibrary` can't be caught and it will crash the app. **ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java:** ```java static { // Exception from this code block will be RuntimeException and it can't be caught! SoLoader.loadLibrary("hermes"); try { SoLoader.loadLibrary("hermes-executor-debug"); mode_ = "Debug"; } catch (UnsatisfiedLinkError e) { SoLoader.loadLibrary("hermes-executor-release"); mode_ = "Release"; } } ``` This PR fixes the code so that the original exception from failed JSC loading is not swallowed. It does not fix the original issue why JSC loading is failing with some devices, but it can be really helpful to know what the real error is. For example Firebase Crashlytics shows wrong stack trace with current code. I'm sure that this fix could have been written better. It feels wrong to import `JSCExecutor` and `HermesExecutor` in `ReactInstanceManagerBuilder.java`. However, the main point of this PR is to give the idea what is wrong with the current code. ## Changelog [Android] [Fixed] - Fix error handling when loading JSC or Hermes Pull Request resolved: https://github.com/facebook/react-native/pull/30749 Test Plan: * from this PR, modify `ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java` so that JSC loading will fail: ```java // original SoLoader.loadLibrary("jscexecutor"); // changed SoLoader.loadLibrary("jscexecutor-does-not-exist"); ``` * Run `rn-tester` app * Check from Logcat that the app crashed with correct exception and stacktrace. It should **not** be `java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so` Tested with Hermes ``` SoLoader.loadLibrary("hermes-executor-test"); ``` Got this one in logcat ``` 09-24 20:12:39.552 6412 6455 E AndroidRuntime: java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes-executor-test.so ``` Reviewed By: cortinico Differential Revision: D30346032 Pulled By: sota000 fbshipit-source-id: 09b032a9e471af233b7ac90b571c311952ab6342 --- .../hermes/reactexecutor/HermesExecutor.java | 22 ++++++++++++------- .../react/ReactInstanceManagerBuilder.java | 5 ++++- .../react/jscexecutor/JSCExecutor.java | 7 +++++- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java index 7519f2146faf..2081216f3f9d 100644 --- a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java +++ b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java @@ -16,14 +16,20 @@ public class HermesExecutor extends JavaScriptExecutor { private static String mode_; static { - // libhermes must be loaded explicitly to invoke its JNI_OnLoad. - SoLoader.loadLibrary("hermes"); - try { - SoLoader.loadLibrary("hermes-executor-debug"); - mode_ = "Debug"; - } catch (UnsatisfiedLinkError e) { - SoLoader.loadLibrary("hermes-executor-release"); - mode_ = "Release"; + loadLibrary(); + } + + public static void loadLibrary() throws UnsatisfiedLinkError { + if (mode_ == null) { + // libhermes must be loaded explicitly to invoke its JNI_OnLoad. + SoLoader.loadLibrary("hermes"); + try { + SoLoader.loadLibrary("hermes-executor-debug"); + mode_ = "Debug"; + } catch (UnsatisfiedLinkError e) { + SoLoader.loadLibrary("hermes-executor-release"); + mode_ = "Release"; + } } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java index ddfb5507ec4b..672d370cd063 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java @@ -14,6 +14,7 @@ import android.app.Application; import android.content.Context; import androidx.annotation.Nullable; +import com.facebook.hermes.reactexecutor.HermesExecutor; import com.facebook.hermes.reactexecutor.HermesExecutorFactory; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.JSBundleLoader; @@ -28,6 +29,7 @@ import com.facebook.react.devsupport.RedBoxHandler; import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; import com.facebook.react.devsupport.interfaces.DevSupportManager; +import com.facebook.react.jscexecutor.JSCExecutor; import com.facebook.react.jscexecutor.JSCExecutorFactory; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.packagerconnection.RequestHandler; @@ -347,7 +349,7 @@ private JavaScriptExecutorFactory getDefaultJSExecutorFactory( try { // If JSC is included, use it as normal initializeSoLoaderIfNecessary(applicationContext); - SoLoader.loadLibrary("jscexecutor"); + JSCExecutor.loadLibrary(); return new JSCExecutorFactory(appName, deviceName); } catch (UnsatisfiedLinkError jscE) { // https://github.com/facebook/hermes/issues/78 shows that @@ -365,6 +367,7 @@ private JavaScriptExecutorFactory getDefaultJSExecutorFactory( // Otherwise use Hermes try { + HermesExecutor.loadLibrary(); return new HermesExecutorFactory(); } catch (UnsatisfiedLinkError hermesE) { // If we get here, either this is a JSC build, and of course diff --git a/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java b/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java index 09737c178b98..4adb377de813 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java +++ b/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java @@ -14,8 +14,13 @@ import com.facebook.soloader.SoLoader; @DoNotStrip -/* package */ class JSCExecutor extends JavaScriptExecutor { +/* package */ public class JSCExecutor extends JavaScriptExecutor { + static { + loadLibrary(); + } + + public static void loadLibrary() throws UnsatisfiedLinkError { SoLoader.loadLibrary("jscexecutor"); } From 9ac03361e64270218966333ed48e08e896648e35 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Wed, 20 Oct 2021 19:23:56 -0700 Subject: [PATCH 042/628] RN: Add `glob` Flow Definition Summary: Adds the `glob` type definition via `flow-typed` so that the `combine-js-to-schema-cli.js` script does not need a Flow suppression. Changelog: [Internal] Reviewed By: kacieb Differential Revision: D31800809 fbshipit-source-id: 3e01a096d2153639a619a7152bd06332df57f06b --- flow-typed/npm/glob_v7.x.x.js | 79 +++++++++++++++++++ .../cli/combine/combine-js-to-schema-cli.js | 1 - 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 flow-typed/npm/glob_v7.x.x.js diff --git a/flow-typed/npm/glob_v7.x.x.js b/flow-typed/npm/glob_v7.x.x.js new file mode 100644 index 000000000000..4bd3df6cb984 --- /dev/null +++ b/flow-typed/npm/glob_v7.x.x.js @@ -0,0 +1,79 @@ +// flow-typed signature: d2a519d7d007e9ba3e5bf2ac3ff76eca +// flow-typed version: f243e51ed7/glob_v7.x.x/flow_>=v0.104.x + +declare module "glob" { + declare type MinimatchOptions = {| + debug?: boolean, + nobrace?: boolean, + noglobstar?: boolean, + dot?: boolean, + noext?: boolean, + nocase?: boolean, + nonull?: boolean, + matchBase?: boolean, + nocomment?: boolean, + nonegate?: boolean, + flipNegate?: boolean + |}; + + declare type Options = {| + ...MinimatchOptions, + cwd?: string, + root?: string, + nomount?: boolean, + mark?: boolean, + nosort?: boolean, + stat?: boolean, + silent?: boolean, + strict?: boolean, + cache?: { [path: string]: boolean | "DIR" | "FILE" | $ReadOnlyArray, ... }, + statCache?: { [path: string]: boolean | { isDirectory(): boolean, ... } | void, ... }, + symlinks?: { [path: string]: boolean | void, ... }, + realpathCache?: { [path: string]: string, ... }, + sync?: boolean, + nounique?: boolean, + nodir?: boolean, + ignore?: string | $ReadOnlyArray, + follow?: boolean, + realpath?: boolean, + absolute?: boolean + |}; + + /** + * Called when an error occurs, or matches are found + * err + * matches: filenames found matching the pattern + */ + declare type CallBack = (err: ?Error, matches: Array) => void; + + declare class Glob extends events$EventEmitter { + constructor(pattern: string): this; + constructor(pattern: string, callback: CallBack): this; + constructor(pattern: string, options: Options, callback: CallBack): this; + + minimatch: {...}; + options: Options; + aborted: boolean; + cache: { [path: string]: boolean | "DIR" | "FILE" | $ReadOnlyArray, ... }; + statCache: { [path: string]: boolean | { isDirectory(): boolean, ... } | void, ... }; + symlinks: { [path: string]: boolean | void, ... }; + realpathCache: { [path: string]: string, ... }; + found: Array; + + pause(): void; + resume(): void; + abort(): void; + } + + declare class GlobModule { + Glob: Class; + + (pattern: string, callback: CallBack): void; + (pattern: string, options: Options, callback: CallBack): void; + + hasMagic(pattern: string, options?: Options): boolean; + sync(pattern: string, options?: Options): Array; + } + + declare module.exports: GlobModule; +} diff --git a/packages/react-native-codegen/src/cli/combine/combine-js-to-schema-cli.js b/packages/react-native-codegen/src/cli/combine/combine-js-to-schema-cli.js index c01b10f70a34..8f5a19e4cb8a 100644 --- a/packages/react-native-codegen/src/cli/combine/combine-js-to-schema-cli.js +++ b/packages/react-native-codegen/src/cli/combine/combine-js-to-schema-cli.js @@ -13,7 +13,6 @@ const combine = require('./combine-js-to-schema'); const fs = require('fs'); -// $FlowFixMe[untyped-import] glob is untyped const glob = require('glob'); const path = require('path'); From def7dd857d9505b0f7858b042eacc4e588527f8a Mon Sep 17 00:00:00 2001 From: Phillip Pan Date: Wed, 20 Oct 2021 22:16:48 -0700 Subject: [PATCH 043/628] use new instead of alloc init Summary: i saw this a lot in the codebase, it's not optimal bc we're using two selectors when we only need one. fastmod --extensions m,mm '\[\[(.*) alloc] init]' '[${1} new]' --dir xplat/js/react-native-github/* i manually updated the callsites that this codemod couldn't handle (e.g., where there were more than one of these instances in a single line) Changelog: [Internal] Reviewed By: RSNara Differential Revision: D31776561 fbshipit-source-id: 1b16da240e8a79b54da67383d548921b82b05a9f --- Libraries/Image/RCTAnimatedImage.m | 2 +- Libraries/Image/RCTImageCache.m | 4 ++-- Libraries/Image/RCTImageView.mm | 2 +- Libraries/Image/RCTUIImageViewAnimated.m | 2 +- Libraries/Text/TextInput/RCTBaseTextInputView.m | 4 ++-- React/Base/RCTConvert.m | 2 +- React/CoreModules/RCTDevMenu.mm | 2 +- .../RCTPullToRefreshViewComponentView.mm | 2 +- .../ScrollView/RCTScrollViewComponentView.mm | 2 +- .../TextInput/RCTTextInputComponentView.mm | 7 +++---- .../ComponentViews/View/RCTViewComponentView.mm | 2 +- React/Fabric/Mounting/RCTComponentViewFactory.mm | 4 ++-- React/Fabric/Mounting/RCTMountingManager.mm | 2 +- React/Fabric/RCTSurfacePresenter.mm | 4 ++-- React/Tests/Text/RCTParagraphComponentViewTests.mm | 14 +++++++------- React/Views/RCTView.m | 4 ++-- React/Views/RCTViewManager.m | 2 +- .../platform/ios/RCTAttributedTextUtils.mm | 4 ++-- .../RNTesterUnitTests/RCTPerformanceLoggerTests.m | 2 +- 19 files changed, 33 insertions(+), 34 deletions(-) diff --git a/Libraries/Image/RCTAnimatedImage.m b/Libraries/Image/RCTAnimatedImage.m index 85bf09e05d37..4b32c8bb9b82 100644 --- a/Libraries/Image/RCTAnimatedImage.m +++ b/Libraries/Image/RCTAnimatedImage.m @@ -65,7 +65,7 @@ - (BOOL)scanAndCheckFramesValidWithSource:(CGImageSourceRef)imageSource NSMutableArray *frames = [NSMutableArray array]; for (size_t i = 0; i < frameCount; i++) { - RCTGIFCoderFrame *frame = [[RCTGIFCoderFrame alloc] init]; + RCTGIFCoderFrame *frame = [RCTGIFCoderFrame new]; frame.index = i; frame.duration = [self frameDurationAtIndex:i source:imageSource]; [frames addObject:frame]; diff --git a/Libraries/Image/RCTImageCache.m b/Libraries/Image/RCTImageCache.m index e485e806e770..4c7b598d232d 100644 --- a/Libraries/Image/RCTImageCache.m +++ b/Libraries/Image/RCTImageCache.m @@ -39,7 +39,7 @@ - (instancetype)init if (self = [super init]) { _decodedImageCache = [NSCache new]; _decodedImageCache.totalCostLimit = 20 * 1024 * 1024; // 20 MB - _cacheStaleTimes = [[NSMutableDictionary alloc] init]; + _cacheStaleTimes = [NSMutableDictionary new]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearCache) @@ -151,7 +151,7 @@ - (NSDate *)dateWithHeaderString:(NSString *)headerDateString { static NSDateFormatter *formatter; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - formatter = [[NSDateFormatter alloc] init]; + formatter = [NSDateFormatter new]; formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; formatter.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'"; formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; diff --git a/Libraries/Image/RCTImageView.mm b/Libraries/Image/RCTImageView.mm index 42a01adb205c..60a46555378f 100644 --- a/Libraries/Image/RCTImageView.mm +++ b/Libraries/Image/RCTImageView.mm @@ -87,7 +87,7 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge { if ((self = [super initWithFrame:CGRectZero])) { _bridge = bridge; - _imageView = [[RCTUIImageViewAnimated alloc] init]; + _imageView = [RCTUIImageViewAnimated new]; _imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self addSubview:_imageView]; diff --git a/Libraries/Image/RCTUIImageViewAnimated.m b/Libraries/Image/RCTUIImageViewAnimated.m index 4ab99406a3c6..b10db4da68e1 100644 --- a/Libraries/Image/RCTUIImageViewAnimated.m +++ b/Libraries/Image/RCTUIImageViewAnimated.m @@ -130,7 +130,7 @@ - (void)setImage:(UIImage *)image - (NSOperationQueue *)fetchQueue { if (!_fetchQueue) { - _fetchQueue = [[NSOperationQueue alloc] init]; + _fetchQueue = [NSOperationQueue new]; _fetchQueue.maxConcurrentOperationCount = 1; } return _fetchQueue; diff --git a/Libraries/Text/TextInput/RCTBaseTextInputView.m b/Libraries/Text/TextInput/RCTBaseTextInputView.m index d75f140c9d21..865a03488d99 100644 --- a/Libraries/Text/TextInput/RCTBaseTextInputView.m +++ b/Libraries/Text/TextInput/RCTBaseTextInputView.m @@ -300,7 +300,7 @@ - (void)setShowSoftInputOnFocus:(BOOL)showSoftInputOnFocus self.backedTextInputView.inputView = nil; } else { // Hides keyboard, but keeps blinking cursor. - self.backedTextInputView.inputView = [[UIView alloc] init]; + self.backedTextInputView.inputView = [UIView new]; } } @@ -607,7 +607,7 @@ - (void)setDefaultInputAccessoryView _hasInputAccesoryView = shouldHaveInputAccesoryView; if (shouldHaveInputAccesoryView) { - UIToolbar *toolbarView = [[UIToolbar alloc] init]; + UIToolbar *toolbarView = [UIToolbar new]; [toolbarView sizeToFit]; UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace diff --git a/React/Base/RCTConvert.m b/React/Base/RCTConvert.m index 4b59899560bc..742821576322 100644 --- a/React/Base/RCTConvert.m +++ b/React/Base/RCTConvert.m @@ -811,7 +811,7 @@ +(type)type : (id)json \ */ static NSString *RCTSemanticColorNames() { - NSMutableString *names = [[NSMutableString alloc] init]; + NSMutableString *names = [NSMutableString new]; NSDictionary *colorMap = RCTSemanticColorsMap(); NSArray *allKeys = [[[colorMap allKeys] mutableCopy] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; diff --git a/React/CoreModules/RCTDevMenu.mm b/React/CoreModules/RCTDevMenu.mm index 881c3f2eac19..d956be8926bd 100644 --- a/React/CoreModules/RCTDevMenu.mm +++ b/React/CoreModules/RCTDevMenu.mm @@ -350,7 +350,7 @@ - (void)setDefaultJSBundle [weakSelf setDefaultJSBundle]; return; } - NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + NSNumberFormatter *formatter = [NSNumberFormatter new]; formatter.numberStyle = NSNumberFormatterDecimalStyle; NSNumber *portNumber = [formatter numberFromString:portTextField.text]; diff --git a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.mm index 6d89e699307d..da4fd4d2c272 100644 --- a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.mm @@ -39,7 +39,7 @@ - (instancetype)initWithFrame:(CGRect)frame static auto const defaultProps = std::make_shared(); _props = defaultProps; - _refreshControl = [[UIRefreshControl alloc] init]; + _refreshControl = [UIRefreshControl new]; [_refreshControl addTarget:self action:@selector(handleUIControlEventValueChanged) forControlEvents:UIControlEventValueChanged]; diff --git a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm index 082933ad6a6f..d1d8cc3f2ae2 100644 --- a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm @@ -105,7 +105,7 @@ - (instancetype)initWithFrame:(CGRect)frame static const auto defaultProps = std::make_shared(); _props = defaultProps; - _childComponentViews = [[NSMutableArray alloc] init]; + _childComponentViews = [NSMutableArray new]; _scrollView = [[RCTEnhancedScrollView alloc] initWithFrame:self.bounds]; _scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; diff --git a/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm b/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm index 8fe5537da5c3..bbe622eebfc1 100644 --- a/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm @@ -67,7 +67,7 @@ - (instancetype)initWithFrame:(CGRect)frame _props = defaultProps; auto &props = *defaultProps; - _backedTextInputView = props.traits.multiline ? [[RCTUITextView alloc] init] : [[RCTUITextField alloc] init]; + _backedTextInputView = props.traits.multiline ? [RCTUITextView new] : [RCTUITextField new]; _backedTextInputView.textInputDelegate = self; _ignoreNextTextInputCall = NO; _comingFromJS = NO; @@ -465,7 +465,7 @@ - (void)setDefaultInputAccessoryView } if (shouldHaveInputAccesoryView) { - UIToolbar *toolbarView = [[UIToolbar alloc] init]; + UIToolbar *toolbarView = [UIToolbar new]; [toolbarView sizeToFit]; UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; @@ -565,8 +565,7 @@ - (void)_setAttributedString:(NSAttributedString *)attributedString - (void)_setMultiline:(BOOL)multiline { [_backedTextInputView removeFromSuperview]; - UIView *backedTextInputView = - multiline ? [[RCTUITextView alloc] init] : [[RCTUITextField alloc] init]; + UIView *backedTextInputView = multiline ? [RCTUITextView new] : [RCTUITextField new]; backedTextInputView.frame = _backedTextInputView.frame; RCTCopyBackedTextInput(_backedTextInputView, backedTextInputView); _backedTextInputView = backedTextInputView; diff --git a/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm index 2b9d5381adb0..4c447bd4df8b 100644 --- a/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -578,7 +578,7 @@ - (void)invalidateLayer layer.backgroundColor = _backgroundColor.CGColor; } else { if (!_borderLayer) { - _borderLayer = [[CALayer alloc] init]; + _borderLayer = [CALayer new]; _borderLayer.zPosition = -1024.0f; _borderLayer.frame = layer.bounds; _borderLayer.magnificationFilter = kCAFilterNearest; diff --git a/React/Fabric/Mounting/RCTComponentViewFactory.mm b/React/Fabric/Mounting/RCTComponentViewFactory.mm index eef565f17dc8..e559426a9aaa 100644 --- a/React/Fabric/Mounting/RCTComponentViewFactory.mm +++ b/React/Fabric/Mounting/RCTComponentViewFactory.mm @@ -68,7 +68,7 @@ + (RCTComponentViewFactory *)currentComponentViewFactory static RCTComponentViewFactory *componentViewFactory; dispatch_once(&onceToken, ^{ - componentViewFactory = [[RCTComponentViewFactory alloc] init]; + componentViewFactory = [RCTComponentViewFactory new]; [componentViewFactory registerComponentViewClass:[RCTRootComponentView class]]; [componentViewFactory registerComponentViewClass:[RCTViewComponentView class]]; [componentViewFactory registerComponentViewClass:[RCTParagraphComponentView class]]; @@ -183,7 +183,7 @@ - (RCTComponentViewDescriptor)createComponentViewWithComponentHandle:(facebook:: Class viewClass = componentViewClassDescriptor.viewClass; return RCTComponentViewDescriptor{ - .view = [[viewClass alloc] init], + .view = [viewClass new], .observesMountingTransactionWillMount = componentViewClassDescriptor.observesMountingTransactionWillMount, .observesMountingTransactionDidMount = componentViewClassDescriptor.observesMountingTransactionDidMount, }; diff --git a/React/Fabric/Mounting/RCTMountingManager.mm b/React/Fabric/Mounting/RCTMountingManager.mm index f09ae72ce41a..3d1b81a3ff3a 100644 --- a/React/Fabric/Mounting/RCTMountingManager.mm +++ b/React/Fabric/Mounting/RCTMountingManager.mm @@ -155,7 +155,7 @@ @implementation RCTMountingManager { - (instancetype)init { if (self = [super init]) { - _componentViewRegistry = [[RCTComponentViewRegistry alloc] init]; + _componentViewRegistry = [RCTComponentViewRegistry new]; } return self; diff --git a/React/Fabric/RCTSurfacePresenter.mm b/React/Fabric/RCTSurfacePresenter.mm index 57b6889bc202..445f7f464f2c 100644 --- a/React/Fabric/RCTSurfacePresenter.mm +++ b/React/Fabric/RCTSurfacePresenter.mm @@ -91,8 +91,8 @@ - (instancetype)initWithContextContainer:(ContextContainer::Shared)contextContai _runtimeExecutor = runtimeExecutor; _contextContainer = contextContainer; - _surfaceRegistry = [[RCTSurfaceRegistry alloc] init]; - _mountingManager = [[RCTMountingManager alloc] init]; + _surfaceRegistry = [RCTSurfaceRegistry new]; + _mountingManager = [RCTMountingManager new]; _mountingManager.contextContainer = contextContainer; _mountingManager.delegate = self; diff --git a/React/Tests/Text/RCTParagraphComponentViewTests.mm b/React/Tests/Text/RCTParagraphComponentViewTests.mm index e847ef76f2f4..0b8004edf0b4 100644 --- a/React/Tests/Text/RCTParagraphComponentViewTests.mm +++ b/React/Tests/Text/RCTParagraphComponentViewTests.mm @@ -322,17 +322,17 @@ - (void)setUp - (void)testAttributedString { ParagraphShadowNode::ConcreteState::Shared _stateA = stateWithShadowNode(ParagrahShadowNodeA_); - RCTParagraphComponentView *paragraphComponentViewA = [[RCTParagraphComponentView alloc] init]; + RCTParagraphComponentView *paragraphComponentViewA = [RCTParagraphComponentView new]; [paragraphComponentViewA updateProps:ParagrahShadowNodeA_->getProps() oldProps:nullptr]; [paragraphComponentViewA updateState:_stateA oldState:nil]; ParagraphShadowNode::ConcreteState::Shared _stateB = stateWithShadowNode(ParagrahShadowNodeB_); - RCTParagraphComponentView *paragraphComponentViewB = [[RCTParagraphComponentView alloc] init]; + RCTParagraphComponentView *paragraphComponentViewB = [RCTParagraphComponentView new]; [paragraphComponentViewB updateProps:ParagrahShadowNodeB_->getProps() oldProps:nullptr]; [paragraphComponentViewB updateState:_stateB oldState:nil]; ParagraphShadowNode::ConcreteState::Shared _stateC = stateWithShadowNode(ParagrahShadowNodeC_); - RCTParagraphComponentView *paragraphComponentViewC = [[RCTParagraphComponentView alloc] init]; + RCTParagraphComponentView *paragraphComponentViewC = [RCTParagraphComponentView new]; [paragraphComponentViewC updateProps:ParagrahShadowNodeC_->getProps() oldProps:nullptr]; [paragraphComponentViewC updateState:_stateC oldState:nil]; @@ -358,7 +358,7 @@ - (void)testAccessibilityMultipleLinks { // initialize the paragraphComponentView to get the accessibilityElements ParagraphShadowNode::ConcreteState::Shared _state = stateWithShadowNode(ParagrahShadowNodeA_); - RCTParagraphComponentView *paragraphComponentView = [[RCTParagraphComponentView alloc] init]; + RCTParagraphComponentView *paragraphComponentView = [RCTParagraphComponentView new]; [paragraphComponentView updateProps:ParagrahShadowNodeA_->getProps() oldProps:nullptr]; [paragraphComponentView updateState:_state oldState:nil]; @@ -379,7 +379,7 @@ - (void)testAccessibilityMultipleLinks - (void)testAccessibilityLinkWrappingMultipleLines { ParagraphShadowNode::ConcreteState::Shared _state = stateWithShadowNode(ParagrahShadowNodeB_); - RCTParagraphComponentView *paragraphComponentView = [[RCTParagraphComponentView alloc] init]; + RCTParagraphComponentView *paragraphComponentView = [RCTParagraphComponentView new]; [paragraphComponentView updateProps:ParagrahShadowNodeB_->getProps() oldProps:nullptr]; [paragraphComponentView updateState:_state oldState:nil]; @@ -393,7 +393,7 @@ - (void)testAccessibilityLinkWrappingMultipleLines - (void)testAccessibilityTruncatedText { ParagraphShadowNode::ConcreteState::Shared _state = stateWithShadowNode(ParagrahShadowNodeC_); - RCTParagraphComponentView *paragraphComponentView = [[RCTParagraphComponentView alloc] init]; + RCTParagraphComponentView *paragraphComponentView = [RCTParagraphComponentView new]; [paragraphComponentView updateProps:ParagrahShadowNodeC_->getProps() oldProps:nullptr]; [paragraphComponentView updateState:_state oldState:nil]; @@ -458,7 +458,7 @@ - (void)testEntireParagraphLink rootShadowNode->layoutIfNeeded(); ParagraphShadowNode::ConcreteState::Shared _state = stateWithShadowNode(paragrahShadowNode); - RCTParagraphComponentView *paragraphComponentView = [[RCTParagraphComponentView alloc] init]; + RCTParagraphComponentView *paragraphComponentView = [RCTParagraphComponentView new]; [paragraphComponentView updateProps:paragrahShadowNode->getProps() oldProps:nullptr]; [paragraphComponentView updateState:_state oldState:nil]; diff --git a/React/Views/RCTView.m b/React/Views/RCTView.m index e2cdef652ad0..c8faede07245 100644 --- a/React/Views/RCTView.m +++ b/React/Views/RCTView.m @@ -232,8 +232,8 @@ - (NSString *)accessibilityLabel return nil; } - accessibilityActionsNameMap = [[NSMutableDictionary alloc] init]; - accessibilityActionsLabelMap = [[NSMutableDictionary alloc] init]; + accessibilityActionsNameMap = [NSMutableDictionary new]; + accessibilityActionsLabelMap = [NSMutableDictionary new]; NSMutableArray *actions = [NSMutableArray array]; for (NSDictionary *action in self.accessibilityActions) { if (action[@"name"]) { diff --git a/React/Views/RCTViewManager.m b/React/Views/RCTViewManager.m index 72e195c556b9..bee8798edf87 100644 --- a/React/Views/RCTViewManager.m +++ b/React/Views/RCTViewManager.m @@ -189,7 +189,7 @@ - (RCTShadowView *)shadowView RCT_CUSTOM_VIEW_PROPERTY(accessibilityState, NSDictionary, RCTView) { NSDictionary *state = json ? [RCTConvert NSDictionary:json] : nil; - NSMutableDictionary *newState = [[NSMutableDictionary alloc] init]; + NSMutableDictionary *newState = [NSMutableDictionary new]; if (!state) { return; diff --git a/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm b/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm index 11ef92858ec0..c92dee1a17d5 100644 --- a/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm +++ b/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm @@ -310,10 +310,10 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex static UIImage *placeholderImage; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - placeholderImage = [[UIImage alloc] init]; + placeholderImage = [UIImage new]; }); - NSMutableAttributedString *nsAttributedString = [[NSMutableAttributedString alloc] init]; + NSMutableAttributedString *nsAttributedString = [NSMutableAttributedString new]; [nsAttributedString beginEditing]; diff --git a/packages/rn-tester/RNTesterUnitTests/RCTPerformanceLoggerTests.m b/packages/rn-tester/RNTesterUnitTests/RCTPerformanceLoggerTests.m index 44b492e40a95..a0a524e6ca41 100644 --- a/packages/rn-tester/RNTesterUnitTests/RCTPerformanceLoggerTests.m +++ b/packages/rn-tester/RNTesterUnitTests/RCTPerformanceLoggerTests.m @@ -17,7 +17,7 @@ @implementation RCTPerformanceLoggerTests - (void)testLabelCountInSyncWithRCTPLTag { - RCTPerformanceLogger *logger = [[RCTPerformanceLogger alloc] init]; + RCTPerformanceLogger *logger = [RCTPerformanceLogger new]; XCTAssertEqual([logger labelsForTags].count, RCTPLSize); } From e007c8a9de93804d803d36e1a213a8b59acc4108 Mon Sep 17 00:00:00 2001 From: CodemodService FBSourceGoogleJavaFormatLinterBot <> Date: Thu, 21 Oct 2021 03:33:14 -0700 Subject: [PATCH 044/628] Daily `arc lint --take GOOGLEJAVAFORMAT` Reviewed By: zertosh Differential Revision: D31824304 fbshipit-source-id: 146d9ca721773af1200ca01876387bcb44f95a40 --- .../java/com/facebook/react/ReactInstanceManagerBuilder.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java index 672d370cd063..55af8c4ce899 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java @@ -34,7 +34,6 @@ import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.packagerconnection.RequestHandler; import com.facebook.react.uimanager.UIImplementationProvider; -import com.facebook.soloader.SoLoader; import java.util.ArrayList; import java.util.List; import java.util.Map; From 03e513de41bf60f071eacbbb9604c83605abf625 Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Thu, 21 Oct 2021 03:42:03 -0700 Subject: [PATCH 045/628] Add emitting view to onChildStartedNativeGesture callback Summary: Changelog: [Android][Changed] RootView's onChildStartedNativeGesture now takes the child view as its first argument Reviewed By: philIip Differential Revision: D31399515 fbshipit-source-id: b9438f6118e604a04799ef67d0b46303a06d6434 --- .../src/main/java/com/facebook/react/ReactRootView.java | 9 +++++++-- .../main/java/com/facebook/react/uimanager/RootView.java | 6 +++++- .../react/uimanager/events/NativeGestureUtil.java | 2 +- .../facebook/react/views/modal/ReactModalHostView.java | 9 +++++++-- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index 5bfdf9aafd83..e92289a5f1d4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -184,7 +184,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } @Override - public void onChildStartedNativeGesture(MotionEvent androidEvent) { + public void onChildStartedNativeGesture(MotionEvent ev) { if (mReactInstanceManager == null || !mIsAttachedToInstance || mReactInstanceManager.getCurrentReactContext() == null) { @@ -200,10 +200,15 @@ public void onChildStartedNativeGesture(MotionEvent androidEvent) { if (uiManager != null) { EventDispatcher eventDispatcher = uiManager.getEventDispatcher(); - mJSTouchDispatcher.onChildStartedNativeGesture(androidEvent, eventDispatcher); + mJSTouchDispatcher.onChildStartedNativeGesture(ev, eventDispatcher); } } + @Override + public void onChildStartedNativeGesture(View childView, MotionEvent ev) { + onChildStartedNativeGesture(ev); + } + @Override public boolean onInterceptTouchEvent(MotionEvent ev) { dispatchJSTouchEvent(ev); diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootView.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootView.java index 94eef5e1ceb1..6188a241962b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootView.java @@ -8,6 +8,7 @@ package com.facebook.react.uimanager; import android.view.MotionEvent; +import android.view.View; /** Interface for the root native view of a React native application. */ public interface RootView { @@ -16,7 +17,10 @@ public interface RootView { * Called when a child starts a native gesture (e.g. a scroll in a ScrollView). Should be called * from the child's onTouchIntercepted implementation. */ - void onChildStartedNativeGesture(MotionEvent androidEvent); + void onChildStartedNativeGesture(View childView, MotionEvent ev); + + /** @deprecated */ + void onChildStartedNativeGesture(MotionEvent ev); void handleException(Throwable t); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/NativeGestureUtil.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/NativeGestureUtil.java index 7323a48ed427..7b79013960bc 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/NativeGestureUtil.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/NativeGestureUtil.java @@ -23,6 +23,6 @@ public class NativeGestureUtil { * @param event the MotionEvent that caused the gesture to be started */ public static void notifyNativeGestureStarted(View view, MotionEvent event) { - RootViewUtil.getRootView(view).onChildStartedNativeGesture(event); + RootViewUtil.getRootView(view).onChildStartedNativeGesture(view, event); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java b/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java index 561b96d13bae..7d272250bd1d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java @@ -528,8 +528,13 @@ public boolean onTouchEvent(MotionEvent event) { } @Override - public void onChildStartedNativeGesture(MotionEvent androidEvent) { - mJSTouchDispatcher.onChildStartedNativeGesture(androidEvent, mEventDispatcher); + public void onChildStartedNativeGesture(MotionEvent ev) { + mJSTouchDispatcher.onChildStartedNativeGesture(ev, mEventDispatcher); + } + + @Override + public void onChildStartedNativeGesture(View childView, MotionEvent ev) { + mJSTouchDispatcher.onChildStartedNativeGesture(ev, mEventDispatcher); } @Override From 8de8d475d4a2b765af6a689d7fc1a1a67132f6fc Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Thu, 21 Oct 2021 03:42:03 -0700 Subject: [PATCH 046/628] Add surfaceId helper to Event baseclass Summary: Colocate the surface ID generate with the code that consumes it. This allows us to re-use this method in other event emitter locations. Changelog: [Android][Changed] Add helper to get surfaceId for event dispatching Reviewed By: philIip Differential Revision: D31651881 fbshipit-source-id: 109e189f90261d3ba0077ffa519c3d12a9111439 --- .../react/uimanager/JSTouchDispatcher.java | 33 ++++--------------- .../react/uimanager/events/Event.java | 20 +++++++++++ 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSTouchDispatcher.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSTouchDispatcher.java index 901961494ccb..d494c6a0aefe 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSTouchDispatcher.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSTouchDispatcher.java @@ -12,7 +12,7 @@ import com.facebook.common.logging.FLog; import com.facebook.infer.annotation.Assertions; import com.facebook.react.common.ReactConstants; -import com.facebook.react.uimanager.common.UIManagerType; +import com.facebook.react.uimanager.events.Event; import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.react.uimanager.events.TouchEvent; import com.facebook.react.uimanager.events.TouchEventCoalescingKeyHelper; @@ -51,25 +51,6 @@ public void onChildStartedNativeGesture( mTargetTag = -1; } - /** - * See Event.java. By contract, this surfaceId should be a valid SurfaceId in Fabric, and should - * ALWAYS return -1 in non-Fabric. - * - * @return - */ - private int getSurfaceId() { - if (mRootViewGroup != null - && mRootViewGroup instanceof ReactRoot - && ((ReactRoot) mRootViewGroup).getUIManagerType() == UIManagerType.FABRIC) { - if (mRootViewGroup.getContext() instanceof ThemedReactContext) { - ThemedReactContext context = (ThemedReactContext) mRootViewGroup.getContext(); - return context.getSurfaceId(); - } - return ((ReactRoot) mRootViewGroup).getRootViewTag(); - } - return -1; - } - /** * Main catalyst view is responsible for collecting and sending touch events to JS. This method * reacts for an incoming android native touch events ({@link MotionEvent}) and calls into {@link @@ -94,7 +75,7 @@ public void handleTouchEvent(MotionEvent ev, EventDispatcher eventDispatcher) { mTargetTag = findTargetTagAndSetCoordinates(ev); eventDispatcher.dispatchEvent( TouchEvent.obtain( - getSurfaceId(), + Event.getSurfaceIdForView(mRootViewGroup), mTargetTag, TouchEventType.START, ev, @@ -119,7 +100,7 @@ public void handleTouchEvent(MotionEvent ev, EventDispatcher eventDispatcher) { findTargetTagAndSetCoordinates(ev); eventDispatcher.dispatchEvent( TouchEvent.obtain( - getSurfaceId(), + Event.getSurfaceIdForView(mRootViewGroup), mTargetTag, TouchEventType.END, ev, @@ -134,7 +115,7 @@ public void handleTouchEvent(MotionEvent ev, EventDispatcher eventDispatcher) { findTargetTagAndSetCoordinates(ev); eventDispatcher.dispatchEvent( TouchEvent.obtain( - getSurfaceId(), + Event.getSurfaceIdForView(mRootViewGroup), mTargetTag, TouchEventType.MOVE, ev, @@ -146,7 +127,7 @@ public void handleTouchEvent(MotionEvent ev, EventDispatcher eventDispatcher) { // New pointer goes down, this can only happen after ACTION_DOWN is sent for the first pointer eventDispatcher.dispatchEvent( TouchEvent.obtain( - getSurfaceId(), + Event.getSurfaceIdForView(mRootViewGroup), mTargetTag, TouchEventType.START, ev, @@ -158,7 +139,7 @@ public void handleTouchEvent(MotionEvent ev, EventDispatcher eventDispatcher) { // Exactly one of the pointers goes up eventDispatcher.dispatchEvent( TouchEvent.obtain( - getSurfaceId(), + Event.getSurfaceIdForView(mRootViewGroup), mTargetTag, TouchEventType.END, ev, @@ -207,7 +188,7 @@ private void dispatchCancelEvent(MotionEvent androidEvent, EventDispatcher event Assertions.assertNotNull(eventDispatcher) .dispatchEvent( TouchEvent.obtain( - getSurfaceId(), + Event.getSurfaceIdForView(mRootViewGroup), mTargetTag, TouchEventType.CANCEL, androidEvent, diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/Event.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/Event.java index b205bdeb3c76..bf7b9a4150ec 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/Event.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/Event.java @@ -7,10 +7,13 @@ package com.facebook.react.uimanager.events; +import android.view.View; import androidx.annotation.Nullable; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.SystemClock; import com.facebook.react.uimanager.IllegalViewOperationException; +import com.facebook.react.uimanager.ReactRoot; +import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.common.UIManagerType; /** @@ -40,6 +43,23 @@ public abstract class Event { private long mTimestampMs; private int mUniqueID = sUniqueID++; + /** + * This surfaceId should be a valid SurfaceId in Fabric, and should ALWAYS return -1 in + * non-Fabric. + */ + public static int getSurfaceIdForView(@Nullable View view) { + if (view != null + && view instanceof ReactRoot + && ((ReactRoot) view).getUIManagerType() == UIManagerType.FABRIC) { + if (view.getContext() instanceof ThemedReactContext) { + ThemedReactContext context = (ThemedReactContext) view.getContext(); + return context.getSurfaceId(); + } + return ((ReactRoot) view).getRootViewTag(); + } + return -1; + } + protected Event() {} @Deprecated From eccbf9b5cb206f83f98a7f5721f3e5728d4390d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Thu, 21 Oct 2021 04:27:22 -0700 Subject: [PATCH 047/628] Back out "Re-apply: [RN] Make runtime initialization from React renderers a no-op" Summary: Changelog: [internal] This change had to be reverted because it caused some issues internally at Facebook. After we solved those we re-applied the changes but this also has issues in OSS apps. Specifically, the option in Metro to inject modules to execute before the EntryPoint (in this case `InitializeCore`) doesn't work if those modules aren't part of the bundle in the first place. This reverts again so we can think about a long-term solution for this. Original commit changeset: ba145a30ead5 Reviewed By: ShikaSD Differential Revision: D31825736 fbshipit-source-id: 393b3d5d2a726951a9ac386dc2b1c19ef4a916a5 --- .../ReactPrivate/ReactNativePrivateInitializeCore.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/Libraries/ReactPrivate/ReactNativePrivateInitializeCore.js b/Libraries/ReactPrivate/ReactNativePrivateInitializeCore.js index 975e17353797..e34e6271f2f7 100644 --- a/Libraries/ReactPrivate/ReactNativePrivateInitializeCore.js +++ b/Libraries/ReactPrivate/ReactNativePrivateInitializeCore.js @@ -8,13 +8,4 @@ * @flow strict-local */ -// TODO: Remove this module when the import is removed from the React renderers. - -// This module is used by React to initialize the React Native runtime, -// but it is now a no-op. - -// This is redundant because all React Native apps are already executing -// `InitializeCore` before the entrypoint of the JS bundle -// (see https://github.com/react-native-community/cli/blob/e1da64317a1178c2b262d82c2f14210cdfa3ebe1/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts#L93) -// and importing it unconditionally from React only prevents users from -// customizing what they want to include in their apps (re: app size). +import '../Core/InitializeCore'; From 7b77cc637e1faf4a2b134853f8415f277d0decdc Mon Sep 17 00:00:00 2001 From: Xin Chen Date: Thu, 21 Oct 2021 13:24:21 -0700 Subject: [PATCH 048/628] Change Vertical ScrollView to take Context instead of ReactContext Summary: The `ReactScrollView.java` constructor is using `ReactContext` instead of `Context`, which is inconsistent to the horizontal scroll view. This is the result from D3863966 (https://github.com/facebook/react-native/commit/2cf2fdbc04bc5309f6942ed464ad61cd06a26ce8) when an OSS issue needs to be addressed. That issue and all call sites to use the `ReactContext` are deprecated now. Revert this back to use `Context` to be less restrictive. Changelog: [Android][Fixed] - Revert `ReactScrollView` to use `Context` instead of `ReactContext` in the constructor to be less restrictive. Reviewed By: javache Differential Revision: D31819799 fbshipit-source-id: 3f00d64850aebd2e20615033b2e1f1c721fed37e --- .../com/facebook/react/views/scroll/ReactScrollView.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java index 54643e6e2da4..3b2265aa186e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java @@ -17,6 +17,7 @@ import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; +import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Rect; @@ -34,7 +35,6 @@ import com.facebook.common.logging.FLog; import com.facebook.infer.annotation.Assertions; import com.facebook.react.R; -import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableNativeMap; import com.facebook.react.common.ReactConstants; @@ -114,11 +114,11 @@ public class ReactScrollView extends ScrollView private int mLastStateUpdateScrollX = -1; private int mLastStateUpdateScrollY = -1; - public ReactScrollView(ReactContext context) { + public ReactScrollView(Context context) { this(context, null); } - public ReactScrollView(ReactContext context, @Nullable FpsListener fpsListener) { + public ReactScrollView(Context context, @Nullable FpsListener fpsListener) { super(context); mFpsListener = fpsListener; mReactBackgroundManager = new ReactViewBackgroundManager(this); From 70dcba99946a43b13776f33f3b9432c5d66055c1 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Thu, 21 Oct 2021 14:24:16 -0700 Subject: [PATCH 049/628] JS: Remove Unused Flow Suppressions Summary: Cleans up all unused Flow suppressions. Changelog: [Internal] Reviewed By: kacieb Differential Revision: D31754978 fbshipit-source-id: 951e28a245782b9bc9e93a6417d88b19ba0c8f1c --- Libraries/Components/Touchable/Touchable.js | 14 -------------- .../DeprecatedTextInputPropTypes.js | 1 - Libraries/Image/Image.ios.js | 5 ----- Libraries/Lists/VirtualizedList.js | 1 - Libraries/Storage/AsyncStorage.js | 1 - Libraries/Text/TextNativeComponent.js | 2 -- Libraries/Utilities/ReactNativeTestTools.js | 3 --- .../js/examples/Animated/EasingExample.js | 8 -------- .../examples/PanResponder/PanResponderExample.js | 1 - .../examples/PointerEvents/PointerEventsExample.js | 4 ---- packages/rn-tester/js/examples/RTL/RTLExample.js | 4 ---- .../examples/TextInput/TextInputSharedExamples.js | 2 -- .../rn-tester/js/utils/RNTesterStatePersister.js | 6 +----- 13 files changed, 1 insertion(+), 51 deletions(-) diff --git a/Libraries/Components/Touchable/Touchable.js b/Libraries/Components/Touchable/Touchable.js index 6622645cab6b..f59ba3ad4954 100644 --- a/Libraries/Components/Touchable/Touchable.js +++ b/Libraries/Components/Touchable/Touchable.js @@ -418,7 +418,6 @@ const TouchableMixin = { * @param {SyntheticEvent} e Synthetic event from event system. * */ - // $FlowFixMe[signature-verification-failure] touchableHandleResponderGrant: function(e: PressEvent) { const dispatchID = e.currentTarget; // Since e is used in a callback invoked on another event loop @@ -460,7 +459,6 @@ const TouchableMixin = { /** * Place as callback for a DOM element's `onResponderRelease` event. */ - // $FlowFixMe[signature-verification-failure] touchableHandleResponderRelease: function(e: PressEvent) { this.pressInLocation = null; this._receiveSignal(Signals.RESPONDER_RELEASE, e); @@ -469,7 +467,6 @@ const TouchableMixin = { /** * Place as callback for a DOM element's `onResponderTerminate` event. */ - // $FlowFixMe[signature-verification-failure] touchableHandleResponderTerminate: function(e: PressEvent) { this.pressInLocation = null; this._receiveSignal(Signals.RESPONDER_TERMINATED, e); @@ -478,7 +475,6 @@ const TouchableMixin = { /** * Place as callback for a DOM element's `onResponderMove` event. */ - // $FlowFixMe[signature-verification-failure] touchableHandleResponderMove: function(e: PressEvent) { // Measurement may not have returned yet. if (!this.state.touchable.positionOnActivate) { @@ -564,7 +560,6 @@ const TouchableMixin = { * element that was blurred just prior to this. This can be overridden when * using `Touchable.Mixin.withoutDefaultFocusAndBlur`. */ - // $FlowFixMe[signature-verification-failure] touchableHandleFocus: function(e: Event) { this.props.onFocus && this.props.onFocus(e); }, @@ -577,7 +572,6 @@ const TouchableMixin = { * This can be overridden when using * `Touchable.Mixin.withoutDefaultFocusAndBlur`. */ - // $FlowFixMe[signature-verification-failure] touchableHandleBlur: function(e: Event) { this.props.onBlur && this.props.onBlur(e); }, @@ -671,7 +665,6 @@ const TouchableMixin = { } }, - // $FlowFixMe[signature-verification-failure] _handleQueryLayout: function( l: number, t: number, @@ -698,13 +691,11 @@ const TouchableMixin = { ); }, - // $FlowFixMe[signature-verification-failure] _handleDelay: function(e: PressEvent) { this.touchableDelayTimeout = null; this._receiveSignal(Signals.DELAY, e); }, - // $FlowFixMe[signature-verification-failure] _handleLongDelay: function(e: PressEvent) { this.longPressDelayTimeout = null; const curState = this.state.touchable.touchState; @@ -724,7 +715,6 @@ const TouchableMixin = { * @throws Error if invalid state transition or unrecognized signal. * @sideeffects */ - // $FlowFixMe[signature-verification-failure] _receiveSignal: function(signal: Signal, e: PressEvent) { const responderID = this.state.touchable.responderID; const curState = this.state.touchable.touchState; @@ -776,7 +766,6 @@ const TouchableMixin = { ); }, - // $FlowFixMe[signature-verification-failure] _savePressInLocation: function(e: PressEvent) { const touch = extractSingleTouch(e.nativeEvent); const pageX = touch && touch.pageX; @@ -808,7 +797,6 @@ const TouchableMixin = { * @param {Event} e Native event. * @sideeffects */ - // $FlowFixMe[signature-verification-failure] _performSideEffectsForTransition: function( curState: State, nextState: State, @@ -870,13 +858,11 @@ const TouchableMixin = { this.touchableDelayTimeout = null; }, - // $FlowFixMe[signature-verification-failure] _startHighlight: function(e: PressEvent) { this._savePressInLocation(e); this.touchableHandleActivePressIn && this.touchableHandleActivePressIn(e); }, - // $FlowFixMe[signature-verification-failure] _endHighlight: function(e: PressEvent) { if (this.touchableHandleActivePressOut) { if ( diff --git a/Libraries/DeprecatedPropTypes/DeprecatedTextInputPropTypes.js b/Libraries/DeprecatedPropTypes/DeprecatedTextInputPropTypes.js index 937e1c7a73e7..7eb73f751d85 100644 --- a/Libraries/DeprecatedPropTypes/DeprecatedTextInputPropTypes.js +++ b/Libraries/DeprecatedPropTypes/DeprecatedTextInputPropTypes.js @@ -466,7 +466,6 @@ module.exports = { * * [Styles](docs/style.html) */ - // $FlowFixMe[incompatible-use] style: DeprecatedTextPropTypes.style, /** * The color of the `TextInput` underline. diff --git a/Libraries/Image/Image.ios.js b/Libraries/Image/Image.ios.js index 3dab5cc8c1f7..4ed07a785f10 100644 --- a/Libraries/Image/Image.ios.js +++ b/Libraries/Image/Image.ios.js @@ -126,11 +126,7 @@ let Image = (props: ImagePropsType, forwardedRef) => { } } - // $FlowFixMe[incompatible-use] - // $FlowFixMe[incompatible-type] const resizeMode = props.resizeMode || style.resizeMode || 'cover'; - // $FlowFixMe[prop-missing] - // $FlowFixMe[incompatible-use] const tintColor = style.tintColor; if (props.src != null) { @@ -153,7 +149,6 @@ let Image = (props: ImagePropsType, forwardedRef) => { {...props} ref={forwardedRef} style={style} - // $FlowFixMe[incompatible-type] resizeMode={resizeMode} tintColor={tintColor} source={sources} diff --git a/Libraries/Lists/VirtualizedList.js b/Libraries/Lists/VirtualizedList.js index 2648cc3e4bb0..efd740bfb7a9 100644 --- a/Libraries/Lists/VirtualizedList.js +++ b/Libraries/Lists/VirtualizedList.js @@ -1802,7 +1802,6 @@ class VirtualizedList extends React.PureComponent { } } if (someChildHasMore) { - // $FlowFixMe[incompatible-use] newState.last = ii; break; } diff --git a/Libraries/Storage/AsyncStorage.js b/Libraries/Storage/AsyncStorage.js index 057f39d4ee78..15080dbc42c3 100644 --- a/Libraries/Storage/AsyncStorage.js +++ b/Libraries/Storage/AsyncStorage.js @@ -237,7 +237,6 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#multiget */ - // $FlowFixMe[signature-verification-failure] multiGet: function( keys: Array, callback?: ?(errors: ?Array, result: ?Array>) => void, diff --git a/Libraries/Text/TextNativeComponent.js b/Libraries/Text/TextNativeComponent.js index 858aaba750f1..1263d953bb34 100644 --- a/Libraries/Text/TextNativeComponent.js +++ b/Libraries/Text/TextNativeComponent.js @@ -24,7 +24,6 @@ type NativeTextProps = $ReadOnly<{ export const NativeText: HostComponent = (createReactNativeComponentClass( 'RCTText', () => ({ - // $FlowFixMe[incompatible-call] validAttributes: { ...ReactNativeViewAttributes.UIView, isHighlighted: true, @@ -59,7 +58,6 @@ export const NativeVirtualText: HostComponent = !global.RN$Bridgeless && !UIManager.hasViewManagerConfig('RCTVirtualText') ? NativeText : (createReactNativeComponentClass('RCTVirtualText', () => ({ - // $FlowFixMe[incompatible-call] validAttributes: { ...ReactNativeViewAttributes.UIView, isHighlighted: true, diff --git a/Libraries/Utilities/ReactNativeTestTools.js b/Libraries/Utilities/ReactNativeTestTools.js index 1f4e7cd80210..7396220b5614 100644 --- a/Libraries/Utilities/ReactNativeTestTools.js +++ b/Libraries/Utilities/ReactNativeTestTools.js @@ -21,7 +21,6 @@ const shallowRenderer = new ShallowRenderer(); import type {ReactTestRenderer as ReactTestRendererType} from 'react-test-renderer'; -// $FlowFixMe[value-as-type] export type ReactTestInstance = $PropertyType; export type Predicate = (node: ReactTestInstance) => boolean; @@ -87,7 +86,6 @@ function enter(instance: ReactTestInstance, text: string) { // Returns null if there is no error, otherwise returns an error message string. function maximumDepthError( - // $FlowFixMe[value-as-type] tree: ReactTestRendererType, maxDepthLimit: number, ): ?string { @@ -179,7 +177,6 @@ function renderAndEnforceStrictMode(element: React.Node): any { return renderWithStrictMode(element); } -// $FlowFixMe[value-as-type] function renderWithStrictMode(element: React.Node): ReactTestRendererType { const WorkAroundBugWithStrictModeInTestRenderer = prps => prps.children; const StrictMode = (React: $FlowFixMe).StrictMode; diff --git a/packages/rn-tester/js/examples/Animated/EasingExample.js b/packages/rn-tester/js/examples/Animated/EasingExample.js index 6203fc36de4a..0ee196d3f692 100644 --- a/packages/rn-tester/js/examples/Animated/EasingExample.js +++ b/packages/rn-tester/js/examples/Animated/EasingExample.js @@ -33,9 +33,7 @@ const easingSections = [ { title: 'Predefined animations', data: [ - // $FlowFixMe[method-unbinding] {title: 'Bounce', easing: Easing.bounce}, - // $FlowFixMe[method-unbinding] {title: 'Ease', easing: Easing.ease}, {title: 'Elastic', easing: Easing.elastic(4)}, ], @@ -43,11 +41,8 @@ const easingSections = [ { title: 'Standard functions', data: [ - // $FlowFixMe[method-unbinding] {title: 'Linear', easing: Easing.linear}, - // $FlowFixMe[method-unbinding] {title: 'Quad', easing: Easing.quad}, - // $FlowFixMe[method-unbinding] {title: 'Cubic', easing: Easing.cubic}, ], }, @@ -58,11 +53,8 @@ const easingSections = [ title: 'Bezier', easing: Easing.bezier(0, 2, 1, -1), }, - // $FlowFixMe[method-unbinding] {title: 'Circle', easing: Easing.circle}, - // $FlowFixMe[method-unbinding] {title: 'Sin', easing: Easing.sin}, - // $FlowFixMe[method-unbinding] {title: 'Exp', easing: Easing.exp}, ], }, diff --git a/packages/rn-tester/js/examples/PanResponder/PanResponderExample.js b/packages/rn-tester/js/examples/PanResponder/PanResponderExample.js index 0ee624339f52..447014d1ff3f 100644 --- a/packages/rn-tester/js/examples/PanResponder/PanResponderExample.js +++ b/packages/rn-tester/js/examples/PanResponder/PanResponderExample.js @@ -110,7 +110,6 @@ class PanResponderExample extends React.Component { }} style={[ styles.circle, - // $FlowFixMe[incompatible-type] { transform: [ {translateX: this.state.left}, diff --git a/packages/rn-tester/js/examples/PointerEvents/PointerEventsExample.js b/packages/rn-tester/js/examples/PointerEvents/PointerEventsExample.js index ff5aaab93117..1b8444c08734 100644 --- a/packages/rn-tester/js/examples/PointerEvents/PointerEventsExample.js +++ b/packages/rn-tester/js/examples/PointerEvents/PointerEventsExample.js @@ -56,10 +56,6 @@ class ExampleBox extends React.Component { - {/* $FlowFixMe[type-as-value] (>=0.53.0 site=react_native_fb,react_ - * native_oss) This comment suppresses an error when upgrading - * Flow's support for React. To see the error delete this comment - * and run Flow. */} diff --git a/packages/rn-tester/js/examples/RTL/RTLExample.js b/packages/rn-tester/js/examples/RTL/RTLExample.js index 837609d312d4..35034bf4ace5 100644 --- a/packages/rn-tester/js/examples/RTL/RTLExample.js +++ b/packages/rn-tester/js/examples/RTL/RTLExample.js @@ -671,7 +671,6 @@ exports.examples = [ description: ('In iOS, it depends on active language. ' + 'In Android, it depends on the text content.': string), render: function(): React.Element { - // $FlowFixMe[speculation-ambiguous] return ; }, }, @@ -681,7 +680,6 @@ exports.examples = [ 'languages or text content.': string), render: function(): React.Element { return ( - // $FlowFixMe[speculation-ambiguous] @@ -694,7 +692,6 @@ exports.examples = [ 'languages or text content.': string), render: function(): React.Element { return ( - // $FlowFixMe[speculation-ambiguous] @@ -705,7 +702,6 @@ exports.examples = [ title: "Using textAlign: 'right' for TextInput", description: ('Flip TextInput direction to RTL': string), render: function(): React.Element { - // $FlowFixMe[speculation-ambiguous] return ; }, }, diff --git a/packages/rn-tester/js/examples/TextInput/TextInputSharedExamples.js b/packages/rn-tester/js/examples/TextInput/TextInputSharedExamples.js index 1fb36ce6eb56..59f9c7122f62 100644 --- a/packages/rn-tester/js/examples/TextInput/TextInputSharedExamples.js +++ b/packages/rn-tester/js/examples/TextInput/TextInputSharedExamples.js @@ -327,9 +327,7 @@ class TokenizedTextExample extends React.Component< index = 1; } parts.push(_text.substr(0, index)); - // $FlowFixMe[incompatible-use] parts.push(token[0]); - // $FlowFixMe[incompatible-use] index = index + token[0].length; _text = _text.slice(index); } diff --git a/packages/rn-tester/js/utils/RNTesterStatePersister.js b/packages/rn-tester/js/utils/RNTesterStatePersister.js index 65be7ff46f2c..7b54ad59dd4a 100644 --- a/packages/rn-tester/js/utils/RNTesterStatePersister.js +++ b/packages/rn-tester/js/utils/RNTesterStatePersister.js @@ -57,11 +57,7 @@ function createContainer( _passSetState = (stateLamda: (state: State) => State): void => { this.setState(state => { const value = stateLamda(state.value); - AsyncStorage.setItem( - this._cacheKey, - // $FlowFixMe[incompatible-call] Error surfaced when typing AsyncStorage - JSON.stringify(value), - ); + AsyncStorage.setItem(this._cacheKey, JSON.stringify(value)); return {value}; }); }; From ad399f7a4f0983d15cb2e5d48d325c61b3656829 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ramos?= Date: Thu, 21 Oct 2021 15:22:50 -0700 Subject: [PATCH 050/628] Utility script to discover codegen-enabled libraries Summary: Adds utility script which crawls through a React Native app's Node dependencies and, for each compatible library, generates the relevant native code artifacts. This script is for development purposes, and is not hooked into the existing codegen integration by design. Changelog: [Internal] Reviewed By: sota000 Differential Revision: D28915433 fbshipit-source-id: de36d3e1dc0e11aad3ca55cea5e6731db09c5377 --- package.json | 20 ++++ packages/rn-tester/package.json | 12 ++ scripts/generate-artifacts.js | 198 ++++++++++++++++++++++++++++++++ 3 files changed, 230 insertions(+) create mode 100644 scripts/generate-artifacts.js diff --git a/package.json b/package.json index 0a56e66c3e68..ea9b44981e49 100644 --- a/package.json +++ b/package.json @@ -158,5 +158,25 @@ "name": "iPhone 8" } } + }, + "codegenConfig": { + "libraries": [ + { + "name": "FBReactNativeSpec", + "ios": { + "_outputDir": "React/FBReactNativeSpec" + }, + "android": {}, + "jsSrcsDir": "Libraries" + }, + { + "name": "rncore", + "ios": { + "_outputDir": "ReactCommon" + }, + "android": {}, + "jsSrcsDir": "Libraries" + } + ] } } diff --git a/packages/rn-tester/package.json b/packages/rn-tester/package.json index 39b5b65944f4..a22c6669d4f3 100644 --- a/packages/rn-tester/package.json +++ b/packages/rn-tester/package.json @@ -21,5 +21,17 @@ "connect": "^3.6.5", "detox": "16.7.2", "ws": "^6.1.4" + }, + "codegenConfig": { + "libraries": [ + { + "name": "ScreenshotManagerSpec", + "ios": { + "_outputDir": "NativeModuleExample" + }, + "android": {}, + "jsSrcsDir": "NativeModuleExample" + } + ] } } diff --git a/scripts/generate-artifacts.js b/scripts/generate-artifacts.js new file mode 100644 index 000000000000..8fdb8e06ad37 --- /dev/null +++ b/scripts/generate-artifacts.js @@ -0,0 +1,198 @@ +/** + * 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. + * + * @format + */ + +'use strict'; + +/** + * This script crawls through a React Native application's dependencies and invokes the codegen + * for any libraries that require it. + * To enable codegen support, the library should include a config in the CODEGEN_CONFIG_KEY key + * in a CODEGEN_CONFIG_FILENAME file. + */ + +const {execSync} = require('child_process'); +const fs = require('fs'); +const os = require('os'); +const path = require('path'); +const yargs = require('yargs'); + +const argv = yargs + .option('p', { + alias: 'path', + description: 'Path to React Native application', + }) + .option('f', { + alias: 'configFilename', + default: 'package.json', + description: 'The file that contains the codegen configuration.', + }) + .option('k', { + alias: 'configKey', + default: 'codegenConfig', + description: + 'The key that contains the codegen configuration in the config file.', + }) + .usage('Usage: $0 -p [path to app]') + .demandOption(['p']).argv; + +const RN_ROOT = path.join(__dirname, '..'); +const CODEGEN_CONFIG_FILENAME = argv.f; +const CODEGEN_CONFIG_KEY = argv.k; +const CODEGEN_REPO_PATH = `${RN_ROOT}/packages/react-native-codegen`; +const CODEGEN_NPM_PATH = `${RN_ROOT}/../react-native-codegen`; + +function main(appRootDir) { + if (appRootDir == null) { + console.error('Missing path to React Native application'); + process.exitCode = 1; + return; + } + + try { + // 1. Get app package.json + const pkgJson = JSON.parse( + fs.readFileSync(path.join(appRootDir, 'package.json')), + ); + + // 2. Get dependencies for the app + const dependencies = {...pkgJson.dependencies, ...pkgJson.devDependencies}; + + // 3. Determine which of these are codegen-enabled libraries + console.log('\n\n>>>>> Searching for codegen-enabled libraries...'); + const libraries = []; + + // Handle react-native and third-party libraries + Object.keys(dependencies).forEach(dependency => { + const codegenConfigFileDir = path.join( + appRootDir, + 'node_modules', + dependency, + ); + const configFilePath = path.join( + codegenConfigFileDir, + CODEGEN_CONFIG_FILENAME, + ); + if (fs.existsSync(configFilePath)) { + const configFile = JSON.parse(fs.readFileSync(configFilePath)); + if ( + configFile[CODEGEN_CONFIG_KEY] != null && + configFile[CODEGEN_CONFIG_KEY].libraries != null + ) { + console.log(dependency); + configFile[CODEGEN_CONFIG_KEY].libraries.forEach(config => { + const libraryConfig = { + library: dependency, + config, + libraryPath: codegenConfigFileDir, + }; + libraries.push(libraryConfig); + }); + } + } + }); + + // Handle in-app libraries + if ( + pkgJson[CODEGEN_CONFIG_KEY] != null && + pkgJson[CODEGEN_CONFIG_KEY].libraries != null + ) { + console.log(pkgJson.name); + pkgJson[CODEGEN_CONFIG_KEY].libraries.forEach(config => { + const libraryConfig = { + library: pkgJson.name, + config, + libraryPath: appRootDir, + }; + libraries.push(libraryConfig); + }); + } + + if (libraries.length === 0) { + console.log('No codegen-enabled libraries found.'); + return; + } + + // 4. Locate codegen package + let codegenCliPath; + if (fs.existsSync(CODEGEN_REPO_PATH)) { + codegenCliPath = CODEGEN_REPO_PATH; + + if (!fs.existsSync(path.join(CODEGEN_REPO_PATH, 'lib'))) { + console.log('\n\n>>>>> Building react-native-codegen package'); + execSync('yarn install', { + cwd: codegenCliPath, + stdio: 'inherit', + }); + execSync('yarn build', { + cwd: codegenCliPath, + stdio: 'inherit', + }); + } + } else if (fs.existsSync(CODEGEN_NPM_PATH)) { + codegenCliPath = CODEGEN_NPM_PATH; + } else { + throw "error: Could not determine react-native-codegen location. Try running 'yarn install' or 'npm install' in your project root."; + } + + // 5. For each codegen-enabled library, generate the native code spec files + libraries.forEach(library => { + const tmpDir = fs.mkdtempSync( + path.join(os.tmpdir(), library.config.name), + ); + const pathToSchema = path.join(tmpDir, 'schema.json'); + const pathToJavaScriptSources = path.join( + library.libraryPath, + library.config.jsSrcsDir, + ); + const pathToOutputDirIOS = path.join( + library.libraryPath, + library.config.ios._outputDir, + ); + const pathToTempOutputDir = path.join(tmpDir, 'out'); + + console.log(`\n\n>>>>> Processing ${library.config.name}`); + // Generate one schema for the entire library... + // TODO: We should use a glob here to grab modules or components -only sources, as with react_native_pods.rb. + // Otherwise, we'll generate unnecessary artifacts. + execSync( + `node ${path.join( + codegenCliPath, + 'lib', + 'cli', + 'combine', + 'combine-js-to-schema-cli.js', + )} ${pathToSchema} ${pathToJavaScriptSources}`, + ); + console.log(`Generated schema: ${pathToSchema}`); + + // ...then generate native code artifacts. + fs.mkdirSync(pathToTempOutputDir, {recursive: true}); + execSync( + `node ${path.join( + RN_ROOT, + 'scripts', + 'generate-specs-cli.js', + )} ios ${pathToSchema} ${pathToTempOutputDir} ${library.config.name}`, + ); + fs.mkdirSync(pathToOutputDirIOS, {recursive: true}); + execSync(`cp -R ${pathToTempOutputDir}/* ${pathToOutputDirIOS}`); + console.log(`Generated artifacts: ${pathToOutputDirIOS}`); + }); + } catch (err) { + console.error(err); + process.exitCode = 1; + } + + // 5. Done! + console.log('\n\nDone.'); + return; +} + +const appRoot = argv.path; +main(appRoot); From 1e6add1a43355bb88c57400a7420a656966bef97 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Thu, 21 Oct 2021 15:57:08 -0700 Subject: [PATCH 051/628] iOS Ruby Updates (#32456) Summary: Fix the `scripts/update-ruby.sh` so it always use the correct [bundle config](https://bundler.io/man/bundle-config.1.html#DESCRIPTION). In the current version it wasn't using the correct configuration inside the `template/` directory, resulting in incorrect platform for `template/Gemfile.lock`. While at that, update the gems to their latest version: - ethon 0.14.0 -> 0.15.0 - json 0.5.1 -> 0.6.0 - zeitwerk 2.4.2 -> 2.5.1 - bundler 2.2.28 -> 2.2.29 ## Changelog No changelog Pull Request resolved: https://github.com/facebook/react-native/pull/32456 Test Plan: Run `bump-oss-version.js` and see `template/Gemfile.lock` lists `ruby` as the `PLATFORM` (no diff in that line). ## References - https://github.com/facebook/react-native/commit/e18cf90d71d0bef2e2a0caf30a89e53129152965#r58230816 Reviewed By: yungsters Differential Revision: D31841524 Pulled By: charlesbdudley fbshipit-source-id: 695c245fcb344c866afed45f747e04233e5c91e4 --- Gemfile.lock | 8 ++++---- scripts/update-ruby.sh | 3 +++ template/Gemfile.lock | 10 +++++----- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index de5f3d29a1b7..e0f260750f16 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -56,7 +56,7 @@ GEM colored2 (3.1.2) concurrent-ruby (1.1.9) escape (0.0.4) - ethon (0.14.0) + ethon (0.15.0) ffi (>= 1.15.0) ffi (1.15.4) fourflusher (2.3.1) @@ -65,7 +65,7 @@ GEM httpclient (2.8.3) i18n (1.8.10) concurrent-ruby (~> 1.0) - json (2.5.1) + json (2.6.0) minitest (5.14.4) molinillo (0.8.0) nanaimo (0.3.0) @@ -85,7 +85,7 @@ GEM colored2 (~> 3.1) nanaimo (~> 0.3.0) rexml (~> 3.2.4) - zeitwerk (2.4.2) + zeitwerk (2.5.1) PLATFORMS ruby @@ -97,4 +97,4 @@ RUBY VERSION ruby 2.7.4p191 BUNDLED WITH - 2.2.28 + 2.2.29 diff --git a/scripts/update-ruby.sh b/scripts/update-ruby.sh index a220ad847359..bb72719c43a3 100755 --- a/scripts/update-ruby.sh +++ b/scripts/update-ruby.sh @@ -55,6 +55,9 @@ sed_i -e "s/^\(ruby '\)[^']*\('.*\)$/\1$VERSION\2/" template/Gemfile rm -f Gemfile.lock template/Gemfile.lock +export BUNDLE_APP_CONFIG="$ROOT/.bundle" +cp "$BUNDLE_APP_CONFIG/"* template/_bundle # sync! + bundle lock (cd template && bundle lock) diff --git a/template/Gemfile.lock b/template/Gemfile.lock index f0b073f27b1d..e0f260750f16 100644 --- a/template/Gemfile.lock +++ b/template/Gemfile.lock @@ -56,7 +56,7 @@ GEM colored2 (3.1.2) concurrent-ruby (1.1.9) escape (0.0.4) - ethon (0.14.0) + ethon (0.15.0) ffi (>= 1.15.0) ffi (1.15.4) fourflusher (2.3.1) @@ -65,7 +65,7 @@ GEM httpclient (2.8.3) i18n (1.8.10) concurrent-ruby (~> 1.0) - json (2.5.1) + json (2.6.0) minitest (5.14.4) molinillo (0.8.0) nanaimo (0.3.0) @@ -85,10 +85,10 @@ GEM colored2 (~> 3.1) nanaimo (~> 0.3.0) rexml (~> 3.2.4) - zeitwerk (2.4.2) + zeitwerk (2.5.1) PLATFORMS - arm64-darwin-20 + ruby DEPENDENCIES cocoapods (~> 1.11, >= 1.11.2) @@ -97,4 +97,4 @@ RUBY VERSION ruby 2.7.4p191 BUNDLED WITH - 2.2.28 + 2.2.29 From 3f629049ba9773793978cf9093c7a71af15e3e8d Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Thu, 21 Oct 2021 17:43:47 -0700 Subject: [PATCH 052/628] RN: Deprecate Prop Types Summary: Deprecates `prop-types` from React Native. Existing use cases will be presented with a warning to migrate to the newly published `deprecated-react-native-prop-types` module. In a subsequent release, these will be removed from React Native. Changelog: [General][Changed] - Accessing `Image.propTypes`, `Text.propTypes`, `TextInput.propTypes`, `ColorPropType`, `EdgeInsetsPropType`, `PointPropType`, or `ViewPropTypes` now emits a deprecation warning. Reviewed By: kacieb Differential Revision: D29019309 fbshipit-source-id: 21e518e588fa05c498cc75ba81f69cfa8a9d0613 --- BUCK | 1 + Libraries/Components/TextInput/TextInput.js | 11 +++--- Libraries/Image/Image.android.js | 11 +++--- Libraries/Image/Image.ios.js | 8 ++-- Libraries/Text/Text.js | 14 +++---- index.js | 41 +++++++++++++-------- package.json | 1 + yarn.lock | 13 ++++++- 8 files changed, 59 insertions(+), 41 deletions(-) diff --git a/BUCK b/BUCK index 9434d821f8b3..b80dda92bb5d 100644 --- a/BUCK +++ b/BUCK @@ -690,6 +690,7 @@ rn_library( "//xplat/js:node_modules__abort_19controller", "//xplat/js:node_modules__anser", "//xplat/js:node_modules__base64_19js", + "//xplat/js:node_modules__deprecated_19react_19native_19prop_19types", "//xplat/js:node_modules__event_19target_19shim", "//xplat/js:node_modules__invariant", "//xplat/js:node_modules__nullthrows", diff --git a/Libraries/Components/TextInput/TextInput.js b/Libraries/Components/TextInput/TextInput.js index f61d266b4b95..e1c4a0ea34e0 100644 --- a/Libraries/Components/TextInput/TextInput.js +++ b/Libraries/Components/TextInput/TextInput.js @@ -10,8 +10,6 @@ import * as React from 'react'; -import DeprecatedTextInputPropTypes from '../../DeprecatedPropTypes/DeprecatedTextInputPropTypes'; - import Platform from '../../Utilities/Platform'; import StyleSheet, { type TextStyleProp, @@ -34,7 +32,6 @@ import type { PressEvent, } from '../../Types/CoreEventTypes'; import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes'; -import type {TextInputNativeCommands} from './TextInputNativeCommands'; const {useLayoutEffect, useRef, useState} = React; @@ -1244,8 +1241,11 @@ const ExportedForwardRef: React.AbstractComponent< ); }); -// TODO: Deprecate this -ExportedForwardRef.propTypes = DeprecatedTextInputPropTypes; +/** + * Switch to `deprecated-react-native-prop-types` for compatibility with future + * releases. This is deprecated and will be removed in the future. + */ +ExportedForwardRef.propTypes = require('deprecated-react-native-prop-types').TextInputPropTypes; // $FlowFixMe[prop-missing] ExportedForwardRef.State = { @@ -1263,7 +1263,6 @@ type TextInputComponentStatics = $ReadOnly<{| focusTextInput: typeof TextInputState.focusTextInput, blurTextInput: typeof TextInputState.blurTextInput, |}>, - propTypes: typeof DeprecatedTextInputPropTypes, |}>; const styles = StyleSheet.create({ diff --git a/Libraries/Image/Image.android.js b/Libraries/Image/Image.android.js index e878ad5dbeb6..935064389feb 100644 --- a/Libraries/Image/Image.android.js +++ b/Libraries/Image/Image.android.js @@ -8,7 +8,6 @@ * @format */ -import DeprecatedImagePropType from '../DeprecatedPropTypes/DeprecatedImagePropType'; import ImageViewNativeComponent from './ImageViewNativeComponent'; import * as React from 'react'; import StyleSheet from '../StyleSheet/StyleSheet'; @@ -115,7 +114,6 @@ type ImageComponentStatics = $ReadOnly<{| abortPrefetch: typeof abortPrefetch, queryCache: typeof queryCache, resolveAssetSource: typeof resolveAssetSource, - propTypes: typeof DeprecatedImagePropType, |}>; /** @@ -299,10 +297,11 @@ Image.queryCache = queryCache; * comment and run Flow. */ Image.resolveAssetSource = resolveAssetSource; -/* $FlowFixMe(>=0.89.0 site=react_native_android_fb) This comment suppresses an - * error found when Flow v0.89 was deployed. To see the error, delete this - * comment and run Flow. */ -Image.propTypes = DeprecatedImagePropType; +/** + * Switch to `deprecated-react-native-prop-types` for compatibility with future + * releases. This is deprecated and will be removed in the future. + */ +Image.propTypes = require('deprecated-react-native-prop-types').ImagePropTypes; const styles = StyleSheet.create({ base: { diff --git a/Libraries/Image/Image.ios.js b/Libraries/Image/Image.ios.js index 4ed07a785f10..2601ad6253ec 100644 --- a/Libraries/Image/Image.ios.js +++ b/Libraries/Image/Image.ios.js @@ -8,7 +8,6 @@ * @format */ -import DeprecatedImagePropType from '../DeprecatedPropTypes/DeprecatedImagePropType'; import * as React from 'react'; import StyleSheet from '../StyleSheet/StyleSheet'; @@ -94,7 +93,6 @@ type ImageComponentStatics = $ReadOnly<{| prefetchWithMetadata: typeof prefetchWithMetadata, queryCache: typeof queryCache, resolveAssetSource: typeof resolveAssetSource, - propTypes: typeof DeprecatedImagePropType, |}>; /** @@ -234,7 +232,11 @@ Image.queryCache = queryCache; * delete this comment and run Flow. */ Image.resolveAssetSource = resolveAssetSource; -Image.propTypes = DeprecatedImagePropType; +/** + * Switch to `deprecated-react-native-prop-types` for compatibility with future + * releases. This is deprecated and will be removed in the future. + */ +Image.propTypes = require('deprecated-react-native-prop-types').ImagePropTypes; const styles = StyleSheet.create({ base: { diff --git a/Libraries/Text/Text.js b/Libraries/Text/Text.js index f55209404ef3..22474f0711fc 100644 --- a/Libraries/Text/Text.js +++ b/Libraries/Text/Text.js @@ -8,7 +8,6 @@ * @format */ -import DeprecatedTextPropTypes from '../DeprecatedPropTypes/DeprecatedTextPropTypes'; import * as PressabilityDebug from '../Pressability/PressabilityDebug'; import usePressability from '../Pressability/usePressability'; import StyleSheet from '../StyleSheet/StyleSheet'; @@ -188,8 +187,11 @@ const Text: React.AbstractComponent< Text.displayName = 'Text'; -// TODO: Delete this. -Text.propTypes = DeprecatedTextPropTypes; +/** + * Switch to `deprecated-react-native-prop-types` for compatibility with future + * releases. This is deprecated and will be removed in the future. + */ +Text.propTypes = require('deprecated-react-native-prop-types').TextPropTypes; /** * Returns false until the first time `newValue` is true, after which this will @@ -204,8 +206,4 @@ function useLazyInitialization(newValue: boolean): boolean { return oldValue; } -// $FlowFixMe[incompatible-cast] - No good way to type a React.AbstractComponent with statics. -module.exports = (Text: typeof Text & - $ReadOnly<{ - propTypes: typeof DeprecatedTextPropTypes, - }>); +module.exports = Text; diff --git a/index.js b/index.js index 7ce52d8a4603..4970fa10faeb 100644 --- a/index.js +++ b/index.js @@ -97,12 +97,6 @@ import typeof RCTDeviceEventEmitter from './Libraries/EventEmitter/RCTDeviceEven import typeof RCTNativeAppEventEmitter from './Libraries/EventEmitter/RCTNativeAppEventEmitter'; import typeof {RootTagContext} from './Libraries/ReactNative/RootTag'; -// Prop Types -import typeof DeprecatedColorPropType from './Libraries/DeprecatedPropTypes/DeprecatedColorPropType'; -import typeof DeprecatedEdgeInsetsPropType from './Libraries/DeprecatedPropTypes/DeprecatedEdgeInsetsPropType'; -import typeof DeprecatedPointPropType from './Libraries/DeprecatedPropTypes/DeprecatedPointPropType'; -import typeof DeprecatedViewPropTypes from './Libraries/DeprecatedPropTypes/DeprecatedViewPropTypes'; - import type {HostComponent as _HostComponentInternal} from './Libraries/Renderer/shims/ReactNativeTypes'; export type HostComponent = _HostComponentInternal; @@ -450,19 +444,34 @@ module.exports = { 'LogBox is enabled by default so there is no need to call unstable_enableLogBox() anymore. This is a no op and will be removed in the next version.', ); }, - // Prop Types - // $FlowFixMe[value-as-type] - get ColorPropType(): DeprecatedColorPropType { - return require('./Libraries/DeprecatedPropTypes/DeprecatedColorPropType'); + // Deprecated Prop Types + get ColorPropType(): $FlowFixMe { + console.warn( + 'ColorPropType will be removed from React Native. Migrate to ' + + "ColorPropType exported from 'deprecated-react-native-prop-types'.", + ); + return require('deprecated-react-native-prop-types').ColorPropType; }, - get EdgeInsetsPropType(): DeprecatedEdgeInsetsPropType { - return require('./Libraries/DeprecatedPropTypes/DeprecatedEdgeInsetsPropType'); + get EdgeInsetsPropType(): $FlowFixMe { + console.warn( + 'EdgeInsetsPropType will be removed from React Native. Migrate to ' + + "EdgeInsetsPropType exported from 'deprecated-react-native-prop-types'.", + ); + return require('deprecated-react-native-prop-types').EdgeInsetsPropType; }, - get PointPropType(): DeprecatedPointPropType { - return require('./Libraries/DeprecatedPropTypes/DeprecatedPointPropType'); + get PointPropType(): $FlowFixMe { + console.warn( + 'PointPropType will be removed from React Native. Migrate to ' + + "PointPropType exported from 'deprecated-react-native-prop-types'.", + ); + return require('deprecated-react-native-prop-types').PointPropType; }, - get ViewPropTypes(): DeprecatedViewPropTypes { - return require('./Libraries/DeprecatedPropTypes/DeprecatedViewPropTypes'); + get ViewPropTypes(): $FlowFixMe { + console.warn( + 'ViewPropTypes will be removed from React Native. Migrate to ' + + "ViewPropTypes exported from 'deprecated-react-native-prop-types'.", + ); + return require('deprecated-react-native-prop-types').ViewPropTypes; }, }; diff --git a/package.json b/package.json index ea9b44981e49..471bc19152b1 100644 --- a/package.json +++ b/package.json @@ -99,6 +99,7 @@ "anser": "^1.4.9", "base64-js": "^1.1.2", "event-target-shim": "^5.0.1", + "deprecated-react-native-prop-types": "^2.1.0", "hermes-engine": "~0.9.0", "invariant": "^2.2.4", "jsc-android": "^250230.2.1", diff --git a/yarn.lock b/yarn.lock index 3a9eeab7a674..285e0f30f2cb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2350,6 +2350,15 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +deprecated-react-native-prop-types@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-2.1.0.tgz#1f71cc06951131dc6b968c352047bfdab9d478b2" + integrity sha512-VZZzU9V6hHxinVI4Ca7imJyXkCcJoRD1GTomQMZt+wcbx0iY22lqFXcJvpWVEoAz01+vhbuWt5Sc3tzrXhRZYw== + dependencies: + "@react-native/normalize-color" "*" + invariant "*" + prop-types "*" + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -3438,7 +3447,7 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= -invariant@^2.2.4: +invariant@*, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -5504,7 +5513,7 @@ prompts@^2.0.1, prompts@^2.4.0: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.7.2: +prop-types@*, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== From e3a71b019fa78e2b4b3454ccc59ea9c8cc543b29 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Fri, 22 Oct 2021 03:07:59 -0700 Subject: [PATCH 053/628] Bump react-native-codegen to 0.0.9 Summary: Bumping the codegen to a new version to ship a change to the Android template. Changelog: [General] [Changed] - Bump react-native-codegen to 0.0.9 Reviewed By: hramos, mdvacca Differential Revision: D31762139 fbshipit-source-id: 71a96210a3577c12ff3c9f9013c6e72adf4a0ecb --- packages/react-native-codegen/package.json | 2 +- repo-config/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native-codegen/package.json b/packages/react-native-codegen/package.json index 92867c4e3161..fa11b0b801c4 100644 --- a/packages/react-native-codegen/package.json +++ b/packages/react-native-codegen/package.json @@ -1,6 +1,6 @@ { "name": "react-native-codegen", - "version": "0.0.8", + "version": "0.0.9", "description": "⚛️ Code generation tools for React Native", "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/react-native-codegen", "repository": { diff --git a/repo-config/package.json b/repo-config/package.json index ca4ac3eae930..75aec75e2637 100644 --- a/repo-config/package.json +++ b/repo-config/package.json @@ -45,7 +45,7 @@ "mkdirp": "^0.5.1", "prettier": "1.19.1", "react": "17.0.2", - "react-native-codegen": "^0.0.8", + "react-native-codegen": "^0.0.9", "react-shallow-renderer": "16.14.1", "react-test-renderer": "17.0.2", "shelljs": "^0.7.8", From b03e824c52123219a5c8fbd89473391bf0bc31c8 Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Fri, 22 Oct 2021 06:36:48 -0700 Subject: [PATCH 054/628] Mock composite animations when testing Summary: Single and composite animations were handled inconsistently in AnimatedMock. Also added a guard to prevent callbacks from triggering additional animations, since we had a test-scenario that did exactly that. Changelog: [General][Fixed] - Composite animations will now be ran immediately when the app is in testing mode Reviewed By: yungsters Differential Revision: D31826967 fbshipit-source-id: a6416b42e227fe79f5c3a55a9c51beb8451874f8 --- Libraries/Animated/AnimatedMock.js | 60 +++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/Libraries/Animated/AnimatedMock.js b/Libraries/Animated/AnimatedMock.js index 225669b1f640..561f4b5a8750 100644 --- a/Libraries/Animated/AnimatedMock.js +++ b/Libraries/Animated/AnimatedMock.js @@ -27,8 +27,38 @@ import type {SpringAnimationConfig} from './animations/SpringAnimation'; /** * Animations are a source of flakiness in snapshot testing. This mock replaces * animation functions from AnimatedImplementation with empty animations for - * predictability in tests. + * predictability in tests. When possible the animation will run immediately + * to the final state. */ + +// Prevent any callback invocation from recursively triggering another +// callback, which may trigger another animation +let inAnimationCallback = false; +function mockAnimationStart( + start: (callback?: ?EndCallback) => void, +): (callback?: ?EndCallback) => void { + return callback => { + const guardedCallback = + callback == null + ? callback + : (...args) => { + if (inAnimationCallback) { + console.warn( + 'Ignoring recursive animation callback when running mock animations', + ); + return; + } + inAnimationCallback = true; + try { + callback(...args); + } finally { + inAnimationCallback = false; + } + }; + start(guardedCallback); + }; +} + export type CompositeAnimation = { start: (callback?: ?EndCallback) => void, stop: () => void, @@ -48,6 +78,16 @@ const emptyAnimation = { }, }; +const mockCompositeAnimation = ( + animations: Array, +): CompositeAnimation => ({ + ...emptyAnimation, + start: mockAnimationStart((callback?: ?EndCallback): void => { + animations.forEach(animation => animation.start()); + callback?.({finished: true}); + }), +}); + const spring = function( value: AnimatedValue | AnimatedValueXY, config: SpringAnimationConfig, @@ -55,10 +95,10 @@ const spring = function( const anyValue: any = value; return { ...emptyAnimation, - start: (callback?: ?EndCallback): void => { + start: mockAnimationStart((callback?: ?EndCallback): void => { anyValue.setValue(config.toValue); - callback && callback({finished: true}); - }, + callback?.({finished: true}); + }), }; }; @@ -69,10 +109,10 @@ const timing = function( const anyValue: any = value; return { ...emptyAnimation, - start: (callback?: ?EndCallback): void => { + start: mockAnimationStart((callback?: ?EndCallback): void => { anyValue.setValue(config.toValue); - callback && callback({finished: true}); - }, + callback?.({finished: true}); + }), }; }; @@ -86,7 +126,7 @@ const decay = function( const sequence = function( animations: Array, ): CompositeAnimation { - return emptyAnimation; + return mockCompositeAnimation(animations); }; type ParallelConfig = {stopTogether?: boolean, ...}; @@ -94,7 +134,7 @@ const parallel = function( animations: Array, config?: ?ParallelConfig, ): CompositeAnimation { - return emptyAnimation; + return mockCompositeAnimation(animations); }; const delay = function(time: number): CompositeAnimation { @@ -105,7 +145,7 @@ const stagger = function( time: number, animations: Array, ): CompositeAnimation { - return emptyAnimation; + return mockCompositeAnimation(animations); }; type LoopAnimationConfig = { From 4b25a0aaa077caf9c437bcfeef8a226eda5a102e Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Fri, 22 Oct 2021 06:56:13 -0700 Subject: [PATCH 055/628] feat: add missing Android dangerous permissions (#32445) Summary: This PR adds all missing `dangerous` permissions in Android. I recently updated these for Android 12 and found many more missing dating all the way back to API 26. After this PR, it will be in sync with ALL dangerous permissions as of the recently released Android 12. https://developer.android.com/reference/android/Manifest.permission.html#ACCEPT_HANDOVER - 28 https://developer.android.com/reference/android/Manifest.permission.html#ACTIVITY_RECOGNITION - 29 https://developer.android.com/reference/android/Manifest.permission.html#ANSWER_PHONE_CALLS - 26 https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_NUMBERS - 26 https://developer.android.com/reference/android/Manifest.permission.html#UWB_RANGING - 31 ## Changelog [Android] [Changed] - Add ACCEPT_HANDOVER, ACTIVITY_RECOGNITION, ANSWER_PHONE_CALLS, READ_PHONE_NUMBERS & UWB_RANGING to PermissionsAndroid Pull Request resolved: https://github.com/facebook/react-native/pull/32445 Test Plan: ``` PermissionsAndroid.ACCEPT_HANDOVER === 'android.permission.ACCEPT_HANDOVER' PermissionsAndroid.ACTIVITY_RECOGNITION === 'android.permission.ACTIVITY_RECOGNITION' PermissionsAndroid.ANSWER_PHONE_CALLS === 'android.permission.ANSWER_PHONE_CALLS' PermissionsAndroid.READ_PHONE_NUMBERS === 'android.permission.READ_PHONE_NUMBERS' PermissionsAndroid.UWB_RANGING === 'android.permission.UWB_RANGING' ``` Reviewed By: yungsters Differential Revision: D31793802 Pulled By: sshic fbshipit-source-id: 4a2e5086e92ccd223e74db451c4ccd87485ffb63 --- .../PermissionsAndroid/NativePermissionsAndroid.js | 7 ++++++- Libraries/PermissionsAndroid/PermissionsAndroid.js | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Libraries/PermissionsAndroid/NativePermissionsAndroid.js b/Libraries/PermissionsAndroid/NativePermissionsAndroid.js index 7c3a6c58ac76..baca6400994e 100644 --- a/Libraries/PermissionsAndroid/NativePermissionsAndroid.js +++ b/Libraries/PermissionsAndroid/NativePermissionsAndroid.js @@ -45,7 +45,12 @@ export type PermissionType = | 'android.permission.BLUETOOTH_CONNECT' | 'android.permission.BLUETOOTH_SCAN' | 'android.permission.BLUETOOTH_ADVERTISE' - | 'android.permission.ACCESS_MEDIA_LOCATION'; + | 'android.permission.ACCESS_MEDIA_LOCATION' + | 'android.permission.ACCEPT_HANDOVER' + | 'android.permission.ACTIVITY_RECOGNITION' + | 'android.permission.ANSWER_PHONE_CALLS' + | 'android.permission.READ_PHONE_NUMBERS' + | 'android.permission.UWB_RANGING'; */ export interface Spec extends TurboModule { diff --git a/Libraries/PermissionsAndroid/PermissionsAndroid.js b/Libraries/PermissionsAndroid/PermissionsAndroid.js index 0a24840c56e1..8d8ceb4e9bb7 100644 --- a/Libraries/PermissionsAndroid/PermissionsAndroid.js +++ b/Libraries/PermissionsAndroid/PermissionsAndroid.js @@ -63,6 +63,11 @@ const PERMISSIONS = Object.freeze({ BLUETOOTH_SCAN: 'android.permission.BLUETOOTH_SCAN', BLUETOOTH_ADVERTISE: 'android.permission.BLUETOOTH_ADVERTISE', ACCESS_MEDIA_LOCATION: 'android.permission.ACCESS_MEDIA_LOCATION', + ACCEPT_HANDOVER: 'android.permission.ACCEPT_HANDOVER', + ACTIVITY_RECOGNITION: 'android.permission.ACTIVITY_RECOGNITION', + ANSWER_PHONE_CALLS: 'android.permission.ANSWER_PHONE_CALLS', + READ_PHONE_NUMBERS: 'android.permission.READ_PHONE_NUMBERS', + UWB_RANGING: 'android.permission.UWB_RANGING', }); /** @@ -73,11 +78,14 @@ const PERMISSIONS = Object.freeze({ class PermissionsAndroid { PERMISSIONS: {| + ACCEPT_HANDOVER: string, ACCESS_BACKGROUND_LOCATION: string, ACCESS_COARSE_LOCATION: string, ACCESS_FINE_LOCATION: string, ACCESS_MEDIA_LOCATION: string, + ACTIVITY_RECOGNITION: string, ADD_VOICEMAIL: string, + ANSWER_PHONE_CALLS: string, BLUETOOTH_ADVERTISE: string, BLUETOOTH_CONNECT: string, BLUETOOTH_SCAN: string, @@ -90,6 +98,7 @@ class PermissionsAndroid { READ_CALL_LOG: string, READ_CONTACTS: string, READ_EXTERNAL_STORAGE: string, + READ_PHONE_NUMBERS: string, READ_PHONE_STATE: string, READ_SMS: string, RECEIVE_MMS: string, @@ -98,6 +107,7 @@ class PermissionsAndroid { RECORD_AUDIO: string, SEND_SMS: string, USE_SIP: string, + UWB_RANGING: string, WRITE_CALENDAR: string, WRITE_CALL_LOG: string, WRITE_CONTACTS: string, From ebe5417c7a7feceba0e842b6ebd2873dfe6c23cb Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Fri, 22 Oct 2021 16:06:07 -0700 Subject: [PATCH 056/628] Fix up dark mode for main lists Summary: Changelog: [Internal] Fix up basic styling of dark mode for examples. Individual examples still may be broken and will be fixed up individually Reviewed By: yungsters Differential Revision: D31710790 fbshipit-source-id: 6ca4fb8a6238f38ff484ec91518057b243ba1d7b --- packages/rn-tester/js/RNTesterAppShared.js | 5 +- .../js/components/RNTPressableRow.js | 5 +- .../rn-tester/js/components/RNTTestDetails.js | 6 ++- .../rn-tester/js/components/RNTTitleBar.js | 3 +- .../rn-tester/js/components/RNTesterBlock.js | 2 +- .../components/RNTesterEmptyBookmarksState.js | 47 ++++++++++--------- .../js/components/RNTesterExampleFilter.js | 8 +++- .../js/components/RNTesterModuleContainer.js | 7 ++- .../js/components/RNTesterModuleList.js | 38 +-------------- .../rn-tester/js/components/RNTesterTheme.js | 17 +++++++ .../rn-tester/js/components/RNTesterTitle.js | 2 +- 11 files changed, 71 insertions(+), 69 deletions(-) diff --git a/packages/rn-tester/js/RNTesterAppShared.js b/packages/rn-tester/js/RNTesterAppShared.js index 90609a0b4ab1..5b09165f232a 100644 --- a/packages/rn-tester/js/RNTesterAppShared.js +++ b/packages/rn-tester/js/RNTesterAppShared.js @@ -176,7 +176,10 @@ const RNTesterApp = (): React.Node => { onBack={activeModule ? handleBackPress : null} documentationURL={activeModule?.documentationURL} /> - + {activeModule != null ? ( @@ -86,7 +86,6 @@ const styles = StyleSheet.create({ marginBottom: 5, }, pressed: { - backgroundColor: 'rgb(242,242,242)', elevation: 3, }, topRowStyle: { diff --git a/packages/rn-tester/js/components/RNTTestDetails.js b/packages/rn-tester/js/components/RNTTestDetails.js index 2f7c247ad8c8..5c5094784dca 100644 --- a/packages/rn-tester/js/components/RNTTestDetails.js +++ b/packages/rn-tester/js/components/RNTTestDetails.js @@ -9,7 +9,7 @@ */ import * as React from 'react'; -import {View, Text, StyleSheet, Button} from 'react-native'; +import {View, Text, StyleSheet, Button, Platform} from 'react-native'; import {type RNTesterTheme} from './RNTesterTheme'; function RNTTestDetails({ @@ -45,6 +45,10 @@ function RNTTestDetails({ { return ( - + {title} diff --git a/packages/rn-tester/js/components/RNTesterBlock.js b/packages/rn-tester/js/components/RNTesterBlock.js index 2c83209ac863..214d881a46ee 100644 --- a/packages/rn-tester/js/components/RNTesterBlock.js +++ b/packages/rn-tester/js/components/RNTesterBlock.js @@ -26,7 +26,7 @@ const RNTesterBlock = ({description, title, children}: Props): React.Node => { [styles.container], { borderColor: theme.SeparatorColor, - backgroundColor: theme.SystemBackgroundColor, + backgroundColor: theme.SecondaryGroupedBackgroundColor, }, ]}> diff --git a/packages/rn-tester/js/components/RNTesterEmptyBookmarksState.js b/packages/rn-tester/js/components/RNTesterEmptyBookmarksState.js index 3a526168a564..31e95953f4b0 100644 --- a/packages/rn-tester/js/components/RNTesterEmptyBookmarksState.js +++ b/packages/rn-tester/js/components/RNTesterEmptyBookmarksState.js @@ -10,30 +10,34 @@ import * as React from 'react'; import {View, Image, Text, StyleSheet} from 'react-native'; +import {RNTesterThemeContext} from './RNTesterTheme'; -export const RNTesterEmptyBookmarksState = (): React.Node => ( - - - - - Bookmarks are empty - - Please tap the{' '} - {' '} - icon to bookmark examples. - +export const RNTesterEmptyBookmarksState = (): React.Node => { + const theme = React.useContext(RNTesterThemeContext); + return ( + + + + + Bookmarks are empty + + + Please tap the{' '} + {' '} + icon to bookmark examples. + + - -); + ); +}; const styles = StyleSheet.create({ emptyContainer: { @@ -41,7 +45,6 @@ const styles = StyleSheet.create({ paddingHorizontal: 40, justifyContent: 'center', alignItems: 'center', - backgroundColor: 'white', }, emptyContainerInner: { marginTop: -150, diff --git a/packages/rn-tester/js/components/RNTesterExampleFilter.js b/packages/rn-tester/js/components/RNTesterExampleFilter.js index 768b0137fcad..f799e89dd36f 100644 --- a/packages/rn-tester/js/components/RNTesterExampleFilter.js +++ b/packages/rn-tester/js/components/RNTesterExampleFilter.js @@ -16,6 +16,7 @@ const { View, ScrollView, Image, + Platform, } = require('react-native'); import {RNTesterThemeContext} from './RNTesterTheme'; @@ -108,7 +109,12 @@ class RNTesterExampleFilter extends React.Component, State> { {props.description} diff --git a/packages/rn-tester/js/components/RNTesterModuleList.js b/packages/rn-tester/js/components/RNTesterModuleList.js index 05e1bf5e6017..6666c30b595d 100644 --- a/packages/rn-tester/js/components/RNTesterModuleList.js +++ b/packages/rn-tester/js/components/RNTesterModuleList.js @@ -118,8 +118,6 @@ const renderSectionHeader = ({section}) => ( const RNTesterModuleList: React$AbstractComponent = React.memo( ({sections, toggleBookmark, handleModuleCardPress}) => { - const theme = React.useContext(RNTesterThemeContext); - const filter = ({example, filterRegex, category}) => filterRegex.test(example.module.title) && (!category || example.category === category) && @@ -139,11 +137,7 @@ const RNTesterModuleList: React$AbstractComponent = React.memo( }; return ( - + = React.memo( sections={filteredSections} extraData={filteredSections} renderItem={renderListItem} - ItemSeparatorComponent={ItemSeparator} keyboardShouldPersistTaps="handled" automaticallyAdjustContentInsets={false} keyboardDismissMode="on-drag" @@ -169,32 +162,10 @@ const RNTesterModuleList: React$AbstractComponent = React.memo( }, ); -const ItemSeparator = ({highlighted}) => ( - - {theme => { - return ( - - ); - }} - -); - const styles = StyleSheet.create({ listContainer: { flex: 1, }, - listItem: { - backgroundColor: Platform.select({ios: '#FFFFFF', android: '#F3F8FF'}), - }, sectionHeader: { padding: 5, fontWeight: '500', @@ -209,13 +180,6 @@ const styles = StyleSheet.create({ overflow: 'hidden', elevation: 5, }, - separator: { - height: Platform.select({ios: StyleSheet.hairlineWidth, android: 0}), - marginHorizontal: Platform.select({ios: 15, android: 0}), - }, - separatorHighlighted: { - height: StyleSheet.hairlineWidth, - }, topRowStyle: { flexDirection: 'row', justifyContent: 'space-between', diff --git a/packages/rn-tester/js/components/RNTesterTheme.js b/packages/rn-tester/js/components/RNTesterTheme.js index 28bab6c1dce1..25697d21419c 100644 --- a/packages/rn-tester/js/components/RNTesterTheme.js +++ b/packages/rn-tester/js/components/RNTesterTheme.js @@ -17,17 +17,22 @@ export type RNTesterTheme = { SecondaryLabelColor: ColorValue, TertiaryLabelColor: ColorValue, QuaternaryLabelColor: ColorValue, + PlaceholderTextColor: ColorValue, + SystemBackgroundColor: ColorValue, SecondarySystemBackgroundColor: ColorValue, TertiarySystemBackgroundColor: ColorValue, + GroupedBackgroundColor: ColorValue, SecondaryGroupedBackgroundColor: ColorValue, TertiaryGroupedBackgroundColor: ColorValue, + SystemFillColor: ColorValue, SecondarySystemFillColor: ColorValue, TertiarySystemFillColor: ColorValue, QuaternarySystemFillColor: ColorValue, + SeparatorColor: ColorValue, OpaqueSeparatorColor: ColorValue, LinkColor: ColorValue, @@ -44,19 +49,25 @@ export const RNTesterLightTheme = { SecondaryLabelColor: '#3c3c4399', TertiaryLabelColor: '#3c3c434c', QuaternaryLabelColor: '#3c3c432d', + PlaceholderTextColor: '#3c3c434c', + SystemBackgroundColor: '#ffffffff', SecondarySystemBackgroundColor: '#f2f2f7ff', TertiarySystemBackgroundColor: '#ffffffff', + GroupedBackgroundColor: '#f2f2f7ff', SecondaryGroupedBackgroundColor: '#ffffffff', TertiaryGroupedBackgroundColor: '#f2f2f7ff', + SystemFillColor: '#78788033', SecondarySystemFillColor: '#78788028', TertiarySystemFillColor: '#7676801e', QuaternarySystemFillColor: '#74748014', + SeparatorColor: '#3c3c4349', OpaqueSeparatorColor: '#c6c6c8ff', + LinkColor: '#007affff', SystemRedColor: '#ff3b30ff', SystemGreenColor: '#34c759ff', @@ -70,19 +81,25 @@ export const RNTesterDarkTheme = { SecondaryLabelColor: '#ebebf599', TertiaryLabelColor: '#ebebf54c', QuaternaryLabelColor: '#ebebf528', + PlaceholderTextColor: '#ebebf54c', + SystemBackgroundColor: '#000000ff', SecondarySystemBackgroundColor: '#1c1c1eff', TertiarySystemBackgroundColor: '#2c2c2eff', + GroupedBackgroundColor: '#000000ff', SecondaryGroupedBackgroundColor: '#1c1c1eff', TertiaryGroupedBackgroundColor: '#2c2c2eff', + SystemFillColor: '#7878805b', SecondarySystemFillColor: '#78788051', TertiarySystemFillColor: '#7676803d', QuaternarySystemFillColor: '#7676802d', + SeparatorColor: '#54545899', OpaqueSeparatorColor: '#38383aff', + LinkColor: '#0984ffff', SystemRedColor: '#ff375fff', SystemGreenColor: '#30d158ff', diff --git a/packages/rn-tester/js/components/RNTesterTitle.js b/packages/rn-tester/js/components/RNTesterTitle.js index a99556540432..a7c975d89b41 100644 --- a/packages/rn-tester/js/components/RNTesterTitle.js +++ b/packages/rn-tester/js/components/RNTesterTitle.js @@ -24,7 +24,7 @@ class RNTesterTitle extends React.Component<$FlowFixMeProps> { styles.container, { borderColor: theme.SeparatorColor, - backgroundColor: theme.SystemBackgroundColor, + backgroundColor: theme.TertiaryGroupedBackgroundColor, }, ]}> From 72ea0e111fccd99456abf3f974439432145585e3 Mon Sep 17 00:00:00 2001 From: Andrew Rahn Date: Sun, 24 Oct 2021 13:51:13 -0700 Subject: [PATCH 057/628] =?UTF-8?q?Hide=20the=20logbox=20window=20explicit?= =?UTF-8?q?ly.=20New=20behavior=20in=20iOS=20SDK=20appears=20to=E2=80=A6?= =?UTF-8?q?=20(#32435)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Fixes https://github.com/facebook/react-native/issues/32434: RCTLogBox window is orphaned, covering entire screen. After this change, the logbox window once again is removed from the screen. ## Changelog Some third-party SDKs may hold references to created UIWindow, UIViewController, or UIView objects. Doing so means that the current code's `hide` method that releases the reference to the UIWindow in LogBox will not cause the window to be dealloc'd, and thus instead it will remain on the screen. This change explicitly hides the LogBox window when the reference is released, so that even if some other SDK holds onto the window it will still be taken off the screen. [iOS] [Fixed] - 32434 Pull Request resolved: https://github.com/facebook/react-native/pull/32435 Test Plan: 1. Use console.warn to generate a yellow warning message in log box. Also install a third-party SDK that holds onto a reference to UIWindow -- for example the Facebook SDK, the Data Dog SDK, or any number of other SDKs that use `swizzling` to intercept calls like `viewDidAppear:`. 2. click the log 3. tap "dismiss" 4. try to tap anywhere 5. Use Xcode view debugger to inspect the UI state ## Expected The app still responds to the touch. In Xcode, there is not an extra UIWindow covering the screen Reviewed By: philIip Differential Revision: D31794242 Pulled By: sshic fbshipit-source-id: 28aa247b3ed3fd60b8e7c2ed7d0606cbf5c42408 --- React/CoreModules/RCTLogBox.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/React/CoreModules/RCTLogBox.mm b/React/CoreModules/RCTLogBox.mm index 141daf8214ca..0ddcb23f9412 100644 --- a/React/CoreModules/RCTLogBox.mm +++ b/React/CoreModules/RCTLogBox.mm @@ -72,6 +72,7 @@ + (BOOL)requiresMainQueueSetup if (!strongSelf) { return; } + [strongSelf->_view setHidden: YES]; strongSelf->_view = nil; }); } From 64711b0d984633c254e9b887ed035ebb211dac6f Mon Sep 17 00:00:00 2001 From: CodemodService FBSourceClangFormatLinterBot <> Date: Mon, 25 Oct 2021 04:06:45 -0700 Subject: [PATCH 058/628] Daily `arc lint --take CLANGFORMAT` Reviewed By: zertosh Differential Revision: D31891742 fbshipit-source-id: f6f6ad019e972de5acc8d04f0e8c8d9c9a2e3324 --- React/CoreModules/RCTLogBox.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/React/CoreModules/RCTLogBox.mm b/React/CoreModules/RCTLogBox.mm index 0ddcb23f9412..df21cd373302 100644 --- a/React/CoreModules/RCTLogBox.mm +++ b/React/CoreModules/RCTLogBox.mm @@ -72,7 +72,7 @@ + (BOOL)requiresMainQueueSetup if (!strongSelf) { return; } - [strongSelf->_view setHidden: YES]; + [strongSelf->_view setHidden:YES]; strongSelf->_view = nil; }); } From 055ea9c7b7dea030ef16da72d1f6ecb5d95ac468 Mon Sep 17 00:00:00 2001 From: Geraint White Date: Mon, 25 Oct 2021 08:10:23 -0700 Subject: [PATCH 059/628] Fix devDisabledInStaging not working with multiple productFlavors (#30606) Summary: Fixes https://github.com/facebook/react-native/issues/27052 Since react-native 0.62, the `devDisabledIn${buildType}` syntax has stopped working for apps with multiple `productFlavors`. This PR adds the `disableDevForVariant` lambda to allow dev mode to be disabled for different variants. ## Changelog [Android] [Fixed] - Fix devDisabledIn not working with multiple productFlavors Pull Request resolved: https://github.com/facebook/react-native/pull/30606 Test Plan: I added the following log into `react.gradle` and ran the Android build for my app: ``` println("devEnabled: ${targetName}, ${devEnabled}") ``` ``` # build.gradle project.ext.react = [ entryFile: "index.android.js", enableHermes: true, // clean and rebuild if changing bundleInLive: true, disableDevForVariant: { def variant -> variant.name.toLowerCase().contains('release') || variant.name.toLowerCase().contains('live') }, ] ... flavorDimensions 'branding' productFlavors { cve { dimension 'branding' } whce { dimension 'branding' } } ``` Console output: ``` Reading env from: env/cve/live devEnabled: CveDebug, true devEnabled: CveRelease, false devEnabled: CveLive, false devEnabled: WhceDebug, true devEnabled: WhceRelease, false devEnabled: WhceLive, false ``` Reviewed By: cortinico Differential Revision: D31649977 Pulled By: ShikaSD fbshipit-source-id: 520734314f4bca7608b8dca67c7c5ce0be6d31a5 --- .../src/main/kotlin/com/facebook/react/ReactExtension.kt | 8 ++++++++ .../main/kotlin/com/facebook/react/TaskConfiguration.kt | 2 +- react.gradle | 9 +++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt index c6c85ba26e57..0d582772ac64 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt @@ -114,6 +114,14 @@ abstract class ReactExtension @Inject constructor(project: Project) { val devDisabledInVariants: ListProperty = objects.listProperty(String::class.java).convention(emptyList()) + /** + * Functional interface to disable dev mode only on specific [BaseVariant] Default: will check + * [devDisabledInVariants] or return True for Release variants and False for Debug variants. + */ + var disableDevForVariant: (BaseVariant) -> Boolean = { variant -> + variant.name in devDisabledInVariants.get() || variant.isRelease + } + /** * Variant Name to Boolean map that allows to toggle the bundle command for a specific variant. * Default: {} diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt index b14b138cc72b..12700ec57247 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt @@ -64,7 +64,7 @@ internal fun Project.configureReactTasks(variant: BaseVariant, config: ReactExte } it.execCommand = execCommand it.bundleCommand = config.bundleCommand.get() - it.devEnabled = !(variant.name in config.devDisabledInVariants.get() || isRelease) + it.devEnabled = !config.disableDevForVariant(variant) it.entryFile = detectedEntryFile(config) val extraArgs = mutableListOf() diff --git a/react.gradle b/react.gradle index 528b7a0c36b1..d903659f7f0f 100644 --- a/react.gradle +++ b/react.gradle @@ -99,6 +99,12 @@ def hermesFlagsForVariant = config.hermesFlagsForVariant ?: { return hermesFlags } +// Set disableDevForVariant to a function to configure per variant, +// defaults to `devDisabledIn${targetName}` or True for Release variants and False for debug variants +def disableDevForVariant = config.disableDevForVariant ?: { + def variant -> config."devDisabledIn${variant.name.capitalize()}" || variant.name.toLowerCase().contains("release") +} + // Set deleteDebugFilesForVariant to a function to configure per variant, // defaults to True for Release variants and False for debug variants def deleteDebugFilesForVariant = config.deleteDebugFilesForVariant ?: { @@ -172,8 +178,7 @@ afterEvaluate { workingDir(reactRoot) // Set up dev mode - def devEnabled = !(config."devDisabledIn${targetName}" - || targetName.toLowerCase().contains("release")) + def devEnabled = !disableDevForVariant(variant) def extraArgs = [] From 2dda1cfc8e5ba3da9352323f18fd89d972493f5d Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Mon, 25 Oct 2021 10:47:11 -0700 Subject: [PATCH 060/628] Remove action to close upgrade-related issues Summary: Changelog: [Internal] Remove github action to close upgrade-related issues. We will be moving these issue to react-native repo and using this tag Reviewed By: cortinico Differential Revision: D31837195 fbshipit-source-id: 51fdd6efd88c0ebd5c504730406b217c8dbb3a88 --- .github/respond-to-issue-based-on-label.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/respond-to-issue-based-on-label.yml b/.github/respond-to-issue-based-on-label.yml index 65131ff0840d..57cc3eeb02a6 100644 --- a/.github/respond-to-issue-based-on-label.yml +++ b/.github/respond-to-issue-based-on-label.yml @@ -10,10 +10,6 @@ comment: > Please report documentation issues in the [`react-native-website`](https://github.com/facebook/react-native-website/issues) repository. close: true -"Type: Upgrade Issue": - comment: > - Do you need help upgrading to a newer React Native version? Visit the [Upgrade Support repository](https://github.com/react-native-community/upgrade-support) or use the [upgrade helper](https://react-native-community.github.io/upgrade-helper/) to see the changes that need to be made to upgrade your app. - close: true "Resolution: For Stack Overflow": comment: > We are using GitHub issues exclusively to track bugs in the core React Native library. Please try asking over on [Stack Overflow](http://stackoverflow.com/questions/tagged/react-native) as it is better suited for this type of question. From 0a73a6fd31b13fa9e25647731090a62418a3ce39 Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Mon, 25 Oct 2021 10:47:11 -0700 Subject: [PATCH 061/628] Fix issue form description Summary: Changelog: [Internal] - Fix github issue form description Reviewed By: cortinico Differential Revision: D31837196 fbshipit-source-id: 9ccdd0d1773add7f63b9ae8818b2a9364eb965d8 --- .github/ISSUE_TEMPLATE/upgrade-regression-form.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml b/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml index fc1276697393..985ec047e811 100644 --- a/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml +++ b/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml @@ -1,5 +1,5 @@ name: Upgrade Regression -description: If you are upgrading/upgraded to a [stable release](https://github.com/facebook/react-native/releases/latest) and encounter a regression. +description: If you are upgrading to a stable release and encounter a regression. labels: ["Needs: Triage :mag:", "Type: Upgrade Issue"] body: - type: markdown From 045462641510467e59bf4c54ddf64e722327b64d Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Mon, 25 Oct 2021 10:47:11 -0700 Subject: [PATCH 062/628] Remove link to outdated release docs Summary: Changelog: [Internal] - Remove link to outdated release docs Reviewed By: cortinico Differential Revision: D31837194 fbshipit-source-id: 9afad47e6d94d185d360af36776cd02a9b155650 --- Releases.md | 214 ------------------------------------- scripts/test-manual-e2e.sh | 2 +- 2 files changed, 1 insertion(+), 215 deletions(-) delete mode 100644 Releases.md diff --git a/Releases.md b/Releases.md deleted file mode 100644 index b76de5877ae9..000000000000 --- a/Releases.md +++ /dev/null @@ -1,214 +0,0 @@ -# Releases Guide - -This document serves as guide for release coordinators. You can find a list of releases and their release notes at https://github.com/facebook/react-native/releases - -## Release schedule - -React Native follows a monthly release train. Every month, a new branch created off `main` enters the Release Candidate phase, and the previous Release Candidate branch is released and considered stable. - - -| Version | RC release | Stable release | -| ------- | ------------------- | ---------------- | -| 0.38.0 | week of November 7 | November 21 | -| 0.39.0 | week of November 21 | December 2 | -| 0.40.0 | 1st of December | 1st of January | -| 0.41.0 | 1st of January | 1st of February | -| 0.42.0 | 1st of February | 1st of March | -| ... | ... | ... | -| 0.56.0 | 1st of June | 1st of July | -| 0.57.0 | 1st of July | 1st of August | -| 0.58.0 | 1st of August | 1st of September | -| ... | ... | ... | - -------------------- - -## How to cut a new release branch - -### Prerequisites - -The following are required for the local test suite to run: - -- macOS with [Android dev environment set up](https://github.com/facebook/react-native/blob/HEAD/ReactAndroid/README.md) -- [react-native-cli](https://www.npmjs.com/package/react-native-cli) installed globally (v0.2.0 or newer) - -### Step 1: Check everything works - -Before cutting a release branch, make sure [Circle](https://circleci.com/gh/facebook/react-native) CI system is green. - -Before executing the following script, make sure you have: - -- An Android emulator / Genymotion device running -- No packager running in any of the projects - -```bash -./scripts/test-manual-e2e.sh -``` - -This script bundles a react-native package locally and passes it to the `react-native` cli that creates a test project inside `/tmp` folder using that version. - -After `npm install` completes, the script prints a set of manual checks you have to do to ensure the release you are preparing is working as expected on both platforms. - -### Step 2: Cut a release branch and push to GitHub - -Run: - -```bash -git checkout -b -stable -# e.g. git checkout -b 0.57-stable - -./scripts/bump-oss-version.js -v -# e.g. ./scripts/bump-oss-version.js -v 0.57.0-rc.0 -# or ./scripts/bump-oss-version.js -v 0.58.0 -``` - -Circle CI will automatically run the tests and publish to npm with the version you have specified (e.g `0.57.0-rc.0`) and tag `next` meaning that this version will not be installed for users by default. - -### Step 3: Write the release notes - -Write the release notes, or post in [React Native Core Contributors](https://www.facebook.com/groups/reactnativeoss/) that the RC is ready to find a volunteer. You can also use [react-native-release-notes](https://github.com/knowbody/react-native-release-notes) to generate a draft of release notes. - -To go through all the commits that went into a release, one way is to use the GitHub compare view: - -``` -https://github.com/facebook/react-native/compare/0.49-stable...0.50-stable -``` - -**Note**: This only shows **250** commits, if there are more use git. - -When making a list of changes, ignore docs, showcase updates and minor typos. - -Sometimes commit messages might be really short / confusing - try rewording them where it makes sense. Below are few examples: - -- `Fix logging reported by RUN_JS_BUNDLE` -> `Fix systrace logging of RUN_JS_BUNDLE event` -- `Fixes hot code reloading issue` -> `Fix an edge case in hot module reloading` - -Open a pull request against CHANGELOG.md at https://github.com/react-native-community/react-native-releases and ask for feedback. - -Once everything is ready, create a new release at https://github.com/facebook/react-native/releases and link to the release notes. - -**Important**: For release candidate releases, make sure to check "This is a pre-release". - -### Step 4: Update `Breaking Changes` document - -Once the release is cut, go to the [page](https://github.com/facebook/react-native/wiki/Breaking-Changes) where all breaking changes are listed and create section for the release. Don't forget to move all breaking changes from `main` that are now part of the release. - -When finished and there are breaking changes, include them in the release notes you just created. - -### Step 5: Tweet about the RC release - -Tweet about it! Link to release notes and say "please report issues" and link to the main issue to track bugs you created. - -### Step 6: IMPORTANT: Track bug reports from the community during the following month, ping owners to get them fixed - -Now that the release is out in the open, go ahead and create a GitHub issue titled "[[0.XX-RC] Commits to cherry-pick](https://github.com/facebook/react-native/issues/14713)" where 0.XX matches the release version. Use this issue to track bugs that have been reported for this particular release, including commits that should be cherry-picked in cases that a fix cannot wait until the next release. - -------------------- - -## How to release an RC update (e.g. 0.57.0-rc.1, 0.57.0-rc.2) - -The release is now in the open, people are finding bugs, and fixes have landed in `main`. People have been nominating fixes in the issue you created above. Use your best judgment to decide which commits merit an RC update. It's a good idea to do a new RC release when several small and non-risky bugs have been fixed. Having a few RC releases can also help people bisect in case we cherry-pick a bad commit by mistake. - -**Only cherry-pick small and non-risky bug fixes**. **Don't pick new features into the release** as this greatly increases the risk of something breaking. The main point of the RC is to let people to use it for a month and fix the most serious bugs. - - -### Step 1: Check out the release branch - -Follow these steps to check out the release branch: - -```bash -git checkout -stable -# e.g. git checkout 0.57-stable - -git pull origin -stable -# e.g. git pull origin 0.57-stable -``` - -> If you don't have a local checkout of the release branch, you can run the following instead: -> `git checkout -b -stable -t origin/-stable` - -### Step 2: Cherry-pick commits - -Now, cherry-pick those commits: - -``` -git cherry-pick commitHash1 -``` - -### Step 3: IMPORTANT: Test everything again (Chrome debugging, Reload JS, Hot Module Reloading) - -Go through the same process as earlier to test the release: - -``` -./scripts/test-manual-e2e.sh -``` - -### Step 4: Bump the version number - -If everything worked, run the following to bump the version number: - -```bash -./scripts/bump-oss-version.js -v -# e.g. ./scripts/bump-oss-version.js -v 0.57.0-rc.1 -``` - -Again, Circle CI will automatically run the tests and publish to npm with the version you have specified (e.g `0.57.0-rc.1`). - -### Step 5: Update the release notes - -Go to https://github.com/facebook/react-native/releases and find the release notes for this release candidate. Edit them so that they now point to the tag that you've just created. We want single release notes per version. For example, if there is v0.57.0-rc and you just released v0.57.0-rc.1, the release notes should live on the v0.57.0-rc.1 tag at https://github.com/facebook/react-native/tags - -------------------- - -## How to do the final stable release (e.g. 0.57.0, 0.57.1) - -A stable release is promoted roughly a month after the release branch is cut (refer to the schedule above). The release may be delayed for several reasons, including major issues in the release candidate. Make sure that all bug fixes that have been nominated in your tracking issue have been addressed as needed. Avoid cherry-picking commits that have not been vetted in the release candidate phase at this point. - -Once you are sure that the release is solid, perform the following steps. Note that they're similar to the steps you may have followed earlier when patching the release candidate, but we're not cherry-picking any additional commits at this point. - -### Step 1: Check out the release branch - -```bash -git checkout -stable -# e.g. git checkout 0.57-stable - -git pull origin -stable -# e.g. git pull origin 0.57-stable -``` - -> If you don't have a local checkout of the release branch, you can run the following instead: -> `git checkout -b -stable -t origin/-stable` - -### Step 2: IMPORTANT: Test everything again (Chrome debugging, Reload JS, Hot Module Reloading) - -It's **important** to test everything again: you don't want to cut a release with a major blocking issue! - -``` -./scripts/test-manual-e2e.sh -``` - -### Step 3: Bump the version number - -If everything worked: - -```bash -./scripts/bump-oss-version.js -v -# e.g. ./scripts/bump-oss-version.js -v 0.57.0 -``` - -As with the release candidate, Circle CI will automatically run the tests and publish to npm with the version you have specified (e.g `0.57.0`). - -Go to [Circle CI](https://circleci.com/gh/facebook/react-native) and look for the build triggered by your push (e.g. _0.57-stable, [0.57.0] Bump version numbers_), then scroll down to the npm publish step to verify the package was published successfully (the build will be red if not). - -This will now become the latest release, and will be installed by users by default. At this point, the website will be updated and the docs for this release will be displayed by default. - -### Step 4: Update the release notes - -Go to https://github.com/facebook/react-native/releases and find the release notes for this release candidate. Edit them so that they now point to the tag that you've just created. We want single release notes per version. For example, if there is v0.57.0 and you just released v0.57.1, the release notes should live on the v0.57.1 tag at https://github.com/facebook/react-native/tags - -For non-RC releases: Uncheck the box "This is a pre-release" and publish the notes. - -### Supporting the release - -Sometimes things don't go well and a major issue is missed during the release candidate phase. If a fix cannot wait until the next release is cut, it may be necessary to cherry-pick it into the current stable release. Go back to your `[0.XX-RC] Commits to cherry-pick` issue and rename it to `[0.XX] Commits to cherry-pick`, then add a comment stating that any cherry-pick requests from then on will be applied to the stable release. - -**The same guidelines for RC cherry-picks apply here. If anything, the bar for cherry-picking into a stable release is higher.** Stick to commits that fix blocking issues. Examples may be RedBoxes on newly generated projects, broken upgrade flows with no workaround, or bugs affecting the compiling and/or building of projects. diff --git a/scripts/test-manual-e2e.sh b/scripts/test-manual-e2e.sh index 137d4c66f9c1..26c628935c80 100755 --- a/scripts/test-manual-e2e.sh +++ b/scripts/test-manual-e2e.sh @@ -149,4 +149,4 @@ open "/tmp/${project_name}/ios/${project_name}.xcworkspace" cd "$repo_root" || exit info "Next steps:" -info " - https://github.com/facebook/react-native/blob/HEAD/Releases.md" +info "https://github.com/facebook/react-native/wiki/Release-Process" From 03a0907868171253691d595fe09bee87caa5e2b1 Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Mon, 25 Oct 2021 11:32:27 -0700 Subject: [PATCH 063/628] Add back Xcode_12_5_M1_post_install_workaround Summary: Changelog: [Internal] Add back Xcode_12_5_M1_post_install_workaround workaround Reviewed By: sota000 Differential Revision: D31902449 fbshipit-source-id: 5c9d962d0d1a55a9f14186bd7d6d8fe087101f0d --- packages/rn-tester/Podfile | 1 + scripts/react_native_pods.rb | 17 ++++++++++++++--- template/ios/Podfile | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/rn-tester/Podfile b/packages/rn-tester/Podfile index 88d94344f2ff..a6902753aea6 100644 --- a/packages/rn-tester/Podfile +++ b/packages/rn-tester/Podfile @@ -52,4 +52,5 @@ end post_install do |installer| react_native_post_install(installer) + __apply_Xcode_12_5_M1_post_install_workaround(installer) end diff --git a/scripts/react_native_pods.rb b/scripts/react_native_pods.rb index 348b45f4c357..fc20c3ae0161 100644 --- a/scripts/react_native_pods.rb +++ b/scripts/react_native_pods.rb @@ -435,8 +435,19 @@ def use_react_native_codegen!(spec, options={}) # See https://github.com/facebook/react-native/issues/31480#issuecomment-902912841 for more context. # Actual fix was authored by https://github.com/mikehardy. # New app template will call this for now until the underlying issue is resolved. -# -# It's not needed anymore and will be removed later def __apply_Xcode_12_5_M1_post_install_workaround(installer) - puts "__apply_Xcode_12_5_M1_post_install_workaround() is not needed anymore" + # Flipper podspecs are still targeting an older iOS deployment target, and may cause an error like: + # "error: thread-local storage is not supported for the current target" + # The most reliable known workaround is to bump iOS deployment target to match react-native (iOS 11 now). + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' + end + end + + # But... doing so caused another issue in Flipper: + # "Time.h:52:17: error: typedef redefinition with different types" + # We need to make a patch to RCT-Folly - set `__IPHONE_10_0` to our iOS target + 1. + # See https://github.com/facebook/flipper/issues/834 for more details. + `sed -i -e $'s/__IPHONE_10_0/__IPHONE_12_0/' Pods/RCT-Folly/folly/portability/Time.h` end diff --git a/template/ios/Podfile b/template/ios/Podfile index 65d5ffcbfcf4..9409747f9178 100644 --- a/template/ios/Podfile +++ b/template/ios/Podfile @@ -25,5 +25,6 @@ target 'HelloWorld' do post_install do |installer| react_native_post_install(installer) + __apply_Xcode_12_5_M1_post_install_workaround(installer) end end From 8b56522013047ca94c4a03c81c8dd308a52e1653 Mon Sep 17 00:00:00 2001 From: Sota Ogo Date: Mon, 25 Oct 2021 11:38:24 -0700 Subject: [PATCH 064/628] Accept "Library Type" in generate-specs-cli.js Summary: Currently, some filtering of generated files are done in multiple places (e.g. generate-specs-cli.js, react_native_pods.rb, etc). I am introducing this arguments so that only needed files are generated for components and modules. Changelog: [internal] Reviewed By: hramos, cortinico Differential Revision: D31878098 fbshipit-source-id: d2dc8f51ea14a5d0ba1548bd481814220c9ae3a2 --- scripts/generate-specs-cli.js | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/scripts/generate-specs-cli.js b/scripts/generate-specs-cli.js index 1c008d6fb6f1..0446d9f4eb80 100644 --- a/scripts/generate-specs-cli.js +++ b/scripts/generate-specs-cli.js @@ -24,8 +24,18 @@ const mkdirp = require('mkdirp'); const path = require('path'); const GENERATORS = { - android: ['componentsAndroid', 'modulesAndroid'], - ios: ['componentsIOS', 'modulesIOS'], + all: { + android: ['componentsAndroid', 'modulesAndroid'], + ios: ['componentsIOS', 'modulesIOS'], + }, + components: { + android: ['componentsAndroid'], + ios: ['componentsIOS'], + }, + modules: { + android: ['modulesAndroid'], + ios: ['modulesIOS'], + }, }; function generateSpec( @@ -34,6 +44,7 @@ function generateSpec( outputDirectory, libraryName, packageName, + libraryType, ) { const schemaText = fs.readFileSync(schemaPath, 'utf-8'); @@ -53,6 +64,10 @@ function generateSpec( throw new Error(`Can't parse schema to JSON. ${schemaPath}`); } + if (GENERATORS[libraryType] == null) { + throw new Error(`Invalid library type. ${libraryType}`); + } + RNCodegen.generate( { libraryName, @@ -61,7 +76,7 @@ function generateSpec( packageName, }, { - generators: GENERATORS[platform], + generators: GENERATORS[libraryType][platform], }, ); @@ -106,7 +121,15 @@ function main() { const outputDir = args[2]; const libraryName = args[3] || 'FBReactNativeSpec'; const javaPackageName = args[4] || 'com.facebook.fbreact.specs'; - generateSpec(platform, schemaPath, outputDir, libraryName, javaPackageName); + const libraryType = args[5] || 'all'; // all, components, or modules + generateSpec( + platform, + schemaPath, + outputDir, + libraryName, + javaPackageName, + libraryType, + ); } main(); From 016aef612c254d3a815825f48886667254ca9253 Mon Sep 17 00:00:00 2001 From: Juan Tejada Date: Mon, 25 Oct 2021 13:59:06 -0700 Subject: [PATCH 065/628] Update React DevTools v4.20.2 Summary: Update `react-devtools-core` and `react-devtools` dependencies for RN, VSCode, Flipper, etc. `js1 upgrade react-devtools -v 4.20.2` # Changelog: [General][Changed] - Upgraded react-devtools-core dependency to 4.20.2 Reviewed By: lunaruan Differential Revision: D31809278 fbshipit-source-id: 0360fe173cfc7ce09595e6db4e8e41c6f64becd7 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 471bc19152b1..c3c5e4c803cf 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "pretty-format": "^26.5.2", "promise": "^8.0.3", "prop-types": "^15.7.2", - "react-devtools-core": "4.20.1", + "react-devtools-core": "4.20.2", "react-refresh": "^0.4.0", "regenerator-runtime": "^0.13.2", "scheduler": "^0.20.2", diff --git a/yarn.lock b/yarn.lock index 285e0f30f2cb..38a23b3a06aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5563,10 +5563,10 @@ range-parser@~1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= -react-devtools-core@4.20.1: - version "4.20.1" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.20.1.tgz#77e8aacd93ca34cf908c11e6c72151b79217b618" - integrity sha512-HBcLfLi2R6VxlWFF2i5lONYlr3KLh324RPFeApZ3G6GGaJrcS/qtk9M/iESw7fRTlgPHEg+A4j6e1j9oXpvi5w== +react-devtools-core@4.20.2: + version "4.20.2" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.20.2.tgz#0be500c80e09b640a2ee57f5ad5407e53bff6651" + integrity sha512-ep2j84M1ZtDFWsTtFrKyLyg4GEbnw4gFj/8brA+BZtsINgKHhWEVzscz5E/bFWRdyTM8mWdcaKQAk2hR+IezPw== dependencies: shell-quote "^1.6.1" ws "^7" From 65af5eba9cc43a98a904ed7686c6111e8f3c4ce6 Mon Sep 17 00:00:00 2001 From: Sota Ogo Date: Mon, 25 Oct 2021 14:51:00 -0700 Subject: [PATCH 066/628] Add a check for library_type Summary: Adding an error check to make debugging easier when codegen fails when invalid library_type option is passed. Changelog: [internal] Reviewed By: hramos Differential Revision: D31907880 fbshipit-source-id: c1ffa6bbd7b3e4faede88da2ee8d3378fa086780 --- scripts/react_native_pods.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/react_native_pods.rb b/scripts/react_native_pods.rb index fc20c3ae0161..2e6117ca3f51 100644 --- a/scripts/react_native_pods.rb +++ b/scripts/react_native_pods.rb @@ -294,6 +294,9 @@ def use_react_native_codegen!(spec, options={}) library_type = options[:library_type] if library_type + if !codegen_config[library_type] + raise "[Codegen] invalid library_type: #{library_type}. Check your podspec to make sure it's set to 'modules' or 'components'. Removing the option will generate files for both" + end js_srcs_pattern = codegen_config[library_type][:js_srcs_pattern] end From b2415c48669391ee1ab7c6450748c4d91097a666 Mon Sep 17 00:00:00 2001 From: Andrew Scherkus Date: Mon, 25 Oct 2021 19:44:28 -0700 Subject: [PATCH 067/628] Update XMLHttpRequest.getAllResponseHeaders() implementation (#32353) (#32363) Summary: As per the XMLHttpRequest specification [1], getAllResponseHeaders() should return a string of headers with lowercased names and sorted by their uppercase representation, with each header ending with '\r\n'. [1] https://xhr.spec.whatwg.org/#the-getallresponseheaders()-method ## Changelog [General] [Changed] XMLHttpRequest.getAllResponseHeaders() now returns headers with names lowercased and sorted in ascending order, as per specification Pull Request resolved: https://github.com/facebook/react-native/pull/32363 Test Plan: Test derived from Web Platform Test repository: https://github.com/web-platform-tests/wpt/tree/master/xhr Reviewed By: yungsters Differential Revision: D31626217 Pulled By: sota000 fbshipit-source-id: 299d005facbe1c15b8cda5eed6750db75addca80 --- Libraries/Network/XMLHttpRequest.js | 49 ++++++++++++++++--- .../Network/__tests__/XMLHttpRequest-test.js | 20 +++++++- 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/Libraries/Network/XMLHttpRequest.js b/Libraries/Network/XMLHttpRequest.js index c12888f087a1..083e0abadfe6 100644 --- a/Libraries/Network/XMLHttpRequest.js +++ b/Libraries/Network/XMLHttpRequest.js @@ -423,12 +423,49 @@ class XMLHttpRequest extends (EventTarget(...XHR_EVENTS): any) { // according to the spec, return null if no response has been received return null; } - const headers = this.responseHeaders || {}; - return Object.keys(headers) - .map(headerName => { - return headerName + ': ' + headers[headerName]; - }) - .join('\r\n'); + + // Assign to non-nullable local variable. + const responseHeaders = this.responseHeaders; + + const unsortedHeaders: Map< + string, + {lowerHeaderName: string, upperHeaderName: string, headerValue: string}, + > = new Map(); + for (const rawHeaderName of Object.keys(responseHeaders)) { + const headerValue = responseHeaders[rawHeaderName]; + const lowerHeaderName = rawHeaderName.toLowerCase(); + const header = unsortedHeaders.get(lowerHeaderName); + if (header) { + header.headerValue += ', ' + headerValue; + unsortedHeaders.set(lowerHeaderName, header); + } else { + unsortedHeaders.set(lowerHeaderName, { + lowerHeaderName, + upperHeaderName: rawHeaderName.toUpperCase(), + headerValue, + }); + } + } + + // Sort in ascending order, with a being less than b if a's name is legacy-uppercased-byte less than b's name. + const sortedHeaders = [...unsortedHeaders.values()].sort((a, b) => { + if (a.upperHeaderName < b.upperHeaderName) { + return -1; + } + if (a.upperHeaderName > b.upperHeaderName) { + return 1; + } + return 0; + }); + + // Combine into single text response. + return ( + sortedHeaders + .map(header => { + return header.lowerHeaderName + ': ' + header.headerValue; + }) + .join('\r\n') + '\r\n' + ); } getResponseHeader(header: string): ?string { diff --git a/Libraries/Network/__tests__/XMLHttpRequest-test.js b/Libraries/Network/__tests__/XMLHttpRequest-test.js index 91d2ce1e252c..f769d356f788 100644 --- a/Libraries/Network/__tests__/XMLHttpRequest-test.js +++ b/Libraries/Network/__tests__/XMLHttpRequest-test.js @@ -241,7 +241,7 @@ describe('XMLHttpRequest', function() { }); expect(xhr.getAllResponseHeaders()).toBe( - 'Content-Type: text/plain; charset=utf-8\r\n' + 'Content-Length: 32', + 'content-length: 32\r\n' + 'content-type: text/plain; charset=utf-8\r\n', ); }); @@ -292,4 +292,22 @@ describe('XMLHttpRequest', function() { ); expect(GlobalPerformanceLogger.stopTimespan).not.toHaveBeenCalled(); }); + + it('should sort and lowercase response headers', function() { + // Derived from XHR Web Platform Test: https://github.com/web-platform-tests/wpt/blob/master/xhr/getallresponseheaders.htm + xhr.open('GET', 'blabla'); + xhr.send(); + setRequestId(10); + xhr.__didReceiveResponse(requestId, 200, { + 'foo-TEST': '1', + 'FOO-test': '2', + __Custom: 'token', + 'ALSO-here': 'Mr. PB', + ewok: 'lego', + }); + + expect(xhr.getAllResponseHeaders()).toBe( + 'also-here: Mr. PB\r\newok: lego\r\nfoo-test: 1, 2\r\n__custom: token\r\n', + ); + }); }); From 1b30dd074b579c2ae138a1111d07ddb56761315d Mon Sep 17 00:00:00 2001 From: Saad Najmi Date: Mon, 25 Oct 2021 19:46:10 -0700 Subject: [PATCH 068/628] Expose Pressability Hover config props in Pressable (#32405) Summary: Several desktop forks (`react-native-macos`, `react-native-windows`, `react-native-web`) support mouse events, and while the stock Pressable component has the ability to support mouse events, it seems we aren't forwarding some props properly from Pressable -> Pressability. Pressability will calculate onMouseEnter / onMouseLeave event handlers based on the `onHoverIn/onHoverOut` callbacks passed into PressabilityConfig. https://github.com/facebook/react-native/blob/ad0d4534a751ed05f84ff971714c8f7a4d1deb3a/Libraries/Pressability/Pressability.js#L552 However, Pressable does not pass take in onHoverIn/onHoverOut props to pass to PressabilityConfig, so we can't take advantage of this functionality. This change should simply address that by passing the props through. ## Changelog [General] [Fixed] - Pressabel not passing hover props and event handlers to PressabilityConfig Pull Request resolved: https://github.com/facebook/react-native/pull/32405 Test Plan: I fixed a similar issue in `react-native-macos` that I am now trying to contribute back upstream. https://github.com/microsoft/react-native-macos/pull/855 Reviewed By: yungsters Differential Revision: D31667737 Pulled By: sota000 fbshipit-source-id: f0bbe48302703bb2c45280d2afeec8d7a4586b6a --- Libraries/Components/Pressable/Pressable.js | 38 ++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/Libraries/Components/Pressable/Pressable.js b/Libraries/Components/Pressable/Pressable.js index d8dc1e1d619b..6f1e6001cfec 100644 --- a/Libraries/Components/Pressable/Pressable.js +++ b/Libraries/Components/Pressable/Pressable.js @@ -23,7 +23,11 @@ import type { import {PressabilityDebugView} from '../../Pressability/PressabilityDebug'; import usePressability from '../../Pressability/usePressability'; import {normalizeRect, type RectOrSize} from '../../StyleSheet/Rect'; -import type {LayoutEvent, PressEvent} from '../../Types/CoreEventTypes'; +import type { + LayoutEvent, + MouseEvent, + PressEvent, +} from '../../Types/CoreEventTypes'; import View from '../View/View'; type ViewStyleProp = $ElementType, 'style'>; @@ -63,6 +67,16 @@ type Props = $ReadOnly<{| */ children: React.Node | ((state: StateCallbackType) => React.Node), + /** + * Duration to wait after hover in before calling `onHoverIn`. + */ + delayHoverIn?: ?number, + + /** + * Duration to wait after hover out before calling `onHoverOut`. + */ + delayHoverOut?: ?number, + /** * Duration (in milliseconds) from `onPressIn` before `onLongPress` is called. */ @@ -89,6 +103,16 @@ type Props = $ReadOnly<{| */ onLayout?: ?(event: LayoutEvent) => mixed, + /** + * Called when the hover is activated to provide visual feedback. + */ + onHoverIn?: ?(event: MouseEvent) => mixed, + + /** + * Called when the hover is deactivated to undo visual feedback. + */ + onHoverOut?: ?(event: MouseEvent) => mixed, + /** * Called when a long-tap gesture is detected. */ @@ -152,9 +176,13 @@ function Pressable(props: Props, forwardedRef): React.Node { android_ripple, cancelable, children, + delayHoverIn, + delayHoverOut, delayLongPress, disabled, focusable, + onHoverIn, + onHoverOut, onLongPress, onPress, onPressIn, @@ -196,8 +224,12 @@ function Pressable(props: Props, forwardedRef): React.Node { hitSlop, pressRectOffset: pressRetentionOffset, android_disableSound, + delayHoverIn, + delayHoverOut, delayLongPress, delayPressIn: unstable_pressDelay, + onHoverIn, + onHoverOut, onLongPress, onPress, onPressIn(event: PressEvent): void { @@ -224,9 +256,13 @@ function Pressable(props: Props, forwardedRef): React.Node { android_disableSound, android_rippleConfig, cancelable, + delayHoverIn, + delayHoverOut, delayLongPress, disabled, hitSlop, + onHoverIn, + onHoverOut, onLongPress, onPress, onPressIn, From f7e4c07c84b636fc33c64b434964c8a64c43438f Mon Sep 17 00:00:00 2001 From: Sota Ogo Date: Mon, 25 Oct 2021 20:47:13 -0700 Subject: [PATCH 069/628] Move codegen output out of node_modules Summary: In this diff, it moves the codegen output location out of node_modules and to build/generated/ios folder. A temp pod spec will be created so that those files will be included in the Xcode project. Changelog: [Internal] Reviewed By: hramos, cortinico Differential Revision: D31809012 fbshipit-source-id: ba1c884c8024306ba0fd2102837b7dbebc6e18ac --- Libraries/Blob/React-RCTBlob.podspec | 4 +- Libraries/Image/React-RCTImage.podspec | 4 +- Libraries/LinkingIOS/React-RCTLinking.podspec | 4 +- .../React-RCTAnimation.podspec | 4 +- Libraries/Network/React-RCTNetwork.podspec | 4 +- .../React-RCTPushNotification.podspec | 4 +- Libraries/Settings/React-RCTSettings.podspec | 4 +- .../Vibration/React-RCTVibration.podspec | 4 +- React/CoreModules/React-CoreModules.podspec | 4 +- .../FBReactNativeSpec.podspec | 3 +- React/React-RCTFabric.podspec | 2 +- ReactCommon/React-Fabric.podspec | 10 --- .../ScreenshotManager.podspec | 1 - packages/rn-tester/Podfile | 4 ++ packages/rn-tester/Podfile.lock | 69 ++++++++++--------- scripts/generate-specs-cli.js | 18 ----- scripts/react_native_pods.rb | 49 +++++++++---- 17 files changed, 98 insertions(+), 94 deletions(-) diff --git a/Libraries/Blob/React-RCTBlob.podspec b/Libraries/Blob/React-RCTBlob.podspec index 8a7d469eac99..84752a84c0af 100644 --- a/Libraries/Blob/React-RCTBlob.podspec +++ b/Libraries/Blob/React-RCTBlob.podspec @@ -35,11 +35,11 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => "c++14", - "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\"" + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"" } s.dependency "RCT-Folly", folly_version - s.dependency "FBReactNativeSpec", version + s.dependency "React-Codegen", version s.dependency "ReactCommon/turbomodule/core", version s.dependency "React-jsi", version s.dependency "React-Core/RCTBlobHeaders", version diff --git a/Libraries/Image/React-RCTImage.podspec b/Libraries/Image/React-RCTImage.podspec index a3d6622cb970..d7c4a313ad10 100644 --- a/Libraries/Image/React-RCTImage.podspec +++ b/Libraries/Image/React-RCTImage.podspec @@ -36,11 +36,11 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => "c++14", - "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\"" + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"" } s.dependency "RCT-Folly", folly_version - s.dependency "FBReactNativeSpec", version + s.dependency "React-Codegen", version s.dependency "RCTTypeSafety", version s.dependency "ReactCommon/turbomodule/core", version s.dependency "React-jsi", version diff --git a/Libraries/LinkingIOS/React-RCTLinking.podspec b/Libraries/LinkingIOS/React-RCTLinking.podspec index 48877f4acefe..0b3c66b95904 100644 --- a/Libraries/LinkingIOS/React-RCTLinking.podspec +++ b/Libraries/LinkingIOS/React-RCTLinking.podspec @@ -36,10 +36,10 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => "c++14", - "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\"" + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"" } - s.dependency "FBReactNativeSpec", version + s.dependency "React-Codegen", version s.dependency "React-Core/RCTLinkingHeaders", version s.dependency "ReactCommon/turbomodule/core", version s.dependency "React-jsi", version diff --git a/Libraries/NativeAnimation/React-RCTAnimation.podspec b/Libraries/NativeAnimation/React-RCTAnimation.podspec index 1aa5ae78a8aa..341135bce562 100644 --- a/Libraries/NativeAnimation/React-RCTAnimation.podspec +++ b/Libraries/NativeAnimation/React-RCTAnimation.podspec @@ -35,11 +35,11 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => "c++14", - "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\"" + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"" } s.dependency "RCT-Folly", folly_version - s.dependency "FBReactNativeSpec", version + s.dependency "React-Codegen", version s.dependency "RCTTypeSafety", version s.dependency "ReactCommon/turbomodule/core", version s.dependency "React-jsi", version diff --git a/Libraries/Network/React-RCTNetwork.podspec b/Libraries/Network/React-RCTNetwork.podspec index fccf5b0fbf9b..a80dc2cb553a 100644 --- a/Libraries/Network/React-RCTNetwork.podspec +++ b/Libraries/Network/React-RCTNetwork.podspec @@ -35,12 +35,12 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => "c++14", - "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\"" + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"" } s.frameworks = "MobileCoreServices" s.dependency "RCT-Folly", folly_version - s.dependency "FBReactNativeSpec", version + s.dependency "React-Codegen", version s.dependency "RCTTypeSafety", version s.dependency "ReactCommon/turbomodule/core", version s.dependency "React-jsi", version diff --git a/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec b/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec index 238d0ab95148..32940e48f23c 100644 --- a/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec +++ b/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec @@ -36,11 +36,11 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => "c++14", - "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\"" + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"" } s.framework = "UserNotifications" - s.dependency "FBReactNativeSpec", version + s.dependency "React-Codegen", version s.dependency "RCTTypeSafety", version s.dependency "React-Core/RCTPushNotificationHeaders", version s.dependency "ReactCommon/turbomodule/core", version diff --git a/Libraries/Settings/React-RCTSettings.podspec b/Libraries/Settings/React-RCTSettings.podspec index 532ba10ee2b9..c6856e9367ba 100644 --- a/Libraries/Settings/React-RCTSettings.podspec +++ b/Libraries/Settings/React-RCTSettings.podspec @@ -36,11 +36,11 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => "c++14", - "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\"" + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"" } s.dependency "RCT-Folly", folly_version - s.dependency "FBReactNativeSpec", version + s.dependency "React-Codegen", version s.dependency "RCTTypeSafety", version s.dependency "ReactCommon/turbomodule/core", version s.dependency "React-jsi", version diff --git a/Libraries/Vibration/React-RCTVibration.podspec b/Libraries/Vibration/React-RCTVibration.podspec index ed4ecf46b62b..f2f56d2f50b5 100644 --- a/Libraries/Vibration/React-RCTVibration.podspec +++ b/Libraries/Vibration/React-RCTVibration.podspec @@ -36,12 +36,12 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => "c++14", - "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\"" + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"" } s.frameworks = "AudioToolbox" s.dependency "RCT-Folly", folly_version - s.dependency "FBReactNativeSpec", version + s.dependency "React-Codegen", version s.dependency "ReactCommon/turbomodule/core", version s.dependency "React-jsi", version s.dependency "React-Core/RCTVibrationHeaders", version diff --git a/React/CoreModules/React-CoreModules.podspec b/React/CoreModules/React-CoreModules.podspec index fa3bc3a106a8..f10c7e3ccc71 100644 --- a/React/CoreModules/React-CoreModules.podspec +++ b/React/CoreModules/React-CoreModules.podspec @@ -34,10 +34,10 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => "c++14", - "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/React/CoreModules\" \"$(PODS_ROOT)/RCT-Folly\"" + "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/React/CoreModules\" \"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"" } - s.dependency "FBReactNativeSpec", version + s.dependency "React-Codegen", version s.dependency "RCT-Folly", folly_version s.dependency "RCTTypeSafety", version s.dependency "React-Core/CoreModulesHeaders", version diff --git a/React/FBReactNativeSpec/FBReactNativeSpec.podspec b/React/FBReactNativeSpec/FBReactNativeSpec.podspec index 55e45fbbb9d2..efea7393b5bd 100644 --- a/React/FBReactNativeSpec/FBReactNativeSpec.podspec +++ b/React/FBReactNativeSpec/FBReactNativeSpec.podspec @@ -38,7 +38,7 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => "c++14", - "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/React/FBReactNativeSpec\" \"$(PODS_ROOT)/RCT-Folly\"" + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\"" } s.dependency "RCT-Folly", folly_version @@ -53,6 +53,5 @@ Pod::Spec.new do |s| :js_srcs_dir => "#{react_native_path}/Libraries", :library_name => "FBReactNativeSpec", :library_type => "modules", - :output_dir => "#{react_native_path}/React/FBReactNativeSpec/FBReactNativeSpec" }) end diff --git a/React/React-RCTFabric.podspec b/React/React-RCTFabric.podspec index 21352e308a11..bf587ae6cf74 100644 --- a/React/React-RCTFabric.podspec +++ b/React/React-RCTFabric.podspec @@ -37,7 +37,7 @@ Pod::Spec.new do |s| s.header_dir = "React" s.framework = "JavaScriptCore" s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ReactCommon\" \"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/DoubleConversion\" \"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/Headers/Private/React-Core\"" } - s.xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/glog\" \"$(PODS_ROOT)/RCT-Folly\"", + s.xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/glog\" \"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/React-Codegen\"", "OTHER_CFLAGS" => "$(inherited) -DRN_FABRIC_ENABLED" + " " + folly_flags } s.dependency "React-Core", version diff --git a/ReactCommon/React-Fabric.podspec b/ReactCommon/React-Fabric.podspec index 742040c57d40..dabe83199d92 100644 --- a/ReactCommon/React-Fabric.podspec +++ b/ReactCommon/React-Fabric.podspec @@ -147,15 +147,6 @@ Pod::Spec.new do |s| sss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ReactCommon\" \"$(PODS_ROOT)/RCT-Folly\"" } end - ss.subspec "rncore" do |sss| - sss.dependency folly_dep_name, folly_version - sss.compiler_flags = folly_compiler_flags - sss.source_files = "react/renderer/components/rncore/**/*.{m,mm,cpp,h}" - sss.exclude_files = "react/renderer/components/rncore/tests" - sss.header_dir = "react/renderer/components/rncore" - sss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ReactCommon\" \"$(PODS_ROOT)/RCT-Folly\"" } - end - ss.subspec "root" do |sss| sss.dependency folly_dep_name, folly_version sss.compiler_flags = folly_compiler_flags @@ -347,6 +338,5 @@ Pod::Spec.new do |s| :js_srcs_dir => "#{react_native_path}/Libraries", :library_name => "rncore", :library_type => "components", - :output_dir => "#{react_native_path}/ReactCommon", }) end diff --git a/packages/rn-tester/NativeModuleExample/ScreenshotManager.podspec b/packages/rn-tester/NativeModuleExample/ScreenshotManager.podspec index 8938ea987de3..9d1b4cbf36b0 100644 --- a/packages/rn-tester/NativeModuleExample/ScreenshotManager.podspec +++ b/packages/rn-tester/NativeModuleExample/ScreenshotManager.podspec @@ -35,6 +35,5 @@ Pod::Spec.new do |s| :react_native_path => "../../..", :js_srcs_dir => "./", :library_type => "modules", - :output_dir => "./" }) end diff --git a/packages/rn-tester/Podfile b/packages/rn-tester/Podfile index a6902753aea6..2dc16c00437d 100644 --- a/packages/rn-tester/Podfile +++ b/packages/rn-tester/Podfile @@ -3,6 +3,10 @@ require_relative '../../scripts/react_native_pods' source 'https://cdn.cocoapods.org/' platform :ios, '11.0' +# Temporary solution to suppress duplicated GUID error. +# Can be removed once we move to generate files outside pod install. +install! 'cocoapods', :deterministic_uuids => false + USE_FRAMEWORKS = ENV['USE_FRAMEWORKS'] == '1' if USE_FRAMEWORKS diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index afdcd457dd4f..cde836884a90 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -110,6 +110,16 @@ PODS: - React-RCTText (= 1000.0.0) - React-RCTVibration (= 1000.0.0) - React-callinvoker (1000.0.0) + - React-Codegen (1000.0.0): + - FBReactNativeSpec (= 1000.0.0) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 1000.0.0) + - RCTTypeSafety (= 1000.0.0) + - React-Core (= 1000.0.0) + - React-graphics (= 1000.0.0) + - React-jsi (= 1000.0.0) + - React-jsiexecutor (= 1000.0.0) + - ReactCommon/turbomodule/core (= 1000.0.0) - React-Core (1000.0.0): - glog - RCT-Folly (= 2021.06.28.00-v2) @@ -247,9 +257,9 @@ PODS: - React-perflogger (= 1000.0.0) - Yoga - React-CoreModules (1000.0.0): - - FBReactNativeSpec (= 1000.0.0) - RCT-Folly (= 2021.06.28.00-v2) - RCTTypeSafety (= 1000.0.0) + - React-Codegen (= 1000.0.0) - React-Core/CoreModulesHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - React-RCTImage (= 1000.0.0) @@ -342,7 +352,6 @@ PODS: - React-Fabric/components/inputaccessory (= 1000.0.0) - React-Fabric/components/legacyviewmanagerinterop (= 1000.0.0) - React-Fabric/components/modal (= 1000.0.0) - - React-Fabric/components/rncore (= 1000.0.0) - React-Fabric/components/root (= 1000.0.0) - React-Fabric/components/safeareaview (= 1000.0.0) - React-Fabric/components/scrollview (= 1000.0.0) @@ -395,14 +404,6 @@ PODS: - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) - ReactCommon/turbomodule/core (= 1000.0.0) - - React-Fabric/components/rncore (1000.0.0): - - RCT-Folly/Fabric (= 2021.06.28.00-v2) - - RCTRequired (= 1000.0.0) - - RCTTypeSafety (= 1000.0.0) - - React-graphics (= 1000.0.0) - - React-jsi (= 1000.0.0) - - React-jsiexecutor (= 1000.0.0) - - ReactCommon/turbomodule/core (= 1000.0.0) - React-Fabric/components/root (1000.0.0): - RCT-Folly/Fabric (= 2021.06.28.00-v2) - RCTRequired (= 1000.0.0) @@ -615,15 +616,15 @@ PODS: - React-RCTActionSheet (1000.0.0): - React-Core/RCTActionSheetHeaders (= 1000.0.0) - React-RCTAnimation (1000.0.0): - - FBReactNativeSpec (= 1000.0.0) - RCT-Folly (= 2021.06.28.00-v2) - RCTTypeSafety (= 1000.0.0) + - React-Codegen (= 1000.0.0) - React-Core/RCTAnimationHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - ReactCommon/turbomodule/core (= 1000.0.0) - React-RCTBlob (1000.0.0): - - FBReactNativeSpec (= 1000.0.0) - RCT-Folly (= 2021.06.28.00-v2) + - React-Codegen (= 1000.0.0) - React-Core/RCTBlobHeaders (= 1000.0.0) - React-Core/RCTWebSocket (= 1000.0.0) - React-jsi (= 1000.0.0) @@ -635,35 +636,35 @@ PODS: - React-Fabric (= 1000.0.0) - React-RCTImage (= 1000.0.0) - React-RCTImage (1000.0.0): - - FBReactNativeSpec (= 1000.0.0) - RCT-Folly (= 2021.06.28.00-v2) - RCTTypeSafety (= 1000.0.0) + - React-Codegen (= 1000.0.0) - React-Core/RCTImageHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - React-RCTNetwork (= 1000.0.0) - ReactCommon/turbomodule/core (= 1000.0.0) - React-RCTLinking (1000.0.0): - - FBReactNativeSpec (= 1000.0.0) + - React-Codegen (= 1000.0.0) - React-Core/RCTLinkingHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - ReactCommon/turbomodule/core (= 1000.0.0) - React-RCTNetwork (1000.0.0): - - FBReactNativeSpec (= 1000.0.0) - RCT-Folly (= 2021.06.28.00-v2) - RCTTypeSafety (= 1000.0.0) + - React-Codegen (= 1000.0.0) - React-Core/RCTNetworkHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - ReactCommon/turbomodule/core (= 1000.0.0) - React-RCTPushNotification (1000.0.0): - - FBReactNativeSpec (= 1000.0.0) - RCTTypeSafety (= 1000.0.0) + - React-Codegen (= 1000.0.0) - React-Core/RCTPushNotificationHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - ReactCommon/turbomodule/core (= 1000.0.0) - React-RCTSettings (1000.0.0): - - FBReactNativeSpec (= 1000.0.0) - RCT-Folly (= 2021.06.28.00-v2) - RCTTypeSafety (= 1000.0.0) + - React-Codegen (= 1000.0.0) - React-Core/RCTSettingsHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - ReactCommon/turbomodule/core (= 1000.0.0) @@ -676,8 +677,8 @@ PODS: - React-RCTText (1000.0.0): - React-Core/RCTTextHeaders (= 1000.0.0) - React-RCTVibration (1000.0.0): - - FBReactNativeSpec (= 1000.0.0) - RCT-Folly (= 2021.06.28.00-v2) + - React-Codegen (= 1000.0.0) - React-Core/RCTVibrationHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - ReactCommon/turbomodule/core (= 1000.0.0) @@ -745,6 +746,7 @@ DEPENDENCIES: - RCTTypeSafety (from `../../Libraries/TypeSafety`) - React (from `../../`) - React-callinvoker (from `../../ReactCommon/callinvoker`) + - React-Codegen (from `./build/generated/ios`) - React-Core (from `../../`) - React-Core/DevSupport (from `../../`) - React-Core/RCTWebSocket (from `../../`) @@ -814,6 +816,8 @@ EXTERNAL SOURCES: :path: "../../" React-callinvoker: :path: "../../ReactCommon/callinvoker" + React-Codegen: + :path: "./build/generated/ios" React-Core: :path: "../../" React-CoreModules: @@ -872,7 +876,7 @@ SPEC CHECKSUMS: CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662 FBLazyVector: b81a2b70c72d8b0aefb652cea22c11e9ffd02949 - FBReactNativeSpec: 00db9a8a231ace8f457589cd2da0a1528e77ac95 + FBReactNativeSpec: 8c199be18a891a49a1e24b3501e953a51311a46c Flipper: 30e8eeeed6abdc98edaf32af0cda2f198be4b733 Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c Flipper-DoubleConversion: 57ffbe81ef95306cc9e69c4aa3aeeeeb58a6a28c @@ -891,10 +895,11 @@ SPEC CHECKSUMS: RCTTypeSafety: c7a7f67ae5b1b986b78d817baa408fc984ab7c0c React: f64c9f6db5428717922a3292ba6a448615a2e143 React-callinvoker: c5d61e29df57793f0dc10ec2bc01c846f863e51f + React-Codegen: 87f4e4c110047ba26c6e2e5ec30963833388b275 React-Core: 22bc86b79dd931dbfb7fd2af91a35a98d41ceb64 - React-CoreModules: 1a96917a9a5fd73a989b462ed4dee742fb92332f + React-CoreModules: a8e2bdc1ebbf8d440478456197abd58d1691f61a React-cxxreact: cfc1663dae1ea52b465bbf021ef7b1527c5dc80c - React-Fabric: 1489d7b89f472f291b950a483c905ca5443eb288 + React-Fabric: 4132b0bc73f67a2044c6870e27abf7af3eb517bc React-graphics: 9a84942b49ea1375ce83844041fa2ba766cfe0b9 React-jsi: c1c0108d86e1378aabf7c9146ed7d12d87c7df85 React-jsiexecutor: d08ec14edc8f2e19af51550cd1505332eae35c7b @@ -902,23 +907,23 @@ SPEC CHECKSUMS: React-logger: 2009c0280c286a76200d6b7c5fe242fad51ddd7a React-perflogger: fe66bd6d8b17ebcfdf0159bf41fe28d8035ac20c React-RCTActionSheet: 3131a0b9280aa0e51bdf54b3d79aecd8503db62c - React-RCTAnimation: 5b2a86f9b5dc9683bfcf6315c58d04e93da57fd7 - React-RCTBlob: d417f5814b38d91c8e7a1f667aef7d36c6c789de - React-RCTFabric: 921f6d8ae5211e1c0bd31d426487118a61502c8b - React-RCTImage: 1717771340c6319ed49a529faf1581c779c52d77 - React-RCTLinking: 559c9223212ab2824950883220582c5e29a6fcb2 - React-RCTNetwork: fe64ecd503461a8c01a0ab21d07cf9419f1cba54 - React-RCTPushNotification: fafeb247db030c4d3f0a098d729e49f62ed32b3f - React-RCTSettings: b9b3db270879f3e8b89122938a9a96ac93a5bd98 + React-RCTAnimation: 70f2b9daaa1b45dea608be865cc5f2e1789dbc39 + React-RCTBlob: 48cae62d905ef96ab10c84ab16163643a3c872a7 + React-RCTFabric: 27d0c8541250efd0d35e4d62e487fdb69481de33 + React-RCTImage: 2ce3f1f72de91798eb31c9001b30cab8d1c71c4e + React-RCTLinking: 77300bd3cda2a613845ae0056b62ad330c2d319d + React-RCTNetwork: 8ef793740f893987384918e04382d37fac36960d + React-RCTPushNotification: 1845de920c2583f4541e13b3e9bd20a2ba896ffa + React-RCTSettings: 2beadc19336aa83a49e9ee9f704157c64799e840 React-RCTTest: 12bbd7fc2e72bd9920dc7286c5b8ef96639582b6 React-RCTText: e9146b2c0550a83d1335bfe2553760070a2d75c7 - React-RCTVibration: 3f42a7cbba10f87dfaeedd529484ac275203e175 + React-RCTVibration: 50be9c390f2da76045ef0dfdefa18b9cf9f35cfa React-runtimeexecutor: 4b0c6eb341c7d3ceb5e2385cb0fdb9bf701024f3 ReactCommon: 7a2714d1128f965392b6f99a8b390e3aa38c9569 - ScreenshotManager: 77a411be93200db8e25f9e1d59a1e88a829e358b + ScreenshotManager: dd14e8064e4e3e84c7f568431c8439cb7c1df81e Yoga: c0d06f5380d34e939f55420669a60fe08b79bd75 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: f2609ec079811d7784b6e802b8351314bd41de51 +PODFILE CHECKSUM: 404c55683078a97226a3dd1788a8c327db18cd4c COCOAPODS: 1.11.2 diff --git a/scripts/generate-specs-cli.js b/scripts/generate-specs-cli.js index 0446d9f4eb80..cfa8546f5ffe 100644 --- a/scripts/generate-specs-cli.js +++ b/scripts/generate-specs-cli.js @@ -94,24 +94,6 @@ function generateSpec( fs.renameSync(`${outputDirectory}/${f}`, `${jniOutputDirectory}/${f}`); }); } - - if (platform === 'ios') { - const files = fs.readdirSync(outputDirectory); - const componentsOutputDirectory = `${outputDirectory}/react/renderer/components/${libraryName}`; - mkdirp.sync(componentsOutputDirectory); - files - .filter( - f => - (f.endsWith('.h') && !f.startsWith(libraryName)) || - f.endsWith('.cpp'), - ) - .forEach(f => { - fs.renameSync( - `${outputDirectory}/${f}`, - `${componentsOutputDirectory}/${f}`, - ); - }); - } } function main() { diff --git a/scripts/react_native_pods.rb b/scripts/react_native_pods.rb index 2e6117ca3f51..5f1bc4dfcad0 100644 --- a/scripts/react_native_pods.rb +++ b/scripts/react_native_pods.rb @@ -3,7 +3,10 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -$CODEGEN_TEMP_DIR = 'build/generated' +require 'pathname' + +$CODEGEN_OUTPUT_DIR = 'build/generated/ios' +$CODEGEN_LIBRARY_DIR = 'react/renderer/components' def use_react_native! (options={}) # The prefix to react-native @@ -64,6 +67,10 @@ def use_react_native! (options={}) pod 'boost', :podspec => "#{prefix}/third-party-podspecs/boost.podspec" pod 'RCT-Folly', :podspec => "#{prefix}/third-party-podspecs/RCT-Folly.podspec" + # Generate a podspec file for generated files. + temp_podinfo = generate_temp_pod_spec_for_codegen!() + pod temp_podinfo['spec']['name'], :path => temp_podinfo['path'] + if fabric_enabled pod 'React-Fabric', :path => "#{prefix}/ReactCommon" pod 'React-graphics', :path => "#{prefix}/ReactCommon/react/renderer/graphics" @@ -194,19 +201,29 @@ def react_native_post_install(installer) def generate_temp_pod_spec_for_codegen!() - output_dir = "#{Pod::Config.instance.installation_root}/#{$CODEGEN_TEMP_DIR}" + relative_installation_root = Pod::Config.instance.installation_root.relative_path_from(Pathname.pwd) + output_dir = "#{relative_installation_root}/#{$CODEGEN_OUTPUT_DIR}" Pod::Executable.execute_command("mkdir", ["-p", output_dir]); 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.06.28.00' + folly_version = '2021.06.28.00-v2' boost_version = '1.76.0' boost_compiler_flags = '-Wno-documentation' spec = { - 'name' => "ReactNative-Codegen", + 'name' => "React-Codegen", 'version' => version, 'summary' => 'Temp pod for generated files for React Native', 'homepage' => 'https://facebook.com/', @@ -214,6 +231,7 @@ def generate_temp_pod_spec_for_codegen!() 'authors' => 'Facebook', 'compiler_flags' => "#{folly_compiler_flags} #{boost_compiler_flags} -Wno-nullability-completeness", 'source' => { :git => '' }, + 'header_mappings_dir' => './', 'platforms' => { 'ios' => '11.0', }, @@ -222,10 +240,12 @@ def generate_temp_pod_spec_for_codegen!() [ "\"$(PODS_ROOT)/boost\"", "\"$(PODS_ROOT)/RCT-Folly\"", + "\"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"", "\"$(PODS_ROOT)/Headers/Private/React-Fabric\"" ].join(' ') }, 'dependencies': { + "FBReactNativeSpec": [version], "React-graphics": [version], "React-jsiexecutor": [version], "RCT-Folly": [folly_version], @@ -236,8 +256,8 @@ def generate_temp_pod_spec_for_codegen!() "ReactCommon/turbomodule/core": [version] } } - podspec_path = File.join(output_dir, 'ReactNative-Codegen.podspec.json') - Pod::UI.puts "[Codegene] Generating #{podspec_path}" + podspec_path = File.join(output_dir, 'React-Codegen.podspec.json') + Pod::UI.puts "[Codegen] Generating #{podspec_path}" File.open(podspec_path, 'w') do |f| f.write(spec.to_json) @@ -261,13 +281,13 @@ def use_react_native_codegen!(spec, options={}) library_name = options[:library_name] ||= "#{spec.name.gsub('_','-').split('-').collect(&:capitalize).join}Spec" # Output dir, relative to podspec that invoked this method - output_dir = options[:output_dir] ||= "#{library_name}" - components_output_dir = "#{output_dir}/react/renderer/components/#{library_name}" + output_dir = options[:output_dir] ||= "#{Pod::Config.instance.installation_root}/#{$CODEGEN_OUTPUT_DIR}/#{$CODEGEN_LIBRARY_DIR}" + library_output_dir = "#{output_dir}/#{library_name}" codegen_config = { "modules" => { :js_srcs_pattern => "Native*.js", - :generated_dir => output_dir, + :generated_dir => library_output_dir, :generated_files => [ "#{library_name}.h", "#{library_name}-generated.mm" @@ -275,7 +295,7 @@ def use_react_native_codegen!(spec, options={}) }, "components" => { :js_srcs_pattern => "*NativeComponent.js", - :generated_dir => components_output_dir, + :generated_dir => library_output_dir, :generated_files => [ "ComponentDescriptors.h", "EventEmitters.cpp", @@ -329,6 +349,9 @@ def use_react_native_codegen!(spec, options={}) :script => %{set -o pipefail set -e +pushd "${PODS_ROOT}/../" > /dev/null +PROJECT_DIR=$(pwd) +popd >/dev/null RN_DIR=$(cd "$\{PODS_TARGET_SRCROOT\}/#{prefix}" && pwd) GENERATED_SRCS_DIR="$\{DERIVED_FILE_DIR\}/generated/source/codegen" @@ -336,12 +359,14 @@ def use_react_native_codegen!(spec, options={}) TEMP_OUTPUT_DIR="$GENERATED_SRCS_DIR/out" LIBRARY_NAME="#{library_name}" -OUTPUT_DIR="$\{PODS_TARGET_SRCROOT\}/#{output_dir}" +OUTPUT_DIR="$PROJECT_DIR/#{$CODEGEN_OUTPUT_DIR}/#{$CODEGEN_LIBRARY_DIR}/#{library_name}" CODEGEN_REPO_PATH="$RN_DIR/packages/react-native-codegen" CODEGEN_NPM_PATH="$RN_DIR/../react-native-codegen" CODEGEN_CLI_PATH="" +LIBRARY_TYPE="#{library_type ? library_type : 'all'}" + # Determine path to react-native-codegen if [ -d "$CODEGEN_REPO_PATH" ]; then CODEGEN_CLI_PATH=$(cd "$CODEGEN_REPO_PATH" && pwd) @@ -403,7 +428,7 @@ def use_react_native_codegen!(spec, options={}) generateCodegenArtifactsFromSchema () { describe "Generating codegen artifacts from schema" pushd "$RN_DIR" >/dev/null || exit 1 - "$NODE_BINARY" "scripts/generate-specs-cli.js" ios "$GENERATED_SCHEMA_FILE" "$TEMP_OUTPUT_DIR" "$LIBRARY_NAME" + "$NODE_BINARY" "scripts/generate-specs-cli.js" ios "$GENERATED_SCHEMA_FILE" "$TEMP_OUTPUT_DIR" "$LIBRARY_NAME" "" "$LIBRARY_TYPE" popd >/dev/null || exit 1 } From 24d41845e847f7c972a8f21c75e77209dc42cd67 Mon Sep 17 00:00:00 2001 From: Sota Ogo Date: Tue, 26 Oct 2021 01:16:49 -0700 Subject: [PATCH 070/628] Add fabric_enabled check in generate_temp_pod_spec_for_codegen Summary: I missed to push this change in the previous diff D31809012 (https://github.com/facebook/react-native/commit/f7e4c07c84b636fc33c64b434964c8a64c43438f). This diff adds a check so that only when fabric is enabled it include the React-graphic dependency. Changelog: [internal] Reviewed By: fkgozali Differential Revision: D31919354 fbshipit-source-id: 0b4e7f489155f868cdf58bec3f61f309470ca0c6 --- packages/rn-tester/Podfile.lock | 4 ++-- scripts/react_native_pods.rb | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index cde836884a90..dd210ee2dd01 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -895,7 +895,7 @@ SPEC CHECKSUMS: RCTTypeSafety: c7a7f67ae5b1b986b78d817baa408fc984ab7c0c React: f64c9f6db5428717922a3292ba6a448615a2e143 React-callinvoker: c5d61e29df57793f0dc10ec2bc01c846f863e51f - React-Codegen: 87f4e4c110047ba26c6e2e5ec30963833388b275 + React-Codegen: cc3fbbc057abebec3102ec376eb6593d1e5f34bb React-Core: 22bc86b79dd931dbfb7fd2af91a35a98d41ceb64 React-CoreModules: a8e2bdc1ebbf8d440478456197abd58d1691f61a React-cxxreact: cfc1663dae1ea52b465bbf021ef7b1527c5dc80c @@ -924,6 +924,6 @@ SPEC CHECKSUMS: Yoga: c0d06f5380d34e939f55420669a60fe08b79bd75 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: 404c55683078a97226a3dd1788a8c327db18cd4c +PODFILE CHECKSUM: b0db53c7196aa798709ee467d4d93e7300f7eacf COCOAPODS: 1.11.2 diff --git a/scripts/react_native_pods.rb b/scripts/react_native_pods.rb index 5f1bc4dfcad0..fda7acb30bbd 100644 --- a/scripts/react_native_pods.rb +++ b/scripts/react_native_pods.rb @@ -68,7 +68,7 @@ def use_react_native! (options={}) pod 'RCT-Folly', :podspec => "#{prefix}/third-party-podspecs/RCT-Folly.podspec" # Generate a podspec file for generated files. - temp_podinfo = generate_temp_pod_spec_for_codegen!() + temp_podinfo = generate_temp_pod_spec_for_codegen!(fabric_enabled) pod temp_podinfo['spec']['name'], :path => temp_podinfo['path'] if fabric_enabled @@ -200,7 +200,7 @@ def react_native_post_install(installer) end -def generate_temp_pod_spec_for_codegen!() +def generate_temp_pod_spec_for_codegen!(fabric_enabled) relative_installation_root = Pod::Config.instance.installation_root.relative_path_from(Pathname.pwd) output_dir = "#{relative_installation_root}/#{$CODEGEN_OUTPUT_DIR}" Pod::Executable.execute_command("mkdir", ["-p", output_dir]); @@ -246,7 +246,6 @@ def generate_temp_pod_spec_for_codegen!() }, 'dependencies': { "FBReactNativeSpec": [version], - "React-graphics": [version], "React-jsiexecutor": [version], "RCT-Folly": [folly_version], "RCTRequired": [version], @@ -256,6 +255,11 @@ def generate_temp_pod_spec_for_codegen!() "ReactCommon/turbomodule/core": [version] } } + + if fabric_enabled + spec[:'dependencies'].merge!({'React-graphics': [version]}); + end + podspec_path = File.join(output_dir, 'React-Codegen.podspec.json') Pod::UI.puts "[Codegen] Generating #{podspec_path}" From d1439e8b854b4e805c94dfbe7444237c4d602b38 Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Tue, 26 Oct 2021 03:22:39 -0700 Subject: [PATCH 071/628] Remove unused ensureComponentIsNative mock Summary: Changelog: [Internal] Reviewed By: philIip Differential Revision: D31893181 fbshipit-source-id: 63204b818465f8ae06135f42c63e1340f6abb351 --- .../Touchable/__mocks__/ensureComponentIsNative.js | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 Libraries/Components/Touchable/__mocks__/ensureComponentIsNative.js diff --git a/Libraries/Components/Touchable/__mocks__/ensureComponentIsNative.js b/Libraries/Components/Touchable/__mocks__/ensureComponentIsNative.js deleted file mode 100644 index 234c178afddd..000000000000 --- a/Libraries/Components/Touchable/__mocks__/ensureComponentIsNative.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * 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. - * - * @format - */ - -'use strict'; - -module.exports = () => true; From d2c10da5d5687833545691f281473381e4466c2e Mon Sep 17 00:00:00 2001 From: Geraint White Date: Tue, 26 Oct 2021 04:57:44 -0700 Subject: [PATCH 072/628] Add bundleForVariant option (#32472) Summary: Ref https://github.com/facebook/react-native/pull/30606#issuecomment-948458552 ## Changelog [Android] [Added] - Add bundleForVariant option Pull Request resolved: https://github.com/facebook/react-native/pull/32472 Test Plan: I added the following log into react.gradle and ran the Android build for my app: ``` println("bundleEnabled: ${targetName}, ${bundleForVariant(variant)}") ``` ``` # build.gradle project.ext.react = [ entryFile: "index.android.js", enableHermes: true, // clean and rebuild if changing bundleForVariant: { def variant -> variant.name.toLowerCase().contains('release') || variant.name.toLowerCase().contains('live') }, ] ... flavorDimensions 'branding' productFlavors { cve { dimension 'branding' } whce { dimension 'branding' } } ``` Console output: ``` Reading env from: env/cve/live bundleEnabled: CveDebug, false bundleEnabled: CveRelease, true bundleEnabled: CveLive, true bundleEnabled: WhceDebug, false bundleEnabled: WhceRelease, true bundleEnabled: WhceLive, true ``` Reviewed By: cortinico, ryancat Differential Revision: D31910406 Pulled By: ShikaSD fbshipit-source-id: baca5efaddedddad15d974cc7bb8f3c2a4c4f35b --- .../com/facebook/react/ReactExtension.kt | 11 +++++++++++ .../com/facebook/react/TaskConfiguration.kt | 15 +-------------- react.gradle | 19 +++++++++++++------ 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt index 0d582772ac64..51aa17a44930 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactExtension.kt @@ -130,6 +130,17 @@ abstract class ReactExtension @Inject constructor(project: Project) { val bundleIn: MapProperty = objects.mapProperty(String::class.java, Boolean::class.java).convention(emptyMap()) + /** + * Functional interface to toggle the bundle command only on specific [BaseVariant] Default: will + * check [bundleIn] or return True for Release variants and False for Debug variants. + */ + var bundleForVariant: (BaseVariant) -> Boolean = { variant -> + if (bundleIn.getting(variant.name).isPresent) bundleIn.getting(variant.name).get() + else if (bundleIn.getting(variant.buildType.name).isPresent) + bundleIn.getting(variant.buildType.name).get() + else variant.isRelease + } + /** Hermes Config */ /** The command to use to invoke hermes. Default is `hermesc` for the correct OS. */ diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt index 12700ec57247..20ca03362495 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/TaskConfiguration.kt @@ -28,7 +28,6 @@ private const val REACT_GROUP = "react" @Suppress("SpreadOperator") internal fun Project.configureReactTasks(variant: BaseVariant, config: ReactExtension) { val targetName = variant.name.capitalize(Locale.ROOT) - val isRelease = variant.isRelease val targetPath = variant.dirName // React js bundle directories @@ -50,7 +49,7 @@ internal fun Project.configureReactTasks(variant: BaseVariant, config: ReactExte val execCommand = nodeExecutableAndArgs + cliPath val enableHermes = config.enableHermesForVariant(variant) val cleanup = config.deleteDebugFilesForVariant(variant) - val bundleEnabled = variant.checkBundleEnabled(config) + val bundleEnabled = config.bundleForVariant(variant) val bundleTask = tasks.register("createBundle${targetName}JsAndAssets", BundleJsAndAssetsTask::class.java) { @@ -258,17 +257,5 @@ private fun Project.cleanupVMFiles( } } -private fun BaseVariant.checkBundleEnabled(config: ReactExtension): Boolean { - if (config.bundleIn.getting(name).isPresent) { - return config.bundleIn.getting(name).get() - } - - if (config.bundleIn.getting(buildType.name).isPresent) { - return config.bundleIn.getting(buildType.name).get() - } - - return isRelease -} - internal val BaseVariant.isRelease: Boolean get() = name.toLowerCase(Locale.ROOT).contains("release") diff --git a/react.gradle b/react.gradle index d903659f7f0f..6f803dd5576f 100644 --- a/react.gradle +++ b/react.gradle @@ -102,7 +102,18 @@ def hermesFlagsForVariant = config.hermesFlagsForVariant ?: { // Set disableDevForVariant to a function to configure per variant, // defaults to `devDisabledIn${targetName}` or True for Release variants and False for debug variants def disableDevForVariant = config.disableDevForVariant ?: { - def variant -> config."devDisabledIn${variant.name.capitalize()}" || variant.name.toLowerCase().contains("release") + def variant -> + config."devDisabledIn${variant.name.capitalize()}" || + variant.name.toLowerCase().contains("release") +} + +// Set bundleForVariant to a function to configure per variant, +// defaults to `bundleIn${targetName}` or True for Release variants and False for debug variants +def bundleForVariant = config.bundleForVariant ?: { + def variant -> + config."bundleIn${variant.name.capitalize()}" || + config."bundleIn${variant.buildType.name.capitalize()}" || + variant.name.toLowerCase().contains("release") } // Set deleteDebugFilesForVariant to a function to configure per variant, @@ -238,11 +249,7 @@ afterEvaluate { } } - enabled config."bundleIn${targetName}" != null - ? config."bundleIn${targetName}" - : config."bundleIn${variant.buildType.name.capitalize()}" != null - ? config."bundleIn${variant.buildType.name.capitalize()}" - : targetName.toLowerCase().contains("release") + enabled bundleForVariant(variant) } // Expose a minimal interface on the application variant and the task itself: From f58c496e07845e5fb765f051246160077fcf98e4 Mon Sep 17 00:00:00 2001 From: Andrei Shikov Date: Tue, 26 Oct 2021 05:58:58 -0700 Subject: [PATCH 073/628] Use context from entry point for prerendering Summary: Some of the prerendered surfaces rely on Android context being present to have correct theming (e.g. for platform colors) and measurements of platform components. This change uses context provided to initialize the surface as themed context before view is attached. This way it is possible to configure theming with `ContextThemeWrapper` the same way as Litho does it for prerendering. The assumption is that any kind of customization done through Android theme will be applied from prerendering entry point as well. Changelog: [Internal] - Use context from surface for prerendering Reviewed By: mdvacca Differential Revision: D31906091 fbshipit-source-id: 344fc96eb2f85ba5b762bee64d1a29443b3fd1d3 --- .../react/fabric/FabricUIManager.java | 20 +++++++--------- .../fabric/mounting/MountingManager.java | 23 +++++++++---------- .../mounting/SurfaceMountingManager.java | 4 +++- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java index a16127039522..290c3b6048ba 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -213,7 +213,7 @@ public int addRootView( ThemedReactContext reactContext = new ThemedReactContext( mReactApplicationContext, rootView.getContext(), reactRootView.getSurfaceID(), rootTag); - mMountingManager.startSurface(rootTag, rootView, reactContext); + mMountingManager.startSurface(rootTag, reactContext, rootView); String moduleName = reactRootView.getJSModuleName(); if (ENABLE_FABRIC_LOGS) { FLog.d(TAG, "Starting surface for module: %s and reactTag: %d", moduleName, rootTag); @@ -271,7 +271,7 @@ public int startSurface( if (ENABLE_FABRIC_LOGS) { FLog.d(TAG, "Starting surface for module: %s and reactTag: %d", moduleName, rootTag); } - mMountingManager.startSurface(rootTag, rootView, reactContext); + mMountingManager.startSurface(rootTag, reactContext, rootView); // If startSurface is executed in the UIThread then, it uses the ViewportOffset from the View, // Otherwise Fabric relies on calling {@link Binding#setConstraints} method to update the @@ -295,18 +295,14 @@ public int startSurface( return rootTag; } - public void startSurface(final SurfaceHandler surfaceHandler, final @Nullable View rootView) { + public void startSurface( + final SurfaceHandler surfaceHandler, final Context context, final @Nullable View rootView) { final int rootTag = ReactRootViewTagGenerator.getNextRootViewTag(); - if (rootView == null) { - mMountingManager.startSurface(rootTag); - } else { - Context context = rootView.getContext(); - ThemedReactContext reactContext = - new ThemedReactContext( - mReactApplicationContext, context, surfaceHandler.getModuleName(), rootTag); - mMountingManager.startSurface(rootTag, rootView, reactContext); - } + ThemedReactContext reactContext = + new ThemedReactContext( + mReactApplicationContext, context, surfaceHandler.getModuleName(), rootTag); + mMountingManager.startSurface(rootTag, reactContext, rootView); surfaceHandler.setSurfaceId(rootTag); if (surfaceHandler instanceof SurfaceHandlerBinding) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java index 7e00a20defd0..7c303f38c2ad 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java @@ -75,27 +75,21 @@ public MountingManager( mMountItemExecutor = mountItemExecutor; } - /** Starts surface and attaches the root view. */ - @AnyThread - public void startSurface( - final int surfaceId, @NonNull final View rootView, ThemedReactContext themedReactContext) { - SurfaceMountingManager mountingManager = startSurface(surfaceId); - mountingManager.attachRootView(rootView, themedReactContext); - } - /** * Starts surface without attaching the view. All view operations executed against that surface * will be queued until the view is attached. */ @AnyThread - public SurfaceMountingManager startSurface(final int surfaceId) { + public SurfaceMountingManager startSurface( + final int surfaceId, ThemedReactContext reactContext, @Nullable View rootView) { SurfaceMountingManager surfaceMountingManager = new SurfaceMountingManager( surfaceId, mJSResponderHandler, mViewManagerRegistry, mRootViewManager, - mMountItemExecutor); + mMountItemExecutor, + reactContext); // There could technically be a race condition here if addRootView is called twice from // different threads, though this is (probably) extremely unlikely, and likely an error. @@ -111,6 +105,11 @@ public SurfaceMountingManager startSurface(final int surfaceId) { } mMostRecentSurfaceMountingManager = mSurfaceIdToManager.get(surfaceId); + + if (rootView != null) { + surfaceMountingManager.attachRootView(rootView, reactContext); + } + return surfaceMountingManager; } @@ -314,8 +313,8 @@ public void updateProps(int reactTag, @Nullable ReadableMap props) { } /** - * Clears the JS Responder specified by {@link #setJSResponder(int, int, int, boolean)}. After - * this method is called, all the touch events are going to be handled by JS. + * Clears the JS Responder specified by {@link SurfaceMountingManager#setJSResponder}. After this + * method is called, all the touch events are going to be handled by JS. */ @UiThread public void clearJSResponder() { diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.java index 737a29559aab..8e1fe87bd7d5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.java @@ -76,13 +76,15 @@ public SurfaceMountingManager( @NonNull JSResponderHandler jsResponderHandler, @NonNull ViewManagerRegistry viewManagerRegistry, @NonNull RootViewManager rootViewManager, - @NonNull MountItemExecutor mountItemExecutor) { + @NonNull MountItemExecutor mountItemExecutor, + @NonNull ThemedReactContext reactContext) { mSurfaceId = surfaceId; mJSResponderHandler = jsResponderHandler; mViewManagerRegistry = viewManagerRegistry; mRootViewManager = rootViewManager; mMountItemExecutor = mountItemExecutor; + mThemedReactContext = reactContext; } public boolean isStopped() { From 456cf3db14c443c483d63aa97c88b45ffd25799b Mon Sep 17 00:00:00 2001 From: Stefanos Markidis Date: Tue, 26 Oct 2021 11:19:47 -0700 Subject: [PATCH 074/628] Fix ReactSwitch for non RippleDrawable backgrounds (#32468) Summary: ReactSwitch component is crashing on Android when it is initialised with both a backgroundColor and thumbColor, `style={{ backgroundColor: "anyColor" }} thumbColor="anyColor"`, due to IllegalCastException. When setting a background color, BaseViewManagerDelegate is calling `setBackgroundColor` which replaces the background drawable with a ColorDrawale, hence [this line](https://github.com/facebook/react-native/blob/72ea0e111fccd99456abf3f974439432145585e3/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitch.java#L68) fails. Instead, given the ripple effect needs to be preserved, one should initialise a RippleDrawable using the current background drawable and set it as the background of the switch. Given the RippleDrawable should be preserved, overriding the `setBackgroundColor` seemed the sensible thing to do. ## Changelog [Android] [Fixed] - Fix crash when a Switch is initialised with both backgroundColor and thumbColor. Pull Request resolved: https://github.com/facebook/react-native/pull/32468 Test Plan: ### Setup: Initialise an empty React Native project. Add a switch component: `` Run the project `yarn android` ### Current state (RN 65+): Red screen will show highlighting an IllegalCastException. ### With fix: - The component is expected to have a red background. - When pressed a ripple effect shows inside the backgrounds bounding box. - Business as usual otherwise. `backgroundColor` with `thumbColor`: ![backgroundColor + thumbColor](https://user-images.githubusercontent.com/4354327/138615603-141660d2-a5cd-49d7-aa5e-9c93ebc6d680.gif) Just `thumbColor`: ![Screen Recording 2021-10-25 at 00 23 57](https://user-images.githubusercontent.com/4354327/138615658-baa380dd-2cbb-4d0f-a25e-a003ef67c977.gif) Reviewed By: ShikaSD Differential Revision: D31895690 Pulled By: cortinico fbshipit-source-id: 60af16de7db61440ccfbf11d67a3d945dd90b562 --- .../react/views/switchview/ReactSwitch.java | 30 ++++++++++++++----- .../js/examples/Switch/SwitchExample.js | 23 ++++++++++++++ 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitch.java b/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitch.java index 4819bf2abd94..7dbc889e4e35 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitch.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitch.java @@ -10,6 +10,7 @@ import android.content.Context; import android.content.res.ColorStateList; import android.graphics.PorterDuff; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.RippleDrawable; import android.os.Build; @@ -48,6 +49,18 @@ public void setChecked(boolean checked) { } } + @Override + public void setBackgroundColor(int color) { + // Ensure RippleDrawable is preserved for >=21 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + setBackground( + new RippleDrawable( + createRippleDrawableColorStateList(color), new ColorDrawable(color), null)); + } else { + super.setBackgroundColor(color); + } + } + void setColor(Drawable drawable, @Nullable Integer color) { if (color == null) { drawable.clearColorFilter(); @@ -63,14 +76,10 @@ public void setTrackColor(@Nullable Integer color) { public void setThumbColor(@Nullable Integer color) { setColor(super.getThumbDrawable(), color); - // Set the ripple color with thumb color if >= LOLLIPOP - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - RippleDrawable ripple = (RippleDrawable) super.getBackground(); - ColorStateList customColorState = - new ColorStateList( - new int[][] {new int[] {android.R.attr.state_pressed}}, new int[] {color}); - - ripple.setColor(customColorState); + // Set the ripple color if background is instance of RippleDrawable + if (color != null && super.getBackground() instanceof RippleDrawable) { + ColorStateList customColorState = createRippleDrawableColorStateList(color); + ((RippleDrawable) super.getBackground()).setColor(customColorState); } } @@ -113,4 +122,9 @@ private void setTrackColor(boolean checked) { setTrackColor(currentTrackColor); } } + + private ColorStateList createRippleDrawableColorStateList(@Nullable Integer color) { + return new ColorStateList( + new int[][] {new int[] {android.R.attr.state_pressed}}, new int[] {color}); + } } diff --git a/packages/rn-tester/js/examples/Switch/SwitchExample.js b/packages/rn-tester/js/examples/Switch/SwitchExample.js index ebd3bc40b441..a249fc292011 100644 --- a/packages/rn-tester/js/examples/Switch/SwitchExample.js +++ b/packages/rn-tester/js/examples/Switch/SwitchExample.js @@ -244,6 +244,23 @@ class OnChangeExample extends React.Component<{...}, $FlowFixMeState> { } } +class ContainerBackgroundColorStyleExample extends React.Component< + {...}, + $FlowFixMeState, +> { + render() { + return ( + + + + ); + } +} + exports.title = 'Switch'; exports.documentationURL = 'https://reactnative.dev/docs/switch'; exports.category = 'UI'; @@ -291,6 +308,12 @@ exports.examples = [ return ; }, }, + { + title: "The container's background color can be set", + render(): React.Element { + return ; + }, + }, ]; if (Platform.OS === 'ios') { From fdd744f0137bde86bd45c5aa0ccb243d3ac89826 Mon Sep 17 00:00:00 2001 From: Moshe Berman Date: Tue, 26 Oct 2021 17:13:04 -0700 Subject: [PATCH 075/628] Enable complete_nullability on //xplat/js/react-native-github:RCTTypeSafety (#32473) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32473 Reviewed By: AdamCmiel Differential Revision: D31775069 fbshipit-source-id: f3aaee36c1ca8a209610f8b66c7adc90bd2b8c7e --- BUCK | 1 + 1 file changed, 1 insertion(+) diff --git a/BUCK b/BUCK index b80dda92bb5d..486ac679324e 100644 --- a/BUCK +++ b/BUCK @@ -549,6 +549,7 @@ rn_apple_library( ], ), autoglob = False, + complete_nullability = True, contacts = ["oncall+react_native@xmail.facebook.com"], extension_api_only = True, frameworks = [ From a9fc0c5a9cca4509e0d6d8f3a604755b165e038b Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 27 Oct 2021 09:18:55 -0700 Subject: [PATCH 076/628] Re-add libreact_debug to codegen makefile and add prebuilts for them Summary: While working updating the codeden Makefile template for Android, I've removed the `libreact_debug` and `libreact_render_debug` dependencies as they were unused in a simple turbomodule. Turns out that `:ReactAndroid` is depending on having those dependencies. Moving the build file to use AGP APIs, triggers this scenario and is making `ReactAndroid` failing to build (see the build status for https://github.com/facebook/react-native/pull/32443). I'm updating the codegen Makefile template to reintrodce the two libraries + I've update the prebuilt makefile (used in the playbook) to include `react_debug` prebuilts as they were missing. Changelog: [Internal] [Changed] - Re-add libreact_debug to codegen makefile and add prebuilts for them Reviewed By: ShikaSD Differential Revision: D31900675 fbshipit-source-id: ff188c0498a0dca4a951a548a580ca8dd0674782 --- ReactAndroid/Android-prebuilt.mk | 9 +++++++++ .../src/generators/modules/GenerateModuleJniH.js | 2 +- .../__snapshots__/GenerateModuleJniH-test.js.snap | 12 ++++++------ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ReactAndroid/Android-prebuilt.mk b/ReactAndroid/Android-prebuilt.mk index 18f8c2662045..38fa1c01e5f5 100644 --- a/ReactAndroid/Android-prebuilt.mk +++ b/ReactAndroid/Android-prebuilt.mk @@ -114,6 +114,15 @@ LOCAL_EXPORT_C_INCLUDES := \ $(REACT_COMMON_DIR)/react/renderer/debug include $(PREBUILT_SHARED_LIBRARY) +# react_debug +include $(CLEAR_VARS) +LOCAL_MODULE := react_debug +LOCAL_SRC_FILES := $(REACT_NDK_EXPORT_DIR)/$(TARGET_ARCH_ABI)/libreact_debug.so +LOCAL_EXPORT_C_INCLUDES := \ + $(REACT_COMMON_DIR)/react/debug +LOCAL_SHARED_LIBRARIES := libfolly_json +include $(PREBUILT_SHARED_LIBRARY) + # react_render_graphics include $(CLEAR_VARS) LOCAL_MODULE := react_render_graphics diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js index fbf4160f7b7e..815a04e03a89 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js @@ -80,7 +80,7 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/${libraryName} -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore libreact_debug libreact_render_debug LOCAL_CFLAGS := \\ -DLOG_TAG=\\"ReactNative\\" diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap index abee97d4e738..054b514908fd 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap @@ -52,7 +52,7 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/complex_objects -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore libreact_debug libreact_render_debug LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" @@ -116,7 +116,7 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/empty_native_modules -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore libreact_debug libreact_render_debug LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" @@ -180,7 +180,7 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/native_modules_with_type_aliases -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore libreact_debug libreact_render_debug LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" @@ -252,7 +252,7 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/real_module_example -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore libreact_debug libreact_render_debug LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" @@ -316,7 +316,7 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/simple_native_modules -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore libreact_debug libreact_render_debug LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" @@ -388,7 +388,7 @@ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) $(wildcard $(LOCAL_PATH)/reac LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/react/renderer/components/two_modules_different_files -LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore +LOCAL_SHARED_LIBRARIES := libjsi libglog libfolly_json libyoga libreact_nativemodule_core librrc_view libreact_render_core libreact_render_graphics libfbjni libturbomodulejsijni libreact_codegen_rncore libreact_debug libreact_render_debug LOCAL_CFLAGS := \\\\ -DLOG_TAG=\\\\\\"ReactNative\\\\\\" From 9c4c12722acde4d3c597ac1f4e106ee6f7eb5db0 Mon Sep 17 00:00:00 2001 From: Sota Ogo Date: Wed, 27 Oct 2021 09:43:49 -0700 Subject: [PATCH 077/628] Fix a build issue where codegen order is incorrect (#32480) Summary: D31809012 (https://github.com/facebook/react-native/commit/f7e4c07c84b636fc33c64b434964c8a64c43438f) introduced a condition where codegen files weren't generated in a correct order so the build fails in `yarn test-ios` if it was a first time to run the command. So it broke ci/circleci: test_ios_unit_hermes. In this diff Pull Request resolved: https://github.com/facebook/react-native/pull/32480 Changelog: [intermal] Reviewed By: cortinico Differential Revision: D31953580 fbshipit-source-id: db854d6cfed8167dc4aae2667d379738bc261cfe --- ReactCommon/React-Fabric.podspec | 6 ----- ReactCommon/React-rncore.podspec | 41 ++++++++++++++++++++++++++++++++ packages/rn-tester/Podfile.lock | 10 ++++++-- scripts/react_native_pods.rb | 6 ++++- 4 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 ReactCommon/React-rncore.podspec diff --git a/ReactCommon/React-Fabric.podspec b/ReactCommon/React-Fabric.podspec index dabe83199d92..5502200b35f1 100644 --- a/ReactCommon/React-Fabric.podspec +++ b/ReactCommon/React-Fabric.podspec @@ -333,10 +333,4 @@ Pod::Spec.new do |s| ss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ReactCommon\" \"$(PODS_ROOT)/RCT-Folly\"" } end - use_react_native_codegen!(s, { - :react_native_path => react_native_path, - :js_srcs_dir => "#{react_native_path}/Libraries", - :library_name => "rncore", - :library_type => "components", - }) end diff --git a/ReactCommon/React-rncore.podspec b/ReactCommon/React-rncore.podspec new file mode 100644 index 000000000000..9e6171ad6eb9 --- /dev/null +++ b/ReactCommon/React-rncore.podspec @@ -0,0 +1,41 @@ +# 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. + +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 + +react_native_path = ".." + +Pod::Spec.new do |s| + s.name = "React-rncore" + s.version = version + s.summary = "Fabric for React Native." + s.homepage = "https://reactnative.dev/" + s.license = package["license"] + s.author = "Facebook, Inc. and its affiliates" + s.platforms = { :ios => "11.0" } + s.source = source + s.source_files = "dummyFile.cpp" + s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" } + + + use_react_native_codegen!(s, { + :react_native_path => react_native_path, + :js_srcs_dir => "#{react_native_path}/Libraries", + :library_name => "rncore", + :library_type => "components", + }) +end diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index dd210ee2dd01..73bb0aa797a0 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -119,6 +119,7 @@ PODS: - React-graphics (= 1000.0.0) - React-jsi (= 1000.0.0) - React-jsiexecutor (= 1000.0.0) + - React-rncore (= 1000.0.0) - ReactCommon/turbomodule/core (= 1000.0.0) - React-Core (1000.0.0): - glog @@ -682,6 +683,7 @@ PODS: - React-Core/RCTVibrationHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - ReactCommon/turbomodule/core (= 1000.0.0) + - React-rncore (1000.0.0) - React-runtimeexecutor (1000.0.0): - React-jsi (= 1000.0.0) - ReactCommon/turbomodule/core (1000.0.0): @@ -772,6 +774,7 @@ DEPENDENCIES: - React-RCTTest (from `./RCTTest`) - React-RCTText (from `../../Libraries/Text`) - React-RCTVibration (from `../../Libraries/Vibration`) + - React-rncore (from `../../ReactCommon`) - React-runtimeexecutor (from `../../ReactCommon/runtimeexecutor`) - ReactCommon/turbomodule/core (from `../../ReactCommon`) - ReactCommon/turbomodule/samples (from `../../ReactCommon`) @@ -862,6 +865,8 @@ EXTERNAL SOURCES: :path: "../../Libraries/Text" React-RCTVibration: :path: "../../Libraries/Vibration" + React-rncore: + :path: "../../ReactCommon" React-runtimeexecutor: :path: "../../ReactCommon/runtimeexecutor" ReactCommon: @@ -895,11 +900,11 @@ SPEC CHECKSUMS: RCTTypeSafety: c7a7f67ae5b1b986b78d817baa408fc984ab7c0c React: f64c9f6db5428717922a3292ba6a448615a2e143 React-callinvoker: c5d61e29df57793f0dc10ec2bc01c846f863e51f - React-Codegen: cc3fbbc057abebec3102ec376eb6593d1e5f34bb + React-Codegen: 5c20632d128f21b4b94d00d70690821a8ac5dbef React-Core: 22bc86b79dd931dbfb7fd2af91a35a98d41ceb64 React-CoreModules: a8e2bdc1ebbf8d440478456197abd58d1691f61a React-cxxreact: cfc1663dae1ea52b465bbf021ef7b1527c5dc80c - React-Fabric: 4132b0bc73f67a2044c6870e27abf7af3eb517bc + React-Fabric: 002345cff43721617e0a3c0866f6f76bae8c50ff React-graphics: 9a84942b49ea1375ce83844041fa2ba766cfe0b9 React-jsi: c1c0108d86e1378aabf7c9146ed7d12d87c7df85 React-jsiexecutor: d08ec14edc8f2e19af51550cd1505332eae35c7b @@ -918,6 +923,7 @@ SPEC CHECKSUMS: React-RCTTest: 12bbd7fc2e72bd9920dc7286c5b8ef96639582b6 React-RCTText: e9146b2c0550a83d1335bfe2553760070a2d75c7 React-RCTVibration: 50be9c390f2da76045ef0dfdefa18b9cf9f35cfa + React-rncore: f592388ccb12d9317609bdb1d8dda236e6c0a2be React-runtimeexecutor: 4b0c6eb341c7d3ceb5e2385cb0fdb9bf701024f3 ReactCommon: 7a2714d1128f965392b6f99a8b390e3aa38c9569 ScreenshotManager: dd14e8064e4e3e84c7f568431c8439cb7c1df81e diff --git a/scripts/react_native_pods.rb b/scripts/react_native_pods.rb index fda7acb30bbd..c7b8cd37cf76 100644 --- a/scripts/react_native_pods.rb +++ b/scripts/react_native_pods.rb @@ -73,6 +73,7 @@ def use_react_native! (options={}) if fabric_enabled pod 'React-Fabric', :path => "#{prefix}/ReactCommon" + pod 'React-rncore', :path => "#{prefix}/ReactCommon" pod 'React-graphics', :path => "#{prefix}/ReactCommon/react/renderer/graphics" pod 'React-jsi/Fabric', :path => "#{prefix}/ReactCommon/jsi" pod 'React-RCTFabric', :path => "#{prefix}/React" @@ -257,7 +258,10 @@ def generate_temp_pod_spec_for_codegen!(fabric_enabled) } if fabric_enabled - spec[:'dependencies'].merge!({'React-graphics': [version]}); + spec[:'dependencies'].merge!({ + 'React-graphics': [version], + 'React-rncore': [version], + }); end podspec_path = File.join(output_dir, 'React-Codegen.podspec.json') From 3dff1fabdd6ae1d5780ee4fc1872604d0d6b290c Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 27 Oct 2021 09:44:05 -0700 Subject: [PATCH 078/628] Do not publish tests inside the npm package Summary: I'm removing the `src/test` folder from the npm bundle as it's not really needed for the sake of distributing the gradle plugin. Changelog: [Internal] [Changed] - Do not publish tests inside the react-native-gradle-plugin npm package Reviewed By: ShikaSD Differential Revision: D31956449 fbshipit-source-id: b84138d24a7c51c44b92ebfc84f35afb3668dee5 --- packages/react-native-gradle-plugin/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-gradle-plugin/package.json b/packages/react-native-gradle-plugin/package.json index 25cdbff2b962..29c9b1e21165 100644 --- a/packages/react-native-gradle-plugin/package.json +++ b/packages/react-native-gradle-plugin/package.json @@ -20,7 +20,7 @@ "gradle", "gradlew", "gradlew.bat", - "src", + "src/main", "README.md" ], "dependencies": { From 25605fb6c5e233c7b2fbf297edcb370b0a9dcaa5 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 27 Oct 2021 10:19:00 -0700 Subject: [PATCH 079/628] Bump version to 0.0.2 Summary: Publishing a new version of the Gradle plugin as we need to distribute some changes before releasing the playbook to the public. Changelog: [Internal] [Changed] - Bump react-native-gradle-plugin to 0.0.2 Reviewed By: ShikaSD Differential Revision: D31957686 fbshipit-source-id: ef6742a205f2b568714c349dcb6481af33254b9b --- packages/react-native-gradle-plugin/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-gradle-plugin/package.json b/packages/react-native-gradle-plugin/package.json index 29c9b1e21165..d51d53644261 100644 --- a/packages/react-native-gradle-plugin/package.json +++ b/packages/react-native-gradle-plugin/package.json @@ -1,6 +1,6 @@ { "name": "react-native-gradle-plugin", - "version": "0.0.1", + "version": "0.0.2", "description": "⚛️ Gradle Plugin for React Native", "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/react-native-gradle-plugin", "repository": { From 61e1b6f86cf98d8a74eeb9353143fe0c624fe6e6 Mon Sep 17 00:00:00 2001 From: Xin Chen Date: Wed, 27 Oct 2021 13:58:03 -0700 Subject: [PATCH 080/628] Fix #flingAndSnap to check all the scroll item for offset range Summary: When calculating the offset range, we assume the first item is always at offset zero position and skipped that (as the smallerOffset is zero). However, this may not be the case in some situations. This diff changes the range measuring loop to always start from the first item. Changelog: [Android][Fixed] - Do NOT skip the first child view in the scroll view group when measuring the lower and upper bounds for snapping. Reviewed By: mdvacca Differential Revision: D31887086 fbshipit-source-id: af7221a621b2719d057afa6b64aa91c94ac01295 --- .../facebook/react/views/scroll/ReactHorizontalScrollView.java | 2 +- .../java/com/facebook/react/views/scroll/ReactScrollView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index 470c7d0f9bff..a92a848c688b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -983,7 +983,7 @@ private void flingAndSnap(int velocityX) { maximumOffset); } else { ViewGroup contentView = (ViewGroup) getContentView(); - for (int i = 1; i < contentView.getChildCount(); i++) { + for (int i = 0; i < contentView.getChildCount(); i++) { View item = contentView.getChildAt(i); int itemStartOffset = getItemStartOffset(mSnapToAlignment, item.getLeft(), item.getWidth(), width); diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java index 3b2265aa186e..2abf2923a3e0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java @@ -766,7 +766,7 @@ private void flingAndSnap(int velocityY) { maximumOffset); } else { ViewGroup contentView = (ViewGroup) getContentView(); - for (int i = 1; i < contentView.getChildCount(); i++) { + for (int i = 0; i < contentView.getChildCount(); i++) { View item = contentView.getChildAt(i); int itemStartOffset; switch (mSnapToAlignment) { From a6d8a9970d708e8028c00859f4b9446f43391616 Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Thu, 28 Oct 2021 15:46:53 -0700 Subject: [PATCH 081/628] Add ios template build test Summary: Changelog: [Internal] - Add iOS template app test Reviewed By: sota000 Differential Revision: D31747179 fbshipit-source-id: d49c32c7652f91bdfd463509787096a41bbcc7b0 --- .circleci/config.yml | 65 +++++++++++++++++++++++++++++++------- scripts/publish-npm.js | 7 ++-- scripts/test-manual-e2e.sh | 20 ++++++------ 3 files changed, 69 insertions(+), 23 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1118ce028b7e..a39f4b288fb5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -597,6 +597,39 @@ jobs: name: Build the template application command: cd template/android/ && ./gradlew assembleDebug + # ------------------------- + # JOBS: Test iOS Template + # ------------------------- + test_ios_template: + executor: reactnativeios + environment: + - PROJECT_NAME: "iOSTemplateProject" + + steps: + - checkout + - run_yarn + - attach_workspace: + at: . + + - run: + name: Create iOS template project + command: | + REPO_ROOT=$(pwd) + PACKAGE=$(cat build/react-native-package-version) + PATH_TO_PACKAGE="$REPO_ROOT/build/$PACKAGE" + node ./scripts/set-rn-template-version.js "file:$PATH_TO_PACKAGE" + mkdir -p ~/tmp + cd ~/tmp + node "$REPO_ROOT/cli.js" init "$PROJECT_NAME" --template "$REPO_ROOT" + + - run: + name: Build template project + command: | + xcodebuild build \ + -workspace ~/tmp/$PROJECT_NAME/ios/$PROJECT_NAME.xcworkspace \ + -scheme $PROJECT_NAME \ + -sdk iphonesimulator + # ------------------------- # JOBS: Windows # ------------------------- @@ -750,9 +783,15 @@ jobs: mkdir -p build FILENAME=$(npm pack) mv $FILENAME build/ + echo $FILENAME > build/react-native-package-version - store_artifacts: path: ~/react-native/build/ destination: build + - persist_to_workspace: + root: . + paths: + - build/* + - when: condition: matches: { pattern: '^pull\/.*$', value: << pipeline.git.branch >> } @@ -782,6 +821,15 @@ workflows: tests: jobs: + - build_npm_package: + # Build a release package on every untagged commit, but do not publish to npm. + publish_npm_args: --dry-run + filters: + branches: + only: + - main + - /^pull\/.*$/ + - /^(\d+)\.(\d+)-stable$/ - test_js: run_disabled_tests: false filters: @@ -796,6 +844,12 @@ workflows: filters: branches: ignore: gh-pages + - test_ios_template: + requires: + - build_npm_package + filters: + branches: + ignore: gh-pages - test_ios: name: test_ios_unit_jsc run_unit_tests: true @@ -854,17 +908,6 @@ workflows: # Only act on version tags. tags: only: /v[0-9]+(\.[0-9]+)*(\-rc(\.[0-9]+)?)?/ - - build_npm_package: - # Build a release package on every untagged commit, but do not publish to npm. - publish_npm_args: --dry-run - filters: - branches: - only: - - main - - /^pull\/.*$/ - - /^(\d+)\.(\d+)-stable$/ - tags: - ignore: /v[0-9]+(\.[0-9]+)*(\-rc(\.[0-9]+)?)?/ analysis: jobs: diff --git a/scripts/publish-npm.js b/scripts/publish-npm.js index 0b9deee0f23c..86e83fd59e71 100644 --- a/scripts/publish-npm.js +++ b/scripts/publish-npm.js @@ -118,16 +118,17 @@ if (!buildFromMain && tagsWithVersion.length === 0) { let releaseVersion; if (buildFromMain) { - releaseVersion = '0.0.0'; - if (nightlyBuild) { - releaseVersion += '-'; + releaseVersion = '0.0.0-'; // 2021-09-28T05:38:40.669Z -> 20210928-0538 releaseVersion += new Date() .toISOString() .slice(0, -8) .replace(/[-:]/g, '') .replace(/[T]/g, '-'); + } else { + // 0.0.0 triggers issues with cocoapods for codegen for building template project. + releaseVersion = '1000.0.0'; } releaseVersion += `-${currentCommit.slice(0, 9)}`; diff --git a/scripts/test-manual-e2e.sh b/scripts/test-manual-e2e.sh index 26c628935c80..235013e2a24a 100755 --- a/scripts/test-manual-e2e.sh +++ b/scripts/test-manual-e2e.sh @@ -22,15 +22,6 @@ info() { echo -e "$BLUE""$*""$ENDCOLOR" } -PACKAGE_VERSION=$(cat package.json \ - | grep version \ - | head -1 \ - | awk -F: '{ print $2 }' \ - | sed 's/[",]//g' \ - | tr -d '[[:space:]]') - -success "Preparing version $PACKAGE_VERSION" - repo_root=$(pwd) rm -rf android @@ -101,6 +92,17 @@ success "Killing packager" lsof -i :8081 | grep LISTEN lsof -i :8081 | grep LISTEN | /usr/bin/awk '{print $2}' | xargs kill +# Testing the template app + +PACKAGE_VERSION=$(cat package.json \ + | grep version \ + | head -1 \ + | awk -F: '{ print $2 }' \ + | sed 's/[",]//g' \ + | tr -d '[[:space:]]') + +success "Preparing version $PACKAGE_VERSION" + npm pack TIMESTAMP=$(date +%s) From 58c9d8eda76d7032569c0c388b6f2f6afa1e0eb1 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Fri, 29 Oct 2021 10:42:09 -0700 Subject: [PATCH 082/628] Fix "Duplicate license header lint error" in Component generators Summary: See title. Changelog: [Internal] Reviewed By: yungsters Differential Revision: D32019151 fbshipit-source-id: aea69a6c032cef1c99cd7641bdc10e730076e781 --- .../src/generators/components/GenerateComponentDescriptorH.js | 2 +- .../src/generators/components/GenerateComponentHObjCpp.js | 2 +- .../src/generators/components/GenerateEventEmitterCpp.js | 2 +- .../src/generators/components/GenerateEventEmitterH.js | 2 +- .../src/generators/components/GeneratePropsCpp.js | 2 +- .../src/generators/components/GeneratePropsH.js | 2 +- .../src/generators/components/GeneratePropsJavaDelegate.js | 2 +- .../src/generators/components/GeneratePropsJavaInterface.js | 2 +- .../src/generators/components/GenerateShadowNodeCpp.js | 2 +- .../src/generators/components/GenerateShadowNodeH.js | 2 +- .../src/generators/components/GenerateTests.js | 2 +- .../src/generators/components/GenerateViewConfigJs.js | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js b/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js index 7e670d98e386..523def828471 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js @@ -17,7 +17,7 @@ type FilesOutput = Map; const template = ` /** - * Copyright (c) Facebook, Inc. and its affiliates. + * ${'C'}opyright (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. diff --git a/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js b/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js index d664e3c2b8a3..e78810ef70b0 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js @@ -85,7 +85,7 @@ RCT_EXTERN inline void RCT::_COMPONENT_NAME_::HandleCommand( const template = ` /** -* Copyright (c) Facebook, Inc. and its affiliates. +* ${'C'}opyright (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. diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js index 4702ed5614b9..d9ed177394d1 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js @@ -29,7 +29,7 @@ type ComponentCollection = $ReadOnly<{ const template = ` /** - * Copyright (c) Facebook, Inc. and its affiliates. + * ${'C'}opyright (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. diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js index 65b4fc631087..a4a4f1f98e71 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js @@ -37,7 +37,7 @@ type ComponentCollection = $ReadOnly<{ const template = ` /** - * Copyright (c) Facebook, Inc. and its affiliates. + * ${'C'}opyright (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. diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js index b29fdf7adf9d..ca3e743c778a 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js @@ -18,7 +18,7 @@ type FilesOutput = Map; const template = ` /** - * Copyright (c) Facebook, Inc. and its affiliates. + * ${'C'}opyright (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. diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js index 6cb6ca5bc2b6..e580ca8c1785 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js @@ -34,7 +34,7 @@ type StructsMap = Map; const template = ` /** - * Copyright (c) Facebook, Inc. and its affiliates. + * ${'C'}opyright (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. diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js index 9f35f8e57546..f3a09291359f 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js @@ -28,7 +28,7 @@ const { type FilesOutput = Map; const template = `/** -* Copyright (c) Facebook, Inc. and its affiliates. +* ${'C'}opyright (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. diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js index fd4e891dea5d..86ed99f80f08 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js @@ -27,7 +27,7 @@ const { type FilesOutput = Map; const template = `/** -* Copyright (c) Facebook, Inc. and its affiliates. +* ${'C'}opyright (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. diff --git a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js index 4c11da440c38..bc86669d9ca4 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js @@ -17,7 +17,7 @@ type FilesOutput = Map; const template = ` /** - * Copyright (c) Facebook, Inc. and its affiliates. + * ${'C'}opyright (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. diff --git a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js index c976955ce0f3..30e5c573f9d1 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js @@ -17,7 +17,7 @@ type FilesOutput = Map; const template = ` /** - * Copyright (c) Facebook, Inc. and its affiliates. + * ${'C'}opyright (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. diff --git a/packages/react-native-codegen/src/generators/components/GenerateTests.js b/packages/react-native-codegen/src/generators/components/GenerateTests.js index 1681fd9922fa..691eefffd74d 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateTests.js +++ b/packages/react-native-codegen/src/generators/components/GenerateTests.js @@ -25,7 +25,7 @@ type TestCase = $ReadOnly<{ const fileTemplate = ` /** - * Copyright (c) Facebook, Inc. and its affiliates. + * ${'C'}opyright (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. diff --git a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js index a1cc70506524..3b74670d90ca 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js +++ b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js @@ -19,7 +19,7 @@ type FilesOutput = Map; const template = ` /** - * Copyright (c) Facebook, Inc. and its affiliates. + * ${'C'}opyright (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. From 70785e3d5a41bc85cea83aec0240e9f11aeff1ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ramos?= Date: Fri, 29 Oct 2021 11:05:42 -0700 Subject: [PATCH 083/628] generate-specs-cli: Parse arguments using yargs Summary: Make `generate-specs-cli.js` use named arguments. Updated all `generate-specs-cli.js` callsites to make use of named arguments. Changelog: [Internal] Reviewed By: sota000 Differential Revision: D31908041 fbshipit-source-id: f2cb5967db3c3b847e1095e35e8d5d21585be27b --- .../tasks/GenerateCodegenArtifactsTask.kt | 5 ++ .../tasks/GenerateCodegenArtifactsTaskTest.kt | 5 ++ packages/rn-tester/Podfile.lock | 6 +- scripts/generate-artifacts.js | 4 +- scripts/generate-specs-cli.js | 55 ++++++++++++++----- scripts/react_native_pods.rb | 2 +- 6 files changed, 59 insertions(+), 18 deletions(-) diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt index 599741c57b42..ad9434cf53c5 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt @@ -68,10 +68,15 @@ abstract class GenerateCodegenArtifactsTask : Exec() { windowsAwareYarn( *nodeExecutableAndArgs.get().toTypedArray(), reactRoot.file("scripts/generate-specs-cli.js").get().asFile.absolutePath, + "--platform", "android", + "--schemaPath", generatedSchemaFile.get().asFile.absolutePath, + "--outputDir", generatedSrcDir.get().asFile.absolutePath, + "--libraryName", libraryName.get(), + "--javaPackageName", codegenJavaPackageName.get())) } } diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt index b07244f49e81..a9df6181d42a 100644 --- a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt @@ -100,10 +100,15 @@ class GenerateCodegenArtifactsTaskTest { "yarn", "--verbose", File(reactRoot, "scripts/generate-specs-cli.js").toString(), + "--platform", "android", + "--schemaPath", File(outputDir, "schema.json").toString(), + "--outputDir", outputDir.toString(), + "--libraryName", "example-test", + "--javaPackageName", "com.example.test", ), task.commandLine.toMutableList()) diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index 73bb0aa797a0..364a7ca3412d 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -881,7 +881,7 @@ SPEC CHECKSUMS: CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662 FBLazyVector: b81a2b70c72d8b0aefb652cea22c11e9ffd02949 - FBReactNativeSpec: 8c199be18a891a49a1e24b3501e953a51311a46c + FBReactNativeSpec: c72b6aa43f36a4bfa45376f24ac5d10339070635 Flipper: 30e8eeeed6abdc98edaf32af0cda2f198be4b733 Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c Flipper-DoubleConversion: 57ffbe81ef95306cc9e69c4aa3aeeeeb58a6a28c @@ -923,10 +923,10 @@ SPEC CHECKSUMS: React-RCTTest: 12bbd7fc2e72bd9920dc7286c5b8ef96639582b6 React-RCTText: e9146b2c0550a83d1335bfe2553760070a2d75c7 React-RCTVibration: 50be9c390f2da76045ef0dfdefa18b9cf9f35cfa - React-rncore: f592388ccb12d9317609bdb1d8dda236e6c0a2be + React-rncore: 95c628b2be148269a3189ad1c9f4390b6c73a7d7 React-runtimeexecutor: 4b0c6eb341c7d3ceb5e2385cb0fdb9bf701024f3 ReactCommon: 7a2714d1128f965392b6f99a8b390e3aa38c9569 - ScreenshotManager: dd14e8064e4e3e84c7f568431c8439cb7c1df81e + ScreenshotManager: 965ca5b82e28f0d7baac83c275521770407c60a4 Yoga: c0d06f5380d34e939f55420669a60fe08b79bd75 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a diff --git a/scripts/generate-artifacts.js b/scripts/generate-artifacts.js index 8fdb8e06ad37..577809708279 100644 --- a/scripts/generate-artifacts.js +++ b/scripts/generate-artifacts.js @@ -178,7 +178,9 @@ function main(appRootDir) { RN_ROOT, 'scripts', 'generate-specs-cli.js', - )} ios ${pathToSchema} ${pathToTempOutputDir} ${library.config.name}`, + )} --platform ios --schemaPath ${pathToSchema} --outputDir ${pathToTempOutputDir} --libraryName ${ + library.config.name + }`, ); fs.mkdirSync(pathToOutputDirIOS, {recursive: true}); execSync(`cp -R ${pathToTempOutputDir}/* ${pathToOutputDirIOS}`); diff --git a/scripts/generate-specs-cli.js b/scripts/generate-specs-cli.js index cfa8546f5ffe..db0def52722e 100644 --- a/scripts/generate-specs-cli.js +++ b/scripts/generate-specs-cli.js @@ -22,6 +22,42 @@ try { const fs = require('fs'); const mkdirp = require('mkdirp'); const path = require('path'); +const yargs = require('yargs'); + +const argv = yargs + .option('p', { + alias: 'platform', + describe: 'Platform to generate native code artifacts for.', + }) + .option('s', { + alias: 'schemaPath', + describe: 'The path to the schema file.', + }) + .option('o', { + alias: 'outputDir', + describe: + 'Path to directory where native code source files should be saved.', + }) + .option('n', { + alias: 'libraryName', + describe: 'Name of specs library.', + default: 'FBReactNativeSpec', + }) + .option('j', { + alias: 'javaPackageName', + describe: 'Name of Java package.', + default: 'com.facebook.fbreact.specs', + }) + .option('t', { + alias: 'libraryType', + describe: 'all, components, or modules.', + default: 'all', + }) + .usage('Usage: $0 ') + .demandOption( + ['platform', 'schemaPath', 'outputDir'], + 'Please provide platform, schema path, and output directory.', + ).argv; const GENERATORS = { all: { @@ -97,20 +133,13 @@ function generateSpec( } function main() { - const args = process.argv.slice(2); - const platform = args[0]; - const schemaPath = args[1]; - const outputDir = args[2]; - const libraryName = args[3] || 'FBReactNativeSpec'; - const javaPackageName = args[4] || 'com.facebook.fbreact.specs'; - const libraryType = args[5] || 'all'; // all, components, or modules generateSpec( - platform, - schemaPath, - outputDir, - libraryName, - javaPackageName, - libraryType, + argv.platform, + argv.schemaPath, + argv.outputDir, + argv.libraryName, + argv.javaPackageName, + argv.libraryType, ); } diff --git a/scripts/react_native_pods.rb b/scripts/react_native_pods.rb index c7b8cd37cf76..746f68460b14 100644 --- a/scripts/react_native_pods.rb +++ b/scripts/react_native_pods.rb @@ -436,7 +436,7 @@ def use_react_native_codegen!(spec, options={}) generateCodegenArtifactsFromSchema () { describe "Generating codegen artifacts from schema" pushd "$RN_DIR" >/dev/null || exit 1 - "$NODE_BINARY" "scripts/generate-specs-cli.js" ios "$GENERATED_SCHEMA_FILE" "$TEMP_OUTPUT_DIR" "$LIBRARY_NAME" "" "$LIBRARY_TYPE" + "$NODE_BINARY" "scripts/generate-specs-cli.js" --platform ios --schemaPath "$GENERATED_SCHEMA_FILE" --outputDir "$TEMP_OUTPUT_DIR" --libraryName "$LIBRARY_NAME" --libraryType "$LIBRARY_TYPE" popd >/dev/null || exit 1 } From bbb52aa276d47ee4c70e37ba434ad5e47d1206f5 Mon Sep 17 00:00:00 2001 From: Ken Tominaga Date: Fri, 29 Oct 2021 15:11:34 -0700 Subject: [PATCH 084/628] Fix Fabric debug message when we set `fabric_enabled = false` in `rn-tester` (#32502) Summary: The debug message stays `Building RNTester with Fabric enabled.` even if we set `fabric_enabled = false` This pull request changes the message like below when `fabric_enabled = false` `Building RNTester with Fabric disabled.` ## Changelog [iOS] [Fixed] - Fix the debug message for Fabric in rn-tester Pull Request resolved: https://github.com/facebook/react-native/pull/32502 Reviewed By: sota000 Differential Revision: D32027858 Pulled By: lunaleaps fbshipit-source-id: baf5301581e354f588830acd12a5e8171799b1ca --- packages/rn-tester/Podfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rn-tester/Podfile b/packages/rn-tester/Podfile index 2dc16c00437d..239d7b4f1c71 100644 --- a/packages/rn-tester/Podfile +++ b/packages/rn-tester/Podfile @@ -21,8 +21,8 @@ end def pods() project 'RNTesterPods.xcodeproj' - puts "Building RNTester with Fabric enabled." fabric_enabled = true + puts "Building RNTester with Fabric #{fabric_enabled ? "enabled" : "disabled"}." prefix_path = "../.." use_react_native!(path: prefix_path, fabric_enabled: fabric_enabled, hermes_enabled: ENV['USE_HERMES'] == '1') From c8b83d4e0b33c2af45093f7b2262ee578ece2faf Mon Sep 17 00:00:00 2001 From: grgr-dkrk <40130327+grgr-dkrk@users.noreply.github.com> Date: Fri, 29 Oct 2021 18:39:38 -0700 Subject: [PATCH 085/628] feat: add `isAccessibilityServiceEnabled` (#31396) Summary: fix https://github.com/facebook/react-native/issues/30863 This PR adds `isAccessibilityServiceEnabled` to get if accessibility services are enabled on Android. ## Changelog [Android] [Added] - Added `isAccessibilityServiceEnabled` to get if accessibility services are enabled Pull Request resolved: https://github.com/facebook/react-native/pull/31396 Test Plan: ![accessibilityService](https://user-images.githubusercontent.com/40130327/115560972-11d5b100-a2f0-11eb-8aa2-7c52dc71ca59.gif) Reviewed By: yungsters Differential Revision: D31911880 Pulled By: lunaleaps fbshipit-source-id: 9ae294999a6d46bf051ab658507bf97764a945d2 --- .../AccessibilityInfo/AccessibilityInfo.js | 34 +++++++++++++++ .../NativeAccessibilityInfo.js | 3 ++ .../AccessibilityInfoModule.java | 41 +++++++++++++++++++ jest/setup.js | 1 + .../Accessibility/AccessibilityExample.js | 20 ++++++++- 5 files changed, 98 insertions(+), 1 deletion(-) diff --git a/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js b/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js index 3933de41bc9d..ed2c4a3644e1 100644 --- a/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +++ b/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js @@ -19,6 +19,11 @@ import NativeAccessibilityManagerIOS from './NativeAccessibilityManager'; import legacySendAccessibilityEvent from './legacySendAccessibilityEvent'; import type {ElementRef} from 'react'; +// Events that are only supported on Android. +type AccessibilityEventDefinitionsAndroid = { + accessibilityServiceChanged: [boolean], +}; + // Events that are only supported on iOS. type AccessibilityEventDefinitionsIOS = { announcementFinished: [{announcement: string, success: boolean}], @@ -29,6 +34,7 @@ type AccessibilityEventDefinitionsIOS = { }; type AccessibilityEventDefinitions = { + ...AccessibilityEventDefinitionsAndroid, ...AccessibilityEventDefinitionsIOS, change: [boolean], // screenReaderChanged reduceMotionChanged: [boolean], @@ -44,6 +50,7 @@ const EventNames: Map<$Keys, string> = ['change', 'touchExplorationDidChange'], ['reduceMotionChanged', 'reduceMotionDidChange'], ['screenReaderChanged', 'touchExplorationDidChange'], + ['accessibilityServiceChanged', 'accessibilityServiceDidChange'], ]) : new Map([ ['announcementFinished', 'announcementFinished'], @@ -224,6 +231,33 @@ const AccessibilityInfo = { }); }, + /** + * Query whether Accessibility Service is currently enabled. + * + * Returns a promise which resolves to a boolean. + * The result is `true` when any service is enabled and `false` otherwise. + * + * @platform android + * + * See https://reactnative.dev/docs/accessibilityinfo/#isaccessibilityserviceenabled-android + */ + isAccessibilityServiceEnabled(): Promise { + return new Promise((resolve, reject) => { + if (Platform.OS === 'android') { + if ( + NativeAccessibilityInfoAndroid != null && + NativeAccessibilityInfoAndroid.isAccessibilityServiceEnabled != null + ) { + NativeAccessibilityInfoAndroid.isAccessibilityServiceEnabled(resolve); + } else { + reject(null); + } + } else { + reject(null); + } + }); + }, + /** * Add an event handler. Supported events: * diff --git a/Libraries/Components/AccessibilityInfo/NativeAccessibilityInfo.js b/Libraries/Components/AccessibilityInfo/NativeAccessibilityInfo.js index 916667aa5c2c..c9eecfde41ce 100644 --- a/Libraries/Components/AccessibilityInfo/NativeAccessibilityInfo.js +++ b/Libraries/Components/AccessibilityInfo/NativeAccessibilityInfo.js @@ -18,6 +18,9 @@ export interface Spec extends TurboModule { +isTouchExplorationEnabled: ( onSuccess: (isScreenReaderEnabled: boolean) => void, ) => void; + +isAccessibilityServiceEnabled?: ?( + onSuccess: (isAccessibilityServiceEnabled: boolean) => void, + ) => void; +setAccessibilityFocus: (reactTag: number) => void; +announceForAccessibility: (announcement: string) => void; +getRecommendedTimeoutMillis?: ( diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java index ad148228cd9b..b68412bcef72 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java @@ -46,6 +46,19 @@ public void onTouchExplorationStateChanged(boolean enabled) { } } + // Android can listen for accessibility service enable with `accessibilityStateChange`, but + // `accessibilityState` conflicts with React Native props and confuses developers. Therefore, the + // name `accessibilityServiceChange` is used here instead. + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private class ReactAccessibilityServiceChangeListener + implements AccessibilityManager.AccessibilityStateChangeListener { + + @Override + public void onAccessibilityStateChanged(boolean enabled) { + updateAndSendAccessibilityServiceChangeEvent(enabled); + } + } + // Listener that is notified when the global TRANSITION_ANIMATION_SCALE. private final ContentObserver animationScaleObserver = new ContentObserver(new Handler(Looper.getMainLooper())) { @@ -64,13 +77,16 @@ public void onChange(boolean selfChange, Uri uri) { private @Nullable AccessibilityManager mAccessibilityManager; private @Nullable ReactTouchExplorationStateChangeListener mTouchExplorationStateChangeListener; + private @Nullable ReactAccessibilityServiceChangeListener mAccessibilityServiceChangeListener; private final ContentResolver mContentResolver; private boolean mReduceMotionEnabled = false; private boolean mTouchExplorationEnabled = false; + private boolean mAccessibilityServiceEnabled = false; private int mRecommendedTimeout; private static final String REDUCE_MOTION_EVENT_NAME = "reduceMotionDidChange"; private static final String TOUCH_EXPLORATION_EVENT_NAME = "touchExplorationDidChange"; + private static final String ACCESSIBILITY_SERVICE_EVENT_NAME = "accessibilityServiceDidChange"; public AccessibilityInfoModule(ReactApplicationContext context) { super(context); @@ -79,8 +95,10 @@ public AccessibilityInfoModule(ReactApplicationContext context) { (AccessibilityManager) appContext.getSystemService(Context.ACCESSIBILITY_SERVICE); mContentResolver = getReactApplicationContext().getContentResolver(); mTouchExplorationEnabled = mAccessibilityManager.isTouchExplorationEnabled(); + mAccessibilityServiceEnabled = mAccessibilityManager.isEnabled(); mReduceMotionEnabled = this.getIsReduceMotionEnabledValue(); mTouchExplorationStateChangeListener = new ReactTouchExplorationStateChangeListener(); + mAccessibilityServiceChangeListener = new ReactAccessibilityServiceChangeListener(); } @Override @@ -106,6 +124,11 @@ public void isTouchExplorationEnabled(Callback successCallback) { successCallback.invoke(mTouchExplorationEnabled); } + @Override + public void isAccessibilityServiceEnabled(Callback successCallback) { + successCallback.invoke(mAccessibilityServiceEnabled); + } + private void updateAndSendReduceMotionChangeEvent() { boolean isReduceMotionEnabled = this.getIsReduceMotionEnabledValue(); @@ -134,16 +157,31 @@ private void updateAndSendTouchExplorationChangeEvent(boolean enabled) { } } + private void updateAndSendAccessibilityServiceChangeEvent(boolean enabled) { + if (mAccessibilityServiceEnabled != enabled) { + mAccessibilityServiceEnabled = enabled; + + ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn(); + if (reactApplicationContext != null) { + getReactApplicationContext() + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit(ACCESSIBILITY_SERVICE_EVENT_NAME, mAccessibilityServiceEnabled); + } + } + } + @Override @TargetApi(Build.VERSION_CODES.LOLLIPOP) public void onHostResume() { mAccessibilityManager.addTouchExplorationStateChangeListener( mTouchExplorationStateChangeListener); + mAccessibilityManager.addAccessibilityStateChangeListener(mAccessibilityServiceChangeListener); Uri transitionUri = Settings.Global.getUriFor(Settings.Global.TRANSITION_ANIMATION_SCALE); mContentResolver.registerContentObserver(transitionUri, false, animationScaleObserver); updateAndSendTouchExplorationChangeEvent(mAccessibilityManager.isTouchExplorationEnabled()); + updateAndSendAccessibilityServiceChangeEvent(mAccessibilityManager.isEnabled()); updateAndSendReduceMotionChangeEvent(); } @@ -152,6 +190,8 @@ public void onHostResume() { public void onHostPause() { mAccessibilityManager.removeTouchExplorationStateChangeListener( mTouchExplorationStateChangeListener); + mAccessibilityManager.removeAccessibilityStateChangeListener( + mAccessibilityServiceChangeListener); mContentResolver.unregisterContentObserver(animationScaleObserver); } @@ -160,6 +200,7 @@ public void onHostPause() { public void initialize() { getReactApplicationContext().addLifecycleEventListener(this); updateAndSendTouchExplorationChangeEvent(mAccessibilityManager.isTouchExplorationEnabled()); + updateAndSendAccessibilityServiceChangeEvent(mAccessibilityManager.isEnabled()); updateAndSendReduceMotionChangeEvent(); } diff --git a/jest/setup.js b/jest/setup.js index 778778859da0..8aed65f3b82f 100644 --- a/jest/setup.js +++ b/jest/setup.js @@ -123,6 +123,7 @@ jest default: { addEventListener: jest.fn(), announceForAccessibility: jest.fn(), + isAccessibilityServiceEnabled: jest.fn(), isBoldTextEnabled: jest.fn(), isGrayscaleEnabled: jest.fn(), isInvertColorsEnabled: jest.fn(), diff --git a/packages/rn-tester/js/examples/Accessibility/AccessibilityExample.js b/packages/rn-tester/js/examples/Accessibility/AccessibilityExample.js index 6133080a4adf..95734b01d612 100644 --- a/packages/rn-tester/js/examples/Accessibility/AccessibilityExample.js +++ b/packages/rn-tester/js/examples/Accessibility/AccessibilityExample.js @@ -942,6 +942,19 @@ class EnabledExamples extends React.Component<{}> { ) : null} + {Platform.OS === 'android' ? ( + + + + ) : null} + { this.setState({isEnabled: state}); }); + case 'accessibilityServiceChanged': + return AccessibilityInfo.isAccessibilityServiceEnabled().then(state => { + this.setState({isEnabled: state}); + }); default: return null; } From d150529656c120afcd4f8edd1663b2d3a48762a5 Mon Sep 17 00:00:00 2001 From: Marshall Roch Date: Fri, 29 Oct 2021 19:04:26 -0700 Subject: [PATCH 086/628] Deploy 0.163.0 to xplat Summary: Changelog: [Internal] Reviewed By: evanyeung Differential Revision: D32025457 fbshipit-source-id: f2c08e4baa9a39731ab970b917d2c67c852e9603 --- .flowconfig | 2 +- .flowconfig.android | 2 +- package.json | 4 ++-- repo-config/package.json | 2 +- template/_flowconfig | 2 +- yarn.lock | 8 ++++---- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.flowconfig b/.flowconfig index a7e698c44212..42f03723b024 100644 --- a/.flowconfig +++ b/.flowconfig @@ -71,4 +71,4 @@ untyped-import untyped-type-import [version] -^0.162.0 +^0.163.0 diff --git a/.flowconfig.android b/.flowconfig.android index 10a1f58d0d1b..6cd34177b91a 100644 --- a/.flowconfig.android +++ b/.flowconfig.android @@ -71,4 +71,4 @@ untyped-import untyped-type-import [version] -^0.162.0 +^0.163.0 diff --git a/package.json b/package.json index c3c5e4c803cf..e69b391d357a 100644 --- a/package.json +++ b/package.json @@ -98,8 +98,8 @@ "abort-controller": "^3.0.0", "anser": "^1.4.9", "base64-js": "^1.1.2", - "event-target-shim": "^5.0.1", "deprecated-react-native-prop-types": "^2.1.0", + "event-target-shim": "^5.0.1", "hermes-engine": "~0.9.0", "invariant": "^2.2.4", "jsc-android": "^250230.2.1", @@ -120,7 +120,7 @@ "ws": "^6.1.4" }, "devDependencies": { - "flow-bin": "^0.162.0", + "flow-bin": "^0.163.0", "react": "17.0.2" }, "detox": { diff --git a/repo-config/package.json b/repo-config/package.json index 75aec75e2637..9aa4c9c509c6 100644 --- a/repo-config/package.json +++ b/repo-config/package.json @@ -36,7 +36,7 @@ "eslint-plugin-react-hooks": "^4.2.0", "eslint-plugin-react-native": "3.10.0", "eslint-plugin-relay": "1.8.1", - "flow-bin": "^0.162.0", + "flow-bin": "^0.163.0", "jest": "^26.6.3", "jest-junit": "^10.0.0", "jscodeshift": "^0.11.0", diff --git a/template/_flowconfig b/template/_flowconfig index f0bc7b9aa327..6687c1abbbed 100644 --- a/template/_flowconfig +++ b/template/_flowconfig @@ -62,4 +62,4 @@ untyped-import untyped-type-import [version] -^0.162.0 +^0.163.0 diff --git a/yarn.lock b/yarn.lock index 38a23b3a06aa..7f952b7629ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3037,10 +3037,10 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -flow-bin@^0.162.0: - version "0.162.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.162.0.tgz#26e3f9db2c93684499c68f1a85e57d888858dc5c" - integrity sha512-AXbDZjRzMQpmvyqeXlS9NV4eNHWGV1Fg/1v6FtuIAu+zsYJJ0mJ2JumqNUxF47rxOoeL9jGtuMxInx9rgqnFCw== +flow-bin@^0.163.0: + version "0.163.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.163.0.tgz#c2cb62e336cfdeac035a4cc86e143e1e5ff4d1d0" + integrity sha512-4rNdO/lT38/c+8SR4eZK+PthE9c3MFiDnr8TYBpIM77EkM2yl9Ug8N2oPPk0UJs6kG93Yb61G14s95dfSoUARA== flow-parser@0.*, flow-parser@^0.121.0: version "0.121.0" From 6790cf137f73f2d7863911f9115317048c66a6ee Mon Sep 17 00:00:00 2001 From: George Zahariev Date: Fri, 29 Oct 2021 20:07:30 -0700 Subject: [PATCH 087/628] Change usages of `exports.foo` and `module.exports.foo` to just `foo` Summary: Change usages of `exports.foo` and `module.exports.foo` to just `foo`. This will fix future errors when Flow no longer allows reads from `exports`/`module.exports`. Changelog: [Internal] Reviewed By: bradzacher Differential Revision: D32009490 fbshipit-source-id: bb609b37ba948b44c3877f8dbbfa9137b963586b --- .../examples/ScrollView/ScrollViewExample.js | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/rn-tester/js/examples/ScrollView/ScrollViewExample.js b/packages/rn-tester/js/examples/ScrollView/ScrollViewExample.js index 4668599fb2aa..05d7233a4dcb 100644 --- a/packages/rn-tester/js/examples/ScrollView/ScrollViewExample.js +++ b/packages/rn-tester/js/examples/ScrollView/ScrollViewExample.js @@ -34,7 +34,7 @@ exports.documentationURL = 'https://reactnative.dev/docs/scrollview'; exports.category = 'Basic'; exports.description = 'Component that enables scrolling through child components'; -exports.examples = ([ +const examples = ([ { name: 'scrollTo', title: '\n', @@ -269,7 +269,7 @@ exports.examples = ([ ]: Array); if (Platform.OS === 'ios') { - exports.examples.push({ + examples.push({ title: ' smooth bi-directional content loading\n', description: 'The `maintainVisibleContentPosition` prop allows insertions to either end of the content ' + @@ -391,7 +391,7 @@ if (Platform.OS === 'ios') { return ; }, }); - exports.examples.push({ + examples.push({ title: ' (centerContent = true)\n', description: 'ScrollView puts its content in the center if the content is smaller than scroll view', @@ -406,7 +406,7 @@ if (Platform.OS === 'ios') { return ; }, }); - exports.examples.push({ + examples.push({ title: ' (contentOffset = {x: 100, y: 0})\n', description: 'Initial contentOffset can be set on ScrollView.', render: function(): React.Node { @@ -423,7 +423,7 @@ if (Platform.OS === 'ios') { return ; }, }); - exports.examples.push({ + examples.push({ title: ' Always Bounces\n', description: 'Always bounce vertically or horizontally.', render: function(): React.Node { @@ -437,35 +437,35 @@ if (Platform.OS === 'ios') { ); }, }); - exports.examples.push({ + examples.push({ title: ' Bounces & Bounces Zoom\n', description: 'There are different options for bouncing behavior.', render: function(): React.Node { return ; }, }); - exports.examples.push({ + examples.push({ title: ' Indicator Style\n', description: 'There are different options for indicator style colors.', render: function(): React.Node { return ; }, }); - exports.examples.push({ + examples.push({ title: ' Maximum & Minimum Zoom Scale\n', description: 'Set the maximum and minimum allowed zoom scale.', render: function(): React.Node { return ; }, }); - exports.examples.push({ + examples.push({ title: ' Maximum & Minimum Zoom Scale\n', description: 'Set the maximum and minimum allowed zoom scale.', render: function(): React.Node { return ; }, }); - exports.examples.push({ + examples.push({ title: ' ScrollTo Options\n', description: 'Toggle scrollToOverflowEnabled and scrollsToTop. When scrollToOverflowEnabled is true, the scroll view can be programmatically scrolled beyond its content size. When scrollsToTop is true, the scroll view scrolls to top when the status bar is tapped.', @@ -474,14 +474,14 @@ if (Platform.OS === 'ios') { }, }); } else if (Platform.OS === 'android') { - exports.examples.push({ + examples.push({ title: ' EndFillColor & FadingEdgeLength\n', description: 'Toggle to set endFillColor and fadingEdgeLength.', render: function(): React.Node { return ; }, }); - exports.examples.push({ + examples.push({ title: ' persistentScrollBar\n', description: 'Toggle to set persistentScrollbar option.', render: function(): React.Node { @@ -489,6 +489,7 @@ if (Platform.OS === 'ios') { }, }); } +exports.examples = examples; const AndroidScrollBarOptions = () => { const [persistentScrollBar, setPersistentScrollBar] = useState(false); From b0711f1d35e56e5cb089d9b174692c77c094695a Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 1 Nov 2021 05:56:47 -0700 Subject: [PATCH 088/628] Update ReactAndroid to use the AGP NDK Apis (#32443) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32443 This diff removes all the custom Gradle machinery to build the native code and delegates to AGP the triggering of the `ndk-build` command. This means that the native build will be now invoked with the `:ReactAndroid:externalNativeBuild` task. An important thing to notice is that that task will always run, and will delegate to Make the compilation avoidance. If you invoke the task twice, the second time it will be significantly faster. On my machine this takes ~6/7 mins the first time, and 30 seconds the second time. There are some gotchas that are worth noting: * The native build will run on every build now. Given the complexity of our native build graph, even with an up-to-date build, Make will still take ~30 seconds on my machine to analyse all the targets and mention that there is no work to be done. I believe this could be impactful for local development experience. The mitigation I found was to apply an `abiFilter` to build only the ABI of the target device (e.g. arm64 for a real device and so on). This reduces the native build to ~10 seconds. * All the change to the `react-native-gradle-plugin` source will cause the Gradle tasks to be considered invalid. Therefore they will re-extract the header files inside the folders that are used by Make to compile, triggering a near-full rebuild. This can be a bit painful when building locally, if you plan to edit react-native-gradle-plugin and relaunch rn-tester (seems to be like an edge case scenario but worth pointing out). The mitigation here would be to invoke the tasks like ``` gw :packages:rn-tester:android:app:installHermesDebug -x prepareBoost -x prepareLibevent -x prepareGlog \ -x prepareJSC -x extractNativeDependencies -x generateCodegenArtifactsFromSchema \ -x generateCodegenSchemaFromJavaScript ``` Changelog: [Internal] [Changed] - Refactor Extract Headers and JNI from AARs to an internal task Reviewed By: ShikaSD Differential Revision: D31683721 fbshipit-source-id: fa85793c567796f4e04751e10503717a88cb0620 --- .circleci/config.yml | 2 +- .gitignore | 1 + ReactAndroid/build.gradle | 140 ++++-------------- .../src/main/jni/react/jni/Android.mk | 2 +- packages/rn-tester/android/app/build.gradle | 8 +- template/android/app/build.gradle | 5 + 6 files changed, 45 insertions(+), 113 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a39f4b288fb5..e5b6a8ddd23c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -515,7 +515,7 @@ jobs: - run: name: Compile Native Libs for Unit and Integration Tests command: ./gradlew :ReactAndroid:packageReactNdkLibsForBuck -Pjobs=$BUILD_THREADS - no_output_timeout: 6m + no_output_timeout: 30m # Build JavaScript Bundle for instrumentation tests - run: diff --git a/.gitignore b/.gitignore index c60f27e2a091..6d419dcf5597 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ project.xcworkspace /packages/rn-tester/android/app/gradlew /packages/rn-tester/android/app/gradlew.bat /ReactAndroid/build/ +/ReactAndroid/.cxx/ /ReactAndroid/gradle/ /ReactAndroid/gradlew /ReactAndroid/gradlew.bat diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index 779bdea62d02..ae8ddc796f87 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -212,39 +212,6 @@ def findNodeModulePath(baseDir, packageName) { return null } -def getNdkBuildName() { - if (Os.isFamily(Os.FAMILY_WINDOWS)) { - return "ndk-build.cmd" - } else { - return "ndk-build" - } -} - -def findNdkBuildFullPath() { - // android.ndkDirectory should return project.android.ndkVersion ndkDirectory - def ndkDir = android.ndkDirectory ? android.ndkDirectory.absolutePath : null - if (ndkDir) { - return new File(ndkDir, getNdkBuildName()).getAbsolutePath() - } - - // we allow to provide full path to ndk-build tool - if (hasProperty("ndk.command")) { - return property("ndk.command") - } - // or just a path to the containing directory - if (hasProperty("ndk.path")) { - ndkDir = property("ndk.path") - return new File(ndkDir, getNdkBuildName()).getAbsolutePath() - } - - // @TODO ANDROID_NDK && ndk.dir is deprecated and will be removed in the future. - if (System.getenv("ANDROID_NDK") != null) { - ndkDir = System.getenv("ANDROID_NDK") - return new File(ndkDir, getNdkBuildName()).getAbsolutePath() - } - - return null -} def reactNativeDevServerPort() { def value = project.getProperties().get("reactNativeDevServerPort") @@ -264,82 +231,15 @@ def reactNativeArchitectures() { return value != null && isDebug ? value : "all" } -def getNdkBuildFullPath() { - def ndkBuildFullPath = findNdkBuildFullPath() - if (ndkBuildFullPath == null) { - throw new GradleScriptException( - "ndk-build binary cannot be found, check if you've set " + - "\$ANDROID_NDK environment variable correctly or if ndk.dir is " + - "setup in local.properties", - null) - } - if (!new File(ndkBuildFullPath).canExecute()) { - throw new GradleScriptException( - "ndk-build binary " + ndkBuildFullPath + " doesn't exist or isn't executable.\n" + - "Check that the \$ANDROID_NDK environment variable, or ndk.dir in local.properties, is set correctly.\n" + - "(On Windows, make sure you escape backslashes in local.properties or use forward slashes, e.g. C:\\\\ndk or C:/ndk rather than C:\\ndk)", - null) - } - return ndkBuildFullPath +def ndkBuildJobs() { + return project.findProperty("jobs") ?: Runtime.runtime.availableProcessors() } -def buildReactNdkLib = tasks.register("buildReactNdkLib", Exec) { - dependsOn(prepareJSC, prepareHermes, prepareBoost, prepareDoubleConversion, prepareFmt, prepareFolly, prepareGlog, prepareLibevent, extractNativeDependencies) - dependsOn("generateCodegenArtifactsFromSchema"); - - inputs.dir("$projectDir/../ReactCommon") - inputs.dir("src/main/jni") - inputs.dir("src/main/java/com/facebook/react/turbomodule/core/jni") - inputs.dir("src/main/java/com/facebook/react/modules/blob") - outputs.dir("$buildDir/react-ndk/all") - def commandLineArgs = [ - getNdkBuildFullPath(), - "APP_ABI=${reactNativeArchitectures()}", - "NDK_DEBUG=" + (nativeBuildType.equalsIgnoreCase("debug") ? "1" : "0"), - "NDK_PROJECT_PATH=null", - "NDK_APPLICATION_MK=$projectDir/src/main/jni/Application.mk", - "NDK_OUT=" + temporaryDir, - "NDK_LIBS_OUT=$buildDir/react-ndk/all", - "THIRD_PARTY_NDK_DIR=$thirdPartyNdkDir", - "REACT_COMMON_DIR=$projectDir/../ReactCommon", - "REACT_GENERATED_SRC_DIR=$buildDir/generated/source", - "REACT_SRC_DIR=$projectDir/src/main/java/com/facebook/react", - "-C", file("src/main/jni/react/jni").absolutePath, - "--jobs", project.findProperty("jobs") ?: Runtime.runtime.availableProcessors() - ] - if (Os.isFamily(Os.FAMILY_MAC)) { - // This flag will suppress "fcntl(): Bad file descriptor" warnings on local builds. - commandLineArgs.add("--output-sync=none") - } - commandLine(commandLineArgs) -} - -def cleanReactNdkLib = tasks.register("cleanReactNdkLib", Exec) { - ignoreExitValue(true) - errorOutput(new ByteArrayOutputStream()) - commandLine(getNdkBuildFullPath(), - "NDK_APPLICATION_MK=$projectDir/src/main/jni/Application.mk", - "THIRD_PARTY_NDK_DIR=$thirdPartyNdkDir", - "REACT_COMMON_DIR=$projectDir/../ReactCommon", - "-C", file("src/main/jni/react/jni").absolutePath, - "clean") - doLast { - file(AAR_OUTPUT_URL).delete() - println("Deleted aar output dir at ${file(AAR_OUTPUT_URL)}") - } -} - -def packageReactNdkLibs = tasks.register("packageReactNdkLibs", Copy) { - dependsOn(buildReactNdkLib) - from("$buildDir/react-ndk/all") - into("$buildDir/react-ndk/exported") +tasks.register("packageReactNdkLibsForBuck", Copy) { + dependsOn("mergeDebugNativeLibs") + from("$buildDir/intermediates/merged_native_libs/debug/out/lib/") exclude("**/libjsc.so") exclude("**/libhermes.so") -} - -def packageReactNdkLibsForBuck = tasks.register("packageReactNdkLibsForBuck", Copy) { - dependsOn(packageReactNdkLibs) - from("$buildDir/react-ndk/exported") into("src/main/jni/prebuilt/lib") } @@ -387,11 +287,36 @@ android { testApplicationId("com.facebook.react.tests.gradle") testInstrumentationRunner("androidx.test.runner.AndroidJUnitRunner") + + externalNativeBuild { + ndkBuild { + arguments "APP_ABI=${reactNativeArchitectures()}", + "NDK_APPLICATION_MK=$projectDir/src/main/jni/Application.mk", + "THIRD_PARTY_NDK_DIR=$thirdPartyNdkDir", + "REACT_COMMON_DIR=$projectDir/../ReactCommon", + "REACT_GENERATED_SRC_DIR=$buildDir/generated/source", + "REACT_SRC_DIR=$projectDir/src/main/java/com/facebook/react", + "-j${ndkBuildJobs()}" + + if (Os.isFamily(Os.FAMILY_MAC)) { + // This flag will suppress "fcntl(): Bad file descriptor" warnings on local builds. + arguments "--output-sync=none" + } + } + } } + externalNativeBuild { + ndkBuild { + path "src/main/jni/react/jni/Android.mk" + } + } + + preBuild.dependsOn(prepareJSC, prepareHermes, prepareBoost, prepareDoubleConversion, prepareFmt, prepareFolly, prepareGlog, prepareLibevent, extractNativeDependencies) + preBuild.dependsOn("generateCodegenArtifactsFromSchema") + sourceSets.main { jni.srcDirs = [] - jniLibs.srcDir("$buildDir/react-ndk/exported") res.srcDirs = ["src/main/res/devsupport", "src/main/res/shell", "src/main/res/views/modal", "src/main/res/views/uimanager"] java { srcDirs = ["src/main/java", "src/main/libraries/soloader/java", "src/main/jni/first-party/fb/jni/java"] @@ -400,9 +325,6 @@ android { } } - preBuild.dependsOn(packageReactNdkLibs) - clean.dependsOn(cleanReactNdkLib) - lintOptions { abortOnError(false) } diff --git a/ReactAndroid/src/main/jni/react/jni/Android.mk b/ReactAndroid/src/main/jni/react/jni/Android.mk index af2077b5a663..46548e2537df 100644 --- a/ReactAndroid/src/main/jni/react/jni/Android.mk +++ b/ReactAndroid/src/main/jni/react/jni/Android.mk @@ -89,7 +89,7 @@ LOCAL_STATIC_LIBRARIES := libreactnative libruntimeexecutor libcallinvokerholder LOCAL_MODULE := reactnativejni # Compile all local c++ files. -LOCAL_SRC_FILES := $(wildcard *.cpp) +LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) ifeq ($(APP_OPTIM),debug) # Keep symbols by overriding the strip command invoked by ndk-build. diff --git a/packages/rn-tester/android/app/build.gradle b/packages/rn-tester/android/app/build.gradle index 0ec74b694e72..a2ee432bdb4c 100644 --- a/packages/rn-tester/android/app/build.gradle +++ b/packages/rn-tester/android/app/build.gradle @@ -213,6 +213,10 @@ android { ] } } + packagingOptions { + pickFirst '**/libhermes.so' + pickFirst '**/libjsc.so' + } } configurations { @@ -287,9 +291,9 @@ if (enableCodegen) { def packageReactNdkLibs = tasks.register("packageReactNdkLibs", Copy) { // TODO: handle extracting .so from prebuilt :ReactAndroid. - dependsOn(":ReactAndroid:packageReactNdkLibs") + dependsOn(":ReactAndroid:packageReactNdkLibsForBuck") dependsOn("generateCodegenSchemaFromJavaScript") - from("$reactAndroidBuildDir/react-ndk/exported") + from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib") into("$buildDir/react-ndk/exported") } diff --git a/template/android/app/build.gradle b/template/android/app/build.gradle index a461d9a9006b..022855a20b9b 100644 --- a/template/android/app/build.gradle +++ b/template/android/app/build.gradle @@ -186,6 +186,11 @@ android { } } + + packagingOptions { + pickFirst '**/libhermes.so' + pickFirst '**/libjsc.so' + } } dependencies { From 3848f48943d0530c3712394b9e405ebddf21cf3b Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Mon, 1 Nov 2021 08:58:47 -0700 Subject: [PATCH 089/628] Use JavaScript functions for Component templates Summary: ## Rationale **Disclaimer**: This is an incremental step towards more maintainable/readable react-native-codegen generators. In the future, we may want to replace these templates/string concat logic with *something better*. But until we decide what that *something better* is, let's at least get rid of all this gross string find/replace. Benefits of using Function templates over String.prototype.replace. - **Self-documenting**: Template Functions enumerate/describe their exact data dependencies in their signature. You no longer have to read the template implementation to see what data you need to pass into the template. - **Improved Readability**: JavaScript syntax highlighting makes it really easy to see where/how the data is inserted into the templates. Also template variables used be prefixed/suffixed with ::, which made things really confusing in C++ code (e.g: wtf is `::_CLASSNAME_::EventEmitter::::_EVENT_NAME_::`?). - **Simpler Interpolation**: Don't have to worry about .replaceAll vs .replace, or calling these replace functions with regexes or strings. - **Template Type-safety**: Ensure that the correct data types are passed to the component templates (e.g: flow will complain if you accidentally pass null/undefined when a template expects a string). - **Template Type-safety**: Ensure that we don't pass in extra data to templates (this diff catches/fixes instances of this error). Ensure that we don't forget to pass in data to the template. - etc. After this diff, both our Component and NativeModule generators will be using template functions. This string find/replace exists no more in react-native-codegen. This is also a very surface-level change. I made no efforts to simplify these templates. Let's take a look at that later, as necessary. Changelog: [Internal] Reviewed By: yungsters Differential Revision: D32021441 fbshipit-source-id: f8f27069bcbf9d66dcafb7d1411da1f938eb6dcd --- .../GenerateComponentDescriptorH.js | 27 +- .../components/GenerateComponentHObjCpp.js | 132 ++++++--- .../components/GenerateEventEmitterCpp.js | 78 +++-- .../components/GenerateEventEmitterH.js | 88 +++--- .../generators/components/GeneratePropsCpp.js | 63 ++-- .../generators/components/GeneratePropsH.js | 271 +++++++++++------- .../components/GeneratePropsJavaDelegate.js | 70 +++-- .../components/GeneratePropsJavaInterface.js | 48 ++-- .../components/GenerateShadowNodeCpp.js | 31 +- .../components/GenerateShadowNodeH.js | 49 ++-- .../generators/components/GenerateTests.js | 64 +++-- .../components/GenerateViewConfigJs.js | 78 ++--- 12 files changed, 636 insertions(+), 363 deletions(-) diff --git a/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js b/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js index 523def828471..0ae2fb069fc0 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js @@ -15,7 +15,13 @@ import type {SchemaType} from '../../CodegenSchema'; // File path -> contents type FilesOutput = Map; -const template = ` +const FileTemplate = ({ + componentDescriptors, + libraryName, +}: { + componentDescriptors: string, + libraryName: string, +}) => ` /** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * @@ -27,20 +33,21 @@ const template = ` #pragma once -#include +#include #include namespace facebook { namespace react { -::_COMPONENT_DESCRIPTORS_:: +${componentDescriptors} } // namespace react } // namespace facebook `; -const componentTemplate = ` -using ::_CLASSNAME_::ComponentDescriptor = ConcreteComponentDescriptor<::_CLASSNAME_::ShadowNode>; +const ComponentTemplate = ({className}: {className: string}) => + ` +using ${className}ComponentDescriptor = ConcreteComponentDescriptor<${className}ShadowNode>; `.trim(); module.exports = { @@ -70,16 +77,18 @@ module.exports = { if (components[componentName].interfaceOnly === true) { return; } - return componentTemplate.replace(/::_CLASSNAME_::/g, componentName); + + return ComponentTemplate({className: componentName}); }) .join('\n'); }) .filter(Boolean) .join('\n'); - const replacedTemplate = template - .replace(/::_COMPONENT_DESCRIPTORS_::/g, componentDescriptors) - .replace('::_LIBRARY_::', libraryName); + const replacedTemplate = FileTemplate({ + componentDescriptors, + libraryName, + }); return new Map([[fileName, replacedTemplate]]); }, diff --git a/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js b/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js index e78810ef70b0..4c0c31192388 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js @@ -37,53 +37,96 @@ function getOrdinalNumber(num: number): string { return 'unknown'; } -const protocolTemplate = ` -@protocol RCT::_COMPONENT_NAME_::ViewProtocol -::_METHODS_:: +const ProtocolTemplate = ({ + componentName, + methods, +}: { + componentName: string, + methods: string, +}) => + ` +@protocol RCT${componentName}ViewProtocol +${methods} @end `.trim(); -const commandHandlerIfCaseConvertArgTemplate = ` - NSObject *arg::_ARG_NUMBER_:: = args[::_ARG_NUMBER_::]; +const CommandHandlerIfCaseConvertArgTemplate = ({ + componentName, + expectedKind, + argNumber, + argNumberString, + expectedKindString, + argConversion, +}: { + componentName: string, + expectedKind: string, + argNumber: number, + argNumberString: string, + expectedKindString: string, + argConversion: string, +}) => + ` + NSObject *arg${argNumber} = args[${argNumber}]; #if RCT_DEBUG - if (!RCTValidateTypeOfViewCommandArgument(arg::_ARG_NUMBER_::, ::_EXPECTED_KIND_::, @"::_EXPECTED_KIND_STRING_::", @"::_COMPONENT_NAME_::", commandName, @"::_ARG_NUMBER_STR_::")) { + if (!RCTValidateTypeOfViewCommandArgument(arg${argNumber}, ${expectedKind}, @"${expectedKindString}", @"${componentName}", commandName, @"${argNumberString}")) { return; } #endif - ::_ARG_CONVERSION_:: + ${argConversion} `.trim(); -const commandHandlerIfCaseTemplate = ` -if ([commandName isEqualToString:@"::_COMMAND_NAME_::"]) { +const CommandHandlerIfCaseTemplate = ({ + componentName, + commandName, + numArgs, + convertArgs, + commandCall, +}: { + componentName: string, + commandName: string, + numArgs: number, + convertArgs: string, + commandCall: string, +}) => + ` +if ([commandName isEqualToString:@"${commandName}"]) { #if RCT_DEBUG - if ([args count] != ::_NUM_ARGS_::) { - RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"::_COMPONENT_NAME_::", commandName, (int)[args count], ::_NUM_ARGS_::); + if ([args count] != ${numArgs}) { + RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"${componentName}", commandName, (int)[args count], ${numArgs}); return; } #endif - ::_CONVERT_ARGS_:: + ${convertArgs} - ::_COMMAND_CALL_:: + ${commandCall} return; } `.trim(); -const commandHandlerTemplate = ` -RCT_EXTERN inline void RCT::_COMPONENT_NAME_::HandleCommand( - id componentView, +const CommandHandlerTemplate = ({ + componentName, + ifCases, +}: { + componentName: string, + ifCases: string, +}) => + ` +RCT_EXTERN inline void RCT${componentName}HandleCommand( + id componentView, NSString const *commandName, NSArray const *args) { - ::_IF_CASES_:: + ${ifCases} #if RCT_DEBUG - RCTLogError(@"%@ received command %@, which is not a supported command.", @"::_COMPONENT_NAME_::", commandName); + RCTLogError(@"%@ received command %@, which is not a supported command.", @"${componentName}", commandName); #endif } `.trim(); -const template = ` +const FileTemplate = ({componentContent}: {componentContent: string}) => + ` /** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * @@ -99,7 +142,7 @@ const template = ` NS_ASSUME_NONNULL_BEGIN -::_COMPONENT_CONTENT_:: +${componentContent} NS_ASSUME_NONNULL_END `.trim(); @@ -225,7 +268,7 @@ function generateProtocol( component: ComponentShape, componentName: string, ): string { - const commands = component.commands + const methods = component.commands .map(command => { const params = command.typeAnnotation.params; const paramString = @@ -245,9 +288,10 @@ function generateProtocol( .join('\n') .trim(); - return protocolTemplate - .replace(/::_COMPONENT_NAME_::/g, componentName) - .replace('::_METHODS_::', commands); + return ProtocolTemplate({ + componentName, + methods, + }); } function generateConvertAndValidateParam( @@ -262,13 +306,14 @@ function generateConvertAndValidateParam( param.name } = ${getObjCRightHandAssignmentParamType(param, index)};`; - return commandHandlerIfCaseConvertArgTemplate - .replace(/::_COMPONENT_NAME_::/g, componentName) - .replace('::_ARG_CONVERSION_::', argConversion) - .replace(/::_ARG_NUMBER_::/g, '' + index) - .replace('::_ARG_NUMBER_STR_::', getOrdinalNumber(index + 1)) - .replace('::_EXPECTED_KIND_::', expectedKind) - .replace('::_EXPECTED_KIND_STRING_::', expectedKindString); + return CommandHandlerIfCaseConvertArgTemplate({ + componentName, + argConversion, + argNumber: index, + argNumberString: getOrdinalNumber(index + 1), + expectedKind, + expectedKindString, + }); } function generateCommandIfCase( @@ -294,12 +339,13 @@ function generateCommandIfCase( .join(' '); const commandCall = `[componentView ${command.name}${commandCallArgs}];`; - return commandHandlerIfCaseTemplate - .replace(/::_COMPONENT_NAME_::/g, componentName) - .replace(/::_COMMAND_NAME_::/g, command.name) - .replace(/::_NUM_ARGS_::/g, '' + params.length) - .replace('::_CONVERT_ARGS_::', convertArgs) - .replace('::_COMMAND_CALL_::', commandCall); + return CommandHandlerIfCaseTemplate({ + componentName, + commandName: command.name, + numArgs: params.length, + convertArgs, + commandCall, + }); } function generateCommandHandler( @@ -314,9 +360,10 @@ function generateCommandHandler( .map(command => generateCommandIfCase(command, componentName)) .join('\n\n'); - return commandHandlerTemplate - .replace(/::_COMPONENT_NAME_::/g, componentName) - .replace('::_IF_CASES_::', ifCases); + return CommandHandlerTemplate({ + componentName, + ifCases, + }); } module.exports = { @@ -362,10 +409,9 @@ module.exports = { .filter(Boolean) .join('\n\n'); - const replacedTemplate = template.replace( - '::_COMPONENT_CONTENT_::', + const replacedTemplate = FileTemplate({ componentContent, - ); + }); return new Map([[fileName, replacedTemplate]]); }, diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js index d9ed177394d1..171cb5bb517c 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js @@ -27,7 +27,13 @@ type ComponentCollection = $ReadOnly<{ ..., }>; -const template = ` +const FileTemplate = ({ + events, + libraryName, +}: { + events: string, + libraryName: string, +}) => ` /** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * @@ -37,28 +43,50 @@ const template = ` * ${'@'}generated by codegen project: GenerateEventEmitterCpp.js */ -#include +#include namespace facebook { namespace react { -::_EVENTS_:: +${events} } // namespace react } // namespace facebook `; -const componentTemplate = ` -void ::_CLASSNAME_::EventEmitter::::_EVENT_NAME_::(::_STRUCT_NAME_:: event) const { - dispatchEvent("::_DISPATCH_EVENT_NAME_::", [event=std::move(event)](jsi::Runtime &runtime) { - ::_IMPLEMENTATION_:: +const ComponentTemplate = ({ + className, + eventName, + structName, + dispatchEventName, + implementation, +}: { + className: string, + eventName: string, + structName: string, + dispatchEventName: string, + implementation: string, +}) => + ` +void ${className}EventEmitter::${eventName}(${structName} event) const { + dispatchEvent("${dispatchEventName}", [event=std::move(event)](jsi::Runtime &runtime) { + ${implementation} }); } `.trim(); -const basicComponentTemplate = ` -void ::_CLASSNAME_::EventEmitter::::_EVENT_NAME_::() const { - dispatchEvent("::_DISPATCH_EVENT_NAME_::"); +const BasicComponentTemplate = ({ + className, + eventName, + dispatchEventName, +}: { + className: string, + eventName: string, + dispatchEventName: string, +}) => + ` +void ${className}EventEmitter::${eventName}() const { + dispatchEvent("${dispatchEventName}"); } `.trim(); @@ -171,18 +199,20 @@ function generateEvent(componentName: string, event): string { throw new Error('Expected the event name to start with `on`'); } - return componentTemplate - .replace(/::_CLASSNAME_::/g, componentName) - .replace(/::_EVENT_NAME_::/g, event.name) - .replace(/::_DISPATCH_EVENT_NAME_::/g, dispatchEventName) - .replace('::_STRUCT_NAME_::', generateEventStructName([event.name])) - .replace('::_IMPLEMENTATION_::', implementation); + return ComponentTemplate({ + className: componentName, + eventName: event.name, + dispatchEventName, + structName: generateEventStructName([event.name]), + implementation, + }); } - return basicComponentTemplate - .replace(/::_CLASSNAME_::/g, componentName) - .replace(/::_EVENT_NAME_::/g, event.name) - .replace(/::_DISPATCH_EVENT_NAME_::/g, dispatchEventName); + return BasicComponentTemplate({ + className: componentName, + eventName: event.name, + dispatchEventName, + }); } module.exports = { @@ -224,10 +254,10 @@ module.exports = { }) .join('\n'); - const replacedTemplate = template - .replace(/::_COMPONENT_EMITTERS_::/g, componentEmitters) - .replace('::_LIBRARY_::', libraryName) - .replace('::_EVENTS_::', componentEmitters); + const replacedTemplate = FileTemplate({ + libraryName, + events: componentEmitters, + }); return new Map([[fileName, replacedTemplate]]); }, diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js index a4a4f1f98e71..8ada23c7a929 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js @@ -35,7 +35,7 @@ type ComponentCollection = $ReadOnly<{ ..., }>; -const template = ` +const FileTemplate = ({componentEmitters}: {componentEmitters: string}) => ` /** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * @@ -51,36 +51,61 @@ const template = ` namespace facebook { namespace react { -::_COMPONENT_EMITTERS_:: +${componentEmitters} } // namespace react } // namespace facebook `; -const componentTemplate = ` -class ::_CLASSNAME_::EventEmitter : public ViewEventEmitter { +const ComponentTemplate = ({ + className, + structs, + events, +}: { + className: string, + structs: string, + events: string, +}) => + ` +class ${className}EventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; - ::_STRUCTS_:: + ${structs} - ::_EVENTS_:: + ${events} }; `.trim(); -const structTemplate = ` - struct ::_STRUCT_NAME_:: { - ::_FIELDS_:: +const StructTemplate = ({ + structName, + fields, +}: { + structName: string, + fields: string, +}) => + ` + struct ${structName} { + ${fields} }; `.trim(); -const enumTemplate = `enum class ::_ENUM_NAME_:: { - ::_VALUES_:: +const EnumTemplate = ({ + enumName, + values, + toCases, +}: { + enumName: string, + values: string, + toCases: string, +}) => + `enum class ${enumName} { + ${values} }; -static char const *toString(const ::_ENUM_NAME_:: value) { +static char const *toString(const ${enumName} value) { switch (value) { - ::_TO_CASES_:: + ${toCases} } } `.trim(); @@ -136,10 +161,11 @@ function generateEnum(structs, options, nameParts) { structs.set( structName, - enumTemplate - .replace(/::_ENUM_NAME_::/g, structName) - .replace('::_VALUES_::', fields) - .replace('::_TO_CASES_::', toCases), + EnumTemplate({ + enumName: structName, + values: fields, + toCases: toCases, + }), ); } @@ -196,9 +222,10 @@ function generateStruct( structs.set( structName, - structTemplate - .replace('::_STRUCT_NAME_::', structName) - .replace('::_FIELDS_::', fields), + StructTemplate({ + structName, + fields, + }), ); } @@ -271,27 +298,20 @@ module.exports = { .map(componentName => { const component = moduleComponents[componentName]; - const replacedTemplate = componentTemplate - .replace(/::_CLASSNAME_::/g, componentName) - .replace( - '::_STRUCTS_::', - indent(generateStructs(componentName, component), 2), - ) - .replace( - '::_EVENTS_::', - generateEvents(componentName, component), - ) - .trim(); + const replacedTemplate = ComponentTemplate({ + className: componentName, + structs: indent(generateStructs(componentName, component), 2), + events: generateEvents(componentName, component), + }); return replacedTemplate; }) .join('\n') : ''; - const replacedTemplate = template.replace( - /::_COMPONENT_EMITTERS_::/g, + const replacedTemplate = FileTemplate({ componentEmitters, - ); + }); return new Map([[fileName, replacedTemplate]]); }, diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js index ca3e743c778a..03015faee376 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js @@ -16,7 +16,15 @@ const {convertDefaultTypeToString, getImports} = require('./CppHelpers'); // File path -> contents type FilesOutput = Map; -const template = ` +const FileTemplate = ({ + libraryName, + imports, + componentClasses, +}: { + libraryName: string, + imports: string, + componentClasses: string, +}) => ` /** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * @@ -26,25 +34,34 @@ const template = ` * ${'@'}generated by codegen project: GeneratePropsCpp.js */ -#include -::_IMPORTS_:: +#include +${imports} namespace facebook { namespace react { -::_COMPONENT_CLASSES_:: +${componentClasses} } // namespace react } // namespace facebook `; -const componentTemplate = ` -::_CLASSNAME_::::::_CLASSNAME_::( +const ComponentTemplate = ({ + className, + extendClasses, + props, +}: { + className: string, + extendClasses: string, + props: string, +}) => + ` +${className}::${className}( const PropsParserContext &context, - const ::_CLASSNAME_:: &sourceProps, - const RawProps &rawProps):::_EXTEND_CLASSES_:: + const ${className} &sourceProps, + const RawProps &rawProps):${extendClasses} - ::_PROPS_:: + ${props} {} `.trim(); @@ -127,10 +144,11 @@ module.exports = { // $FlowFixMe[method-unbinding] added when improving typing for this parameters imports.forEach(allImports.add, allImports); - const replacedTemplate = componentTemplate - .replace(/::_CLASSNAME_::/g, newName) - .replace('::_EXTEND_CLASSES_::', extendString) - .replace('::_PROPS_::', propsString); + const replacedTemplate = ComponentTemplate({ + className: newName, + extendClasses: extendString, + props: propsString, + }); return replacedTemplate; }) @@ -139,17 +157,14 @@ module.exports = { .filter(Boolean) .join('\n'); - const replacedTemplate = template - .replace(/::_COMPONENT_CLASSES_::/g, componentProps) - .replace('::_LIBRARY_::', libraryName) - .replace( - '::_IMPORTS_::', - - Array.from(allImports) - .sort() - .join('\n') - .trim(), - ); + const replacedTemplate = FileTemplate({ + componentClasses: componentProps, + libraryName, + imports: Array.from(allImports) + .sort() + .join('\n') + .trim(), + }); return new Map([[fileName, replacedTemplate]]); }, diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js index e580ca8c1785..72a31c67f1e1 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js @@ -32,7 +32,13 @@ import type { type FilesOutput = Map; type StructsMap = Map; -const template = ` +const FileTemplate = ({ + imports, + componentClasses, +}: { + imports: string, + componentClasses: string, +}) => ` /** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * @@ -43,96 +49,148 @@ const template = ` */ #pragma once -::_IMPORTS_:: +${imports} namespace facebook { namespace react { -::_COMPONENT_CLASSES_:: +${componentClasses} } // namespace react } // namespace facebook `; -const classTemplate = ` -::_ENUMS_:: -::_STRUCTS_:: -class ::_CLASSNAME_:: final::_EXTEND_CLASSES_:: { +const ClassTemplate = ({ + enums, + structs, + className, + props, + extendClasses, +}: { + enums: string, + structs: string, + className: string, + props: string, + extendClasses: string, +}) => + ` +${enums} +${structs} +class ${className} final${extendClasses} { public: - ::_CLASSNAME_::() = default; - ::_CLASSNAME_::(const PropsParserContext& context, const ::_CLASSNAME_:: &sourceProps, const RawProps &rawProps); + ${className}() = default; + ${className}(const PropsParserContext& context, const ${className} &sourceProps, const RawProps &rawProps); #pragma mark - Props - ::_PROPS_:: + ${props} }; `.trim(); -const enumTemplate = ` -enum class ::_ENUM_NAME_:: { ::_VALUES_:: }; - -static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ::_ENUM_NAME_:: &result) { +const EnumTemplate = ({ + enumName, + values, + fromCases, + toCases, +}: { + enumName: string, + values: string, + fromCases: string, + toCases: string, +}) => + ` +enum class ${enumName} { ${values} }; + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ${enumName} &result) { auto string = (std::string)value; - ::_FROM_CASES_:: + ${fromCases} abort(); } -static inline std::string toString(const ::_ENUM_NAME_:: &value) { +static inline std::string toString(const ${enumName} &value) { switch (value) { - ::_TO_CASES_:: + ${toCases} } } `.trim(); -const intEnumTemplate = ` -enum class ::_ENUM_NAME_:: { ::_VALUES_:: }; - -static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ::_ENUM_NAME_:: &result) { +const IntEnumTemplate = ({ + enumName, + values, + fromCases, + toCases, +}: { + enumName: string, + values: string, + fromCases: string, + toCases: string, +}) => + ` +enum class ${enumName} { ${values} }; + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ${enumName} &result) { assert(value.hasType()); auto integerValue = (int)value; - switch (integerValue) {::_FROM_CASES_:: + switch (integerValue) {${fromCases} } abort(); } -static inline std::string toString(const ::_ENUM_NAME_:: &value) { +static inline std::string toString(const ${enumName} &value) { switch (value) { - ::_TO_CASES_:: + ${toCases} } } `.trim(); -const structTemplate = `struct ::_STRUCT_NAME_:: { - ::_FIELDS_:: +const StructTemplate = ({ + structName, + fields, + fromCases, +}: { + structName: string, + fields: string, + fromCases: string, +}) => + `struct ${structName} { + ${fields} }; -static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ::_STRUCT_NAME_:: &result) { +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ${structName} &result) { auto map = (better::map)value; - ::_FROM_CASES_:: + ${fromCases} } -static inline std::string toString(const ::_STRUCT_NAME_:: &value) { - return "[Object ::_STRUCT_NAME_::]"; +static inline std::string toString(const ${structName} &value) { + return "[Object ${structName}]"; } `.trim(); -const arrayConversionFunction = `static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, std::vector<::_STRUCT_NAME_::> &result) { +const ArrayConversionFunctionTemplate = ({ + structName, +}: { + structName: string, +}) => `static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, std::vector<${structName}> &result) { auto items = (std::vector)value; for (const auto &item : items) { - ::_STRUCT_NAME_:: newItem; + ${structName} newItem; fromRawValue(context, item, newItem); result.emplace_back(newItem); } } `; -const doubleArrayConversionFunction = `static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, std::vector> &result) { +const DoubleArrayConversionFunctionTemplate = ({ + structName, +}: { + structName: string, +}) => `static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, std::vector> &result) { auto items = (std::vector>)value; for (const std::vector &item : items) { - auto nestedArray = std::vector<::_STRUCT_NAME_::>{}; + auto nestedArray = std::vector<${structName}>{}; for (const RawValue &nestedItem : item) { - ::_STRUCT_NAME_:: newItem; + ${structName} newItem; fromRawValue(context, nestedItem, newItem); nestedArray.emplace_back(newItem); } @@ -141,44 +199,57 @@ const doubleArrayConversionFunction = `static inline void fromRawValue(const Pro } `; -const arrayEnumTemplate = ` -using ::_ENUM_MASK_:: = uint32_t; - -enum class ::_ENUM_NAME_::: ::_ENUM_MASK_:: { - ::_VALUES_:: +const ArrayEnumTemplate = ({ + enumName, + enumMask, + values, + fromCases, + toCases, +}: { + enumName: string, + enumMask: string, + values: string, + fromCases: string, + toCases: string, +}) => + ` +using ${enumMask} = uint32_t; + +enum class ${enumName}: ${enumMask} { + ${values} }; constexpr bool operator&( - ::_ENUM_MASK_:: const lhs, - enum ::_ENUM_NAME_:: const rhs) { - return lhs & static_cast<::_ENUM_MASK_::>(rhs); + ${enumMask} const lhs, + enum ${enumName} const rhs) { + return lhs & static_cast<${enumMask}>(rhs); } -constexpr ::_ENUM_MASK_:: operator|( - ::_ENUM_MASK_:: const lhs, - enum ::_ENUM_NAME_:: const rhs) { - return lhs | static_cast<::_ENUM_MASK_::>(rhs); +constexpr ${enumMask} operator|( + ${enumMask} const lhs, + enum ${enumName} const rhs) { + return lhs | static_cast<${enumMask}>(rhs); } constexpr void operator|=( - ::_ENUM_MASK_:: &lhs, - enum ::_ENUM_NAME_:: const rhs) { - lhs = lhs | static_cast<::_ENUM_MASK_::>(rhs); + ${enumMask} &lhs, + enum ${enumName} const rhs) { + lhs = lhs | static_cast<${enumMask}>(rhs); } -static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ::_ENUM_MASK_:: &result) { +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ${enumMask} &result) { auto items = std::vector{value}; for (const auto &item : items) { - ::_FROM_CASES_:: + ${fromCases} abort(); } } -static inline std::string toString(const ::_ENUM_MASK_:: &value) { +static inline std::string toString(const ${enumMask} &value) { auto result = std::string{}; auto separator = std::string{", "}; - ::_TO_CASES_:: + ${toCases} if (!result.empty()) { result.erase(result.length() - separator.length()); } @@ -320,12 +391,13 @@ function generateArrayEnumString( ) .join('\n' + ' '); - return arrayEnumTemplate - .replace(/::_ENUM_NAME_::/g, enumName) - .replace(/::_ENUM_MASK_::/g, getEnumMaskName(enumName)) - .replace('::_VALUES_::', values) - .replace('::_FROM_CASES_::', fromCases) - .replace('::_TO_CASES_::', toCases); + return ArrayEnumTemplate({ + enumName, + enumMask: getEnumMaskName(enumName), + values, + fromCases, + toCases, + }); } function generateStringEnum(componentName, prop) { @@ -352,11 +424,12 @@ function generateStringEnum(componentName, prop) { ) .join('\n' + ' '); - return enumTemplate - .replace(/::_ENUM_NAME_::/g, enumName) - .replace('::_VALUES_::', values.map(toSafeCppString).join(', ')) - .replace('::_FROM_CASES_::', fromCases) - .replace('::_TO_CASES_::', toCases); + return EnumTemplate({ + enumName, + values: values.map(toSafeCppString).join(', '), + fromCases: fromCases, + toCases: toCases, + }); } return ''; @@ -392,11 +465,12 @@ function generateIntEnum(componentName, prop) { .map(val => `${toIntEnumValueName(prop.name, val)} = ${val}`) .join(', '); - return intEnumTemplate - .replace(/::_ENUM_NAME_::/g, enumName) - .replace('::_VALUES_::', valueVariables) - .replace('::_FROM_CASES_::', fromCases) - .replace('::_TO_CASES_::', toCases); + return IntEnumTemplate({ + enumName, + values: valueVariables, + fromCases, + toCases, + }); } return ''; @@ -628,10 +702,12 @@ function generateStructs( `${[componentName, ...nameParts.concat([prop.name])].join( '', )}ArrayStruct`, - arrayConversionFunction.replace( - /::_STRUCT_NAME_::/g, - generateStructName(componentName, nameParts.concat([prop.name])), - ), + ArrayConversionFunctionTemplate({ + structName: generateStructName( + componentName, + nameParts.concat([prop.name]), + ), + }), ); } if ( @@ -667,10 +743,12 @@ function generateStructs( `${[componentName, ...nameParts.concat([prop.name])].join( '', )}ArrayArrayStruct`, - doubleArrayConversionFunction.replace( - /::_STRUCT_NAME_::/g, - generateStructName(componentName, nameParts.concat([prop.name])), - ), + DoubleArrayConversionFunctionTemplate({ + structName: generateStructName( + componentName, + nameParts.concat([prop.name]), + ), + }), ); } }); @@ -749,10 +827,11 @@ function generateStruct( structs.set( structName, - structTemplate - .replace(/::_STRUCT_NAME_::/g, structName) - .replace('::_FIELDS_::', fields) - .replace('::_FROM_CASES_::', fromCases), + StructTemplate({ + structName, + fields, + fromCases, + }), ); } @@ -810,13 +889,13 @@ module.exports = { // $FlowFixMe[method-unbinding] added when improving typing for this parameters imports.forEach(allImports.add, allImports); - const replacedTemplate = classTemplate - .replace('::_ENUMS_::', enumString) - .replace('::_STRUCTS_::', structString) - .replace(/::_CLASSNAME_::/g, newName) - .replace('::_EXTEND_CLASSES_::', extendString) - .replace('::_PROPS_::', propsString) - .trim(); + const replacedTemplate = ClassTemplate({ + enums: enumString, + structs: structString, + className: newName, + extendClasses: extendString, + props: propsString, + }); return replacedTemplate; }) @@ -825,14 +904,12 @@ module.exports = { .filter(Boolean) .join('\n\n'); - const replacedTemplate = template - .replace(/::_COMPONENT_CLASSES_::/g, componentClasses) - .replace( - '::_IMPORTS_::', - Array.from(allImports) - .sort() - .join('\n'), - ); + const replacedTemplate = FileTemplate({ + componentClasses, + imports: Array.from(allImports) + .sort() + .join('\n'), + }); return new Map([[fileName, replacedTemplate]]); }, diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js index f3a09291359f..030abcd6d713 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js @@ -27,7 +27,21 @@ const { // File path -> contents type FilesOutput = Map; -const template = `/** +const FileTemplate = ({ + packageName, + imports, + className, + extendClasses, + interfaceClassName, + methods, +}: { + packageName: string, + imports: string, + className: string, + extendClasses: string, + interfaceClassName: string, + methods: string, +}) => `/** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the @@ -36,33 +50,35 @@ const template = `/** * ${'@'}generated by codegen project: GeneratePropsJavaDelegate.js */ -package ::_PACKAGE_NAME_::; +package ${packageName}; -::_IMPORTS_:: +${imports} -public class ::_CLASSNAME_:: & ::_INTERFACE_CLASSNAME_::> extends BaseViewManagerDelegate { - public ::_CLASSNAME_::(U viewManager) { +public class ${className} & ${interfaceClassName}> extends BaseViewManagerDelegate { + public ${className}(U viewManager) { super(viewManager); } - ::_METHODS_:: + ${methods} } `; -const propSetterTemplate = ` +const PropSetterTemplate = ({propCases}: {propCases: string}) => + ` @Override public void setProperty(T view, String propName, @Nullable Object value) { - ::_PROP_CASES_:: + ${propCases} } -`; +`.trim(); -const commandsTemplate = ` +const CommandsTemplate = ({commandCases}: {commandCases: string}) => + ` @Override public void receiveCommand(T view, String commandName, ReadableArray args) { switch (commandName) { - ::_COMMAND_CASES_:: + ${commandCases} } } -`; +`.trim(); function getJavaValueForProp( prop: NamedShape, @@ -251,9 +267,9 @@ function getDelegateImports(component) { function generateMethods(propsString, commandsString): string { return [ - propSetterTemplate.trim().replace('::_PROP_CASES_::', propsString), + PropSetterTemplate({propCases: propsString}), commandsString != null - ? commandsTemplate.trim().replace('::_COMMAND_CASES_::', commandsString) + ? CommandsTemplate({commandCases: commandsString}) : '', ] .join('\n\n ') @@ -305,22 +321,16 @@ module.exports = { ); const extendString = getClassExtendString(component); - const replacedTemplate = template - .replace( - /::_IMPORTS_::/g, - Array.from(imports) - .sort() - .join('\n'), - ) - .replace(/::_PACKAGE_NAME_::/g, normalizedPackageName) - .replace(/::_CLASSNAME_::/g, className) - .replace('::_EXTEND_CLASSES_::', extendString) - .replace('::_PROP_CASES_::', propsString) - .replace( - '::_METHODS_::', - generateMethods(propsString, commandsString), - ) - .replace(/::_INTERFACE_CLASSNAME_::/g, interfaceClassName); + const replacedTemplate = FileTemplate({ + imports: Array.from(imports) + .sort() + .join('\n'), + packageName: normalizedPackageName, + className, + extendClasses: extendString, + methods: generateMethods(propsString, commandsString), + interfaceClassName: interfaceClassName, + }); files.set(`${outputDir}/${className}.java`, replacedTemplate); }); diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js index 86ed99f80f08..31e27513a2dd 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js @@ -26,7 +26,19 @@ const { // File path -> contents type FilesOutput = Map; -const template = `/** +const FileTemplate = ({ + packageName, + imports, + className, + extendClasses, + methods, +}: { + packageName: string, + imports: string, + className: string, + extendClasses: string, + methods: string, +}) => `/** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the @@ -35,12 +47,12 @@ const template = `/** * ${'@'}generated by codegen project: GeneratePropsJavaInterface.js */ -package ::_PACKAGE_NAME_::; +package ${packageName}; -::_IMPORTS_:: +${imports} -public interface ::_CLASSNAME_:: { - ::_METHODS_:: +public interface ${className} { + ${methods} } `; @@ -253,21 +265,17 @@ module.exports = { ); const extendString = getClassExtendString(component); - const replacedTemplate = template - .replace( - /::_IMPORTS_::/g, - Array.from(imports) - .sort() - .join('\n'), - ) - .replace(/::_PACKAGE_NAME_::/g, normalizedPackageName) - .replace(/::_CLASSNAME_::/g, className) - .replace('::_EXTEND_CLASSES_::', extendString) - .replace( - '::_METHODS_::', - [propsString, commandsString].join('\n' + ' ').trimRight(), - ) - .replace('::_COMMAND_HANDLERS_::', commandsString); + const replacedTemplate = FileTemplate({ + imports: Array.from(imports) + .sort() + .join('\n'), + packageName: normalizedPackageName, + className, + extendClasses: extendString, + methods: [propsString, commandsString] + .join('\n' + ' ') + .trimRight(), + }); files.set(`${outputDir}/${className}.java`, replacedTemplate); }); diff --git a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js index bc86669d9ca4..5c0f3e2a5242 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js @@ -15,7 +15,13 @@ import type {SchemaType} from '../../CodegenSchema'; // File path -> contents type FilesOutput = Map; -const template = ` +const FileTemplate = ({ + libraryName, + componentNames, +}: { + libraryName: string, + componentNames: string, +}) => ` /** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * @@ -25,19 +31,20 @@ const template = ` * ${'@'}generated by codegen project: GenerateShadowNodeCpp.js */ -#include +#include namespace facebook { namespace react { -::_COMPONENT_NAMES_:: +${componentNames} } // namespace react } // namespace facebook `; -const componentTemplate = ` -extern const char ::_CLASSNAME_::ComponentName[] = "::_CLASSNAME_::"; +const ComponentTemplate = ({className}: {className: string}) => + ` +extern const char ${className}ComponentName[] = "${className}"; `.trim(); module.exports = { @@ -67,10 +74,9 @@ module.exports = { if (components[componentName].interfaceOnly === true) { return; } - const replacedTemplate = componentTemplate.replace( - /::_CLASSNAME_::/g, - componentName, - ); + const replacedTemplate = ComponentTemplate({ + className: componentName, + }); return replacedTemplate; }) @@ -79,9 +85,10 @@ module.exports = { .filter(Boolean) .join('\n'); - const replacedTemplate = template - .replace(/::_COMPONENT_NAMES_::/g, componentNames) - .replace('::_LIBRARY_::', libraryName); + const replacedTemplate = FileTemplate({ + componentNames, + libraryName, + }); return new Map([[fileName, replacedTemplate]]); }, diff --git a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js index 30e5c573f9d1..d5aa2531bfa7 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js @@ -15,7 +15,15 @@ import type {SchemaType} from '../../CodegenSchema'; // File path -> contents type FilesOutput = Map; -const template = ` +const FileTemplate = ({ + imports, + libraryName, + componentClasses, +}: { + imports: string, + libraryName: string, + componentClasses: string, +}) => ` /** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * @@ -27,27 +35,34 @@ const template = ` #pragma once -::_IMPORTS_::#include +${imports}#include #include namespace facebook { namespace react { -::_COMPONENT_CLASSES_:: +${componentClasses} } // namespace react } // namespace facebook `; -const componentTemplate = ` -extern const char ::_CLASSNAME_::ComponentName[]; +const ComponentTemplate = ({ + className, + eventEmitter, +}: { + className: string, + eventEmitter: string, +}) => + ` +extern const char ${className}ComponentName[]; /* - * \`ShadowNode\` for <::_CLASSNAME_::> component. + * \`ShadowNode\` for <${className}> component. */ -using ::_CLASSNAME_::ShadowNode = ConcreteViewShadowNode< - ::_CLASSNAME_::ComponentName, - ::_CLASSNAME_::Props::_EVENT_EMITTER_::>; +using ${className}ShadowNode = ConcreteViewShadowNode< + ${className}ComponentName, + ${className}Props${eventEmitter}>; `.trim(); module.exports = { @@ -91,9 +106,10 @@ module.exports = { ? `,\n${componentName}EventEmitter` : ''; - const replacedTemplate = componentTemplate - .replace(/::_CLASSNAME_::/g, componentName) - .replace('::_EVENT_EMITTER_::', eventEmitter); + const replacedTemplate = ComponentTemplate({ + className: componentName, + eventEmitter, + }); return replacedTemplate; }) @@ -104,10 +120,11 @@ module.exports = { const eventEmitterImport = `#include \n`; - const replacedTemplate = template - .replace(/::_COMPONENT_CLASSES_::/g, moduleResults) - .replace('::_LIBRARY_::', libraryName) - .replace('::_IMPORTS_::', hasAnyEvents ? eventEmitterImport : ''); + const replacedTemplate = FileTemplate({ + componentClasses: moduleResults, + libraryName, + imports: hasAnyEvents ? eventEmitterImport : '', + }); return new Map([[fileName, replacedTemplate]]); }, diff --git a/packages/react-native-codegen/src/generators/components/GenerateTests.js b/packages/react-native-codegen/src/generators/components/GenerateTests.js index 691eefffd74d..4da5c40c2d96 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateTests.js +++ b/packages/react-native-codegen/src/generators/components/GenerateTests.js @@ -23,7 +23,16 @@ type TestCase = $ReadOnly<{ raw?: boolean, }>; -const fileTemplate = ` +const FileTemplate = ({ + libraryName, + imports, + componentTests, +}: { + libraryName: string, + imports: string, + componentTests: string, +}) => + ` /** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * @@ -35,25 +44,35 @@ const fileTemplate = ` #include #include -#include -::_IMPORTS_:: +#include +${imports} using namespace facebook::react; -::_COMPONENT_TESTS_:: -`; - -const testTemplate = ` -TEST(::_COMPONENT_NAME_::_::_TEST_NAME_::, etc) { +${componentTests} +`.trim(); + +const TestTemplate = ({ + componentName, + testName, + propName, + propValue, +}: { + componentName: string, + testName: string, + propName: string, + propValue: string, +}) => ` +TEST(${componentName}_${testName}, etc) { auto propParser = RawPropsParser(); - propParser.prepare<::_COMPONENT_NAME_::>(); - auto const &sourceProps = ::_COMPONENT_NAME_::(); - auto const &rawProps = RawProps(folly::dynamic::object("::_PROP_NAME_::", ::_PROP_VALUE_::)); + propParser.prepare<${componentName}>(); + auto const &sourceProps = ${componentName}(); + auto const &rawProps = RawProps(folly::dynamic::object("${propName}", ${propValue})); ContextContainer contextContainer{}; PropsParserContext parserContext{-1, contextContainer}; rawProps.parse(propParser, parserContext); - ::_COMPONENT_NAME_::(parserContext, sourceProps, rawProps); + ${componentName}(parserContext, sourceProps, rawProps); } `; @@ -120,11 +139,12 @@ function generateTestsString(name, component) { const value = !raw && typeof propValue === 'string' ? `"${propValue}"` : propValue; - return testTemplate - .replace(/::_COMPONENT_NAME_::/g, name) - .replace(/::_TEST_NAME_::/g, testName != null ? testName : propName) - .replace(/::_PROP_NAME_::/g, propName) - .replace(/::_PROP_VALUE_::/g, String(value)); + return TestTemplate({ + componentName: name, + testName: testName != null ? testName : propName, + propName, + propValue: String(value), + }); } const testCases = component.props.reduce((cases, prop) => { @@ -187,11 +207,11 @@ module.exports = { .join('\n') .trim(); - const replacedTemplate = fileTemplate - .replace(/::_IMPORTS_::/g, imports) - .replace(/::_LIBRARY_NAME_::/g, libraryName) - .replace(/::_COMPONENT_TESTS_::/g, componentTests) - .trim(); + const replacedTemplate = FileTemplate({ + imports, + libraryName, + componentTests, + }); return new Map([[fileName, replacedTemplate]]); }, diff --git a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js index 3b74670d90ca..519e41885f47 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js +++ b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js @@ -17,7 +17,13 @@ import type {SchemaType} from '../../CodegenSchema'; // File path -> contents type FilesOutput = Map; -const template = ` +const FileTemplate = ({ + imports, + componentConfig, +}: { + imports: string, + componentConfig: string, +}) => ` /** * ${'C'}opyright (c) Facebook, Inc. and its affiliates. * @@ -31,9 +37,9 @@ const template = ` 'use strict'; -::_IMPORTS_:: +${imports} -::_COMPONENT_CONFIG_:: +${componentConfig} `; // We use this to add to a set. Need to make sure we aren't importing @@ -96,19 +102,33 @@ function getReactDiffProcessValue(typeAnnotation) { } } -const componentTemplate = ` -let nativeComponentName = '::_COMPONENT_NAME_WITH_COMPAT_SUPPORT_::'; -::_DEPRECATION_CHECK_:: +const ComponentTemplate = ({ + componentNameWithCompatSupport, + deprecationCheck, +}: { + componentNameWithCompatSupport: string, + deprecationCheck: string, +}) => + ` +let nativeComponentName = '${componentNameWithCompatSupport}'; +${deprecationCheck} export default NativeComponentRegistry.get(nativeComponentName, () => VIEW_CONFIG); `.trim(); -const deprecatedComponentTemplate = ` -if (UIManager.getViewManagerConfig('::_COMPONENT_NAME_::')) { - nativeComponentName = '::_COMPONENT_NAME_::'; -} else if (UIManager.getViewManagerConfig('::_COMPONENT_NAME_DEPRECATED_::')) { - nativeComponentName = '::_COMPONENT_NAME_DEPRECATED_::'; +const DeprecatedComponentTemplate = ({ + componentName, + componentNameDeprecated, +}: { + componentName: string, + componentNameDeprecated: string, +}) => + ` +if (UIManager.getViewManagerConfig('${componentName}')) { + nativeComponentName = '${componentName}'; +} else if (UIManager.getViewManagerConfig('${componentNameDeprecated}')) { + nativeComponentName = '${componentNameDeprecated}'; } else { - throw new Error('Failed to find native component for either "::_COMPONENT_NAME_::" or "::_COMPONENT_NAME_DEPRECATED_::"'); + throw new Error('Failed to find native component for either "${componentName}" or "${componentNameDeprecated}"'); } `.trim(); @@ -354,21 +374,17 @@ module.exports = { } const deprecatedCheckBlock = component.paperComponentNameDeprecated - ? deprecatedComponentTemplate - .replace(/::_COMPONENT_NAME_::/g, componentName) - .replace( - /::_COMPONENT_NAME_DEPRECATED_::/g, + ? DeprecatedComponentTemplate({ + componentName, + componentNameDeprecated: component.paperComponentNameDeprecated || '', - ) + }) : ''; - const replacedTemplate = componentTemplate - .replace(/::_COMPONENT_NAME_::/g, componentName) - .replace( - /::_COMPONENT_NAME_WITH_COMPAT_SUPPORT_::/g, - paperComponentName, - ) - .replace(/::_DEPRECATION_CHECK_::/, deprecatedCheckBlock); + const replacedTemplate = ComponentTemplate({ + componentNameWithCompatSupport: paperComponentName, + deprecationCheck: deprecatedCheckBlock, + }); const replacedSourceRoot = j.withParser('flow')(replacedTemplate); @@ -409,14 +425,12 @@ module.exports = { .filter(Boolean) .join('\n\n'); - const replacedTemplate = template - .replace(/::_COMPONENT_CONFIG_::/g, moduleResults) - .replace( - '::_IMPORTS_::', - Array.from(imports) - .sort() - .join('\n'), - ); + const replacedTemplate = FileTemplate({ + componentConfig: moduleResults, + imports: Array.from(imports) + .sort() + .join('\n'), + }); return new Map([[fileName, replacedTemplate]]); } catch (error) { From 18f62544c6f0f2459a9da325c6c843b49ebb23f0 Mon Sep 17 00:00:00 2001 From: Juan Tejada Date: Mon, 1 Nov 2021 10:44:38 -0700 Subject: [PATCH 090/628] Update React Devtools v4.21.0 Summary: Update `react-devtools-core` and `react-devtools` dependencies for RN, VSCode, Flippe, etc. `js1 upgrade react-devtools -v 4.21.0` # Changelog: [General][Changed] - Upgraded react-devtools-core dependency to 4.21.0 Reviewed By: bvaughn Differential Revision: D32065685 fbshipit-source-id: 30d0cca2bec6e9abe384da2afefab1d241e0523f --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e69b391d357a..4333fd4a843f 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "pretty-format": "^26.5.2", "promise": "^8.0.3", "prop-types": "^15.7.2", - "react-devtools-core": "4.20.2", + "react-devtools-core": "4.21.0", "react-refresh": "^0.4.0", "regenerator-runtime": "^0.13.2", "scheduler": "^0.20.2", diff --git a/yarn.lock b/yarn.lock index 7f952b7629ea..7f4d55cba4c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5563,10 +5563,10 @@ range-parser@~1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= -react-devtools-core@4.20.2: - version "4.20.2" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.20.2.tgz#0be500c80e09b640a2ee57f5ad5407e53bff6651" - integrity sha512-ep2j84M1ZtDFWsTtFrKyLyg4GEbnw4gFj/8brA+BZtsINgKHhWEVzscz5E/bFWRdyTM8mWdcaKQAk2hR+IezPw== +react-devtools-core@4.21.0: + version "4.21.0" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.21.0.tgz#a54c9a0fd7261491e616d6c87d1869e011d8521d" + integrity sha512-clGWwJHV5MHwTwYyKc+7FZHwzdbzrD2/AoZSkicUcr6YLc3Za9a9FaLhccWDHfjQ+ron9yzNhDT6Tv+FiPkD3g== dependencies: shell-quote "^1.6.1" ws "^7" From 60352a954922fa8d4a34e2eccea34d5d63077a3a Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Mon, 1 Nov 2021 11:38:50 -0700 Subject: [PATCH 091/628] Add workflow to create version labels on new releases (#32508) Summary: This PR adds the following GitHub actions: - https://github.com/lucasbento/core-workflow-create-version-label - Create version labels (such as `Version: 0.65.1`) whenever there's a new release; - https://github.com/lucasbento/core-workflow-apply-version-label - Apply a version label to opened/edited issues based on the version mentioned on the issue body. ## Changelog N/A. ## Few things to keep in mind - A label named "Version: unspecified" must be created; - The GitHub action to create labels will only run when there's a new release or if one is edited, it will then create all the other labels bases on the previous releases until it encounters one that already exists. --- Example of issue with version label: https://github.com/lucasbento/test-issue-forms/issues/4 Pull Request resolved: https://github.com/facebook/react-native/pull/32508 Reviewed By: cortinico Differential Revision: D32055682 Pulled By: lunaleaps fbshipit-source-id: 04d3e942eb1f71b3bc1d5a643b0156c35ef5f00b --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .../ISSUE_TEMPLATE/release_blocker_form.yml | 6 +++--- .../ISSUE_TEMPLATE/upgrade-regression-form.yml | 6 +++--- .../workflows/apply-version-label-issue.yml | 16 ++++++++++++++++ .../workflows/create-new-tag-version-label.yml | 18 ++++++++++++++++++ 5 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/apply-version-label-issue.yml create mode 100644 .github/workflows/create-new-tag-version-label.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 6af131b9f5b5..d2c508fc226d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -25,7 +25,7 @@ body: id: react-native-info attributes: label: Output of `react-native info` - description: Run `react-native info` in your terminal and copy the results here. + description: Run `react-native info` in your terminal, copy and paste the results here. validations: required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/release_blocker_form.yml b/.github/ISSUE_TEMPLATE/release_blocker_form.yml index 82e40388dd17..b8c35d75e6d3 100644 --- a/.github/ISSUE_TEMPLATE/release_blocker_form.yml +++ b/.github/ISSUE_TEMPLATE/release_blocker_form.yml @@ -23,10 +23,10 @@ body: validations: required: true - type: textarea - id: environment + id: react-native-info attributes: - label: Developer Environment - description: Please list relevant versions of system, tooling. Ex. OS, processor, Xcode, etc. + label: Output of `react-native info` + description: Run `react-native info` in your terminal, copy and paste the results here. validations: required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml b/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml index 985ec047e811..7e4fd8066c74 100644 --- a/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml +++ b/.github/ISSUE_TEMPLATE/upgrade-regression-form.yml @@ -31,10 +31,10 @@ body: validations: required: true - type: textarea - id: environment + id: react-native-info attributes: - label: Developer Environment - description: Please list relevant versions of system, tooling. Ex. OS, processor, Xcode, etc. + label: Output of `react-native info` + description: Run `react-native info` in your terminal, copy and paste the results here. validations: required: true - type: textarea diff --git a/.github/workflows/apply-version-label-issue.yml b/.github/workflows/apply-version-label-issue.yml new file mode 100644 index 000000000000..c9ae9364b64f --- /dev/null +++ b/.github/workflows/apply-version-label-issue.yml @@ -0,0 +1,16 @@ +name: Apply version label to issue + +on: + issues: + types: [opened, edited] + +jobs: + add-version-label-issue: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + + - uses: lucasbento/core-workflow-apply-version-label@v0.0.4 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/create-new-tag-version-label.yml b/.github/workflows/create-new-tag-version-label.yml new file mode 100644 index 000000000000..00373c857172 --- /dev/null +++ b/.github/workflows/create-new-tag-version-label.yml @@ -0,0 +1,18 @@ +name: Create new tag as version label + +on: + release: + types: + - created + - edited + +jobs: + add-new-tag-version-label: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + + - uses: lucasbento/core-workflow-create-version-label@v0.0.1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} From cfacfe8b6c0e87f479ba901793b520433a65530b Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Tue, 2 Nov 2021 10:37:55 -0700 Subject: [PATCH 092/628] Bump gradle-plugin to 0.0.3 Summary: For the sake of the playbook, I'm bumping the Gradle Plugin to the latest stable. Specifically a change in how CLI args are parsed (D31908041 (https://github.com/facebook/react-native/commit/70785e3d5a41bc85cea83aec0240e9f11aeff1ff)) was not backward compatible, therefore we need to migrate users to the new version. Changelog: [Internal] [Changed] - Bump gradle-plugin to 0.0.3 Reviewed By: hramos Differential Revision: D32101577 fbshipit-source-id: 9a29b988a4b520a8ece10a90a9a4bedc02ec16ad --- packages/react-native-gradle-plugin/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-gradle-plugin/package.json b/packages/react-native-gradle-plugin/package.json index d51d53644261..88e40ce9c39c 100644 --- a/packages/react-native-gradle-plugin/package.json +++ b/packages/react-native-gradle-plugin/package.json @@ -1,6 +1,6 @@ { "name": "react-native-gradle-plugin", - "version": "0.0.2", + "version": "0.0.3", "description": "⚛️ Gradle Plugin for React Native", "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/react-native-gradle-plugin", "repository": { From 857137dc2107b1c7027534f266415d72d41be5f0 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Tue, 2 Nov 2021 10:52:47 -0700 Subject: [PATCH 093/628] Create E2E tests for Component Generators Summary: ## Rationale - We actually don't have E2E tests that test the parser + generator together, until now. - **Documentation Value:** These tests show how the Component Spec files in [react-native-codegen/e2e/__test_fixtures__/](https://www.internalfb.com/code/fbsource/[e32a790dfa05]/xplat/js/react-native-github/packages/react-native-codegen/e2e/__test_fixtures__/components/) map to all the different types of codegen output. Changelog: [Internal] Reviewed By: sshic Differential Revision: D32081445 fbshipit-source-id: 02cd17945ef63a42381d6d4adbd0a9b0eaa2a1ef --- .../components/ArrayPropsNativeComponent.js | 8 +- .../EdgeInsetsPropNativeComponent.js | 4 +- .../GenerateComponentDescriptorH-test.js | 29 + .../GenerateComponentHObjCpp-test.js | 29 + .../GenerateEventEmitterCpp-test.js | 29 + .../components/GenerateEventEmitterH-test.js | 29 + .../components/GeneratePropsCpp-test.js | 29 + .../components/GeneratePropsH-test.js | 29 + .../GeneratePropsJavaDelegate-test.js | 29 + .../GeneratePropsJavaInterface-test.js | 28 + .../components/GenerateShadowNodeCpp-test.js | 28 + .../components/GenerateShadowNodeH-test.js | 28 + .../components/GenerateViewConfigJs-test.js | 29 + .../GenerateComponentDescriptorH-test.js.snap | 449 +++++++++ .../GenerateComponentHObjCpp-test.js.snap | 401 ++++++++ .../GenerateEventEmitterCpp-test.js.snap | 469 ++++++++++ .../GenerateEventEmitterH-test.js.snap | 499 ++++++++++ .../GeneratePropsCpp-test.js.snap | 557 ++++++++++++ .../__snapshots__/GeneratePropsH-test.js.snap | 853 ++++++++++++++++++ .../GeneratePropsJavaDelegate-test.js.snap | 660 ++++++++++++++ .../GeneratePropsJavaInterface-test.js.snap | 393 ++++++++ .../GenerateShadowNodeCpp-test.js.snap | 401 ++++++++ .../GenerateShadowNodeH-test.js.snap | 558 ++++++++++++ .../GenerateViewConfigJs-test.js.snap | 621 +++++++++++++ 24 files changed, 6182 insertions(+), 7 deletions(-) create mode 100644 packages/react-native-codegen/e2e/__tests__/components/GenerateComponentDescriptorH-test.js create mode 100644 packages/react-native-codegen/e2e/__tests__/components/GenerateComponentHObjCpp-test.js create mode 100644 packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterCpp-test.js create mode 100644 packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterH-test.js create mode 100644 packages/react-native-codegen/e2e/__tests__/components/GeneratePropsCpp-test.js create mode 100644 packages/react-native-codegen/e2e/__tests__/components/GeneratePropsH-test.js create mode 100644 packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaDelegate-test.js create mode 100644 packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaInterface-test.js create mode 100644 packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeCpp-test.js create mode 100644 packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeH-test.js create mode 100644 packages/react-native-codegen/e2e/__tests__/components/GenerateViewConfigJs-test.js create mode 100644 packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentDescriptorH-test.js.snap create mode 100644 packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentHObjCpp-test.js.snap create mode 100644 packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterCpp-test.js.snap create mode 100644 packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterH-test.js.snap create mode 100644 packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap create mode 100644 packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap create mode 100644 packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaDelegate-test.js.snap create mode 100644 packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaInterface-test.js.snap create mode 100644 packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeCpp-test.js.snap create mode 100644 packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeH-test.js.snap create mode 100644 packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js index 6c9a09da6777..1b3ae767521b 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js @@ -8,10 +8,7 @@ * @flow strict-local */ -import type { - PointValue, - EdgeInsetsValue, -} from '../../../../../Libraries/StyleSheet/StyleSheetTypes'; +import type {PointValue} from '../../../../../Libraries/StyleSheet/StyleSheetTypes'; import type {ColorValue} from '../../../../../Libraries/StyleSheet/StyleSheet'; import type {ImageSource} from '../../../../../Libraries/Image/ImageSource'; import type { @@ -34,7 +31,8 @@ type NativeProps = $ReadOnly<{| colors?: $ReadOnlyArray, srcs?: $ReadOnlyArray, points?: $ReadOnlyArray, - edgeInsets?: $ReadOnlyArray, + // TODO(T104760003) Fix EdgeInsetsValue in codegen + // edgeInsets?: $ReadOnlyArray, sizes?: WithDefault<$ReadOnlyArray<'small' | 'large'>, 'small'>, object?: $ReadOnlyArray<$ReadOnly<{|prop: string|}>>, |}>; diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/EdgeInsetsPropNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/EdgeInsetsPropNativeComponent.js index bad3a5a98259..921ca668a3ac 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/EdgeInsetsPropNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/EdgeInsetsPropNativeComponent.js @@ -8,7 +8,6 @@ * @flow strict-local */ -import type {EdgeInsetsValue} from '../../../../../Libraries/StyleSheet/StyleSheetTypes'; import type {ViewProps} from '../../../../../Libraries/Components/View/ViewPropTypes'; import codegenNativeComponent from '../../../../../Libraries/Utilities/codegenNativeComponent'; import type {HostComponent} from '../../../../../Libraries/Renderer/shims/ReactNativeTypes'; @@ -17,7 +16,8 @@ type NativeProps = $ReadOnly<{| ...ViewProps, // Props - contentInset?: EdgeInsetsValue, + // TODO(T104760003) Fix EdgeInsetsValue in codegen + // contentInset?: EdgeInsetsValue, |}>; export default (codegenNativeComponent( diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentDescriptorH-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentDescriptorH-test.js new file mode 100644 index 000000000000..eb79e148d315 --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentDescriptorH-test.js @@ -0,0 +1,29 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict-local + * @format + */ + +'use strict'; + +const parser = require('../../../src/parsers/flow'); +const generator = require('../../../src/generators/components/GenerateComponentDescriptorH'); +const fs = require('fs'); + +const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; + +const fixtures = fs.readdirSync(FIXTURE_DIR); + +fixtures.forEach(fixture => { + it(`GenerateComponentDescriptorH can generate for '${fixture}'`, () => { + const libName = 'RNCodegenModuleFixtures'; + const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); + const output = generator.generate(libName, schema); + expect(Object.fromEntries(output)).toMatchSnapshot(); + }); +}); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentHObjCpp-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentHObjCpp-test.js new file mode 100644 index 000000000000..19f7ad10e3e1 --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateComponentHObjCpp-test.js @@ -0,0 +1,29 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict-local + * @format + */ + +'use strict'; + +const parser = require('../../../src/parsers/flow'); +const generator = require('../../../src/generators/components/GenerateComponentHObjCpp'); +const fs = require('fs'); + +const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; + +const fixtures = fs.readdirSync(FIXTURE_DIR); + +fixtures.forEach(fixture => { + it(`GenerateComponentHObjCpp can generate for '${fixture}'`, () => { + const libName = 'RNCodegenModuleFixtures'; + const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); + const output = generator.generate(libName, schema); + expect(Object.fromEntries(output)).toMatchSnapshot(); + }); +}); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterCpp-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterCpp-test.js new file mode 100644 index 000000000000..6681c4f3ac2a --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterCpp-test.js @@ -0,0 +1,29 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict-local + * @format + */ + +'use strict'; + +const parser = require('../../../src/parsers/flow'); +const generator = require('../../../src/generators/components/GenerateEventEmitterCpp'); +const fs = require('fs'); + +const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; + +const fixtures = fs.readdirSync(FIXTURE_DIR); + +fixtures.forEach(fixture => { + it(`GenerateEventEmitterCpp can generate for '${fixture}'`, () => { + const libName = 'RNCodegenModuleFixtures'; + const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); + const output = generator.generate(libName, schema); + expect(Object.fromEntries(output)).toMatchSnapshot(); + }); +}); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterH-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterH-test.js new file mode 100644 index 000000000000..0d6111797de9 --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateEventEmitterH-test.js @@ -0,0 +1,29 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict-local + * @format + */ + +'use strict'; + +const parser = require('../../../src/parsers/flow'); +const generator = require('../../../src/generators/components/GenerateEventEmitterH'); +const fs = require('fs'); + +const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; + +const fixtures = fs.readdirSync(FIXTURE_DIR); + +fixtures.forEach(fixture => { + it(`GenerateEventEmitterH can generate for '${fixture}'`, () => { + const libName = 'RNCodegenModuleFixtures'; + const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); + const output = generator.generate(libName, schema); + expect(Object.fromEntries(output)).toMatchSnapshot(); + }); +}); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsCpp-test.js b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsCpp-test.js new file mode 100644 index 000000000000..854d3b32a104 --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsCpp-test.js @@ -0,0 +1,29 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict-local + * @format + */ + +'use strict'; + +const parser = require('../../../src/parsers/flow'); +const generator = require('../../../src/generators/components/GeneratePropsCpp'); +const fs = require('fs'); + +const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; + +const fixtures = fs.readdirSync(FIXTURE_DIR); + +fixtures.forEach(fixture => { + it(`GeneratePropsCpp can generate for '${fixture}'`, () => { + const libName = 'RNCodegenModuleFixtures'; + const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); + const output = generator.generate(libName, schema); + expect(Object.fromEntries(output)).toMatchSnapshot(); + }); +}); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsH-test.js b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsH-test.js new file mode 100644 index 000000000000..87a8058aea5e --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsH-test.js @@ -0,0 +1,29 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict-local + * @format + */ + +'use strict'; + +const parser = require('../../../src/parsers/flow'); +const generator = require('../../../src/generators/components/GeneratePropsH'); +const fs = require('fs'); + +const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; + +const fixtures = fs.readdirSync(FIXTURE_DIR); + +fixtures.forEach(fixture => { + it(`GeneratePropsH can generate for '${fixture}'`, () => { + const libName = 'RNCodegenModuleFixtures'; + const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); + const output = generator.generate(libName, schema); + expect(Object.fromEntries(output)).toMatchSnapshot(); + }); +}); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaDelegate-test.js b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaDelegate-test.js new file mode 100644 index 000000000000..7d64bf4755f6 --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaDelegate-test.js @@ -0,0 +1,29 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict-local + * @format + */ + +'use strict'; + +const parser = require('../../../src/parsers/flow'); +const generator = require('../../../src/generators/components/GeneratePropsJavaDelegate'); +const fs = require('fs'); + +const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; + +const fixtures = fs.readdirSync(FIXTURE_DIR); + +fixtures.forEach(fixture => { + it(`GeneratePropsJavaDelegate can generate for '${fixture}'`, () => { + const libName = 'RNCodegenModuleFixtures'; + const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); + const output = generator.generate(libName, schema); + expect(Object.fromEntries(output)).toMatchSnapshot(); + }); +}); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaInterface-test.js b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaInterface-test.js new file mode 100644 index 000000000000..b9b0e223febd --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/GeneratePropsJavaInterface-test.js @@ -0,0 +1,28 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict-local + * @format + */ + +'use strict'; + +const parser = require('../../../src/parsers/flow'); +const generator = require('../../../src/generators/components/GeneratePropsJavaInterface'); +const fs = require('fs'); + +const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; +const fixtures = fs.readdirSync(FIXTURE_DIR); + +fixtures.forEach(fixture => { + it(`GeneratePropsJavaInterface can generate for '${fixture}'`, () => { + const libName = 'RNCodegenModuleFixtures'; + const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); + const output = generator.generate(libName, schema, undefined, false); + expect(Object.fromEntries(output)).toMatchSnapshot(); + }); +}); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeCpp-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeCpp-test.js new file mode 100644 index 000000000000..99187964cac9 --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeCpp-test.js @@ -0,0 +1,28 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict-local + * @format + */ + +'use strict'; + +const parser = require('../../../src/parsers/flow'); +const generator = require('../../../src/generators/components/GenerateShadowNodeCpp'); +const fs = require('fs'); + +const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; +const fixtures = fs.readdirSync(FIXTURE_DIR); + +fixtures.forEach(fixture => { + it(`GenerateShadowNodeCpp can generate for '${fixture}'`, () => { + const libName = 'RNCodegenModuleFixtures'; + const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); + const output = generator.generate(libName, schema, undefined, false); + expect(Object.fromEntries(output)).toMatchSnapshot(); + }); +}); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeH-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeH-test.js new file mode 100644 index 000000000000..8ce360f64e7a --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateShadowNodeH-test.js @@ -0,0 +1,28 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict-local + * @format + */ + +'use strict'; + +const parser = require('../../../src/parsers/flow'); +const generator = require('../../../src/generators/components/GenerateShadowNodeH'); +const fs = require('fs'); + +const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; +const fixtures = fs.readdirSync(FIXTURE_DIR); + +fixtures.forEach(fixture => { + it(`GenerateShadowNodeH can generate for '${fixture}'`, () => { + const libName = 'RNCodegenModuleFixtures'; + const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); + const output = generator.generate(libName, schema, undefined, false); + expect(Object.fromEntries(output)).toMatchSnapshot(); + }); +}); diff --git a/packages/react-native-codegen/e2e/__tests__/components/GenerateViewConfigJs-test.js b/packages/react-native-codegen/e2e/__tests__/components/GenerateViewConfigJs-test.js new file mode 100644 index 000000000000..b49b023660d2 --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/GenerateViewConfigJs-test.js @@ -0,0 +1,29 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow strict-local + * @format + */ + +'use strict'; + +const parser = require('../../../src/parsers/flow'); +const generator = require('../../../src/generators/components/GenerateViewConfigJs'); +const fs = require('fs'); + +const FIXTURE_DIR = `${__dirname}/../../__test_fixtures__/components`; + +const fixtures = fs.readdirSync(FIXTURE_DIR); + +fixtures.forEach(fixture => { + it(`GenerateViewConfigJs can generate for '${fixture}'`, () => { + const libName = 'RNCodegenModuleFixtures'; + const schema = parser.parseFile(`${FIXTURE_DIR}/${fixture}`); + const output = generator.generate(libName, schema); + expect(output).toMatchSnapshot(); + }); +}); diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentDescriptorH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentDescriptorH-test.js.snap new file mode 100644 index 000000000000..508bc6c20f7a --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentDescriptorH-test.js.snap @@ -0,0 +1,449 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GenerateComponentDescriptorH can generate for 'ArrayPropsNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using ArrayPropsNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'BooleanPropNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using BooleanPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'ColorPropNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using ColorPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'EdgeInsetsPropNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using EdgeInsetsPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'EnumPropNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using EnumPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'EventNestedObjectPropsNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using EventNestedObjectPropsNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'EventPropsNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using EventPropsNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'FloatPropsNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using FloatPropsNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'ImagePropNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using ImagePropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'IntegerPropNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using IntegerPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'InterfaceOnlyNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'MultiNativePropNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using MultiNativePropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'NoPropsNoEventsNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using NoPropsNoEventsNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'ObjectPropsNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using ObjectPropsNativeComponentComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'PointPropNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using PointPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateComponentDescriptorH can generate for 'StringPropNativeComponent.js' 1`] = ` +Object { + "ComponentDescriptors.h": " +/** + * 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. + * + * @generated by codegen project: GenerateComponentDescriptorH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +using StringPropNativeComponentViewComponentDescriptor = ConcreteComponentDescriptor; + +} // namespace react +} // namespace facebook +", +} +`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentHObjCpp-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentHObjCpp-test.js.snap new file mode 100644 index 000000000000..29837dba416c --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateComponentHObjCpp-test.js.snap @@ -0,0 +1,401 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GenerateComponentHObjCpp can generate for 'ArrayPropsNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTArrayPropsNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'BooleanPropNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTBooleanPropNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'ColorPropNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTColorPropNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'EdgeInsetsPropNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTEdgeInsetsPropNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'EnumPropNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTEnumPropNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'EventNestedObjectPropsNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTEventNestedObjectPropsNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'EventPropsNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTEventPropsNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'FloatPropsNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTFloatPropsNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'ImagePropNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTImagePropNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'IntegerPropNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTIntegerPropNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'InterfaceOnlyNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTInterfaceOnlyNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'MultiNativePropNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTMultiNativePropNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'NoPropsNoEventsNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTNoPropsNoEventsNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'ObjectPropsNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTObjectPropsNativeComponentViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'PointPropNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTPointPropNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; + +exports[`GenerateComponentHObjCpp can generate for 'StringPropNativeComponent.js' 1`] = ` +Object { + "RCTComponentViewHelpers.h": "/** +* 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. +* +* @generated by codegen project: GenerateComponentHObjCpp.js +*/ + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RCTStringPropNativeComponentViewViewProtocol + +@end + +NS_ASSUME_NONNULL_END", +} +`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterCpp-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterCpp-test.js.snap new file mode 100644 index 000000000000..3f5bf83f6f3a --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterCpp-test.js.snap @@ -0,0 +1,469 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GenerateEventEmitterCpp can generate for 'ArrayPropsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'BooleanPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'ColorPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'EdgeInsetsPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'EnumPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'EventNestedObjectPropsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + +void EventNestedObjectPropsNativeComponentViewEventEmitter::onChange(OnChange event) const { + dispatchEvent(\\"change\\", [event=std::move(event)](jsi::Runtime &runtime) { + auto payload = jsi::Object(runtime); + { + auto location = jsi::Object(runtime); + { + auto source = jsi::Object(runtime); + source.setProperty(runtime, \\"url\\", event.location.source.url); + + location.setProperty(runtime, \\"source\\", source); + } +location.setProperty(runtime, \\"x\\", event.location.x); +location.setProperty(runtime, \\"y\\", event.location.y); + + payload.setProperty(runtime, \\"location\\", location); + } + return payload; + }); +} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'EventPropsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + +void EventPropsNativeComponentViewEventEmitter::onChange(OnChange event) const { + dispatchEvent(\\"change\\", [event=std::move(event)](jsi::Runtime &runtime) { + auto payload = jsi::Object(runtime); + payload.setProperty(runtime, \\"value\\", event.value); +payload.setProperty(runtime, \\"source\\", event.source); +payload.setProperty(runtime, \\"progress\\", event.progress); +payload.setProperty(runtime, \\"scale\\", event.scale); + return payload; + }); +} +void EventPropsNativeComponentViewEventEmitter::onEventDirect(OnEventDirect event) const { + dispatchEvent(\\"eventDirect\\", [event=std::move(event)](jsi::Runtime &runtime) { + auto payload = jsi::Object(runtime); + payload.setProperty(runtime, \\"value\\", event.value); + return payload; + }); +} +void EventPropsNativeComponentViewEventEmitter::onEventDirectWithPaperName(OnEventDirectWithPaperName event) const { + dispatchEvent(\\"eventDirectWithPaperName\\", [event=std::move(event)](jsi::Runtime &runtime) { + auto payload = jsi::Object(runtime); + payload.setProperty(runtime, \\"value\\", event.value); + return payload; + }); +} +void EventPropsNativeComponentViewEventEmitter::onOrientationChange(OnOrientationChange event) const { + dispatchEvent(\\"orientationChange\\", [event=std::move(event)](jsi::Runtime &runtime) { + auto payload = jsi::Object(runtime); + payload.setProperty(runtime, \\"orientation\\", toString(event.orientation)); + return payload; + }); +} +void EventPropsNativeComponentViewEventEmitter::onEnd(OnEnd event) const { + dispatchEvent(\\"end\\", [event=std::move(event)](jsi::Runtime &runtime) { + auto payload = jsi::Object(runtime); + + return payload; + }); +} +void EventPropsNativeComponentViewEventEmitter::onEventBubblingWithPaperName(OnEventBubblingWithPaperName event) const { + dispatchEvent(\\"eventBubblingWithPaperName\\", [event=std::move(event)](jsi::Runtime &runtime) { + auto payload = jsi::Object(runtime); + + return payload; + }); +} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'FloatPropsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'ImagePropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'IntegerPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'InterfaceOnlyNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + +void InterfaceOnlyNativeComponentViewEventEmitter::onChange(OnChange event) const { + dispatchEvent(\\"change\\", [event=std::move(event)](jsi::Runtime &runtime) { + auto payload = jsi::Object(runtime); + payload.setProperty(runtime, \\"value\\", event.value); + return payload; + }); +} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'MultiNativePropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'NoPropsNoEventsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'ObjectPropsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'PointPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterCpp can generate for 'StringPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterH-test.js.snap new file mode 100644 index 000000000000..24ce2461805e --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterH-test.js.snap @@ -0,0 +1,499 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GenerateEventEmitterH can generate for 'ArrayPropsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'BooleanPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'ColorPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'EdgeInsetsPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'EnumPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'EventNestedObjectPropsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + +class EventNestedObjectPropsNativeComponentViewEventEmitter : public ViewEventEmitter { + public: + using ViewEventEmitter::ViewEventEmitter; + + struct OnChangeLocationSource { + std::string url; + }; + + struct OnChangeLocation { + OnChangeLocationSource source; + int x; + int y; + }; + + struct OnChange { + OnChangeLocation location; + }; + + void onChange(OnChange value) const; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'EventPropsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + +class EventPropsNativeComponentViewEventEmitter : public ViewEventEmitter { + public: + using ViewEventEmitter::ViewEventEmitter; + + struct OnChange { + bool value; + std::string source; + int progress; + Float scale; + }; + + struct OnEventDirect { + bool value; + }; + + struct OnEventDirectWithPaperName { + bool value; + }; + + enum class OnOrientationChangeOrientation { + Landscape, + Portrait + }; + + static char const *toString(const OnOrientationChangeOrientation value) { + switch (value) { + case OnOrientationChangeOrientation::Landscape: return \\"landscape\\"; + case OnOrientationChangeOrientation::Portrait: return \\"portrait\\"; + } + } + + struct OnOrientationChange { + OnOrientationChangeOrientation orientation; + }; + + struct OnEnd { + + }; + + struct OnEventBubblingWithPaperName { + + }; + + void onChange(OnChange value) const; + + void onEventDirect(OnEventDirect value) const; + + void onEventDirectWithPaperName(OnEventDirectWithPaperName value) const; + + void onOrientationChange(OnOrientationChange value) const; + + void onEnd(OnEnd value) const; + + void onEventBubblingWithPaperName(OnEventBubblingWithPaperName value) const; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'FloatPropsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'ImagePropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'IntegerPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'InterfaceOnlyNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + +class InterfaceOnlyNativeComponentViewEventEmitter : public ViewEventEmitter { + public: + using ViewEventEmitter::ViewEventEmitter; + + struct OnChange { + bool value; + }; + + void onChange(OnChange value) const; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'MultiNativePropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'NoPropsNoEventsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'ObjectPropsNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'PointPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateEventEmitterH can generate for 'StringPropNativeComponent.js' 1`] = ` +Object { + "EventEmitters.h": " +/** + * 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. + * + * @generated by codegen project: GenerateEventEmitterH.js + */ +#pragma once + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap new file mode 100644 index 000000000000..2c646d888174 --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap @@ -0,0 +1,557 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GeneratePropsCpp can generate for 'ArrayPropsNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include +#include + +namespace facebook { +namespace react { + +ArrayPropsNativeComponentViewProps::ArrayPropsNativeComponentViewProps( + const PropsParserContext &context, + const ArrayPropsNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + names(convertRawProp(context, rawProps, \\"names\\", sourceProps.names, {})), + disableds(convertRawProp(context, rawProps, \\"disableds\\", sourceProps.disableds, {})), + progress(convertRawProp(context, rawProps, \\"progress\\", sourceProps.progress, {})), + radii(convertRawProp(context, rawProps, \\"radii\\", sourceProps.radii, {})), + colors(convertRawProp(context, rawProps, \\"colors\\", sourceProps.colors, {})), + srcs(convertRawProp(context, rawProps, \\"srcs\\", sourceProps.srcs, {})), + points(convertRawProp(context, rawProps, \\"points\\", sourceProps.points, {})), + sizes(convertRawProp(context, rawProps, \\"sizes\\", sourceProps.sizes, {static_cast(ArrayPropsNativeComponentViewSizes::Small)})), + object(convertRawProp(context, rawProps, \\"object\\", sourceProps.object, {})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'BooleanPropNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +BooleanPropNativeComponentViewProps::BooleanPropNativeComponentViewProps( + const PropsParserContext &context, + const BooleanPropNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + disabled(convertRawProp(context, rawProps, \\"disabled\\", sourceProps.disabled, {false})), + disabledNullable(convertRawProp(context, rawProps, \\"disabledNullable\\", sourceProps.disabledNullable, {})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'ColorPropNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +ColorPropNativeComponentViewProps::ColorPropNativeComponentViewProps( + const PropsParserContext &context, + const ColorPropNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + tintColor(convertRawProp(context, rawProps, \\"tintColor\\", sourceProps.tintColor, {})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'EdgeInsetsPropNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +EdgeInsetsPropNativeComponentViewProps::EdgeInsetsPropNativeComponentViewProps( + const PropsParserContext &context, + const EdgeInsetsPropNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps) + + + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'EnumPropNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +EnumPropNativeComponentViewProps::EnumPropNativeComponentViewProps( + const PropsParserContext &context, + const EnumPropNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + alignment(convertRawProp(context, rawProps, \\"alignment\\", sourceProps.alignment, {EnumPropNativeComponentViewAlignment::Center})), + intervals(convertRawProp(context, rawProps, \\"intervals\\", sourceProps.intervals, {EnumPropNativeComponentViewIntervals::Intervals0})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'EventNestedObjectPropsNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +EventNestedObjectPropsNativeComponentViewProps::EventNestedObjectPropsNativeComponentViewProps( + const PropsParserContext &context, + const EventNestedObjectPropsNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + disabled(convertRawProp(context, rawProps, \\"disabled\\", sourceProps.disabled, {false})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'EventPropsNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +EventPropsNativeComponentViewProps::EventPropsNativeComponentViewProps( + const PropsParserContext &context, + const EventPropsNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + disabled(convertRawProp(context, rawProps, \\"disabled\\", sourceProps.disabled, {false})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'FloatPropsNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +FloatPropsNativeComponentViewProps::FloatPropsNativeComponentViewProps( + const PropsParserContext &context, + const FloatPropsNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + blurRadius(convertRawProp(context, rawProps, \\"blurRadius\\", sourceProps.blurRadius, {0.0})), + blurRadius2(convertRawProp(context, rawProps, \\"blurRadius2\\", sourceProps.blurRadius2, {0.001})), + blurRadius3(convertRawProp(context, rawProps, \\"blurRadius3\\", sourceProps.blurRadius3, {2.1})), + blurRadius4(convertRawProp(context, rawProps, \\"blurRadius4\\", sourceProps.blurRadius4, {0.0})), + blurRadius5(convertRawProp(context, rawProps, \\"blurRadius5\\", sourceProps.blurRadius5, {1.0})), + blurRadius6(convertRawProp(context, rawProps, \\"blurRadius6\\", sourceProps.blurRadius6, {0.0})), + blurRadiusNullable(convertRawProp(context, rawProps, \\"blurRadiusNullable\\", sourceProps.blurRadiusNullable, {})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'ImagePropNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include +#include + +namespace facebook { +namespace react { + +ImagePropNativeComponentViewProps::ImagePropNativeComponentViewProps( + const PropsParserContext &context, + const ImagePropNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + thumbImage(convertRawProp(context, rawProps, \\"thumbImage\\", sourceProps.thumbImage, {})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'IntegerPropNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +IntegerPropNativeComponentViewProps::IntegerPropNativeComponentViewProps( + const PropsParserContext &context, + const IntegerPropNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + progress1(convertRawProp(context, rawProps, \\"progress1\\", sourceProps.progress1, {0})), + progress2(convertRawProp(context, rawProps, \\"progress2\\", sourceProps.progress2, {-1})), + progress3(convertRawProp(context, rawProps, \\"progress3\\", sourceProps.progress3, {10})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'InterfaceOnlyNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +InterfaceOnlyNativeComponentViewProps::InterfaceOnlyNativeComponentViewProps( + const PropsParserContext &context, + const InterfaceOnlyNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + title(convertRawProp(context, rawProps, \\"title\\", sourceProps.title, {\\"\\"})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'MultiNativePropNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include +#include + +namespace facebook { +namespace react { + +MultiNativePropNativeComponentViewProps::MultiNativePropNativeComponentViewProps( + const PropsParserContext &context, + const MultiNativePropNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + thumbImage(convertRawProp(context, rawProps, \\"thumbImage\\", sourceProps.thumbImage, {})), + color(convertRawProp(context, rawProps, \\"color\\", sourceProps.color, {})), + thumbTintColor(convertRawProp(context, rawProps, \\"thumbTintColor\\", sourceProps.thumbTintColor, {})), + point(convertRawProp(context, rawProps, \\"point\\", sourceProps.point, {})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'NoPropsNoEventsNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +NoPropsNoEventsNativeComponentViewProps::NoPropsNoEventsNativeComponentViewProps( + const PropsParserContext &context, + const NoPropsNoEventsNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps) + + + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'ObjectPropsNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include +#include + +namespace facebook { +namespace react { + +ObjectPropsNativeComponentProps::ObjectPropsNativeComponentProps( + const PropsParserContext &context, + const ObjectPropsNativeComponentProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + objectProp(convertRawProp(context, rawProps, \\"objectProp\\", sourceProps.objectProp, {})), + objectArrayProp(convertRawProp(context, rawProps, \\"objectArrayProp\\", sourceProps.objectArrayProp, {})), + objectPrimitiveRequiredProp(convertRawProp(context, rawProps, \\"objectPrimitiveRequiredProp\\", sourceProps.objectPrimitiveRequiredProp, {})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'PointPropNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +PointPropNativeComponentViewProps::PointPropNativeComponentViewProps( + const PropsParserContext &context, + const PointPropNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + startPoint(convertRawProp(context, rawProps, \\"startPoint\\", sourceProps.startPoint, {})) + {} + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsCpp can generate for 'StringPropNativeComponent.js' 1`] = ` +Object { + "Props.cpp": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsCpp.js + */ + +#include +#include +#include + +namespace facebook { +namespace react { + +StringPropNativeComponentViewProps::StringPropNativeComponentViewProps( + const PropsParserContext &context, + const StringPropNativeComponentViewProps &sourceProps, + const RawProps &rawProps): ViewProps(context, sourceProps, rawProps), + + placeholder(convertRawProp(context, rawProps, \\"placeholder\\", sourceProps.placeholder, {\\"\\"})), + defaultValue(convertRawProp(context, rawProps, \\"defaultValue\\", sourceProps.defaultValue, {})) + {} + +} // namespace react +} // namespace facebook +", +} +`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap new file mode 100644 index 000000000000..fb6ce03da6ae --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap @@ -0,0 +1,853 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GeneratePropsH can generate for 'ArrayPropsNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace facebook { +namespace react { + +using ArrayPropsNativeComponentViewSizesMask = uint32_t; + +enum class ArrayPropsNativeComponentViewSizes: ArrayPropsNativeComponentViewSizesMask { + Small = 1 << 0, + Large = 1 << 1 +}; + +constexpr bool operator&( + ArrayPropsNativeComponentViewSizesMask const lhs, + enum ArrayPropsNativeComponentViewSizes const rhs) { + return lhs & static_cast(rhs); +} + +constexpr ArrayPropsNativeComponentViewSizesMask operator|( + ArrayPropsNativeComponentViewSizesMask const lhs, + enum ArrayPropsNativeComponentViewSizes const rhs) { + return lhs | static_cast(rhs); +} + +constexpr void operator|=( + ArrayPropsNativeComponentViewSizesMask &lhs, + enum ArrayPropsNativeComponentViewSizes const rhs) { + lhs = lhs | static_cast(rhs); +} + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ArrayPropsNativeComponentViewSizesMask &result) { + auto items = std::vector{value}; + for (const auto &item : items) { + if (item == \\"small\\") { + result |= ArrayPropsNativeComponentViewSizes::Small; + continue; + } + if (item == \\"large\\") { + result |= ArrayPropsNativeComponentViewSizes::Large; + continue; + } + abort(); + } +} + +static inline std::string toString(const ArrayPropsNativeComponentViewSizesMask &value) { + auto result = std::string{}; + auto separator = std::string{\\", \\"}; + + if (value & ArrayPropsNativeComponentViewSizes::Small) { + result += \\"small\\" + separator; + } + if (value & ArrayPropsNativeComponentViewSizes::Large) { + result += \\"large\\" + separator; + } + if (!result.empty()) { + result.erase(result.length() - separator.length()); + } + return result; +} +struct ArrayPropsNativeComponentViewObjectStruct { + std::string prop; +}; + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ArrayPropsNativeComponentViewObjectStruct &result) { + auto map = (better::map)value; + + auto prop = map.find(\\"prop\\"); + if (prop != map.end()) { + fromRawValue(context, prop->second, result.prop); + } +} + +static inline std::string toString(const ArrayPropsNativeComponentViewObjectStruct &value) { + return \\"[Object ArrayPropsNativeComponentViewObjectStruct]\\"; +} + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, std::vector &result) { + auto items = (std::vector)value; + for (const auto &item : items) { + ArrayPropsNativeComponentViewObjectStruct newItem; + fromRawValue(context, item, newItem); + result.emplace_back(newItem); + } +} + +class ArrayPropsNativeComponentViewProps final : public ViewProps { + public: + ArrayPropsNativeComponentViewProps() = default; + ArrayPropsNativeComponentViewProps(const PropsParserContext& context, const ArrayPropsNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + std::vector names{}; + std::vector disableds{}; + std::vector progress{}; + std::vector radii{}; + std::vector colors{}; + std::vector srcs{}; + std::vector points{}; + ArrayPropsNativeComponentViewSizesMask sizes{static_cast(ArrayPropsNativeComponentViewSizes::Small)}; + std::vector object{}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'BooleanPropNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +class BooleanPropNativeComponentViewProps final : public ViewProps { + public: + BooleanPropNativeComponentViewProps() = default; + BooleanPropNativeComponentViewProps(const PropsParserContext& context, const BooleanPropNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + bool disabled{false}; + bool disabledNullable{}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'ColorPropNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include +#include + +namespace facebook { +namespace react { + +class ColorPropNativeComponentViewProps final : public ViewProps { + public: + ColorPropNativeComponentViewProps() = default; + ColorPropNativeComponentViewProps(const PropsParserContext& context, const ColorPropNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + SharedColor tintColor{}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'EdgeInsetsPropNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +class EdgeInsetsPropNativeComponentViewProps final : public ViewProps { + public: + EdgeInsetsPropNativeComponentViewProps() = default; + EdgeInsetsPropNativeComponentViewProps(const PropsParserContext& context, const EdgeInsetsPropNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'EnumPropNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +enum class EnumPropNativeComponentViewAlignment { Top, Center, BottomRight }; + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, EnumPropNativeComponentViewAlignment &result) { + auto string = (std::string)value; + if (string == \\"top\\") { result = EnumPropNativeComponentViewAlignment::Top; return; } + if (string == \\"center\\") { result = EnumPropNativeComponentViewAlignment::Center; return; } + if (string == \\"bottom-right\\") { result = EnumPropNativeComponentViewAlignment::BottomRight; return; } + abort(); +} + +static inline std::string toString(const EnumPropNativeComponentViewAlignment &value) { + switch (value) { + case EnumPropNativeComponentViewAlignment::Top: return \\"top\\"; + case EnumPropNativeComponentViewAlignment::Center: return \\"center\\"; + case EnumPropNativeComponentViewAlignment::BottomRight: return \\"bottom-right\\"; + } +} +enum class EnumPropNativeComponentViewIntervals { Intervals0 = 0, Intervals15 = 15, Intervals30 = 30, Intervals60 = 60 }; + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, EnumPropNativeComponentViewIntervals &result) { + assert(value.hasType()); + auto integerValue = (int)value; + switch (integerValue) { + case 0: + result = EnumPropNativeComponentViewIntervals::Intervals0; + return; + case 15: + result = EnumPropNativeComponentViewIntervals::Intervals15; + return; + case 30: + result = EnumPropNativeComponentViewIntervals::Intervals30; + return; + case 60: + result = EnumPropNativeComponentViewIntervals::Intervals60; + return; + } + abort(); +} + +static inline std::string toString(const EnumPropNativeComponentViewIntervals &value) { + switch (value) { + case EnumPropNativeComponentViewIntervals::Intervals0: return \\"0\\"; + case EnumPropNativeComponentViewIntervals::Intervals15: return \\"15\\"; + case EnumPropNativeComponentViewIntervals::Intervals30: return \\"30\\"; + case EnumPropNativeComponentViewIntervals::Intervals60: return \\"60\\"; + } +} + +class EnumPropNativeComponentViewProps final : public ViewProps { + public: + EnumPropNativeComponentViewProps() = default; + EnumPropNativeComponentViewProps(const PropsParserContext& context, const EnumPropNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + EnumPropNativeComponentViewAlignment alignment{EnumPropNativeComponentViewAlignment::Center}; + EnumPropNativeComponentViewIntervals intervals{EnumPropNativeComponentViewIntervals::Intervals0}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'EventNestedObjectPropsNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +class EventNestedObjectPropsNativeComponentViewProps final : public ViewProps { + public: + EventNestedObjectPropsNativeComponentViewProps() = default; + EventNestedObjectPropsNativeComponentViewProps(const PropsParserContext& context, const EventNestedObjectPropsNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + bool disabled{false}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'EventPropsNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +class EventPropsNativeComponentViewProps final : public ViewProps { + public: + EventPropsNativeComponentViewProps() = default; + EventPropsNativeComponentViewProps(const PropsParserContext& context, const EventPropsNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + bool disabled{false}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'FloatPropsNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +class FloatPropsNativeComponentViewProps final : public ViewProps { + public: + FloatPropsNativeComponentViewProps() = default; + FloatPropsNativeComponentViewProps(const PropsParserContext& context, const FloatPropsNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + Float blurRadius{0.0}; + Float blurRadius2{0.001}; + Float blurRadius3{2.1}; + Float blurRadius4{0.0}; + Float blurRadius5{1.0}; + Float blurRadius6{0.0}; + Float blurRadiusNullable{}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'ImagePropNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include +#include + +namespace facebook { +namespace react { + +class ImagePropNativeComponentViewProps final : public ViewProps { + public: + ImagePropNativeComponentViewProps() = default; + ImagePropNativeComponentViewProps(const PropsParserContext& context, const ImagePropNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + ImageSource thumbImage{}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'IntegerPropNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +class IntegerPropNativeComponentViewProps final : public ViewProps { + public: + IntegerPropNativeComponentViewProps() = default; + IntegerPropNativeComponentViewProps(const PropsParserContext& context, const IntegerPropNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + int progress1{0}; + int progress2{-1}; + int progress3{10}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'InterfaceOnlyNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +class InterfaceOnlyNativeComponentViewProps final : public ViewProps { + public: + InterfaceOnlyNativeComponentViewProps() = default; + InterfaceOnlyNativeComponentViewProps(const PropsParserContext& context, const InterfaceOnlyNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + std::string title{\\"\\"}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'MultiNativePropNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include +#include +#include +#include + +namespace facebook { +namespace react { + +class MultiNativePropNativeComponentViewProps final : public ViewProps { + public: + MultiNativePropNativeComponentViewProps() = default; + MultiNativePropNativeComponentViewProps(const PropsParserContext& context, const MultiNativePropNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + ImageSource thumbImage{}; + SharedColor color{}; + SharedColor thumbTintColor{}; + Point point{}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'NoPropsNoEventsNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +class NoPropsNoEventsNativeComponentViewProps final : public ViewProps { + public: + NoPropsNoEventsNativeComponentViewProps() = default; + NoPropsNoEventsNativeComponentViewProps(const PropsParserContext& context, const NoPropsNoEventsNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'ObjectPropsNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace facebook { +namespace react { + +enum class ObjectPropsNativeComponentStringEnumProp { Small, Large }; + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ObjectPropsNativeComponentStringEnumProp &result) { + auto string = (std::string)value; + if (string == \\"small\\") { result = ObjectPropsNativeComponentStringEnumProp::Small; return; } + if (string == \\"large\\") { result = ObjectPropsNativeComponentStringEnumProp::Large; return; } + abort(); +} + +static inline std::string toString(const ObjectPropsNativeComponentStringEnumProp &value) { + switch (value) { + case ObjectPropsNativeComponentStringEnumProp::Small: return \\"small\\"; + case ObjectPropsNativeComponentStringEnumProp::Large: return \\"large\\"; + } +} +enum class ObjectPropsNativeComponentIntEnumProp { IntEnumProp0 = 0, IntEnumProp1 = 1 }; + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ObjectPropsNativeComponentIntEnumProp &result) { + assert(value.hasType()); + auto integerValue = (int)value; + switch (integerValue) { + case 0: + result = ObjectPropsNativeComponentIntEnumProp::IntEnumProp0; + return; + case 1: + result = ObjectPropsNativeComponentIntEnumProp::IntEnumProp1; + return; + } + abort(); +} + +static inline std::string toString(const ObjectPropsNativeComponentIntEnumProp &value) { + switch (value) { + case ObjectPropsNativeComponentIntEnumProp::IntEnumProp0: return \\"0\\"; + case ObjectPropsNativeComponentIntEnumProp::IntEnumProp1: return \\"1\\"; + } +} +struct ObjectPropsNativeComponentObjectPropStruct { + std::string stringProp; + bool booleanProp; + Float floatProp; + int intProp; + ObjectPropsNativeComponentStringEnumProp stringEnumProp; + ObjectPropsNativeComponentIntEnumProp intEnumProp; +}; + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ObjectPropsNativeComponentObjectPropStruct &result) { + auto map = (better::map)value; + + auto stringProp = map.find(\\"stringProp\\"); + if (stringProp != map.end()) { + fromRawValue(context, stringProp->second, result.stringProp); + } + auto booleanProp = map.find(\\"booleanProp\\"); + if (booleanProp != map.end()) { + fromRawValue(context, booleanProp->second, result.booleanProp); + } + auto floatProp = map.find(\\"floatProp\\"); + if (floatProp != map.end()) { + fromRawValue(context, floatProp->second, result.floatProp); + } + auto intProp = map.find(\\"intProp\\"); + if (intProp != map.end()) { + fromRawValue(context, intProp->second, result.intProp); + } + auto stringEnumProp = map.find(\\"stringEnumProp\\"); + if (stringEnumProp != map.end()) { + fromRawValue(context, stringEnumProp->second, result.stringEnumProp); + } + auto intEnumProp = map.find(\\"intEnumProp\\"); + if (intEnumProp != map.end()) { + fromRawValue(context, intEnumProp->second, result.intEnumProp); + } +} + +static inline std::string toString(const ObjectPropsNativeComponentObjectPropStruct &value) { + return \\"[Object ObjectPropsNativeComponentObjectPropStruct]\\"; +} + +struct ObjectPropsNativeComponentObjectArrayPropStruct { + std::vector array; +}; + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ObjectPropsNativeComponentObjectArrayPropStruct &result) { + auto map = (better::map)value; + + auto array = map.find(\\"array\\"); + if (array != map.end()) { + fromRawValue(context, array->second, result.array); + } +} + +static inline std::string toString(const ObjectPropsNativeComponentObjectArrayPropStruct &value) { + return \\"[Object ObjectPropsNativeComponentObjectArrayPropStruct]\\"; +} + +struct ObjectPropsNativeComponentObjectPrimitiveRequiredPropStruct { + ImageSource image; + SharedColor color; + Point point; +}; + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ObjectPropsNativeComponentObjectPrimitiveRequiredPropStruct &result) { + auto map = (better::map)value; + + auto image = map.find(\\"image\\"); + if (image != map.end()) { + fromRawValue(context, image->second, result.image); + } + auto color = map.find(\\"color\\"); + if (color != map.end()) { + fromRawValue(context, color->second, result.color); + } + auto point = map.find(\\"point\\"); + if (point != map.end()) { + fromRawValue(context, point->second, result.point); + } +} + +static inline std::string toString(const ObjectPropsNativeComponentObjectPrimitiveRequiredPropStruct &value) { + return \\"[Object ObjectPropsNativeComponentObjectPrimitiveRequiredPropStruct]\\"; +} +class ObjectPropsNativeComponentProps final : public ViewProps { + public: + ObjectPropsNativeComponentProps() = default; + ObjectPropsNativeComponentProps(const PropsParserContext& context, const ObjectPropsNativeComponentProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + ObjectPropsNativeComponentObjectPropStruct objectProp{}; + ObjectPropsNativeComponentObjectArrayPropStruct objectArrayProp{}; + ObjectPropsNativeComponentObjectPrimitiveRequiredPropStruct objectPrimitiveRequiredProp{}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'PointPropNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include +#include + +namespace facebook { +namespace react { + +class PointPropNativeComponentViewProps final : public ViewProps { + public: + PointPropNativeComponentViewProps() = default; + PointPropNativeComponentViewProps(const PropsParserContext& context, const PointPropNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + Point startPoint{}; +}; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GeneratePropsH can generate for 'StringPropNativeComponent.js' 1`] = ` +Object { + "Props.h": " +/** + * 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. + * + * @generated by codegen project: GeneratePropsH.js + */ +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +class StringPropNativeComponentViewProps final : public ViewProps { + public: + StringPropNativeComponentViewProps() = default; + StringPropNativeComponentViewProps(const PropsParserContext& context, const StringPropNativeComponentViewProps &sourceProps, const RawProps &rawProps); + +#pragma mark - Props + + std::string placeholder{\\"\\"}; + std::string defaultValue{}; +}; + +} // namespace react +} // namespace facebook +", +} +`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaDelegate-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaDelegate-test.js.snap new file mode 100644 index 000000000000..6162300005bc --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaDelegate-test.js.snap @@ -0,0 +1,660 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GeneratePropsJavaDelegate can generate for 'ArrayPropsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/ArrayPropsNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class ArrayPropsNativeComponentViewManagerDelegate & ArrayPropsNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public ArrayPropsNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"names\\": + mViewManager.setNames(view, (ReadableArray) value); + break; + case \\"disableds\\": + mViewManager.setDisableds(view, (ReadableArray) value); + break; + case \\"progress\\": + mViewManager.setProgress(view, (ReadableArray) value); + break; + case \\"radii\\": + mViewManager.setRadii(view, (ReadableArray) value); + break; + case \\"colors\\": + mViewManager.setColors(view, (ReadableArray) value); + break; + case \\"srcs\\": + mViewManager.setSrcs(view, (ReadableArray) value); + break; + case \\"points\\": + mViewManager.setPoints(view, (ReadableArray) value); + break; + case \\"sizes\\": + mViewManager.setSizes(view, (ReadableArray) value); + break; + case \\"object\\": + mViewManager.setObject(view, (ReadableArray) value); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'BooleanPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/BooleanPropNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class BooleanPropNativeComponentViewManagerDelegate & BooleanPropNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public BooleanPropNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"disabled\\": + mViewManager.setDisabled(view, value == null ? false : (boolean) value); + break; + case \\"disabledNullable\\": + mViewManager.setDisabledNullable(view, value == null ? null : (Boolean) value); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'ColorPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/ColorPropNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.ColorPropConverter; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class ColorPropNativeComponentViewManagerDelegate & ColorPropNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public ColorPropNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"tintColor\\": + mViewManager.setTintColor(view, ColorPropConverter.getColor(value, view.getContext())); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'EdgeInsetsPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/EdgeInsetsPropNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class EdgeInsetsPropNativeComponentViewManagerDelegate & EdgeInsetsPropNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public EdgeInsetsPropNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + super.setProperty(view, propName, value); + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'EnumPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/EnumPropNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class EnumPropNativeComponentViewManagerDelegate & EnumPropNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public EnumPropNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"alignment\\": + mViewManager.setAlignment(view, (String) value); + break; + case \\"intervals\\": + mViewManager.setIntervals(view, value == null ? 0 : ((Double) value).intValue()); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'EventNestedObjectPropsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/EventNestedObjectPropsNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class EventNestedObjectPropsNativeComponentViewManagerDelegate & EventNestedObjectPropsNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public EventNestedObjectPropsNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"disabled\\": + mViewManager.setDisabled(view, value == null ? false : (boolean) value); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'EventPropsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/EventPropsNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class EventPropsNativeComponentViewManagerDelegate & EventPropsNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public EventPropsNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"disabled\\": + mViewManager.setDisabled(view, value == null ? false : (boolean) value); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'FloatPropsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/FloatPropsNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class FloatPropsNativeComponentViewManagerDelegate & FloatPropsNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public FloatPropsNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"blurRadius\\": + mViewManager.setBlurRadius(view, value == null ? Float.NaN : ((Double) value).floatValue()); + break; + case \\"blurRadius2\\": + mViewManager.setBlurRadius2(view, value == null ? 0.001f : ((Double) value).floatValue()); + break; + case \\"blurRadius3\\": + mViewManager.setBlurRadius3(view, value == null ? 2.1f : ((Double) value).floatValue()); + break; + case \\"blurRadius4\\": + mViewManager.setBlurRadius4(view, value == null ? 0f : ((Double) value).floatValue()); + break; + case \\"blurRadius5\\": + mViewManager.setBlurRadius5(view, value == null ? 1f : ((Double) value).floatValue()); + break; + case \\"blurRadius6\\": + mViewManager.setBlurRadius6(view, value == null ? 0f : ((Double) value).floatValue()); + break; + case \\"blurRadiusNullable\\": + mViewManager.setBlurRadiusNullable(view, value == null ? null : ((Double) value).floatValue()); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'ImagePropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/ImagePropNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class ImagePropNativeComponentViewManagerDelegate & ImagePropNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public ImagePropNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"thumbImage\\": + mViewManager.setThumbImage(view, (ReadableMap) value); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'IntegerPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/IntegerPropNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class IntegerPropNativeComponentViewManagerDelegate & IntegerPropNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public IntegerPropNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"progress1\\": + mViewManager.setProgress1(view, value == null ? 0 : ((Double) value).intValue()); + break; + case \\"progress2\\": + mViewManager.setProgress2(view, value == null ? -1 : ((Double) value).intValue()); + break; + case \\"progress3\\": + mViewManager.setProgress3(view, value == null ? 10 : ((Double) value).intValue()); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'InterfaceOnlyNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/InterfaceOnlyNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class InterfaceOnlyNativeComponentViewManagerDelegate & InterfaceOnlyNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public InterfaceOnlyNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"title\\": + mViewManager.setTitle(view, value == null ? \\"\\" : (String) value); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'MultiNativePropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/MultiNativePropNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.ColorPropConverter; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class MultiNativePropNativeComponentViewManagerDelegate & MultiNativePropNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public MultiNativePropNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"thumbImage\\": + mViewManager.setThumbImage(view, (ReadableMap) value); + break; + case \\"color\\": + mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext())); + break; + case \\"thumbTintColor\\": + mViewManager.setThumbTintColor(view, ColorPropConverter.getColor(value, view.getContext())); + break; + case \\"point\\": + mViewManager.setPoint(view, (ReadableMap) value); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'NoPropsNoEventsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/NoPropsNoEventsNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class NoPropsNoEventsNativeComponentViewManagerDelegate & NoPropsNoEventsNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public NoPropsNoEventsNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + super.setProperty(view, propName, value); + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'ObjectPropsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/ObjectPropsNativeComponentManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class ObjectPropsNativeComponentManagerDelegate & ObjectPropsNativeComponentManagerInterface> extends BaseViewManagerDelegate { + public ObjectPropsNativeComponentManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"objectProp\\": + mViewManager.setObjectProp(view, (ReadableMap) value); + break; + case \\"objectArrayProp\\": + mViewManager.setObjectArrayProp(view, (ReadableMap) value); + break; + case \\"objectPrimitiveRequiredProp\\": + mViewManager.setObjectPrimitiveRequiredProp(view, (ReadableMap) value); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'PointPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/PointPropNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class PointPropNativeComponentViewManagerDelegate & PointPropNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public PointPropNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"startPoint\\": + mViewManager.setStartPoint(view, (ReadableMap) value); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; + +exports[`GeneratePropsJavaDelegate can generate for 'StringPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/StringPropNativeComponentViewManagerDelegate.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaDelegate.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.uimanager.BaseViewManagerDelegate; +import com.facebook.react.uimanager.BaseViewManagerInterface; + +public class StringPropNativeComponentViewManagerDelegate & StringPropNativeComponentViewManagerInterface> extends BaseViewManagerDelegate { + public StringPropNativeComponentViewManagerDelegate(U viewManager) { + super(viewManager); + } + @Override + public void setProperty(T view, String propName, @Nullable Object value) { + switch (propName) { + case \\"placeholder\\": + mViewManager.setPlaceholder(view, value == null ? \\"\\" : (String) value); + break; + case \\"defaultValue\\": + mViewManager.setDefaultValue(view, value == null ? null : (String) value); + break; + default: + super.setProperty(view, propName, value); + } + } +} +", +} +`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaInterface-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaInterface-test.js.snap new file mode 100644 index 000000000000..fed2a1c95756 --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaInterface-test.js.snap @@ -0,0 +1,393 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GeneratePropsJavaInterface can generate for 'ArrayPropsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/ArrayPropsNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.ReadableArray; + +public interface ArrayPropsNativeComponentViewManagerInterface { + void setNames(T view, @Nullable ReadableArray value); + void setDisableds(T view, @Nullable ReadableArray value); + void setProgress(T view, @Nullable ReadableArray value); + void setRadii(T view, @Nullable ReadableArray value); + void setColors(T view, @Nullable ReadableArray value); + void setSrcs(T view, @Nullable ReadableArray value); + void setPoints(T view, @Nullable ReadableArray value); + void setSizes(T view, @Nullable ReadableArray value); + void setObject(T view, @Nullable ReadableArray value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'BooleanPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/BooleanPropNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; + +public interface BooleanPropNativeComponentViewManagerInterface { + void setDisabled(T view, boolean value); + void setDisabledNullable(T view, @Nullable Boolean value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'ColorPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/ColorPropNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; + +public interface ColorPropNativeComponentViewManagerInterface { + void setTintColor(T view, @Nullable Integer value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'EdgeInsetsPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/EdgeInsetsPropNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; + +public interface EdgeInsetsPropNativeComponentViewManagerInterface { + // No props +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'EnumPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/EnumPropNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; + +public interface EnumPropNativeComponentViewManagerInterface { + void setAlignment(T view, @Nullable String value); + void setIntervals(T view, @Nullable Integer value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'EventNestedObjectPropsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/EventNestedObjectPropsNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; + +public interface EventNestedObjectPropsNativeComponentViewManagerInterface { + void setDisabled(T view, boolean value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'EventPropsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/EventPropsNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; + +public interface EventPropsNativeComponentViewManagerInterface { + void setDisabled(T view, boolean value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'FloatPropsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/FloatPropsNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; + +public interface FloatPropsNativeComponentViewManagerInterface { + void setBlurRadius(T view, float value); + void setBlurRadius2(T view, float value); + void setBlurRadius3(T view, float value); + void setBlurRadius4(T view, float value); + void setBlurRadius5(T view, float value); + void setBlurRadius6(T view, float value); + void setBlurRadiusNullable(T view, @Nullable Float value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'ImagePropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/ImagePropNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.ReadableMap; + +public interface ImagePropNativeComponentViewManagerInterface { + void setThumbImage(T view, @Nullable ReadableMap value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'IntegerPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/IntegerPropNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; + +public interface IntegerPropNativeComponentViewManagerInterface { + void setProgress1(T view, int value); + void setProgress2(T view, int value); + void setProgress3(T view, int value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'InterfaceOnlyNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/InterfaceOnlyNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; + +public interface InterfaceOnlyNativeComponentViewManagerInterface { + void setTitle(T view, @Nullable String value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'MultiNativePropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/MultiNativePropNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.ReadableMap; + +public interface MultiNativePropNativeComponentViewManagerInterface { + void setThumbImage(T view, @Nullable ReadableMap value); + void setColor(T view, @Nullable Integer value); + void setThumbTintColor(T view, @Nullable Integer value); + void setPoint(T view, @Nullable ReadableMap value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'NoPropsNoEventsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/NoPropsNoEventsNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; + +public interface NoPropsNoEventsNativeComponentViewManagerInterface { + // No props +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'ObjectPropsNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/ObjectPropsNativeComponentManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.ReadableMap; + +public interface ObjectPropsNativeComponentManagerInterface { + void setObjectProp(T view, @Nullable ReadableMap value); + void setObjectArrayProp(T view, @Nullable ReadableMap value); + void setObjectPrimitiveRequiredProp(T view, @Nullable ReadableMap value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'PointPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/PointPropNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.ReadableMap; + +public interface PointPropNativeComponentViewManagerInterface { + void setStartPoint(T view, @Nullable ReadableMap value); +} +", +} +`; + +exports[`GeneratePropsJavaInterface can generate for 'StringPropNativeComponent.js' 1`] = ` +Object { + "java/com/facebook/react/viewmanagers/StringPropNativeComponentViewManagerInterface.java": "/** +* 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. +* +* @generated by codegen project: GeneratePropsJavaInterface.js +*/ + +package com.facebook.react.viewmanagers; + +import android.view.View; +import androidx.annotation.Nullable; + +public interface StringPropNativeComponentViewManagerInterface { + void setPlaceholder(T view, @Nullable String value); + void setDefaultValue(T view, @Nullable String value); +} +", +} +`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeCpp-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeCpp-test.js.snap new file mode 100644 index 000000000000..abde8a19e92e --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeCpp-test.js.snap @@ -0,0 +1,401 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GenerateShadowNodeCpp can generate for 'ArrayPropsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char ArrayPropsNativeComponentViewComponentName[] = \\"ArrayPropsNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'BooleanPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char BooleanPropNativeComponentViewComponentName[] = \\"BooleanPropNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'ColorPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char ColorPropNativeComponentViewComponentName[] = \\"ColorPropNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'EdgeInsetsPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char EdgeInsetsPropNativeComponentViewComponentName[] = \\"EdgeInsetsPropNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'EnumPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char EnumPropNativeComponentViewComponentName[] = \\"EnumPropNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'EventNestedObjectPropsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char EventNestedObjectPropsNativeComponentViewComponentName[] = \\"EventNestedObjectPropsNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'EventPropsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char EventPropsNativeComponentViewComponentName[] = \\"EventPropsNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'FloatPropsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char FloatPropsNativeComponentViewComponentName[] = \\"FloatPropsNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'ImagePropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char ImagePropNativeComponentViewComponentName[] = \\"ImagePropNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'IntegerPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char IntegerPropNativeComponentViewComponentName[] = \\"IntegerPropNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'InterfaceOnlyNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'MultiNativePropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char MultiNativePropNativeComponentViewComponentName[] = \\"MultiNativePropNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'NoPropsNoEventsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char NoPropsNoEventsNativeComponentViewComponentName[] = \\"NoPropsNoEventsNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'ObjectPropsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char ObjectPropsNativeComponentComponentName[] = \\"ObjectPropsNativeComponent\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'PointPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char PointPropNativeComponentViewComponentName[] = \\"PointPropNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeCpp can generate for 'StringPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.cpp": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeCpp.js + */ + +#include + +namespace facebook { +namespace react { + +extern const char StringPropNativeComponentViewComponentName[] = \\"StringPropNativeComponentView\\"; + +} // namespace react +} // namespace facebook +", +} +`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeH-test.js.snap new file mode 100644 index 000000000000..3a31acb7f091 --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateShadowNodeH-test.js.snap @@ -0,0 +1,558 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GenerateShadowNodeH can generate for 'ArrayPropsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char ArrayPropsNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using ArrayPropsNativeComponentViewShadowNode = ConcreteViewShadowNode< + ArrayPropsNativeComponentViewComponentName, + ArrayPropsNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'BooleanPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char BooleanPropNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using BooleanPropNativeComponentViewShadowNode = ConcreteViewShadowNode< + BooleanPropNativeComponentViewComponentName, + BooleanPropNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'ColorPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char ColorPropNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using ColorPropNativeComponentViewShadowNode = ConcreteViewShadowNode< + ColorPropNativeComponentViewComponentName, + ColorPropNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'EdgeInsetsPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char EdgeInsetsPropNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using EdgeInsetsPropNativeComponentViewShadowNode = ConcreteViewShadowNode< + EdgeInsetsPropNativeComponentViewComponentName, + EdgeInsetsPropNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'EnumPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char EnumPropNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using EnumPropNativeComponentViewShadowNode = ConcreteViewShadowNode< + EnumPropNativeComponentViewComponentName, + EnumPropNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'EventNestedObjectPropsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook { +namespace react { + +extern const char EventNestedObjectPropsNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using EventNestedObjectPropsNativeComponentViewShadowNode = ConcreteViewShadowNode< + EventNestedObjectPropsNativeComponentViewComponentName, + EventNestedObjectPropsNativeComponentViewProps, +EventNestedObjectPropsNativeComponentViewEventEmitter>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'EventPropsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook { +namespace react { + +extern const char EventPropsNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using EventPropsNativeComponentViewShadowNode = ConcreteViewShadowNode< + EventPropsNativeComponentViewComponentName, + EventPropsNativeComponentViewProps, +EventPropsNativeComponentViewEventEmitter>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'FloatPropsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char FloatPropsNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using FloatPropsNativeComponentViewShadowNode = ConcreteViewShadowNode< + FloatPropsNativeComponentViewComponentName, + FloatPropsNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'ImagePropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char ImagePropNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using ImagePropNativeComponentViewShadowNode = ConcreteViewShadowNode< + ImagePropNativeComponentViewComponentName, + ImagePropNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'IntegerPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char IntegerPropNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using IntegerPropNativeComponentViewShadowNode = ConcreteViewShadowNode< + IntegerPropNativeComponentViewComponentName, + IntegerPropNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'InterfaceOnlyNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + + + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'MultiNativePropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char MultiNativePropNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using MultiNativePropNativeComponentViewShadowNode = ConcreteViewShadowNode< + MultiNativePropNativeComponentViewComponentName, + MultiNativePropNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'NoPropsNoEventsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char NoPropsNoEventsNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using NoPropsNoEventsNativeComponentViewShadowNode = ConcreteViewShadowNode< + NoPropsNoEventsNativeComponentViewComponentName, + NoPropsNoEventsNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'ObjectPropsNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char ObjectPropsNativeComponentComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using ObjectPropsNativeComponentShadowNode = ConcreteViewShadowNode< + ObjectPropsNativeComponentComponentName, + ObjectPropsNativeComponentProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'PointPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char PointPropNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using PointPropNativeComponentViewShadowNode = ConcreteViewShadowNode< + PointPropNativeComponentViewComponentName, + PointPropNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; + +exports[`GenerateShadowNodeH can generate for 'StringPropNativeComponent.js' 1`] = ` +Object { + "ShadowNodes.h": " +/** + * 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. + * + * @generated by codegen project: GenerateShadowNodeH.js + */ + +#pragma once + +#include +#include + +namespace facebook { +namespace react { + +extern const char StringPropNativeComponentViewComponentName[]; + +/* + * \`ShadowNode\` for component. + */ +using StringPropNativeComponentViewShadowNode = ConcreteViewShadowNode< + StringPropNativeComponentViewComponentName, + StringPropNativeComponentViewProps>; + +} // namespace react +} // namespace facebook +", +} +`; diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap new file mode 100644 index 000000000000..71132f212a3f --- /dev/null +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap @@ -0,0 +1,621 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GenerateViewConfigJs can generate for 'ArrayPropsNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'ArrayPropsNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'ArrayPropsNativeComponentView', + + validAttributes: { + names: true, + disableds: true, + progress: true, + radii: true, + + colors: { + process: require('react-native/Libraries/StyleSheet/processColorArray'), + }, + + srcs: true, + points: true, + sizes: true, + object: true, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'BooleanPropNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'BooleanPropNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'BooleanPropNativeComponentView', + + validAttributes: { + disabled: true, + disabledNullable: true, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'ColorPropNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'ColorPropNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'ColorPropNativeComponentView', + + validAttributes: { + tintColor: { + process: require('react-native/Libraries/StyleSheet/processColor'), + }, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'EdgeInsetsPropNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'EdgeInsetsPropNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'EdgeInsetsPropNativeComponentView', + validAttributes: {}, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'EnumPropNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'EnumPropNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'EnumPropNativeComponentView', + + validAttributes: { + alignment: true, + intervals: true, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'EventNestedObjectPropsNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'EventNestedObjectPropsNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'EventNestedObjectPropsNativeComponentView', + + bubblingEventTypes: { + topChange: { + phasedRegistrationNames: { + captured: 'onChangeCapture', + bubbled: 'onChange', + }, + }, + }, + + validAttributes: { + disabled: true, + onChange: true, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'EventPropsNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'EventPropsNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'EventPropsNativeComponentView', + + bubblingEventTypes: { + paperDirectName: { + phasedRegistrationNames: { + captured: 'onChangeCapture', + bubbled: 'onChange', + }, + }, + + topChange: { + phasedRegistrationNames: { + captured: 'onChangeCapture', + bubbled: 'onChange', + }, + }, + + topEnd: { + phasedRegistrationNames: { + captured: 'onEndCapture', + bubbled: 'onEnd', + }, + }, + + paperBubblingName: { + phasedRegistrationNames: { + captured: 'onEventBubblingWithPaperNameCapture', + bubbled: 'onEventBubblingWithPaperName', + }, + }, + + topEventBubblingWithPaperName: { + phasedRegistrationNames: { + captured: 'onEventBubblingWithPaperNameCapture', + bubbled: 'onEventBubblingWithPaperName', + }, + }, + }, + + directEventTypes: { + topEventDirect: { + registrationName: 'onEventDirect', + }, + + paperDirectName: { + registrationName: 'onEventDirectWithPaperName', + }, + + topEventDirectWithPaperName: { + registrationName: 'onEventDirectWithPaperName', + }, + + paperBubblingName: { + registrationName: 'onOrientationChange', + }, + + topOrientationChange: { + registrationName: 'onOrientationChange', + }, + }, + + validAttributes: { + disabled: true, + onChange: true, + onEventDirect: true, + onEventDirectWithPaperName: true, + onOrientationChange: true, + onEnd: true, + onEventBubblingWithPaperName: true, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'FloatPropsNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'FloatPropsNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'FloatPropsNativeComponentView', + + validAttributes: { + blurRadius: true, + blurRadius2: true, + blurRadius3: true, + blurRadius4: true, + blurRadius5: true, + blurRadius6: true, + blurRadiusNullable: true, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'ImagePropNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'ImagePropNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'ImagePropNativeComponentView', + + validAttributes: { + thumbImage: { + process: require('react-native/Libraries/Image/resolveAssetSource'), + }, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'IntegerPropNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'IntegerPropNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'IntegerPropNativeComponentView', + + validAttributes: { + progress1: true, + progress2: true, + progress3: true, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'InterfaceOnlyNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'RCTInterfaceOnlyComponent'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'RCTInterfaceOnlyComponent', + + bubblingEventTypes: { + topChange: { + phasedRegistrationNames: { + captured: 'onChangeCapture', + bubbled: 'onChange', + }, + }, + }, + + validAttributes: { + title: true, + onChange: true, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'MultiNativePropNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'MultiNativePropNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'MultiNativePropNativeComponentView', + + validAttributes: { + thumbImage: { + process: require('react-native/Libraries/Image/resolveAssetSource'), + }, + + color: { + process: require('react-native/Libraries/StyleSheet/processColor'), + }, + + thumbTintColor: { + process: require('react-native/Libraries/StyleSheet/processColor'), + }, + + point: { + diff: require('react-native/Libraries/Utilities/differ/pointsDiffer'), + }, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'NoPropsNoEventsNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'NoPropsNoEventsNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'NoPropsNoEventsNativeComponentView', + validAttributes: {}, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'ObjectPropsNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'ObjectPropsNativeComponent'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'ObjectPropsNativeComponent', + + validAttributes: { + objectProp: true, + objectArrayProp: true, + objectPrimitiveRequiredProp: true, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'PointPropNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'PointPropNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'PointPropNativeComponentView', + + validAttributes: { + startPoint: { + diff: require('react-native/Libraries/Utilities/differ/pointsDiffer'), + }, + }, +})); +", +} +`; + +exports[`GenerateViewConfigJs can generate for 'StringPropNativeComponent.js' 1`] = ` +Map { + "RNCodegenModuleFixturesNativeViewConfig.js" => " +/** + * 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. + * + * @flow + * + * @generated by codegen project: GenerateViewConfigJs.js + */ + +'use strict'; + +const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + +let nativeComponentName = 'StringPropNativeComponentView'; + +export default NativeComponentRegistry.get(nativeComponentName, () => ({ + uiViewClassName: 'StringPropNativeComponentView', + + validAttributes: { + placeholder: true, + defaultValue: true, + }, +})); +", +} +`; From 38381c8a2e022ab42b7b884a2b42efcb9fbb20e4 Mon Sep 17 00:00:00 2001 From: Lorenzo Sciandra Date: Tue, 2 Nov 2021 10:56:12 -0700 Subject: [PATCH 094/628] add release changelog back to core repo (#32520) Summary: As agreed, we are moving back the changelog from the RNC repo into the core one. This PR does just that. It will be followed up by a new draft PR for the 0.67 release ([old one](https://github.com/react-native-community/releases/pull/255)). Once this is merged, a few links will need to be fixed, such as: * https://github.com/facebook/react-native/wiki/Changelog * https://github.com/facebook/react-native/releases (for new releases) Moreover, we should have a conversation about how changes are reported for the "monorepo" part of this repo: https://github.com/facebook/react-native/tree/main/packages as far as I can see, the changes to those packages are not documented anywhere. ## Changelog [Internal] [Added] - Adding Changelog.md back into main repo Pull Request resolved: https://github.com/facebook/react-native/pull/32520 Test Plan: N/A Reviewed By: lunaleaps Differential Revision: D32102055 Pulled By: cortinico fbshipit-source-id: 6d1f353bb6acdc952e40941510ca36200690bbf8 --- CHANGELOG.md | 3869 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3869 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000000..2bb52a56bf57 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3869 @@ +# Changelog + +## 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.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.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.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://reactjs.org/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://reactjs.org/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 From e161598c404f2f585515e528c8980e9f269385ce Mon Sep 17 00:00:00 2001 From: Andrei Shikov Date: Tue, 2 Nov 2021 12:04:35 -0700 Subject: [PATCH 095/628] React Native sync for revisions afcb9cd...3fcd81d MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: This sync includes the following changes: - **[5cccacd13](https://github.com/facebook/react/commit/5cccacd13 )**: Upgrade useId to alpha channel ([#22674](https://github.com/facebook/react/pull/22674)) //// - **[75f3ddebf](https://github.com/facebook/react/commit/75f3ddebf )**: Remove experimental useOpaqueIdentifier API ([#22672](https://github.com/facebook/react/pull/22672)) //// - **[8c4a05b8f](https://github.com/facebook/react/commit/8c4a05b8f )**: Remove flow pragma comment from module registration start/stop templates ([#22670](https://github.com/facebook/react/pull/22670)) //// - **[ebf9ae857](https://github.com/facebook/react/commit/ebf9ae857 )**: useId ([#22644](https://github.com/facebook/react/pull/22644)) //// - **[a0d991fe6](https://github.com/facebook/react/commit/a0d991fe6 )**: Re-land #22292 (remove uMS from open source build) ([#22664](https://github.com/facebook/react/pull/22664)) //// - **[6bce0355c](https://github.com/facebook/react/commit/6bce0355c )**: Upgrade useSyncExternalStore to alpha channel ([#22662](https://github.com/facebook/react/pull/22662)) //// - **[7034408ff](https://github.com/facebook/react/commit/7034408ff )**: Follow-up improvements to error code extraction infra ([#22516](https://github.com/facebook/react/pull/22516)) //// - **[90e5d3638](https://github.com/facebook/react/commit/90e5d3638 )**: chore: fix comment typo ([#22615](https://github.com/facebook/react/pull/22615)) //// - **[3c4c1c470](https://github.com/facebook/react/commit/3c4c1c470 )**: Remove warning for dangling passive effects ([#22609](https://github.com/facebook/react/pull/22609)) //// - **[d5b6b4b86](https://github.com/facebook/react/commit/d5b6b4b86 )**: Expand act warning to cover all APIs that might schedule React work ([#22607](https://github.com/facebook/react/pull/22607)) //// - **[fa9bea0c4](https://github.com/facebook/react/commit/fa9bea0c4 )**: Initial implementation of cache cleanup ([#22510](https://github.com/facebook/react/pull/22510)) //// - **[0e8a5aff3](https://github.com/facebook/react/commit/0e8a5aff3 )**: Scheduling Profiler: Add marks for component effects (mount and unmount) ([#22578](https://github.com/facebook/react/pull/22578)) //// - **[4ba20579d](https://github.com/facebook/react/commit/4ba20579d )**: Scheduling Profiler: De-emphasize React internal frames ([#22588](https://github.com/facebook/react/pull/22588)) //// - **[cdb8a1d19](https://github.com/facebook/react/commit/cdb8a1d19 )**: [Fizz] Add option to inject bootstrapping script tags after the shell is injected ([#22594](https://github.com/facebook/react/pull/22594)) //// - **[34e4c9756](https://github.com/facebook/react/commit/34e4c9756 )**: Clear extra nodes if there's a hydration mismatch within a suspense boundary ([#22592](https://github.com/facebook/react/pull/22592)) //// - **[02f411578](https://github.com/facebook/react/commit/02f411578 )**: Upgrade useInsertionEffect to stable ([#22589](https://github.com/facebook/react/pull/22589)) //// - **[2af4a7933](https://github.com/facebook/react/commit/2af4a7933 )**: Hydrate using SuspenseComponent as the parent ([#22582](https://github.com/facebook/react/pull/22582)) //// - **[b1acff0cc](https://github.com/facebook/react/commit/b1acff0cc )**: Enable cache in test renderer ([#22580](https://github.com/facebook/react/pull/22580)) //// - **[996da67b2](https://github.com/facebook/react/commit/996da67b2 )**: Replace global `jest` heuristic with `IS_REACT_ACT_ENVIRONMENT` ([#22562](https://github.com/facebook/react/pull/22562)) //// - **[163e81c1f](https://github.com/facebook/react/commit/163e81c1f )**: Support disabling spurious act warnings with a global environment flag ([#22561](https://github.com/facebook/react/pull/22561)) //// - **[23b7dfeff](https://github.com/facebook/react/commit/23b7dfeff )**: Enable scheduling profiler for RN FB profiling builds ([#22566](https://github.com/facebook/react/pull/22566)) //// - **[61455a25b](https://github.com/facebook/react/commit/61455a25b )**: Enable experimental Cache API in www TestRenderer ([#22554](https://github.com/facebook/react/pull/22554)) //// - **[7142d110b](https://github.com/facebook/react/commit/7142d110b )**: Bugfix: Nested useOpaqueIdentifier references ([#22553](https://github.com/facebook/react/pull/22553)) //// - **[1e247ff89](https://github.com/facebook/react/commit/1e247ff89 )**: Enabled scheduling profiler marks for React Native FB target ([#22544](https://github.com/facebook/react/pull/22544)) //// - **[c16b005f2](https://github.com/facebook/react/commit/c16b005f2 )**: Update test and stack frame code to support newer V8 stack formats ([#22477](https://github.com/facebook/react/pull/22477)) //// - **[55d75005b](https://github.com/facebook/react/commit/55d75005b )**: duplicate value in variable ([#22390](https://github.com/facebook/react/pull/22390)) //// Changelog: [General][Changed] - React Native sync for revisions afcb9cd...3fcd81d jest_e2e[run_all_tests] Reviewed By: yungsters Differential Revision: D32065987 fbshipit-source-id: ef2d402835c981aab68ca40a894c66c1630864e9 --- Libraries/Renderer/REVISION | 2 +- .../implementations/ReactFabric-dev.fb.js | 1557 ++++++++++------ .../implementations/ReactFabric-prod.fb.js | 352 ++-- .../ReactFabric-profiling.fb.js | 902 ++++++---- .../ReactNativeRenderer-dev.fb.js | 1577 ++++++++++------- .../ReactNativeRenderer-prod.fb.js | 366 ++-- .../ReactNativeRenderer-profiling.fb.js | 902 ++++++---- 7 files changed, 3387 insertions(+), 2271 deletions(-) diff --git a/Libraries/Renderer/REVISION b/Libraries/Renderer/REVISION index 97d8977a5a38..4783a1805fce 100644 --- a/Libraries/Renderer/REVISION +++ b/Libraries/Renderer/REVISION @@ -1 +1 @@ -afcb9cdc9343ddc134b03dcf4d7fbc0810b6002b \ No newline at end of file +3fcd81dd1c3cd1413b72ae2919bc8312787f8f58 \ No newline at end of file diff --git a/Libraries/Renderer/implementations/ReactFabric-dev.fb.js b/Libraries/Renderer/implementations/ReactFabric-dev.fb.js index 6bc84b6f4956..af5fb754ee51 100644 --- a/Libraries/Renderer/implementations/ReactFabric-dev.fb.js +++ b/Libraries/Renderer/implementations/ReactFabric-dev.fb.js @@ -7,14 +7,33 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<<5ea41cf7a37f479802f5b09b15260681>> */ 'use strict'; if (__DEV__) { (function() { -"use strict"; + + /** + * 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. + */ + +/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + +// Don't require this file directly; it's embedded by Rollup during build. + +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); +} + "use strict"; var React = require("react"); require("react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore"); @@ -2599,7 +2618,6 @@ var REACT_SUSPENSE_LIST_TYPE = 0xead8; var REACT_MEMO_TYPE = 0xead3; var REACT_LAZY_TYPE = 0xead4; var REACT_SCOPE_TYPE = 0xead7; -var REACT_OPAQUE_ID_TYPE = 0xeae0; var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; var REACT_OFFSCREEN_TYPE = 0xeae2; var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; @@ -2620,7 +2638,6 @@ if (typeof Symbol === "function" && Symbol.for) { REACT_MEMO_TYPE = symbolFor("react.memo"); REACT_LAZY_TYPE = symbolFor("react.lazy"); REACT_SCOPE_TYPE = symbolFor("react.scope"); - REACT_OPAQUE_ID_TYPE = symbolFor("react.opaque.id"); REACT_DEBUG_TRACING_MODE_TYPE = symbolFor("react.debug_trace_mode"); REACT_OFFSCREEN_TYPE = symbolFor("react.offscreen"); REACT_LEGACY_HIDDEN_TYPE = symbolFor("react.legacy_hidden"); @@ -2853,7 +2870,7 @@ function getComponentNameFromFiber(fiber) { var enablePersistentOffscreenHostContainer = dynamicFlags.enablePersistentOffscreenHostContainer; // The rest of the flags are static for better dead code elimination. -var enableSchedulingProfiler = false; +var enableSchedulingProfiler = true; var enableProfilerTimer = true; var enableProfilerCommitHooks = true; var enableLazyElements = false; @@ -2928,6 +2945,9 @@ var ShouldCapture = var ForceUpdateForLegacySuspense = /* */ 131072; +var Forked = + /* */ + 1048576; // Static tags describe aspects of a fiber that are not specific to a render, // e.g. a fiber uses a passive effect (even if there are no updates on this particular render). // This enables us to defer more work in the unmount case, // since we can defer traversing the tree during layout to look for Passive effects, @@ -2935,22 +2955,22 @@ var ForceUpdateForLegacySuspense = var RefStatic = /* */ - 1048576; + 2097152; var LayoutStatic = /* */ - 2097152; + 4194304; var PassiveStatic = /* */ - 4194304; // These flags allow us to traverse to fibers that have effects on mount + 8388608; // These flags allow us to traverse to fibers that have effects on mount // without traversing the entire tree after every commit for // double invoking var MountLayoutDev = /* */ - 8388608; + 16777216; var MountPassiveDev = /* */ - 16777216; // Groups of flags that are used in the commit phase to skip over trees that + 33554432; // Groups of flags that are used in the commit phase to skip over trees that // don't contain effects, by checking subtreeFlags. var BeforeMutationMask = // TODO: Remove Update flag from before mutation phase by re-landing Visibility @@ -4175,6 +4195,24 @@ var ConcurrentUpdatesByDefaultMode = /* */ 32; +// TODO: This is pretty well supported by browsers. Maybe we can drop it. +var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros. +// Based on: +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +var log = Math.log; +var LN2 = Math.LN2; + +function clz32Fallback(x) { + var asUint = x >>> 0; + + if (asUint === 0) { + return 32; + } + + return (31 - ((log(asUint) / LN2) | 0)) | 0; +} + // If those values are changed that package should be rebuilt and redeployed. var TotalLanes = 31; @@ -4287,6 +4325,59 @@ var IdleLane = var OffscreenLane = /* */ 1073741824; // This function is used for the experimental scheduling profiler (react-devtools-scheduling-profiler) +// It should be kept in sync with the Lanes values above. + +function getLabelForLane(lane) { + { + if (lane & SyncLane) { + return "Sync"; + } + + if (lane & InputContinuousHydrationLane) { + return "InputContinuousHydration"; + } + + if (lane & InputContinuousLane) { + return "InputContinuous"; + } + + if (lane & DefaultHydrationLane) { + return "DefaultHydration"; + } + + if (lane & DefaultLane) { + return "Default"; + } + + if (lane & TransitionHydrationLane) { + return "TransitionHydration"; + } + + if (lane & TransitionLanes) { + return "Transition"; + } + + if (lane & RetryLanes) { + return "Retry"; + } + + if (lane & SelectiveHydrationLane) { + return "SelectiveHydration"; + } + + if (lane & IdleHydrationLane) { + return "IdleHydration"; + } + + if (lane & IdleLane) { + return "Idle"; + } + + if (lane & OffscreenLane) { + return "Offscreen"; + } + } +} var NoTimestamp = -1; var nextTransitionLane = TransitionLane1; var nextRetryLane = RetryLane1; @@ -4752,9 +4843,6 @@ function markRootSuspended(root, suspendedLanes) { function markRootPinged(root, pingedLanes, eventTime) { root.pingedLanes |= root.suspendedLanes & pingedLanes; } -function markRootMutableRead(root, updateLane) { - root.mutableReadLanes |= updateLane & root.pendingLanes; -} function markRootFinished(root, remainingLanes) { var noLongerPendingLanes = root.pendingLanes & ~remainingLanes; root.pendingLanes = remainingLanes; // Let's try everything again @@ -4764,7 +4852,6 @@ function markRootFinished(root, remainingLanes) { root.expiredLanes &= remainingLanes; root.mutableReadLanes &= remainingLanes; root.entangledLanes &= remainingLanes; - var entanglements = root.entanglements; var eventTimes = root.eventTimes; var expirationTimes = root.expirationTimes; // Clear the lanes that no longer have pending work @@ -4853,20 +4940,6 @@ function movePendingFibersToMemoized(root, lanes) { lanes &= ~lane; } } -var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros. Only used on lanes, so assume input is an integer. -// Based on: -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 - -var log = Math.log; -var LN2 = Math.LN2; - -function clz32Fallback(lanes) { - if (lanes === 0) { - return 32; - } - - return (31 - ((log(lanes) / LN2) | 0)) | 0; -} var DiscreteEventPriority = SyncLane; var ContinuousEventPriority = InputContinuousLane; @@ -5205,6 +5278,8 @@ function getCurrentEventPriority() { return DefaultEventPriority; } // The Fabric renderer is secondary to the existing React Native renderer. + +var warnsIfNotActing = false; var scheduleTimeout = setTimeout; var cancelTimeout = clearTimeout; var noTimeout = -1; // ------------------- @@ -5300,9 +5375,6 @@ function appendChildToContainerChildSet(childSet, child) { function finalizeContainerChildren(container, newChildren) { completeRoot(container, newChildren); } -function makeClientIdInDEV(warnOnAccessInDEV) { - throw new Error("Not yet implemented"); -} function preparePortalMount(portalInstance) { // noop } @@ -5938,12 +6010,350 @@ function flushSyncCallbacks() { return null; } -var ReactVersion = "18.0.0-afcb9cdc9-20211008"; +var ReactVersion = "18.0.0-3fcd81dd1-20211102"; + +var SCHEDULING_PROFILER_VERSION = 1; + +var getLabelForLane$1 = getLabelForLane; +var TotalLanes$1 = TotalLanes; +/** + * If performance exists and supports the subset of the User Timing API that we + * require. + */ + +var supportsUserTiming = + typeof performance !== "undefined" && + typeof performance.mark === "function" && + typeof performance.clearMarks === "function"; +var supportsUserTimingV3 = false; + +{ + if (supportsUserTiming) { + var CHECK_V3_MARK = "__v3"; + var markOptions = {}; // $FlowFixMe: Ignore Flow complaining about needing a value + + Object.defineProperty(markOptions, "startTime", { + get: function() { + supportsUserTimingV3 = true; + return 0; + }, + set: function() {} + }); + + try { + // $FlowFixMe: Flow expects the User Timing level 2 API. + performance.mark(CHECK_V3_MARK, markOptions); + } catch (error) { + // Ignore + } finally { + performance.clearMarks(CHECK_V3_MARK); + } + } +} + +var laneLabels = []; +function getLaneLabels() { + if (laneLabels.length === 0) { + var lane = 1; + + for (var index = 0; index < TotalLanes$1; index++) { + laneLabels.push(getLabelForLane$1(lane)); + lane *= 2; + } + } + + return laneLabels; +} + +function markLaneToLabelMetadata() { + getLaneLabels(); + markAndClear("--react-lane-labels-" + laneLabels.join(",")); +} + +function markAndClear(name) { + performance.mark(name); + performance.clearMarks(name); +} + +function markVersionMetadata() { + markAndClear("--react-version-" + ReactVersion); + markAndClear("--profiler-version-" + SCHEDULING_PROFILER_VERSION); +} + +function markInternalModuleRanges() { + /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.getInternalModuleRanges === "function" + ) { + var ranges = __REACT_DEVTOOLS_GLOBAL_HOOK__.getInternalModuleRanges(); + + for (var i = 0; i < ranges.length; i++) { + var _ranges$i = ranges[i], + startStackFrame = _ranges$i[0], + stopStackFrame = _ranges$i[1]; + markAndClear("--react-internal-module-start-" + startStackFrame); + markAndClear("--react-internal-module-stop-" + stopStackFrame); + } + } +} + +function markCommitStarted(lanes) { + { + if (supportsUserTimingV3) { + markAndClear("--commit-start-" + lanes); // Certain types of metadata should be logged infrequently. + // Normally we would log this during module init, + // but there's no guarantee a user is profiling at that time. + // Commits happen infrequently (less than renders or state updates) + // so we log this extra information along with a commit. + // It will likely be logged more than once but that's okay. + // + // TODO Once DevTools supports starting/stopping the profiler, + // we can log this data only once (when started) and remove the per-commit logging. + + markVersionMetadata(); + markLaneToLabelMetadata(); + markInternalModuleRanges(); + } + } +} +function markCommitStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--commit-stop"); + } + } +} +function markComponentRenderStarted(fiber) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--component-render-start-" + componentName); + } + } +} +function markComponentRenderStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--component-render-stop"); + } + } +} +function markComponentPassiveEffectMountStarted(fiber) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--component-passive-effect-mount-start-" + componentName); + } + } +} +function markComponentPassiveEffectMountStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--component-passive-effect-mount-stop"); + } + } +} +function markComponentPassiveEffectUnmountStarted(fiber) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--component-passive-effect-unmount-start-" + componentName); + } + } +} +function markComponentPassiveEffectUnmountStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--component-passive-effect-unmount-stop"); + } + } +} +function markComponentLayoutEffectMountStarted(fiber) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--component-layout-effect-mount-start-" + componentName); + } + } +} +function markComponentLayoutEffectMountStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--component-layout-effect-mount-stop"); + } + } +} +function markComponentLayoutEffectUnmountStarted(fiber) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--component-layout-effect-unmount-start-" + componentName); + } + } +} +function markComponentLayoutEffectUnmountStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--component-layout-effect-unmount-stop"); + } + } +} +function markComponentErrored(fiber, thrownValue, lanes) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; + var phase = fiber.alternate === null ? "mount" : "update"; + var message = ""; + + if ( + thrownValue !== null && + typeof thrownValue === "object" && + typeof thrownValue.message === "string" + ) { + message = thrownValue.message; + } else if (typeof thrownValue === "string") { + message = thrownValue; + } // TODO (scheduling profiler) Add component stack id + + markAndClear("--error-" + componentName + "-" + phase + "-" + message); + } + } +} +var PossiblyWeakMap$1 = typeof WeakMap === "function" ? WeakMap : Map; // $FlowFixMe: Flow cannot handle polymorphic WeakMaps + +var wakeableIDs = new PossiblyWeakMap$1(); +var wakeableID = 0; -function markComponentRenderStopped() {} -function markComponentErrored(fiber, thrownValue, lanes) {} +function getWakeableID(wakeable) { + if (!wakeableIDs.has(wakeable)) { + wakeableIDs.set(wakeable, wakeableID++); + } -function markComponentSuspended(fiber, wakeable, lanes) {} + return wakeableIDs.get(wakeable); +} + +function markComponentSuspended(fiber, wakeable, lanes) { + { + if (supportsUserTimingV3) { + var eventType = wakeableIDs.has(wakeable) ? "resuspend" : "suspend"; + var id = getWakeableID(wakeable); + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; + var phase = fiber.alternate === null ? "mount" : "update"; // Following the non-standard fn.displayName convention, + // frameworks like Relay may also annotate Promises with a displayName, + // describing what operation/data the thrown Promise is related to. + // When this is available we should pass it along to the Scheduling Profiler. + + var displayName = wakeable.displayName || ""; // TODO (scheduling profiler) Add component stack id + + markAndClear( + "--suspense-" + + eventType + + "-" + + id + + "-" + + componentName + + "-" + + phase + + "-" + + lanes + + "-" + + displayName + ); + wakeable.then( + function() { + return markAndClear( + "--suspense-resolved-" + id + "-" + componentName + ); + }, + function() { + return markAndClear( + "--suspense-rejected-" + id + "-" + componentName + ); + } + ); + } + } +} +function markLayoutEffectsStarted(lanes) { + { + if (supportsUserTimingV3) { + markAndClear("--layout-effects-start-" + lanes); + } + } +} +function markLayoutEffectsStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--layout-effects-stop"); + } + } +} +function markPassiveEffectsStarted(lanes) { + { + if (supportsUserTimingV3) { + markAndClear("--passive-effects-start-" + lanes); + } + } +} +function markPassiveEffectsStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--passive-effects-stop"); + } + } +} +function markRenderStarted(lanes) { + { + if (supportsUserTimingV3) { + markAndClear("--render-start-" + lanes); + } + } +} +function markRenderYielded() { + { + if (supportsUserTimingV3) { + markAndClear("--render-yield"); + } + } +} +function markRenderStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--render-stop"); + } + } +} +function markRenderScheduled(lane) { + { + if (supportsUserTimingV3) { + markAndClear("--schedule-render-" + lane); + } + } +} +function markForceUpdateScheduled(fiber, lane) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--schedule-forced-update-" + lane + "-" + componentName); + } + } +} +function markStateUpdateScheduled(fiber, lane) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--schedule-state-update-" + lane + "-" + componentName); + } + } +} var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; var NoTransition = 0; @@ -5979,9 +6389,11 @@ function shallowEqual(objA, objB) { } // Test for A's keys different from B. for (var i = 0; i < keysA.length; i++) { + var currentKey = keysA[i]; + if ( - !hasOwnProperty.call(objB, keysA[i]) || - !objectIs(objA[keysA[i]], objB[keysA[i]]) + !hasOwnProperty.call(objB, currentKey) || + !objectIs(objA[currentKey], objB[currentKey]) ) { return false; } @@ -6088,11 +6500,6 @@ function setIsRendering(rendering) { isRendering = rendering; } } -function getIsRendering() { - { - return isRendering; - } -} var ReactStrictModeWarnings = { recordUnsafeLifecycleWarnings: function(fiber, instance) {}, @@ -6452,7 +6859,6 @@ var ReactStrictModeWarnings = { * of the `value` object). */ // $FlowFixMe only called in DEV, so void return is not possible. - function typeName(value) { { // toStringTag is needed for namespaced types like Temporal.Instant @@ -6467,17 +6873,6 @@ function typeName(value) { function willCoercionThrow(value) { { - if ( - value !== null && - typeof value === "object" && - value.$$typeof === REACT_OPAQUE_ID_TYPE - ) { - // OpaqueID type is expected to throw, so React will handle it. Not sure if - // it's expected that string coercion will throw, but we'll assume it's OK. - // See https://github.com/facebook/react/issues/20127. - return; - } - try { testStringCoercion(value); return false; @@ -7554,6 +7949,10 @@ var classComponentUpdater = { if (root !== null) { entangleTransitions(root, fiber, lane); } + + { + markStateUpdateScheduled(fiber, lane); + } }, enqueueReplaceState: function(inst, payload, callback) { var fiber = get(inst); @@ -7577,6 +7976,10 @@ var classComponentUpdater = { if (root !== null) { entangleTransitions(root, fiber, lane); } + + { + markStateUpdateScheduled(fiber, lane); + } }, enqueueForceUpdate: function(inst, callback) { var fiber = get(inst); @@ -7599,6 +8002,10 @@ var classComponentUpdater = { if (root !== null) { entangleTransitions(root, fiber, lane); } + + { + markForceUpdateScheduled(fiber, lane); + } } }; @@ -8537,6 +8944,84 @@ function updateClassInstance( return shouldUpdate; } +// TODO: Use the unified fiber stack module instead of this local one? +// Intentionally not using it yet to derisk the initial implementation, because +// the way we push/pop these values is a bit unusual. If there's a mistake, I'd +// rather the ids be wrong than crash the whole reconciler. +var forkStack = []; +var forkStackIndex = 0; +var treeForkProvider = null; +var treeForkCount = 0; +var idStack = []; +var idStackIndex = 0; +var treeContextProvider = null; +var treeContextId = 1; +var treeContextOverflow = ""; + +function popTreeContext(workInProgress) { + // Restore the previous values. + // This is a bit more complicated than other context-like modules in Fiber + // because the same Fiber may appear on the stack multiple times and for + // different reasons. We have to keep popping until the work-in-progress is + // no longer at the top of the stack. + while (workInProgress === treeForkProvider) { + treeForkProvider = forkStack[--forkStackIndex]; + forkStack[forkStackIndex] = null; + treeForkCount = forkStack[--forkStackIndex]; + forkStack[forkStackIndex] = null; + } + + while (workInProgress === treeContextProvider) { + treeContextProvider = idStack[--idStackIndex]; + idStack[idStackIndex] = null; + treeContextOverflow = idStack[--idStackIndex]; + idStack[idStackIndex] = null; + treeContextId = idStack[--idStackIndex]; + idStack[idStackIndex] = null; + } +} + +var isHydrating = false; + +function enterHydrationState(fiber) { + { + return false; + } +} + +function prepareToHydrateHostInstance( + fiber, + rootContainerInstance, + hostContext +) { + { + throw new Error( + "Expected prepareToHydrateHostInstance() to never be called. " + + "This error is likely caused by a bug in React. Please file an issue." + ); + } +} + +function prepareToHydrateHostTextInstance(fiber) { + { + throw new Error( + "Expected prepareToHydrateHostTextInstance() to never be called. " + + "This error is likely caused by a bug in React. Please file an issue." + ); + } + var shouldUpdate = hydrateTextInstance(); +} + +function popHydrationState(fiber) { + { + return false; + } +} + +function getIsHydrating() { + return isHydrating; +} + var didWarnAboutMaps; var didWarnAboutGenerators; var didWarnAboutStringRefs; @@ -8820,7 +9305,9 @@ function ChildReconciler(shouldTrackSideEffects) { newFiber.index = newIndex; if (!shouldTrackSideEffects) { - // Noop. + // During hydration, the useId algorithm needs to know which fibers are + // part of a list of children (arrays, iterators). + newFiber.flags |= Forked; return lastPlacedIndex; } @@ -9260,6 +9747,7 @@ function ChildReconciler(shouldTrackSideEffects) { if (newIdx === newChildren.length) { // We've reached the end of the new children. We can delete the rest. deleteRemainingChildren(returnFiber, oldFiber); + return resultingFirstChild; } @@ -9466,6 +9954,7 @@ function ChildReconciler(shouldTrackSideEffects) { if (step.done) { // We've reached the end of the new children. We can delete the rest. deleteRemainingChildren(returnFiber, oldFiber); + return resultingFirstChild; } @@ -10024,61 +10513,10 @@ var Passive$1 = /* */ 8; -var isHydrating = false; - -function enterHydrationState(fiber) { - { - return false; - } -} - -function prepareToHydrateHostInstance( - fiber, - rootContainerInstance, - hostContext -) { - { - throw new Error( - "Expected prepareToHydrateHostInstance() to never be called. " + - "This error is likely caused by a bug in React. Please file an issue." - ); - } -} - -function prepareToHydrateHostTextInstance(fiber) { - { - throw new Error( - "Expected prepareToHydrateHostTextInstance() to never be called. " + - "This error is likely caused by a bug in React. Please file an issue." - ); - } - var shouldUpdate = hydrateTextInstance(); -} - -function popHydrationState(fiber) { - { - return false; - } -} - -function getIsHydrating() { - return isHydrating; -} - // and should be reset before starting a new render. // This tracks which mutable sources need to be reset after a render. var workInProgressSources = []; -var rendererSigil$1; - -{ - // Used to detect multiple renderers using the same mutable source. - rendererSigil$1 = {}; -} - -function markSourceAsDirty(mutableSource) { - workInProgressSources.push(mutableSource); -} function resetWorkInProgressVersions() { for (var i = 0; i < workInProgressSources.length; i++) { var mutableSource = workInProgressSources[i]; @@ -10090,32 +10528,6 @@ function resetWorkInProgressVersions() { workInProgressSources.length = 0; } -function getWorkInProgressVersion(mutableSource) { - { - return mutableSource._workInProgressVersionSecondary; - } -} -function setWorkInProgressVersion(mutableSource, version) { - { - mutableSource._workInProgressVersionSecondary = version; - } - - workInProgressSources.push(mutableSource); -} -function warnAboutMultipleRenderersDEV(mutableSource) { - { - { - if (mutableSource._currentSecondaryRenderer == null) { - mutableSource._currentSecondaryRenderer = rendererSigil$1; - } else if (mutableSource._currentSecondaryRenderer !== rendererSigil$1) { - error( - "Detected multiple renderers concurrently rendering the " + - "same mutable source. This is currently unsupported." - ); - } - } - } -} // Eager reads the version of a mutable source and stores it on the root. function getSuspendedCachePool() { { @@ -10126,11 +10538,9 @@ function getSuspendedCachePool() { var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher, ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig; var didWarnAboutMismatchedHooksForComponent; -var didWarnAboutUseOpaqueIdentifier; var didWarnUncachedGetSnapshot; { - didWarnAboutUseOpaqueIdentifier = {}; didWarnAboutMismatchedHooksForComponent = new Set(); } @@ -10154,7 +10564,11 @@ var didScheduleRenderPhaseUpdate = false; // Where an update was scheduled only // TODO: Maybe there's some way to consolidate this with // `didScheduleRenderPhaseUpdate`. Or with `numberOfReRenders`. -var didScheduleRenderPhaseUpdateDuringThisPass = false; +var didScheduleRenderPhaseUpdateDuringThisPass = false; // Counts the number of useId hooks in this component. +// hydration). This counter is global, so client ids are not stable across +// render attempts. + +var globalClientIdCounter = 0; var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders. @@ -10335,6 +10749,7 @@ function renderWithHooks( // currentHook = null; // workInProgressHook = null; // didScheduleRenderPhaseUpdate = false; + // localIdCounter = 0; // TODO Warn if no hooks are used at all during mount, then some are used during update. // Currently we will identify the update render as a mount because memoizedState === null. // This is tricky because it's valid for certain types of components (e.g. React.lazy) @@ -10819,266 +11234,28 @@ function rerenderReducer(reducer, initialArg, init) { hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to // the base state unless the queue is empty. // TODO: Not sure if this is the desired semantics, but it's what we - // do for gDSFP. I can't remember why. - - if (hook.baseQueue === null) { - hook.baseState = newState; - } - - queue.lastRenderedState = newState; - } - - return [newState, dispatch]; -} - -function readFromUnsubscribedMutableSource(root, source, getSnapshot) { - { - warnAboutMultipleRenderersDEV(source); - } - - var getVersion = source._getVersion; - var version = getVersion(source._source); // Is it safe for this component to read from this source during the current render? - - var isSafeToReadFromSource = false; // Check the version first. - // If this render has already been started with a specific version, - // we can use it alone to determine if we can safely read from the source. - - var currentRenderVersion = getWorkInProgressVersion(source); - - if (currentRenderVersion !== null) { - // It's safe to read if the store hasn't been mutated since the last time - // we read something. - isSafeToReadFromSource = currentRenderVersion === version; - } else { - // If there's no version, then this is the first time we've read from the - // source during the current render pass, so we need to do a bit more work. - // What we need to determine is if there are any hooks that already - // subscribed to the source, and if so, whether there are any pending - // mutations that haven't been synchronized yet. - // - // If there are no pending mutations, then `root.mutableReadLanes` will be - // empty, and we know we can safely read. - // - // If there *are* pending mutations, we may still be able to safely read - // if the currently rendering lanes are inclusive of the pending mutation - // lanes, since that guarantees that the value we're about to read from - // the source is consistent with the values that we read during the most - // recent mutation. - isSafeToReadFromSource = isSubsetOfLanes( - renderLanes, - root.mutableReadLanes - ); - - if (isSafeToReadFromSource) { - // If it's safe to read from this source during the current render, - // store the version in case other components read from it. - // A changed version number will let those components know to throw and restart the render. - setWorkInProgressVersion(source, version); - } - } - - if (isSafeToReadFromSource) { - var snapshot = getSnapshot(source._source); - - { - if (typeof snapshot === "function") { - error( - "Mutable source should not return a function as the snapshot value. " + - "Functions may close over mutable values and cause tearing." - ); - } - } - - return snapshot; - } else { - // This handles the special case of a mutable source being shared between renderers. - // In that case, if the source is mutated between the first and second renderer, - // The second renderer don't know that it needs to reset the WIP version during unwind, - // (because the hook only marks sources as dirty if it's written to their WIP version). - // That would cause this tear check to throw again and eventually be visible to the user. - // We can avoid this infinite loop by explicitly marking the source as dirty. - // - // This can lead to tearing in the first renderer when it resumes, - // but there's nothing we can do about that (short of throwing here and refusing to continue the render). - markSourceAsDirty(source); // Intentioally throw an error to force React to retry synchronously. During - // the synchronous retry, it will block interleaved mutations, so we should - // get a consistent read. Therefore, the following error should never be - // visible to the user. - // We expect this error not to be thrown during the synchronous retry, - // because we blocked interleaved mutations. - - throw new Error( - "Cannot read from mutable source during the current render without tearing. This may be a bug in React. Please file an issue." - ); - } -} - -function useMutableSource(hook, source, getSnapshot, subscribe) { - var root = getWorkInProgressRoot(); - - if (root === null) { - throw new Error( - "Expected a work-in-progress root. This is a bug in React. Please file an issue." - ); - } - - var getVersion = source._getVersion; - var version = getVersion(source._source); - var dispatcher = ReactCurrentDispatcher$1.current; // eslint-disable-next-line prefer-const - - var _dispatcher$useState = dispatcher.useState(function() { - return readFromUnsubscribedMutableSource(root, source, getSnapshot); - }), - currentSnapshot = _dispatcher$useState[0], - setSnapshot = _dispatcher$useState[1]; - - var snapshot = currentSnapshot; // Grab a handle to the state hook as well. - // We use it to clear the pending update queue if we have a new source. - - var stateHook = workInProgressHook; - var memoizedState = hook.memoizedState; - var refs = memoizedState.refs; - var prevGetSnapshot = refs.getSnapshot; - var prevSource = memoizedState.source; - var prevSubscribe = memoizedState.subscribe; - var fiber = currentlyRenderingFiber$1; - hook.memoizedState = { - refs: refs, - source: source, - subscribe: subscribe - }; // Sync the values needed by our subscription handler after each commit. - - dispatcher.useEffect( - function() { - refs.getSnapshot = getSnapshot; // Normally the dispatch function for a state hook never changes, - // but this hook recreates the queue in certain cases to avoid updates from stale sources. - // handleChange() below needs to reference the dispatch function without re-subscribing, - // so we use a ref to ensure that it always has the latest version. - - refs.setSnapshot = setSnapshot; // Check for a possible change between when we last rendered now. - - var maybeNewVersion = getVersion(source._source); - - if (!objectIs(version, maybeNewVersion)) { - var maybeNewSnapshot = getSnapshot(source._source); - - { - if (typeof maybeNewSnapshot === "function") { - error( - "Mutable source should not return a function as the snapshot value. " + - "Functions may close over mutable values and cause tearing." - ); - } - } - - if (!objectIs(snapshot, maybeNewSnapshot)) { - setSnapshot(maybeNewSnapshot); - var lane = requestUpdateLane(fiber); - markRootMutableRead(root, lane); - } // If the source mutated between render and now, - // there may be state updates already scheduled from the old source. - // Entangle the updates so that they render in the same batch. - - markRootEntangled(root, root.mutableReadLanes); - } - }, - [getSnapshot, source, subscribe] - ); // If we got a new source or subscribe function, re-subscribe in a passive effect. - - dispatcher.useEffect( - function() { - var handleChange = function() { - var latestGetSnapshot = refs.getSnapshot; - var latestSetSnapshot = refs.setSnapshot; - - try { - latestSetSnapshot(latestGetSnapshot(source._source)); // Record a pending mutable source update with the same expiration time. - - var lane = requestUpdateLane(fiber); - markRootMutableRead(root, lane); - } catch (error) { - // A selector might throw after a source mutation. - // e.g. it might try to read from a part of the store that no longer exists. - // In this case we should still schedule an update with React. - // Worst case the selector will throw again and then an error boundary will handle it. - latestSetSnapshot(function() { - throw error; - }); - } - }; - - var unsubscribe = subscribe(source._source, handleChange); - - { - if (typeof unsubscribe !== "function") { - error( - "Mutable source subscribe function must return an unsubscribe function." - ); - } - } + // do for gDSFP. I can't remember why. - return unsubscribe; - }, - [source, subscribe] - ); // If any of the inputs to useMutableSource change, reading is potentially unsafe. - // - // If either the source or the subscription have changed we can't can't trust the update queue. - // Maybe the source changed in a way that the old subscription ignored but the new one depends on. - // - // If the getSnapshot function changed, we also shouldn't rely on the update queue. - // It's possible that the underlying source was mutated between the when the last "change" event fired, - // and when the current render (with the new getSnapshot function) is processed. - // - // In both cases, we need to throw away pending updates (since they are no longer relevant) - // and treat reading from the source as we do in the mount case. + if (hook.baseQueue === null) { + hook.baseState = newState; + } - if ( - !objectIs(prevGetSnapshot, getSnapshot) || - !objectIs(prevSource, source) || - !objectIs(prevSubscribe, subscribe) - ) { - // Create a new queue and setState method, - // So if there are interleaved updates, they get pushed to the older queue. - // When this becomes current, the previous queue and dispatch method will be discarded, - // including any interleaving updates that occur. - var newQueue = { - pending: null, - interleaved: null, - lanes: NoLanes, - dispatch: null, - lastRenderedReducer: basicStateReducer, - lastRenderedState: snapshot - }; - newQueue.dispatch = setSnapshot = dispatchSetState.bind( - null, - currentlyRenderingFiber$1, - newQueue - ); - stateHook.queue = newQueue; - stateHook.baseQueue = null; - snapshot = readFromUnsubscribedMutableSource(root, source, getSnapshot); - stateHook.memoizedState = stateHook.baseState = snapshot; + queue.lastRenderedState = newState; } - return snapshot; + return [newState, dispatch]; } function mountMutableSource(source, getSnapshot, subscribe) { - var hook = mountWorkInProgressHook(); - hook.memoizedState = { - refs: { - getSnapshot: getSnapshot, - setSnapshot: null - }, - source: source, - subscribe: subscribe - }; - return useMutableSource(hook, source, getSnapshot, subscribe); + { + return undefined; + } } function updateMutableSource(source, getSnapshot, subscribe) { - var hook = updateWorkInProgressHook(); - return useMutableSource(hook, source, getSnapshot, subscribe); + { + return undefined; + } } function mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { @@ -11723,44 +11900,23 @@ function getIsUpdatingOpaqueValueInRenderPhaseInDEV() { } } -function warnOnOpaqueIdentifierAccessInDEV(fiber) { - { - // TODO: Should warn in effects and callbacks, too - var name = getComponentNameFromFiber(fiber) || "Unknown"; - - if (getIsRendering() && !didWarnAboutUseOpaqueIdentifier[name]) { - error( - "The object passed back from useOpaqueIdentifier is meant to be " + - "passed through to attributes only. Do not read the " + - "value directly." - ); - - didWarnAboutUseOpaqueIdentifier[name] = true; - } - } -} - -function mountOpaqueIdentifier() { - var makeId = makeClientIdInDEV.bind( - null, - warnOnOpaqueIdentifierAccessInDEV.bind(null, currentlyRenderingFiber$1) - ); +function mountId() { + var hook = mountWorkInProgressHook(); + var id; { - var _id = makeId(); - - mountState(_id); - return _id; + // Use a lowercase r prefix for client-generated ids. + var globalClientId = globalClientIdCounter++; + id = "r:" + globalClientId.toString(32); } -} -function updateOpaqueIdentifier() { - var id = updateState()[0]; + hook.memoizedState = id; return id; } -function rerenderOpaqueIdentifier() { - var id = rerenderState()[0]; +function updateId() { + var hook = updateWorkInProgressHook(); + var id = hook.memoizedState; return id; } @@ -11788,7 +11944,6 @@ function dispatchReducerAction(fiber, queue, action) { enqueueRenderPhaseUpdate(queue, update); } else { enqueueUpdate$1(fiber, queue, update); - var eventTime = requestEventTime(); var root = scheduleUpdateOnFiber(fiber, lane, eventTime); @@ -11796,6 +11951,8 @@ function dispatchReducerAction(fiber, queue, action) { entangleTransitionUpdate(root, queue, lane); } } + + markUpdateInDevTools(fiber, lane); } function dispatchSetState(fiber, queue, action) { @@ -11875,6 +12032,8 @@ function dispatchSetState(fiber, queue, action) { entangleTransitionUpdate(root, queue, lane); } } + + markUpdateInDevTools(fiber, lane); } function isRenderPhaseUpdate(fiber) { @@ -11953,6 +12112,12 @@ function entangleTransitionUpdate(root, queue, lane) { } } +function markUpdateInDevTools(fiber, lane, action) { + { + markStateUpdateScheduled(fiber, lane); + } +} + var ContextOnlyDispatcher = { readContext: readContext, useCallback: throwInvalidHookError, @@ -11970,7 +12135,7 @@ var ContextOnlyDispatcher = { useTransition: throwInvalidHookError, useMutableSource: throwInvalidHookError, useSyncExternalStore: throwInvalidHookError, - useOpaqueIdentifier: throwInvalidHookError, + useId: throwInvalidHookError, unstable_isNewReconciler: enableNewReconciler }; @@ -12100,17 +12265,17 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; useMutableSource: function(source, getSnapshot, subscribe) { currentHookNameInDev = "useMutableSource"; mountHookTypesDev(); - return mountMutableSource(source, getSnapshot, subscribe); + return mountMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; mountHookTypesDev(); return mountSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; mountHookTypesDev(); - return mountOpaqueIdentifier(); + return mountId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -12208,17 +12373,17 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; useMutableSource: function(source, getSnapshot, subscribe) { currentHookNameInDev = "useMutableSource"; updateHookTypesDev(); - return mountMutableSource(source, getSnapshot, subscribe); + return mountMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; updateHookTypesDev(); return mountSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; updateHookTypesDev(); - return mountOpaqueIdentifier(); + return mountId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -12316,17 +12481,17 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; useMutableSource: function(source, getSnapshot, subscribe) { currentHookNameInDev = "useMutableSource"; updateHookTypesDev(); - return updateMutableSource(source, getSnapshot, subscribe); + return updateMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; updateHookTypesDev(); return updateSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; updateHookTypesDev(); - return updateOpaqueIdentifier(); + return updateId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -12424,17 +12589,17 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; useMutableSource: function(source, getSnapshot, subscribe) { currentHookNameInDev = "useMutableSource"; updateHookTypesDev(); - return updateMutableSource(source, getSnapshot, subscribe); + return updateMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; updateHookTypesDev(); return updateSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; updateHookTypesDev(); - return rerenderOpaqueIdentifier(); + return updateId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -12547,7 +12712,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; currentHookNameInDev = "useMutableSource"; warnInvalidHookAccess(); mountHookTypesDev(); - return mountMutableSource(source, getSnapshot, subscribe); + return mountMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; @@ -12555,11 +12720,11 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; mountHookTypesDev(); return mountSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; warnInvalidHookAccess(); mountHookTypesDev(); - return mountOpaqueIdentifier(); + return mountId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -12672,7 +12837,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; currentHookNameInDev = "useMutableSource"; warnInvalidHookAccess(); updateHookTypesDev(); - return updateMutableSource(source, getSnapshot, subscribe); + return updateMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; @@ -12680,11 +12845,11 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; updateHookTypesDev(); return updateSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; warnInvalidHookAccess(); updateHookTypesDev(); - return updateOpaqueIdentifier(); + return updateId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -12797,7 +12962,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; currentHookNameInDev = "useMutableSource"; warnInvalidHookAccess(); updateHookTypesDev(); - return updateMutableSource(source, getSnapshot, subscribe); + return updateMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; @@ -12805,11 +12970,11 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; updateHookTypesDev(); return updateSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; warnInvalidHookAccess(); updateHookTypesDev(); - return rerenderOpaqueIdentifier(); + return updateId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -13093,7 +13258,7 @@ function logCapturedError(boundary, errorInfo) { } } -var PossiblyWeakMap$1 = typeof WeakMap === "function" ? WeakMap : Map; +var PossiblyWeakMap$2 = typeof WeakMap === "function" ? WeakMap : Map; function createRootErrorUpdate(fiber, errorInfo, lane) { var update = createUpdate(NoTimestamp, lane); // Unmount the root by rendering null. @@ -13198,7 +13363,7 @@ function attachWakeableListeners(suspenseBoundary, root, wakeable, lanes) { var threadIDs; if (pingCache === null) { - pingCache = root.pingCache = new PossiblyWeakMap$1(); + pingCache = root.pingCache = new PossiblyWeakMap$2(); threadIDs = new Set(); pingCache.set(wakeable, threadIDs); } else { @@ -14045,7 +14210,12 @@ function completeSuspendedOffscreenHostContainer(current, workInProgress) { } function completeWork(current, workInProgress, renderLanes) { - var newProps = workInProgress.pendingProps; + var newProps = workInProgress.pendingProps; // Note: This intentionally doesn't check if we're hydrating because comparing + // to the current tree provider fiber is just as fast and less error-prone. + // Ideally we would have a special version of the work loop only + // for hydration. + + popTreeContext(workInProgress); switch (workInProgress.tag) { case IndeterminateComponent: @@ -14238,7 +14408,7 @@ function completeWork(current, workInProgress, renderLanes) { else { var prevState = current.memoizedState; prevDidTimeout = prevState !== null; - } // If the suspended state of the boundary changes, we need to schedule + } // an effect to toggle the subtree's visibility. When we switch from // fallback -> primary, the inner Offscreen fiber schedules this effect // as part of its normal complete phase. But when we switch from @@ -14251,8 +14421,8 @@ function completeWork(current, workInProgress, renderLanes) { // is active that we have to do anything special. if (nextDidTimeout && !prevDidTimeout) { - var offscreenFiber = workInProgress.child; - offscreenFiber.flags |= Visibility; // TODO: This will still suspend a synchronous tree if anything + var _offscreenFiber = workInProgress.child; + _offscreenFiber.flags |= Visibility; // TODO: This will still suspend a synchronous tree if anything // in the concurrent tree already suspended during this render. // This is a known bug. @@ -14713,6 +14883,10 @@ function updateForwardRef( var nextChildren; prepareToReadContext(workInProgress, renderLanes); + { + markComponentRenderStarted(workInProgress); + } + { ReactCurrentOwner$1.current = workInProgress; setIsRendering(true); @@ -14745,6 +14919,10 @@ function updateForwardRef( setIsRendering(false); } + { + markComponentRenderStopped(); + } + if (current !== null && !didReceiveUpdate) { bailoutHooks(current, workInProgress, renderLanes); return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); @@ -15183,6 +15361,10 @@ function updateFunctionComponent( var nextChildren; prepareToReadContext(workInProgress, renderLanes); + { + markComponentRenderStarted(workInProgress); + } + { ReactCurrentOwner$1.current = workInProgress; setIsRendering(true); @@ -15215,6 +15397,10 @@ function updateFunctionComponent( setIsRendering(false); } + { + markComponentRenderStopped(); + } + if (current !== null && !didReceiveUpdate) { bailoutHooks(current, workInProgress, renderLanes); return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); @@ -15402,6 +15588,10 @@ function finishClassComponent( stopProfilerTimerIfRunning(); } } else { + { + markComponentRenderStarted(workInProgress); + } + { setIsRendering(true); nextChildren = instance.render(); @@ -15418,6 +15608,10 @@ function finishClassComponent( setIsRendering(false); } + + { + markComponentRenderStopped(); + } } // React DevTools reads this flag. workInProgress.flags |= PerformedWork; @@ -15748,6 +15942,10 @@ function mountIndeterminateComponent( prepareToReadContext(workInProgress, renderLanes); var value; + { + markComponentRenderStarted(workInProgress); + } + { if ( Component.prototype && @@ -15784,6 +15982,10 @@ function mountIndeterminateComponent( setIsRendering(false); } + { + markComponentRenderStopped(); + } // React DevTools reads this flag. + workInProgress.flags |= PerformedWork; { @@ -15974,6 +16176,7 @@ function validateFunctionComponentInDev(workInProgress, Component) { var SUSPENDED_MARKER = { dehydrated: null, + treeContext: null, retryLane: NoLane }; @@ -17006,6 +17209,10 @@ function updateContextConsumer(current, workInProgress, renderLanes) { prepareToReadContext(workInProgress, renderLanes); var newValue = readContext(context); + { + markComponentRenderStarted(workInProgress); + } + var newChildren; { @@ -17015,6 +17222,10 @@ function updateContextConsumer(current, workInProgress, renderLanes) { setIsRendering(false); } + { + markComponentRenderStopped(); + } // React DevTools reads this flag. + workInProgress.flags |= PerformedWork; reconcileChildren(current, workInProgress, newChildren, renderLanes); return workInProgress.child; @@ -17562,6 +17773,12 @@ function beginWork(current, workInProgress, renderLanes) { } function unwindWork(workInProgress, renderLanes) { + // Note: This intentionally doesn't check if we're hydrating because comparing + // to the current tree provider fiber is just as fast and less error-prone. + // Ideally we would have a special version of the work loop only + // for hydration. + popTreeContext(workInProgress); + switch (workInProgress.tag) { case ClassComponent: { var Component = workInProgress.type; @@ -17657,6 +17874,12 @@ function unwindWork(workInProgress, renderLanes) { } function unwindInterruptedWork(interruptedWork, renderLanes) { + // Note: This intentionally doesn't check if we're hydrating because comparing + // to the current tree provider fiber is just as fast and less error-prone. + // Ideally we would have a special version of the work loop only + // for hydration. + popTreeContext(interruptedWork); + switch (interruptedWork.tag) { case ClassComponent: { var childContextTypes = interruptedWork.type.childContextTypes; @@ -17976,7 +18199,23 @@ function commitHookEffectListUnmount( effect.destroy = undefined; if (destroy !== undefined) { + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectUnmountStarted(finishedWork); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectUnmountStarted(finishedWork); + } + } + safelyCallDestroy(finishedWork, nearestMountedAncestor, destroy); + + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectUnmountStopped(); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectUnmountStopped(); + } + } } } @@ -17985,7 +18224,7 @@ function commitHookEffectListUnmount( } } -function commitHookEffectListMount(tag, finishedWork) { +function commitHookEffectListMount(flags, finishedWork) { var updateQueue = finishedWork.updateQueue; var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; @@ -17994,11 +18233,26 @@ function commitHookEffectListMount(tag, finishedWork) { var effect = firstEffect; do { - if ((effect.tag & tag) === tag) { - // Mount + if ((effect.tag & flags) === flags) { + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectMountStarted(finishedWork); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectMountStarted(finishedWork); + } + } // Mount + var create = effect.create; effect.destroy = create(); + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectMountStopped(); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectMountStopped(); + } + } + { var destroy = effect.destroy; @@ -18524,10 +18778,13 @@ function commitUnmount(finishedRoot, current, nearestMountedAncestor) { tag = _effect.tag; if (destroy !== undefined) { - if ( - (tag & Insertion) !== NoFlags$1 || - (tag & Layout) !== NoFlags$1 - ) { + if ((tag & Insertion) !== NoFlags$1) { + safelyCallDestroy(current, nearestMountedAncestor, destroy); + } else if ((tag & Layout) !== NoFlags$1) { + { + markComponentLayoutEffectUnmountStarted(current); + } + if (current.mode & ProfileMode) { startLayoutEffectTimer(); safelyCallDestroy(current, nearestMountedAncestor, destroy); @@ -18535,6 +18792,10 @@ function commitUnmount(finishedRoot, current, nearestMountedAncestor) { } else { safelyCallDestroy(current, nearestMountedAncestor, destroy); } + + { + markComponentLayoutEffectUnmountStopped(); + } } } @@ -19487,11 +19748,44 @@ if (typeof Symbol === "function" && Symbol.for) { TEXT_TYPE = symbolFor$1("selector.text"); } +var ReactCurrentActQueue = ReactSharedInternals.ReactCurrentActQueue; +function isLegacyActEnvironment(fiber) { + { + // Legacy mode. We preserve the behavior of React 17's act. It assumes an + // act environment whenever `jest` is defined, but you can still turn off + // spurious warnings by setting IS_REACT_ACT_ENVIRONMENT explicitly + // to false. + var isReactActEnvironmentGlobal = // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global + typeof IS_REACT_ACT_ENVIRONMENT !== "undefined" + ? IS_REACT_ACT_ENVIRONMENT + : undefined; // $FlowExpectedError - Flow doesn't know about jest + return warnsIfNotActing; + } +} +function isConcurrentActEnvironment() { + { + var isReactActEnvironmentGlobal = // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global + typeof IS_REACT_ACT_ENVIRONMENT !== "undefined" + ? IS_REACT_ACT_ENVIRONMENT + : undefined; + + if (!isReactActEnvironmentGlobal && ReactCurrentActQueue.current !== null) { + // TODO: Include link to relevant documentation page. + error( + "The current testing environment is not configured to support " + + "act(...)" + ); + } + + return isReactActEnvironmentGlobal; + } +} + var ceil = Math.ceil; var ReactCurrentDispatcher$2 = ReactSharedInternals.ReactCurrentDispatcher, ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner, ReactCurrentBatchConfig$2 = ReactSharedInternals.ReactCurrentBatchConfig, - ReactCurrentActQueue = ReactSharedInternals.ReactCurrentActQueue; + ReactCurrentActQueue$1 = ReactSharedInternals.ReactCurrentActQueue; var NoContext = /* */ 0; @@ -19544,7 +19838,9 @@ var workInProgressRootIncludedLanes = NoLanes; // The work left over by componen var workInProgressRootSkippedLanes = NoLanes; // Lanes that were updated (in an interleaved event) during this render. -var workInProgressRootUpdatedLanes = NoLanes; // Lanes that were pinged (in an interleaved event) during this render. +var workInProgressRootInterleavedUpdatedLanes = NoLanes; // Lanes that were updated during the render phase (*not* an interleaved event). + +var workInProgressRootRenderPhaseUpdatedLanes = NoLanes; // Lanes that were pinged (in an interleaved event) during this render. var workInProgressRootPingedLanes = NoLanes; // The most recent time we committed a fallback. This lets us ensure a train // model where we don't commit new loading states in too quick succession. @@ -19571,7 +19867,7 @@ var legacyErrorBoundariesThatAlreadyFailed = null; // Only used when enableProfi var rootDoesHavePassiveEffects = false; var rootWithPendingPassiveEffects = null; var pendingPassiveEffectsLanes = NoLanes; -var pendingPassiveProfilerEffects = []; // Use these to prevent an infinite loop of nested updates +var pendingPassiveProfilerEffects = []; var NESTED_UPDATE_LIMIT = 50; var nestedUpdateCount = 0; @@ -19676,60 +19972,80 @@ function requestRetryLane(fiber) { function scheduleUpdateOnFiber(fiber, lane, eventTime) { checkForNestedUpdates(); - warnAboutRenderPhaseUpdatesInDEV(fiber); var root = markUpdateLaneFromFiberToRoot(fiber, lane); if (root === null) { return null; - } - - { - if (isDevToolsPresent) { - addFiberToLanesMap(root, fiber, lane); - } } // Mark that the root has a pending update. markRootUpdated(root, lane, eventTime); - if (root === workInProgressRoot) { - // Received an update to a tree that's in the middle of rendering. Mark - // that there was an interleaved update work on this root. Unless the - // `deferRenderPhaseUpdateToNextBatch` flag is off and this is a render - // phase update. In that case, we don't treat render phase updates as if - // they were interleaved, for backwards compat reasons. - if ((executionContext & RenderContext) === NoContext) { - workInProgressRootUpdatedLanes = mergeLanes( - workInProgressRootUpdatedLanes, - lane - ); + if ( + (executionContext & RenderContext) !== NoLanes && + root === workInProgressRoot + ) { + // This update was dispatched during the render phase. This is a mistake + // if the update originates from user space (with the exception of local + // hook updates, which are handled differently and don't reach this + // function), but there are some internal React features that use this as + // an implementation detail, like selective hydration. + warnAboutRenderPhaseUpdatesInDEV(fiber); // Track lanes that were updated during the render phase + + workInProgressRootRenderPhaseUpdatedLanes = mergeLanes( + workInProgressRootRenderPhaseUpdatedLanes, + lane + ); + } else { + // This is a normal update, scheduled from outside the render phase. For + // example, during an input event. + { + if (isDevToolsPresent) { + addFiberToLanesMap(root, fiber, lane); + } } - if (workInProgressRootExitStatus === RootSuspendedWithDelay) { - // The root already suspended with a delay, which means this render - // definitely won't finish. Since we have a new update, let's mark it as - // suspended now, right before marking the incoming update. This has the - // effect of interrupting the current render and switching to the update. - // TODO: Make sure this doesn't override pings that happen while we've - // already started rendering. - markRootSuspended$1(root, workInProgressRootRenderLanes); + warnIfUpdatesNotWrappedWithActDEV(fiber); + + if (root === workInProgressRoot) { + // Received an update to a tree that's in the middle of rendering. Mark + // that there was an interleaved update work on this root. Unless the + // `deferRenderPhaseUpdateToNextBatch` flag is off and this is a render + // phase update. In that case, we don't treat render phase updates as if + // they were interleaved, for backwards compat reasons. + if ((executionContext & RenderContext) === NoContext) { + workInProgressRootInterleavedUpdatedLanes = mergeLanes( + workInProgressRootInterleavedUpdatedLanes, + lane + ); + } + + if (workInProgressRootExitStatus === RootSuspendedWithDelay) { + // The root already suspended with a delay, which means this render + // definitely won't finish. Since we have a new update, let's mark it as + // suspended now, right before marking the incoming update. This has the + // effect of interrupting the current render and switching to the update. + // TODO: Make sure this doesn't override pings that happen while we've + // already started rendering. + markRootSuspended$1(root, workInProgressRootRenderLanes); + } } - } - ensureRootIsScheduled(root, eventTime); + ensureRootIsScheduled(root, eventTime); - if ( - lane === SyncLane && - executionContext === NoContext && - (fiber.mode & ConcurrentMode) === NoMode && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode. - !ReactCurrentActQueue.isBatchingLegacy - ) { - // Flush the synchronous work now, unless we're already working or inside - // a batch. This is intentionally inside scheduleUpdateOnFiber instead of - // scheduleCallbackForFiber to preserve the ability to schedule a callback - // without immediately flushing it. We only do this for user-initiated - // updates, to preserve historical behavior of legacy mode. - resetRenderTimer(); - flushSyncCallbacksOnlyInLegacyMode(); + if ( + lane === SyncLane && + executionContext === NoContext && + (fiber.mode & ConcurrentMode) === NoMode && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode. + !ReactCurrentActQueue$1.isBatchingLegacy + ) { + // Flush the synchronous work now, unless we're already working or inside + // a batch. This is intentionally inside scheduleUpdateOnFiber instead of + // scheduleCallbackForFiber to preserve the ability to schedule a callback + // without immediately flushing it. We only do this for user-initiated + // updates, to preserve historical behavior of legacy mode. + resetRenderTimer(); + flushSyncCallbacksOnlyInLegacyMode(); + } } return root; @@ -19834,7 +20150,7 @@ function ensureRootIsScheduled(root, currentTime) { // Scheduler task, rather than an `act` task, cancel it and re-scheduled // on the `act` queue. !( - ReactCurrentActQueue.current !== null && + ReactCurrentActQueue$1.current !== null && existingCallbackNode !== fakeActCallbackNode ) ) { @@ -19866,8 +20182,8 @@ function ensureRootIsScheduled(root, currentTime) { // Special case: Sync React callbacks are scheduled on a special // internal queue if (root.tag === LegacyRoot) { - if (ReactCurrentActQueue.isBatchingLegacy !== null) { - ReactCurrentActQueue.didScheduleLegacyUpdate = true; + if (ReactCurrentActQueue$1.isBatchingLegacy !== null) { + ReactCurrentActQueue$1.didScheduleLegacyUpdate = true; } scheduleLegacySyncCallback(performSyncWorkOnRoot.bind(null, root)); @@ -20057,7 +20373,26 @@ function recoverFromConcurrentError(root, errorRetryLanes) { clearContainer(root.containerInfo); } - var exitStatus = renderRootSync(root, errorRetryLanes); + var exitStatus; + var MAX_ERROR_RETRY_ATTEMPTS = 50; + + for (var i = 0; i < MAX_ERROR_RETRY_ATTEMPTS; i++) { + exitStatus = renderRootSync(root, errorRetryLanes); + + if ( + exitStatus === RootErrored && + workInProgressRootRenderPhaseUpdatedLanes !== NoLanes + ) { + // There was a render phase update during this render. Some internal React + // implementation details may use this as a trick to schedule another + // render pass. To protect against an inifinite loop, eventually + // we'll give up. + continue; + } + + break; + } + executionContext = prevExecutionContext; return exitStatus; } @@ -20244,7 +20579,10 @@ function markRootSuspended$1(root, suspendedLanes) { // TODO: Lol maybe there's a better way to factor this besides this // obnoxiously named function :) suspendedLanes = removeLanes(suspendedLanes, workInProgressRootPingedLanes); - suspendedLanes = removeLanes(suspendedLanes, workInProgressRootUpdatedLanes); + suspendedLanes = removeLanes( + suspendedLanes, + workInProgressRootInterleavedUpdatedLanes + ); markRootSuspended(root, suspendedLanes); } // This is the entry point for synchronous tasks that don't go // through Scheduler @@ -20270,31 +20608,16 @@ function performSyncWorkOnRoot(root) { var exitStatus = renderRootSync(root, lanes); if (root.tag !== LegacyRoot && exitStatus === RootErrored) { - var prevExecutionContext = executionContext; - executionContext |= RetryAfterError; // If an error occurred during hydration, - // discard server response and fall back to client side render. - - if (root.isDehydrated) { - root.isDehydrated = false; - - { - errorHydratingContainer(root.containerInfo); - } - - clearContainer(root.containerInfo); - } // If something threw an error, try rendering one more time. We'll render + // If something threw an error, try rendering one more time. We'll render // synchronously to block concurrent data mutations, and we'll includes // all pending updates are included. If it still fails after the second // attempt, we'll give up and commit the resulting tree. - var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root); if (errorRetryLanes !== NoLanes) { lanes = errorRetryLanes; - exitStatus = renderRootSync(root, lanes); + exitStatus = recoverFromConcurrentError(root, errorRetryLanes); } - - executionContext = prevExecutionContext; } if (exitStatus === RootFatalErrored) { @@ -20327,7 +20650,7 @@ function batchedUpdates$1(fn, a) { if ( executionContext === NoContext && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode. - !ReactCurrentActQueue.isBatchingLegacy + !ReactCurrentActQueue$1.isBatchingLegacy ) { resetRenderTimer(); flushSyncCallbacksOnlyInLegacyMode(); @@ -20415,7 +20738,8 @@ function prepareFreshStack(root, lanes) { workInProgressRootExitStatus = RootIncomplete; workInProgressRootFatalError = null; workInProgressRootSkippedLanes = NoLanes; - workInProgressRootUpdatedLanes = NoLanes; + workInProgressRootInterleavedUpdatedLanes = NoLanes; + workInProgressRootRenderPhaseUpdatedLanes = NoLanes; workInProgressRootPingedLanes = NoLanes; enqueueInterleavedUpdates(); @@ -20557,7 +20881,7 @@ function renderDidSuspendDelayIfPossible() { if ( workInProgressRoot !== null && (includesNonIdleWork(workInProgressRootSkippedLanes) || - includesNonIdleWork(workInProgressRootUpdatedLanes)) + includesNonIdleWork(workInProgressRootInterleavedUpdatedLanes)) ) { // Mark the current render as suspended so that we switch to working on // the updates that were skipped. Usually we only suspend at the end of @@ -20608,6 +20932,10 @@ function renderRootSync(root, lanes) { prepareFreshStack(root, lanes); } + { + markRenderStarted(lanes); + } + do { try { workLoopSync(); @@ -20629,6 +20957,10 @@ function renderRootSync(root, lanes) { ); } + { + markRenderStopped(); + } // Set this to null to indicate there's no in-progress render. + workInProgressRoot = null; workInProgressRootRenderLanes = NoLanes; return workInProgressRootExitStatus; @@ -20670,6 +21002,10 @@ function renderRootConcurrent(root, lanes) { prepareFreshStack(root, lanes); } + { + markRenderStarted(lanes); + } + do { try { workLoopConcurrent(); @@ -20684,8 +21020,18 @@ function renderRootConcurrent(root, lanes) { executionContext = prevExecutionContext; if (workInProgress !== null) { + // Still work remaining. + { + markRenderYielded(); + } + return RootIncomplete; } else { + // Completed the tree. + { + markRenderStopped(); + } // Set this to null to indicate there's no in-progress render. + workInProgressRoot = null; workInProgressRootRenderLanes = NoLanes; // Return the final exit status. @@ -20857,7 +21203,15 @@ function commitRootImpl(root, renderPriorityLevel) { var finishedWork = root.finishedWork; var lanes = root.finishedLanes; + { + markCommitStarted(lanes); + } + if (finishedWork === null) { + { + markCommitStopped(); + } + return null; } else { { @@ -20906,7 +21260,10 @@ function commitRootImpl(root, renderPriorityLevel) { if (!rootDoesHavePassiveEffects) { rootDoesHavePassiveEffects = true; scheduleCallback$1(NormalPriority, function() { - flushPassiveEffects(); + flushPassiveEffects(); // This render triggered passive effects: release the root cache pool + // *after* passive effects fire to avoid freeing a cache pool that may + // be referenced by a node in the tree (HostRoot, Cache boundary etc) + return null; }); } @@ -20960,7 +21317,15 @@ function commitRootImpl(root, renderPriorityLevel) { root.current = finishedWork; // The next phase is the layout phase, where we call effects that read + { + markLayoutEffectsStarted(lanes); + } + commitLayoutEffects(finishedWork, root, lanes); + + { + markLayoutEffectsStopped(); + } // opportunity to paint. requestPaint(); @@ -21064,6 +21429,10 @@ function commitRootImpl(root, renderPriorityLevel) { flushSyncCallbacks(); + { + markCommitStopped(); + } + return null; } @@ -21086,7 +21455,7 @@ function flushPassiveEffects() { return flushPassiveEffectsImpl(); } finally { setCurrentUpdatePriority(previousPriority); - ReactCurrentBatchConfig$2.transition = prevTransition; + ReactCurrentBatchConfig$2.transition = prevTransition; // Once passive effects have run for the tree - giving components a } } @@ -21112,6 +21481,7 @@ function flushPassiveEffectsImpl() { } var root = rootWithPendingPassiveEffects; + var lanes = pendingPassiveEffectsLanes; rootWithPendingPassiveEffects = null; // TODO: This is sometimes out of sync with rootWithPendingPassiveEffects. // Figure out why and fix it. It's not causing any known issues (probably // because it's only used for profiling), but it's a refactor hazard. @@ -21122,6 +21492,10 @@ function flushPassiveEffectsImpl() { throw new Error("Cannot flush passive effects while already rendering."); } + { + markPassiveEffectsStarted(lanes); + } + var prevExecutionContext = executionContext; executionContext |= CommitContext; commitPassiveUnmountEffects(root.current); @@ -21137,6 +21511,10 @@ function flushPassiveEffectsImpl() { } } + { + markPassiveEffectsStopped(); + } + { commitDoubleInvokeEffectsInDEV(root.current, true); } @@ -21267,6 +21645,7 @@ function pingSuspendedRoot(root, wakeable, pingedLanes) { var eventTime = requestEventTime(); markRootPinged(root, pingedLanes); + warnIfSuspenseResolutionNotWrappedWithActDEV(root); if ( workInProgressRoot === root && @@ -21592,11 +21971,7 @@ var didWarnAboutUpdateInRenderForAnotherComponent; function warnAboutRenderPhaseUpdatesInDEV(fiber) { { - if ( - isRendering && - (executionContext & RenderContext) !== NoContext && - !getIsUpdatingOpaqueValueInRenderPhaseInDEV() - ) { + if (isRendering && !getIsUpdatingOpaqueValueInRenderPhaseInDEV()) { switch (fiber.tag) { case FunctionComponent: case ForwardRef: @@ -21661,7 +22036,7 @@ function scheduleCallback$1(priorityLevel, callback) { { // If we're currently inside an `act` scope, bypass Scheduler and push to // the `act` queue instead. - var actQueue = ReactCurrentActQueue.current; + var actQueue = ReactCurrentActQueue$1.current; if (actQueue !== null) { actQueue.push(callback); @@ -21682,7 +22057,92 @@ function cancelCallback$1(callbackNode) { function shouldForceFlushFallbacksInDEV() { // Never force flush in production. This function should get stripped out. - return ReactCurrentActQueue.current !== null; + return ReactCurrentActQueue$1.current !== null; +} + +function warnIfUpdatesNotWrappedWithActDEV(fiber) { + { + if (fiber.mode & ConcurrentMode) { + if (!isConcurrentActEnvironment()) { + // Not in an act environment. No need to warn. + return; + } + } else { + // Legacy mode has additional cases where we suppress a warning. + if (!isLegacyActEnvironment()) { + // Not in an act environment. No need to warn. + return; + } + + if (executionContext !== NoContext) { + // Legacy mode doesn't warn if the update is batched, i.e. + // batchedUpdates or flushSync. + return; + } + + if ( + fiber.tag !== FunctionComponent && + fiber.tag !== ForwardRef && + fiber.tag !== SimpleMemoComponent + ) { + // For backwards compatibility with pre-hooks code, legacy mode only + // warns for updates that originate from a hook. + return; + } + } + + if (ReactCurrentActQueue$1.current === null) { + var previousFiber = current; + + try { + setCurrentFiber(fiber); + + error( + "An update to %s inside a test was not wrapped in act(...).\n\n" + + "When testing, code that causes React state updates should be " + + "wrapped into act(...):\n\n" + + "act(() => {\n" + + " /* fire events that update state */\n" + + "});\n" + + "/* assert on the output */\n\n" + + "This ensures that you're testing the behavior the user would see " + + "in the browser." + + " Learn more at https://reactjs.org/link/wrap-tests-with-act", + getComponentNameFromFiber(fiber) + ); + } finally { + if (previousFiber) { + setCurrentFiber(fiber); + } else { + resetCurrentFiber(); + } + } + } + } +} + +function warnIfSuspenseResolutionNotWrappedWithActDEV(root) { + { + if ( + root.tag !== LegacyRoot && + isConcurrentActEnvironment() && + ReactCurrentActQueue$1.current === null + ) { + error( + "A suspended resource finished loading inside a test, but the event " + + "was not wrapped in act(...).\n\n" + + "When testing, code that resolves suspended data should be wrapped " + + "into act(...):\n\n" + + "act(() => {\n" + + " /* finish loading suspended data */\n" + + "});\n" + + "/* assert on the output */\n\n" + + "This ensures that you're testing the behavior the user would see " + + "in the browser." + + " Learn more at https://reactjs.org/link/wrap-tests-with-act" + ); + } + } } /* eslint-disable react-internal/prod-error-codes */ @@ -22981,6 +23441,10 @@ function updateContainer(element, container, parentComponent, callback) { var eventTime = requestEventTime(); var lane = requestUpdateLane(current$1); + { + markRenderScheduled(lane); + } + var context = getContextForSubtree(parentComponent); if (container.context === null) { @@ -23815,5 +24279,24 @@ exports.sendAccessibilityEvent = sendAccessibilityEvent; exports.stopSurface = stopSurface; exports.unmountComponentAtNode = unmountComponentAtNode; + /** + * 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. + */ + +/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + +// Don't require this file directly; it's embedded by Rollup during build. + +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); +} + })(); } diff --git a/Libraries/Renderer/implementations/ReactFabric-prod.fb.js b/Libraries/Renderer/implementations/ReactFabric-prod.fb.js index 73b6f5eb765f..085993091a36 100644 --- a/Libraries/Renderer/implementations/ReactFabric-prod.fb.js +++ b/Libraries/Renderer/implementations/ReactFabric-prod.fb.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<0641813b146d4710c4029f156d65891e>> + * @generated SignedSource<<5f9a6b5a20e93d43bb11fbe8e20384f1>> */ "use strict"; @@ -927,7 +927,7 @@ eventPluginOrder = Array.prototype.slice.call([ "ReactNativeBridgeEventPlugin" ]); recomputePluginOrdering(); -var injectedNamesToPlugins$jscomp$inline_219 = { +var injectedNamesToPlugins$jscomp$inline_218 = { ResponderEventPlugin: ResponderEventPlugin, ReactNativeBridgeEventPlugin: { eventTypes: {}, @@ -962,33 +962,33 @@ var injectedNamesToPlugins$jscomp$inline_219 = { } } }, - isOrderingDirty$jscomp$inline_220 = !1, - pluginName$jscomp$inline_221; -for (pluginName$jscomp$inline_221 in injectedNamesToPlugins$jscomp$inline_219) + isOrderingDirty$jscomp$inline_219 = !1, + pluginName$jscomp$inline_220; +for (pluginName$jscomp$inline_220 in injectedNamesToPlugins$jscomp$inline_218) if ( - injectedNamesToPlugins$jscomp$inline_219.hasOwnProperty( - pluginName$jscomp$inline_221 + injectedNamesToPlugins$jscomp$inline_218.hasOwnProperty( + pluginName$jscomp$inline_220 ) ) { - var pluginModule$jscomp$inline_222 = - injectedNamesToPlugins$jscomp$inline_219[pluginName$jscomp$inline_221]; + var pluginModule$jscomp$inline_221 = + injectedNamesToPlugins$jscomp$inline_218[pluginName$jscomp$inline_220]; if ( - !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_221) || - namesToPlugins[pluginName$jscomp$inline_221] !== - pluginModule$jscomp$inline_222 + !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_220) || + namesToPlugins[pluginName$jscomp$inline_220] !== + pluginModule$jscomp$inline_221 ) { - if (namesToPlugins[pluginName$jscomp$inline_221]) + if (namesToPlugins[pluginName$jscomp$inline_220]) throw Error( "EventPluginRegistry: Cannot inject two different event plugins using the same name, `" + - (pluginName$jscomp$inline_221 + "`.") + (pluginName$jscomp$inline_220 + "`.") ); namesToPlugins[ - pluginName$jscomp$inline_221 - ] = pluginModule$jscomp$inline_222; - isOrderingDirty$jscomp$inline_220 = !0; + pluginName$jscomp$inline_220 + ] = pluginModule$jscomp$inline_221; + isOrderingDirty$jscomp$inline_219 = !0; } } -isOrderingDirty$jscomp$inline_220 && recomputePluginOrdering(); +isOrderingDirty$jscomp$inline_219 && recomputePluginOrdering(); function getInstanceFromInstance(instanceHandle) { return instanceHandle; } @@ -1619,6 +1619,13 @@ function onCommitRoot(root) { ); } catch (err) {} } +var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback, + log = Math.log, + LN2 = Math.LN2; +function clz32Fallback(x) { + x >>>= 0; + return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0; +} var nextTransitionLane = 64, nextRetryLane = 4194304; function getHighestPriorityLanes(lanes) { @@ -1802,12 +1809,6 @@ function markRootEntangled(root, entangledLanes) { rootEntangledLanes &= ~lane; } } -var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback, - log = Math.log, - LN2 = Math.LN2; -function clz32Fallback(lanes) { - return 0 === lanes ? 32 : (31 - ((log(lanes) / LN2) | 0)) | 0; -} var currentUpdatePriority = 0; function lanesToEventPriority(lanes) { lanes &= -lanes; @@ -2128,12 +2129,14 @@ function shallowEqual(objA, objB) { var keysA = Object.keys(objA), keysB = Object.keys(objB); if (keysA.length !== keysB.length) return !1; - for (keysB = 0; keysB < keysA.length; keysB++) + for (keysB = 0; keysB < keysA.length; keysB++) { + var currentKey = keysA[keysB]; if ( - !hasOwnProperty.call(objB, keysA[keysB]) || - !objectIs(objA[keysA[keysB]], objB[keysA[keysB]]) + !hasOwnProperty.call(objB, currentKey) || + !objectIs(objA[currentKey], objB[currentKey]) ) return !1; + } return !0; } function describeFiber(fiber) { @@ -2631,6 +2634,26 @@ function mountClassInstance(workInProgress, ctor, newProps, renderLanes) { "function" === typeof instance.componentDidMount && (workInProgress.flags |= 4); } +var forkStack = [], + forkStackIndex = 0, + treeForkProvider = null, + idStack = [], + idStackIndex = 0, + treeContextProvider = null; +function popTreeContext(workInProgress) { + for (; workInProgress === treeForkProvider; ) + (treeForkProvider = forkStack[--forkStackIndex]), + (forkStack[forkStackIndex] = null), + --forkStackIndex, + (forkStack[forkStackIndex] = null); + for (; workInProgress === treeContextProvider; ) + (treeContextProvider = idStack[--idStackIndex]), + (idStack[idStackIndex] = null), + --idStackIndex, + (idStack[idStackIndex] = null), + --idStackIndex, + (idStack[idStackIndex] = null); +} function coerceRef(returnFiber, current, element) { returnFiber = element.ref; if ( @@ -2725,7 +2748,8 @@ function ChildReconciler(shouldTrackSideEffects) { } function placeChild(newFiber, lastPlacedIndex, newIndex) { newFiber.index = newIndex; - if (!shouldTrackSideEffects) return lastPlacedIndex; + if (!shouldTrackSideEffects) + return (newFiber.flags |= 1048576), lastPlacedIndex; newIndex = newFiber.alternate; if (null !== newIndex) return ( @@ -3329,7 +3353,8 @@ var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher, currentHook = null, workInProgressHook = null, didScheduleRenderPhaseUpdate = !1, - didScheduleRenderPhaseUpdateDuringThisPass = !1; + didScheduleRenderPhaseUpdateDuringThisPass = !1, + globalClientIdCounter = 0; function throwInvalidHookError() { throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." @@ -3532,104 +3557,7 @@ function rerenderReducer(reducer) { } return [newState, dispatch]; } -function readFromUnsubscribedMutableSource(root, source, getSnapshot) { - var getVersion = source._getVersion; - getVersion = getVersion(source._source); - var JSCompiler_inline_result = source._workInProgressVersionSecondary; - if (null !== JSCompiler_inline_result) - root = JSCompiler_inline_result === getVersion; - else if ( - ((root = root.mutableReadLanes), (root = (renderLanes & root) === root)) - ) - (source._workInProgressVersionSecondary = getVersion), - workInProgressSources.push(source); - if (root) return getSnapshot(source._source); - workInProgressSources.push(source); - throw Error( - "Cannot read from mutable source during the current render without tearing. This may be a bug in React. Please file an issue." - ); -} -function useMutableSource(hook, source, getSnapshot, subscribe) { - var root = workInProgressRoot; - if (null === root) - throw Error( - "Expected a work-in-progress root. This is a bug in React. Please file an issue." - ); - var getVersion = source._getVersion, - version = getVersion(source._source), - dispatcher = ReactCurrentDispatcher$1.current, - _dispatcher$useState = dispatcher.useState(function() { - return readFromUnsubscribedMutableSource(root, source, getSnapshot); - }), - setSnapshot = _dispatcher$useState[1], - snapshot = _dispatcher$useState[0]; - _dispatcher$useState = workInProgressHook; - var memoizedState = hook.memoizedState, - refs = memoizedState.refs, - prevGetSnapshot = refs.getSnapshot, - prevSource = memoizedState.source; - memoizedState = memoizedState.subscribe; - var fiber = currentlyRenderingFiber$1; - hook.memoizedState = { refs: refs, source: source, subscribe: subscribe }; - dispatcher.useEffect( - function() { - refs.getSnapshot = getSnapshot; - refs.setSnapshot = setSnapshot; - var maybeNewVersion = getVersion(source._source); - objectIs(version, maybeNewVersion) || - ((maybeNewVersion = getSnapshot(source._source)), - objectIs(snapshot, maybeNewVersion) || - (setSnapshot(maybeNewVersion), - (maybeNewVersion = requestUpdateLane(fiber)), - (root.mutableReadLanes |= maybeNewVersion & root.pendingLanes)), - markRootEntangled(root, root.mutableReadLanes)); - }, - [getSnapshot, source, subscribe] - ); - dispatcher.useEffect( - function() { - return subscribe(source._source, function() { - var latestGetSnapshot = refs.getSnapshot, - latestSetSnapshot = refs.setSnapshot; - try { - latestSetSnapshot(latestGetSnapshot(source._source)); - var lane = requestUpdateLane(fiber); - root.mutableReadLanes |= lane & root.pendingLanes; - } catch (error) { - latestSetSnapshot(function() { - throw error; - }); - } - }); - }, - [source, subscribe] - ); - (objectIs(prevGetSnapshot, getSnapshot) && - objectIs(prevSource, source) && - objectIs(memoizedState, subscribe)) || - ((hook = { - pending: null, - interleaved: null, - lanes: 0, - dispatch: null, - lastRenderedReducer: basicStateReducer, - lastRenderedState: snapshot - }), - (hook.dispatch = setSnapshot = dispatchSetState.bind( - null, - currentlyRenderingFiber$1, - hook - )), - (_dispatcher$useState.queue = hook), - (_dispatcher$useState.baseQueue = null), - (snapshot = readFromUnsubscribedMutableSource(root, source, getSnapshot)), - (_dispatcher$useState.memoizedState = _dispatcher$useState.baseState = snapshot)); - return snapshot; -} -function updateMutableSource(source, getSnapshot, subscribe) { - var hook = updateWorkInProgressHook(); - return useMutableSource(hook, source, getSnapshot, subscribe); -} +function updateMutableSource() {} function mountSyncExternalStore(subscribe, getSnapshot) { var fiber = currentlyRenderingFiber$1, hook = mountWorkInProgressHook(); @@ -3752,7 +3680,7 @@ function updateEffectImpl(fiberFlags, hookFlags, create, deps) { hook.memoizedState = pushEffect(1 | hookFlags, create, destroy, deps); } function mountEffect(create, deps) { - return mountEffectImpl(4196352, 8, create, deps); + return mountEffectImpl(8390656, 8, create, deps); } function updateEffect(create, deps) { return updateEffectImpl(2048, 8, create, deps); @@ -3832,6 +3760,9 @@ function startTransition(setPending, callback) { (ReactCurrentBatchConfig$1.transition = prevTransition); } } +function updateId() { + return updateWorkInProgressHook().memoizedState; +} function dispatchReducerAction(fiber, queue, action) { var lane = requestUpdateLane(fiber); action = { @@ -3939,7 +3870,7 @@ var ContextOnlyDispatcher = { useTransition: throwInvalidHookError, useMutableSource: throwInvalidHookError, useSyncExternalStore: throwInvalidHookError, - useOpaqueIdentifier: throwInvalidHookError, + useId: throwInvalidHookError, unstable_isNewReconciler: !1 }, HooksDispatcherOnMount = { @@ -4027,18 +3958,12 @@ var ContextOnlyDispatcher = { mountWorkInProgressHook().memoizedState = _mountState2; return [isPending, _mountState2]; }, - useMutableSource: function(source, getSnapshot, subscribe) { - var hook = mountWorkInProgressHook(); - hook.memoizedState = { - refs: { getSnapshot: getSnapshot, setSnapshot: null }, - source: source, - subscribe: subscribe - }; - return useMutableSource(hook, source, getSnapshot, subscribe); - }, + useMutableSource: function() {}, useSyncExternalStore: mountSyncExternalStore, - useOpaqueIdentifier: function() { - throw Error("Not yet implemented"); + useId: function() { + var hook = mountWorkInProgressHook(); + var id = "r:" + (globalClientIdCounter++).toString(32); + return (hook.memoizedState = id); }, unstable_isNewReconciler: !1 }, @@ -4121,9 +4046,7 @@ var ContextOnlyDispatcher = { } return nextSnapshot; }, - useOpaqueIdentifier: function() { - return updateReducer(basicStateReducer)[0]; - }, + useId: updateId, unstable_isNewReconciler: !1 }, HooksDispatcherOnRerender = { @@ -4166,9 +4089,7 @@ var ContextOnlyDispatcher = { }, useMutableSource: updateMutableSource, useSyncExternalStore: mountSyncExternalStore, - useOpaqueIdentifier: function() { - return rerenderReducer(basicStateReducer)[0]; - }, + useId: updateId, unstable_isNewReconciler: !1 }; function createCapturedValue(value, source) { @@ -4434,8 +4355,8 @@ function bubbleProperties(completedWork) { if (didBailout) for (var child$36 = completedWork.child; null !== child$36; ) (newChildLanes |= child$36.lanes | child$36.childLanes), - (subtreeFlags |= child$36.subtreeFlags & 7340032), - (subtreeFlags |= child$36.flags & 7340032), + (subtreeFlags |= child$36.subtreeFlags & 14680064), + (subtreeFlags |= child$36.flags & 14680064), (child$36.return = completedWork), (child$36 = child$36.sibling); else @@ -4476,6 +4397,7 @@ function completeSuspendedOffscreenHostContainer(current, workInProgress) { } function completeWork(current, workInProgress, renderLanes) { var newProps = workInProgress.pendingProps; + popTreeContext(workInProgress); switch (workInProgress.tag) { case 2: case 16: @@ -4599,7 +4521,7 @@ function completeWork(current, workInProgress, renderLanes) { workInProgressRootExitStatus = 4; null === workInProgressRoot || (0 === (workInProgressRootSkippedLanes & 268435455) && - 0 === (workInProgressRootUpdatedLanes & 268435455)) || + 0 === (workInProgressRootInterleavedUpdatedLanes & 268435455)) || markRootSuspended$1( workInProgressRoot, workInProgressRootRenderLanes @@ -4654,7 +4576,7 @@ function completeWork(current, workInProgress, renderLanes) { for (newProps = workInProgress.child; null !== newProps; ) (renderLanes = newProps), (type = current), - (renderLanes.flags &= 7340034), + (renderLanes.flags &= 14680066), (renderedTail = renderLanes.alternate), null === renderedTail ? ((renderLanes.childLanes = 0), @@ -5270,7 +5192,7 @@ function pushHostRootContext(workInProgress) { pushTopLevelContextObject(workInProgress, root.context, !1); pushHostContainer(workInProgress, root.containerInfo); } -var SUSPENDED_MARKER = { dehydrated: null, retryLane: 0 }; +var SUSPENDED_MARKER = { dehydrated: null, treeContext: null, retryLane: 0 }; function mountSuspenseOffscreenState(renderLanes) { return { baseLanes: renderLanes, cachePool: null }; } @@ -5495,7 +5417,7 @@ function updateSuspenseFallbackChildren( primaryChildren ))), (current.subtreeFlags = - currentPrimaryChildFragment.subtreeFlags & 7340032)); + currentPrimaryChildFragment.subtreeFlags & 14680064)); null !== currentFallbackChildFragment ? (fallbackChildren = createWorkInProgress( currentFallbackChildFragment, @@ -5719,6 +5641,7 @@ function attemptEarlyBailoutIfNoScheduledUpdate( return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); } function unwindWork(workInProgress) { + popTreeContext(workInProgress); switch (workInProgress.tag) { case 1: isContextProvider(workInProgress.type) && popContext(); @@ -5776,6 +5699,13 @@ function safelyDetachRef(current, nearestMountedAncestor) { } else ref.current = null; } +function safelyCallDestroy(current, nearestMountedAncestor, destroy) { + try { + destroy(); + } catch (error) { + captureCommitPhaseError(current, nearestMountedAncestor, error); + } +} var shouldFireAfterActiveInstanceBlur = !1; function commitBeforeMutationEffects(root, firstChild) { for (nextEffect = firstChild; null !== nextEffect; ) @@ -5840,7 +5770,7 @@ function commitBeforeMutationEffects(root, firstChild) { function commitHookEffectListUnmount( flags, finishedWork, - nearestMountedAncestor$jscomp$0 + nearestMountedAncestor ) { var updateQueue = finishedWork.updateQueue; updateQueue = null !== updateQueue ? updateQueue.lastEffect : null; @@ -5850,27 +5780,20 @@ function commitHookEffectListUnmount( if ((effect.tag & flags) === flags) { var destroy = effect.destroy; effect.destroy = void 0; - if (void 0 !== destroy) { - var current = finishedWork, - nearestMountedAncestor = nearestMountedAncestor$jscomp$0; - try { - destroy(); - } catch (error) { - captureCommitPhaseError(current, nearestMountedAncestor, error); - } - } + void 0 !== destroy && + safelyCallDestroy(finishedWork, nearestMountedAncestor, destroy); } effect = effect.next; } while (effect !== updateQueue); } } -function commitHookEffectListMount(tag, finishedWork) { +function commitHookEffectListMount(flags, finishedWork) { finishedWork = finishedWork.updateQueue; finishedWork = null !== finishedWork ? finishedWork.lastEffect : null; if (null !== finishedWork) { var effect = (finishedWork = finishedWork.next); do { - if ((effect.tag & tag) === tag) { + if ((effect.tag & flags) === flags) { var create$80 = effect.create; effect.destroy = create$80(); } @@ -5977,22 +5900,11 @@ function commitMutationEffects(root, firstChild) { var _effect = effect, destroy = _effect.destroy, tag = _effect.tag; - if ( - void 0 !== destroy && - (0 !== (tag & 2) || 0 !== (tag & 4)) - ) { - _effect = current; - var nearestMountedAncestor = root; - try { - destroy(); - } catch (error) { - captureCommitPhaseError( - _effect, - nearestMountedAncestor, - error - ); - } - } + void 0 !== destroy && + (0 !== (tag & 2) + ? safelyCallDestroy(current, root, destroy) + : 0 !== (tag & 4) && + safelyCallDestroy(current, root, destroy)); effect = effect.next; } while (effect !== firstEffect); } @@ -6222,7 +6134,8 @@ var ceil = Math.ceil, workInProgressRootExitStatus = 0, workInProgressRootFatalError = null, workInProgressRootSkippedLanes = 0, - workInProgressRootUpdatedLanes = 0, + workInProgressRootInterleavedUpdatedLanes = 0, + workInProgressRootRenderPhaseUpdatedLanes = 0, workInProgressRootPingedLanes = 0, globalMostRecentFallbackTime = 0, workInProgressRootRenderTargetTime = Infinity, @@ -6282,16 +6195,19 @@ function scheduleUpdateOnFiber(fiber, lane, eventTime) { var root = markUpdateLaneFromFiberToRoot(fiber, lane); if (null === root) return null; markRootUpdated(root, lane, eventTime); - root === workInProgressRoot && - (0 === (executionContext & 2) && (workInProgressRootUpdatedLanes |= lane), - 4 === workInProgressRootExitStatus && - markRootSuspended$1(root, workInProgressRootRenderLanes)); - ensureRootIsScheduled(root, eventTime); - 1 === lane && - 0 === executionContext && - 0 === (fiber.mode & 1) && - ((workInProgressRootRenderTargetTime = now() + 500), - includesLegacySyncCallbacks && flushSyncCallbacks()); + 0 !== (executionContext & 2) && root === workInProgressRoot + ? (workInProgressRootRenderPhaseUpdatedLanes |= lane) + : (root === workInProgressRoot && + (0 === (executionContext & 2) && + (workInProgressRootInterleavedUpdatedLanes |= lane), + 4 === workInProgressRootExitStatus && + markRootSuspended$1(root, workInProgressRootRenderLanes)), + ensureRootIsScheduled(root, eventTime), + 1 === lane && + 0 === executionContext && + 0 === (fiber.mode & 1) && + ((workInProgressRootRenderTargetTime = now() + 500), + includesLegacySyncCallbacks && flushSyncCallbacks())); return root; } function markUpdateLaneFromFiberToRoot(sourceFiber, lane) { @@ -6538,9 +6454,15 @@ function recoverFromConcurrentError(root, errorRetryLanes) { var prevExecutionContext = executionContext; executionContext |= 8; root.isDehydrated && ((root.isDehydrated = !1), shim(root.containerInfo)); - root = renderRootSync(root, errorRetryLanes); + for ( + var exitStatus, i = 0; + 50 > i && + ((exitStatus = renderRootSync(root, errorRetryLanes)), + 2 === exitStatus && 0 !== workInProgressRootRenderPhaseUpdatedLanes); + i++ + ); executionContext = prevExecutionContext; - return root; + return exitStatus; } function isRenderConsistentWithExternalStores(finishedWork) { for (var node = finishedWork; ; ) { @@ -6578,7 +6500,7 @@ function isRenderConsistentWithExternalStores(finishedWork) { } function markRootSuspended$1(root, suspendedLanes) { suspendedLanes &= ~workInProgressRootPingedLanes; - suspendedLanes &= ~workInProgressRootUpdatedLanes; + suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes; root.suspendedLanes |= suspendedLanes; root.pingedLanes &= ~suspendedLanes; for (root = root.expirationTimes; 0 < suspendedLanes; ) { @@ -6596,13 +6518,10 @@ function performSyncWorkOnRoot(root) { if (0 === (lanes & 1)) return ensureRootIsScheduled(root, now()), null; var exitStatus = renderRootSync(root, lanes); if (0 !== root.tag && 2 === exitStatus) { - var prevExecutionContext = executionContext; - executionContext |= 8; - root.isDehydrated && ((root.isDehydrated = !1), shim(root.containerInfo)); var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root); 0 !== errorRetryLanes && - ((lanes = errorRetryLanes), (exitStatus = renderRootSync(root, lanes))); - executionContext = prevExecutionContext; + ((lanes = errorRetryLanes), + (exitStatus = recoverFromConcurrentError(root, errorRetryLanes))); } if (1 === exitStatus) throw ((exitStatus = workInProgressRootFatalError), @@ -6629,6 +6548,7 @@ function prepareFreshStack(root, lanes) { if (null !== workInProgress) for (timeoutHandle = workInProgress.return; null !== timeoutHandle; ) { var interruptedWork = timeoutHandle; + popTreeContext(interruptedWork); switch (interruptedWork.tag) { case 1: interruptedWork = interruptedWork.type.childContextTypes; @@ -6668,7 +6588,7 @@ function prepareFreshStack(root, lanes) { workInProgressRootRenderLanes = subtreeRenderLanes = lanes; workInProgressRootExitStatus = 0; workInProgressRootFatalError = null; - workInProgressRootPingedLanes = workInProgressRootUpdatedLanes = workInProgressRootSkippedLanes = 0; + workInProgressRootPingedLanes = workInProgressRootRenderPhaseUpdatedLanes = workInProgressRootInterleavedUpdatedLanes = workInProgressRootSkippedLanes = 0; if (null !== interleavedQueues) { for (root = 0; root < interleavedQueues.length; root++) if ( @@ -7784,7 +7704,7 @@ function createWorkInProgress(current, pendingProps) { (workInProgress.flags = 0), (workInProgress.subtreeFlags = 0), (workInProgress.deletions = null)); - workInProgress.flags = current.flags & 7340032; + workInProgress.flags = current.flags & 14680064; workInProgress.childLanes = current.childLanes; workInProgress.lanes = current.lanes; workInProgress.child = current.child; @@ -8140,10 +8060,10 @@ batchedUpdatesImpl = function(fn, a) { } }; var roots = new Map(), - devToolsConfig$jscomp$inline_935 = { + devToolsConfig$jscomp$inline_911 = { findFiberByHostInstance: getInstanceFromInstance, bundleType: 0, - version: "18.0.0-afcb9cdc9-20211008", + version: "18.0.0-3fcd81dd1-20211102", rendererPackageName: "react-native-renderer", rendererConfig: { getInspectorDataForViewTag: function() { @@ -8158,11 +8078,11 @@ var roots = new Map(), }.bind(null, findNodeHandle) } }; -var internals$jscomp$inline_1189 = { - bundleType: devToolsConfig$jscomp$inline_935.bundleType, - version: devToolsConfig$jscomp$inline_935.version, - rendererPackageName: devToolsConfig$jscomp$inline_935.rendererPackageName, - rendererConfig: devToolsConfig$jscomp$inline_935.rendererConfig, +var internals$jscomp$inline_1160 = { + bundleType: devToolsConfig$jscomp$inline_911.bundleType, + version: devToolsConfig$jscomp$inline_911.version, + rendererPackageName: devToolsConfig$jscomp$inline_911.rendererPackageName, + rendererConfig: devToolsConfig$jscomp$inline_911.rendererConfig, overrideHookState: null, overrideHookStateDeletePath: null, overrideHookStateRenamePath: null, @@ -8178,26 +8098,26 @@ var internals$jscomp$inline_1189 = { return null === fiber ? null : fiber.stateNode; }, findFiberByHostInstance: - devToolsConfig$jscomp$inline_935.findFiberByHostInstance || + devToolsConfig$jscomp$inline_911.findFiberByHostInstance || emptyFindFiberByHostInstance, findHostInstancesForRefresh: null, scheduleRefresh: null, scheduleRoot: null, setRefreshHandler: null, getCurrentFiber: null, - reconcilerVersion: "18.0.0-afcb9cdc9-20211008" + reconcilerVersion: "18.0.0-3fcd81dd1-20211102" }; if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { - var hook$jscomp$inline_1190 = __REACT_DEVTOOLS_GLOBAL_HOOK__; + var hook$jscomp$inline_1161 = __REACT_DEVTOOLS_GLOBAL_HOOK__; if ( - !hook$jscomp$inline_1190.isDisabled && - hook$jscomp$inline_1190.supportsFiber + !hook$jscomp$inline_1161.isDisabled && + hook$jscomp$inline_1161.supportsFiber ) try { - (rendererID = hook$jscomp$inline_1190.inject( - internals$jscomp$inline_1189 + (rendererID = hook$jscomp$inline_1161.inject( + internals$jscomp$inline_1160 )), - (injectedHook = hook$jscomp$inline_1190); + (injectedHook = hook$jscomp$inline_1161); } catch (err) {} } exports.createPortal = function(children, containerTag) { diff --git a/Libraries/Renderer/implementations/ReactFabric-profiling.fb.js b/Libraries/Renderer/implementations/ReactFabric-profiling.fb.js index 1950c8517f1e..52f77d4ea446 100644 --- a/Libraries/Renderer/implementations/ReactFabric-profiling.fb.js +++ b/Libraries/Renderer/implementations/ReactFabric-profiling.fb.js @@ -7,10 +7,29 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<62430ecbf70b848b8677c9a80f79d347>> + * @generated SignedSource<<19f971b57faf7a665639f8c6cebcb2fc>> */ -"use strict"; + + /** + * 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. + */ + +/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + +// Don't require this file directly; it's embedded by Rollup during build. + +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); +} + "use strict"; require("react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore"); var ReactNativePrivateInterface = require("react-native/Libraries/ReactPrivate/ReactNativePrivateInterface"), React = require("react"), @@ -927,7 +946,7 @@ eventPluginOrder = Array.prototype.slice.call([ "ReactNativeBridgeEventPlugin" ]); recomputePluginOrdering(); -var injectedNamesToPlugins$jscomp$inline_227 = { +var injectedNamesToPlugins$jscomp$inline_241 = { ResponderEventPlugin: ResponderEventPlugin, ReactNativeBridgeEventPlugin: { eventTypes: {}, @@ -962,33 +981,33 @@ var injectedNamesToPlugins$jscomp$inline_227 = { } } }, - isOrderingDirty$jscomp$inline_228 = !1, - pluginName$jscomp$inline_229; -for (pluginName$jscomp$inline_229 in injectedNamesToPlugins$jscomp$inline_227) + isOrderingDirty$jscomp$inline_242 = !1, + pluginName$jscomp$inline_243; +for (pluginName$jscomp$inline_243 in injectedNamesToPlugins$jscomp$inline_241) if ( - injectedNamesToPlugins$jscomp$inline_227.hasOwnProperty( - pluginName$jscomp$inline_229 + injectedNamesToPlugins$jscomp$inline_241.hasOwnProperty( + pluginName$jscomp$inline_243 ) ) { - var pluginModule$jscomp$inline_230 = - injectedNamesToPlugins$jscomp$inline_227[pluginName$jscomp$inline_229]; + var pluginModule$jscomp$inline_244 = + injectedNamesToPlugins$jscomp$inline_241[pluginName$jscomp$inline_243]; if ( - !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_229) || - namesToPlugins[pluginName$jscomp$inline_229] !== - pluginModule$jscomp$inline_230 + !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_243) || + namesToPlugins[pluginName$jscomp$inline_243] !== + pluginModule$jscomp$inline_244 ) { - if (namesToPlugins[pluginName$jscomp$inline_229]) + if (namesToPlugins[pluginName$jscomp$inline_243]) throw Error( "EventPluginRegistry: Cannot inject two different event plugins using the same name, `" + - (pluginName$jscomp$inline_229 + "`.") + (pluginName$jscomp$inline_243 + "`.") ); namesToPlugins[ - pluginName$jscomp$inline_229 - ] = pluginModule$jscomp$inline_230; - isOrderingDirty$jscomp$inline_228 = !0; + pluginName$jscomp$inline_243 + ] = pluginModule$jscomp$inline_244; + isOrderingDirty$jscomp$inline_242 = !0; } } -isOrderingDirty$jscomp$inline_228 && recomputePluginOrdering(); +isOrderingDirty$jscomp$inline_242 && recomputePluginOrdering(); function getInstanceFromInstance(instanceHandle) { return instanceHandle; } @@ -1637,6 +1656,27 @@ function onCommitRoot(root, eventPriority) { ); } catch (err) {} } +var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback, + log = Math.log, + LN2 = Math.LN2; +function clz32Fallback(x) { + x >>>= 0; + return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0; +} +function getLabelForLane(lane) { + if (lane & 1) return "Sync"; + if (lane & 2) return "InputContinuousHydration"; + if (lane & 4) return "InputContinuous"; + if (lane & 8) return "DefaultHydration"; + if (lane & 16) return "Default"; + if (lane & 32) return "TransitionHydration"; + if (lane & 4194240) return "Transition"; + if (lane & 130023424) return "Retry"; + if (lane & 134217728) return "SelectiveHydration"; + if (lane & 268435456) return "IdleHydration"; + if (lane & 536870912) return "Idle"; + if (lane & 1073741824) return "Offscreen"; +} var nextTransitionLane = 64, nextRetryLane = 4194304; function getHighestPriorityLanes(lanes) { @@ -1850,12 +1890,6 @@ function movePendingFibersToMemoized(root, lanes) { lanes &= ~root; } } -var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback, - log = Math.log, - LN2 = Math.LN2; -function clz32Fallback(lanes) { - return 0 === lanes ? 32 : (31 - ((log(lanes) / LN2) | 0)) | 0; -} var currentUpdatePriority = 0; function lanesToEventPriority(lanes) { lanes &= -lanes; @@ -2163,6 +2197,112 @@ function flushSyncCallbacks() { } return null; } +var supportsUserTimingV3 = !1; +if ( + "undefined" !== typeof performance && + "function" === typeof performance.mark && + "function" === typeof performance.clearMarks +) { + var markOptions = {}; + Object.defineProperty(markOptions, "startTime", { + get: function() { + supportsUserTimingV3 = !0; + return 0; + }, + set: function() {} + }); + try { + performance.mark("__v3", markOptions); + } catch (error) { + } finally { + performance.clearMarks("__v3"); + } +} +var laneLabels = []; +function getLaneLabels() { + if (0 === laneLabels.length) + for (var lane = 1, index$11 = 0; 31 > index$11; index$11++) + laneLabels.push(getLabelForLane(lane)), (lane *= 2); + return laneLabels; +} +function markAndClear(name) { + performance.mark(name); + performance.clearMarks(name); +} +function markInternalModuleRanges() { + if ( + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && + "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.getInternalModuleRanges + ) + for ( + var ranges = __REACT_DEVTOOLS_GLOBAL_HOOK__.getInternalModuleRanges(), + i = 0; + i < ranges.length; + i++ + ) { + var _ranges$i = ranges[i], + stopStackFrame = _ranges$i[1]; + markAndClear("--react-internal-module-start-" + _ranges$i[0]); + markAndClear("--react-internal-module-stop-" + stopStackFrame); + } +} +function markComponentRenderStarted(fiber) { + supportsUserTimingV3 && + ((fiber = getComponentNameFromFiber(fiber) || "Unknown"), + markAndClear("--component-render-start-" + fiber)); +} +function markComponentRenderStopped() { + supportsUserTimingV3 && markAndClear("--component-render-stop"); +} +function markComponentLayoutEffectUnmountStarted(fiber) { + supportsUserTimingV3 && + ((fiber = getComponentNameFromFiber(fiber) || "Unknown"), + markAndClear("--component-layout-effect-unmount-start-" + fiber)); +} +function markComponentLayoutEffectUnmountStopped() { + supportsUserTimingV3 && + markAndClear("--component-layout-effect-unmount-stop"); +} +var wakeableIDs = new ("function" === typeof WeakMap ? WeakMap : Map)(), + wakeableID = 0; +function getWakeableID(wakeable) { + wakeableIDs.has(wakeable) || wakeableIDs.set(wakeable, wakeableID++); + return wakeableIDs.get(wakeable); +} +function markComponentSuspended(fiber, wakeable, lanes) { + if (supportsUserTimingV3) { + var eventType = wakeableIDs.has(wakeable) ? "resuspend" : "suspend", + id = getWakeableID(wakeable), + componentName = getComponentNameFromFiber(fiber) || "Unknown"; + markAndClear( + "--suspense-" + + eventType + + "-" + + id + + "-" + + componentName + + "-" + + (null === fiber.alternate ? "mount" : "update") + + "-" + + lanes + + "-" + + (wakeable.displayName || "") + ); + wakeable.then( + function() { + return markAndClear("--suspense-resolved-" + id + "-" + componentName); + }, + function() { + return markAndClear("--suspense-rejected-" + id + "-" + componentName); + } + ); + } +} +function markStateUpdateScheduled(fiber, lane) { + supportsUserTimingV3 && + ((fiber = getComponentNameFromFiber(fiber) || "Unknown"), + markAndClear("--schedule-state-update-" + lane + "-" + fiber)); +} var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; function shallowEqual(objA, objB) { if (objectIs(objA, objB)) return !0; @@ -2176,12 +2316,14 @@ function shallowEqual(objA, objB) { var keysA = Object.keys(objA), keysB = Object.keys(objB); if (keysA.length !== keysB.length) return !1; - for (keysB = 0; keysB < keysA.length; keysB++) + for (keysB = 0; keysB < keysA.length; keysB++) { + var currentKey = keysA[keysB]; if ( - !hasOwnProperty.call(objB, keysA[keysB]) || - !objectIs(objA[keysA[keysB]], objB[keysA[keysB]]) + !hasOwnProperty.call(objB, currentKey) || + !objectIs(objA[currentKey], objB[currentKey]) ) return !1; + } return !0; } function describeFiber(fiber) { @@ -2564,6 +2706,7 @@ var classComponentUpdater = { enqueueUpdate(inst, update); payload = scheduleUpdateOnFiber(inst, lane, eventTime); null !== payload && entangleTransitions(payload, inst, lane); + markStateUpdateScheduled(inst, lane); }, enqueueReplaceState: function(inst, payload, callback) { inst = inst._reactInternals; @@ -2576,17 +2719,21 @@ var classComponentUpdater = { enqueueUpdate(inst, update); payload = scheduleUpdateOnFiber(inst, lane, eventTime); null !== payload && entangleTransitions(payload, inst, lane); + markStateUpdateScheduled(inst, lane); }, enqueueForceUpdate: function(inst, callback) { - inst = inst._reactInternals; - var eventTime = requestEventTime(), - lane = requestUpdateLane(inst), - update = createUpdate(eventTime, lane); + var fiber = inst._reactInternals, + eventTime = requestEventTime(); + inst = requestUpdateLane(fiber); + var update = createUpdate(eventTime, inst); update.tag = 2; void 0 !== callback && null !== callback && (update.callback = callback); - enqueueUpdate(inst, update); - callback = scheduleUpdateOnFiber(inst, lane, eventTime); - null !== callback && entangleTransitions(callback, inst, lane); + enqueueUpdate(fiber, update); + callback = scheduleUpdateOnFiber(fiber, inst, eventTime); + null !== callback && entangleTransitions(callback, fiber, inst); + supportsUserTimingV3 && + ((callback = getComponentNameFromFiber(fiber) || "Unknown"), + markAndClear("--schedule-forced-update-" + inst + "-" + callback)); } }; function checkShouldComponentUpdate( @@ -2679,6 +2826,26 @@ function mountClassInstance(workInProgress, ctor, newProps, renderLanes) { "function" === typeof instance.componentDidMount && (workInProgress.flags |= 4); } +var forkStack = [], + forkStackIndex = 0, + treeForkProvider = null, + idStack = [], + idStackIndex = 0, + treeContextProvider = null; +function popTreeContext(workInProgress) { + for (; workInProgress === treeForkProvider; ) + (treeForkProvider = forkStack[--forkStackIndex]), + (forkStack[forkStackIndex] = null), + --forkStackIndex, + (forkStack[forkStackIndex] = null); + for (; workInProgress === treeContextProvider; ) + (treeContextProvider = idStack[--idStackIndex]), + (idStack[idStackIndex] = null), + --idStackIndex, + (idStack[idStackIndex] = null), + --idStackIndex, + (idStack[idStackIndex] = null); +} function coerceRef(returnFiber, current, element) { returnFiber = element.ref; if ( @@ -2773,7 +2940,8 @@ function ChildReconciler(shouldTrackSideEffects) { } function placeChild(newFiber, lastPlacedIndex, newIndex) { newFiber.index = newIndex; - if (!shouldTrackSideEffects) return lastPlacedIndex; + if (!shouldTrackSideEffects) + return (newFiber.flags |= 1048576), lastPlacedIndex; newIndex = newFiber.alternate; if (null !== newIndex) return ( @@ -3377,7 +3545,8 @@ var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher, currentHook = null, workInProgressHook = null, didScheduleRenderPhaseUpdate = !1, - didScheduleRenderPhaseUpdateDuringThisPass = !1; + didScheduleRenderPhaseUpdateDuringThisPass = !1, + globalClientIdCounter = 0; function throwInvalidHookError() { throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." @@ -3580,104 +3749,7 @@ function rerenderReducer(reducer) { } return [newState, dispatch]; } -function readFromUnsubscribedMutableSource(root, source, getSnapshot) { - var getVersion = source._getVersion; - getVersion = getVersion(source._source); - var JSCompiler_inline_result = source._workInProgressVersionSecondary; - if (null !== JSCompiler_inline_result) - root = JSCompiler_inline_result === getVersion; - else if ( - ((root = root.mutableReadLanes), (root = (renderLanes & root) === root)) - ) - (source._workInProgressVersionSecondary = getVersion), - workInProgressSources.push(source); - if (root) return getSnapshot(source._source); - workInProgressSources.push(source); - throw Error( - "Cannot read from mutable source during the current render without tearing. This may be a bug in React. Please file an issue." - ); -} -function useMutableSource(hook, source, getSnapshot, subscribe) { - var root = workInProgressRoot; - if (null === root) - throw Error( - "Expected a work-in-progress root. This is a bug in React. Please file an issue." - ); - var getVersion = source._getVersion, - version = getVersion(source._source), - dispatcher = ReactCurrentDispatcher$1.current, - _dispatcher$useState = dispatcher.useState(function() { - return readFromUnsubscribedMutableSource(root, source, getSnapshot); - }), - setSnapshot = _dispatcher$useState[1], - snapshot = _dispatcher$useState[0]; - _dispatcher$useState = workInProgressHook; - var memoizedState = hook.memoizedState, - refs = memoizedState.refs, - prevGetSnapshot = refs.getSnapshot, - prevSource = memoizedState.source; - memoizedState = memoizedState.subscribe; - var fiber = currentlyRenderingFiber$1; - hook.memoizedState = { refs: refs, source: source, subscribe: subscribe }; - dispatcher.useEffect( - function() { - refs.getSnapshot = getSnapshot; - refs.setSnapshot = setSnapshot; - var maybeNewVersion = getVersion(source._source); - objectIs(version, maybeNewVersion) || - ((maybeNewVersion = getSnapshot(source._source)), - objectIs(snapshot, maybeNewVersion) || - (setSnapshot(maybeNewVersion), - (maybeNewVersion = requestUpdateLane(fiber)), - (root.mutableReadLanes |= maybeNewVersion & root.pendingLanes)), - markRootEntangled(root, root.mutableReadLanes)); - }, - [getSnapshot, source, subscribe] - ); - dispatcher.useEffect( - function() { - return subscribe(source._source, function() { - var latestGetSnapshot = refs.getSnapshot, - latestSetSnapshot = refs.setSnapshot; - try { - latestSetSnapshot(latestGetSnapshot(source._source)); - var lane = requestUpdateLane(fiber); - root.mutableReadLanes |= lane & root.pendingLanes; - } catch (error) { - latestSetSnapshot(function() { - throw error; - }); - } - }); - }, - [source, subscribe] - ); - (objectIs(prevGetSnapshot, getSnapshot) && - objectIs(prevSource, source) && - objectIs(memoizedState, subscribe)) || - ((hook = { - pending: null, - interleaved: null, - lanes: 0, - dispatch: null, - lastRenderedReducer: basicStateReducer, - lastRenderedState: snapshot - }), - (hook.dispatch = setSnapshot = dispatchSetState.bind( - null, - currentlyRenderingFiber$1, - hook - )), - (_dispatcher$useState.queue = hook), - (_dispatcher$useState.baseQueue = null), - (snapshot = readFromUnsubscribedMutableSource(root, source, getSnapshot)), - (_dispatcher$useState.memoizedState = _dispatcher$useState.baseState = snapshot)); - return snapshot; -} -function updateMutableSource(source, getSnapshot, subscribe) { - var hook = updateWorkInProgressHook(); - return useMutableSource(hook, source, getSnapshot, subscribe); -} +function updateMutableSource() {} function mountSyncExternalStore(subscribe, getSnapshot) { var fiber = currentlyRenderingFiber$1, hook = mountWorkInProgressHook(); @@ -3731,7 +3803,7 @@ function checkIfSnapshotChanged(inst) { try { var nextValue = latestGetSnapshot(); return !objectIs(inst, nextValue); - } catch (error) { + } catch (error$31) { return !0; } } @@ -3800,7 +3872,7 @@ function updateEffectImpl(fiberFlags, hookFlags, create, deps) { hook.memoizedState = pushEffect(1 | hookFlags, create, destroy, deps); } function mountEffect(create, deps) { - return mountEffectImpl(4196352, 8, create, deps); + return mountEffectImpl(8390656, 8, create, deps); } function updateEffect(create, deps) { return updateEffectImpl(2048, 8, create, deps); @@ -3880,6 +3952,9 @@ function startTransition(setPending, callback) { (ReactCurrentBatchConfig$1.transition = prevTransition); } } +function updateId() { + return updateWorkInProgressHook().memoizedState; +} function dispatchReducerAction(fiber, queue, action) { var lane = requestUpdateLane(fiber); action = { @@ -3893,8 +3968,9 @@ function dispatchReducerAction(fiber, queue, action) { ? enqueueRenderPhaseUpdate(queue, action) : (enqueueUpdate$1(fiber, queue, action), (action = requestEventTime()), - (fiber = scheduleUpdateOnFiber(fiber, lane, action)), - null !== fiber && entangleTransitionUpdate(fiber, queue, lane)); + (action = scheduleUpdateOnFiber(fiber, lane, action)), + null !== action && entangleTransitionUpdate(action, queue, lane)); + markStateUpdateScheduled(fiber, lane); } function dispatchSetState(fiber, queue, action) { var lane = requestUpdateLane(fiber), @@ -3920,13 +3996,14 @@ function dispatchSetState(fiber, queue, action) { update.hasEagerState = !0; update.eagerState = eagerState; if (objectIs(eagerState, currentState)) return; - } catch (error) { + } catch (error$33) { } finally { } action = requestEventTime(); - fiber = scheduleUpdateOnFiber(fiber, lane, action); - null !== fiber && entangleTransitionUpdate(fiber, queue, lane); + action = scheduleUpdateOnFiber(fiber, lane, action); + null !== action && entangleTransitionUpdate(action, queue, lane); } + markStateUpdateScheduled(fiber, lane); } function isRenderPhaseUpdate(fiber) { var alternate = fiber.alternate; @@ -3987,7 +4064,7 @@ var ContextOnlyDispatcher = { useTransition: throwInvalidHookError, useMutableSource: throwInvalidHookError, useSyncExternalStore: throwInvalidHookError, - useOpaqueIdentifier: throwInvalidHookError, + useId: throwInvalidHookError, unstable_isNewReconciler: !1 }, HooksDispatcherOnMount = { @@ -4075,18 +4152,12 @@ var ContextOnlyDispatcher = { mountWorkInProgressHook().memoizedState = _mountState2; return [isPending, _mountState2]; }, - useMutableSource: function(source, getSnapshot, subscribe) { - var hook = mountWorkInProgressHook(); - hook.memoizedState = { - refs: { getSnapshot: getSnapshot, setSnapshot: null }, - source: source, - subscribe: subscribe - }; - return useMutableSource(hook, source, getSnapshot, subscribe); - }, + useMutableSource: function() {}, useSyncExternalStore: mountSyncExternalStore, - useOpaqueIdentifier: function() { - throw Error("Not yet implemented"); + useId: function() { + var hook = mountWorkInProgressHook(); + var id = "r:" + (globalClientIdCounter++).toString(32); + return (hook.memoizedState = id); }, unstable_isNewReconciler: !1 }, @@ -4169,9 +4240,7 @@ var ContextOnlyDispatcher = { } return nextSnapshot; }, - useOpaqueIdentifier: function() { - return updateReducer(basicStateReducer)[0]; - }, + useId: updateId, unstable_isNewReconciler: !1 }, HooksDispatcherOnRerender = { @@ -4214,9 +4283,7 @@ var ContextOnlyDispatcher = { }, useMutableSource: updateMutableSource, useSyncExternalStore: mountSyncExternalStore, - useOpaqueIdentifier: function() { - return rerenderReducer(basicStateReducer)[0]; - }, + useId: updateId, unstable_isNewReconciler: !1 }, now$1 = Scheduler.unstable_now, @@ -4312,7 +4379,7 @@ function logCapturedError(boundary, errorInfo) { }); } } -var PossiblyWeakMap = "function" === typeof WeakMap ? WeakMap : Map; +var PossiblyWeakMap$1 = "function" === typeof WeakMap ? WeakMap : Map; function createRootErrorUpdate(fiber, errorInfo, lane) { lane = createUpdate(-1, lane); lane.tag = 3; @@ -4329,9 +4396,9 @@ function createClassErrorUpdate(fiber, errorInfo, lane) { lane.tag = 3; var getDerivedStateFromError = fiber.type.getDerivedStateFromError; if ("function" === typeof getDerivedStateFromError) { - var error = errorInfo.value; + var error$35 = errorInfo.value; lane.payload = function() { - return getDerivedStateFromError(error); + return getDerivedStateFromError(error$35); }; lane.callback = function() { logCapturedError(fiber, errorInfo); @@ -4521,14 +4588,14 @@ function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { break; case "collapsed": lastTailNode = renderState.tail; - for (var lastTailNode$37 = null; null !== lastTailNode; ) - null !== lastTailNode.alternate && (lastTailNode$37 = lastTailNode), + for (var lastTailNode$42 = null; null !== lastTailNode; ) + null !== lastTailNode.alternate && (lastTailNode$42 = lastTailNode), (lastTailNode = lastTailNode.sibling); - null === lastTailNode$37 + null === lastTailNode$42 ? hasRenderedATailFallback || null === renderState.tail ? (renderState.tail = null) : (renderState.tail.sibling = null) - : (lastTailNode$37.sibling = null); + : (lastTailNode$42.sibling = null); } } function bubbleProperties(completedWork) { @@ -4540,53 +4607,53 @@ function bubbleProperties(completedWork) { if (didBailout) if (0 !== (completedWork.mode & 2)) { for ( - var treeBaseDuration$39 = completedWork.selfBaseDuration, - child$40 = completedWork.child; - null !== child$40; + var treeBaseDuration$44 = completedWork.selfBaseDuration, + child$45 = completedWork.child; + null !== child$45; ) - (newChildLanes |= child$40.lanes | child$40.childLanes), - (subtreeFlags |= child$40.subtreeFlags & 7340032), - (subtreeFlags |= child$40.flags & 7340032), - (treeBaseDuration$39 += child$40.treeBaseDuration), - (child$40 = child$40.sibling); - completedWork.treeBaseDuration = treeBaseDuration$39; + (newChildLanes |= child$45.lanes | child$45.childLanes), + (subtreeFlags |= child$45.subtreeFlags & 14680064), + (subtreeFlags |= child$45.flags & 14680064), + (treeBaseDuration$44 += child$45.treeBaseDuration), + (child$45 = child$45.sibling); + completedWork.treeBaseDuration = treeBaseDuration$44; } else for ( - treeBaseDuration$39 = completedWork.child; - null !== treeBaseDuration$39; + treeBaseDuration$44 = completedWork.child; + null !== treeBaseDuration$44; ) (newChildLanes |= - treeBaseDuration$39.lanes | treeBaseDuration$39.childLanes), - (subtreeFlags |= treeBaseDuration$39.subtreeFlags & 7340032), - (subtreeFlags |= treeBaseDuration$39.flags & 7340032), - (treeBaseDuration$39.return = completedWork), - (treeBaseDuration$39 = treeBaseDuration$39.sibling); + treeBaseDuration$44.lanes | treeBaseDuration$44.childLanes), + (subtreeFlags |= treeBaseDuration$44.subtreeFlags & 14680064), + (subtreeFlags |= treeBaseDuration$44.flags & 14680064), + (treeBaseDuration$44.return = completedWork), + (treeBaseDuration$44 = treeBaseDuration$44.sibling); else if (0 !== (completedWork.mode & 2)) { - treeBaseDuration$39 = completedWork.actualDuration; - child$40 = completedWork.selfBaseDuration; + treeBaseDuration$44 = completedWork.actualDuration; + child$45 = completedWork.selfBaseDuration; for (var child = completedWork.child; null !== child; ) (newChildLanes |= child.lanes | child.childLanes), (subtreeFlags |= child.subtreeFlags), (subtreeFlags |= child.flags), - (treeBaseDuration$39 += child.actualDuration), - (child$40 += child.treeBaseDuration), + (treeBaseDuration$44 += child.actualDuration), + (child$45 += child.treeBaseDuration), (child = child.sibling); - completedWork.actualDuration = treeBaseDuration$39; - completedWork.treeBaseDuration = child$40; + completedWork.actualDuration = treeBaseDuration$44; + completedWork.treeBaseDuration = child$45; } else for ( - treeBaseDuration$39 = completedWork.child; - null !== treeBaseDuration$39; + treeBaseDuration$44 = completedWork.child; + null !== treeBaseDuration$44; ) (newChildLanes |= - treeBaseDuration$39.lanes | treeBaseDuration$39.childLanes), - (subtreeFlags |= treeBaseDuration$39.subtreeFlags), - (subtreeFlags |= treeBaseDuration$39.flags), - (treeBaseDuration$39.return = completedWork), - (treeBaseDuration$39 = treeBaseDuration$39.sibling); + treeBaseDuration$44.lanes | treeBaseDuration$44.childLanes), + (subtreeFlags |= treeBaseDuration$44.subtreeFlags), + (subtreeFlags |= treeBaseDuration$44.flags), + (treeBaseDuration$44.return = completedWork), + (treeBaseDuration$44 = treeBaseDuration$44.sibling); completedWork.subtreeFlags |= subtreeFlags; completedWork.childLanes = newChildLanes; return didBailout; @@ -4618,6 +4685,7 @@ function completeSuspendedOffscreenHostContainer(current, workInProgress) { } function completeWork(current, workInProgress, renderLanes) { var newProps = workInProgress.pendingProps; + popTreeContext(workInProgress); switch (workInProgress.tag) { case 2: case 16: @@ -4747,7 +4815,7 @@ function completeWork(current, workInProgress, renderLanes) { workInProgressRootExitStatus = 4; null === workInProgressRoot || (0 === (workInProgressRootSkippedLanes & 268435455) && - 0 === (workInProgressRootUpdatedLanes & 268435455)) || + 0 === (workInProgressRootInterleavedUpdatedLanes & 268435455)) || markRootSuspended$1( workInProgressRoot, workInProgressRootRenderLanes @@ -4807,7 +4875,7 @@ function completeWork(current, workInProgress, renderLanes) { for (newProps = workInProgress.child; null !== newProps; ) (renderLanes = newProps), (renderedTail = current), - (renderLanes.flags &= 7340034), + (renderLanes.flags &= 14680066), (type = renderLanes.alternate), null === type ? ((renderLanes.childLanes = 0), @@ -4950,6 +5018,7 @@ function updateForwardRef( Component = Component.render; var ref = workInProgress.ref; prepareToReadContext(workInProgress, renderLanes); + markComponentRenderStarted(workInProgress); nextProps = renderWithHooks( current, workInProgress, @@ -4958,6 +5027,7 @@ function updateForwardRef( ref, renderLanes ); + markComponentRenderStopped(); if (null !== current && !didReceiveUpdate) return ( (workInProgress.updateQueue = current.updateQueue), @@ -5152,6 +5222,7 @@ function updateFunctionComponent( : contextStackCursor.current; context = getMaskedContext(workInProgress, context); prepareToReadContext(workInProgress, renderLanes); + markComponentRenderStarted(workInProgress); Component = renderWithHooks( current, workInProgress, @@ -5160,6 +5231,7 @@ function updateFunctionComponent( context, renderLanes ); + markComponentRenderStopped(); if (null !== current && !didReceiveUpdate) return ( (workInProgress.updateQueue = current.updateQueue), @@ -5396,7 +5468,10 @@ function finishClassComponent( ) { var nextChildren = null; profilerStartTime = -1; - } else nextChildren = shouldUpdate.render(); + } else + markComponentRenderStarted(workInProgress), + (nextChildren = shouldUpdate.render()), + markComponentRenderStopped(); workInProgress.flags |= 1; null !== current && didCaptureError ? ((didCaptureError = nextChildren), @@ -5429,7 +5504,7 @@ function pushHostRootContext(workInProgress) { pushTopLevelContextObject(workInProgress, root.context, !1); pushHostContainer(workInProgress, root.containerInfo); } -var SUSPENDED_MARKER = { dehydrated: null, retryLane: 0 }; +var SUSPENDED_MARKER = { dehydrated: null, treeContext: null, retryLane: 0 }; function mountSuspenseOffscreenState(renderLanes) { return { baseLanes: renderLanes, cachePool: null }; } @@ -5666,7 +5741,7 @@ function updateSuspenseFallbackChildren( primaryChildren ))), (current.subtreeFlags = - currentPrimaryChildFragment.subtreeFlags & 7340032)); + currentPrimaryChildFragment.subtreeFlags & 14680064)); null !== currentFallbackChildFragment ? (fallbackChildren = createWorkInProgress( currentFallbackChildFragment, @@ -5898,6 +5973,7 @@ function attemptEarlyBailoutIfNoScheduledUpdate( return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); } function unwindWork(workInProgress) { + popTreeContext(workInProgress); switch (workInProgress.tag) { case 1: isContextProvider(workInProgress.type) && popContext(); @@ -5964,16 +6040,16 @@ function safelyDetachRef(current, nearestMountedAncestor) { recordLayoutEffectDuration(current); } else ref(null); - } catch (error) { - captureCommitPhaseError(current, nearestMountedAncestor, error); + } catch (error$92) { + captureCommitPhaseError(current, nearestMountedAncestor, error$92); } else ref.current = null; } function safelyCallDestroy(current, nearestMountedAncestor, destroy) { try { destroy(); - } catch (error) { - captureCommitPhaseError(current, nearestMountedAncestor, error); + } catch (error$93) { + captureCommitPhaseError(current, nearestMountedAncestor, error$93); } } var shouldFireAfterActiveInstanceBlur = !1; @@ -6022,8 +6098,8 @@ function commitBeforeMutationEffects(root, firstChild) { "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." ); } - } catch (error) { - captureCommitPhaseError(root, root.return, error); + } catch (error$94) { + captureCommitPhaseError(root, root.return, error$94); } firstChild = root.sibling; if (null !== firstChild) { @@ -6050,25 +6126,63 @@ function commitHookEffectListUnmount( if ((effect.tag & flags) === flags) { var destroy = effect.destroy; effect.destroy = void 0; - void 0 !== destroy && + if (void 0 !== destroy) { + if (0 !== (flags & 8)) { + if (supportsUserTimingV3) { + var componentName = + getComponentNameFromFiber(finishedWork) || "Unknown"; + markAndClear( + "--component-passive-effect-unmount-start-" + componentName + ); + } + } else + 0 !== (flags & 4) && + markComponentLayoutEffectUnmountStarted(finishedWork); safelyCallDestroy(finishedWork, nearestMountedAncestor, destroy); + 0 !== (flags & 8) + ? supportsUserTimingV3 && + markAndClear("--component-passive-effect-unmount-stop") + : 0 !== (flags & 4) && markComponentLayoutEffectUnmountStopped(); + } } effect = effect.next; } while (effect !== updateQueue); } } -function commitHookEffectListMount(tag, finishedWork) { - finishedWork = finishedWork.updateQueue; - finishedWork = null !== finishedWork ? finishedWork.lastEffect : null; - if (null !== finishedWork) { - var effect = (finishedWork = finishedWork.next); +function commitHookEffectListMount(flags, finishedWork) { + var updateQueue = finishedWork.updateQueue; + updateQueue = null !== updateQueue ? updateQueue.lastEffect : null; + if (null !== updateQueue) { + var effect = (updateQueue = updateQueue.next); do { - if ((effect.tag & tag) === tag) { - var create$86 = effect.create; - effect.destroy = create$86(); + if ((effect.tag & flags) === flags) { + if (0 !== (flags & 8)) { + if (supportsUserTimingV3) { + var componentName = + getComponentNameFromFiber(finishedWork) || "Unknown"; + markAndClear( + "--component-passive-effect-mount-start-" + componentName + ); + } + } else + 0 !== (flags & 4) && + supportsUserTimingV3 && + ((componentName = + getComponentNameFromFiber(finishedWork) || "Unknown"), + markAndClear( + "--component-layout-effect-mount-start-" + componentName + )); + componentName = effect.create; + effect.destroy = componentName(); + 0 !== (flags & 8) + ? supportsUserTimingV3 && + markAndClear("--component-passive-effect-mount-stop") + : 0 !== (flags & 4) && + supportsUserTimingV3 && + markAndClear("--component-layout-effect-mount-stop"); } effect = effect.next; - } while (effect !== finishedWork); + } while (effect !== updateQueue); } } function detachFiberAfterEffects(fiber) { @@ -6192,13 +6306,17 @@ function commitMutationEffects(root, firstChild, committedLanes) { var _effect = effect, destroy = _effect.destroy, tag = _effect.tag; - void 0 === destroy || - (0 === (tag & 2) && 0 === (tag & 4)) || - (current.mode & 2 - ? (startLayoutEffectTimer(), - safelyCallDestroy(current, root, destroy), - recordLayoutEffectDuration(current)) - : safelyCallDestroy(current, root, destroy)); + void 0 !== destroy && + (0 !== (tag & 2) + ? safelyCallDestroy(current, root, destroy) + : 0 !== (tag & 4) && + (markComponentLayoutEffectUnmountStarted(current), + current.mode & 2 + ? (startLayoutEffectTimer(), + safelyCallDestroy(current, root, destroy), + recordLayoutEffectDuration(current)) + : safelyCallDestroy(current, root, destroy), + markComponentLayoutEffectUnmountStopped())); effect = effect.next; } while (effect !== firstEffect); } @@ -6223,8 +6341,8 @@ function commitMutationEffects(root, firstChild, committedLanes) { recordLayoutEffectDuration(effect); } else _effect.componentWillUnmount(); - } catch (error) { - captureCommitPhaseError(current, root, error); + } catch (error$91) { + captureCommitPhaseError(current, root, error$91); } break; case 5: @@ -6249,8 +6367,8 @@ function commitMutationEffects(root, firstChild, committedLanes) { var alternate = childToDelete.alternate; null !== alternate && (alternate.return = null); childToDelete.return = null; - } catch (error) { - captureCommitPhaseError(childToDelete, root, error); + } catch (error$101) { + captureCommitPhaseError(childToDelete, root, error$101); } } firstChild = root.child; @@ -6282,8 +6400,11 @@ function commitMutationEffects(root, firstChild, committedLanes) { switch (root.tag) { case 13: if (null !== root.memoizedState) { - var current$92 = root.alternate; - if (null === current$92 || null === current$92.memoizedState) + var current$103 = root.alternate; + if ( + null === current$103 || + null === current$103.memoizedState + ) globalMostRecentFallbackTime = now(); } } @@ -6305,8 +6426,8 @@ function commitMutationEffects(root, firstChild, committedLanes) { case 4: commitWork(root.alternate, root); } - } catch (error) { - captureCommitPhaseError(root, root.return, error); + } catch (error$102) { + captureCommitPhaseError(root, root.return, error$102); } firstChild = root.sibling; if (null !== firstChild) { @@ -6393,22 +6514,22 @@ function commitLayoutEffects(finishedWork, root, committedLanes) { commitUpdateQueue(committedLanes, updateQueue, instance); break; case 3: - var updateQueue$88 = committedLanes.updateQueue; - if (null !== updateQueue$88) { - var instance$89 = null; + var updateQueue$97 = committedLanes.updateQueue; + if (null !== updateQueue$97) { + var instance$98 = null; if (null !== committedLanes.child) switch (committedLanes.child.tag) { case 5: - instance$89 = + instance$98 = committedLanes.child.stateNode.canonical; break; case 1: - instance$89 = committedLanes.child.stateNode; + instance$98 = committedLanes.child.stateNode; } commitUpdateQueue( committedLanes, - updateQueue$88, - instance$89 + updateQueue$97, + instance$98 ); } break; @@ -6424,7 +6545,7 @@ function commitLayoutEffects(finishedWork, root, committedLanes) { onCommit = _finishedWork$memoize2.onCommit, onRender = _finishedWork$memoize2.onRender, effectDuration = committedLanes.stateNode.effectDuration; - instance$89 = commitTime; + instance$98 = commitTime; current = null === current ? "mount" : "update"; currentUpdateIsNested && (current = "nested-update"); "function" === typeof onRender && @@ -6434,14 +6555,14 @@ function commitLayoutEffects(finishedWork, root, committedLanes) { committedLanes.actualDuration, committedLanes.treeBaseDuration, committedLanes.actualStartTime, - instance$89 + instance$98 ); "function" === typeof onCommit && onCommit( committedLanes.memoizedProps.id, current, effectDuration, - instance$89 + instance$98 ); enqueuePendingPassiveProfilerEffect(committedLanes); var parentFiber = committedLanes.return; @@ -6471,34 +6592,34 @@ function commitLayoutEffects(finishedWork, root, committedLanes) { ); } if (committedLanes.flags & 512) { - instance$89 = void 0; + instance$98 = void 0; current = committedLanes; var ref = current.ref; if (null !== ref) { var instance$jscomp$0 = current.stateNode; switch (current.tag) { case 5: - instance$89 = instance$jscomp$0.canonical; + instance$98 = instance$jscomp$0.canonical; break; default: - instance$89 = instance$jscomp$0; + instance$98 = instance$jscomp$0; } if ("function" === typeof ref) if (current.mode & 2) try { - startLayoutEffectTimer(), ref(instance$89); + startLayoutEffectTimer(), ref(instance$98); } finally { recordLayoutEffectDuration(current); } - else ref(instance$89); - else ref.current = instance$89; + else ref(instance$98); + else ref.current = instance$98; } } - } catch (error) { + } catch (error$110) { captureCommitPhaseError( committedLanes, committedLanes.return, - error + error$110 ); } } @@ -6506,10 +6627,10 @@ function commitLayoutEffects(finishedWork, root, committedLanes) { nextEffect = null; break; } - instance$89 = committedLanes.sibling; - if (null !== instance$89) { - instance$89.return = committedLanes.return; - nextEffect = instance$89; + instance$98 = committedLanes.sibling; + if (null !== instance$98) { + instance$98.return = committedLanes.return; + nextEffect = instance$98; break; } nextEffect = committedLanes.return; @@ -6529,7 +6650,8 @@ var ceil = Math.ceil, workInProgressRootExitStatus = 0, workInProgressRootFatalError = null, workInProgressRootSkippedLanes = 0, - workInProgressRootUpdatedLanes = 0, + workInProgressRootInterleavedUpdatedLanes = 0, + workInProgressRootRenderPhaseUpdatedLanes = 0, workInProgressRootPingedLanes = 0, globalMostRecentFallbackTime = 0, workInProgressRootRenderTargetTime = Infinity, @@ -6589,18 +6711,21 @@ function scheduleUpdateOnFiber(fiber, lane, eventTime) { )); var root = markUpdateLaneFromFiberToRoot(fiber, lane); if (null === root) return null; - isDevToolsPresent && addFiberToLanesMap(root, fiber, lane); markRootUpdated(root, lane, eventTime); - root === workInProgressRoot && - (0 === (executionContext & 2) && (workInProgressRootUpdatedLanes |= lane), - 4 === workInProgressRootExitStatus && - markRootSuspended$1(root, workInProgressRootRenderLanes)); - ensureRootIsScheduled(root, eventTime); - 1 === lane && - 0 === executionContext && - 0 === (fiber.mode & 1) && - ((workInProgressRootRenderTargetTime = now() + 500), - includesLegacySyncCallbacks && flushSyncCallbacks()); + 0 !== (executionContext & 2) && root === workInProgressRoot + ? (workInProgressRootRenderPhaseUpdatedLanes |= lane) + : (isDevToolsPresent && addFiberToLanesMap(root, fiber, lane), + root === workInProgressRoot && + (0 === (executionContext & 2) && + (workInProgressRootInterleavedUpdatedLanes |= lane), + 4 === workInProgressRootExitStatus && + markRootSuspended$1(root, workInProgressRootRenderLanes)), + ensureRootIsScheduled(root, eventTime), + 1 === lane && + 0 === executionContext && + 0 === (fiber.mode & 1) && + ((workInProgressRootRenderTargetTime = now() + 500), + includesLegacySyncCallbacks && flushSyncCallbacks())); return root; } function markUpdateLaneFromFiberToRoot(sourceFiber, lane) { @@ -6726,6 +6851,7 @@ function performConcurrentWorkOnRoot(root, didTimeout) { workInProgressRootRenderTargetTime = now() + 500; prepareFreshStack(root, didTimeout); } + supportsUserTimingV3 && markAndClear("--render-start-" + didTimeout); do try { workLoopConcurrent(); @@ -6738,8 +6864,10 @@ function performConcurrentWorkOnRoot(root, didTimeout) { ReactCurrentDispatcher$2.current = prevDispatcher; executionContext = prevExecutionContext; null !== workInProgress - ? (didTimeout = 0) - : ((workInProgressRoot = null), + ? (supportsUserTimingV3 && markAndClear("--render-yield"), + (didTimeout = 0)) + : (supportsUserTimingV3 && markAndClear("--render-stop"), + (workInProgressRoot = null), (workInProgressRootRenderLanes = 0), (didTimeout = workInProgressRootExitStatus)); } @@ -6856,9 +6984,15 @@ function recoverFromConcurrentError(root, errorRetryLanes) { var prevExecutionContext = executionContext; executionContext |= 8; root.isDehydrated && ((root.isDehydrated = !1), shim(root.containerInfo)); - root = renderRootSync(root, errorRetryLanes); + for ( + var exitStatus, i = 0; + 50 > i && + ((exitStatus = renderRootSync(root, errorRetryLanes)), + 2 === exitStatus && 0 !== workInProgressRootRenderPhaseUpdatedLanes); + i++ + ); executionContext = prevExecutionContext; - return root; + return exitStatus; } function isRenderConsistentWithExternalStores(finishedWork) { for (var node = finishedWork; ; ) { @@ -6874,7 +7008,7 @@ function isRenderConsistentWithExternalStores(finishedWork) { check = check.value; try { if (!objectIs(getSnapshot(), check)) return !1; - } catch (error) { + } catch (error$115) { return !1; } } @@ -6896,7 +7030,7 @@ function isRenderConsistentWithExternalStores(finishedWork) { } function markRootSuspended$1(root, suspendedLanes) { suspendedLanes &= ~workInProgressRootPingedLanes; - suspendedLanes &= ~workInProgressRootUpdatedLanes; + suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes; root.suspendedLanes |= suspendedLanes; root.pingedLanes &= ~suspendedLanes; for (root = root.expirationTimes; 0 < suspendedLanes; ) { @@ -6916,13 +7050,10 @@ function performSyncWorkOnRoot(root) { if (0 === (lanes & 1)) return ensureRootIsScheduled(root, now()), null; var exitStatus = renderRootSync(root, lanes); if (0 !== root.tag && 2 === exitStatus) { - var prevExecutionContext = executionContext; - executionContext |= 8; - root.isDehydrated && ((root.isDehydrated = !1), shim(root.containerInfo)); var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root); 0 !== errorRetryLanes && - ((lanes = errorRetryLanes), (exitStatus = renderRootSync(root, lanes))); - executionContext = prevExecutionContext; + ((lanes = errorRetryLanes), + (exitStatus = recoverFromConcurrentError(root, errorRetryLanes))); } if (1 === exitStatus) throw ((exitStatus = workInProgressRootFatalError), @@ -6949,6 +7080,7 @@ function prepareFreshStack(root, lanes) { if (null !== workInProgress) for (timeoutHandle = workInProgress.return; null !== timeoutHandle; ) { var interruptedWork = timeoutHandle; + popTreeContext(interruptedWork); switch (interruptedWork.tag) { case 1: interruptedWork = interruptedWork.type.childContextTypes; @@ -6988,7 +7120,7 @@ function prepareFreshStack(root, lanes) { workInProgressRootRenderLanes = subtreeRenderLanes = lanes; workInProgressRootExitStatus = 0; workInProgressRootFatalError = null; - workInProgressRootPingedLanes = workInProgressRootUpdatedLanes = workInProgressRootSkippedLanes = 0; + workInProgressRootPingedLanes = workInProgressRootRenderPhaseUpdatedLanes = workInProgressRootInterleavedUpdatedLanes = workInProgressRootSkippedLanes = 0; if (null !== interleavedQueues) { for (root = 0; root < interleavedQueues.length; root++) if ( @@ -7009,7 +7141,7 @@ function prepareFreshStack(root, lanes) { interleavedQueues = null; } } -function handleError(root$jscomp$0, thrownValue) { +function handleError(root, thrownValue$jscomp$0) { do { var erroredWork = workInProgress; try { @@ -7033,27 +7165,54 @@ function handleError(root$jscomp$0, thrownValue) { ReactCurrentOwner$2.current = null; if (null === erroredWork || null === erroredWork.return) { workInProgressRootExitStatus = 1; - workInProgressRootFatalError = thrownValue; + workInProgressRootFatalError = thrownValue$jscomp$0; workInProgress = null; break; } erroredWork.mode & 2 && stopProfilerTimerIfRunningAndRecordDelta(erroredWork, !0); + markComponentRenderStopped(); + if ( + null !== thrownValue$jscomp$0 && + "object" === typeof thrownValue$jscomp$0 && + "function" === typeof thrownValue$jscomp$0.then + ) + markComponentSuspended( + erroredWork, + thrownValue$jscomp$0, + workInProgressRootRenderLanes + ); + else { + var fiber = erroredWork, + thrownValue = thrownValue$jscomp$0; + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown", + phase = null === fiber.alternate ? "mount" : "update"; + fiber = ""; + null !== thrownValue && + "object" === typeof thrownValue && + "string" === typeof thrownValue.message + ? (fiber = thrownValue.message) + : "string" === typeof thrownValue && (fiber = thrownValue); + markAndClear("--error-" + componentName + "-" + phase + "-" + fiber); + } + } a: { - var root = root$jscomp$0, - returnFiber = erroredWork.return, + thrownValue = root; + var returnFiber = erroredWork.return, sourceFiber = erroredWork, - value = thrownValue; - thrownValue = workInProgressRootRenderLanes; + value = thrownValue$jscomp$0; + thrownValue$jscomp$0 = workInProgressRootRenderLanes; sourceFiber.flags |= 32768; - isDevToolsPresent && restorePendingUpdaters(root, thrownValue); + isDevToolsPresent && + restorePendingUpdaters(thrownValue, thrownValue$jscomp$0); if ( null !== value && "object" === typeof value && "function" === typeof value.then ) { - var wakeable = value, - sourceFiber$jscomp$0 = sourceFiber, + fiber = value; + var sourceFiber$jscomp$0 = sourceFiber, tag = sourceFiber$jscomp$0.tag; if ( 0 === (sourceFiber$jscomp$0.mode & 1) && @@ -7071,7 +7230,7 @@ function handleError(root$jscomp$0, thrownValue) { b: { sourceFiber$jscomp$0 = returnFiber; var sourceFiber$jscomp$1 = sourceFiber, - rootRenderLanes = thrownValue, + rootRenderLanes = thrownValue$jscomp$0, hasInvisibleParentBoundary = 0 !== (suspenseStackCursor.current & 1), node = sourceFiber$jscomp$0; @@ -7137,32 +7296,33 @@ function handleError(root$jscomp$0, thrownValue) { value = void 0; sourceFiber = suspenseBoundary; if (sourceFiber.mode & 1) { - var pingCache = root.pingCache; + var pingCache = thrownValue.pingCache; null === pingCache - ? ((pingCache = root.pingCache = new PossiblyWeakMap()), + ? ((pingCache = thrownValue.pingCache = new PossiblyWeakMap$1()), (value = new Set()), - pingCache.set(wakeable, value)) - : ((value = pingCache.get(wakeable)), + pingCache.set(fiber, value)) + : ((value = pingCache.get(fiber)), void 0 === value && - ((value = new Set()), pingCache.set(wakeable, value))); - if (!value.has(thrownValue)) { - value.add(thrownValue); + ((value = new Set()), pingCache.set(fiber, value))); + if (!value.has(thrownValue$jscomp$0)) { + value.add(thrownValue$jscomp$0); var ping = pingSuspendedRoot.bind( null, - root, - wakeable, - thrownValue + thrownValue, + fiber, + thrownValue$jscomp$0 ); - isDevToolsPresent && restorePendingUpdaters(root, thrownValue); - wakeable.then(ping, ping); + isDevToolsPresent && + restorePendingUpdaters(thrownValue, thrownValue$jscomp$0); + fiber.then(ping, ping); } } var wakeables = sourceFiber.updateQueue; if (null === wakeables) { var updateQueue = new Set(); - updateQueue.add(wakeable); + updateQueue.add(fiber); sourceFiber.updateQueue = updateQueue; - } else wakeables.add(wakeable); + } else wakeables.add(fiber); break a; } else value = Error( @@ -7173,51 +7333,51 @@ function handleError(root$jscomp$0, thrownValue) { 4 !== workInProgressRootExitStatus && (workInProgressRootExitStatus = 2); value = createCapturedValue(value, sourceFiber); - root = returnFiber; + thrownValue = returnFiber; do { - switch (root.tag) { + switch (thrownValue.tag) { case 3: - wakeable = value; - root.flags |= 65536; - thrownValue &= -thrownValue; - root.lanes |= thrownValue; + fiber = value; + thrownValue.flags |= 65536; + thrownValue$jscomp$0 &= -thrownValue$jscomp$0; + thrownValue.lanes |= thrownValue$jscomp$0; var update$jscomp$0 = createRootErrorUpdate( - root, - wakeable, - thrownValue + thrownValue, + fiber, + thrownValue$jscomp$0 ); - enqueueCapturedUpdate(root, update$jscomp$0); + enqueueCapturedUpdate(thrownValue, update$jscomp$0); break a; case 1: - wakeable = value; - var ctor = root.type, - instance = root.stateNode; + fiber = value; + var ctor = thrownValue.type, + instance = thrownValue.stateNode; if ( - 0 === (root.flags & 128) && + 0 === (thrownValue.flags & 128) && ("function" === typeof ctor.getDerivedStateFromError || (null !== instance && "function" === typeof instance.componentDidCatch && (null === legacyErrorBoundariesThatAlreadyFailed || !legacyErrorBoundariesThatAlreadyFailed.has(instance)))) ) { - root.flags |= 65536; - thrownValue &= -thrownValue; - root.lanes |= thrownValue; - var update$33 = createClassErrorUpdate( - root, - wakeable, - thrownValue + thrownValue.flags |= 65536; + thrownValue$jscomp$0 &= -thrownValue$jscomp$0; + thrownValue.lanes |= thrownValue$jscomp$0; + var update$38 = createClassErrorUpdate( + thrownValue, + fiber, + thrownValue$jscomp$0 ); - enqueueCapturedUpdate(root, update$33); + enqueueCapturedUpdate(thrownValue, update$38); break a; } } - root = root.return; - } while (null !== root); + thrownValue = thrownValue.return; + } while (null !== thrownValue); } completeUnitOfWork(erroredWork); } catch (yetAnotherThrownValue) { - thrownValue = yetAnotherThrownValue; + thrownValue$jscomp$0 = yetAnotherThrownValue; workInProgress === erroredWork && null !== erroredWork && (workInProgress = erroredWork = erroredWork.return); @@ -7245,6 +7405,7 @@ function renderRootSync(root, lanes) { } prepareFreshStack(root, lanes); } + supportsUserTimingV3 && markAndClear("--render-start-" + lanes); do try { workLoopSync(); @@ -7260,6 +7421,7 @@ function renderRootSync(root, lanes) { throw Error( "Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue." ); + supportsUserTimingV3 && markAndClear("--render-stop"); workInProgressRoot = null; workInProgressRootRenderLanes = 0; return workInProgressRootExitStatus; @@ -7352,7 +7514,15 @@ function commitRootImpl(root, renderPriorityLevel) { throw Error("Should not already be working."); var finishedWork = root.finishedWork, lanes = root.finishedLanes; - if (null === finishedWork) return null; + supportsUserTimingV3 && + (markAndClear("--commit-start-" + lanes), + markAndClear("--react-version-18.0.0-3fcd81dd1-20211102"), + markAndClear("--profiler-version-1"), + getLaneLabels(), + markAndClear("--react-lane-labels-" + laneLabels.join(",")), + markInternalModuleRanges()); + if (null === finishedWork) + return supportsUserTimingV3 && markAndClear("--commit-stop"), null; root.finishedWork = null; root.finishedLanes = 0; if (finishedWork === root.current) @@ -7387,7 +7557,9 @@ function commitRootImpl(root, renderPriorityLevel) { commitTime = now$1(); commitMutationEffects(root, finishedWork, lanes); root.current = finishedWork; + supportsUserTimingV3 && markAndClear("--layout-effects-start-" + lanes); commitLayoutEffects(finishedWork, root, lanes); + supportsUserTimingV3 && markAndClear("--layout-effects-stop"); requestPaint(); executionContext = prevExecutionContext; currentUpdatePriority = previousPriority; @@ -7418,6 +7590,7 @@ function commitRootImpl(root, renderPriorityLevel) { : ((nestedUpdateCount = 0), (rootWithNestedUpdates = root))) : (nestedUpdateCount = 0); flushSyncCallbacks(); + supportsUserTimingV3 && markAndClear("--commit-stop"); return null; } function flushPassiveEffects() { @@ -7432,11 +7605,14 @@ function flushPassiveEffects() { var JSCompiler_inline_result = !1; else { renderPriority = rootWithPendingPassiveEffects; + var lanes = pendingPassiveEffectsLanes; rootWithPendingPassiveEffects = null; pendingPassiveEffectsLanes = 0; if (0 !== (executionContext & 6)) throw Error("Cannot flush passive effects while already rendering."); - var prevExecutionContext = executionContext; + supportsUserTimingV3 && + markAndClear("--passive-effects-start-" + lanes); + lanes = executionContext; executionContext |= 4; for (nextEffect = renderPriority.current; null !== nextEffect; ) { var fiber = nextEffect, @@ -7546,8 +7722,12 @@ function flushPassiveEffects() { } } else commitHookEffectListMount(9, fiberToDelete); } - } catch (error) { - captureCommitPhaseError(deletions, deletions.return, error); + } catch (error$111) { + captureCommitPhaseError( + deletions, + deletions.return, + error$111 + ); } if (deletions === child) { nextEffect = null; @@ -7599,7 +7779,8 @@ function flushPassiveEffects() { } } } - executionContext = prevExecutionContext; + supportsUserTimingV3 && markAndClear("--passive-effects-stop"); + executionContext = lanes; flushSyncCallbacks(); if ( injectedHook && @@ -7756,6 +7937,7 @@ beginWork$1 = function(current, workInProgress, renderLanes) { contextStackCursor.current ); prepareToReadContext(workInProgress, renderLanes); + markComponentRenderStarted(workInProgress); context = renderWithHooks( null, workInProgress, @@ -7764,6 +7946,7 @@ beginWork$1 = function(current, workInProgress, renderLanes) { context, renderLanes ); + markComponentRenderStopped(); workInProgress.flags |= 1; if ( "object" === typeof context && @@ -8089,7 +8272,9 @@ beginWork$1 = function(current, workInProgress, renderLanes) { (Component = workInProgress.pendingProps.children), prepareToReadContext(workInProgress, renderLanes), (context = readContext(context)), + markComponentRenderStarted(workInProgress), (Component = Component(context)), + markComponentRenderStopped(), (workInProgress.flags |= 1), reconcileChildren(current, workInProgress, Component, renderLanes), workInProgress.child @@ -8220,7 +8405,7 @@ function createWorkInProgress(current, pendingProps) { (workInProgress.deletions = null), (workInProgress.actualDuration = 0), (workInProgress.actualStartTime = -1)); - workInProgress.flags = current.flags & 7340032; + workInProgress.flags = current.flags & 14680064; workInProgress.childLanes = current.childLanes; workInProgress.lanes = current.lanes; workInProgress.child = current.child; @@ -8409,6 +8594,7 @@ function updateContainer(element, container, parentComponent, callback) { var current = container.current, eventTime = requestEventTime(), lane = requestUpdateLane(current); + supportsUserTimingV3 && markAndClear("--schedule-render-" + lane); a: if (parentComponent) { parentComponent = parentComponent._reactInternals; b: { @@ -8583,10 +8769,10 @@ batchedUpdatesImpl = function(fn, a) { } }; var roots = new Map(), - devToolsConfig$jscomp$inline_965 = { + devToolsConfig$jscomp$inline_1005 = { findFiberByHostInstance: getInstanceFromInstance, bundleType: 0, - version: "18.0.0-afcb9cdc9-20211008", + version: "18.0.0-3fcd81dd1-20211102", rendererPackageName: "react-native-renderer", rendererConfig: { getInspectorDataForViewTag: function() { @@ -8601,11 +8787,11 @@ var roots = new Map(), }.bind(null, findNodeHandle) } }; -var internals$jscomp$inline_1239 = { - bundleType: devToolsConfig$jscomp$inline_965.bundleType, - version: devToolsConfig$jscomp$inline_965.version, - rendererPackageName: devToolsConfig$jscomp$inline_965.rendererPackageName, - rendererConfig: devToolsConfig$jscomp$inline_965.rendererConfig, +var internals$jscomp$inline_1288 = { + bundleType: devToolsConfig$jscomp$inline_1005.bundleType, + version: devToolsConfig$jscomp$inline_1005.version, + rendererPackageName: devToolsConfig$jscomp$inline_1005.rendererPackageName, + rendererConfig: devToolsConfig$jscomp$inline_1005.rendererConfig, overrideHookState: null, overrideHookStateDeletePath: null, overrideHookStateRenamePath: null, @@ -8621,26 +8807,26 @@ var internals$jscomp$inline_1239 = { return null === fiber ? null : fiber.stateNode; }, findFiberByHostInstance: - devToolsConfig$jscomp$inline_965.findFiberByHostInstance || + devToolsConfig$jscomp$inline_1005.findFiberByHostInstance || emptyFindFiberByHostInstance, findHostInstancesForRefresh: null, scheduleRefresh: null, scheduleRoot: null, setRefreshHandler: null, getCurrentFiber: null, - reconcilerVersion: "18.0.0-afcb9cdc9-20211008" + reconcilerVersion: "18.0.0-3fcd81dd1-20211102" }; if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { - var hook$jscomp$inline_1240 = __REACT_DEVTOOLS_GLOBAL_HOOK__; + var hook$jscomp$inline_1289 = __REACT_DEVTOOLS_GLOBAL_HOOK__; if ( - !hook$jscomp$inline_1240.isDisabled && - hook$jscomp$inline_1240.supportsFiber + !hook$jscomp$inline_1289.isDisabled && + hook$jscomp$inline_1289.supportsFiber ) try { - (rendererID = hook$jscomp$inline_1240.inject( - internals$jscomp$inline_1239 + (rendererID = hook$jscomp$inline_1289.inject( + internals$jscomp$inline_1288 )), - (injectedHook = hook$jscomp$inline_1240); + (injectedHook = hook$jscomp$inline_1289); } catch (err) {} } exports.createPortal = function(children, containerTag) { @@ -8723,3 +8909,23 @@ exports.stopSurface = function(containerTag) { exports.unmountComponentAtNode = function(containerTag) { this.stopSurface(containerTag); }; + + /** + * 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. + */ + +/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + +// Don't require this file directly; it's embedded by Rollup during build. + +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); +} + diff --git a/Libraries/Renderer/implementations/ReactNativeRenderer-dev.fb.js b/Libraries/Renderer/implementations/ReactNativeRenderer-dev.fb.js index 1c526c7f8cba..42defadcf70c 100644 --- a/Libraries/Renderer/implementations/ReactNativeRenderer-dev.fb.js +++ b/Libraries/Renderer/implementations/ReactNativeRenderer-dev.fb.js @@ -7,14 +7,33 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<> */ 'use strict'; if (__DEV__) { (function() { -"use strict"; + + /** + * 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. + */ + +/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + +// Don't require this file directly; it's embedded by Rollup during build. + +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); +} + "use strict"; var React = require("react"); require("react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore"); @@ -2887,7 +2906,6 @@ var REACT_SUSPENSE_LIST_TYPE = 0xead8; var REACT_MEMO_TYPE = 0xead3; var REACT_LAZY_TYPE = 0xead4; var REACT_SCOPE_TYPE = 0xead7; -var REACT_OPAQUE_ID_TYPE = 0xeae0; var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; var REACT_OFFSCREEN_TYPE = 0xeae2; var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; @@ -2908,7 +2926,6 @@ if (typeof Symbol === "function" && Symbol.for) { REACT_MEMO_TYPE = symbolFor("react.memo"); REACT_LAZY_TYPE = symbolFor("react.lazy"); REACT_SCOPE_TYPE = symbolFor("react.scope"); - REACT_OPAQUE_ID_TYPE = symbolFor("react.opaque.id"); REACT_DEBUG_TRACING_MODE_TYPE = symbolFor("react.debug_trace_mode"); REACT_OFFSCREEN_TYPE = symbolFor("react.offscreen"); REACT_LEGACY_HIDDEN_TYPE = symbolFor("react.legacy_hidden"); @@ -3141,7 +3158,7 @@ function getComponentNameFromFiber(fiber) { var enablePersistentOffscreenHostContainer = dynamicFlags.enablePersistentOffscreenHostContainer; // The rest of the flags are static for better dead code elimination. -var enableSchedulingProfiler = false; +var enableSchedulingProfiler = true; var enableProfilerTimer = true; var enableProfilerCommitHooks = true; var enableLazyElements = false; @@ -3216,6 +3233,9 @@ var ShouldCapture = var ForceUpdateForLegacySuspense = /* */ 131072; +var Forked = + /* */ + 1048576; // Static tags describe aspects of a fiber that are not specific to a render, // e.g. a fiber uses a passive effect (even if there are no updates on this particular render). // This enables us to defer more work in the unmount case, // since we can defer traversing the tree during layout to look for Passive effects, @@ -3223,22 +3243,22 @@ var ForceUpdateForLegacySuspense = var RefStatic = /* */ - 1048576; + 2097152; var LayoutStatic = /* */ - 2097152; + 4194304; var PassiveStatic = /* */ - 4194304; // These flags allow us to traverse to fibers that have effects on mount + 8388608; // These flags allow us to traverse to fibers that have effects on mount // without traversing the entire tree after every commit for // double invoking var MountLayoutDev = /* */ - 8388608; + 16777216; var MountPassiveDev = /* */ - 16777216; // Groups of flags that are used in the commit phase to skip over trees that + 33554432; // Groups of flags that are used in the commit phase to skip over trees that // don't contain effects, by checking subtreeFlags. var BeforeMutationMask = // TODO: Remove Update flag from before mutation phase by re-landing Visibility @@ -4418,6 +4438,24 @@ var ConcurrentUpdatesByDefaultMode = /* */ 32; +// TODO: This is pretty well supported by browsers. Maybe we can drop it. +var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros. +// Based on: +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +var log = Math.log; +var LN2 = Math.LN2; + +function clz32Fallback(x) { + var asUint = x >>> 0; + + if (asUint === 0) { + return 32; + } + + return (31 - ((log(asUint) / LN2) | 0)) | 0; +} + // If those values are changed that package should be rebuilt and redeployed. var TotalLanes = 31; @@ -4530,6 +4568,59 @@ var IdleLane = var OffscreenLane = /* */ 1073741824; // This function is used for the experimental scheduling profiler (react-devtools-scheduling-profiler) +// It should be kept in sync with the Lanes values above. + +function getLabelForLane(lane) { + { + if (lane & SyncLane) { + return "Sync"; + } + + if (lane & InputContinuousHydrationLane) { + return "InputContinuousHydration"; + } + + if (lane & InputContinuousLane) { + return "InputContinuous"; + } + + if (lane & DefaultHydrationLane) { + return "DefaultHydration"; + } + + if (lane & DefaultLane) { + return "Default"; + } + + if (lane & TransitionHydrationLane) { + return "TransitionHydration"; + } + + if (lane & TransitionLanes) { + return "Transition"; + } + + if (lane & RetryLanes) { + return "Retry"; + } + + if (lane & SelectiveHydrationLane) { + return "SelectiveHydration"; + } + + if (lane & IdleHydrationLane) { + return "IdleHydration"; + } + + if (lane & IdleLane) { + return "Idle"; + } + + if (lane & OffscreenLane) { + return "Offscreen"; + } + } +} var NoTimestamp = -1; var nextTransitionLane = TransitionLane1; var nextRetryLane = RetryLane1; @@ -4995,9 +5086,6 @@ function markRootSuspended(root, suspendedLanes) { function markRootPinged(root, pingedLanes, eventTime) { root.pingedLanes |= root.suspendedLanes & pingedLanes; } -function markRootMutableRead(root, updateLane) { - root.mutableReadLanes |= updateLane & root.pendingLanes; -} function markRootFinished(root, remainingLanes) { var noLongerPendingLanes = root.pendingLanes & ~remainingLanes; root.pendingLanes = remainingLanes; // Let's try everything again @@ -5007,7 +5095,6 @@ function markRootFinished(root, remainingLanes) { root.expiredLanes &= remainingLanes; root.mutableReadLanes &= remainingLanes; root.entangledLanes &= remainingLanes; - var entanglements = root.entanglements; var eventTimes = root.eventTimes; var expirationTimes = root.expirationTimes; // Clear the lanes that no longer have pending work @@ -5096,20 +5183,6 @@ function movePendingFibersToMemoized(root, lanes) { lanes &= ~lane; } } -var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros. Only used on lanes, so assume input is an integer. -// Based on: -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 - -var log = Math.log; -var LN2 = Math.LN2; - -function clz32Fallback(lanes) { - if (lanes === 0) { - return 32; - } - - return (31 - ((log(lanes) / LN2) | 0)) | 0; -} var DiscreteEventPriority = SyncLane; var ContinuousEventPriority = InputContinuousLane; @@ -5535,9 +5608,6 @@ function clearContainer(container) { function unhideTextInstance(textInstance, text) { throw new Error("Not yet implemented."); } -function makeClientIdInDEV(warnOnAccessInDEV) { - throw new Error("Not yet implemented"); -} function preparePortalMount(portalInstance) { // noop } @@ -6173,12 +6243,350 @@ function flushSyncCallbacks() { return null; } -var ReactVersion = "18.0.0-afcb9cdc9-20211008"; +var ReactVersion = "18.0.0-3fcd81dd1-20211102"; + +var SCHEDULING_PROFILER_VERSION = 1; + +var getLabelForLane$1 = getLabelForLane; +var TotalLanes$1 = TotalLanes; +/** + * If performance exists and supports the subset of the User Timing API that we + * require. + */ + +var supportsUserTiming = + typeof performance !== "undefined" && + typeof performance.mark === "function" && + typeof performance.clearMarks === "function"; +var supportsUserTimingV3 = false; + +{ + if (supportsUserTiming) { + var CHECK_V3_MARK = "__v3"; + var markOptions = {}; // $FlowFixMe: Ignore Flow complaining about needing a value + + Object.defineProperty(markOptions, "startTime", { + get: function() { + supportsUserTimingV3 = true; + return 0; + }, + set: function() {} + }); + + try { + // $FlowFixMe: Flow expects the User Timing level 2 API. + performance.mark(CHECK_V3_MARK, markOptions); + } catch (error) { + // Ignore + } finally { + performance.clearMarks(CHECK_V3_MARK); + } + } +} + +var laneLabels = []; +function getLaneLabels() { + if (laneLabels.length === 0) { + var lane = 1; + + for (var index = 0; index < TotalLanes$1; index++) { + laneLabels.push(getLabelForLane$1(lane)); + lane *= 2; + } + } + + return laneLabels; +} + +function markLaneToLabelMetadata() { + getLaneLabels(); + markAndClear("--react-lane-labels-" + laneLabels.join(",")); +} + +function markAndClear(name) { + performance.mark(name); + performance.clearMarks(name); +} + +function markVersionMetadata() { + markAndClear("--react-version-" + ReactVersion); + markAndClear("--profiler-version-" + SCHEDULING_PROFILER_VERSION); +} + +function markInternalModuleRanges() { + /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.getInternalModuleRanges === "function" + ) { + var ranges = __REACT_DEVTOOLS_GLOBAL_HOOK__.getInternalModuleRanges(); + + for (var i = 0; i < ranges.length; i++) { + var _ranges$i = ranges[i], + startStackFrame = _ranges$i[0], + stopStackFrame = _ranges$i[1]; + markAndClear("--react-internal-module-start-" + startStackFrame); + markAndClear("--react-internal-module-stop-" + stopStackFrame); + } + } +} + +function markCommitStarted(lanes) { + { + if (supportsUserTimingV3) { + markAndClear("--commit-start-" + lanes); // Certain types of metadata should be logged infrequently. + // Normally we would log this during module init, + // but there's no guarantee a user is profiling at that time. + // Commits happen infrequently (less than renders or state updates) + // so we log this extra information along with a commit. + // It will likely be logged more than once but that's okay. + // + // TODO Once DevTools supports starting/stopping the profiler, + // we can log this data only once (when started) and remove the per-commit logging. + + markVersionMetadata(); + markLaneToLabelMetadata(); + markInternalModuleRanges(); + } + } +} +function markCommitStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--commit-stop"); + } + } +} +function markComponentRenderStarted(fiber) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--component-render-start-" + componentName); + } + } +} +function markComponentRenderStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--component-render-stop"); + } + } +} +function markComponentPassiveEffectMountStarted(fiber) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--component-passive-effect-mount-start-" + componentName); + } + } +} +function markComponentPassiveEffectMountStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--component-passive-effect-mount-stop"); + } + } +} +function markComponentPassiveEffectUnmountStarted(fiber) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--component-passive-effect-unmount-start-" + componentName); + } + } +} +function markComponentPassiveEffectUnmountStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--component-passive-effect-unmount-stop"); + } + } +} +function markComponentLayoutEffectMountStarted(fiber) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--component-layout-effect-mount-start-" + componentName); + } + } +} +function markComponentLayoutEffectMountStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--component-layout-effect-mount-stop"); + } + } +} +function markComponentLayoutEffectUnmountStarted(fiber) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--component-layout-effect-unmount-start-" + componentName); + } + } +} +function markComponentLayoutEffectUnmountStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--component-layout-effect-unmount-stop"); + } + } +} +function markComponentErrored(fiber, thrownValue, lanes) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; + var phase = fiber.alternate === null ? "mount" : "update"; + var message = ""; + + if ( + thrownValue !== null && + typeof thrownValue === "object" && + typeof thrownValue.message === "string" + ) { + message = thrownValue.message; + } else if (typeof thrownValue === "string") { + message = thrownValue; + } // TODO (scheduling profiler) Add component stack id + + markAndClear("--error-" + componentName + "-" + phase + "-" + message); + } + } +} +var PossiblyWeakMap$1 = typeof WeakMap === "function" ? WeakMap : Map; // $FlowFixMe: Flow cannot handle polymorphic WeakMaps + +var wakeableIDs = new PossiblyWeakMap$1(); +var wakeableID = 0; + +function getWakeableID(wakeable) { + if (!wakeableIDs.has(wakeable)) { + wakeableIDs.set(wakeable, wakeableID++); + } + + return wakeableIDs.get(wakeable); +} -function markComponentRenderStopped() {} -function markComponentErrored(fiber, thrownValue, lanes) {} +function markComponentSuspended(fiber, wakeable, lanes) { + { + if (supportsUserTimingV3) { + var eventType = wakeableIDs.has(wakeable) ? "resuspend" : "suspend"; + var id = getWakeableID(wakeable); + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; + var phase = fiber.alternate === null ? "mount" : "update"; // Following the non-standard fn.displayName convention, + // frameworks like Relay may also annotate Promises with a displayName, + // describing what operation/data the thrown Promise is related to. + // When this is available we should pass it along to the Scheduling Profiler. + + var displayName = wakeable.displayName || ""; // TODO (scheduling profiler) Add component stack id + + markAndClear( + "--suspense-" + + eventType + + "-" + + id + + "-" + + componentName + + "-" + + phase + + "-" + + lanes + + "-" + + displayName + ); + wakeable.then( + function() { + return markAndClear( + "--suspense-resolved-" + id + "-" + componentName + ); + }, + function() { + return markAndClear( + "--suspense-rejected-" + id + "-" + componentName + ); + } + ); + } + } +} +function markLayoutEffectsStarted(lanes) { + { + if (supportsUserTimingV3) { + markAndClear("--layout-effects-start-" + lanes); + } + } +} +function markLayoutEffectsStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--layout-effects-stop"); + } + } +} +function markPassiveEffectsStarted(lanes) { + { + if (supportsUserTimingV3) { + markAndClear("--passive-effects-start-" + lanes); + } + } +} +function markPassiveEffectsStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--passive-effects-stop"); + } + } +} +function markRenderStarted(lanes) { + { + if (supportsUserTimingV3) { + markAndClear("--render-start-" + lanes); + } + } +} +function markRenderYielded() { + { + if (supportsUserTimingV3) { + markAndClear("--render-yield"); + } + } +} +function markRenderStopped() { + { + if (supportsUserTimingV3) { + markAndClear("--render-stop"); + } + } +} +function markRenderScheduled(lane) { + { + if (supportsUserTimingV3) { + markAndClear("--schedule-render-" + lane); + } + } +} +function markForceUpdateScheduled(fiber, lane) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id -function markComponentSuspended(fiber, wakeable, lanes) {} + markAndClear("--schedule-forced-update-" + lane + "-" + componentName); + } + } +} +function markStateUpdateScheduled(fiber, lane) { + { + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown"; // TODO (scheduling profiler) Add component stack id + + markAndClear("--schedule-state-update-" + lane + "-" + componentName); + } + } +} var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; var NoTransition = 0; @@ -6214,9 +6622,11 @@ function shallowEqual(objA, objB) { } // Test for A's keys different from B. for (var i = 0; i < keysA.length; i++) { + var currentKey = keysA[i]; + if ( - !hasOwnProperty.call(objB, keysA[i]) || - !objectIs(objA[keysA[i]], objB[keysA[i]]) + !hasOwnProperty.call(objB, currentKey) || + !objectIs(objA[currentKey], objB[currentKey]) ) { return false; } @@ -6323,11 +6733,6 @@ function setIsRendering(rendering) { isRendering = rendering; } } -function getIsRendering() { - { - return isRendering; - } -} var ReactStrictModeWarnings = { recordUnsafeLifecycleWarnings: function(fiber, instance) {}, @@ -6687,7 +7092,6 @@ var ReactStrictModeWarnings = { * of the `value` object). */ // $FlowFixMe only called in DEV, so void return is not possible. - function typeName(value) { { // toStringTag is needed for namespaced types like Temporal.Instant @@ -6702,17 +7106,6 @@ function typeName(value) { function willCoercionThrow(value) { { - if ( - value !== null && - typeof value === "object" && - value.$$typeof === REACT_OPAQUE_ID_TYPE - ) { - // OpaqueID type is expected to throw, so React will handle it. Not sure if - // it's expected that string coercion will throw, but we'll assume it's OK. - // See https://github.com/facebook/react/issues/20127. - return; - } - try { testStringCoercion(value); return false; @@ -7789,6 +8182,10 @@ var classComponentUpdater = { if (root !== null) { entangleTransitions(root, fiber, lane); } + + { + markStateUpdateScheduled(fiber, lane); + } }, enqueueReplaceState: function(inst, payload, callback) { var fiber = get(inst); @@ -7812,6 +8209,10 @@ var classComponentUpdater = { if (root !== null) { entangleTransitions(root, fiber, lane); } + + { + markStateUpdateScheduled(fiber, lane); + } }, enqueueForceUpdate: function(inst, callback) { var fiber = get(inst); @@ -7834,6 +8235,10 @@ var classComponentUpdater = { if (root !== null) { entangleTransitions(root, fiber, lane); } + + { + markForceUpdateScheduled(fiber, lane); + } } }; @@ -8772,6 +9177,84 @@ function updateClassInstance( return shouldUpdate; } +// TODO: Use the unified fiber stack module instead of this local one? +// Intentionally not using it yet to derisk the initial implementation, because +// the way we push/pop these values is a bit unusual. If there's a mistake, I'd +// rather the ids be wrong than crash the whole reconciler. +var forkStack = []; +var forkStackIndex = 0; +var treeForkProvider = null; +var treeForkCount = 0; +var idStack = []; +var idStackIndex = 0; +var treeContextProvider = null; +var treeContextId = 1; +var treeContextOverflow = ""; + +function popTreeContext(workInProgress) { + // Restore the previous values. + // This is a bit more complicated than other context-like modules in Fiber + // because the same Fiber may appear on the stack multiple times and for + // different reasons. We have to keep popping until the work-in-progress is + // no longer at the top of the stack. + while (workInProgress === treeForkProvider) { + treeForkProvider = forkStack[--forkStackIndex]; + forkStack[forkStackIndex] = null; + treeForkCount = forkStack[--forkStackIndex]; + forkStack[forkStackIndex] = null; + } + + while (workInProgress === treeContextProvider) { + treeContextProvider = idStack[--idStackIndex]; + idStack[idStackIndex] = null; + treeContextOverflow = idStack[--idStackIndex]; + idStack[idStackIndex] = null; + treeContextId = idStack[--idStackIndex]; + idStack[idStackIndex] = null; + } +} + +var isHydrating = false; + +function enterHydrationState(fiber) { + { + return false; + } +} + +function prepareToHydrateHostInstance( + fiber, + rootContainerInstance, + hostContext +) { + { + throw new Error( + "Expected prepareToHydrateHostInstance() to never be called. " + + "This error is likely caused by a bug in React. Please file an issue." + ); + } +} + +function prepareToHydrateHostTextInstance(fiber) { + { + throw new Error( + "Expected prepareToHydrateHostTextInstance() to never be called. " + + "This error is likely caused by a bug in React. Please file an issue." + ); + } + var shouldUpdate = hydrateTextInstance(); +} + +function popHydrationState(fiber) { + { + return false; + } +} + +function getIsHydrating() { + return isHydrating; +} + var didWarnAboutMaps; var didWarnAboutGenerators; var didWarnAboutStringRefs; @@ -9055,7 +9538,9 @@ function ChildReconciler(shouldTrackSideEffects) { newFiber.index = newIndex; if (!shouldTrackSideEffects) { - // Noop. + // During hydration, the useId algorithm needs to know which fibers are + // part of a list of children (arrays, iterators). + newFiber.flags |= Forked; return lastPlacedIndex; } @@ -9495,6 +9980,7 @@ function ChildReconciler(shouldTrackSideEffects) { if (newIdx === newChildren.length) { // We've reached the end of the new children. We can delete the rest. deleteRemainingChildren(returnFiber, oldFiber); + return resultingFirstChild; } @@ -9701,6 +10187,7 @@ function ChildReconciler(shouldTrackSideEffects) { if (step.done) { // We've reached the end of the new children. We can delete the rest. deleteRemainingChildren(returnFiber, oldFiber); + return resultingFirstChild; } @@ -10259,61 +10746,10 @@ var Passive$1 = /* */ 8; -var isHydrating = false; - -function enterHydrationState(fiber) { - { - return false; - } -} - -function prepareToHydrateHostInstance( - fiber, - rootContainerInstance, - hostContext -) { - { - throw new Error( - "Expected prepareToHydrateHostInstance() to never be called. " + - "This error is likely caused by a bug in React. Please file an issue." - ); - } -} - -function prepareToHydrateHostTextInstance(fiber) { - { - throw new Error( - "Expected prepareToHydrateHostTextInstance() to never be called. " + - "This error is likely caused by a bug in React. Please file an issue." - ); - } - var shouldUpdate = hydrateTextInstance(); -} - -function popHydrationState(fiber) { - { - return false; - } -} - -function getIsHydrating() { - return isHydrating; -} - // and should be reset before starting a new render. // This tracks which mutable sources need to be reset after a render. var workInProgressSources = []; -var rendererSigil$1; - -{ - // Used to detect multiple renderers using the same mutable source. - rendererSigil$1 = {}; -} - -function markSourceAsDirty(mutableSource) { - workInProgressSources.push(mutableSource); -} function resetWorkInProgressVersions() { for (var i = 0; i < workInProgressSources.length; i++) { var mutableSource = workInProgressSources[i]; @@ -10325,32 +10761,6 @@ function resetWorkInProgressVersions() { workInProgressSources.length = 0; } -function getWorkInProgressVersion(mutableSource) { - { - return mutableSource._workInProgressVersionPrimary; - } -} -function setWorkInProgressVersion(mutableSource, version) { - { - mutableSource._workInProgressVersionPrimary = version; - } - - workInProgressSources.push(mutableSource); -} -function warnAboutMultipleRenderersDEV(mutableSource) { - { - { - if (mutableSource._currentPrimaryRenderer == null) { - mutableSource._currentPrimaryRenderer = rendererSigil$1; - } else if (mutableSource._currentPrimaryRenderer !== rendererSigil$1) { - error( - "Detected multiple renderers concurrently rendering the " + - "same mutable source. This is currently unsupported." - ); - } - } - } -} // Eager reads the version of a mutable source and stores it on the root. function getSuspendedCachePool() { { @@ -10361,11 +10771,9 @@ function getSuspendedCachePool() { var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher, ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig; var didWarnAboutMismatchedHooksForComponent; -var didWarnAboutUseOpaqueIdentifier; var didWarnUncachedGetSnapshot; { - didWarnAboutUseOpaqueIdentifier = {}; didWarnAboutMismatchedHooksForComponent = new Set(); } @@ -10389,7 +10797,11 @@ var didScheduleRenderPhaseUpdate = false; // Where an update was scheduled only // TODO: Maybe there's some way to consolidate this with // `didScheduleRenderPhaseUpdate`. Or with `numberOfReRenders`. -var didScheduleRenderPhaseUpdateDuringThisPass = false; +var didScheduleRenderPhaseUpdateDuringThisPass = false; // Counts the number of useId hooks in this component. +// hydration). This counter is global, so client ids are not stable across +// render attempts. + +var globalClientIdCounter = 0; var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders. @@ -10570,6 +10982,7 @@ function renderWithHooks( // currentHook = null; // workInProgressHook = null; // didScheduleRenderPhaseUpdate = false; + // localIdCounter = 0; // TODO Warn if no hooks are used at all during mount, then some are used during update. // Currently we will identify the update render as a mount because memoizedState === null. // This is tricky because it's valid for certain types of components (e.g. React.lazy) @@ -11066,254 +11479,16 @@ function rerenderReducer(reducer, initialArg, init) { return [newState, dispatch]; } -function readFromUnsubscribedMutableSource(root, source, getSnapshot) { - { - warnAboutMultipleRenderersDEV(source); - } - - var getVersion = source._getVersion; - var version = getVersion(source._source); // Is it safe for this component to read from this source during the current render? - - var isSafeToReadFromSource = false; // Check the version first. - // If this render has already been started with a specific version, - // we can use it alone to determine if we can safely read from the source. - - var currentRenderVersion = getWorkInProgressVersion(source); - - if (currentRenderVersion !== null) { - // It's safe to read if the store hasn't been mutated since the last time - // we read something. - isSafeToReadFromSource = currentRenderVersion === version; - } else { - // If there's no version, then this is the first time we've read from the - // source during the current render pass, so we need to do a bit more work. - // What we need to determine is if there are any hooks that already - // subscribed to the source, and if so, whether there are any pending - // mutations that haven't been synchronized yet. - // - // If there are no pending mutations, then `root.mutableReadLanes` will be - // empty, and we know we can safely read. - // - // If there *are* pending mutations, we may still be able to safely read - // if the currently rendering lanes are inclusive of the pending mutation - // lanes, since that guarantees that the value we're about to read from - // the source is consistent with the values that we read during the most - // recent mutation. - isSafeToReadFromSource = isSubsetOfLanes( - renderLanes, - root.mutableReadLanes - ); - - if (isSafeToReadFromSource) { - // If it's safe to read from this source during the current render, - // store the version in case other components read from it. - // A changed version number will let those components know to throw and restart the render. - setWorkInProgressVersion(source, version); - } - } - - if (isSafeToReadFromSource) { - var snapshot = getSnapshot(source._source); - - { - if (typeof snapshot === "function") { - error( - "Mutable source should not return a function as the snapshot value. " + - "Functions may close over mutable values and cause tearing." - ); - } - } - - return snapshot; - } else { - // This handles the special case of a mutable source being shared between renderers. - // In that case, if the source is mutated between the first and second renderer, - // The second renderer don't know that it needs to reset the WIP version during unwind, - // (because the hook only marks sources as dirty if it's written to their WIP version). - // That would cause this tear check to throw again and eventually be visible to the user. - // We can avoid this infinite loop by explicitly marking the source as dirty. - // - // This can lead to tearing in the first renderer when it resumes, - // but there's nothing we can do about that (short of throwing here and refusing to continue the render). - markSourceAsDirty(source); // Intentioally throw an error to force React to retry synchronously. During - // the synchronous retry, it will block interleaved mutations, so we should - // get a consistent read. Therefore, the following error should never be - // visible to the user. - // We expect this error not to be thrown during the synchronous retry, - // because we blocked interleaved mutations. - - throw new Error( - "Cannot read from mutable source during the current render without tearing. This may be a bug in React. Please file an issue." - ); - } -} - -function useMutableSource(hook, source, getSnapshot, subscribe) { - var root = getWorkInProgressRoot(); - - if (root === null) { - throw new Error( - "Expected a work-in-progress root. This is a bug in React. Please file an issue." - ); - } - - var getVersion = source._getVersion; - var version = getVersion(source._source); - var dispatcher = ReactCurrentDispatcher$1.current; // eslint-disable-next-line prefer-const - - var _dispatcher$useState = dispatcher.useState(function() { - return readFromUnsubscribedMutableSource(root, source, getSnapshot); - }), - currentSnapshot = _dispatcher$useState[0], - setSnapshot = _dispatcher$useState[1]; - - var snapshot = currentSnapshot; // Grab a handle to the state hook as well. - // We use it to clear the pending update queue if we have a new source. - - var stateHook = workInProgressHook; - var memoizedState = hook.memoizedState; - var refs = memoizedState.refs; - var prevGetSnapshot = refs.getSnapshot; - var prevSource = memoizedState.source; - var prevSubscribe = memoizedState.subscribe; - var fiber = currentlyRenderingFiber$1; - hook.memoizedState = { - refs: refs, - source: source, - subscribe: subscribe - }; // Sync the values needed by our subscription handler after each commit. - - dispatcher.useEffect( - function() { - refs.getSnapshot = getSnapshot; // Normally the dispatch function for a state hook never changes, - // but this hook recreates the queue in certain cases to avoid updates from stale sources. - // handleChange() below needs to reference the dispatch function without re-subscribing, - // so we use a ref to ensure that it always has the latest version. - - refs.setSnapshot = setSnapshot; // Check for a possible change between when we last rendered now. - - var maybeNewVersion = getVersion(source._source); - - if (!objectIs(version, maybeNewVersion)) { - var maybeNewSnapshot = getSnapshot(source._source); - - { - if (typeof maybeNewSnapshot === "function") { - error( - "Mutable source should not return a function as the snapshot value. " + - "Functions may close over mutable values and cause tearing." - ); - } - } - - if (!objectIs(snapshot, maybeNewSnapshot)) { - setSnapshot(maybeNewSnapshot); - var lane = requestUpdateLane(fiber); - markRootMutableRead(root, lane); - } // If the source mutated between render and now, - // there may be state updates already scheduled from the old source. - // Entangle the updates so that they render in the same batch. - - markRootEntangled(root, root.mutableReadLanes); - } - }, - [getSnapshot, source, subscribe] - ); // If we got a new source or subscribe function, re-subscribe in a passive effect. - - dispatcher.useEffect( - function() { - var handleChange = function() { - var latestGetSnapshot = refs.getSnapshot; - var latestSetSnapshot = refs.setSnapshot; - - try { - latestSetSnapshot(latestGetSnapshot(source._source)); // Record a pending mutable source update with the same expiration time. - - var lane = requestUpdateLane(fiber); - markRootMutableRead(root, lane); - } catch (error) { - // A selector might throw after a source mutation. - // e.g. it might try to read from a part of the store that no longer exists. - // In this case we should still schedule an update with React. - // Worst case the selector will throw again and then an error boundary will handle it. - latestSetSnapshot(function() { - throw error; - }); - } - }; - - var unsubscribe = subscribe(source._source, handleChange); - - { - if (typeof unsubscribe !== "function") { - error( - "Mutable source subscribe function must return an unsubscribe function." - ); - } - } - - return unsubscribe; - }, - [source, subscribe] - ); // If any of the inputs to useMutableSource change, reading is potentially unsafe. - // - // If either the source or the subscription have changed we can't can't trust the update queue. - // Maybe the source changed in a way that the old subscription ignored but the new one depends on. - // - // If the getSnapshot function changed, we also shouldn't rely on the update queue. - // It's possible that the underlying source was mutated between the when the last "change" event fired, - // and when the current render (with the new getSnapshot function) is processed. - // - // In both cases, we need to throw away pending updates (since they are no longer relevant) - // and treat reading from the source as we do in the mount case. - - if ( - !objectIs(prevGetSnapshot, getSnapshot) || - !objectIs(prevSource, source) || - !objectIs(prevSubscribe, subscribe) - ) { - // Create a new queue and setState method, - // So if there are interleaved updates, they get pushed to the older queue. - // When this becomes current, the previous queue and dispatch method will be discarded, - // including any interleaving updates that occur. - var newQueue = { - pending: null, - interleaved: null, - lanes: NoLanes, - dispatch: null, - lastRenderedReducer: basicStateReducer, - lastRenderedState: snapshot - }; - newQueue.dispatch = setSnapshot = dispatchSetState.bind( - null, - currentlyRenderingFiber$1, - newQueue - ); - stateHook.queue = newQueue; - stateHook.baseQueue = null; - snapshot = readFromUnsubscribedMutableSource(root, source, getSnapshot); - stateHook.memoizedState = stateHook.baseState = snapshot; - } - - return snapshot; -} - function mountMutableSource(source, getSnapshot, subscribe) { - var hook = mountWorkInProgressHook(); - hook.memoizedState = { - refs: { - getSnapshot: getSnapshot, - setSnapshot: null - }, - source: source, - subscribe: subscribe - }; - return useMutableSource(hook, source, getSnapshot, subscribe); + { + return undefined; + } } function updateMutableSource(source, getSnapshot, subscribe) { - var hook = updateWorkInProgressHook(); - return useMutableSource(hook, source, getSnapshot, subscribe); + { + return undefined; + } } function mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { @@ -11640,13 +11815,6 @@ function updateEffectImpl(fiberFlags, hookFlags, create, deps) { } function mountEffect(create, deps) { - { - // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests - if ("undefined" !== typeof jest) { - warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1); - } - } - if ((currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) { return mountEffectImpl( MountPassiveDev | Passive | PassiveStatic, @@ -11660,13 +11828,6 @@ function mountEffect(create, deps) { } function updateEffect(create, deps) { - { - // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests - if ("undefined" !== typeof jest) { - warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1); - } - } - return updateEffectImpl(Passive, Passive$1, create, deps); } @@ -11972,44 +12133,23 @@ function getIsUpdatingOpaqueValueInRenderPhaseInDEV() { } } -function warnOnOpaqueIdentifierAccessInDEV(fiber) { - { - // TODO: Should warn in effects and callbacks, too - var name = getComponentNameFromFiber(fiber) || "Unknown"; - - if (getIsRendering() && !didWarnAboutUseOpaqueIdentifier[name]) { - error( - "The object passed back from useOpaqueIdentifier is meant to be " + - "passed through to attributes only. Do not read the " + - "value directly." - ); - - didWarnAboutUseOpaqueIdentifier[name] = true; - } - } -} - -function mountOpaqueIdentifier() { - var makeId = makeClientIdInDEV.bind( - null, - warnOnOpaqueIdentifierAccessInDEV.bind(null, currentlyRenderingFiber$1) - ); +function mountId() { + var hook = mountWorkInProgressHook(); + var id; { - var _id = makeId(); - - mountState(_id); - return _id; + // Use a lowercase r prefix for client-generated ids. + var globalClientId = globalClientIdCounter++; + id = "r:" + globalClientId.toString(32); } -} -function updateOpaqueIdentifier() { - var id = updateState()[0]; + hook.memoizedState = id; return id; } -function rerenderOpaqueIdentifier() { - var id = rerenderState()[0]; +function updateId() { + var hook = updateWorkInProgressHook(); + var id = hook.memoizedState; return id; } @@ -12037,14 +12177,6 @@ function dispatchReducerAction(fiber, queue, action) { enqueueRenderPhaseUpdate(queue, update); } else { enqueueUpdate$1(fiber, queue, update); - - { - // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests - if ("undefined" !== typeof jest) { - warnIfNotCurrentlyActingUpdatesInDev(fiber); - } - } - var eventTime = requestEventTime(); var root = scheduleUpdateOnFiber(fiber, lane, eventTime); @@ -12052,6 +12184,8 @@ function dispatchReducerAction(fiber, queue, action) { entangleTransitionUpdate(root, queue, lane); } } + + markUpdateInDevTools(fiber, lane); } function dispatchSetState(fiber, queue, action) { @@ -12124,13 +12258,6 @@ function dispatchSetState(fiber, queue, action) { } } - { - // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests - if ("undefined" !== typeof jest) { - warnIfNotCurrentlyActingUpdatesInDev(fiber); - } - } - var eventTime = requestEventTime(); var root = scheduleUpdateOnFiber(fiber, lane, eventTime); @@ -12138,6 +12265,8 @@ function dispatchSetState(fiber, queue, action) { entangleTransitionUpdate(root, queue, lane); } } + + markUpdateInDevTools(fiber, lane); } function isRenderPhaseUpdate(fiber) { @@ -12216,6 +12345,12 @@ function entangleTransitionUpdate(root, queue, lane) { } } +function markUpdateInDevTools(fiber, lane, action) { + { + markStateUpdateScheduled(fiber, lane); + } +} + var ContextOnlyDispatcher = { readContext: readContext, useCallback: throwInvalidHookError, @@ -12233,7 +12368,7 @@ var ContextOnlyDispatcher = { useTransition: throwInvalidHookError, useMutableSource: throwInvalidHookError, useSyncExternalStore: throwInvalidHookError, - useOpaqueIdentifier: throwInvalidHookError, + useId: throwInvalidHookError, unstable_isNewReconciler: enableNewReconciler }; @@ -12363,17 +12498,17 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; useMutableSource: function(source, getSnapshot, subscribe) { currentHookNameInDev = "useMutableSource"; mountHookTypesDev(); - return mountMutableSource(source, getSnapshot, subscribe); + return mountMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; mountHookTypesDev(); return mountSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; mountHookTypesDev(); - return mountOpaqueIdentifier(); + return mountId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -12471,17 +12606,17 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; useMutableSource: function(source, getSnapshot, subscribe) { currentHookNameInDev = "useMutableSource"; updateHookTypesDev(); - return mountMutableSource(source, getSnapshot, subscribe); + return mountMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; updateHookTypesDev(); return mountSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; updateHookTypesDev(); - return mountOpaqueIdentifier(); + return mountId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -12579,17 +12714,17 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; useMutableSource: function(source, getSnapshot, subscribe) { currentHookNameInDev = "useMutableSource"; updateHookTypesDev(); - return updateMutableSource(source, getSnapshot, subscribe); + return updateMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; updateHookTypesDev(); return updateSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; updateHookTypesDev(); - return updateOpaqueIdentifier(); + return updateId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -12687,17 +12822,17 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; useMutableSource: function(source, getSnapshot, subscribe) { currentHookNameInDev = "useMutableSource"; updateHookTypesDev(); - return updateMutableSource(source, getSnapshot, subscribe); + return updateMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; updateHookTypesDev(); return updateSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; updateHookTypesDev(); - return rerenderOpaqueIdentifier(); + return updateId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -12810,7 +12945,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; currentHookNameInDev = "useMutableSource"; warnInvalidHookAccess(); mountHookTypesDev(); - return mountMutableSource(source, getSnapshot, subscribe); + return mountMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; @@ -12818,11 +12953,11 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; mountHookTypesDev(); return mountSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; warnInvalidHookAccess(); mountHookTypesDev(); - return mountOpaqueIdentifier(); + return mountId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -12935,7 +13070,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; currentHookNameInDev = "useMutableSource"; warnInvalidHookAccess(); updateHookTypesDev(); - return updateMutableSource(source, getSnapshot, subscribe); + return updateMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; @@ -12943,11 +13078,11 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; updateHookTypesDev(); return updateSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; warnInvalidHookAccess(); updateHookTypesDev(); - return updateOpaqueIdentifier(); + return updateId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -13060,7 +13195,7 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; currentHookNameInDev = "useMutableSource"; warnInvalidHookAccess(); updateHookTypesDev(); - return updateMutableSource(source, getSnapshot, subscribe); + return updateMutableSource(); }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { currentHookNameInDev = "useSyncExternalStore"; @@ -13068,11 +13203,11 @@ var InvalidNestedHooksDispatcherOnRerenderInDEV = null; updateHookTypesDev(); return updateSyncExternalStore(subscribe, getSnapshot); }, - useOpaqueIdentifier: function() { - currentHookNameInDev = "useOpaqueIdentifier"; + useId: function() { + currentHookNameInDev = "useId"; warnInvalidHookAccess(); updateHookTypesDev(); - return rerenderOpaqueIdentifier(); + return updateId(); }, unstable_isNewReconciler: enableNewReconciler }; @@ -13356,7 +13491,7 @@ function logCapturedError(boundary, errorInfo) { } } -var PossiblyWeakMap$1 = typeof WeakMap === "function" ? WeakMap : Map; +var PossiblyWeakMap$2 = typeof WeakMap === "function" ? WeakMap : Map; function createRootErrorUpdate(fiber, errorInfo, lane) { var update = createUpdate(NoTimestamp, lane); // Unmount the root by rendering null. @@ -13461,7 +13596,7 @@ function attachWakeableListeners(suspenseBoundary, root, wakeable, lanes) { var threadIDs; if (pingCache === null) { - pingCache = root.pingCache = new PossiblyWeakMap$1(); + pingCache = root.pingCache = new PossiblyWeakMap$2(); threadIDs = new Set(); pingCache.set(wakeable, threadIDs); } else { @@ -14102,7 +14237,12 @@ function completeSuspendedOffscreenHostContainer(current, workInProgress) { } function completeWork(current, workInProgress, renderLanes) { - var newProps = workInProgress.pendingProps; + var newProps = workInProgress.pendingProps; // Note: This intentionally doesn't check if we're hydrating because comparing + // to the current tree provider fiber is just as fast and less error-prone. + // Ideally we would have a special version of the work loop only + // for hydration. + + popTreeContext(workInProgress); switch (workInProgress.tag) { case IndeterminateComponent: @@ -14301,7 +14441,7 @@ function completeWork(current, workInProgress, renderLanes) { else { var prevState = current.memoizedState; prevDidTimeout = prevState !== null; - } // If the suspended state of the boundary changes, we need to schedule + } // an effect to toggle the subtree's visibility. When we switch from // fallback -> primary, the inner Offscreen fiber schedules this effect // as part of its normal complete phase. But when we switch from @@ -14314,8 +14454,8 @@ function completeWork(current, workInProgress, renderLanes) { // is active that we have to do anything special. if (nextDidTimeout && !prevDidTimeout) { - var offscreenFiber = workInProgress.child; - offscreenFiber.flags |= Visibility; // TODO: This will still suspend a synchronous tree if anything + var _offscreenFiber = workInProgress.child; + _offscreenFiber.flags |= Visibility; // TODO: This will still suspend a synchronous tree if anything // in the concurrent tree already suspended during this render. // This is a known bug. @@ -14789,6 +14929,10 @@ function updateForwardRef( var nextChildren; prepareToReadContext(workInProgress, renderLanes); + { + markComponentRenderStarted(workInProgress); + } + { ReactCurrentOwner$1.current = workInProgress; setIsRendering(true); @@ -14821,6 +14965,10 @@ function updateForwardRef( setIsRendering(false); } + { + markComponentRenderStopped(); + } + if (current !== null && !didReceiveUpdate) { bailoutHooks(current, workInProgress, renderLanes); return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); @@ -15249,6 +15397,10 @@ function updateFunctionComponent( var nextChildren; prepareToReadContext(workInProgress, renderLanes); + { + markComponentRenderStarted(workInProgress); + } + { ReactCurrentOwner$1.current = workInProgress; setIsRendering(true); @@ -15281,6 +15433,10 @@ function updateFunctionComponent( setIsRendering(false); } + { + markComponentRenderStopped(); + } + if (current !== null && !didReceiveUpdate) { bailoutHooks(current, workInProgress, renderLanes); return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); @@ -15468,6 +15624,10 @@ function finishClassComponent( stopProfilerTimerIfRunning(); } } else { + { + markComponentRenderStarted(workInProgress); + } + { setIsRendering(true); nextChildren = instance.render(); @@ -15484,6 +15644,10 @@ function finishClassComponent( setIsRendering(false); } + + { + markComponentRenderStopped(); + } } // React DevTools reads this flag. workInProgress.flags |= PerformedWork; @@ -15814,6 +15978,10 @@ function mountIndeterminateComponent( prepareToReadContext(workInProgress, renderLanes); var value; + { + markComponentRenderStarted(workInProgress); + } + { if ( Component.prototype && @@ -15850,6 +16018,10 @@ function mountIndeterminateComponent( setIsRendering(false); } + { + markComponentRenderStopped(); + } // React DevTools reads this flag. + workInProgress.flags |= PerformedWork; { @@ -16040,6 +16212,7 @@ function validateFunctionComponentInDev(workInProgress, Component) { var SUSPENDED_MARKER = { dehydrated: null, + treeContext: null, retryLane: NoLane }; @@ -17064,6 +17237,10 @@ function updateContextConsumer(current, workInProgress, renderLanes) { prepareToReadContext(workInProgress, renderLanes); var newValue = readContext(context); + { + markComponentRenderStarted(workInProgress); + } + var newChildren; { @@ -17073,6 +17250,10 @@ function updateContextConsumer(current, workInProgress, renderLanes) { setIsRendering(false); } + { + markComponentRenderStopped(); + } // React DevTools reads this flag. + workInProgress.flags |= PerformedWork; reconcileChildren(current, workInProgress, newChildren, renderLanes); return workInProgress.child; @@ -17620,6 +17801,12 @@ function beginWork(current, workInProgress, renderLanes) { } function unwindWork(workInProgress, renderLanes) { + // Note: This intentionally doesn't check if we're hydrating because comparing + // to the current tree provider fiber is just as fast and less error-prone. + // Ideally we would have a special version of the work loop only + // for hydration. + popTreeContext(workInProgress); + switch (workInProgress.tag) { case ClassComponent: { var Component = workInProgress.type; @@ -17715,6 +17902,12 @@ function unwindWork(workInProgress, renderLanes) { } function unwindInterruptedWork(interruptedWork, renderLanes) { + // Note: This intentionally doesn't check if we're hydrating because comparing + // to the current tree provider fiber is just as fast and less error-prone. + // Ideally we would have a special version of the work loop only + // for hydration. + popTreeContext(interruptedWork); + switch (interruptedWork.tag) { case ClassComponent: { var childContextTypes = interruptedWork.type.childContextTypes; @@ -18039,7 +18232,23 @@ function commitHookEffectListUnmount( effect.destroy = undefined; if (destroy !== undefined) { + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectUnmountStarted(finishedWork); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectUnmountStarted(finishedWork); + } + } + safelyCallDestroy(finishedWork, nearestMountedAncestor, destroy); + + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectUnmountStopped(); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectUnmountStopped(); + } + } } } @@ -18048,7 +18257,7 @@ function commitHookEffectListUnmount( } } -function commitHookEffectListMount(tag, finishedWork) { +function commitHookEffectListMount(flags, finishedWork) { var updateQueue = finishedWork.updateQueue; var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; @@ -18057,11 +18266,26 @@ function commitHookEffectListMount(tag, finishedWork) { var effect = firstEffect; do { - if ((effect.tag & tag) === tag) { - // Mount + if ((effect.tag & flags) === flags) { + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectMountStarted(finishedWork); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectMountStarted(finishedWork); + } + } // Mount + var create = effect.create; effect.destroy = create(); + { + if ((flags & Passive$1) !== NoFlags$1) { + markComponentPassiveEffectMountStopped(); + } else if ((flags & Layout) !== NoFlags$1) { + markComponentLayoutEffectMountStopped(); + } + } + { var destroy = effect.destroy; @@ -18655,10 +18879,13 @@ function commitUnmount(finishedRoot, current, nearestMountedAncestor) { tag = _effect.tag; if (destroy !== undefined) { - if ( - (tag & Insertion) !== NoFlags$1 || - (tag & Layout) !== NoFlags$1 - ) { + if ((tag & Insertion) !== NoFlags$1) { + safelyCallDestroy(current, nearestMountedAncestor, destroy); + } else if ((tag & Layout) !== NoFlags$1) { + { + markComponentLayoutEffectUnmountStarted(current); + } + if (current.mode & ProfileMode) { startLayoutEffectTimer(); safelyCallDestroy(current, nearestMountedAncestor, destroy); @@ -18666,6 +18893,10 @@ function commitUnmount(finishedRoot, current, nearestMountedAncestor) { } else { safelyCallDestroy(current, nearestMountedAncestor, destroy); } + + { + markComponentLayoutEffectUnmountStopped(); + } } } @@ -19927,11 +20158,46 @@ if (typeof Symbol === "function" && Symbol.for) { TEXT_TYPE = symbolFor$1("selector.text"); } +var ReactCurrentActQueue = ReactSharedInternals.ReactCurrentActQueue; +function isLegacyActEnvironment(fiber) { + { + // Legacy mode. We preserve the behavior of React 17's act. It assumes an + // act environment whenever `jest` is defined, but you can still turn off + // spurious warnings by setting IS_REACT_ACT_ENVIRONMENT explicitly + // to false. + var isReactActEnvironmentGlobal = // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global + typeof IS_REACT_ACT_ENVIRONMENT !== "undefined" + ? IS_REACT_ACT_ENVIRONMENT + : undefined; // $FlowExpectedError - Flow doesn't know about jest + + var jestIsDefined = typeof jest !== "undefined"; + return jestIsDefined && isReactActEnvironmentGlobal !== false; + } +} +function isConcurrentActEnvironment() { + { + var isReactActEnvironmentGlobal = // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global + typeof IS_REACT_ACT_ENVIRONMENT !== "undefined" + ? IS_REACT_ACT_ENVIRONMENT + : undefined; + + if (!isReactActEnvironmentGlobal && ReactCurrentActQueue.current !== null) { + // TODO: Include link to relevant documentation page. + error( + "The current testing environment is not configured to support " + + "act(...)" + ); + } + + return isReactActEnvironmentGlobal; + } +} + var ceil = Math.ceil; var ReactCurrentDispatcher$2 = ReactSharedInternals.ReactCurrentDispatcher, ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner, ReactCurrentBatchConfig$2 = ReactSharedInternals.ReactCurrentBatchConfig, - ReactCurrentActQueue = ReactSharedInternals.ReactCurrentActQueue; + ReactCurrentActQueue$1 = ReactSharedInternals.ReactCurrentActQueue; var NoContext = /* */ 0; @@ -19984,7 +20250,9 @@ var workInProgressRootIncludedLanes = NoLanes; // The work left over by componen var workInProgressRootSkippedLanes = NoLanes; // Lanes that were updated (in an interleaved event) during this render. -var workInProgressRootUpdatedLanes = NoLanes; // Lanes that were pinged (in an interleaved event) during this render. +var workInProgressRootInterleavedUpdatedLanes = NoLanes; // Lanes that were updated during the render phase (*not* an interleaved event). + +var workInProgressRootRenderPhaseUpdatedLanes = NoLanes; // Lanes that were pinged (in an interleaved event) during this render. var workInProgressRootPingedLanes = NoLanes; // The most recent time we committed a fallback. This lets us ensure a train // model where we don't commit new loading states in too quick succession. @@ -20011,7 +20279,7 @@ var legacyErrorBoundariesThatAlreadyFailed = null; // Only used when enableProfi var rootDoesHavePassiveEffects = false; var rootWithPendingPassiveEffects = null; var pendingPassiveEffectsLanes = NoLanes; -var pendingPassiveProfilerEffects = []; // Use these to prevent an infinite loop of nested updates +var pendingPassiveProfilerEffects = []; var NESTED_UPDATE_LIMIT = 50; var nestedUpdateCount = 0; @@ -20116,60 +20384,80 @@ function requestRetryLane(fiber) { function scheduleUpdateOnFiber(fiber, lane, eventTime) { checkForNestedUpdates(); - warnAboutRenderPhaseUpdatesInDEV(fiber); var root = markUpdateLaneFromFiberToRoot(fiber, lane); if (root === null) { return null; - } - - { - if (isDevToolsPresent) { - addFiberToLanesMap(root, fiber, lane); - } } // Mark that the root has a pending update. markRootUpdated(root, lane, eventTime); - if (root === workInProgressRoot) { - // Received an update to a tree that's in the middle of rendering. Mark - // that there was an interleaved update work on this root. Unless the - // `deferRenderPhaseUpdateToNextBatch` flag is off and this is a render - // phase update. In that case, we don't treat render phase updates as if - // they were interleaved, for backwards compat reasons. - if ((executionContext & RenderContext) === NoContext) { - workInProgressRootUpdatedLanes = mergeLanes( - workInProgressRootUpdatedLanes, - lane - ); + if ( + (executionContext & RenderContext) !== NoLanes && + root === workInProgressRoot + ) { + // This update was dispatched during the render phase. This is a mistake + // if the update originates from user space (with the exception of local + // hook updates, which are handled differently and don't reach this + // function), but there are some internal React features that use this as + // an implementation detail, like selective hydration. + warnAboutRenderPhaseUpdatesInDEV(fiber); // Track lanes that were updated during the render phase + + workInProgressRootRenderPhaseUpdatedLanes = mergeLanes( + workInProgressRootRenderPhaseUpdatedLanes, + lane + ); + } else { + // This is a normal update, scheduled from outside the render phase. For + // example, during an input event. + { + if (isDevToolsPresent) { + addFiberToLanesMap(root, fiber, lane); + } } - if (workInProgressRootExitStatus === RootSuspendedWithDelay) { - // The root already suspended with a delay, which means this render - // definitely won't finish. Since we have a new update, let's mark it as - // suspended now, right before marking the incoming update. This has the - // effect of interrupting the current render and switching to the update. - // TODO: Make sure this doesn't override pings that happen while we've - // already started rendering. - markRootSuspended$1(root, workInProgressRootRenderLanes); + warnIfUpdatesNotWrappedWithActDEV(fiber); + + if (root === workInProgressRoot) { + // Received an update to a tree that's in the middle of rendering. Mark + // that there was an interleaved update work on this root. Unless the + // `deferRenderPhaseUpdateToNextBatch` flag is off and this is a render + // phase update. In that case, we don't treat render phase updates as if + // they were interleaved, for backwards compat reasons. + if ((executionContext & RenderContext) === NoContext) { + workInProgressRootInterleavedUpdatedLanes = mergeLanes( + workInProgressRootInterleavedUpdatedLanes, + lane + ); + } + + if (workInProgressRootExitStatus === RootSuspendedWithDelay) { + // The root already suspended with a delay, which means this render + // definitely won't finish. Since we have a new update, let's mark it as + // suspended now, right before marking the incoming update. This has the + // effect of interrupting the current render and switching to the update. + // TODO: Make sure this doesn't override pings that happen while we've + // already started rendering. + markRootSuspended$1(root, workInProgressRootRenderLanes); + } } - } - ensureRootIsScheduled(root, eventTime); + ensureRootIsScheduled(root, eventTime); - if ( - lane === SyncLane && - executionContext === NoContext && - (fiber.mode & ConcurrentMode) === NoMode && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode. - !ReactCurrentActQueue.isBatchingLegacy - ) { - // Flush the synchronous work now, unless we're already working or inside - // a batch. This is intentionally inside scheduleUpdateOnFiber instead of - // scheduleCallbackForFiber to preserve the ability to schedule a callback - // without immediately flushing it. We only do this for user-initiated - // updates, to preserve historical behavior of legacy mode. - resetRenderTimer(); - flushSyncCallbacksOnlyInLegacyMode(); + if ( + lane === SyncLane && + executionContext === NoContext && + (fiber.mode & ConcurrentMode) === NoMode && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode. + !ReactCurrentActQueue$1.isBatchingLegacy + ) { + // Flush the synchronous work now, unless we're already working or inside + // a batch. This is intentionally inside scheduleUpdateOnFiber instead of + // scheduleCallbackForFiber to preserve the ability to schedule a callback + // without immediately flushing it. We only do this for user-initiated + // updates, to preserve historical behavior of legacy mode. + resetRenderTimer(); + flushSyncCallbacksOnlyInLegacyMode(); + } } return root; @@ -20274,7 +20562,7 @@ function ensureRootIsScheduled(root, currentTime) { // Scheduler task, rather than an `act` task, cancel it and re-scheduled // on the `act` queue. !( - ReactCurrentActQueue.current !== null && + ReactCurrentActQueue$1.current !== null && existingCallbackNode !== fakeActCallbackNode ) ) { @@ -20306,8 +20594,8 @@ function ensureRootIsScheduled(root, currentTime) { // Special case: Sync React callbacks are scheduled on a special // internal queue if (root.tag === LegacyRoot) { - if (ReactCurrentActQueue.isBatchingLegacy !== null) { - ReactCurrentActQueue.didScheduleLegacyUpdate = true; + if (ReactCurrentActQueue$1.isBatchingLegacy !== null) { + ReactCurrentActQueue$1.didScheduleLegacyUpdate = true; } scheduleLegacySyncCallback(performSyncWorkOnRoot.bind(null, root)); @@ -20497,7 +20785,26 @@ function recoverFromConcurrentError(root, errorRetryLanes) { clearContainer(root.containerInfo); } - var exitStatus = renderRootSync(root, errorRetryLanes); + var exitStatus; + var MAX_ERROR_RETRY_ATTEMPTS = 50; + + for (var i = 0; i < MAX_ERROR_RETRY_ATTEMPTS; i++) { + exitStatus = renderRootSync(root, errorRetryLanes); + + if ( + exitStatus === RootErrored && + workInProgressRootRenderPhaseUpdatedLanes !== NoLanes + ) { + // There was a render phase update during this render. Some internal React + // implementation details may use this as a trick to schedule another + // render pass. To protect against an inifinite loop, eventually + // we'll give up. + continue; + } + + break; + } + executionContext = prevExecutionContext; return exitStatus; } @@ -20684,7 +20991,10 @@ function markRootSuspended$1(root, suspendedLanes) { // TODO: Lol maybe there's a better way to factor this besides this // obnoxiously named function :) suspendedLanes = removeLanes(suspendedLanes, workInProgressRootPingedLanes); - suspendedLanes = removeLanes(suspendedLanes, workInProgressRootUpdatedLanes); + suspendedLanes = removeLanes( + suspendedLanes, + workInProgressRootInterleavedUpdatedLanes + ); markRootSuspended(root, suspendedLanes); } // This is the entry point for synchronous tasks that don't go // through Scheduler @@ -20710,31 +21020,16 @@ function performSyncWorkOnRoot(root) { var exitStatus = renderRootSync(root, lanes); if (root.tag !== LegacyRoot && exitStatus === RootErrored) { - var prevExecutionContext = executionContext; - executionContext |= RetryAfterError; // If an error occurred during hydration, - // discard server response and fall back to client side render. - - if (root.isDehydrated) { - root.isDehydrated = false; - - { - errorHydratingContainer(root.containerInfo); - } - - clearContainer(root.containerInfo); - } // If something threw an error, try rendering one more time. We'll render + // If something threw an error, try rendering one more time. We'll render // synchronously to block concurrent data mutations, and we'll includes // all pending updates are included. If it still fails after the second // attempt, we'll give up and commit the resulting tree. - var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root); if (errorRetryLanes !== NoLanes) { lanes = errorRetryLanes; - exitStatus = renderRootSync(root, lanes); + exitStatus = recoverFromConcurrentError(root, errorRetryLanes); } - - executionContext = prevExecutionContext; } if (exitStatus === RootFatalErrored) { @@ -20767,7 +21062,7 @@ function batchedUpdates$1(fn, a) { if ( executionContext === NoContext && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode. - !ReactCurrentActQueue.isBatchingLegacy + !ReactCurrentActQueue$1.isBatchingLegacy ) { resetRenderTimer(); flushSyncCallbacksOnlyInLegacyMode(); @@ -20855,7 +21150,8 @@ function prepareFreshStack(root, lanes) { workInProgressRootExitStatus = RootIncomplete; workInProgressRootFatalError = null; workInProgressRootSkippedLanes = NoLanes; - workInProgressRootUpdatedLanes = NoLanes; + workInProgressRootInterleavedUpdatedLanes = NoLanes; + workInProgressRootRenderPhaseUpdatedLanes = NoLanes; workInProgressRootPingedLanes = NoLanes; enqueueInterleavedUpdates(); @@ -20997,7 +21293,7 @@ function renderDidSuspendDelayIfPossible() { if ( workInProgressRoot !== null && (includesNonIdleWork(workInProgressRootSkippedLanes) || - includesNonIdleWork(workInProgressRootUpdatedLanes)) + includesNonIdleWork(workInProgressRootInterleavedUpdatedLanes)) ) { // Mark the current render as suspended so that we switch to working on // the updates that were skipped. Usually we only suspend at the end of @@ -21048,6 +21344,10 @@ function renderRootSync(root, lanes) { prepareFreshStack(root, lanes); } + { + markRenderStarted(lanes); + } + do { try { workLoopSync(); @@ -21069,6 +21369,10 @@ function renderRootSync(root, lanes) { ); } + { + markRenderStopped(); + } // Set this to null to indicate there's no in-progress render. + workInProgressRoot = null; workInProgressRootRenderLanes = NoLanes; return workInProgressRootExitStatus; @@ -21110,6 +21414,10 @@ function renderRootConcurrent(root, lanes) { prepareFreshStack(root, lanes); } + { + markRenderStarted(lanes); + } + do { try { workLoopConcurrent(); @@ -21124,8 +21432,18 @@ function renderRootConcurrent(root, lanes) { executionContext = prevExecutionContext; if (workInProgress !== null) { + // Still work remaining. + { + markRenderYielded(); + } + return RootIncomplete; } else { + // Completed the tree. + { + markRenderStopped(); + } // Set this to null to indicate there's no in-progress render. + workInProgressRoot = null; workInProgressRootRenderLanes = NoLanes; // Return the final exit status. @@ -21297,7 +21615,15 @@ function commitRootImpl(root, renderPriorityLevel) { var finishedWork = root.finishedWork; var lanes = root.finishedLanes; + { + markCommitStarted(lanes); + } + if (finishedWork === null) { + { + markCommitStopped(); + } + return null; } else { { @@ -21346,7 +21672,10 @@ function commitRootImpl(root, renderPriorityLevel) { if (!rootDoesHavePassiveEffects) { rootDoesHavePassiveEffects = true; scheduleCallback$1(NormalPriority, function() { - flushPassiveEffects(); + flushPassiveEffects(); // This render triggered passive effects: release the root cache pool + // *after* passive effects fire to avoid freeing a cache pool that may + // be referenced by a node in the tree (HostRoot, Cache boundary etc) + return null; }); } @@ -21400,7 +21729,15 @@ function commitRootImpl(root, renderPriorityLevel) { root.current = finishedWork; // The next phase is the layout phase, where we call effects that read + { + markLayoutEffectsStarted(lanes); + } + commitLayoutEffects(finishedWork, root, lanes); + + { + markLayoutEffectsStopped(); + } // opportunity to paint. requestPaint(); @@ -21504,6 +21841,10 @@ function commitRootImpl(root, renderPriorityLevel) { flushSyncCallbacks(); + { + markCommitStopped(); + } + return null; } @@ -21526,7 +21867,7 @@ function flushPassiveEffects() { return flushPassiveEffectsImpl(); } finally { setCurrentUpdatePriority(previousPriority); - ReactCurrentBatchConfig$2.transition = prevTransition; + ReactCurrentBatchConfig$2.transition = prevTransition; // Once passive effects have run for the tree - giving components a } } @@ -21552,6 +21893,7 @@ function flushPassiveEffectsImpl() { } var root = rootWithPendingPassiveEffects; + var lanes = pendingPassiveEffectsLanes; rootWithPendingPassiveEffects = null; // TODO: This is sometimes out of sync with rootWithPendingPassiveEffects. // Figure out why and fix it. It's not causing any known issues (probably // because it's only used for profiling), but it's a refactor hazard. @@ -21562,6 +21904,10 @@ function flushPassiveEffectsImpl() { throw new Error("Cannot flush passive effects while already rendering."); } + { + markPassiveEffectsStarted(lanes); + } + var prevExecutionContext = executionContext; executionContext |= CommitContext; commitPassiveUnmountEffects(root.current); @@ -21577,6 +21923,10 @@ function flushPassiveEffectsImpl() { } } + { + markPassiveEffectsStopped(); + } + { commitDoubleInvokeEffectsInDEV(root.current, true); } @@ -21707,6 +22057,7 @@ function pingSuspendedRoot(root, wakeable, pingedLanes) { var eventTime = requestEventTime(); markRootPinged(root, pingedLanes); + warnIfSuspenseResolutionNotWrappedWithActDEV(root); if ( workInProgressRoot === root && @@ -22032,11 +22383,7 @@ var didWarnAboutUpdateInRenderForAnotherComponent; function warnAboutRenderPhaseUpdatesInDEV(fiber) { { - if ( - isRendering && - (executionContext & RenderContext) !== NoContext && - !getIsUpdatingOpaqueValueInRenderPhaseInDEV() - ) { + if (isRendering && !getIsUpdatingOpaqueValueInRenderPhaseInDEV()) { switch (fiber.tag) { case FunctionComponent: case ForwardRef: @@ -22101,7 +22448,7 @@ function scheduleCallback$1(priorityLevel, callback) { { // If we're currently inside an `act` scope, bypass Scheduler and push to // the `act` queue instead. - var actQueue = ReactCurrentActQueue.current; + var actQueue = ReactCurrentActQueue$1.current; if (actQueue !== null) { actQueue.push(callback); @@ -22122,48 +22469,41 @@ function cancelCallback$1(callbackNode) { function shouldForceFlushFallbacksInDEV() { // Never force flush in production. This function should get stripped out. - return ReactCurrentActQueue.current !== null; + return ReactCurrentActQueue$1.current !== null; } -function warnIfNotCurrentlyActingEffectsInDEV(fiber) { +function warnIfUpdatesNotWrappedWithActDEV(fiber) { { - if ( - (fiber.mode & StrictLegacyMode) !== NoMode && - ReactCurrentActQueue.current === null && // Our internal tests use a custom implementation of `act` that works by - // mocking the Scheduler package. Disable the `act` warning. - // TODO: Maybe the warning should be disabled by default, and then turned - // on at the testing frameworks layer? Instead of what we do now, which - // is check if a `jest` global is defined. - ReactCurrentActQueue.disableActWarning === false - ) { - error( - "An update to %s ran an effect, but was not wrapped in act(...).\n\n" + - "When testing, code that causes React state updates should be " + - "wrapped into act(...):\n\n" + - "act(() => {\n" + - " /* fire events that update state */\n" + - "});\n" + - "/* assert on the output */\n\n" + - "This ensures that you're testing the behavior the user would see " + - "in the browser." + - " Learn more at https://reactjs.org/link/wrap-tests-with-act", - getComponentNameFromFiber(fiber) - ); + if (fiber.mode & ConcurrentMode) { + if (!isConcurrentActEnvironment()) { + // Not in an act environment. No need to warn. + return; + } + } else { + // Legacy mode has additional cases where we suppress a warning. + if (!isLegacyActEnvironment()) { + // Not in an act environment. No need to warn. + return; + } + + if (executionContext !== NoContext) { + // Legacy mode doesn't warn if the update is batched, i.e. + // batchedUpdates or flushSync. + return; + } + + if ( + fiber.tag !== FunctionComponent && + fiber.tag !== ForwardRef && + fiber.tag !== SimpleMemoComponent + ) { + // For backwards compatibility with pre-hooks code, legacy mode only + // warns for updates that originate from a hook. + return; + } } - } -} -function warnIfNotCurrentlyActingUpdatesInDEV(fiber) { - { - if ( - executionContext === NoContext && - ReactCurrentActQueue.current === null && // Our internal tests use a custom implementation of `act` that works by - // mocking the Scheduler package. Disable the `act` warning. - // TODO: Maybe the warning should be disabled by default, and then turned - // on at the testing frameworks layer? Instead of what we do now, which - // is check if a `jest` global is defined. - ReactCurrentActQueue.disableActWarning === false - ) { + if (ReactCurrentActQueue$1.current === null) { var previousFiber = current; try { @@ -22193,7 +22533,29 @@ function warnIfNotCurrentlyActingUpdatesInDEV(fiber) { } } -var warnIfNotCurrentlyActingUpdatesInDev = warnIfNotCurrentlyActingUpdatesInDEV; +function warnIfSuspenseResolutionNotWrappedWithActDEV(root) { + { + if ( + root.tag !== LegacyRoot && + isConcurrentActEnvironment() && + ReactCurrentActQueue$1.current === null + ) { + error( + "A suspended resource finished loading inside a test, but the event " + + "was not wrapped in act(...).\n\n" + + "When testing, code that resolves suspended data should be wrapped " + + "into act(...):\n\n" + + "act(() => {\n" + + " /* finish loading suspended data */\n" + + "});\n" + + "/* assert on the output */\n\n" + + "This ensures that you're testing the behavior the user would see " + + "in the browser." + + " Learn more at https://reactjs.org/link/wrap-tests-with-act" + ); + } + } +} /* eslint-disable react-internal/prod-error-codes */ var resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below. @@ -23487,6 +23849,10 @@ function updateContainer(element, container, parentComponent, callback) { var eventTime = requestEventTime(); var lane = requestUpdateLane(current$1); + { + markRenderScheduled(lane); + } + var context = getContextForSubtree(parentComponent); if (container.context === null) { @@ -24323,5 +24689,24 @@ exports.unmountComponentAtNode = unmountComponentAtNode; exports.unmountComponentAtNodeAndRemoveContainer = unmountComponentAtNodeAndRemoveContainer; exports.unstable_batchedUpdates = batchedUpdates; + /** + * 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. + */ + +/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + +// Don't require this file directly; it's embedded by Rollup during build. + +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); +} + })(); } diff --git a/Libraries/Renderer/implementations/ReactNativeRenderer-prod.fb.js b/Libraries/Renderer/implementations/ReactNativeRenderer-prod.fb.js index fc9aa87d9e93..249c56d22590 100644 --- a/Libraries/Renderer/implementations/ReactNativeRenderer-prod.fb.js +++ b/Libraries/Renderer/implementations/ReactNativeRenderer-prod.fb.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<> */ "use strict"; @@ -926,7 +926,7 @@ eventPluginOrder = Array.prototype.slice.call([ "ReactNativeBridgeEventPlugin" ]); recomputePluginOrdering(); -var injectedNamesToPlugins$jscomp$inline_222 = { +var injectedNamesToPlugins$jscomp$inline_221 = { ResponderEventPlugin: ResponderEventPlugin, ReactNativeBridgeEventPlugin: { eventTypes: {}, @@ -961,33 +961,33 @@ var injectedNamesToPlugins$jscomp$inline_222 = { } } }, - isOrderingDirty$jscomp$inline_223 = !1, - pluginName$jscomp$inline_224; -for (pluginName$jscomp$inline_224 in injectedNamesToPlugins$jscomp$inline_222) + isOrderingDirty$jscomp$inline_222 = !1, + pluginName$jscomp$inline_223; +for (pluginName$jscomp$inline_223 in injectedNamesToPlugins$jscomp$inline_221) if ( - injectedNamesToPlugins$jscomp$inline_222.hasOwnProperty( - pluginName$jscomp$inline_224 + injectedNamesToPlugins$jscomp$inline_221.hasOwnProperty( + pluginName$jscomp$inline_223 ) ) { - var pluginModule$jscomp$inline_225 = - injectedNamesToPlugins$jscomp$inline_222[pluginName$jscomp$inline_224]; + var pluginModule$jscomp$inline_224 = + injectedNamesToPlugins$jscomp$inline_221[pluginName$jscomp$inline_223]; if ( - !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_224) || - namesToPlugins[pluginName$jscomp$inline_224] !== - pluginModule$jscomp$inline_225 + !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_223) || + namesToPlugins[pluginName$jscomp$inline_223] !== + pluginModule$jscomp$inline_224 ) { - if (namesToPlugins[pluginName$jscomp$inline_224]) + if (namesToPlugins[pluginName$jscomp$inline_223]) throw Error( "EventPluginRegistry: Cannot inject two different event plugins using the same name, `" + - (pluginName$jscomp$inline_224 + "`.") + (pluginName$jscomp$inline_223 + "`.") ); namesToPlugins[ - pluginName$jscomp$inline_224 - ] = pluginModule$jscomp$inline_225; - isOrderingDirty$jscomp$inline_223 = !0; + pluginName$jscomp$inline_223 + ] = pluginModule$jscomp$inline_224; + isOrderingDirty$jscomp$inline_222 = !0; } } -isOrderingDirty$jscomp$inline_223 && recomputePluginOrdering(); +isOrderingDirty$jscomp$inline_222 && recomputePluginOrdering(); var instanceCache = new Map(), instanceProps = new Map(); function getInstanceFromTag(tag) { @@ -1697,6 +1697,13 @@ function onCommitRoot(root) { ); } catch (err) {} } +var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback, + log = Math.log, + LN2 = Math.LN2; +function clz32Fallback(x) { + x >>>= 0; + return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0; +} var nextTransitionLane = 64, nextRetryLane = 4194304; function getHighestPriorityLanes(lanes) { @@ -1880,12 +1887,6 @@ function markRootEntangled(root, entangledLanes) { rootEntangledLanes &= ~lane; } } -var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback, - log = Math.log, - LN2 = Math.LN2; -function clz32Fallback(lanes) { - return 0 === lanes ? 32 : (31 - ((log(lanes) / LN2) | 0)) | 0; -} var currentUpdatePriority = 0; function lanesToEventPriority(lanes) { lanes &= -lanes; @@ -2087,12 +2088,14 @@ function shallowEqual(objA, objB) { var keysA = Object.keys(objA), keysB = Object.keys(objB); if (keysA.length !== keysB.length) return !1; - for (keysB = 0; keysB < keysA.length; keysB++) + for (keysB = 0; keysB < keysA.length; keysB++) { + var currentKey = keysA[keysB]; if ( - !hasOwnProperty.call(objB, keysA[keysB]) || - !objectIs(objA[keysA[keysB]], objB[keysA[keysB]]) + !hasOwnProperty.call(objB, currentKey) || + !objectIs(objA[currentKey], objB[currentKey]) ) return !1; + } return !0; } function describeFiber(fiber) { @@ -2602,6 +2605,26 @@ function mountClassInstance(workInProgress, ctor, newProps, renderLanes) { "function" === typeof instance.componentDidMount && (workInProgress.flags |= 4); } +var forkStack = [], + forkStackIndex = 0, + treeForkProvider = null, + idStack = [], + idStackIndex = 0, + treeContextProvider = null; +function popTreeContext(workInProgress) { + for (; workInProgress === treeForkProvider; ) + (treeForkProvider = forkStack[--forkStackIndex]), + (forkStack[forkStackIndex] = null), + --forkStackIndex, + (forkStack[forkStackIndex] = null); + for (; workInProgress === treeContextProvider; ) + (treeContextProvider = idStack[--idStackIndex]), + (idStack[idStackIndex] = null), + --idStackIndex, + (idStack[idStackIndex] = null), + --idStackIndex, + (idStack[idStackIndex] = null); +} function coerceRef(returnFiber, current, element) { returnFiber = element.ref; if ( @@ -2696,7 +2719,8 @@ function ChildReconciler(shouldTrackSideEffects) { } function placeChild(newFiber, lastPlacedIndex, newIndex) { newFiber.index = newIndex; - if (!shouldTrackSideEffects) return lastPlacedIndex; + if (!shouldTrackSideEffects) + return (newFiber.flags |= 1048576), lastPlacedIndex; newIndex = newFiber.alternate; if (null !== newIndex) return ( @@ -3300,7 +3324,8 @@ var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher, currentHook = null, workInProgressHook = null, didScheduleRenderPhaseUpdate = !1, - didScheduleRenderPhaseUpdateDuringThisPass = !1; + didScheduleRenderPhaseUpdateDuringThisPass = !1, + globalClientIdCounter = 0; function throwInvalidHookError() { throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." @@ -3503,104 +3528,7 @@ function rerenderReducer(reducer) { } return [newState, dispatch]; } -function readFromUnsubscribedMutableSource(root, source, getSnapshot) { - var getVersion = source._getVersion; - getVersion = getVersion(source._source); - var JSCompiler_inline_result = source._workInProgressVersionPrimary; - if (null !== JSCompiler_inline_result) - root = JSCompiler_inline_result === getVersion; - else if ( - ((root = root.mutableReadLanes), (root = (renderLanes & root) === root)) - ) - (source._workInProgressVersionPrimary = getVersion), - workInProgressSources.push(source); - if (root) return getSnapshot(source._source); - workInProgressSources.push(source); - throw Error( - "Cannot read from mutable source during the current render without tearing. This may be a bug in React. Please file an issue." - ); -} -function useMutableSource(hook, source, getSnapshot, subscribe) { - var root = workInProgressRoot; - if (null === root) - throw Error( - "Expected a work-in-progress root. This is a bug in React. Please file an issue." - ); - var getVersion = source._getVersion, - version = getVersion(source._source), - dispatcher = ReactCurrentDispatcher$1.current, - _dispatcher$useState = dispatcher.useState(function() { - return readFromUnsubscribedMutableSource(root, source, getSnapshot); - }), - setSnapshot = _dispatcher$useState[1], - snapshot = _dispatcher$useState[0]; - _dispatcher$useState = workInProgressHook; - var memoizedState = hook.memoizedState, - refs = memoizedState.refs, - prevGetSnapshot = refs.getSnapshot, - prevSource = memoizedState.source; - memoizedState = memoizedState.subscribe; - var fiber = currentlyRenderingFiber$1; - hook.memoizedState = { refs: refs, source: source, subscribe: subscribe }; - dispatcher.useEffect( - function() { - refs.getSnapshot = getSnapshot; - refs.setSnapshot = setSnapshot; - var maybeNewVersion = getVersion(source._source); - objectIs(version, maybeNewVersion) || - ((maybeNewVersion = getSnapshot(source._source)), - objectIs(snapshot, maybeNewVersion) || - (setSnapshot(maybeNewVersion), - (maybeNewVersion = requestUpdateLane(fiber)), - (root.mutableReadLanes |= maybeNewVersion & root.pendingLanes)), - markRootEntangled(root, root.mutableReadLanes)); - }, - [getSnapshot, source, subscribe] - ); - dispatcher.useEffect( - function() { - return subscribe(source._source, function() { - var latestGetSnapshot = refs.getSnapshot, - latestSetSnapshot = refs.setSnapshot; - try { - latestSetSnapshot(latestGetSnapshot(source._source)); - var lane = requestUpdateLane(fiber); - root.mutableReadLanes |= lane & root.pendingLanes; - } catch (error) { - latestSetSnapshot(function() { - throw error; - }); - } - }); - }, - [source, subscribe] - ); - (objectIs(prevGetSnapshot, getSnapshot) && - objectIs(prevSource, source) && - objectIs(memoizedState, subscribe)) || - ((hook = { - pending: null, - interleaved: null, - lanes: 0, - dispatch: null, - lastRenderedReducer: basicStateReducer, - lastRenderedState: snapshot - }), - (hook.dispatch = setSnapshot = dispatchSetState.bind( - null, - currentlyRenderingFiber$1, - hook - )), - (_dispatcher$useState.queue = hook), - (_dispatcher$useState.baseQueue = null), - (snapshot = readFromUnsubscribedMutableSource(root, source, getSnapshot)), - (_dispatcher$useState.memoizedState = _dispatcher$useState.baseState = snapshot)); - return snapshot; -} -function updateMutableSource(source, getSnapshot, subscribe) { - var hook = updateWorkInProgressHook(); - return useMutableSource(hook, source, getSnapshot, subscribe); -} +function updateMutableSource() {} function mountSyncExternalStore(subscribe, getSnapshot) { var fiber = currentlyRenderingFiber$1, hook = mountWorkInProgressHook(); @@ -3723,7 +3651,7 @@ function updateEffectImpl(fiberFlags, hookFlags, create, deps) { hook.memoizedState = pushEffect(1 | hookFlags, create, destroy, deps); } function mountEffect(create, deps) { - return mountEffectImpl(4196352, 8, create, deps); + return mountEffectImpl(8390656, 8, create, deps); } function updateEffect(create, deps) { return updateEffectImpl(2048, 8, create, deps); @@ -3803,6 +3731,9 @@ function startTransition(setPending, callback) { (ReactCurrentBatchConfig$1.transition = prevTransition); } } +function updateId() { + return updateWorkInProgressHook().memoizedState; +} function dispatchReducerAction(fiber, queue, action) { var lane = requestUpdateLane(fiber); action = { @@ -3910,7 +3841,7 @@ var ContextOnlyDispatcher = { useTransition: throwInvalidHookError, useMutableSource: throwInvalidHookError, useSyncExternalStore: throwInvalidHookError, - useOpaqueIdentifier: throwInvalidHookError, + useId: throwInvalidHookError, unstable_isNewReconciler: !1 }, HooksDispatcherOnMount = { @@ -3998,18 +3929,12 @@ var ContextOnlyDispatcher = { mountWorkInProgressHook().memoizedState = _mountState2; return [isPending, _mountState2]; }, - useMutableSource: function(source, getSnapshot, subscribe) { - var hook = mountWorkInProgressHook(); - hook.memoizedState = { - refs: { getSnapshot: getSnapshot, setSnapshot: null }, - source: source, - subscribe: subscribe - }; - return useMutableSource(hook, source, getSnapshot, subscribe); - }, + useMutableSource: function() {}, useSyncExternalStore: mountSyncExternalStore, - useOpaqueIdentifier: function() { - throw Error("Not yet implemented"); + useId: function() { + var hook = mountWorkInProgressHook(); + var id = "r:" + (globalClientIdCounter++).toString(32); + return (hook.memoizedState = id); }, unstable_isNewReconciler: !1 }, @@ -4092,9 +4017,7 @@ var ContextOnlyDispatcher = { } return nextSnapshot; }, - useOpaqueIdentifier: function() { - return updateReducer(basicStateReducer)[0]; - }, + useId: updateId, unstable_isNewReconciler: !1 }, HooksDispatcherOnRerender = { @@ -4137,9 +4060,7 @@ var ContextOnlyDispatcher = { }, useMutableSource: updateMutableSource, useSyncExternalStore: mountSyncExternalStore, - useOpaqueIdentifier: function() { - return rerenderReducer(basicStateReducer)[0]; - }, + useId: updateId, unstable_isNewReconciler: !1 }; function createCapturedValue(value, source) { @@ -4273,8 +4194,8 @@ function bubbleProperties(completedWork) { if (didBailout) for (var child$36 = completedWork.child; null !== child$36; ) (newChildLanes |= child$36.lanes | child$36.childLanes), - (subtreeFlags |= child$36.subtreeFlags & 7340032), - (subtreeFlags |= child$36.flags & 7340032), + (subtreeFlags |= child$36.subtreeFlags & 14680064), + (subtreeFlags |= child$36.flags & 14680064), (child$36.return = completedWork), (child$36 = child$36.sibling); else @@ -4290,6 +4211,7 @@ function bubbleProperties(completedWork) { } function completeWork(current, workInProgress, renderLanes) { var newProps = workInProgress.pendingProps; + popTreeContext(workInProgress); switch (workInProgress.tag) { case 2: case 16: @@ -4434,7 +4356,7 @@ function completeWork(current, workInProgress, renderLanes) { workInProgressRootExitStatus = 4; null === workInProgressRoot || (0 === (workInProgressRootSkippedLanes & 268435455) && - 0 === (workInProgressRootUpdatedLanes & 268435455)) || + 0 === (workInProgressRootInterleavedUpdatedLanes & 268435455)) || markRootSuspended$1( workInProgressRoot, workInProgressRootRenderLanes @@ -4489,7 +4411,7 @@ function completeWork(current, workInProgress, renderLanes) { for (newProps = workInProgress.child; null !== newProps; ) (renderLanes = newProps), (type = current), - (renderLanes.flags &= 7340034), + (renderLanes.flags &= 14680066), (updatePayload = renderLanes.alternate), null === updatePayload ? ((renderLanes.childLanes = 0), @@ -5070,7 +4992,7 @@ function pushHostRootContext(workInProgress) { pushTopLevelContextObject(workInProgress, root.context, !1); pushHostContainer(workInProgress, root.containerInfo); } -var SUSPENDED_MARKER = { dehydrated: null, retryLane: 0 }; +var SUSPENDED_MARKER = { dehydrated: null, treeContext: null, retryLane: 0 }; function mountSuspenseOffscreenState(renderLanes) { return { baseLanes: renderLanes, cachePool: null }; } @@ -5263,7 +5185,7 @@ function updateSuspenseFallbackChildren( (primaryChildren.pendingProps = primaryChildProps), (workInProgress.deletions = null)) : ((primaryChildren = createWorkInProgress(current, primaryChildProps)), - (primaryChildren.subtreeFlags = current.subtreeFlags & 7340032)); + (primaryChildren.subtreeFlags = current.subtreeFlags & 14680064)); null !== currentFallbackChildFragment ? (fallbackChildren = createWorkInProgress( currentFallbackChildFragment, @@ -5487,6 +5409,7 @@ function attemptEarlyBailoutIfNoScheduledUpdate( return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); } function unwindWork(workInProgress) { + popTreeContext(workInProgress); switch (workInProgress.tag) { case 1: isContextProvider(workInProgress.type) && popContext(); @@ -5544,6 +5467,13 @@ function safelyDetachRef(current, nearestMountedAncestor) { } else ref.current = null; } +function safelyCallDestroy(current, nearestMountedAncestor, destroy) { + try { + destroy(); + } catch (error) { + captureCommitPhaseError(current, nearestMountedAncestor, error); + } +} var shouldFireAfterActiveInstanceBlur = !1; function commitBeforeMutationEffects(root, firstChild) { for (nextEffect = firstChild; null !== nextEffect; ) @@ -5608,7 +5538,7 @@ function commitBeforeMutationEffects(root, firstChild) { function commitHookEffectListUnmount( flags, finishedWork, - nearestMountedAncestor$jscomp$0 + nearestMountedAncestor ) { var updateQueue = finishedWork.updateQueue; updateQueue = null !== updateQueue ? updateQueue.lastEffect : null; @@ -5618,27 +5548,20 @@ function commitHookEffectListUnmount( if ((effect.tag & flags) === flags) { var destroy = effect.destroy; effect.destroy = void 0; - if (void 0 !== destroy) { - var current = finishedWork, - nearestMountedAncestor = nearestMountedAncestor$jscomp$0; - try { - destroy(); - } catch (error) { - captureCommitPhaseError(current, nearestMountedAncestor, error); - } - } + void 0 !== destroy && + safelyCallDestroy(finishedWork, nearestMountedAncestor, destroy); } effect = effect.next; } while (effect !== updateQueue); } } -function commitHookEffectListMount(tag, finishedWork) { +function commitHookEffectListMount(flags, finishedWork) { finishedWork = finishedWork.updateQueue; finishedWork = null !== finishedWork ? finishedWork.lastEffect : null; if (null !== finishedWork) { var effect = (finishedWork = finishedWork.next); do { - if ((effect.tag & tag) === tag) { + if ((effect.tag & flags) === flags) { var create$80 = effect.create; effect.destroy = create$80(); } @@ -5646,7 +5569,7 @@ function commitHookEffectListMount(tag, finishedWork) { } while (effect !== finishedWork); } } -function commitUnmount(finishedRoot, current, nearestMountedAncestor$jscomp$0) { +function commitUnmount(finishedRoot, current, nearestMountedAncestor) { if (injectedHook && "function" === typeof injectedHook.onCommitFiberUnmount) try { injectedHook.onCommitFiberUnmount(rendererID, current); @@ -5666,24 +5589,17 @@ function commitUnmount(finishedRoot, current, nearestMountedAncestor$jscomp$0) { var _effect = effect, destroy = _effect.destroy; _effect = _effect.tag; - if ( - void 0 !== destroy && - (0 !== (_effect & 2) || 0 !== (_effect & 4)) - ) { - _effect = current; - var nearestMountedAncestor = nearestMountedAncestor$jscomp$0; - try { - destroy(); - } catch (error) { - captureCommitPhaseError(_effect, nearestMountedAncestor, error); - } - } + void 0 !== destroy && + (0 !== (_effect & 2) + ? safelyCallDestroy(current, nearestMountedAncestor, destroy) + : 0 !== (_effect & 4) && + safelyCallDestroy(current, nearestMountedAncestor, destroy)); effect = effect.next; } while (effect !== finishedRoot); } break; case 1: - safelyDetachRef(current, nearestMountedAncestor$jscomp$0); + safelyDetachRef(current, nearestMountedAncestor); finishedRoot = current.stateNode; if ("function" === typeof finishedRoot.componentWillUnmount) try { @@ -5691,22 +5607,14 @@ function commitUnmount(finishedRoot, current, nearestMountedAncestor$jscomp$0) { (finishedRoot.state = current.memoizedState), finishedRoot.componentWillUnmount(); } catch (error) { - captureCommitPhaseError( - current, - nearestMountedAncestor$jscomp$0, - error - ); + captureCommitPhaseError(current, nearestMountedAncestor, error); } break; case 5: - safelyDetachRef(current, nearestMountedAncestor$jscomp$0); + safelyDetachRef(current, nearestMountedAncestor); break; case 4: - unmountHostComponents( - finishedRoot, - current, - nearestMountedAncestor$jscomp$0 - ); + unmountHostComponents(finishedRoot, current, nearestMountedAncestor); } } function detachFiberAfterEffects(fiber) { @@ -6340,7 +6248,8 @@ var ceil = Math.ceil, workInProgressRootExitStatus = 0, workInProgressRootFatalError = null, workInProgressRootSkippedLanes = 0, - workInProgressRootUpdatedLanes = 0, + workInProgressRootInterleavedUpdatedLanes = 0, + workInProgressRootRenderPhaseUpdatedLanes = 0, workInProgressRootPingedLanes = 0, globalMostRecentFallbackTime = 0, workInProgressRootRenderTargetTime = Infinity, @@ -6387,16 +6296,19 @@ function scheduleUpdateOnFiber(fiber, lane, eventTime) { var root = markUpdateLaneFromFiberToRoot(fiber, lane); if (null === root) return null; markRootUpdated(root, lane, eventTime); - root === workInProgressRoot && - (0 === (executionContext & 2) && (workInProgressRootUpdatedLanes |= lane), - 4 === workInProgressRootExitStatus && - markRootSuspended$1(root, workInProgressRootRenderLanes)); - ensureRootIsScheduled(root, eventTime); - 1 === lane && - 0 === executionContext && - 0 === (fiber.mode & 1) && - ((workInProgressRootRenderTargetTime = now() + 500), - includesLegacySyncCallbacks && flushSyncCallbacks()); + 0 !== (executionContext & 2) && root === workInProgressRoot + ? (workInProgressRootRenderPhaseUpdatedLanes |= lane) + : (root === workInProgressRoot && + (0 === (executionContext & 2) && + (workInProgressRootInterleavedUpdatedLanes |= lane), + 4 === workInProgressRootExitStatus && + markRootSuspended$1(root, workInProgressRootRenderLanes)), + ensureRootIsScheduled(root, eventTime), + 1 === lane && + 0 === executionContext && + 0 === (fiber.mode & 1) && + ((workInProgressRootRenderTargetTime = now() + 500), + includesLegacySyncCallbacks && flushSyncCallbacks())); return root; } function markUpdateLaneFromFiberToRoot(sourceFiber, lane) { @@ -6643,9 +6555,15 @@ function recoverFromConcurrentError(root, errorRetryLanes) { var prevExecutionContext = executionContext; executionContext |= 8; root.isDehydrated && (root.isDehydrated = !1); - root = renderRootSync(root, errorRetryLanes); + for ( + var exitStatus, i = 0; + 50 > i && + ((exitStatus = renderRootSync(root, errorRetryLanes)), + 2 === exitStatus && 0 !== workInProgressRootRenderPhaseUpdatedLanes); + i++ + ); executionContext = prevExecutionContext; - return root; + return exitStatus; } function isRenderConsistentWithExternalStores(finishedWork) { for (var node = finishedWork; ; ) { @@ -6683,7 +6601,7 @@ function isRenderConsistentWithExternalStores(finishedWork) { } function markRootSuspended$1(root, suspendedLanes) { suspendedLanes &= ~workInProgressRootPingedLanes; - suspendedLanes &= ~workInProgressRootUpdatedLanes; + suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes; root.suspendedLanes |= suspendedLanes; root.pingedLanes &= ~suspendedLanes; for (root = root.expirationTimes; 0 < suspendedLanes; ) { @@ -6701,13 +6619,10 @@ function performSyncWorkOnRoot(root) { if (0 === (lanes & 1)) return ensureRootIsScheduled(root, now()), null; var exitStatus = renderRootSync(root, lanes); if (0 !== root.tag && 2 === exitStatus) { - var prevExecutionContext = executionContext; - executionContext |= 8; - root.isDehydrated && (root.isDehydrated = !1); var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root); 0 !== errorRetryLanes && - ((lanes = errorRetryLanes), (exitStatus = renderRootSync(root, lanes))); - executionContext = prevExecutionContext; + ((lanes = errorRetryLanes), + (exitStatus = recoverFromConcurrentError(root, errorRetryLanes))); } if (1 === exitStatus) throw ((exitStatus = workInProgressRootFatalError), @@ -6734,6 +6649,7 @@ function prepareFreshStack(root, lanes) { if (null !== workInProgress) for (timeoutHandle = workInProgress.return; null !== timeoutHandle; ) { var interruptedWork = timeoutHandle; + popTreeContext(interruptedWork); switch (interruptedWork.tag) { case 1: interruptedWork = interruptedWork.type.childContextTypes; @@ -6773,7 +6689,7 @@ function prepareFreshStack(root, lanes) { workInProgressRootRenderLanes = subtreeRenderLanes = lanes; workInProgressRootExitStatus = 0; workInProgressRootFatalError = null; - workInProgressRootPingedLanes = workInProgressRootUpdatedLanes = workInProgressRootSkippedLanes = 0; + workInProgressRootPingedLanes = workInProgressRootRenderPhaseUpdatedLanes = workInProgressRootInterleavedUpdatedLanes = workInProgressRootSkippedLanes = 0; if (null !== interleavedQueues) { for (root = 0; root < interleavedQueues.length; root++) if ( @@ -7875,7 +7791,7 @@ function createWorkInProgress(current, pendingProps) { (workInProgress.flags = 0), (workInProgress.subtreeFlags = 0), (workInProgress.deletions = null)); - workInProgress.flags = current.flags & 7340032; + workInProgress.flags = current.flags & 14680064; workInProgress.childLanes = current.childLanes; workInProgress.lanes = current.lanes; workInProgress.child = current.child; @@ -8231,10 +8147,10 @@ batchedUpdatesImpl = function(fn, a) { } }; var roots = new Map(), - devToolsConfig$jscomp$inline_976 = { + devToolsConfig$jscomp$inline_952 = { findFiberByHostInstance: getInstanceFromTag, bundleType: 0, - version: "18.0.0-afcb9cdc9-20211008", + version: "18.0.0-3fcd81dd1-20211102", rendererPackageName: "react-native-renderer", rendererConfig: { getInspectorDataForViewTag: function() { @@ -8249,11 +8165,11 @@ var roots = new Map(), }.bind(null, findNodeHandle) } }; -var internals$jscomp$inline_1240 = { - bundleType: devToolsConfig$jscomp$inline_976.bundleType, - version: devToolsConfig$jscomp$inline_976.version, - rendererPackageName: devToolsConfig$jscomp$inline_976.rendererPackageName, - rendererConfig: devToolsConfig$jscomp$inline_976.rendererConfig, +var internals$jscomp$inline_1211 = { + bundleType: devToolsConfig$jscomp$inline_952.bundleType, + version: devToolsConfig$jscomp$inline_952.version, + rendererPackageName: devToolsConfig$jscomp$inline_952.rendererPackageName, + rendererConfig: devToolsConfig$jscomp$inline_952.rendererConfig, overrideHookState: null, overrideHookStateDeletePath: null, overrideHookStateRenamePath: null, @@ -8269,26 +8185,26 @@ var internals$jscomp$inline_1240 = { return null === fiber ? null : fiber.stateNode; }, findFiberByHostInstance: - devToolsConfig$jscomp$inline_976.findFiberByHostInstance || + devToolsConfig$jscomp$inline_952.findFiberByHostInstance || emptyFindFiberByHostInstance, findHostInstancesForRefresh: null, scheduleRefresh: null, scheduleRoot: null, setRefreshHandler: null, getCurrentFiber: null, - reconcilerVersion: "18.0.0-afcb9cdc9-20211008" + reconcilerVersion: "18.0.0-3fcd81dd1-20211102" }; if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { - var hook$jscomp$inline_1241 = __REACT_DEVTOOLS_GLOBAL_HOOK__; + var hook$jscomp$inline_1212 = __REACT_DEVTOOLS_GLOBAL_HOOK__; if ( - !hook$jscomp$inline_1241.isDisabled && - hook$jscomp$inline_1241.supportsFiber + !hook$jscomp$inline_1212.isDisabled && + hook$jscomp$inline_1212.supportsFiber ) try { - (rendererID = hook$jscomp$inline_1241.inject( - internals$jscomp$inline_1240 + (rendererID = hook$jscomp$inline_1212.inject( + internals$jscomp$inline_1211 )), - (injectedHook = hook$jscomp$inline_1241); + (injectedHook = hook$jscomp$inline_1212); } catch (err) {} } exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = { diff --git a/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.fb.js b/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.fb.js index 8916f57175fe..589d02c3b16f 100644 --- a/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.fb.js +++ b/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.fb.js @@ -7,10 +7,29 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<<3965891898f053c31929e4bcdfda0c74>> */ -"use strict"; + + /** + * 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. + */ + +/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + +// Don't require this file directly; it's embedded by Rollup during build. + +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); +} + "use strict"; require("react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore"); var ReactNativePrivateInterface = require("react-native/Libraries/ReactPrivate/ReactNativePrivateInterface"), React = require("react"); @@ -926,7 +945,7 @@ eventPluginOrder = Array.prototype.slice.call([ "ReactNativeBridgeEventPlugin" ]); recomputePluginOrdering(); -var injectedNamesToPlugins$jscomp$inline_230 = { +var injectedNamesToPlugins$jscomp$inline_244 = { ResponderEventPlugin: ResponderEventPlugin, ReactNativeBridgeEventPlugin: { eventTypes: {}, @@ -961,33 +980,33 @@ var injectedNamesToPlugins$jscomp$inline_230 = { } } }, - isOrderingDirty$jscomp$inline_231 = !1, - pluginName$jscomp$inline_232; -for (pluginName$jscomp$inline_232 in injectedNamesToPlugins$jscomp$inline_230) + isOrderingDirty$jscomp$inline_245 = !1, + pluginName$jscomp$inline_246; +for (pluginName$jscomp$inline_246 in injectedNamesToPlugins$jscomp$inline_244) if ( - injectedNamesToPlugins$jscomp$inline_230.hasOwnProperty( - pluginName$jscomp$inline_232 + injectedNamesToPlugins$jscomp$inline_244.hasOwnProperty( + pluginName$jscomp$inline_246 ) ) { - var pluginModule$jscomp$inline_233 = - injectedNamesToPlugins$jscomp$inline_230[pluginName$jscomp$inline_232]; + var pluginModule$jscomp$inline_247 = + injectedNamesToPlugins$jscomp$inline_244[pluginName$jscomp$inline_246]; if ( - !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_232) || - namesToPlugins[pluginName$jscomp$inline_232] !== - pluginModule$jscomp$inline_233 + !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_246) || + namesToPlugins[pluginName$jscomp$inline_246] !== + pluginModule$jscomp$inline_247 ) { - if (namesToPlugins[pluginName$jscomp$inline_232]) + if (namesToPlugins[pluginName$jscomp$inline_246]) throw Error( "EventPluginRegistry: Cannot inject two different event plugins using the same name, `" + - (pluginName$jscomp$inline_232 + "`.") + (pluginName$jscomp$inline_246 + "`.") ); namesToPlugins[ - pluginName$jscomp$inline_232 - ] = pluginModule$jscomp$inline_233; - isOrderingDirty$jscomp$inline_231 = !0; + pluginName$jscomp$inline_246 + ] = pluginModule$jscomp$inline_247; + isOrderingDirty$jscomp$inline_245 = !0; } } -isOrderingDirty$jscomp$inline_231 && recomputePluginOrdering(); +isOrderingDirty$jscomp$inline_245 && recomputePluginOrdering(); var instanceCache = new Map(), instanceProps = new Map(); function getInstanceFromTag(tag) { @@ -1715,6 +1734,27 @@ function onCommitRoot(root, eventPriority) { ); } catch (err) {} } +var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback, + log = Math.log, + LN2 = Math.LN2; +function clz32Fallback(x) { + x >>>= 0; + return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0; +} +function getLabelForLane(lane) { + if (lane & 1) return "Sync"; + if (lane & 2) return "InputContinuousHydration"; + if (lane & 4) return "InputContinuous"; + if (lane & 8) return "DefaultHydration"; + if (lane & 16) return "Default"; + if (lane & 32) return "TransitionHydration"; + if (lane & 4194240) return "Transition"; + if (lane & 130023424) return "Retry"; + if (lane & 134217728) return "SelectiveHydration"; + if (lane & 268435456) return "IdleHydration"; + if (lane & 536870912) return "Idle"; + if (lane & 1073741824) return "Offscreen"; +} var nextTransitionLane = 64, nextRetryLane = 4194304; function getHighestPriorityLanes(lanes) { @@ -1928,12 +1968,6 @@ function movePendingFibersToMemoized(root, lanes) { lanes &= ~root; } } -var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback, - log = Math.log, - LN2 = Math.LN2; -function clz32Fallback(lanes) { - return 0 === lanes ? 32 : (31 - ((log(lanes) / LN2) | 0)) | 0; -} var currentUpdatePriority = 0; function lanesToEventPriority(lanes) { lanes &= -lanes; @@ -2122,6 +2156,112 @@ function flushSyncCallbacks() { } return null; } +var supportsUserTimingV3 = !1; +if ( + "undefined" !== typeof performance && + "function" === typeof performance.mark && + "function" === typeof performance.clearMarks +) { + var markOptions = {}; + Object.defineProperty(markOptions, "startTime", { + get: function() { + supportsUserTimingV3 = !0; + return 0; + }, + set: function() {} + }); + try { + performance.mark("__v3", markOptions); + } catch (error) { + } finally { + performance.clearMarks("__v3"); + } +} +var laneLabels = []; +function getLaneLabels() { + if (0 === laneLabels.length) + for (var lane = 1, index$13 = 0; 31 > index$13; index$13++) + laneLabels.push(getLabelForLane(lane)), (lane *= 2); + return laneLabels; +} +function markAndClear(name) { + performance.mark(name); + performance.clearMarks(name); +} +function markInternalModuleRanges() { + if ( + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && + "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.getInternalModuleRanges + ) + for ( + var ranges = __REACT_DEVTOOLS_GLOBAL_HOOK__.getInternalModuleRanges(), + i = 0; + i < ranges.length; + i++ + ) { + var _ranges$i = ranges[i], + stopStackFrame = _ranges$i[1]; + markAndClear("--react-internal-module-start-" + _ranges$i[0]); + markAndClear("--react-internal-module-stop-" + stopStackFrame); + } +} +function markComponentRenderStarted(fiber) { + supportsUserTimingV3 && + ((fiber = getComponentNameFromFiber(fiber) || "Unknown"), + markAndClear("--component-render-start-" + fiber)); +} +function markComponentRenderStopped() { + supportsUserTimingV3 && markAndClear("--component-render-stop"); +} +function markComponentLayoutEffectUnmountStarted(fiber) { + supportsUserTimingV3 && + ((fiber = getComponentNameFromFiber(fiber) || "Unknown"), + markAndClear("--component-layout-effect-unmount-start-" + fiber)); +} +function markComponentLayoutEffectUnmountStopped() { + supportsUserTimingV3 && + markAndClear("--component-layout-effect-unmount-stop"); +} +var wakeableIDs = new ("function" === typeof WeakMap ? WeakMap : Map)(), + wakeableID = 0; +function getWakeableID(wakeable) { + wakeableIDs.has(wakeable) || wakeableIDs.set(wakeable, wakeableID++); + return wakeableIDs.get(wakeable); +} +function markComponentSuspended(fiber, wakeable, lanes) { + if (supportsUserTimingV3) { + var eventType = wakeableIDs.has(wakeable) ? "resuspend" : "suspend", + id = getWakeableID(wakeable), + componentName = getComponentNameFromFiber(fiber) || "Unknown"; + markAndClear( + "--suspense-" + + eventType + + "-" + + id + + "-" + + componentName + + "-" + + (null === fiber.alternate ? "mount" : "update") + + "-" + + lanes + + "-" + + (wakeable.displayName || "") + ); + wakeable.then( + function() { + return markAndClear("--suspense-resolved-" + id + "-" + componentName); + }, + function() { + return markAndClear("--suspense-rejected-" + id + "-" + componentName); + } + ); + } +} +function markStateUpdateScheduled(fiber, lane) { + supportsUserTimingV3 && + ((fiber = getComponentNameFromFiber(fiber) || "Unknown"), + markAndClear("--schedule-state-update-" + lane + "-" + fiber)); +} var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; function shallowEqual(objA, objB) { if (objectIs(objA, objB)) return !0; @@ -2135,12 +2275,14 @@ function shallowEqual(objA, objB) { var keysA = Object.keys(objA), keysB = Object.keys(objB); if (keysA.length !== keysB.length) return !1; - for (keysB = 0; keysB < keysA.length; keysB++) + for (keysB = 0; keysB < keysA.length; keysB++) { + var currentKey = keysA[keysB]; if ( - !hasOwnProperty.call(objB, keysA[keysB]) || - !objectIs(objA[keysA[keysB]], objB[keysA[keysB]]) + !hasOwnProperty.call(objB, currentKey) || + !objectIs(objA[currentKey], objB[currentKey]) ) return !1; + } return !0; } function describeFiber(fiber) { @@ -2535,6 +2677,7 @@ var classComponentUpdater = { enqueueUpdate(inst, update); payload = scheduleUpdateOnFiber(inst, lane, eventTime); null !== payload && entangleTransitions(payload, inst, lane); + markStateUpdateScheduled(inst, lane); }, enqueueReplaceState: function(inst, payload, callback) { inst = inst._reactInternals; @@ -2547,17 +2690,21 @@ var classComponentUpdater = { enqueueUpdate(inst, update); payload = scheduleUpdateOnFiber(inst, lane, eventTime); null !== payload && entangleTransitions(payload, inst, lane); + markStateUpdateScheduled(inst, lane); }, enqueueForceUpdate: function(inst, callback) { - inst = inst._reactInternals; - var eventTime = requestEventTime(), - lane = requestUpdateLane(inst), - update = createUpdate(eventTime, lane); + var fiber = inst._reactInternals, + eventTime = requestEventTime(); + inst = requestUpdateLane(fiber); + var update = createUpdate(eventTime, inst); update.tag = 2; void 0 !== callback && null !== callback && (update.callback = callback); - enqueueUpdate(inst, update); - callback = scheduleUpdateOnFiber(inst, lane, eventTime); - null !== callback && entangleTransitions(callback, inst, lane); + enqueueUpdate(fiber, update); + callback = scheduleUpdateOnFiber(fiber, inst, eventTime); + null !== callback && entangleTransitions(callback, fiber, inst); + supportsUserTimingV3 && + ((callback = getComponentNameFromFiber(fiber) || "Unknown"), + markAndClear("--schedule-forced-update-" + inst + "-" + callback)); } }; function checkShouldComponentUpdate( @@ -2650,6 +2797,26 @@ function mountClassInstance(workInProgress, ctor, newProps, renderLanes) { "function" === typeof instance.componentDidMount && (workInProgress.flags |= 4); } +var forkStack = [], + forkStackIndex = 0, + treeForkProvider = null, + idStack = [], + idStackIndex = 0, + treeContextProvider = null; +function popTreeContext(workInProgress) { + for (; workInProgress === treeForkProvider; ) + (treeForkProvider = forkStack[--forkStackIndex]), + (forkStack[forkStackIndex] = null), + --forkStackIndex, + (forkStack[forkStackIndex] = null); + for (; workInProgress === treeContextProvider; ) + (treeContextProvider = idStack[--idStackIndex]), + (idStack[idStackIndex] = null), + --idStackIndex, + (idStack[idStackIndex] = null), + --idStackIndex, + (idStack[idStackIndex] = null); +} function coerceRef(returnFiber, current, element) { returnFiber = element.ref; if ( @@ -2744,7 +2911,8 @@ function ChildReconciler(shouldTrackSideEffects) { } function placeChild(newFiber, lastPlacedIndex, newIndex) { newFiber.index = newIndex; - if (!shouldTrackSideEffects) return lastPlacedIndex; + if (!shouldTrackSideEffects) + return (newFiber.flags |= 1048576), lastPlacedIndex; newIndex = newFiber.alternate; if (null !== newIndex) return ( @@ -3348,7 +3516,8 @@ var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher, currentHook = null, workInProgressHook = null, didScheduleRenderPhaseUpdate = !1, - didScheduleRenderPhaseUpdateDuringThisPass = !1; + didScheduleRenderPhaseUpdateDuringThisPass = !1, + globalClientIdCounter = 0; function throwInvalidHookError() { throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." @@ -3551,104 +3720,7 @@ function rerenderReducer(reducer) { } return [newState, dispatch]; } -function readFromUnsubscribedMutableSource(root, source, getSnapshot) { - var getVersion = source._getVersion; - getVersion = getVersion(source._source); - var JSCompiler_inline_result = source._workInProgressVersionPrimary; - if (null !== JSCompiler_inline_result) - root = JSCompiler_inline_result === getVersion; - else if ( - ((root = root.mutableReadLanes), (root = (renderLanes & root) === root)) - ) - (source._workInProgressVersionPrimary = getVersion), - workInProgressSources.push(source); - if (root) return getSnapshot(source._source); - workInProgressSources.push(source); - throw Error( - "Cannot read from mutable source during the current render without tearing. This may be a bug in React. Please file an issue." - ); -} -function useMutableSource(hook, source, getSnapshot, subscribe) { - var root = workInProgressRoot; - if (null === root) - throw Error( - "Expected a work-in-progress root. This is a bug in React. Please file an issue." - ); - var getVersion = source._getVersion, - version = getVersion(source._source), - dispatcher = ReactCurrentDispatcher$1.current, - _dispatcher$useState = dispatcher.useState(function() { - return readFromUnsubscribedMutableSource(root, source, getSnapshot); - }), - setSnapshot = _dispatcher$useState[1], - snapshot = _dispatcher$useState[0]; - _dispatcher$useState = workInProgressHook; - var memoizedState = hook.memoizedState, - refs = memoizedState.refs, - prevGetSnapshot = refs.getSnapshot, - prevSource = memoizedState.source; - memoizedState = memoizedState.subscribe; - var fiber = currentlyRenderingFiber$1; - hook.memoizedState = { refs: refs, source: source, subscribe: subscribe }; - dispatcher.useEffect( - function() { - refs.getSnapshot = getSnapshot; - refs.setSnapshot = setSnapshot; - var maybeNewVersion = getVersion(source._source); - objectIs(version, maybeNewVersion) || - ((maybeNewVersion = getSnapshot(source._source)), - objectIs(snapshot, maybeNewVersion) || - (setSnapshot(maybeNewVersion), - (maybeNewVersion = requestUpdateLane(fiber)), - (root.mutableReadLanes |= maybeNewVersion & root.pendingLanes)), - markRootEntangled(root, root.mutableReadLanes)); - }, - [getSnapshot, source, subscribe] - ); - dispatcher.useEffect( - function() { - return subscribe(source._source, function() { - var latestGetSnapshot = refs.getSnapshot, - latestSetSnapshot = refs.setSnapshot; - try { - latestSetSnapshot(latestGetSnapshot(source._source)); - var lane = requestUpdateLane(fiber); - root.mutableReadLanes |= lane & root.pendingLanes; - } catch (error) { - latestSetSnapshot(function() { - throw error; - }); - } - }); - }, - [source, subscribe] - ); - (objectIs(prevGetSnapshot, getSnapshot) && - objectIs(prevSource, source) && - objectIs(memoizedState, subscribe)) || - ((hook = { - pending: null, - interleaved: null, - lanes: 0, - dispatch: null, - lastRenderedReducer: basicStateReducer, - lastRenderedState: snapshot - }), - (hook.dispatch = setSnapshot = dispatchSetState.bind( - null, - currentlyRenderingFiber$1, - hook - )), - (_dispatcher$useState.queue = hook), - (_dispatcher$useState.baseQueue = null), - (snapshot = readFromUnsubscribedMutableSource(root, source, getSnapshot)), - (_dispatcher$useState.memoizedState = _dispatcher$useState.baseState = snapshot)); - return snapshot; -} -function updateMutableSource(source, getSnapshot, subscribe) { - var hook = updateWorkInProgressHook(); - return useMutableSource(hook, source, getSnapshot, subscribe); -} +function updateMutableSource() {} function mountSyncExternalStore(subscribe, getSnapshot) { var fiber = currentlyRenderingFiber$1, hook = mountWorkInProgressHook(); @@ -3702,7 +3774,7 @@ function checkIfSnapshotChanged(inst) { try { var nextValue = latestGetSnapshot(); return !objectIs(inst, nextValue); - } catch (error) { + } catch (error$33) { return !0; } } @@ -3771,7 +3843,7 @@ function updateEffectImpl(fiberFlags, hookFlags, create, deps) { hook.memoizedState = pushEffect(1 | hookFlags, create, destroy, deps); } function mountEffect(create, deps) { - return mountEffectImpl(4196352, 8, create, deps); + return mountEffectImpl(8390656, 8, create, deps); } function updateEffect(create, deps) { return updateEffectImpl(2048, 8, create, deps); @@ -3851,6 +3923,9 @@ function startTransition(setPending, callback) { (ReactCurrentBatchConfig$1.transition = prevTransition); } } +function updateId() { + return updateWorkInProgressHook().memoizedState; +} function dispatchReducerAction(fiber, queue, action) { var lane = requestUpdateLane(fiber); action = { @@ -3864,8 +3939,9 @@ function dispatchReducerAction(fiber, queue, action) { ? enqueueRenderPhaseUpdate(queue, action) : (enqueueUpdate$1(fiber, queue, action), (action = requestEventTime()), - (fiber = scheduleUpdateOnFiber(fiber, lane, action)), - null !== fiber && entangleTransitionUpdate(fiber, queue, lane)); + (action = scheduleUpdateOnFiber(fiber, lane, action)), + null !== action && entangleTransitionUpdate(action, queue, lane)); + markStateUpdateScheduled(fiber, lane); } function dispatchSetState(fiber, queue, action) { var lane = requestUpdateLane(fiber), @@ -3891,13 +3967,14 @@ function dispatchSetState(fiber, queue, action) { update.hasEagerState = !0; update.eagerState = eagerState; if (objectIs(eagerState, currentState)) return; - } catch (error) { + } catch (error$35) { } finally { } action = requestEventTime(); - fiber = scheduleUpdateOnFiber(fiber, lane, action); - null !== fiber && entangleTransitionUpdate(fiber, queue, lane); + action = scheduleUpdateOnFiber(fiber, lane, action); + null !== action && entangleTransitionUpdate(action, queue, lane); } + markStateUpdateScheduled(fiber, lane); } function isRenderPhaseUpdate(fiber) { var alternate = fiber.alternate; @@ -3958,7 +4035,7 @@ var ContextOnlyDispatcher = { useTransition: throwInvalidHookError, useMutableSource: throwInvalidHookError, useSyncExternalStore: throwInvalidHookError, - useOpaqueIdentifier: throwInvalidHookError, + useId: throwInvalidHookError, unstable_isNewReconciler: !1 }, HooksDispatcherOnMount = { @@ -4046,18 +4123,12 @@ var ContextOnlyDispatcher = { mountWorkInProgressHook().memoizedState = _mountState2; return [isPending, _mountState2]; }, - useMutableSource: function(source, getSnapshot, subscribe) { - var hook = mountWorkInProgressHook(); - hook.memoizedState = { - refs: { getSnapshot: getSnapshot, setSnapshot: null }, - source: source, - subscribe: subscribe - }; - return useMutableSource(hook, source, getSnapshot, subscribe); - }, + useMutableSource: function() {}, useSyncExternalStore: mountSyncExternalStore, - useOpaqueIdentifier: function() { - throw Error("Not yet implemented"); + useId: function() { + var hook = mountWorkInProgressHook(); + var id = "r:" + (globalClientIdCounter++).toString(32); + return (hook.memoizedState = id); }, unstable_isNewReconciler: !1 }, @@ -4140,9 +4211,7 @@ var ContextOnlyDispatcher = { } return nextSnapshot; }, - useOpaqueIdentifier: function() { - return updateReducer(basicStateReducer)[0]; - }, + useId: updateId, unstable_isNewReconciler: !1 }, HooksDispatcherOnRerender = { @@ -4185,9 +4254,7 @@ var ContextOnlyDispatcher = { }, useMutableSource: updateMutableSource, useSyncExternalStore: mountSyncExternalStore, - useOpaqueIdentifier: function() { - return rerenderReducer(basicStateReducer)[0]; - }, + useId: updateId, unstable_isNewReconciler: !1 }, now$1 = Scheduler.unstable_now, @@ -4277,7 +4344,7 @@ function logCapturedError(boundary, errorInfo) { }); } } -var PossiblyWeakMap = "function" === typeof WeakMap ? WeakMap : Map; +var PossiblyWeakMap$1 = "function" === typeof WeakMap ? WeakMap : Map; function createRootErrorUpdate(fiber, errorInfo, lane) { lane = createUpdate(-1, lane); lane.tag = 3; @@ -4294,9 +4361,9 @@ function createClassErrorUpdate(fiber, errorInfo, lane) { lane.tag = 3; var getDerivedStateFromError = fiber.type.getDerivedStateFromError; if ("function" === typeof getDerivedStateFromError) { - var error = errorInfo.value; + var error$37 = errorInfo.value; lane.payload = function() { - return getDerivedStateFromError(error); + return getDerivedStateFromError(error$37); }; lane.callback = function() { logCapturedError(fiber, errorInfo); @@ -4360,14 +4427,14 @@ function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { break; case "collapsed": lastTailNode = renderState.tail; - for (var lastTailNode$37 = null; null !== lastTailNode; ) - null !== lastTailNode.alternate && (lastTailNode$37 = lastTailNode), + for (var lastTailNode$42 = null; null !== lastTailNode; ) + null !== lastTailNode.alternate && (lastTailNode$42 = lastTailNode), (lastTailNode = lastTailNode.sibling); - null === lastTailNode$37 + null === lastTailNode$42 ? hasRenderedATailFallback || null === renderState.tail ? (renderState.tail = null) : (renderState.tail.sibling = null) - : (lastTailNode$37.sibling = null); + : (lastTailNode$42.sibling = null); } } function bubbleProperties(completedWork) { @@ -4379,59 +4446,60 @@ function bubbleProperties(completedWork) { if (didBailout) if (0 !== (completedWork.mode & 2)) { for ( - var treeBaseDuration$39 = completedWork.selfBaseDuration, - child$40 = completedWork.child; - null !== child$40; + var treeBaseDuration$44 = completedWork.selfBaseDuration, + child$45 = completedWork.child; + null !== child$45; ) - (newChildLanes |= child$40.lanes | child$40.childLanes), - (subtreeFlags |= child$40.subtreeFlags & 7340032), - (subtreeFlags |= child$40.flags & 7340032), - (treeBaseDuration$39 += child$40.treeBaseDuration), - (child$40 = child$40.sibling); - completedWork.treeBaseDuration = treeBaseDuration$39; + (newChildLanes |= child$45.lanes | child$45.childLanes), + (subtreeFlags |= child$45.subtreeFlags & 14680064), + (subtreeFlags |= child$45.flags & 14680064), + (treeBaseDuration$44 += child$45.treeBaseDuration), + (child$45 = child$45.sibling); + completedWork.treeBaseDuration = treeBaseDuration$44; } else for ( - treeBaseDuration$39 = completedWork.child; - null !== treeBaseDuration$39; + treeBaseDuration$44 = completedWork.child; + null !== treeBaseDuration$44; ) (newChildLanes |= - treeBaseDuration$39.lanes | treeBaseDuration$39.childLanes), - (subtreeFlags |= treeBaseDuration$39.subtreeFlags & 7340032), - (subtreeFlags |= treeBaseDuration$39.flags & 7340032), - (treeBaseDuration$39.return = completedWork), - (treeBaseDuration$39 = treeBaseDuration$39.sibling); + treeBaseDuration$44.lanes | treeBaseDuration$44.childLanes), + (subtreeFlags |= treeBaseDuration$44.subtreeFlags & 14680064), + (subtreeFlags |= treeBaseDuration$44.flags & 14680064), + (treeBaseDuration$44.return = completedWork), + (treeBaseDuration$44 = treeBaseDuration$44.sibling); else if (0 !== (completedWork.mode & 2)) { - treeBaseDuration$39 = completedWork.actualDuration; - child$40 = completedWork.selfBaseDuration; + treeBaseDuration$44 = completedWork.actualDuration; + child$45 = completedWork.selfBaseDuration; for (var child = completedWork.child; null !== child; ) (newChildLanes |= child.lanes | child.childLanes), (subtreeFlags |= child.subtreeFlags), (subtreeFlags |= child.flags), - (treeBaseDuration$39 += child.actualDuration), - (child$40 += child.treeBaseDuration), + (treeBaseDuration$44 += child.actualDuration), + (child$45 += child.treeBaseDuration), (child = child.sibling); - completedWork.actualDuration = treeBaseDuration$39; - completedWork.treeBaseDuration = child$40; + completedWork.actualDuration = treeBaseDuration$44; + completedWork.treeBaseDuration = child$45; } else for ( - treeBaseDuration$39 = completedWork.child; - null !== treeBaseDuration$39; + treeBaseDuration$44 = completedWork.child; + null !== treeBaseDuration$44; ) (newChildLanes |= - treeBaseDuration$39.lanes | treeBaseDuration$39.childLanes), - (subtreeFlags |= treeBaseDuration$39.subtreeFlags), - (subtreeFlags |= treeBaseDuration$39.flags), - (treeBaseDuration$39.return = completedWork), - (treeBaseDuration$39 = treeBaseDuration$39.sibling); + treeBaseDuration$44.lanes | treeBaseDuration$44.childLanes), + (subtreeFlags |= treeBaseDuration$44.subtreeFlags), + (subtreeFlags |= treeBaseDuration$44.flags), + (treeBaseDuration$44.return = completedWork), + (treeBaseDuration$44 = treeBaseDuration$44.sibling); completedWork.subtreeFlags |= subtreeFlags; completedWork.childLanes = newChildLanes; return didBailout; } function completeWork(current, workInProgress, renderLanes) { var newProps = workInProgress.pendingProps; + popTreeContext(workInProgress); switch (workInProgress.tag) { case 2: case 16: @@ -4582,7 +4650,7 @@ function completeWork(current, workInProgress, renderLanes) { workInProgressRootExitStatus = 4; null === workInProgressRoot || (0 === (workInProgressRootSkippedLanes & 268435455) && - 0 === (workInProgressRootUpdatedLanes & 268435455)) || + 0 === (workInProgressRootInterleavedUpdatedLanes & 268435455)) || markRootSuspended$1( workInProgressRoot, workInProgressRootRenderLanes @@ -4642,7 +4710,7 @@ function completeWork(current, workInProgress, renderLanes) { for (newProps = workInProgress.child; null !== newProps; ) (renderLanes = newProps), (updatePayload = current), - (renderLanes.flags &= 7340034), + (renderLanes.flags &= 14680066), (type = renderLanes.alternate), null === type ? ((renderLanes.childLanes = 0), @@ -4789,6 +4857,7 @@ function updateForwardRef( Component = Component.render; var ref = workInProgress.ref; prepareToReadContext(workInProgress, renderLanes); + markComponentRenderStarted(workInProgress); nextProps = renderWithHooks( current, workInProgress, @@ -4797,6 +4866,7 @@ function updateForwardRef( ref, renderLanes ); + markComponentRenderStopped(); if (null !== current && !didReceiveUpdate) return ( (workInProgress.updateQueue = current.updateQueue), @@ -4952,6 +5022,7 @@ function updateFunctionComponent( : contextStackCursor.current; context = getMaskedContext(workInProgress, context); prepareToReadContext(workInProgress, renderLanes); + markComponentRenderStarted(workInProgress); Component = renderWithHooks( current, workInProgress, @@ -4960,6 +5031,7 @@ function updateFunctionComponent( context, renderLanes ); + markComponentRenderStopped(); if (null !== current && !didReceiveUpdate) return ( (workInProgress.updateQueue = current.updateQueue), @@ -5196,7 +5268,10 @@ function finishClassComponent( ) { var nextChildren = null; profilerStartTime = -1; - } else nextChildren = shouldUpdate.render(); + } else + markComponentRenderStarted(workInProgress), + (nextChildren = shouldUpdate.render()), + markComponentRenderStopped(); workInProgress.flags |= 1; null !== current && didCaptureError ? ((didCaptureError = nextChildren), @@ -5229,7 +5304,7 @@ function pushHostRootContext(workInProgress) { pushTopLevelContextObject(workInProgress, root.context, !1); pushHostContainer(workInProgress, root.containerInfo); } -var SUSPENDED_MARKER = { dehydrated: null, retryLane: 0 }; +var SUSPENDED_MARKER = { dehydrated: null, treeContext: null, retryLane: 0 }; function mountSuspenseOffscreenState(renderLanes) { return { baseLanes: renderLanes, cachePool: null }; } @@ -5432,7 +5507,7 @@ function updateSuspenseFallbackChildren( (primaryChildren.treeBaseDuration = current.treeBaseDuration)), (workInProgress.deletions = null)) : ((primaryChildren = createWorkInProgress(current, primaryChildProps)), - (primaryChildren.subtreeFlags = current.subtreeFlags & 7340032)); + (primaryChildren.subtreeFlags = current.subtreeFlags & 14680064)); null !== currentFallbackChildFragment ? (fallbackChildren = createWorkInProgress( currentFallbackChildFragment, @@ -5664,6 +5739,7 @@ function attemptEarlyBailoutIfNoScheduledUpdate( return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); } function unwindWork(workInProgress) { + popTreeContext(workInProgress); switch (workInProgress.tag) { case 1: isContextProvider(workInProgress.type) && popContext(); @@ -5730,16 +5806,16 @@ function safelyDetachRef(current, nearestMountedAncestor) { recordLayoutEffectDuration(current); } else ref(null); - } catch (error) { - captureCommitPhaseError(current, nearestMountedAncestor, error); + } catch (error$92) { + captureCommitPhaseError(current, nearestMountedAncestor, error$92); } else ref.current = null; } function safelyCallDestroy(current, nearestMountedAncestor, destroy) { try { destroy(); - } catch (error) { - captureCommitPhaseError(current, nearestMountedAncestor, error); + } catch (error$93) { + captureCommitPhaseError(current, nearestMountedAncestor, error$93); } } var shouldFireAfterActiveInstanceBlur = !1; @@ -5788,8 +5864,8 @@ function commitBeforeMutationEffects(root, firstChild) { "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." ); } - } catch (error) { - captureCommitPhaseError(root, root.return, error); + } catch (error$94) { + captureCommitPhaseError(root, root.return, error$94); } firstChild = root.sibling; if (null !== firstChild) { @@ -5816,25 +5892,63 @@ function commitHookEffectListUnmount( if ((effect.tag & flags) === flags) { var destroy = effect.destroy; effect.destroy = void 0; - void 0 !== destroy && + if (void 0 !== destroy) { + if (0 !== (flags & 8)) { + if (supportsUserTimingV3) { + var componentName = + getComponentNameFromFiber(finishedWork) || "Unknown"; + markAndClear( + "--component-passive-effect-unmount-start-" + componentName + ); + } + } else + 0 !== (flags & 4) && + markComponentLayoutEffectUnmountStarted(finishedWork); safelyCallDestroy(finishedWork, nearestMountedAncestor, destroy); + 0 !== (flags & 8) + ? supportsUserTimingV3 && + markAndClear("--component-passive-effect-unmount-stop") + : 0 !== (flags & 4) && markComponentLayoutEffectUnmountStopped(); + } } effect = effect.next; } while (effect !== updateQueue); } } -function commitHookEffectListMount(tag, finishedWork) { - finishedWork = finishedWork.updateQueue; - finishedWork = null !== finishedWork ? finishedWork.lastEffect : null; - if (null !== finishedWork) { - var effect = (finishedWork = finishedWork.next); +function commitHookEffectListMount(flags, finishedWork) { + var updateQueue = finishedWork.updateQueue; + updateQueue = null !== updateQueue ? updateQueue.lastEffect : null; + if (null !== updateQueue) { + var effect = (updateQueue = updateQueue.next); do { - if ((effect.tag & tag) === tag) { - var create$86 = effect.create; - effect.destroy = create$86(); + if ((effect.tag & flags) === flags) { + if (0 !== (flags & 8)) { + if (supportsUserTimingV3) { + var componentName = + getComponentNameFromFiber(finishedWork) || "Unknown"; + markAndClear( + "--component-passive-effect-mount-start-" + componentName + ); + } + } else + 0 !== (flags & 4) && + supportsUserTimingV3 && + ((componentName = + getComponentNameFromFiber(finishedWork) || "Unknown"), + markAndClear( + "--component-layout-effect-mount-start-" + componentName + )); + componentName = effect.create; + effect.destroy = componentName(); + 0 !== (flags & 8) + ? supportsUserTimingV3 && + markAndClear("--component-passive-effect-mount-stop") + : 0 !== (flags & 4) && + supportsUserTimingV3 && + markAndClear("--component-layout-effect-mount-stop"); } effect = effect.next; - } while (effect !== finishedWork); + } while (effect !== updateQueue); } } function commitUnmount(finishedRoot, current, nearestMountedAncestor) { @@ -5857,13 +5971,17 @@ function commitUnmount(finishedRoot, current, nearestMountedAncestor) { var _effect = effect, destroy = _effect.destroy; _effect = _effect.tag; - void 0 === destroy || - (0 === (_effect & 2) && 0 === (_effect & 4)) || - (current.mode & 2 - ? (startLayoutEffectTimer(), - safelyCallDestroy(current, nearestMountedAncestor, destroy), - recordLayoutEffectDuration(current)) - : safelyCallDestroy(current, nearestMountedAncestor, destroy)); + void 0 !== destroy && + (0 !== (_effect & 2) + ? safelyCallDestroy(current, nearestMountedAncestor, destroy) + : 0 !== (_effect & 4) && + (markComponentLayoutEffectUnmountStarted(current), + current.mode & 2 + ? (startLayoutEffectTimer(), + safelyCallDestroy(current, nearestMountedAncestor, destroy), + recordLayoutEffectDuration(current)) + : safelyCallDestroy(current, nearestMountedAncestor, destroy), + markComponentLayoutEffectUnmountStopped())); effect = effect.next; } while (effect !== finishedRoot); } @@ -5884,8 +6002,8 @@ function commitUnmount(finishedRoot, current, nearestMountedAncestor) { recordLayoutEffectDuration(current); } else finishedRoot.componentWillUnmount(); - } catch (error) { - captureCommitPhaseError(current, nearestMountedAncestor, error); + } catch (error$91) { + captureCommitPhaseError(current, nearestMountedAncestor, error$91); } break; case 5: @@ -6283,8 +6401,8 @@ function commitMutationEffects(root, firstChild, committedLanes) { var alternate = childToDelete.alternate; null !== alternate && (alternate.return = null); childToDelete.return = null; - } catch (error) { - captureCommitPhaseError(childToDelete, firstChild, error); + } catch (error$102) { + captureCommitPhaseError(childToDelete, firstChild, error$102); } } committedLanes = firstChild.child; @@ -6316,8 +6434,11 @@ function commitMutationEffects(root, firstChild, committedLanes) { switch (firstChild.tag) { case 13: if (null !== firstChild.memoizedState) { - var current$93 = firstChild.alternate; - if (null === current$93 || null === current$93.memoizedState) + var current$104 = firstChild.alternate; + if ( + null === current$104 || + null === current$104.memoizedState + ) globalMostRecentFallbackTime = now(); } break; @@ -6413,8 +6534,8 @@ function commitMutationEffects(root, firstChild, committedLanes) { case 4: commitWork(firstChild.alternate, firstChild); } - } catch (error) { - captureCommitPhaseError(firstChild, firstChild.return, error); + } catch (error$103) { + captureCommitPhaseError(firstChild, firstChild.return, error$103); } committedLanes = firstChild.sibling; if (null !== committedLanes) { @@ -6501,21 +6622,21 @@ function commitLayoutEffects(finishedWork, root, committedLanes) { commitUpdateQueue(committedLanes, updateQueue, instance); break; case 3: - var updateQueue$88 = committedLanes.updateQueue; - if (null !== updateQueue$88) { - var instance$89 = null; + var updateQueue$97 = committedLanes.updateQueue; + if (null !== updateQueue$97) { + var instance$98 = null; if (null !== committedLanes.child) switch (committedLanes.child.tag) { case 5: - instance$89 = committedLanes.child.stateNode; + instance$98 = committedLanes.child.stateNode; break; case 1: - instance$89 = committedLanes.child.stateNode; + instance$98 = committedLanes.child.stateNode; } commitUpdateQueue( committedLanes, - updateQueue$88, - instance$89 + updateQueue$97, + instance$98 ); } break; @@ -6530,7 +6651,7 @@ function commitLayoutEffects(finishedWork, root, committedLanes) { onCommit = _finishedWork$memoize2.onCommit, onRender = _finishedWork$memoize2.onRender, effectDuration = committedLanes.stateNode.effectDuration; - instance$89 = commitTime; + instance$98 = commitTime; current = null === current ? "mount" : "update"; currentUpdateIsNested && (current = "nested-update"); "function" === typeof onRender && @@ -6540,14 +6661,14 @@ function commitLayoutEffects(finishedWork, root, committedLanes) { committedLanes.actualDuration, committedLanes.treeBaseDuration, committedLanes.actualStartTime, - instance$89 + instance$98 ); "function" === typeof onCommit && onCommit( committedLanes.memoizedProps.id, current, effectDuration, - instance$89 + instance$98 ); enqueuePendingPassiveProfilerEffect(committedLanes); var parentFiber = committedLanes.return; @@ -6577,34 +6698,34 @@ function commitLayoutEffects(finishedWork, root, committedLanes) { ); } if (committedLanes.flags & 512) { - instance$89 = void 0; + instance$98 = void 0; current = committedLanes; var ref = current.ref; if (null !== ref) { var instance$jscomp$0 = current.stateNode; switch (current.tag) { case 5: - instance$89 = instance$jscomp$0; + instance$98 = instance$jscomp$0; break; default: - instance$89 = instance$jscomp$0; + instance$98 = instance$jscomp$0; } if ("function" === typeof ref) if (current.mode & 2) try { - startLayoutEffectTimer(), ref(instance$89); + startLayoutEffectTimer(), ref(instance$98); } finally { recordLayoutEffectDuration(current); } - else ref(instance$89); - else ref.current = instance$89; + else ref(instance$98); + else ref.current = instance$98; } } - } catch (error) { + } catch (error$112) { captureCommitPhaseError( committedLanes, committedLanes.return, - error + error$112 ); } } @@ -6612,10 +6733,10 @@ function commitLayoutEffects(finishedWork, root, committedLanes) { nextEffect = null; break; } - instance$89 = committedLanes.sibling; - if (null !== instance$89) { - instance$89.return = committedLanes.return; - nextEffect = instance$89; + instance$98 = committedLanes.sibling; + if (null !== instance$98) { + instance$98.return = committedLanes.return; + nextEffect = instance$98; break; } nextEffect = committedLanes.return; @@ -6635,7 +6756,8 @@ var ceil = Math.ceil, workInProgressRootExitStatus = 0, workInProgressRootFatalError = null, workInProgressRootSkippedLanes = 0, - workInProgressRootUpdatedLanes = 0, + workInProgressRootInterleavedUpdatedLanes = 0, + workInProgressRootRenderPhaseUpdatedLanes = 0, workInProgressRootPingedLanes = 0, globalMostRecentFallbackTime = 0, workInProgressRootRenderTargetTime = Infinity, @@ -6682,18 +6804,21 @@ function scheduleUpdateOnFiber(fiber, lane, eventTime) { )); var root = markUpdateLaneFromFiberToRoot(fiber, lane); if (null === root) return null; - isDevToolsPresent && addFiberToLanesMap(root, fiber, lane); markRootUpdated(root, lane, eventTime); - root === workInProgressRoot && - (0 === (executionContext & 2) && (workInProgressRootUpdatedLanes |= lane), - 4 === workInProgressRootExitStatus && - markRootSuspended$1(root, workInProgressRootRenderLanes)); - ensureRootIsScheduled(root, eventTime); - 1 === lane && - 0 === executionContext && - 0 === (fiber.mode & 1) && - ((workInProgressRootRenderTargetTime = now() + 500), - includesLegacySyncCallbacks && flushSyncCallbacks()); + 0 !== (executionContext & 2) && root === workInProgressRoot + ? (workInProgressRootRenderPhaseUpdatedLanes |= lane) + : (isDevToolsPresent && addFiberToLanesMap(root, fiber, lane), + root === workInProgressRoot && + (0 === (executionContext & 2) && + (workInProgressRootInterleavedUpdatedLanes |= lane), + 4 === workInProgressRootExitStatus && + markRootSuspended$1(root, workInProgressRootRenderLanes)), + ensureRootIsScheduled(root, eventTime), + 1 === lane && + 0 === executionContext && + 0 === (fiber.mode & 1) && + ((workInProgressRootRenderTargetTime = now() + 500), + includesLegacySyncCallbacks && flushSyncCallbacks())); return root; } function markUpdateLaneFromFiberToRoot(sourceFiber, lane) { @@ -6819,6 +6944,7 @@ function performConcurrentWorkOnRoot(root, didTimeout) { workInProgressRootRenderTargetTime = now() + 500; prepareFreshStack(root, didTimeout); } + supportsUserTimingV3 && markAndClear("--render-start-" + didTimeout); do try { workLoopConcurrent(); @@ -6831,8 +6957,10 @@ function performConcurrentWorkOnRoot(root, didTimeout) { ReactCurrentDispatcher$2.current = prevDispatcher; executionContext = prevExecutionContext; null !== workInProgress - ? (didTimeout = 0) - : ((workInProgressRoot = null), + ? (supportsUserTimingV3 && markAndClear("--render-yield"), + (didTimeout = 0)) + : (supportsUserTimingV3 && markAndClear("--render-stop"), + (workInProgressRoot = null), (workInProgressRootRenderLanes = 0), (didTimeout = workInProgressRootExitStatus)); } @@ -6949,9 +7077,15 @@ function recoverFromConcurrentError(root, errorRetryLanes) { var prevExecutionContext = executionContext; executionContext |= 8; root.isDehydrated && (root.isDehydrated = !1); - root = renderRootSync(root, errorRetryLanes); + for ( + var exitStatus, i = 0; + 50 > i && + ((exitStatus = renderRootSync(root, errorRetryLanes)), + 2 === exitStatus && 0 !== workInProgressRootRenderPhaseUpdatedLanes); + i++ + ); executionContext = prevExecutionContext; - return root; + return exitStatus; } function isRenderConsistentWithExternalStores(finishedWork) { for (var node = finishedWork; ; ) { @@ -6967,7 +7101,7 @@ function isRenderConsistentWithExternalStores(finishedWork) { check = check.value; try { if (!objectIs(getSnapshot(), check)) return !1; - } catch (error) { + } catch (error$117) { return !1; } } @@ -6989,7 +7123,7 @@ function isRenderConsistentWithExternalStores(finishedWork) { } function markRootSuspended$1(root, suspendedLanes) { suspendedLanes &= ~workInProgressRootPingedLanes; - suspendedLanes &= ~workInProgressRootUpdatedLanes; + suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes; root.suspendedLanes |= suspendedLanes; root.pingedLanes &= ~suspendedLanes; for (root = root.expirationTimes; 0 < suspendedLanes; ) { @@ -7009,13 +7143,10 @@ function performSyncWorkOnRoot(root) { if (0 === (lanes & 1)) return ensureRootIsScheduled(root, now()), null; var exitStatus = renderRootSync(root, lanes); if (0 !== root.tag && 2 === exitStatus) { - var prevExecutionContext = executionContext; - executionContext |= 8; - root.isDehydrated && (root.isDehydrated = !1); var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root); 0 !== errorRetryLanes && - ((lanes = errorRetryLanes), (exitStatus = renderRootSync(root, lanes))); - executionContext = prevExecutionContext; + ((lanes = errorRetryLanes), + (exitStatus = recoverFromConcurrentError(root, errorRetryLanes))); } if (1 === exitStatus) throw ((exitStatus = workInProgressRootFatalError), @@ -7042,6 +7173,7 @@ function prepareFreshStack(root, lanes) { if (null !== workInProgress) for (timeoutHandle = workInProgress.return; null !== timeoutHandle; ) { var interruptedWork = timeoutHandle; + popTreeContext(interruptedWork); switch (interruptedWork.tag) { case 1: interruptedWork = interruptedWork.type.childContextTypes; @@ -7081,7 +7213,7 @@ function prepareFreshStack(root, lanes) { workInProgressRootRenderLanes = subtreeRenderLanes = lanes; workInProgressRootExitStatus = 0; workInProgressRootFatalError = null; - workInProgressRootPingedLanes = workInProgressRootUpdatedLanes = workInProgressRootSkippedLanes = 0; + workInProgressRootPingedLanes = workInProgressRootRenderPhaseUpdatedLanes = workInProgressRootInterleavedUpdatedLanes = workInProgressRootSkippedLanes = 0; if (null !== interleavedQueues) { for (root = 0; root < interleavedQueues.length; root++) if ( @@ -7102,7 +7234,7 @@ function prepareFreshStack(root, lanes) { interleavedQueues = null; } } -function handleError(root$jscomp$0, thrownValue) { +function handleError(root, thrownValue$jscomp$0) { do { var erroredWork = workInProgress; try { @@ -7126,27 +7258,54 @@ function handleError(root$jscomp$0, thrownValue) { ReactCurrentOwner$2.current = null; if (null === erroredWork || null === erroredWork.return) { workInProgressRootExitStatus = 1; - workInProgressRootFatalError = thrownValue; + workInProgressRootFatalError = thrownValue$jscomp$0; workInProgress = null; break; } erroredWork.mode & 2 && stopProfilerTimerIfRunningAndRecordDelta(erroredWork, !0); + markComponentRenderStopped(); + if ( + null !== thrownValue$jscomp$0 && + "object" === typeof thrownValue$jscomp$0 && + "function" === typeof thrownValue$jscomp$0.then + ) + markComponentSuspended( + erroredWork, + thrownValue$jscomp$0, + workInProgressRootRenderLanes + ); + else { + var fiber = erroredWork, + thrownValue = thrownValue$jscomp$0; + if (supportsUserTimingV3) { + var componentName = getComponentNameFromFiber(fiber) || "Unknown", + phase = null === fiber.alternate ? "mount" : "update"; + fiber = ""; + null !== thrownValue && + "object" === typeof thrownValue && + "string" === typeof thrownValue.message + ? (fiber = thrownValue.message) + : "string" === typeof thrownValue && (fiber = thrownValue); + markAndClear("--error-" + componentName + "-" + phase + "-" + fiber); + } + } a: { - var root = root$jscomp$0, - returnFiber = erroredWork.return, + thrownValue = root; + var returnFiber = erroredWork.return, sourceFiber = erroredWork, - value = thrownValue; - thrownValue = workInProgressRootRenderLanes; + value = thrownValue$jscomp$0; + thrownValue$jscomp$0 = workInProgressRootRenderLanes; sourceFiber.flags |= 32768; - isDevToolsPresent && restorePendingUpdaters(root, thrownValue); + isDevToolsPresent && + restorePendingUpdaters(thrownValue, thrownValue$jscomp$0); if ( null !== value && "object" === typeof value && "function" === typeof value.then ) { - var wakeable = value, - sourceFiber$jscomp$0 = sourceFiber, + fiber = value; + var sourceFiber$jscomp$0 = sourceFiber, tag = sourceFiber$jscomp$0.tag; if ( 0 === (sourceFiber$jscomp$0.mode & 1) && @@ -7164,7 +7323,7 @@ function handleError(root$jscomp$0, thrownValue) { b: { sourceFiber$jscomp$0 = returnFiber; var sourceFiber$jscomp$1 = sourceFiber, - rootRenderLanes = thrownValue, + rootRenderLanes = thrownValue$jscomp$0, hasInvisibleParentBoundary = 0 !== (suspenseStackCursor.current & 1), node = sourceFiber$jscomp$0; @@ -7216,32 +7375,33 @@ function handleError(root$jscomp$0, thrownValue) { value = void 0; sourceFiber = suspenseBoundary; if (sourceFiber.mode & 1) { - var pingCache = root.pingCache; + var pingCache = thrownValue.pingCache; null === pingCache - ? ((pingCache = root.pingCache = new PossiblyWeakMap()), + ? ((pingCache = thrownValue.pingCache = new PossiblyWeakMap$1()), (value = new Set()), - pingCache.set(wakeable, value)) - : ((value = pingCache.get(wakeable)), + pingCache.set(fiber, value)) + : ((value = pingCache.get(fiber)), void 0 === value && - ((value = new Set()), pingCache.set(wakeable, value))); - if (!value.has(thrownValue)) { - value.add(thrownValue); + ((value = new Set()), pingCache.set(fiber, value))); + if (!value.has(thrownValue$jscomp$0)) { + value.add(thrownValue$jscomp$0); var ping = pingSuspendedRoot.bind( null, - root, - wakeable, - thrownValue + thrownValue, + fiber, + thrownValue$jscomp$0 ); - isDevToolsPresent && restorePendingUpdaters(root, thrownValue); - wakeable.then(ping, ping); + isDevToolsPresent && + restorePendingUpdaters(thrownValue, thrownValue$jscomp$0); + fiber.then(ping, ping); } } var wakeables = sourceFiber.updateQueue; if (null === wakeables) { var updateQueue = new Set(); - updateQueue.add(wakeable); + updateQueue.add(fiber); sourceFiber.updateQueue = updateQueue; - } else wakeables.add(wakeable); + } else wakeables.add(fiber); break a; } else value = Error( @@ -7252,51 +7412,51 @@ function handleError(root$jscomp$0, thrownValue) { 4 !== workInProgressRootExitStatus && (workInProgressRootExitStatus = 2); value = createCapturedValue(value, sourceFiber); - root = returnFiber; + thrownValue = returnFiber; do { - switch (root.tag) { + switch (thrownValue.tag) { case 3: - wakeable = value; - root.flags |= 65536; - thrownValue &= -thrownValue; - root.lanes |= thrownValue; + fiber = value; + thrownValue.flags |= 65536; + thrownValue$jscomp$0 &= -thrownValue$jscomp$0; + thrownValue.lanes |= thrownValue$jscomp$0; var update$jscomp$0 = createRootErrorUpdate( - root, - wakeable, - thrownValue + thrownValue, + fiber, + thrownValue$jscomp$0 ); - enqueueCapturedUpdate(root, update$jscomp$0); + enqueueCapturedUpdate(thrownValue, update$jscomp$0); break a; case 1: - wakeable = value; - var ctor = root.type, - instance = root.stateNode; + fiber = value; + var ctor = thrownValue.type, + instance = thrownValue.stateNode; if ( - 0 === (root.flags & 128) && + 0 === (thrownValue.flags & 128) && ("function" === typeof ctor.getDerivedStateFromError || (null !== instance && "function" === typeof instance.componentDidCatch && (null === legacyErrorBoundariesThatAlreadyFailed || !legacyErrorBoundariesThatAlreadyFailed.has(instance)))) ) { - root.flags |= 65536; - thrownValue &= -thrownValue; - root.lanes |= thrownValue; - var update$35 = createClassErrorUpdate( - root, - wakeable, - thrownValue + thrownValue.flags |= 65536; + thrownValue$jscomp$0 &= -thrownValue$jscomp$0; + thrownValue.lanes |= thrownValue$jscomp$0; + var update$40 = createClassErrorUpdate( + thrownValue, + fiber, + thrownValue$jscomp$0 ); - enqueueCapturedUpdate(root, update$35); + enqueueCapturedUpdate(thrownValue, update$40); break a; } } - root = root.return; - } while (null !== root); + thrownValue = thrownValue.return; + } while (null !== thrownValue); } completeUnitOfWork(erroredWork); } catch (yetAnotherThrownValue) { - thrownValue = yetAnotherThrownValue; + thrownValue$jscomp$0 = yetAnotherThrownValue; workInProgress === erroredWork && null !== erroredWork && (workInProgress = erroredWork = erroredWork.return); @@ -7324,6 +7484,7 @@ function renderRootSync(root, lanes) { } prepareFreshStack(root, lanes); } + supportsUserTimingV3 && markAndClear("--render-start-" + lanes); do try { workLoopSync(); @@ -7339,6 +7500,7 @@ function renderRootSync(root, lanes) { throw Error( "Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue." ); + supportsUserTimingV3 && markAndClear("--render-stop"); workInProgressRoot = null; workInProgressRootRenderLanes = 0; return workInProgressRootExitStatus; @@ -7431,7 +7593,15 @@ function commitRootImpl(root, renderPriorityLevel) { throw Error("Should not already be working."); var finishedWork = root.finishedWork, lanes = root.finishedLanes; - if (null === finishedWork) return null; + supportsUserTimingV3 && + (markAndClear("--commit-start-" + lanes), + markAndClear("--react-version-18.0.0-3fcd81dd1-20211102"), + markAndClear("--profiler-version-1"), + getLaneLabels(), + markAndClear("--react-lane-labels-" + laneLabels.join(",")), + markInternalModuleRanges()); + if (null === finishedWork) + return supportsUserTimingV3 && markAndClear("--commit-stop"), null; root.finishedWork = null; root.finishedLanes = 0; if (finishedWork === root.current) @@ -7466,7 +7636,9 @@ function commitRootImpl(root, renderPriorityLevel) { commitTime = now$1(); commitMutationEffects(root, finishedWork, lanes); root.current = finishedWork; + supportsUserTimingV3 && markAndClear("--layout-effects-start-" + lanes); commitLayoutEffects(finishedWork, root, lanes); + supportsUserTimingV3 && markAndClear("--layout-effects-stop"); requestPaint(); executionContext = prevExecutionContext; currentUpdatePriority = previousPriority; @@ -7497,6 +7669,7 @@ function commitRootImpl(root, renderPriorityLevel) { : ((nestedUpdateCount = 0), (rootWithNestedUpdates = root))) : (nestedUpdateCount = 0); flushSyncCallbacks(); + supportsUserTimingV3 && markAndClear("--commit-stop"); return null; } function flushPassiveEffects() { @@ -7511,11 +7684,14 @@ function flushPassiveEffects() { var JSCompiler_inline_result = !1; else { renderPriority = rootWithPendingPassiveEffects; + var lanes = pendingPassiveEffectsLanes; rootWithPendingPassiveEffects = null; pendingPassiveEffectsLanes = 0; if (0 !== (executionContext & 6)) throw Error("Cannot flush passive effects while already rendering."); - var prevExecutionContext = executionContext; + supportsUserTimingV3 && + markAndClear("--passive-effects-start-" + lanes); + lanes = executionContext; executionContext |= 4; for (nextEffect = renderPriority.current; null !== nextEffect; ) { var fiber = nextEffect, @@ -7625,8 +7801,12 @@ function flushPassiveEffects() { } } else commitHookEffectListMount(9, fiberToDelete); } - } catch (error) { - captureCommitPhaseError(deletions, deletions.return, error); + } catch (error$113) { + captureCommitPhaseError( + deletions, + deletions.return, + error$113 + ); } if (deletions === child) { nextEffect = null; @@ -7678,7 +7858,8 @@ function flushPassiveEffects() { } } } - executionContext = prevExecutionContext; + supportsUserTimingV3 && markAndClear("--passive-effects-stop"); + executionContext = lanes; flushSyncCallbacks(); if ( injectedHook && @@ -7835,6 +8016,7 @@ beginWork$1 = function(current, workInProgress, renderLanes) { contextStackCursor.current ); prepareToReadContext(workInProgress, renderLanes); + markComponentRenderStarted(workInProgress); context = renderWithHooks( null, workInProgress, @@ -7843,6 +8025,7 @@ beginWork$1 = function(current, workInProgress, renderLanes) { context, renderLanes ); + markComponentRenderStopped(); workInProgress.flags |= 1; if ( "object" === typeof context && @@ -8168,7 +8351,9 @@ beginWork$1 = function(current, workInProgress, renderLanes) { (Component = workInProgress.pendingProps.children), prepareToReadContext(workInProgress, renderLanes), (context = readContext(context)), + markComponentRenderStarted(workInProgress), (Component = Component(context)), + markComponentRenderStopped(), (workInProgress.flags |= 1), reconcileChildren(current, workInProgress, Component, renderLanes), workInProgress.child @@ -8299,7 +8484,7 @@ function createWorkInProgress(current, pendingProps) { (workInProgress.deletions = null), (workInProgress.actualDuration = 0), (workInProgress.actualStartTime = -1)); - workInProgress.flags = current.flags & 7340032; + workInProgress.flags = current.flags & 14680064; workInProgress.childLanes = current.childLanes; workInProgress.lanes = current.lanes; workInProgress.child = current.child; @@ -8481,6 +8666,7 @@ function updateContainer(element, container, parentComponent, callback) { var current = container.current, eventTime = requestEventTime(), lane = requestUpdateLane(current); + supportsUserTimingV3 && markAndClear("--schedule-render-" + lane); a: if (parentComponent) { parentComponent = parentComponent._reactInternals; b: { @@ -8662,10 +8848,10 @@ batchedUpdatesImpl = function(fn, a) { } }; var roots = new Map(), - devToolsConfig$jscomp$inline_1006 = { + devToolsConfig$jscomp$inline_1046 = { findFiberByHostInstance: getInstanceFromTag, bundleType: 0, - version: "18.0.0-afcb9cdc9-20211008", + version: "18.0.0-3fcd81dd1-20211102", rendererPackageName: "react-native-renderer", rendererConfig: { getInspectorDataForViewTag: function() { @@ -8680,11 +8866,11 @@ var roots = new Map(), }.bind(null, findNodeHandle) } }; -var internals$jscomp$inline_1290 = { - bundleType: devToolsConfig$jscomp$inline_1006.bundleType, - version: devToolsConfig$jscomp$inline_1006.version, - rendererPackageName: devToolsConfig$jscomp$inline_1006.rendererPackageName, - rendererConfig: devToolsConfig$jscomp$inline_1006.rendererConfig, +var internals$jscomp$inline_1339 = { + bundleType: devToolsConfig$jscomp$inline_1046.bundleType, + version: devToolsConfig$jscomp$inline_1046.version, + rendererPackageName: devToolsConfig$jscomp$inline_1046.rendererPackageName, + rendererConfig: devToolsConfig$jscomp$inline_1046.rendererConfig, overrideHookState: null, overrideHookStateDeletePath: null, overrideHookStateRenamePath: null, @@ -8700,26 +8886,26 @@ var internals$jscomp$inline_1290 = { return null === fiber ? null : fiber.stateNode; }, findFiberByHostInstance: - devToolsConfig$jscomp$inline_1006.findFiberByHostInstance || + devToolsConfig$jscomp$inline_1046.findFiberByHostInstance || emptyFindFiberByHostInstance, findHostInstancesForRefresh: null, scheduleRefresh: null, scheduleRoot: null, setRefreshHandler: null, getCurrentFiber: null, - reconcilerVersion: "18.0.0-afcb9cdc9-20211008" + reconcilerVersion: "18.0.0-3fcd81dd1-20211102" }; if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { - var hook$jscomp$inline_1291 = __REACT_DEVTOOLS_GLOBAL_HOOK__; + var hook$jscomp$inline_1340 = __REACT_DEVTOOLS_GLOBAL_HOOK__; if ( - !hook$jscomp$inline_1291.isDisabled && - hook$jscomp$inline_1291.supportsFiber + !hook$jscomp$inline_1340.isDisabled && + hook$jscomp$inline_1340.supportsFiber ) try { - (rendererID = hook$jscomp$inline_1291.inject( - internals$jscomp$inline_1290 + (rendererID = hook$jscomp$inline_1340.inject( + internals$jscomp$inline_1339 )), - (injectedHook = hook$jscomp$inline_1291); + (injectedHook = hook$jscomp$inline_1340); } catch (err) {} } exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = { @@ -8809,3 +8995,23 @@ exports.unmountComponentAtNodeAndRemoveContainer = function(containerTag) { ReactNativePrivateInterface.UIManager.removeRootView(containerTag); }; exports.unstable_batchedUpdates = batchedUpdates; + + /** + * 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. + */ + +/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + +// Don't require this file directly; it's embedded by Rollup during build. + +if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === + 'function' +) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); +} + From 8fef52035b4184ce4185c700aefefc53c1ea8b8d Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Tue, 2 Nov 2021 12:20:24 -0700 Subject: [PATCH 096/628] Bump codegen to 0.0.10 Summary: For the sake of the playbook, I'm bumping the codegen to the latest stable. This is needed as there was a change in the Android NDK Makefile that wasn't shipped yet. Changelog: [Internal] [Changed] - Bump codegen to 0.0.10 Reviewed By: hramos Differential Revision: D32101355 fbshipit-source-id: c20268f1ea93ebad8f92f760874a43c8ceeaf9f9 --- packages/react-native-codegen/package.json | 2 +- repo-config/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native-codegen/package.json b/packages/react-native-codegen/package.json index fa11b0b801c4..95324c2ff731 100644 --- a/packages/react-native-codegen/package.json +++ b/packages/react-native-codegen/package.json @@ -1,6 +1,6 @@ { "name": "react-native-codegen", - "version": "0.0.9", + "version": "0.0.10", "description": "⚛️ Code generation tools for React Native", "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/react-native-codegen", "repository": { diff --git a/repo-config/package.json b/repo-config/package.json index 9aa4c9c509c6..f94dbb7b66d7 100644 --- a/repo-config/package.json +++ b/repo-config/package.json @@ -45,7 +45,7 @@ "mkdirp": "^0.5.1", "prettier": "1.19.1", "react": "17.0.2", - "react-native-codegen": "^0.0.9", + "react-native-codegen": "^0.0.10", "react-shallow-renderer": "16.14.1", "react-test-renderer": "17.0.2", "shelljs": "^0.7.8", From 6fd3bc2175c5325bc088d5f031691f93bec13a42 Mon Sep 17 00:00:00 2001 From: Paige Sun Date: Tue, 2 Nov 2021 17:30:33 -0700 Subject: [PATCH 097/628] Fix Gemstone Profile Swiping Animations by fixing Animated.Value for Animated.event Reviewed By: RSNara Differential Revision: D32037021 fbshipit-source-id: 41da68706e6c752bf480d11112f70692f7234756 --- Libraries/NativeAnimation/RCTNativeAnimatedTurboModule.mm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Libraries/NativeAnimation/RCTNativeAnimatedTurboModule.mm b/Libraries/NativeAnimation/RCTNativeAnimatedTurboModule.mm index 0964e23a0fa6..da3659ef933d 100644 --- a/Libraries/NativeAnimation/RCTNativeAnimatedTurboModule.mm +++ b/Libraries/NativeAnimation/RCTNativeAnimatedTurboModule.mm @@ -162,6 +162,10 @@ - (void)setSurfacePresenter:(id)surfacePresenter [self addOperationBlock:^(RCTNativeAnimatedNodesManager *nodesManager) { [nodesManager setAnimatedNodeValue:[NSNumber numberWithDouble:nodeTag] value:[NSNumber numberWithDouble:value]]; }]; + // In Bridge, flushing of native animations is done from RCTCxxBridge batchDidComplete(). + // Since RCTCxxBridge doesn't exist in Bridgeless, and components are not remounted in Fabric for native animations, + // flush here for changes in Animated.Value for Animated.event. + [self flushOperationQueues]; } RCT_EXPORT_METHOD(setAnimatedNodeOffset:(double)nodeTag From 25d4cb98b07434a98cbc415cdf248bd8e20ab8b8 Mon Sep 17 00:00:00 2001 From: rayzr522 Date: Tue, 2 Nov 2021 17:32:14 -0700 Subject: [PATCH 098/628] Fix build of glog & Flipper-Glog on Apple Silicon (#32486) Summary: This is a fixed version of the https://github.com/facebook/react-native/issues/32380 PR. It solves a typo, prevents variable substitution in the patch file, and moves it to a better place in the script so that CURRENT_ARCH is actually detected before checking whether to patch. The `config.sub` included in glog is too old and does not recognize `arm64-*` as a valid arch when building. This, combined with an out of date Flipper-Glog version, results in persistent build failures on Apple Silicon machines. p.s. i assume all the podfile lock changes were caused by me running this on an Apple Silicon Mac, and thus all the pod checksums were run against the arm64 versions of those pods rather than the normal x86_64 versions. if this is an issue I can revert the changes to that file, but it would seem to be an inevitable issue in future PR diffs... ## Changelog - [iOS] [Fixed] - Apple Silicon builds of glog & Flipper-Glog Pull Request resolved: https://github.com/facebook/react-native/pull/32486 Test Plan: - Clone this branch on both an Apple Silicon- & Intel-based Mac - Run `pod install` in `packages/rn-tester` - Confirm that build passes successfully Reviewed By: cortinico Differential Revision: D32080994 Pulled By: yungsters fbshipit-source-id: 76a7c5bba20d91905455920609c890e92bb5b980 --- packages/rn-tester/Podfile.lock | 16 ++++++++-------- scripts/ios-configure-glog.sh | 21 +++++++++++++++++++++ scripts/react_native_pods.rb | 2 +- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index 364a7ca3412d..32adb3c4de33 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -23,7 +23,7 @@ PODS: - Flipper-Glog - libevent (~> 2.1.12) - OpenSSL-Universal (= 1.1.180) - - Flipper-Glog (0.3.6) + - Flipper-Glog (0.3.9) - Flipper-PeerTalk (0.0.4) - Flipper-RSocket (1.4.3): - Flipper-Folly (~> 2.6) @@ -724,7 +724,7 @@ DEPENDENCIES: - Flipper-DoubleConversion (= 3.1.7) - Flipper-Fmt (= 7.1.7) - Flipper-Folly (= 2.6.7) - - Flipper-Glog (= 0.3.6) + - Flipper-Glog (= 0.3.9) - Flipper-PeerTalk (= 0.0.4) - Flipper-RSocket (= 1.4.3) - FlipperKit (= 0.99.0) @@ -881,18 +881,18 @@ SPEC CHECKSUMS: CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662 FBLazyVector: b81a2b70c72d8b0aefb652cea22c11e9ffd02949 - FBReactNativeSpec: c72b6aa43f36a4bfa45376f24ac5d10339070635 + FBReactNativeSpec: c41af89a2aca37e9fe937133ffe6758301ded893 Flipper: 30e8eeeed6abdc98edaf32af0cda2f198be4b733 Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c Flipper-DoubleConversion: 57ffbe81ef95306cc9e69c4aa3aeeeeb58a6a28c Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b Flipper-Folly: 83af37379faa69497529e414bd43fbfc7cae259a - Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6 + Flipper-Glog: 05579840e2750ec907ee2f81544f41ad76a7cae4 Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 FlipperKit: d8d346844eca5d9120c17d441a2f38596e8ed2b9 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: 85ecdd10ee8d8ec362ef519a6a45ff9aa27b2e85 + glog: c10b67b343303f51715e5c5eedb18a41402f350a libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 OpenSSL-Universal: 1aa4f6a6ee7256b83db99ec1ccdaa80d10f9af9b RCT-Folly: 803a9cfd78114b2ec0f140cfa6fa2a6bafb2d685 @@ -923,13 +923,13 @@ SPEC CHECKSUMS: React-RCTTest: 12bbd7fc2e72bd9920dc7286c5b8ef96639582b6 React-RCTText: e9146b2c0550a83d1335bfe2553760070a2d75c7 React-RCTVibration: 50be9c390f2da76045ef0dfdefa18b9cf9f35cfa - React-rncore: 95c628b2be148269a3189ad1c9f4390b6c73a7d7 + React-rncore: a1249129f80f05d7e3bcba35239ceb394c1052cc React-runtimeexecutor: 4b0c6eb341c7d3ceb5e2385cb0fdb9bf701024f3 ReactCommon: 7a2714d1128f965392b6f99a8b390e3aa38c9569 - ScreenshotManager: 965ca5b82e28f0d7baac83c275521770407c60a4 + ScreenshotManager: ec701affd6d2a5dabf8739b0cdcc937f7dbd2ac6 Yoga: c0d06f5380d34e939f55420669a60fe08b79bd75 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: b0db53c7196aa798709ee467d4d93e7300f7eacf +PODFILE CHECKSUM: eb8cf8c55af63e11cb1907f2ae6b457739f4f0af COCOAPODS: 1.11.2 diff --git a/scripts/ios-configure-glog.sh b/scripts/ios-configure-glog.sh index e30fa2ea2e15..3eb7ab178d60 100755 --- a/scripts/ios-configure-glog.sh +++ b/scripts/ios-configure-glog.sh @@ -20,6 +20,27 @@ if [ -z "$CURRENT_ARCH" ] || [ "$CURRENT_ARCH" == "undefined_arch" ]; then fi fi +if [ "$CURRENT_ARCH" == "arm64" ]; then + cat <<\EOF >>fix_glog_0.3.5_apple_silicon.patch +diff --git a/config.sub b/config.sub +index 1761d8b..43fa2e8 100755 +--- a/config.sub ++++ b/config.sub +@@ -1096,6 +1096,9 @@ case $basic_machine in + basic_machine=z8k-unknown + os=-sim + ;; ++ arm64-*) ++ basic_machine=$(echo $basic_machine | sed 's/arm64/aarch64/') ++ ;; + none) + basic_machine=none-none + os=-none +EOF + + patch -p1 config.sub fix_glog_0.3.5_apple_silicon.patch +fi + export CC="$(xcrun -find -sdk $PLATFORM_NAME cc) -arch $CURRENT_ARCH -isysroot $(xcrun -sdk $PLATFORM_NAME --show-sdk-path)" export CXX="$CC" diff --git a/scripts/react_native_pods.rb b/scripts/react_native_pods.rb index 746f68460b14..1f79d83d831f 100644 --- a/scripts/react_native_pods.rb +++ b/scripts/react_native_pods.rb @@ -93,7 +93,7 @@ def use_flipper!(versions = {}, configurations: ['Debug']) versions['Flipper-DoubleConversion'] ||= '3.1.7' versions['Flipper-Fmt'] ||= '7.1.7' versions['Flipper-Folly'] ||= '2.6.7' - versions['Flipper-Glog'] ||= '0.3.6' + versions['Flipper-Glog'] ||= '0.3.9' versions['Flipper-PeerTalk'] ||= '0.0.4' versions['Flipper-RSocket'] ||= '1.4.3' versions['OpenSSL-Universal'] ||= '1.1.180' From 27ddbd81374365804cc583bb2b6b81a052ce6c25 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Tue, 2 Nov 2021 21:23:37 -0700 Subject: [PATCH 099/628] Refactor: Simplify deprecated component code-gen logic in View Config generator Summary: **Motivation:** Readability. It was hard to tell how componentName, paperComponentName, and paperComponentNameDepreacted produced the NativeComponentRegistry.get call. Changelog: [Internal] Reviewed By: philIip Differential Revision: D32108276 fbshipit-source-id: ea7c9fe4dc50cdd6fec94b5cd25f7bbcfb451ef6 --- .../components/GenerateViewConfigJs.js | 61 ++++++++++--------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js index 519e41885f47..035ba93efce0 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js +++ b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js @@ -103,32 +103,44 @@ function getReactDiffProcessValue(typeAnnotation) { } const ComponentTemplate = ({ - componentNameWithCompatSupport, - deprecationCheck, + componentName, + paperComponentName, + paperComponentNameDeprecated, }: { - componentNameWithCompatSupport: string, - deprecationCheck: string, -}) => - ` -let nativeComponentName = '${componentNameWithCompatSupport}'; -${deprecationCheck} + componentName: string, + paperComponentName: ?string, + paperComponentNameDeprecated: ?string, +}) => { + const nativeComponentName = paperComponentName ?? componentName; + + return ` +let nativeComponentName = '${nativeComponentName}'; +${ + paperComponentNameDeprecated != null + ? DeprecatedComponentNameCheckTemplate({ + componentName, + paperComponentNameDeprecated, + }) + : '' +} export default NativeComponentRegistry.get(nativeComponentName, () => VIEW_CONFIG); `.trim(); +}; -const DeprecatedComponentTemplate = ({ +const DeprecatedComponentNameCheckTemplate = ({ componentName, - componentNameDeprecated, + paperComponentNameDeprecated, }: { componentName: string, - componentNameDeprecated: string, + paperComponentNameDeprecated: string, }) => ` if (UIManager.getViewManagerConfig('${componentName}')) { nativeComponentName = '${componentName}'; -} else if (UIManager.getViewManagerConfig('${componentNameDeprecated}')) { - nativeComponentName = '${componentNameDeprecated}'; +} else if (UIManager.getViewManagerConfig('${paperComponentNameDeprecated}')) { + nativeComponentName = '${paperComponentNameDeprecated}'; } else { - throw new Error('Failed to find native component for either "${componentName}" or "${componentNameDeprecated}"'); + throw new Error('Failed to find native component for either "${componentName}" or "${paperComponentNameDeprecated}"'); } `.trim(); @@ -365,29 +377,22 @@ module.exports = { .map((componentName: string) => { const component = components[componentName]; - const paperComponentName = component.paperComponentName - ? component.paperComponentName - : componentName; - if (component.paperComponentNameDeprecated) { imports.add(UIMANAGER_IMPORT); } - const deprecatedCheckBlock = component.paperComponentNameDeprecated - ? DeprecatedComponentTemplate({ - componentName, - componentNameDeprecated: - component.paperComponentNameDeprecated || '', - }) - : ''; - const replacedTemplate = ComponentTemplate({ - componentNameWithCompatSupport: paperComponentName, - deprecationCheck: deprecatedCheckBlock, + componentName, + paperComponentName: component.paperComponentName, + paperComponentNameDeprecated: + component.paperComponentNameDeprecated, }); const replacedSourceRoot = j.withParser('flow')(replacedTemplate); + const paperComponentName = + component.paperComponentName ?? componentName; + replacedSourceRoot .find(j.Identifier, { name: 'VIEW_CONFIG', From 4e587a1b7d5c3cd7efd5382e85fb4fcb935b2979 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Tue, 2 Nov 2021 22:10:46 -0700 Subject: [PATCH 100/628] JS: Upgrade to Prettier v2.4.1 [1/n] Summary: Changelog: [General][Changed] - Upgraded to `prettier@^2.4.1`. Reviewed By: zertosh Differential Revision: D31854010 fbshipit-source-id: 6d7a2e758a3ddf7c758ceffb14d98eb93b0ce4b0 --- .prettierrc | 2 +- .../eslint-config-react-native-community/package.json | 4 ++-- packages/eslint-config-react-native-community/yarn.lock | 8 ++++---- packages/react-native-codegen/.prettierrc | 2 +- packages/react-native-codegen/package.json | 2 +- repo-config/package.json | 2 +- template/_prettierrc.js | 2 +- yarn.lock | 8 ++++---- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.prettierrc b/.prettierrc index f45d2b8c574e..600a26c49518 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,7 +1,7 @@ { "arrowParens": "avoid", + "bracketSameLine": true, "bracketSpacing": false, - "jsxBracketSameLine": true, "requirePragma": true, "singleQuote": true, "trailingComma": "all" diff --git a/packages/eslint-config-react-native-community/package.json b/packages/eslint-config-react-native-community/package.json index bf80d296770f..fe4fa8e50547 100644 --- a/packages/eslint-config-react-native-community/package.json +++ b/packages/eslint-config-react-native-community/package.json @@ -23,7 +23,7 @@ "eslint-plugin-react": "^7.20.0", "eslint-plugin-react-hooks": "^4.0.7", "eslint-plugin-react-native": "^3.10.0", - "prettier": "^2.0.2" + "prettier": "^2.4.1" }, "peerDependencies": { "eslint": ">=7", @@ -31,6 +31,6 @@ }, "devDependencies": { "eslint": "7.12.0", - "prettier": "^2.3.2" + "prettier": "^2.4.1" } } diff --git a/packages/eslint-config-react-native-community/yarn.lock b/packages/eslint-config-react-native-community/yarn.lock index 2029c4ca41a9..be94f2a9629b 100644 --- a/packages/eslint-config-react-native-community/yarn.lock +++ b/packages/eslint-config-react-native-community/yarn.lock @@ -1140,10 +1140,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.2.tgz#1ba8f3eb92231e769b7fcd7cb73ae1b6b74ade08" - integrity sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg== +prettier@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== progress@^2.0.0: version "2.0.3" diff --git a/packages/react-native-codegen/.prettierrc b/packages/react-native-codegen/.prettierrc index f45d2b8c574e..600a26c49518 100644 --- a/packages/react-native-codegen/.prettierrc +++ b/packages/react-native-codegen/.prettierrc @@ -1,7 +1,7 @@ { "arrowParens": "avoid", + "bracketSameLine": true, "bracketSpacing": false, - "jsxBracketSameLine": true, "requirePragma": true, "singleQuote": true, "trailingComma": "all" diff --git a/packages/react-native-codegen/package.json b/packages/react-native-codegen/package.json index 95324c2ff731..aff3b93ece5d 100644 --- a/packages/react-native-codegen/package.json +++ b/packages/react-native-codegen/package.json @@ -37,6 +37,6 @@ "invariant": "^2.2.4", "micromatch": "^4.0.2", "mkdirp": "^0.5.1", - "prettier": "1.19.1" + "prettier": "^2.4.1" } } diff --git a/repo-config/package.json b/repo-config/package.json index f94dbb7b66d7..1f3219e2d3c4 100644 --- a/repo-config/package.json +++ b/repo-config/package.json @@ -43,7 +43,7 @@ "metro-babel-register": "0.66.2", "metro-transform-plugins": "^0.66.2", "mkdirp": "^0.5.1", - "prettier": "1.19.1", + "prettier": "^2.4.1", "react": "17.0.2", "react-native-codegen": "^0.0.10", "react-shallow-renderer": "16.14.1", diff --git a/template/_prettierrc.js b/template/_prettierrc.js index 645abb25811b..2b540746a757 100644 --- a/template/_prettierrc.js +++ b/template/_prettierrc.js @@ -1,7 +1,7 @@ module.exports = { arrowParens: 'avoid', + bracketSameLine: true, bracketSpacing: false, - jsxBracketSameLine: true, singleQuote: true, trailingComma: 'all', }; diff --git a/yarn.lock b/yarn.lock index 7f4d55cba4c3..937359a19839 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5453,10 +5453,10 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prettier@1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== pretty-format@^24.9.0: version "24.9.0" From 77ecc7ede1da8fc590d7bc238a2fc02daa736746 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Tue, 2 Nov 2021 22:10:46 -0700 Subject: [PATCH 101/628] JS: Format with Prettier v2.4.1 [3/n] Summary: Changelog: [General][Internal] Reviewed By: zertosh Differential Revision: D31883447 fbshipit-source-id: cbbf85e4bf935096d242336f41bf0cc5d6f92359 --- IntegrationTests/AsyncStorageTest.js | 12 +- .../IntegrationTestHarnessTest.js | 12 +- IntegrationTests/IntegrationTestsApp.js | 10 +- IntegrationTests/LoggingTestModule.js | 14 +- .../RCTRootViewIntegrationTestApp.js | 10 +- IntegrationTests/WebSocketTest.js | 2 +- Libraries/Alert/Alert.js | 4 +- Libraries/Alert/RCTAlertManager.android.js | 2 +- Libraries/Animated/AnimatedImplementation.js | 106 ++--- Libraries/Animated/AnimatedMock.js | 16 +- Libraries/Animated/NativeAnimatedHelper.js | 43 +- .../Animated/__tests__/AnimatedNative-test.js | 98 ++-- Libraries/Animated/__tests__/Easing-test.js | 429 +++++------------- Libraries/Animated/__tests__/bezier-test.js | 56 +-- Libraries/Animated/nodes/AnimatedNode.js | 19 +- Libraries/Animated/nodes/AnimatedValueXY.js | 2 +- Libraries/AppState/AppState.js | 11 +- .../__mocks__/MessageQueueTestModule.js | 4 +- .../__tests__/MessageQueue-test.js | 8 +- .../__tests__/NativeModules-test.js | 22 +- Libraries/Blob/__tests__/Blob-test.js | 2 +- Libraries/Blob/__tests__/BlobManager-test.js | 2 +- Libraries/Blob/__tests__/File-test.js | 10 +- Libraries/Blob/__tests__/FileReader-test.js | 2 +- Libraries/Blob/__tests__/URL-test.js | 2 +- .../AccessibilityInfo/AccessibilityInfo.js | 38 +- .../DrawerLayoutAndroid.android.js | 7 +- Libraries/Components/Keyboard/Keyboard.js | 11 +- .../ProgressViewIOS/ProgressViewIOS.ios.js | 3 +- .../RefreshControl/RefreshControl.js | 9 +- .../__mocks__/RefreshControlMock.js | 5 +- .../Components/SafeAreaView/SafeAreaView.js | 4 +- ...roidHorizontalScrollViewNativeComponent.js | 8 +- .../ScrollContentViewNativeComponent.js | 8 +- Libraries/Components/ScrollView/ScrollView.js | 24 +- .../ScrollView/ScrollViewNativeComponent.js | 8 +- .../SegmentedControlIOS.ios.js | 10 +- Libraries/Components/Sound/SoundManager.js | 2 +- .../RCTMultilineTextInputNativeComponent.js | 9 +- .../RCTSingelineTextInputNativeComponent.js | 9 +- Libraries/Components/TextInput/TextInput.js | 23 +- .../ToastAndroid/ToastAndroid.android.js | 6 +- .../ToastAndroid/ToastAndroid.ios.js | 6 +- .../Touchable/BoundingDimensions.js | 4 +- Libraries/Components/Touchable/PooledClass.js | 12 +- Libraries/Components/Touchable/Position.js | 2 +- Libraries/Components/Touchable/Touchable.js | 51 ++- .../Components/Touchable/TouchableBounce.js | 7 +- .../Touchable/TouchableHighlight.js | 7 +- .../Touchable/TouchableNativeFeedback.js | 15 +- .../Components/Touchable/TouchableOpacity.js | 7 +- .../Touchable/TouchableWithoutFeedback.js | 7 +- .../Components/View/ViewNativeComponent.js | 7 +- .../__tests__/parseErrorStack-test.js | 8 +- Libraries/Core/Devtools/parseHermesStack.js | 3 +- Libraries/Core/ExceptionsManager.js | 4 +- Libraries/Core/NativeExceptionsManager.js | 5 +- Libraries/Core/Timers/JSTimers.js | 30 +- .../Core/Timers/__tests__/JSTimers-test.js | 132 +++--- Libraries/Core/setUpAlert.js | 2 +- Libraries/Core/setUpDeveloperTools.js | 2 +- Libraries/Core/setUpPerformance.js | 2 +- Libraries/Core/setUpRegeneratorRuntime.js | 2 +- Libraries/Core/setUpSegmentFetcher.js | 8 +- .../DeprecatedColorPropType.js | 2 +- .../DeprecatedStyleSheetPropType.js | 4 +- .../DeprecatedTransformPropTypes.js | 4 +- .../deprecatedCreateStrictShapeTypeChecker.js | 2 +- Libraries/EventEmitter/NativeEventEmitter.js | 3 +- .../__mocks__/NativeEventEmitter.js | 3 +- Libraries/HeapCapture/HeapCapture.js | 2 +- Libraries/Image/AssetSourceResolver.js | 6 +- Libraries/Image/Image.android.js | 8 +- Libraries/Image/Image.ios.js | 6 +- Libraries/Image/ImageAnalyticsTagContext.js | 5 +- Libraries/Image/ImagePickerIOS.js | 12 +- Libraries/Image/ImageViewNativeComponent.js | 8 +- Libraries/Image/NativeImageLoaderAndroid.js | 4 +- .../Image/TextInlineImageNativeComponent.js | 8 +- .../__tests__/resolveAssetSource-test.js | 16 +- Libraries/Inspector/NetworkOverlay.js | 7 +- .../Interaction/BridgeSpyStallHandler.js | 2 +- Libraries/Interaction/FrameRateLogger.js | 4 +- Libraries/Interaction/InteractionManager.js | 6 +- Libraries/Interaction/JSEventLoopWatchdog.js | 8 +- Libraries/Interaction/PanResponder.js | 7 +- Libraries/Interaction/TouchHistoryMath.js | 14 +- Libraries/JSInspector/NetworkAgent.js | 7 +- Libraries/LayoutAnimation/LayoutAnimation.js | 6 +- Libraries/Lists/FillRateHelper.js | 7 +- Libraries/Lists/FlatList.js | 7 +- Libraries/Lists/ViewabilityHelper.js | 14 +- Libraries/Lists/VirtualizeUtils.js | 8 +- Libraries/Lists/VirtualizedList.js | 35 +- Libraries/Lists/VirtualizedListContext.js | 5 +- Libraries/Lists/VirtualizedSectionList.js | 115 +++-- .../Lists/__tests__/FillRateHelper-test.js | 10 +- .../Lists/__tests__/ViewabilityHelper-test.js | 28 +- .../Lists/__tests__/VirtualizeUtils-test.js | 33 +- Libraries/LogBox/Data/LogBoxData.js | 2 +- Libraries/LogBox/Data/parseLogBoxLog.js | 35 +- .../LogBoxInspectorMesageHeader-test.js | 4 +- .../LogBoxInspectorReactFrames-test.js | 4 +- .../LogBoxInspectorSourceMapStatus-test.js | 4 +- .../LogBoxInspectorStackFrame-test.js | 4 +- .../NativeComponentRegistry.js | 6 +- Libraries/Network/XHRInterceptor.js | 11 +- Libraries/Network/__tests__/FormData-test.js | 6 +- .../Network/__tests__/XMLHttpRequest-test.js | 26 +- Libraries/Performance/SamplingProfiler.js | 6 +- .../PermissionsAndroid/PermissionsAndroid.js | 7 +- Libraries/Pressability/Pressability.js | 4 +- .../PressabilityPerformanceEventEmitter.js | 6 +- .../PushNotificationIOS.js | 11 +- Libraries/ReactNative/AppContainer.js | 4 +- Libraries/ReactNative/AppRegistry.js | 5 +- Libraries/ReactNative/I18nManager.js | 7 +- Libraries/ReactNative/PaperUIManager.js | 5 +- Libraries/ReactNative/RootTag.js | 5 +- Libraries/Storage/AsyncStorage.js | 42 +- Libraries/StyleSheet/StyleSheet.js | 3 +- Libraries/StyleSheet/StyleSheetTypes.js | 2 +- .../__tests__/normalizeColor-test.js | 12 +- .../StyleSheet/__tests__/processColor-test.js | 12 +- .../__tests__/processColorArray-test.js | 18 +- .../__tests__/setNormalizedColorAlpha-test.js | 10 +- Libraries/StyleSheet/processColor.js | 4 +- Libraries/StyleSheet/splitLayoutProps.js | 4 +- Libraries/Text/Text.js | 3 +- Libraries/Text/TextNativeComponent.js | 8 +- Libraries/Utilities/Appearance.js | 11 +- Libraries/Utilities/BackHandler.android.js | 8 +- Libraries/Utilities/HMRClient.js | 4 +- Libraries/Utilities/JSDevSupportModule.js | 7 +- Libraries/Utilities/MatrixMath.js | 38 +- .../Utilities/PerformanceLoggerContext.js | 5 +- Libraries/Utilities/SceneTracker.js | 7 +- Libraries/Utilities/__mocks__/BackHandler.js | 6 +- .../Utilities/__tests__/MatrixMath-test.js | 33 +- .../Utilities/__tests__/SceneTracker-test.js | 4 +- .../__tests__/buildStyleInterpolator-test.js | 54 +-- .../deepFreezeAndThrowOnMutationInDev-test.js | 2 +- .../__tests__/mapWithSeparator-test.js | 16 +- .../Utilities/__tests__/stringifySafe-test.js | 2 +- .../Utilities/__tests__/useMergeRefs-test.js | 8 +- ...erifyComponentAttributeEquivalence-test.js | 4 +- Libraries/Utilities/buildStyleInterpolator.js | 18 +- Libraries/Utilities/codegenNativeComponent.js | 5 +- .../differ/__tests__/deepDiffer-test.js | 2 +- .../differ/__tests__/matricesDiffer-test.js | 2 +- Libraries/Utilities/differ/deepDiffer.js | 2 +- Libraries/Utilities/differ/insetsDiffer.js | 2 +- Libraries/Utilities/differ/matricesDiffer.js | 2 +- Libraries/Utilities/differ/pointsDiffer.js | 2 +- Libraries/Utilities/differ/sizesDiffer.js | 2 +- Libraries/Utilities/logError.js | 2 +- Libraries/Utilities/mergeIntoFast.js | 2 +- Libraries/Utilities/truncate.js | 2 +- Libraries/Vibration/Vibration.js | 4 +- Libraries/WebSocket/WebSocketInterceptor.js | 8 +- .../WebSocket/__tests__/WebSocket-test.js | 2 +- Libraries/promiseRejectionTrackingOptions.js | 2 +- ReactAndroid/src/androidTest/js/Asserts.js | 4 +- .../js/CatalystRootViewTestModule.js | 2 +- .../androidTest/js/MeasureLayoutTestModule.js | 108 ++--- .../androidTest/js/ProgressBarTestModule.js | 2 +- .../androidTest/js/ScrollViewTestModule.js | 10 +- .../src/androidTest/js/ShareTestModule.js | 2 +- .../js/SubviewsClippingTestModule.js | 10 +- .../js/SwipeRefreshLayoutTestModule.js | 2 +- .../src/androidTest/js/TestJSLocaleModule.js | 4 +- .../js/TestJSToJavaParametersModule.js | 34 +- .../js/TestJavaToJSArgumentsModule.js | 20 +- .../js/TestJavaToJSReturnValuesModule.js | 4 +- .../src/androidTest/js/TextInputTestModule.js | 2 +- .../androidTest/js/ViewRenderingTestModule.js | 10 +- .../tools/msggen/src/HeaderWriter.js | 2 +- .../inspector/tools/msggen/src/index.js | 2 +- bots/code-analysis-bot.js | 29 +- bots/dangerfile.js | 3 +- bots/make-comment.js | 8 +- jest/assetFileTransformer.js | 4 +- jest/preprocessor.js | 4 +- jest/setup.js | 6 +- .../__test_fixtures__/failures.js | 6 +- packages/babel-plugin-codegen/index.js | 2 +- .../react-native-modules.js | 8 +- .../__tests__/platform-colors-test.js | 12 +- .../platform-colors.js | 4 +- packages/normalize-color/index.js | 28 +- .../react-native-codegen/scripts/build.js | 5 +- .../src/generators/components/CppHelpers.js | 5 +- .../components/GenerateEventEmitterCpp.js | 2 +- .../components/GenerateEventEmitterH.js | 2 +- .../generators/components/GeneratePropsCpp.js | 5 +- .../generators/components/GeneratePropsH.js | 10 +- .../components/GeneratePropsJavaDelegate.js | 4 +- .../components/GeneratePropsJavaInterface.js | 4 +- .../generators/components/GenerateTests.js | 5 +- .../components/GenerateViewConfigJs.js | 4 +- .../generators/modules/GenerateModuleCpp.js | 7 +- .../src/generators/modules/GenerateModuleH.js | 9 +- .../modules/GenerateModuleJniCpp.js | 27 +- .../src/parsers/flow/components/events.js | 9 +- .../__tests__/module-parser-e2e-test.js | 121 ++--- .../src/parsers/flow/modules/index.js | 51 +-- .../RCTTest/RCTSnapshotNativeComponent.js | 5 +- .../RNTesterUnitTestsBundle.js | 2 +- packages/rn-tester/e2e/test-init.js | 2 +- .../rn-tester/js/components/RNTesterTheme.js | 7 +- .../rn-tester/js/components/TextLegend.js | 6 +- .../js/components/createExamplePage.js | 2 +- .../examples/AnimatedGratuitousApp/AnExApp.js | 2 +- .../AnimatedGratuitousApp/AnExScroll.js | 6 +- .../js/examples/Button/ButtonExample.js | 29 +- .../FlatList/FlatList-onEndReached.js | 2 +- .../FlatList/FlatList-withSeparators.js | 35 +- .../js/examples/Image/ImageExample.js | 116 ++--- .../InputAccessoryViewExample.js | 2 +- .../JSResponderHandlerExample.js | 11 +- .../KeyboardAvoidingViewExample.js | 10 +- .../js/examples/Layout/LayoutEventsExample.js | 14 +- .../js/examples/Layout/LayoutExample.js | 2 +- .../js/examples/Linking/LinkingExample.js | 4 +- .../js/examples/Modal/ModalPresentation.js | 10 +- .../NativeAnimationsExample.js | 30 +- .../PanResponder/PanResponderExample.js | 2 +- .../PointerEvents/PointerEventsExample.js | 2 +- .../js/examples/Pressable/PressableExample.js | 37 +- .../rn-tester/js/examples/RTL/RTLExample.js | 30 +- .../RefreshControl/RefreshControlExample.js | 2 +- .../SafeAreaView/SafeAreaViewExample.js | 9 +- .../ScrollView/ScrollViewAnimatedExample.js | 13 +- .../examples/ScrollView/ScrollViewExample.js | 85 ++-- .../ScrollView/ScrollViewSimpleExample.js | 2 +- .../SectionList/SectionList-contentInset.js | 2 +- .../SectionList/SectionList-inverted.js | 2 +- .../SectionList/SectionList-onEndReached.js | 2 +- .../SectionList-onViewableItemsChanged.js | 4 +- .../SectionList/SectionList-scrollable.js | 40 +- .../SectionList-stickyHeadersEnabled.js | 2 +- .../SectionList/SectionList-withSeparators.js | 41 +- .../js/examples/Share/ShareExample.js | 13 +- .../js/examples/StatusBar/StatusBarExample.js | 4 +- .../SwipeableCardExample.js | 7 +- .../js/examples/Text/TextExample.android.js | 4 +- .../js/examples/Text/TextExample.ios.js | 62 +-- .../TextInput/TextInputExample.android.js | 24 +- .../TextInput/TextInputExample.ios.js | 42 +- .../js/examples/TextInput/TextInputKeyProp.js | 2 +- .../TextInput/TextInputSharedExamples.js | 24 +- .../js/examples/Timer/TimerExample.js | 10 +- .../js/examples/Touchable/TouchableExample.js | 44 +- .../TurboModule/SampleTurboModuleExample.js | 2 +- .../TurboModule/TurboModuleExample.js | 2 +- .../rn-tester/js/examples/View/ViewExample.js | 2 +- .../js/examples/WebSocket/http_test_server.js | 2 +- scripts/android-e2e-test.js | 21 +- scripts/bump-oss-version.js | 22 +- scripts/compose-source-maps.js | 24 +- 260 files changed, 1731 insertions(+), 2123 deletions(-) diff --git a/IntegrationTests/AsyncStorageTest.js b/IntegrationTests/AsyncStorageTest.js index 51ce374556e9..209a5e9b77fa 100644 --- a/IntegrationTests/AsyncStorageTest.js +++ b/IntegrationTests/AsyncStorageTest.js @@ -218,11 +218,13 @@ class AsyncStorageTest extends React.Component<{...}, $FlowFixMeState> { return ( - {/* $FlowFixMe[incompatible-type] (>=0.54.0 site=react_native_fb,react_ - * native_oss) This comment suppresses an error found when Flow v0.54 - * was deployed. To see the error delete this comment and run Flow. - */ - this.constructor.displayName + ': '} + { + /* $FlowFixMe[incompatible-type] (>=0.54.0 site=react_native_fb,react_ + * native_oss) This comment suppresses an error found when Flow v0.54 + * was deployed. To see the error delete this comment and run Flow. + */ + this.constructor.displayName + ': ' + } {this.state.done ? 'Done' : 'Testing...'} {'\n\n' + this.state.messages} diff --git a/IntegrationTests/IntegrationTestHarnessTest.js b/IntegrationTests/IntegrationTestHarnessTest.js index 256bcd210e75..75c525abfbe3 100644 --- a/IntegrationTests/IntegrationTestHarnessTest.js +++ b/IntegrationTests/IntegrationTestHarnessTest.js @@ -56,11 +56,13 @@ class IntegrationTestHarnessTest extends React.Component { return ( - {/* $FlowFixMe[incompatible-type] (>=0.54.0 site=react_native_fb,react_ - * native_oss) This comment suppresses an error found when Flow v0.54 - * was deployed. To see the error delete this comment and run Flow. - */ - this.constructor.displayName + ': '} + { + /* $FlowFixMe[incompatible-type] (>=0.54.0 site=react_native_fb,react_ + * native_oss) This comment suppresses an error found when Flow v0.54 + * was deployed. To see the error delete this comment and run Flow. + */ + this.constructor.displayName + ': ' + } {this.state.done ? 'Done' : 'Testing...'} diff --git a/IntegrationTests/IntegrationTestsApp.js b/IntegrationTests/IntegrationTestsApp.js index af41da151c47..a9af9b940b41 100644 --- a/IntegrationTests/IntegrationTestsApp.js +++ b/IntegrationTests/IntegrationTestsApp.js @@ -13,14 +13,8 @@ require('react-native/Libraries/Core/InitializeCore'); const React = require('react'); const ReactNative = require('react-native'); -const { - AppRegistry, - ScrollView, - StyleSheet, - Text, - TouchableOpacity, - View, -} = ReactNative; +const {AppRegistry, ScrollView, StyleSheet, Text, TouchableOpacity, View} = + ReactNative; // Keep this list in sync with RNTesterIntegrationTests.m const TESTS = [ diff --git a/IntegrationTests/LoggingTestModule.js b/IntegrationTests/LoggingTestModule.js index dc1dfb8ac033..70df6c333207 100644 --- a/IntegrationTests/LoggingTestModule.js +++ b/IntegrationTests/LoggingTestModule.js @@ -14,24 +14,24 @@ const BatchedBridge = require('react-native/Libraries/BatchedBridge/BatchedBridg const invariant = require('invariant'); const LoggingTestModule = { - logToConsole: function(str) { + logToConsole: function (str) { console.log(str); }, - logToConsoleAfterWait: function(str, timeout_ms) { - setTimeout(function() { + logToConsoleAfterWait: function (str, timeout_ms) { + setTimeout(function () { console.log(str); }, timeout_ms); }, - warning: function(str) { + warning: function (str) { console.warn(str); }, - invariant: function(str) { + invariant: function (str) { invariant(false, str); }, - logErrorToConsole: function(str) { + logErrorToConsole: function (str) { console.error(str); }, - throwError: function(str) { + throwError: function (str) { throw new Error(str); }, }; diff --git a/IntegrationTests/RCTRootViewIntegrationTestApp.js b/IntegrationTests/RCTRootViewIntegrationTestApp.js index 2466b6378586..4df83a0752d0 100644 --- a/IntegrationTests/RCTRootViewIntegrationTestApp.js +++ b/IntegrationTests/RCTRootViewIntegrationTestApp.js @@ -12,14 +12,8 @@ const React = require('react'); const ReactNative = require('react-native'); -const { - AppRegistry, - ScrollView, - StyleSheet, - Text, - TouchableOpacity, - View, -} = ReactNative; +const {AppRegistry, ScrollView, StyleSheet, Text, TouchableOpacity, View} = + ReactNative; /* Keep this list in sync with RCTRootViewIntegrationTests.m */ const TESTS = [ diff --git a/IntegrationTests/WebSocketTest.js b/IntegrationTests/WebSocketTest.js index 3435feabb11d..d361ede9f639 100644 --- a/IntegrationTests/WebSocketTest.js +++ b/IntegrationTests/WebSocketTest.js @@ -45,7 +45,7 @@ class WebSocketTest extends React.Component<{...}, State> { _waitFor = (condition: any, timeout: any, callback: any) => { let remaining = timeout; - const timeoutFunction = function() { + const timeoutFunction = function () { if (condition()) { callback(true); return; diff --git a/Libraries/Alert/Alert.js b/Libraries/Alert/Alert.js index 02a7a312e5b2..091ff74ab654 100644 --- a/Libraries/Alert/Alert.js +++ b/Libraries/Alert/Alert.js @@ -46,8 +46,8 @@ class Alert { if (Platform.OS === 'ios') { Alert.prompt(title, message, buttons, 'default'); } else if (Platform.OS === 'android') { - const NativeDialogManagerAndroid = require('../NativeModules/specs/NativeDialogManagerAndroid') - .default; + const NativeDialogManagerAndroid = + require('../NativeModules/specs/NativeDialogManagerAndroid').default; if (!NativeDialogManagerAndroid) { return; } diff --git a/Libraries/Alert/RCTAlertManager.android.js b/Libraries/Alert/RCTAlertManager.android.js index 366692bd906d..72f0e1b1cce2 100644 --- a/Libraries/Alert/RCTAlertManager.android.js +++ b/Libraries/Alert/RCTAlertManager.android.js @@ -12,7 +12,7 @@ import NativeDialogManagerAndroid from '../NativeModules/specs/NativeDialogManag function emptyCallback() {} module.exports = { - alertWithArgs: function(args, callback) { + alertWithArgs: function (args, callback) { // TODO(5998984): Polyfill it correctly with DialogManagerAndroid if (!NativeDialogManagerAndroid) { return; diff --git a/Libraries/Animated/AnimatedImplementation.js b/Libraries/Animated/AnimatedImplementation.js index 706b87ea01e9..2fdae2d13091 100644 --- a/Libraries/Animated/AnimatedImplementation.js +++ b/Libraries/Animated/AnimatedImplementation.js @@ -48,39 +48,39 @@ export type CompositeAnimation = { ... }; -const add = function( +const add = function ( a: AnimatedNode | number, b: AnimatedNode | number, ): AnimatedAddition { return new AnimatedAddition(a, b); }; -const subtract = function( +const subtract = function ( a: AnimatedNode | number, b: AnimatedNode | number, ): AnimatedSubtraction { return new AnimatedSubtraction(a, b); }; -const divide = function( +const divide = function ( a: AnimatedNode | number, b: AnimatedNode | number, ): AnimatedDivision { return new AnimatedDivision(a, b); }; -const multiply = function( +const multiply = function ( a: AnimatedNode | number, b: AnimatedNode | number, ): AnimatedMultiplication { return new AnimatedMultiplication(a, b); }; -const modulo = function(a: AnimatedNode, modulus: number): AnimatedModulo { +const modulo = function (a: AnimatedNode, modulus: number): AnimatedModulo { return new AnimatedModulo(a, modulus); }; -const diffClamp = function( +const diffClamp = function ( a: AnimatedNode, min: number, max: number, @@ -88,7 +88,7 @@ const diffClamp = function( return new AnimatedDiffClamp(a, min, max); }; -const _combineCallbacks = function( +const _combineCallbacks = function ( callback: ?EndCallback, config: {...AnimationConfig, ...}, ) { @@ -102,7 +102,7 @@ const _combineCallbacks = function( } }; -const maybeVectorAnim = function( +const maybeVectorAnim = function ( value: AnimatedValue | AnimatedValueXY, config: Object, anim: (value: AnimatedValue, config: Object) => CompositeAnimation, @@ -126,11 +126,11 @@ const maybeVectorAnim = function( return null; }; -const spring = function( +const spring = function ( value: AnimatedValue | AnimatedValueXY, config: SpringAnimationConfig, ): CompositeAnimation { - const start = function( + const start = function ( animatedValue: AnimatedValue | AnimatedValueXY, configuration: SpringAnimationConfig, callback?: ?EndCallback, @@ -155,35 +155,35 @@ const spring = function( }; return ( maybeVectorAnim(value, config, spring) || { - start: function(callback?: ?EndCallback): void { + start: function (callback?: ?EndCallback): void { start(value, config, callback); }, - stop: function(): void { + stop: function (): void { value.stopAnimation(); }, - reset: function(): void { + reset: function (): void { value.resetAnimation(); }, - _startNativeLoop: function(iterations?: number): void { + _startNativeLoop: function (iterations?: number): void { const singleConfig = {...config, iterations}; start(value, singleConfig); }, - _isUsingNativeDriver: function(): boolean { + _isUsingNativeDriver: function (): boolean { return config.useNativeDriver || false; }, } ); }; -const timing = function( +const timing = function ( value: AnimatedValue | AnimatedValueXY, config: TimingAnimationConfig, ): CompositeAnimation { - const start = function( + const start = function ( animatedValue: AnimatedValue | AnimatedValueXY, configuration: TimingAnimationConfig, callback?: ?EndCallback, @@ -209,35 +209,35 @@ const timing = function( return ( maybeVectorAnim(value, config, timing) || { - start: function(callback?: ?EndCallback): void { + start: function (callback?: ?EndCallback): void { start(value, config, callback); }, - stop: function(): void { + stop: function (): void { value.stopAnimation(); }, - reset: function(): void { + reset: function (): void { value.resetAnimation(); }, - _startNativeLoop: function(iterations?: number): void { + _startNativeLoop: function (iterations?: number): void { const singleConfig = {...config, iterations}; start(value, singleConfig); }, - _isUsingNativeDriver: function(): boolean { + _isUsingNativeDriver: function (): boolean { return config.useNativeDriver || false; }, } ); }; -const decay = function( +const decay = function ( value: AnimatedValue | AnimatedValueXY, config: DecayAnimationConfig, ): CompositeAnimation { - const start = function( + const start = function ( animatedValue: AnimatedValue | AnimatedValueXY, configuration: DecayAnimationConfig, callback?: ?EndCallback, @@ -251,37 +251,37 @@ const decay = function( return ( maybeVectorAnim(value, config, decay) || { - start: function(callback?: ?EndCallback): void { + start: function (callback?: ?EndCallback): void { start(value, config, callback); }, - stop: function(): void { + stop: function (): void { value.stopAnimation(); }, - reset: function(): void { + reset: function (): void { value.resetAnimation(); }, - _startNativeLoop: function(iterations?: number): void { + _startNativeLoop: function (iterations?: number): void { const singleConfig = {...config, iterations}; start(value, singleConfig); }, - _isUsingNativeDriver: function(): boolean { + _isUsingNativeDriver: function (): boolean { return config.useNativeDriver || false; }, } ); }; -const sequence = function( +const sequence = function ( animations: Array, ): CompositeAnimation { let current = 0; return { - start: function(callback?: ?EndCallback) { - const onComplete = function(result) { + start: function (callback?: ?EndCallback) { + const onComplete = function (result) { if (!result.finished) { callback && callback(result); return; @@ -304,13 +304,13 @@ const sequence = function( } }, - stop: function() { + stop: function () { if (current < animations.length) { animations[current].stop(); } }, - reset: function() { + reset: function () { animations.forEach((animation, idx) => { if (idx <= current) { animation.reset(); @@ -319,13 +319,13 @@ const sequence = function( current = 0; }, - _startNativeLoop: function() { + _startNativeLoop: function () { throw new Error( 'Loops run using the native driver cannot contain Animated.sequence animations', ); }, - _isUsingNativeDriver: function(): boolean { + _isUsingNativeDriver: function (): boolean { return false; }, }; @@ -336,7 +336,7 @@ type ParallelConfig = { stopTogether?: boolean, ... }; -const parallel = function( +const parallel = function ( animations: Array, config?: ?ParallelConfig, ): CompositeAnimation { @@ -346,14 +346,14 @@ const parallel = function( const stopTogether = !(config && config.stopTogether === false); const result = { - start: function(callback?: ?EndCallback) { + start: function (callback?: ?EndCallback) { if (doneCount === animations.length) { callback && callback({finished: true}); return; } animations.forEach((animation, idx) => { - const cb = function(endResult) { + const cb = function (endResult) { hasEnded[idx] = true; doneCount++; if (doneCount === animations.length) { @@ -375,14 +375,14 @@ const parallel = function( }); }, - stop: function(): void { + stop: function (): void { animations.forEach((animation, idx) => { !hasEnded[idx] && animation.stop(); hasEnded[idx] = true; }); }, - reset: function(): void { + reset: function (): void { animations.forEach((animation, idx) => { animation.reset(); hasEnded[idx] = false; @@ -390,13 +390,13 @@ const parallel = function( }); }, - _startNativeLoop: function() { + _startNativeLoop: function () { throw new Error( 'Loops run using the native driver cannot contain Animated.parallel animations', ); }, - _isUsingNativeDriver: function(): boolean { + _isUsingNativeDriver: function (): boolean { return false; }, }; @@ -404,7 +404,7 @@ const parallel = function( return result; }; -const delay = function(time: number): CompositeAnimation { +const delay = function (time: number): CompositeAnimation { // Would be nice to make a specialized implementation return timing(new AnimatedValue(0), { toValue: 0, @@ -414,7 +414,7 @@ const delay = function(time: number): CompositeAnimation { }); }; -const stagger = function( +const stagger = function ( time: number, animations: Array, ): CompositeAnimation { @@ -431,15 +431,15 @@ type LoopAnimationConfig = { ... }; -const loop = function( +const loop = function ( animation: CompositeAnimation, {iterations = -1, resetBeforeIteration = true}: LoopAnimationConfig = {}, ): CompositeAnimation { let isFinished = false; let iterationsSoFar = 0; return { - start: function(callback?: ?EndCallback) { - const restart = function(result: EndResult = {finished: true}): void { + start: function (callback?: ?EndCallback) { + const restart = function (result: EndResult = {finished: true}): void { if ( isFinished || iterationsSoFar === iterations || @@ -463,24 +463,24 @@ const loop = function( } }, - stop: function(): void { + stop: function (): void { isFinished = true; animation.stop(); }, - reset: function(): void { + reset: function (): void { iterationsSoFar = 0; isFinished = false; animation.reset(); }, - _startNativeLoop: function() { + _startNativeLoop: function () { throw new Error( 'Loops run using the native driver cannot contain Animated.loop animations', ); }, - _isUsingNativeDriver: function(): boolean { + _isUsingNativeDriver: function (): boolean { return animation._isUsingNativeDriver(); }, }; @@ -512,7 +512,7 @@ function unforkEvent( } } -const event = function( +const event = function ( argMapping: $ReadOnlyArray, config: EventConfig, ): any { diff --git a/Libraries/Animated/AnimatedMock.js b/Libraries/Animated/AnimatedMock.js index 561f4b5a8750..8f69819310f3 100644 --- a/Libraries/Animated/AnimatedMock.js +++ b/Libraries/Animated/AnimatedMock.js @@ -88,7 +88,7 @@ const mockCompositeAnimation = ( }), }); -const spring = function( +const spring = function ( value: AnimatedValue | AnimatedValueXY, config: SpringAnimationConfig, ): CompositeAnimation { @@ -102,7 +102,7 @@ const spring = function( }; }; -const timing = function( +const timing = function ( value: AnimatedValue | AnimatedValueXY, config: TimingAnimationConfig, ): CompositeAnimation { @@ -116,32 +116,32 @@ const timing = function( }; }; -const decay = function( +const decay = function ( value: AnimatedValue | AnimatedValueXY, config: DecayAnimationConfig, ): CompositeAnimation { return emptyAnimation; }; -const sequence = function( +const sequence = function ( animations: Array, ): CompositeAnimation { return mockCompositeAnimation(animations); }; type ParallelConfig = {stopTogether?: boolean, ...}; -const parallel = function( +const parallel = function ( animations: Array, config?: ?ParallelConfig, ): CompositeAnimation { return mockCompositeAnimation(animations); }; -const delay = function(time: number): CompositeAnimation { +const delay = function (time: number): CompositeAnimation { return emptyAnimation; }; -const stagger = function( +const stagger = function ( time: number, animations: Array, ): CompositeAnimation { @@ -154,7 +154,7 @@ type LoopAnimationConfig = { ... }; -const loop = function( +const loop = function ( animation: CompositeAnimation, {iterations = -1}: LoopAnimationConfig = {}, ): CompositeAnimation { diff --git a/Libraries/Animated/NativeAnimatedHelper.js b/Libraries/Animated/NativeAnimatedHelper.js index 89fe7b5a8d2a..dff0f541d083 100644 --- a/Libraries/Animated/NativeAnimatedHelper.js +++ b/Libraries/Animated/NativeAnimatedHelper.js @@ -42,7 +42,7 @@ let queue: Array<() => void> = []; * the native module methods */ const API = { - getValue: function( + getValue: function ( tag: number, saveValueCallback: (value: number) => void, ): void { @@ -51,11 +51,11 @@ const API = { NativeAnimatedModule.getValue(tag, saveValueCallback); }); }, - setWaitingForIdentifier: function(id: string): void { + setWaitingForIdentifier: function (id: string): void { waitingForQueuedOperations.add(id); queueOperations = true; }, - unsetWaitingForIdentifier: function(id: string): void { + unsetWaitingForIdentifier: function (id: string): void { waitingForQueuedOperations.delete(id); if (waitingForQueuedOperations.size === 0) { @@ -63,7 +63,7 @@ const API = { API.disableQueue(); } }, - disableQueue: function(): void { + disableQueue: function (): void { invariant(NativeAnimatedModule, 'Native animated module is not available'); if (Platform.OS === 'android') { @@ -84,37 +84,40 @@ const API = { fn(); } }, - createAnimatedNode: function(tag: number, config: AnimatedNodeConfig): void { + createAnimatedNode: function (tag: number, config: AnimatedNodeConfig): void { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.createAnimatedNode(tag, config), ); }, - startListeningToAnimatedNodeValue: function(tag: number) { + startListeningToAnimatedNodeValue: function (tag: number) { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.startListeningToAnimatedNodeValue(tag), ); }, - stopListeningToAnimatedNodeValue: function(tag: number) { + stopListeningToAnimatedNodeValue: function (tag: number) { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.stopListeningToAnimatedNodeValue(tag), ); }, - connectAnimatedNodes: function(parentTag: number, childTag: number): void { + connectAnimatedNodes: function (parentTag: number, childTag: number): void { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.connectAnimatedNodes(parentTag, childTag), ); }, - disconnectAnimatedNodes: function(parentTag: number, childTag: number): void { + disconnectAnimatedNodes: function ( + parentTag: number, + childTag: number, + ): void { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.disconnectAnimatedNodes(parentTag, childTag), ); }, - startAnimatingNode: function( + startAnimatingNode: function ( animationId: number, nodeTag: number, config: AnimatingNodeConfig, @@ -130,41 +133,41 @@ const API = { ), ); }, - stopAnimation: function(animationId: number) { + stopAnimation: function (animationId: number) { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.stopAnimation(animationId)); }, - setAnimatedNodeValue: function(nodeTag: number, value: number): void { + setAnimatedNodeValue: function (nodeTag: number, value: number): void { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.setAnimatedNodeValue(nodeTag, value), ); }, - setAnimatedNodeOffset: function(nodeTag: number, offset: number): void { + setAnimatedNodeOffset: function (nodeTag: number, offset: number): void { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.setAnimatedNodeOffset(nodeTag, offset), ); }, - flattenAnimatedNodeOffset: function(nodeTag: number): void { + flattenAnimatedNodeOffset: function (nodeTag: number): void { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.flattenAnimatedNodeOffset(nodeTag), ); }, - extractAnimatedNodeOffset: function(nodeTag: number): void { + extractAnimatedNodeOffset: function (nodeTag: number): void { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.extractAnimatedNodeOffset(nodeTag), ); }, - connectAnimatedNodeToView: function(nodeTag: number, viewTag: number): void { + connectAnimatedNodeToView: function (nodeTag: number, viewTag: number): void { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.connectAnimatedNodeToView(nodeTag, viewTag), ); }, - disconnectAnimatedNodeFromView: function( + disconnectAnimatedNodeFromView: function ( nodeTag: number, viewTag: number, ): void { @@ -173,7 +176,7 @@ const API = { NativeAnimatedModule.disconnectAnimatedNodeFromView(nodeTag, viewTag), ); }, - restoreDefaultValues: function(nodeTag: number): void { + restoreDefaultValues: function (nodeTag: number): void { invariant(NativeAnimatedModule, 'Native animated module is not available'); // Backwards compat with older native runtimes, can be removed later. if (NativeAnimatedModule.restoreDefaultValues != null) { @@ -182,11 +185,11 @@ const API = { ); } }, - dropAnimatedNode: function(tag: number): void { + dropAnimatedNode: function (tag: number): void { invariant(NativeAnimatedModule, 'Native animated module is not available'); API.queueOperation(() => NativeAnimatedModule.dropAnimatedNode(tag)); }, - addAnimatedEventToView: function( + addAnimatedEventToView: function ( viewTag: number, eventName: string, eventMapping: EventMapping, diff --git a/Libraries/Animated/__tests__/AnimatedNative-test.js b/Libraries/Animated/__tests__/AnimatedNative-test.js index a6655d83952c..597aae9b6c4b 100644 --- a/Libraries/Animated/__tests__/AnimatedNative-test.js +++ b/Libraries/Animated/__tests__/AnimatedNative-test.js @@ -382,15 +382,17 @@ describe('Native Animated', () => { expect.any(Number), {type: 'addition', input: expect.any(Array)}, ); - const additionCalls = NativeAnimatedModule.createAnimatedNode.mock.calls.filter( - call => call[1].type === 'addition', - ); + const additionCalls = + NativeAnimatedModule.createAnimatedNode.mock.calls.filter( + call => call[1].type === 'addition', + ); expect(additionCalls.length).toBe(1); const additionCall = additionCalls[0]; const additionNodeTag = additionCall[0]; - const additionConnectionCalls = NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( - call => call[1] === additionNodeTag, - ); + const additionConnectionCalls = + NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( + call => call[1] === additionNodeTag, + ); expect(additionConnectionCalls.length).toBe(2); expect(NativeAnimatedModule.createAnimatedNode).toBeCalledWith( additionCall[1].input[0], @@ -424,15 +426,17 @@ describe('Native Animated', () => { expect.any(Number), {type: 'subtraction', input: expect.any(Array)}, ); - const subtractionCalls = NativeAnimatedModule.createAnimatedNode.mock.calls.filter( - call => call[1].type === 'subtraction', - ); + const subtractionCalls = + NativeAnimatedModule.createAnimatedNode.mock.calls.filter( + call => call[1].type === 'subtraction', + ); expect(subtractionCalls.length).toBe(1); const subtractionCall = subtractionCalls[0]; const subtractionNodeTag = subtractionCall[0]; - const subtractionConnectionCalls = NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( - call => call[1] === subtractionNodeTag, - ); + const subtractionConnectionCalls = + NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( + call => call[1] === subtractionNodeTag, + ); expect(subtractionConnectionCalls.length).toBe(2); expect(NativeAnimatedModule.createAnimatedNode).toBeCalledWith( subtractionCall[1].input[0], @@ -466,15 +470,17 @@ describe('Native Animated', () => { expect.any(Number), {type: 'multiplication', input: expect.any(Array)}, ); - const multiplicationCalls = NativeAnimatedModule.createAnimatedNode.mock.calls.filter( - call => call[1].type === 'multiplication', - ); + const multiplicationCalls = + NativeAnimatedModule.createAnimatedNode.mock.calls.filter( + call => call[1].type === 'multiplication', + ); expect(multiplicationCalls.length).toBe(1); const multiplicationCall = multiplicationCalls[0]; const multiplicationNodeTag = multiplicationCall[0]; - const multiplicationConnectionCalls = NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( - call => call[1] === multiplicationNodeTag, - ); + const multiplicationConnectionCalls = + NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( + call => call[1] === multiplicationNodeTag, + ); expect(multiplicationConnectionCalls.length).toBe(2); expect(NativeAnimatedModule.createAnimatedNode).toBeCalledWith( multiplicationCall[1].input[0], @@ -508,15 +514,17 @@ describe('Native Animated', () => { expect.any(Number), {type: 'division', input: expect.any(Array)}, ); - const divisionCalls = NativeAnimatedModule.createAnimatedNode.mock.calls.filter( - call => call[1].type === 'division', - ); + const divisionCalls = + NativeAnimatedModule.createAnimatedNode.mock.calls.filter( + call => call[1].type === 'division', + ); expect(divisionCalls.length).toBe(1); const divisionCall = divisionCalls[0]; const divisionNodeTag = divisionCall[0]; - const divisionConnectionCalls = NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( - call => call[1] === divisionNodeTag, - ); + const divisionConnectionCalls = + NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( + call => call[1] === divisionNodeTag, + ); expect(divisionConnectionCalls.length).toBe(2); expect(NativeAnimatedModule.createAnimatedNode).toBeCalledWith( divisionCall[1].input[0], @@ -548,15 +556,17 @@ describe('Native Animated', () => { expect.any(Number), {type: 'modulus', modulus: 4, input: expect.any(Number)}, ); - const moduloCalls = NativeAnimatedModule.createAnimatedNode.mock.calls.filter( - call => call[1].type === 'modulus', - ); + const moduloCalls = + NativeAnimatedModule.createAnimatedNode.mock.calls.filter( + call => call[1].type === 'modulus', + ); expect(moduloCalls.length).toBe(1); const moduloCall = moduloCalls[0]; const moduloNodeTag = moduloCall[0]; - const moduloConnectionCalls = NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( - call => call[1] === moduloNodeTag, - ); + const moduloConnectionCalls = + NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( + call => call[1] === moduloNodeTag, + ); expect(moduloConnectionCalls.length).toBe(1); expect(NativeAnimatedModule.createAnimatedNode).toBeCalledWith( moduloCall[1].input, @@ -597,12 +607,14 @@ describe('Native Animated', () => { extrapolateRight: 'extend', }, ); - const interpolationNodeTag = NativeAnimatedModule.createAnimatedNode.mock.calls.find( - call => call[1].type === 'interpolation', - )[0]; - const valueNodeTag = NativeAnimatedModule.createAnimatedNode.mock.calls.find( - call => call[1].type === 'value', - )[0]; + const interpolationNodeTag = + NativeAnimatedModule.createAnimatedNode.mock.calls.find( + call => call[1].type === 'interpolation', + )[0]; + const valueNodeTag = + NativeAnimatedModule.createAnimatedNode.mock.calls.find( + call => call[1].type === 'value', + )[0]; expect(NativeAnimatedModule.connectAnimatedNodes).toBeCalledWith( valueNodeTag, interpolationNodeTag, @@ -649,15 +661,17 @@ describe('Native Animated', () => { expect.any(Number), {type: 'diffclamp', input: expect.any(Number), max: 20, min: 0}, ); - const diffClampCalls = NativeAnimatedModule.createAnimatedNode.mock.calls.filter( - call => call[1].type === 'diffclamp', - ); + const diffClampCalls = + NativeAnimatedModule.createAnimatedNode.mock.calls.filter( + call => call[1].type === 'diffclamp', + ); expect(diffClampCalls.length).toBe(1); const diffClampCall = diffClampCalls[0]; const diffClampNodeTag = diffClampCall[0]; - const diffClampConnectionCalls = NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( - call => call[1] === diffClampNodeTag, - ); + const diffClampConnectionCalls = + NativeAnimatedModule.connectAnimatedNodes.mock.calls.filter( + call => call[1] === diffClampNodeTag, + ); expect(diffClampConnectionCalls.length).toBe(1); expect(NativeAnimatedModule.createAnimatedNode).toBeCalledWith( diffClampCall[1].input, diff --git a/Libraries/Animated/__tests__/Easing-test.js b/Libraries/Animated/__tests__/Easing-test.js index 409b1a7c3a8b..a478919587c0 100644 --- a/Libraries/Animated/__tests__/Easing-test.js +++ b/Libraries/Animated/__tests__/Easing-test.js @@ -91,366 +91,145 @@ describe('Easing', () => { const Samples = { in_quad: [ - 0, - 0.0030864197530864196, - 0.012345679012345678, - 0.027777777777777776, - 0.04938271604938271, - 0.0771604938271605, - 0.1111111111111111, - 0.15123456790123457, - 0.19753086419753085, - 0.25, - 0.308641975308642, - 0.37345679012345684, - 0.4444444444444444, - 0.5216049382716049, - 0.6049382716049383, - 0.6944444444444445, - 0.7901234567901234, - 0.8919753086419753, - 1, + 0, 0.0030864197530864196, 0.012345679012345678, 0.027777777777777776, + 0.04938271604938271, 0.0771604938271605, 0.1111111111111111, + 0.15123456790123457, 0.19753086419753085, 0.25, 0.308641975308642, + 0.37345679012345684, 0.4444444444444444, 0.5216049382716049, + 0.6049382716049383, 0.6944444444444445, 0.7901234567901234, + 0.8919753086419753, 1, ], out_quad: [ - 0, - 0.10802469135802469, - 0.20987654320987653, - 0.3055555555555555, - 0.3950617283950617, - 0.47839506172839513, - 0.5555555555555556, - 0.6265432098765432, - 0.691358024691358, - 0.75, - 0.8024691358024691, - 0.8487654320987654, - 0.888888888888889, - 0.9228395061728394, - 0.9506172839506174, - 0.9722222222222221, - 0.9876543209876543, - 0.9969135802469136, - 1, + 0, 0.10802469135802469, 0.20987654320987653, 0.3055555555555555, + 0.3950617283950617, 0.47839506172839513, 0.5555555555555556, + 0.6265432098765432, 0.691358024691358, 0.75, 0.8024691358024691, + 0.8487654320987654, 0.888888888888889, 0.9228395061728394, + 0.9506172839506174, 0.9722222222222221, 0.9876543209876543, + 0.9969135802469136, 1, ], inOut_quad: [ - 0, - 0.006172839506172839, - 0.024691358024691357, - 0.05555555555555555, - 0.09876543209876543, - 0.154320987654321, - 0.2222222222222222, - 0.30246913580246915, - 0.3950617283950617, - 0.5, - 0.6049382716049383, - 0.697530864197531, - 0.7777777777777777, - 0.845679012345679, - 0.9012345679012346, - 0.9444444444444444, - 0.9753086419753086, - 0.9938271604938271, - 1, + 0, 0.006172839506172839, 0.024691358024691357, 0.05555555555555555, + 0.09876543209876543, 0.154320987654321, 0.2222222222222222, + 0.30246913580246915, 0.3950617283950617, 0.5, 0.6049382716049383, + 0.697530864197531, 0.7777777777777777, 0.845679012345679, + 0.9012345679012346, 0.9444444444444444, 0.9753086419753086, + 0.9938271604938271, 1, ], in_cubic: [ - 0, - 0.00017146776406035664, - 0.0013717421124828531, - 0.004629629629629629, - 0.010973936899862825, - 0.021433470507544586, - 0.037037037037037035, - 0.05881344307270234, - 0.0877914951989026, - 0.125, - 0.1714677640603567, - 0.22822359396433475, - 0.2962962962962963, - 0.37671467764060357, - 0.4705075445816187, - 0.5787037037037038, - 0.7023319615912208, - 0.8424211248285322, - 1, + 0, 0.00017146776406035664, 0.0013717421124828531, 0.004629629629629629, + 0.010973936899862825, 0.021433470507544586, 0.037037037037037035, + 0.05881344307270234, 0.0877914951989026, 0.125, 0.1714677640603567, + 0.22822359396433475, 0.2962962962962963, 0.37671467764060357, + 0.4705075445816187, 0.5787037037037038, 0.7023319615912208, + 0.8424211248285322, 1, ], out_cubic: [ - 0, - 0.15757887517146785, - 0.2976680384087792, - 0.42129629629629617, - 0.5294924554183813, - 0.6232853223593964, - 0.7037037037037036, - 0.7717764060356652, - 0.8285322359396433, - 0.875, - 0.9122085048010974, - 0.9411865569272977, - 0.9629629629629629, - 0.9785665294924554, - 0.9890260631001372, - 0.9953703703703703, - 0.9986282578875172, - 0.9998285322359396, - 1, + 0, 0.15757887517146785, 0.2976680384087792, 0.42129629629629617, + 0.5294924554183813, 0.6232853223593964, 0.7037037037037036, + 0.7717764060356652, 0.8285322359396433, 0.875, 0.9122085048010974, + 0.9411865569272977, 0.9629629629629629, 0.9785665294924554, + 0.9890260631001372, 0.9953703703703703, 0.9986282578875172, + 0.9998285322359396, 1, ], inOut_cubic: [ - 0, - 0.0006858710562414266, - 0.0054869684499314125, - 0.018518518518518517, - 0.0438957475994513, - 0.08573388203017834, - 0.14814814814814814, - 0.23525377229080935, - 0.3511659807956104, - 0.5, - 0.6488340192043895, - 0.7647462277091908, - 0.8518518518518519, - 0.9142661179698217, - 0.9561042524005487, - 0.9814814814814815, - 0.9945130315500685, - 0.9993141289437586, - 1, + 0, 0.0006858710562414266, 0.0054869684499314125, 0.018518518518518517, + 0.0438957475994513, 0.08573388203017834, 0.14814814814814814, + 0.23525377229080935, 0.3511659807956104, 0.5, 0.6488340192043895, + 0.7647462277091908, 0.8518518518518519, 0.9142661179698217, + 0.9561042524005487, 0.9814814814814815, 0.9945130315500685, + 0.9993141289437586, 1, ], in_sin: [ - 0, - 0.003805301908254455, - 0.01519224698779198, - 0.03407417371093169, - 0.06030737921409157, - 0.09369221296335006, - 0.1339745962155613, - 0.1808479557110082, - 0.233955556881022, - 0.2928932188134524, - 0.35721239031346064, - 0.42642356364895384, - 0.4999999999999999, - 0.5773817382593005, - 0.6579798566743311, - 0.7411809548974793, - 0.8263518223330696, - 0.9128442572523416, - 0.9999999999999999, + 0, 0.003805301908254455, 0.01519224698779198, 0.03407417371093169, + 0.06030737921409157, 0.09369221296335006, 0.1339745962155613, + 0.1808479557110082, 0.233955556881022, 0.2928932188134524, + 0.35721239031346064, 0.42642356364895384, 0.4999999999999999, + 0.5773817382593005, 0.6579798566743311, 0.7411809548974793, + 0.8263518223330696, 0.9128442572523416, 0.9999999999999999, ], out_sin: [ - 0, - 0.08715574274765817, - 0.17364817766693033, - 0.25881904510252074, - 0.3420201433256687, - 0.42261826174069944, - 0.49999999999999994, - 0.573576436351046, - 0.6427876096865393, - 0.7071067811865475, - 0.766044443118978, - 0.8191520442889918, - 0.8660254037844386, - 0.9063077870366499, - 0.9396926207859083, - 0.9659258262890683, - 0.984807753012208, - 0.9961946980917455, - 1, + 0, 0.08715574274765817, 0.17364817766693033, 0.25881904510252074, + 0.3420201433256687, 0.42261826174069944, 0.49999999999999994, + 0.573576436351046, 0.6427876096865393, 0.7071067811865475, + 0.766044443118978, 0.8191520442889918, 0.8660254037844386, + 0.9063077870366499, 0.9396926207859083, 0.9659258262890683, + 0.984807753012208, 0.9961946980917455, 1, ], inOut_sin: [ - 0, - 0.00759612349389599, - 0.030153689607045786, - 0.06698729810778065, - 0.116977778440511, - 0.17860619515673032, - 0.24999999999999994, - 0.32898992833716556, - 0.4131759111665348, - 0.49999999999999994, - 0.5868240888334652, - 0.6710100716628343, - 0.7499999999999999, - 0.8213938048432696, - 0.883022221559489, - 0.9330127018922194, - 0.9698463103929542, - 0.9924038765061041, - 1, + 0, 0.00759612349389599, 0.030153689607045786, 0.06698729810778065, + 0.116977778440511, 0.17860619515673032, 0.24999999999999994, + 0.32898992833716556, 0.4131759111665348, 0.49999999999999994, + 0.5868240888334652, 0.6710100716628343, 0.7499999999999999, + 0.8213938048432696, 0.883022221559489, 0.9330127018922194, + 0.9698463103929542, 0.9924038765061041, 1, ], in_exp: [ - 0, - 0.0014352875901128893, - 0.002109491677524035, - 0.0031003926796253885, - 0.004556754060844206, - 0.006697218616039631, - 0.009843133202303688, - 0.014466792379488908, - 0.021262343752724643, - 0.03125, - 0.045929202883612456, - 0.06750373368076916, - 0.09921256574801243, - 0.1458161299470146, - 0.2143109957132682, - 0.31498026247371835, - 0.46293735614364506, - 0.6803950000871883, - 1, + 0, 0.0014352875901128893, 0.002109491677524035, 0.0031003926796253885, + 0.004556754060844206, 0.006697218616039631, 0.009843133202303688, + 0.014466792379488908, 0.021262343752724643, 0.03125, 0.045929202883612456, + 0.06750373368076916, 0.09921256574801243, 0.1458161299470146, + 0.2143109957132682, 0.31498026247371835, 0.46293735614364506, + 0.6803950000871883, 1, ], out_exp: [ - 0, - 0.31960499991281155, - 0.5370626438563548, - 0.6850197375262816, - 0.7856890042867318, - 0.8541838700529854, - 0.9007874342519875, - 0.9324962663192309, - 0.9540707971163875, - 0.96875, - 0.9787376562472754, - 0.9855332076205111, - 0.9901568667976963, - 0.9933027813839603, - 0.9954432459391558, - 0.9968996073203746, - 0.9978905083224759, - 0.9985647124098871, - 1, + 0, 0.31960499991281155, 0.5370626438563548, 0.6850197375262816, + 0.7856890042867318, 0.8541838700529854, 0.9007874342519875, + 0.9324962663192309, 0.9540707971163875, 0.96875, 0.9787376562472754, + 0.9855332076205111, 0.9901568667976963, 0.9933027813839603, + 0.9954432459391558, 0.9968996073203746, 0.9978905083224759, + 0.9985647124098871, 1, ], inOut_exp: [ - 0, - 0.0010547458387620175, - 0.002278377030422103, - 0.004921566601151844, - 0.010631171876362321, - 0.022964601441806228, - 0.049606282874006216, - 0.1071554978566341, - 0.23146867807182253, - 0.5, - 0.7685313219281775, - 0.892844502143366, - 0.9503937171259937, - 0.9770353985581938, - 0.9893688281236377, - 0.9950784333988482, - 0.9977216229695779, - 0.998945254161238, - 1, + 0, 0.0010547458387620175, 0.002278377030422103, 0.004921566601151844, + 0.010631171876362321, 0.022964601441806228, 0.049606282874006216, + 0.1071554978566341, 0.23146867807182253, 0.5, 0.7685313219281775, + 0.892844502143366, 0.9503937171259937, 0.9770353985581938, + 0.9893688281236377, 0.9950784333988482, 0.9977216229695779, + 0.998945254161238, 1, ], in_circle: [ - 0, - 0.0015444024660317135, - 0.006192010000093506, - 0.013986702816730645, - 0.025003956956430873, - 0.03935464078941209, - 0.057190958417936644, - 0.07871533601238889, - 0.10419358352238339, - 0.1339745962155614, - 0.1685205807169019, - 0.20845517506805522, - 0.2546440075000701, - 0.3083389112228482, - 0.37146063894529113, - 0.4472292016074334, - 0.5418771527091488, - 0.6713289009389102, - 1, + 0, 0.0015444024660317135, 0.006192010000093506, 0.013986702816730645, + 0.025003956956430873, 0.03935464078941209, 0.057190958417936644, + 0.07871533601238889, 0.10419358352238339, 0.1339745962155614, + 0.1685205807169019, 0.20845517506805522, 0.2546440075000701, + 0.3083389112228482, 0.37146063894529113, 0.4472292016074334, + 0.5418771527091488, 0.6713289009389102, 1, ], out_circle: [ - 0, - 0.3286710990610898, - 0.45812284729085123, - 0.5527707983925666, - 0.6285393610547089, - 0.6916610887771518, - 0.7453559924999298, - 0.7915448249319448, - 0.8314794192830981, - 0.8660254037844386, - 0.8958064164776166, - 0.9212846639876111, - 0.9428090415820634, - 0.9606453592105879, - 0.9749960430435691, - 0.9860132971832694, - 0.9938079899999065, - 0.9984555975339683, - 1, + 0, 0.3286710990610898, 0.45812284729085123, 0.5527707983925666, + 0.6285393610547089, 0.6916610887771518, 0.7453559924999298, + 0.7915448249319448, 0.8314794192830981, 0.8660254037844386, + 0.8958064164776166, 0.9212846639876111, 0.9428090415820634, + 0.9606453592105879, 0.9749960430435691, 0.9860132971832694, + 0.9938079899999065, 0.9984555975339683, 1, ], inOut_circle: [ - 0, - 0.003096005000046753, - 0.012501978478215436, - 0.028595479208968322, - 0.052096791761191696, - 0.08426029035845095, - 0.12732200375003505, - 0.18573031947264557, - 0.2709385763545744, - 0.5, - 0.7290614236454256, - 0.8142696805273546, - 0.8726779962499649, - 0.915739709641549, - 0.9479032082388084, - 0.9714045207910317, - 0.9874980215217846, - 0.9969039949999532, - 1, + 0, 0.003096005000046753, 0.012501978478215436, 0.028595479208968322, + 0.052096791761191696, 0.08426029035845095, 0.12732200375003505, + 0.18573031947264557, 0.2709385763545744, 0.5, 0.7290614236454256, + 0.8142696805273546, 0.8726779962499649, 0.915739709641549, + 0.9479032082388084, 0.9714045207910317, 0.9874980215217846, + 0.9969039949999532, 1, ], in_back_: [ - 0, - -0.004788556241426612, - -0.017301289437585736, - -0.0347587962962963, - -0.05438167352537723, - -0.07339051783264748, - -0.08900592592592595, - -0.09844849451303156, - -0.0989388203017833, - -0.08769750000000004, - -0.06194513031550073, - -0.018902307956104283, - 0.044210370370370254, - 0.13017230795610413, - 0.2417629080932785, - 0.3817615740740742, - 0.5529477091906719, - 0.7581007167352535, - 0.9999999999999998, + 0, -0.004788556241426612, -0.017301289437585736, -0.0347587962962963, + -0.05438167352537723, -0.07339051783264748, -0.08900592592592595, + -0.09844849451303156, -0.0989388203017833, -0.08769750000000004, + -0.06194513031550073, -0.018902307956104283, 0.044210370370370254, + 0.13017230795610413, 0.2417629080932785, 0.3817615740740742, + 0.5529477091906719, 0.7581007167352535, 0.9999999999999998, ], out_back_: [ - 2.220446049250313e-16, - 0.24189928326474652, - 0.44705229080932807, - 0.6182384259259258, - 0.7582370919067215, - 0.8698276920438959, - 0.9557896296296297, - 1.0189023079561044, - 1.0619451303155008, - 1.0876975, - 1.0989388203017834, - 1.0984484945130315, - 1.089005925925926, - 1.0733905178326475, - 1.0543816735253773, - 1.0347587962962963, - 1.0173012894375857, - 1.0047885562414267, - 1, + 2.220446049250313e-16, 0.24189928326474652, 0.44705229080932807, + 0.6182384259259258, 0.7582370919067215, 0.8698276920438959, + 0.9557896296296297, 1.0189023079561044, 1.0619451303155008, 1.0876975, + 1.0989388203017834, 1.0984484945130315, 1.089005925925926, + 1.0733905178326475, 1.0543816735253773, 1.0347587962962963, + 1.0173012894375857, 1.0047885562414267, 1, ], }; - Object.keys(Samples).forEach(function(type) { - it('should ease ' + type, function() { + Object.keys(Samples).forEach(function (type) { + it('should ease ' + type, function () { const [modeName, easingName, isFunction] = type.split('_'); let easing = Easing[easingName]; if (isFunction !== undefined) { diff --git a/Libraries/Animated/__tests__/bezier-test.js b/Libraries/Animated/__tests__/bezier-test.js index e7be582a524c..846edc12828b 100644 --- a/Libraries/Animated/__tests__/bezier-test.js +++ b/Libraries/Animated/__tests__/bezier-test.js @@ -19,7 +19,7 @@ const bezier = require('../bezier'); -const identity = function(x) { +const identity = function (x) { return x; }; @@ -28,7 +28,7 @@ function assertClose(a, b, precision = 3) { } function makeAssertCloseWithPrecision(precision) { - return function(a, b) { + return function (a, b) { assertClose(a, b, precision); }; } @@ -44,43 +44,43 @@ function allEquals(be1, be2, samples, assertion) { } function repeat(n) { - return function(f) { + return function (f) { for (let i = 0; i < n; ++i) { f(); } }; } -describe('bezier', function() { - it('should be a function', function() { +describe('bezier', function () { + it('should be a function', function () { expect(typeof bezier === 'function').toBe(true); }); - it('should creates an object', function() { + it('should creates an object', function () { expect(typeof bezier(0, 0, 1, 1) === 'function').toBe(true); }); - it('should fail with wrong arguments', function() { - expect(function() { + it('should fail with wrong arguments', function () { + expect(function () { bezier(0.5, 0.5, -5, 0.5); }).toThrow(); - expect(function() { + expect(function () { bezier(0.5, 0.5, 5, 0.5); }).toThrow(); - expect(function() { + expect(function () { bezier(-2, 0.5, 0.5, 0.5); }).toThrow(); - expect(function() { + expect(function () { bezier(2, 0.5, 0.5, 0.5); }).toThrow(); }); - describe('linear curves', function() { - it('should be linear', function() { + describe('linear curves', function () { + it('should be linear', function () { allEquals(bezier(0, 0, 1, 1), bezier(1, 1, 0, 0), 100); allEquals(bezier(0, 0, 1, 1), identity, 100); }); }); - describe('common properties', function() { - it('should be the right value at extremes', function() { - repeat(10)(function() { + describe('common properties', function () { + it('should be the right value at extremes', function () { + repeat(10)(function () { const a = Math.random(), b = 2 * Math.random() - 0.5, c = Math.random(), @@ -91,24 +91,24 @@ describe('bezier', function() { }); }); - it('should approach the projected value of its x=y projected curve', function() { - repeat(10)(function() { + it('should approach the projected value of its x=y projected curve', function () { + repeat(10)(function () { const a = Math.random(), b = Math.random(), c = Math.random(), d = Math.random(); const easing = bezier(a, b, c, d); const projected = bezier(b, a, d, c); - const composed = function(x) { + const composed = function (x) { return projected(easing(x)); }; allEquals(identity, composed, 100, makeAssertCloseWithPrecision(2)); }); }); }); - describe('two same instances', function() { - it('should be strictly equals', function() { - repeat(10)(function() { + describe('two same instances', function () { + it('should be strictly equals', function () { + repeat(10)(function () { const a = Math.random(), b = 2 * Math.random() - 0.5, c = Math.random(), @@ -117,9 +117,9 @@ describe('bezier', function() { }); }); }); - describe('symmetric curves', function() { - it('should have a central value y~=0.5 at x=0.5', function() { - repeat(10)(function() { + describe('symmetric curves', function () { + it('should have a central value y~=0.5 at x=0.5', function () { + repeat(10)(function () { const a = Math.random(), b = 2 * Math.random() - 0.5, c = 1 - a, @@ -128,14 +128,14 @@ describe('bezier', function() { assertClose(easing(0.5), 0.5, 2); }); }); - it('should be symmetrical', function() { - repeat(10)(function() { + it('should be symmetrical', function () { + repeat(10)(function () { const a = Math.random(), b = 2 * Math.random() - 0.5, c = 1 - a, d = 1 - b; const easing = bezier(a, b, c, d); - const sym = function(x) { + const sym = function (x) { return 1 - easing(1 - x); }; allEquals(easing, sym, 100, makeAssertCloseWithPrecision(2)); diff --git a/Libraries/Animated/nodes/AnimatedNode.js b/Libraries/Animated/nodes/AnimatedNode.js index 7371d49fd5b3..082f42e51038 100644 --- a/Libraries/Animated/nodes/AnimatedNode.js +++ b/Libraries/Animated/nodes/AnimatedNode.js @@ -119,15 +119,16 @@ class AnimatedNode { } NativeAnimatedAPI.startListeningToAnimatedNodeValue(this.__getNativeTag()); - this.__nativeAnimatedValueListener = NativeAnimatedHelper.nativeEventEmitter.addListener( - 'onAnimatedValueUpdate', - data => { - if (data.tag !== this.__getNativeTag()) { - return; - } - this._onAnimatedValueUpdateReceived(data.value); - }, - ); + this.__nativeAnimatedValueListener = + NativeAnimatedHelper.nativeEventEmitter.addListener( + 'onAnimatedValueUpdate', + data => { + if (data.tag !== this.__getNativeTag()) { + return; + } + this._onAnimatedValueUpdateReceived(data.value); + }, + ); } _onAnimatedValueUpdateReceived(value: number) { diff --git a/Libraries/Animated/nodes/AnimatedValueXY.js b/Libraries/Animated/nodes/AnimatedValueXY.js index 28d3395db8a8..4c0f9e86404c 100644 --- a/Libraries/Animated/nodes/AnimatedValueXY.js +++ b/Libraries/Animated/nodes/AnimatedValueXY.js @@ -38,7 +38,7 @@ class AnimatedValueXY extends AnimatedWithChildren { y: string, ... }, - ..., + ... }; constructor( diff --git a/Libraries/AppState/AppState.js b/Libraries/AppState/AppState.js index 303c97ed28e2..191ab4b28f21 100644 --- a/Libraries/AppState/AppState.js +++ b/Libraries/AppState/AppState.js @@ -47,11 +47,12 @@ class AppState { } else { this.isAvailable = true; - const emitter: NativeEventEmitter = new NativeEventEmitter( - // T88715063: NativeEventEmitter only used this parameter on iOS. Now it uses it on all platforms, so this code was modified automatically to preserve its behavior - // If you want to use the native module on other platforms, please remove this condition and test its behavior - Platform.OS !== 'ios' ? null : NativeAppState, - ); + const emitter: NativeEventEmitter = + new NativeEventEmitter( + // T88715063: NativeEventEmitter only used this parameter on iOS. Now it uses it on all platforms, so this code was modified automatically to preserve its behavior + // If you want to use the native module on other platforms, please remove this condition and test its behavior + Platform.OS !== 'ios' ? null : NativeAppState, + ); this._emitter = emitter; this.currentState = NativeAppState.getConstants().initialAppState; diff --git a/Libraries/BatchedBridge/__mocks__/MessageQueueTestModule.js b/Libraries/BatchedBridge/__mocks__/MessageQueueTestModule.js index 667799a42f4b..d0e5477822ef 100644 --- a/Libraries/BatchedBridge/__mocks__/MessageQueueTestModule.js +++ b/Libraries/BatchedBridge/__mocks__/MessageQueueTestModule.js @@ -15,8 +15,8 @@ * cases. */ const MessageQueueTestModule = { - testHook1: function() {}, - testHook2: function() {}, + testHook1: function () {}, + testHook2: function () {}, }; module.exports = MessageQueueTestModule; diff --git a/Libraries/BatchedBridge/__tests__/MessageQueue-test.js b/Libraries/BatchedBridge/__tests__/MessageQueue-test.js index 9c63238d8a09..031192793de4 100644 --- a/Libraries/BatchedBridge/__tests__/MessageQueue-test.js +++ b/Libraries/BatchedBridge/__tests__/MessageQueue-test.js @@ -30,8 +30,8 @@ const assertQueue = (flushedQueue, index, moduleID, methodID, params) => { // // [ ] Local modules that throw exceptions are gracefully caught. In that case // local callbacks stored by IDs are cleaned up. -describe('MessageQueue', function() { - beforeEach(function() { +describe('MessageQueue', function () { + beforeEach(function () { jest.resetModules(); MessageQueue = require('../MessageQueue'); MessageQueueTestModule = require('../__mocks__/MessageQueueTestModule'); @@ -141,7 +141,7 @@ describe('MessageQueue', function() { it('should check if the global error handler is not overridden by the DebuggerInternal object', () => { const dummyModule = { - dummy: function() {}, + dummy: function () {}, }; const name = 'emptyModuleName'; const factory = jest.fn(() => dummyModule); @@ -153,7 +153,7 @@ describe('MessageQueue', function() { it('should check if the global error handler is overridden by the DebuggerInternal object', () => { const dummyModule = { - dummy: function() {}, + dummy: function () {}, }; const name = 'emptyModuleName'; const factory = jest.fn(() => dummyModule); diff --git a/Libraries/BatchedBridge/__tests__/NativeModules-test.js b/Libraries/BatchedBridge/__tests__/NativeModules-test.js index bedff6127d95..35f1c43764ae 100644 --- a/Libraries/BatchedBridge/__tests__/NativeModules-test.js +++ b/Libraries/BatchedBridge/__tests__/NativeModules-test.js @@ -38,8 +38,8 @@ const assertQueue = (flushedQueue, index, moduleID, methodID, params) => { // success callbacks are cleaned up. // // [ ] Remote invocation throws if not supplying an error callback. -describe('MessageQueue', function() { - beforeEach(function() { +describe('MessageQueue', function () { + beforeEach(function () { jest.resetModules(); global.__fbBatchedBridgeConfig = require('../__mocks__/MessageQueueTestConfig'); @@ -55,7 +55,7 @@ describe('MessageQueue', function() { assertQueue(flushedQueue, 0, 0, 0, ['foo']); }); - it('should make round trip and clear memory', function() { + it('should make round trip and clear memory', function () { const onFail = jest.fn(); const onSucc = jest.fn(); @@ -101,7 +101,7 @@ describe('MessageQueue', function() { // Handle the first remote invocation by signaling failure. BatchedBridge.__invokeCallback(firstFailCBID, ['firstFailure']); // The failure callback was already invoked, the success is no longer valid - expect(function() { + expect(function () { BatchedBridge.__invokeCallback(firstSuccCBID, ['firstSucc']); }).toThrow(); expect(onFail.mock.calls.length).toBe(1); @@ -110,14 +110,14 @@ describe('MessageQueue', function() { // Handle the second remote invocation by signaling success. BatchedBridge.__invokeCallback(secondSuccCBID, ['secondSucc']); // The success callback was already invoked, the fail cb is no longer valid - expect(function() { + expect(function () { BatchedBridge.__invokeCallback(secondFailCBID, ['secondFail']); }).toThrow(); expect(onFail.mock.calls.length).toBe(1); expect(onSucc.mock.calls.length).toBe(1); }); - it('promise-returning methods (type=promise)', async function() { + it('promise-returning methods (type=promise)', async function () { // Perform communication const promise1 = NativeModules.RemoteModule1.promiseReturningMethod( 'paloAlto', @@ -162,7 +162,7 @@ describe('MessageQueue', function() { // Handle the first remote invocation by signaling failure. BatchedBridge.__invokeCallback(firstFailCBID, [{message: 'firstFailure'}]); // The failure callback was already invoked, the success is no longer valid - expect(function() { + expect(function () { BatchedBridge.__invokeCallback(firstSuccCBID, ['firstSucc']); }).toThrow(); await expect(promise1).rejects.toBeInstanceOf(Error); @@ -171,18 +171,18 @@ describe('MessageQueue', function() { // Handle the second remote invocation by signaling success. BatchedBridge.__invokeCallback(secondSuccCBID, ['secondSucc']); // The success callback was already invoked, the fail cb is no longer valid - expect(function() { + expect(function () { BatchedBridge.__invokeCallback(secondFailCBID, ['secondFail']); }).toThrow(); await promise2; }); describe('sync methods', () => { - afterEach(function() { + afterEach(function () { delete global.nativeCallSyncHook; }); - it('throwing an exception', function() { + it('throwing an exception', function () { global.nativeCallSyncHook = jest.fn(() => { throw new Error('firstFailure'); }); @@ -206,7 +206,7 @@ describe('MessageQueue', function() { }); }); - it('returning a value', function() { + it('returning a value', function () { global.nativeCallSyncHook = jest.fn(() => { return 'secondSucc'; }); diff --git a/Libraries/Blob/__tests__/Blob-test.js b/Libraries/Blob/__tests__/Blob-test.js index 42aea6f05e58..0ec3d8904d8a 100644 --- a/Libraries/Blob/__tests__/Blob-test.js +++ b/Libraries/Blob/__tests__/Blob-test.js @@ -16,7 +16,7 @@ jest.setMock('../../BatchedBridge/NativeModules', { const Blob = require('../Blob'); -describe('Blob', function() { +describe('Blob', function () { it('should create empty blob', () => { const blob = new Blob(); expect(blob).toBeInstanceOf(Blob); diff --git a/Libraries/Blob/__tests__/BlobManager-test.js b/Libraries/Blob/__tests__/BlobManager-test.js index e711e68f9564..bc788cdbf615 100644 --- a/Libraries/Blob/__tests__/BlobManager-test.js +++ b/Libraries/Blob/__tests__/BlobManager-test.js @@ -17,7 +17,7 @@ jest.setMock('../../BatchedBridge/NativeModules', { const Blob = require('../Blob'); const BlobManager = require('../BlobManager'); -describe('BlobManager', function() { +describe('BlobManager', function () { it('should create blob from parts', () => { const blob = BlobManager.createFromParts([], {type: 'text/html'}); expect(blob).toBeInstanceOf(Blob); diff --git a/Libraries/Blob/__tests__/File-test.js b/Libraries/Blob/__tests__/File-test.js index eefbe2864edd..ee097235e220 100644 --- a/Libraries/Blob/__tests__/File-test.js +++ b/Libraries/Blob/__tests__/File-test.js @@ -17,8 +17,8 @@ jest.setMock('../../BatchedBridge/NativeModules', { const Blob = require('../Blob'); const File = require('../File'); -describe('babel 7 smoke test', function() { - it('should be able to extend a class with native name', function() { +describe('babel 7 smoke test', function () { + it('should be able to extend a class with native name', function () { let called = false; class Array { constructor() { @@ -40,14 +40,14 @@ describe('babel 7 smoke test', function() { }); }); -describe('Blob', function() { - it('regression caused by circular dep && babel 7', function() { +describe('Blob', function () { + it('regression caused by circular dep && babel 7', function () { const blob = new Blob([], {type: 'image/jpeg'}); expect(blob).toBeInstanceOf(Blob); }); }); -describe('File', function() { +describe('File', function () { it('should create empty file', () => { const file = new File([], 'test.jpg'); expect(file).toBeInstanceOf(File); diff --git a/Libraries/Blob/__tests__/FileReader-test.js b/Libraries/Blob/__tests__/FileReader-test.js index 4e73df3c569b..3ccf4924242f 100644 --- a/Libraries/Blob/__tests__/FileReader-test.js +++ b/Libraries/Blob/__tests__/FileReader-test.js @@ -18,7 +18,7 @@ jest.unmock('event-target-shim').setMock('../../BatchedBridge/NativeModules', { const Blob = require('../Blob'); const FileReader = require('../FileReader'); -describe('FileReader', function() { +describe('FileReader', function () { it('should read blob as text', async () => { const e = await new Promise((resolve, reject) => { const reader = new FileReader(); diff --git a/Libraries/Blob/__tests__/URL-test.js b/Libraries/Blob/__tests__/URL-test.js index 713ceeea0ef9..fa7e234385e4 100644 --- a/Libraries/Blob/__tests__/URL-test.js +++ b/Libraries/Blob/__tests__/URL-test.js @@ -12,7 +12,7 @@ const URL = require('../URL').URL; -describe('URL', function() { +describe('URL', function () { it('should pass Mozilla Dev Network examples', () => { const a = new URL('/', 'https://developer.mozilla.org'); expect(a.href).toBe('https://developer.mozilla.org/'); diff --git a/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js b/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js index ed2c4a3644e1..a388a6d618f4 100644 --- a/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +++ b/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js @@ -44,24 +44,26 @@ type AccessibilityEventDefinitions = { type AccessibilityEventTypes = 'click' | 'focus'; // Mapping of public event names to platform-specific event names. -const EventNames: Map<$Keys, string> = - Platform.OS === 'android' - ? new Map([ - ['change', 'touchExplorationDidChange'], - ['reduceMotionChanged', 'reduceMotionDidChange'], - ['screenReaderChanged', 'touchExplorationDidChange'], - ['accessibilityServiceChanged', 'accessibilityServiceDidChange'], - ]) - : new Map([ - ['announcementFinished', 'announcementFinished'], - ['boldTextChanged', 'boldTextChanged'], - ['change', 'screenReaderChanged'], - ['grayscaleChanged', 'grayscaleChanged'], - ['invertColorsChanged', 'invertColorsChanged'], - ['reduceMotionChanged', 'reduceMotionChanged'], - ['reduceTransparencyChanged', 'reduceTransparencyChanged'], - ['screenReaderChanged', 'screenReaderChanged'], - ]); +const EventNames: Map< + $Keys, + string, +> = Platform.OS === 'android' + ? new Map([ + ['change', 'touchExplorationDidChange'], + ['reduceMotionChanged', 'reduceMotionDidChange'], + ['screenReaderChanged', 'touchExplorationDidChange'], + ['accessibilityServiceChanged', 'accessibilityServiceDidChange'], + ]) + : new Map([ + ['announcementFinished', 'announcementFinished'], + ['boldTextChanged', 'boldTextChanged'], + ['change', 'screenReaderChanged'], + ['grayscaleChanged', 'grayscaleChanged'], + ['invertColorsChanged', 'invertColorsChanged'], + ['reduceMotionChanged', 'reduceMotionChanged'], + ['reduceTransparencyChanged', 'reduceTransparencyChanged'], + ['screenReaderChanged', 'screenReaderChanged'], + ]); /** * Sometimes it's useful to know whether or not the device has a screen reader diff --git a/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js b/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js index 9c7b9154bbc3..2e82e12dce7e 100644 --- a/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +++ b/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js @@ -162,9 +162,10 @@ class DrawerLayoutAndroid extends React.Component { return {Left: 'left', Right: 'right'}; } - _nativeRef = React.createRef< - React.ElementRef, - >(); + _nativeRef = + React.createRef< + React.ElementRef, + >(); state: State = {statusBarBackgroundColor: null}; diff --git a/Libraries/Components/Keyboard/Keyboard.js b/Libraries/Components/Keyboard/Keyboard.js index fec163cd2845..c357aeb37673 100644 --- a/Libraries/Components/Keyboard/Keyboard.js +++ b/Libraries/Components/Keyboard/Keyboard.js @@ -103,11 +103,12 @@ type KeyboardEventDefinitions = { */ class Keyboard { - _emitter: NativeEventEmitter = new NativeEventEmitter( - // T88715063: NativeEventEmitter only used this parameter on iOS. Now it uses it on all platforms, so this code was modified automatically to preserve its behavior - // If you want to use the native module on other platforms, please remove this condition and test its behavior - Platform.OS !== 'ios' ? null : NativeKeyboardObserver, - ); + _emitter: NativeEventEmitter = + new NativeEventEmitter( + // T88715063: NativeEventEmitter only used this parameter on iOS. Now it uses it on all platforms, so this code was modified automatically to preserve its behavior + // If you want to use the native module on other platforms, please remove this condition and test its behavior + Platform.OS !== 'ios' ? null : NativeKeyboardObserver, + ); /** * The `addListener` function connects a JavaScript function to an identified native diff --git a/Libraries/Components/ProgressViewIOS/ProgressViewIOS.ios.js b/Libraries/Components/ProgressViewIOS/ProgressViewIOS.ios.js index d465440d1748..de2068068dd4 100644 --- a/Libraries/Components/ProgressViewIOS/ProgressViewIOS.ios.js +++ b/Libraries/Components/ProgressViewIOS/ProgressViewIOS.ios.js @@ -71,4 +71,5 @@ const styles = StyleSheet.create({ const ProgressViewIOSWithRef = React.forwardRef(ProgressViewIOS); -module.exports = (ProgressViewIOSWithRef: typeof RCTProgressViewNativeComponent); +module.exports = + (ProgressViewIOSWithRef: typeof RCTProgressViewNativeComponent); diff --git a/Libraries/Components/RefreshControl/RefreshControl.js b/Libraries/Components/RefreshControl/RefreshControl.js index 0f0a16dbbccf..d04e01b53f61 100644 --- a/Libraries/Components/RefreshControl/RefreshControl.js +++ b/Libraries/Components/RefreshControl/RefreshControl.js @@ -158,13 +158,8 @@ class RefreshControl extends React.Component { render(): React.Node { if (Platform.OS === 'ios') { - const { - enabled, - colors, - progressBackgroundColor, - size, - ...props - } = this.props; + const {enabled, colors, progressBackgroundColor, size, ...props} = + this.props; return ( = requireNativeComponent( - 'RCTRefreshControl', -); +const RCTRefreshControl: HostComponent = + requireNativeComponent('RCTRefreshControl'); class RefreshControlMock extends React.Component<{...}> { static latestRef: ?RefreshControlMock; diff --git a/Libraries/Components/SafeAreaView/SafeAreaView.js b/Libraries/Components/SafeAreaView/SafeAreaView.js index 2e6e0e74c7c7..b71aac24e62b 100644 --- a/Libraries/Components/SafeAreaView/SafeAreaView.js +++ b/Libraries/Components/SafeAreaView/SafeAreaView.js @@ -42,8 +42,8 @@ if (Platform.OS === 'android') { }, ); } else { - const RCTSafeAreaViewNativeComponent = require('./RCTSafeAreaViewNativeComponent') - .default; + const RCTSafeAreaViewNativeComponent = + require('./RCTSafeAreaViewNativeComponent').default; exported = React.forwardRef>>( function SafeAreaView(props, forwardedRef) { diff --git a/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js b/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js index 9ba0b235f2e3..343b63d4b4c9 100644 --- a/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js +++ b/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js @@ -12,9 +12,8 @@ import type {ScrollViewNativeProps as Props} from './ScrollViewNativeComponentTy import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes'; import * as NativeComponentRegistry from '../../NativeComponent/NativeComponentRegistry'; -const AndroidHorizontalScrollViewNativeComponent: HostComponent = NativeComponentRegistry.get( - 'AndroidHorizontalScrollView', - () => ({ +const AndroidHorizontalScrollViewNativeComponent: HostComponent = + NativeComponentRegistry.get('AndroidHorizontalScrollView', () => ({ uiViewClassName: 'AndroidHorizontalScrollView', bubblingEventTypes: {}, directEventTypes: {}, @@ -38,7 +37,6 @@ const AndroidHorizontalScrollViewNativeComponent: HostComponent = NativeC snapToOffsets: true, contentOffset: true, }, - }), -); + })); export default AndroidHorizontalScrollViewNativeComponent; diff --git a/Libraries/Components/ScrollView/ScrollContentViewNativeComponent.js b/Libraries/Components/ScrollView/ScrollContentViewNativeComponent.js index 4e3174044dfc..afd3557ecd1c 100644 --- a/Libraries/Components/ScrollView/ScrollContentViewNativeComponent.js +++ b/Libraries/Components/ScrollView/ScrollContentViewNativeComponent.js @@ -12,14 +12,12 @@ import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes'; import * as NativeComponentRegistry from '../../NativeComponent/NativeComponentRegistry'; import type {ViewProps as Props} from '../View/ViewPropTypes'; -const ScrollContentViewNativeComponent: HostComponent = NativeComponentRegistry.get( - 'RCTScrollContentView', - () => ({ +const ScrollContentViewNativeComponent: HostComponent = + NativeComponentRegistry.get('RCTScrollContentView', () => ({ uiViewClassName: 'RCTScrollContentView', bubblingEventTypes: {}, directEventTypes: {}, validAttributes: {}, - }), -); + })); export default ScrollContentViewNativeComponent; diff --git a/Libraries/Components/ScrollView/ScrollView.js b/Libraries/Components/ScrollView/ScrollView.js index b121da39eb45..87bec5b7629f 100644 --- a/Libraries/Components/ScrollView/ScrollView.js +++ b/Libraries/Components/ScrollView/ScrollView.js @@ -721,10 +721,8 @@ class ScrollView extends React.Component { _scrollAnimatedValue: AnimatedImplementation.Value; _scrollAnimatedValueAttachment: ?{detach: () => void, ...} = null; - _stickyHeaderRefs: Map< - string, - React.ElementRef, - > = new Map(); + _stickyHeaderRefs: Map> = + new Map(); _headerLayoutYs: Map = new Map(); _keyboardWillOpenTo: ?KeyboardEvent = null; @@ -845,7 +843,8 @@ class ScrollView extends React.Component { ref.scrollToEnd = this.scrollToEnd; ref.flashScrollIndicators = this.flashScrollIndicators; ref.scrollResponderZoomTo = this.scrollResponderZoomTo; - ref.scrollResponderScrollNativeHandleToKeyboard = this.scrollResponderScrollNativeHandleToKeyboard; + ref.scrollResponderScrollNativeHandleToKeyboard = + this.scrollResponderScrollNativeHandleToKeyboard; } }, }); @@ -1115,11 +1114,12 @@ class ScrollView extends React.Component { this.props.stickyHeaderIndices && this.props.stickyHeaderIndices.length > 0 ) { - this._scrollAnimatedValueAttachment = AnimatedImplementation.attachNativeEvent( - this._scrollViewRef, - 'onScroll', - [{nativeEvent: {contentOffset: {y: this._scrollAnimatedValue}}}], - ); + this._scrollAnimatedValueAttachment = + AnimatedImplementation.attachNativeEvent( + this._scrollViewRef, + 'onScroll', + [{nativeEvent: {contentOffset: {y: this._scrollAnimatedValue}}}], + ); } } @@ -1721,8 +1721,8 @@ class ScrollView extends React.Component { onScrollEndDrag: this._handleScrollEndDrag, onScrollShouldSetResponder: this._handleScrollShouldSetResponder, onStartShouldSetResponder: this._handleStartShouldSetResponder, - onStartShouldSetResponderCapture: this - ._handleStartShouldSetResponderCapture, + onStartShouldSetResponderCapture: + this._handleStartShouldSetResponderCapture, onTouchEnd: this._handleTouchEnd, onTouchMove: this._handleTouchMove, onTouchStart: this._handleTouchStart, diff --git a/Libraries/Components/ScrollView/ScrollViewNativeComponent.js b/Libraries/Components/ScrollView/ScrollViewNativeComponent.js index cdfc8ff450f3..ab6a5d3634b7 100644 --- a/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +++ b/Libraries/Components/ScrollView/ScrollViewNativeComponent.js @@ -12,9 +12,8 @@ import type {ScrollViewNativeProps as Props} from './ScrollViewNativeComponentTy import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes'; import * as NativeComponentRegistry from '../../NativeComponent/NativeComponentRegistry'; -const ScrollViewNativeComponent: HostComponent = NativeComponentRegistry.get( - 'RCTScrollView', - () => ({ +const ScrollViewNativeComponent: HostComponent = + NativeComponentRegistry.get('RCTScrollView', () => ({ uiViewClassName: 'RCTScrollView', bubblingEventTypes: {}, directEventTypes: { @@ -80,7 +79,6 @@ const ScrollViewNativeComponent: HostComponent = NativeComponentRegistry. snapToStart: true, zoomScale: true, }, - }), -); + })); export default ScrollViewNativeComponent; diff --git a/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js b/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js index 84770d7646b9..1812a01018a3 100644 --- a/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js +++ b/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js @@ -87,14 +87,8 @@ class SegmentedControlIOS extends React.Component { }; render() { - const { - enabled, - forwardedRef, - onValueChange, - style, - values, - ...props - } = this.props; + const {enabled, forwardedRef, onValueChange, style, values, ...props} = + this.props; return ( ({ supportedCommands: ['focus', 'blur', 'setTextAndSelection'], }); -const MultilineTextInputNativeComponent: HostComponent = NativeComponentRegistry.get( - 'RCTMultilineTextInputView', - () => RCTTextInputViewConfig, -); +const MultilineTextInputNativeComponent: HostComponent = + NativeComponentRegistry.get( + 'RCTMultilineTextInputView', + () => RCTTextInputViewConfig, + ); // flowlint-next-line unclear-type:off export default ((MultilineTextInputNativeComponent: any): HostComponent); diff --git a/Libraries/Components/TextInput/RCTSingelineTextInputNativeComponent.js b/Libraries/Components/TextInput/RCTSingelineTextInputNativeComponent.js index e9ac2bc9cc20..043451a1c8f3 100644 --- a/Libraries/Components/TextInput/RCTSingelineTextInputNativeComponent.js +++ b/Libraries/Components/TextInput/RCTSingelineTextInputNativeComponent.js @@ -22,10 +22,11 @@ export const Commands: NativeCommands = codegenNativeCommands({ supportedCommands: ['focus', 'blur', 'setTextAndSelection'], }); -const SinglelineTextInputNativeComponent: HostComponent = NativeComponentRegistry.get( - 'RCTSinglelineTextInputView', - () => RCTTextInputViewConfig, -); +const SinglelineTextInputNativeComponent: HostComponent = + NativeComponentRegistry.get( + 'RCTSinglelineTextInputView', + () => RCTTextInputViewConfig, + ); // flowlint-next-line unclear-type:off export default ((SinglelineTextInputNativeComponent: any): HostComponent); diff --git a/Libraries/Components/TextInput/TextInput.js b/Libraries/Components/TextInput/TextInput.js index e1c4a0ea34e0..c88abc598385 100644 --- a/Libraries/Components/TextInput/TextInput.js +++ b/Libraries/Components/TextInput/TextInput.js @@ -46,17 +46,17 @@ let RCTMultilineTextInputNativeCommands; if (Platform.OS === 'android') { AndroidTextInput = require('./AndroidTextInputNativeComponent').default; - AndroidTextInputCommands = require('./AndroidTextInputNativeComponent') - .Commands; + AndroidTextInputCommands = + require('./AndroidTextInputNativeComponent').Commands; } else if (Platform.OS === 'ios') { - RCTSinglelineTextInputView = require('./RCTSingelineTextInputNativeComponent') - .default; - RCTSinglelineTextInputNativeCommands = require('./RCTSingelineTextInputNativeComponent') - .Commands; - RCTMultilineTextInputView = require('./RCTMultilineTextInputNativeComponent') - .default; - RCTMultilineTextInputNativeCommands = require('./RCTMultilineTextInputNativeComponent') - .Commands; + RCTSinglelineTextInputView = + require('./RCTSingelineTextInputNativeComponent').default; + RCTSinglelineTextInputNativeCommands = + require('./RCTSingelineTextInputNativeComponent').Commands; + RCTMultilineTextInputView = + require('./RCTMultilineTextInputNativeComponent').default; + RCTMultilineTextInputNativeCommands = + require('./RCTMultilineTextInputNativeComponent').Commands; } export type ChangeEvent = SyntheticEvent< @@ -1245,7 +1245,8 @@ const ExportedForwardRef: React.AbstractComponent< * Switch to `deprecated-react-native-prop-types` for compatibility with future * releases. This is deprecated and will be removed in the future. */ -ExportedForwardRef.propTypes = require('deprecated-react-native-prop-types').TextInputPropTypes; +ExportedForwardRef.propTypes = + require('deprecated-react-native-prop-types').TextInputPropTypes; // $FlowFixMe[prop-missing] ExportedForwardRef.State = { diff --git a/Libraries/Components/ToastAndroid/ToastAndroid.android.js b/Libraries/Components/ToastAndroid/ToastAndroid.android.js index b15100a1769e..b29ec4ede71d 100644 --- a/Libraries/Components/ToastAndroid/ToastAndroid.android.js +++ b/Libraries/Components/ToastAndroid/ToastAndroid.android.js @@ -42,11 +42,11 @@ const ToastAndroid = { BOTTOM: (ToastAndroidConstants.BOTTOM: number), CENTER: (ToastAndroidConstants.CENTER: number), - show: function(message: string, duration: number): void { + show: function (message: string, duration: number): void { NativeToastAndroid.show(message, duration); }, - showWithGravity: function( + showWithGravity: function ( message: string, duration: number, gravity: number, @@ -54,7 +54,7 @@ const ToastAndroid = { NativeToastAndroid.showWithGravity(message, duration, gravity); }, - showWithGravityAndOffset: function( + showWithGravityAndOffset: function ( message: string, duration: number, gravity: number, diff --git a/Libraries/Components/ToastAndroid/ToastAndroid.ios.js b/Libraries/Components/ToastAndroid/ToastAndroid.ios.js index 611e50fe87b5..01fa7998ae6b 100644 --- a/Libraries/Components/ToastAndroid/ToastAndroid.ios.js +++ b/Libraries/Components/ToastAndroid/ToastAndroid.ios.js @@ -11,11 +11,11 @@ 'use strict'; const ToastAndroid = { - show: function(message: string, duration: number): void { + show: function (message: string, duration: number): void { console.warn('ToastAndroid is not supported on this platform.'); }, - showWithGravity: function( + showWithGravity: function ( message: string, duration: number, gravity: number, @@ -23,7 +23,7 @@ const ToastAndroid = { console.warn('ToastAndroid is not supported on this platform.'); }, - showWithGravityAndOffset: function( + showWithGravityAndOffset: function ( message: string, duration: number, gravity: number, diff --git a/Libraries/Components/Touchable/BoundingDimensions.js b/Libraries/Components/Touchable/BoundingDimensions.js index 114b950733df..5aa45dba22b3 100644 --- a/Libraries/Components/Touchable/BoundingDimensions.js +++ b/Libraries/Components/Touchable/BoundingDimensions.js @@ -24,7 +24,7 @@ function BoundingDimensions(width, height) { this.height = height; } -BoundingDimensions.prototype.destructor = function() { +BoundingDimensions.prototype.destructor = function () { this.width = null; this.height = null; }; @@ -33,7 +33,7 @@ BoundingDimensions.prototype.destructor = function() { * @param {HTMLElement} element Element to return `BoundingDimensions` for. * @return {BoundingDimensions} Bounding dimensions of `element`. */ -BoundingDimensions.getPooledFromElement = function(element) { +BoundingDimensions.getPooledFromElement = function (element) { return BoundingDimensions.getPooled( element.offsetWidth, element.offsetHeight, diff --git a/Libraries/Components/Touchable/PooledClass.js b/Libraries/Components/Touchable/PooledClass.js index 1c9e940bd53d..73e104e75eec 100644 --- a/Libraries/Components/Touchable/PooledClass.js +++ b/Libraries/Components/Touchable/PooledClass.js @@ -18,7 +18,7 @@ import invariant from 'invariant'; * the Class itself, not an instance. If any others are needed, simply add them * here, or in their own files. */ -const oneArgumentPooler = function(copyFieldsFrom) { +const oneArgumentPooler = function (copyFieldsFrom) { const Klass = this; if (Klass.instancePool.length) { const instance = Klass.instancePool.pop(); @@ -29,7 +29,7 @@ const oneArgumentPooler = function(copyFieldsFrom) { } }; -const twoArgumentPooler = function(a1, a2) { +const twoArgumentPooler = function (a1, a2) { const Klass = this; if (Klass.instancePool.length) { const instance = Klass.instancePool.pop(); @@ -40,7 +40,7 @@ const twoArgumentPooler = function(a1, a2) { } }; -const threeArgumentPooler = function(a1, a2, a3) { +const threeArgumentPooler = function (a1, a2, a3) { const Klass = this; if (Klass.instancePool.length) { const instance = Klass.instancePool.pop(); @@ -51,7 +51,7 @@ const threeArgumentPooler = function(a1, a2, a3) { } }; -const fourArgumentPooler = function(a1, a2, a3, a4) { +const fourArgumentPooler = function (a1, a2, a3, a4) { const Klass = this; if (Klass.instancePool.length) { const instance = Klass.instancePool.pop(); @@ -62,7 +62,7 @@ const fourArgumentPooler = function(a1, a2, a3, a4) { } }; -const standardReleaser = function(instance) { +const standardReleaser = function (instance) { const Klass = this; invariant( instance instanceof Klass, @@ -88,7 +88,7 @@ type Pooler = any; * @param {Function} CopyConstructor Constructor that can be used to reset. * @param {Function} pooler Customizable pooler. */ -const addPoolingTo = function( +const addPoolingTo = function ( CopyConstructor: Class, pooler: Pooler, ): Class & { diff --git a/Libraries/Components/Touchable/Position.js b/Libraries/Components/Touchable/Position.js index 5656bf9aaab9..dd06e5288d1e 100644 --- a/Libraries/Components/Touchable/Position.js +++ b/Libraries/Components/Touchable/Position.js @@ -25,7 +25,7 @@ function Position(left, top) { this.top = top; } -Position.prototype.destructor = function() { +Position.prototype.destructor = function () { this.left = null; this.top = null; }; diff --git a/Libraries/Components/Touchable/Touchable.js b/Libraries/Components/Touchable/Touchable.js index f59ba3ad4954..972bc11ed91c 100644 --- a/Libraries/Components/Touchable/Touchable.js +++ b/Libraries/Components/Touchable/Touchable.js @@ -361,7 +361,7 @@ const LONG_PRESS_ALLOWED_MOVEMENT = 10; * @lends Touchable.prototype */ const TouchableMixin = { - componentDidMount: function() { + componentDidMount: function () { if (!Platform.isTV) { return; } @@ -370,7 +370,7 @@ const TouchableMixin = { /** * Clear all timeouts on unmount */ - componentWillUnmount: function() { + componentWillUnmount: function () { this.touchableDelayTimeout && clearTimeout(this.touchableDelayTimeout); this.longPressDelayTimeout && clearTimeout(this.longPressDelayTimeout); this.pressOutDelayTimeout && clearTimeout(this.pressOutDelayTimeout); @@ -383,7 +383,7 @@ const TouchableMixin = { * @return {object} State object to be placed inside of * `this.state.touchable`. */ - touchableGetInitialState: function(): $TEMPORARY$object<{| + touchableGetInitialState: function (): $TEMPORARY$object<{| touchable: $TEMPORARY$object<{|responderID: null, touchState: void|}>, |}> { return { @@ -395,21 +395,21 @@ const TouchableMixin = { /** * Must return true if embedded in a native platform scroll view. */ - touchableHandleResponderTerminationRequest: function(): any { + touchableHandleResponderTerminationRequest: function (): any { return !this.props.rejectResponderTermination; }, /** * Must return true to start the process of `Touchable`. */ - touchableHandleStartShouldSetResponder: function(): any { + touchableHandleStartShouldSetResponder: function (): any { return !this.props.disabled; }, /** * Return true to cancel press on long press. */ - touchableLongPressCancelsPress: function(): boolean { + touchableLongPressCancelsPress: function (): boolean { return true; }, @@ -418,7 +418,7 @@ const TouchableMixin = { * @param {SyntheticEvent} e Synthetic event from event system. * */ - touchableHandleResponderGrant: function(e: PressEvent) { + touchableHandleResponderGrant: function (e: PressEvent) { const dispatchID = e.currentTarget; // Since e is used in a callback invoked on another event loop // (as in setTimeout etc), we need to call e.persist() on the @@ -459,7 +459,7 @@ const TouchableMixin = { /** * Place as callback for a DOM element's `onResponderRelease` event. */ - touchableHandleResponderRelease: function(e: PressEvent) { + touchableHandleResponderRelease: function (e: PressEvent) { this.pressInLocation = null; this._receiveSignal(Signals.RESPONDER_RELEASE, e); }, @@ -467,7 +467,7 @@ const TouchableMixin = { /** * Place as callback for a DOM element's `onResponderTerminate` event. */ - touchableHandleResponderTerminate: function(e: PressEvent) { + touchableHandleResponderTerminate: function (e: PressEvent) { this.pressInLocation = null; this._receiveSignal(Signals.RESPONDER_TERMINATED, e); }, @@ -475,7 +475,7 @@ const TouchableMixin = { /** * Place as callback for a DOM element's `onResponderMove` event. */ - touchableHandleResponderMove: function(e: PressEvent) { + touchableHandleResponderMove: function (e: PressEvent) { // Measurement may not have returned yet. if (!this.state.touchable.positionOnActivate) { return; @@ -560,7 +560,7 @@ const TouchableMixin = { * element that was blurred just prior to this. This can be overridden when * using `Touchable.Mixin.withoutDefaultFocusAndBlur`. */ - touchableHandleFocus: function(e: Event) { + touchableHandleFocus: function (e: Event) { this.props.onFocus && this.props.onFocus(e); }, @@ -572,7 +572,7 @@ const TouchableMixin = { * This can be overridden when using * `Touchable.Mixin.withoutDefaultFocusAndBlur`. */ - touchableHandleBlur: function(e: Event) { + touchableHandleBlur: function (e: Event) { this.props.onBlur && this.props.onBlur(e); }, @@ -652,7 +652,7 @@ const TouchableMixin = { * @sideeffects * @private */ - _remeasureMetricsOnActivation: function() { + _remeasureMetricsOnActivation: function () { const responderID = this.state.touchable.responderID; if (responderID == null) { return; @@ -665,7 +665,7 @@ const TouchableMixin = { } }, - _handleQueryLayout: function( + _handleQueryLayout: function ( l: number, t: number, w: number, @@ -691,12 +691,12 @@ const TouchableMixin = { ); }, - _handleDelay: function(e: PressEvent) { + _handleDelay: function (e: PressEvent) { this.touchableDelayTimeout = null; this._receiveSignal(Signals.DELAY, e); }, - _handleLongDelay: function(e: PressEvent) { + _handleLongDelay: function (e: PressEvent) { this.longPressDelayTimeout = null; const curState = this.state.touchable.touchState; if ( @@ -715,7 +715,7 @@ const TouchableMixin = { * @throws Error if invalid state transition or unrecognized signal. * @sideeffects */ - _receiveSignal: function(signal: Signal, e: PressEvent) { + _receiveSignal: function (signal: Signal, e: PressEvent) { const responderID = this.state.touchable.responderID; const curState = this.state.touchable.touchState; const nextState = Transitions[curState] && Transitions[curState][signal]; @@ -754,19 +754,19 @@ const TouchableMixin = { } }, - _cancelLongPressDelayTimeout: function() { + _cancelLongPressDelayTimeout: function () { this.longPressDelayTimeout && clearTimeout(this.longPressDelayTimeout); this.longPressDelayTimeout = null; }, - _isHighlight: function(state: State): boolean { + _isHighlight: function (state: State): boolean { return ( state === States.RESPONDER_ACTIVE_PRESS_IN || state === States.RESPONDER_ACTIVE_LONG_PRESS_IN ); }, - _savePressInLocation: function(e: PressEvent) { + _savePressInLocation: function (e: PressEvent) { const touch = extractSingleTouch(e.nativeEvent); const pageX = touch && touch.pageX; const pageY = touch && touch.pageY; @@ -775,7 +775,7 @@ const TouchableMixin = { this.pressInLocation = {pageX, pageY, locationX, locationY}; }, - _getDistanceBetweenPoints: function( + _getDistanceBetweenPoints: function ( aX: number, aY: number, bX: number, @@ -797,7 +797,7 @@ const TouchableMixin = { * @param {Event} e Native event. * @sideeffects */ - _performSideEffectsForTransition: function( + _performSideEffectsForTransition: function ( curState: State, nextState: State, signal: Signal, @@ -858,12 +858,12 @@ const TouchableMixin = { this.touchableDelayTimeout = null; }, - _startHighlight: function(e: PressEvent) { + _startHighlight: function (e: PressEvent) { this._savePressInLocation(e); this.touchableHandleActivePressIn && this.touchableHandleActivePressIn(e); }, - _endHighlight: function(e: PressEvent) { + _endHighlight: function (e: PressEvent) { if (this.touchableHandleActivePressOut) { if ( this.touchableGetPressOutDelayMS && @@ -892,7 +892,8 @@ const { touchableHandleBlur, ...TouchableMixinWithoutDefaultFocusAndBlur } = TouchableMixin; -TouchableMixin.withoutDefaultFocusAndBlur = TouchableMixinWithoutDefaultFocusAndBlur; +TouchableMixin.withoutDefaultFocusAndBlur = + TouchableMixinWithoutDefaultFocusAndBlur; const Touchable = { Mixin: TouchableMixin, diff --git a/Libraries/Components/Touchable/TouchableBounce.js b/Libraries/Components/Touchable/TouchableBounce.js index 4bf9c201fc5a..0a61b9a01fb9 100644 --- a/Libraries/Components/Touchable/TouchableBounce.js +++ b/Libraries/Components/Touchable/TouchableBounce.js @@ -128,11 +128,8 @@ class TouchableBounce extends React.Component { render(): React.Node { // BACKWARD-COMPATIBILITY: Focus and blur events were never supported before // adopting `Pressability`, so preserve that behavior. - const { - onBlur, - onFocus, - ...eventHandlersWithoutBlurAndFocus - } = this.state.pressability.getEventHandlers(); + const {onBlur, onFocus, ...eventHandlersWithoutBlurAndFocus} = + this.state.pressability.getEventHandlers(); return ( { // BACKWARD-COMPATIBILITY: Focus and blur events were never supported before // adopting `Pressability`, so preserve that behavior. - const { - onBlur, - onFocus, - ...eventHandlersWithoutBlurAndFocus - } = this.state.pressability.getEventHandlers(); + const {onBlur, onFocus, ...eventHandlersWithoutBlurAndFocus} = + this.state.pressability.getEventHandlers(); const accessibilityState = this.props.disabled != null diff --git a/Libraries/Components/Touchable/TouchableNativeFeedback.js b/Libraries/Components/Touchable/TouchableNativeFeedback.js index 6132f0a6c259..78a6abb90b48 100644 --- a/Libraries/Components/Touchable/TouchableNativeFeedback.js +++ b/Libraries/Components/Touchable/TouchableNativeFeedback.js @@ -99,9 +99,7 @@ class TouchableNativeFeedback extends React.Component { * Creates a value for the `background` prop that uses the Android theme's * default background for selectable elements. */ - static SelectableBackground: ( - rippleRadius: ?number, - ) => $ReadOnly<{| + static SelectableBackground: (rippleRadius: ?number) => $ReadOnly<{| attribute: 'selectableItemBackground', type: 'ThemeAttrAndroid', rippleRadius: ?number, @@ -115,9 +113,7 @@ class TouchableNativeFeedback extends React.Component { * Creates a value for the `background` prop that uses the Android theme's * default background for borderless selectable elements. Requires API 21+. */ - static SelectableBackgroundBorderless: ( - rippleRadius: ?number, - ) => $ReadOnly<{| + static SelectableBackgroundBorderless: (rippleRadius: ?number) => $ReadOnly<{| attribute: 'selectableItemBackgroundBorderless', type: 'ThemeAttrAndroid', rippleRadius: ?number, @@ -252,11 +248,8 @@ class TouchableNativeFeedback extends React.Component { // BACKWARD-COMPATIBILITY: Focus and blur events were never supported before // adopting `Pressability`, so preserve that behavior. - const { - onBlur, - onFocus, - ...eventHandlersWithoutBlurAndFocus - } = this.state.pressability.getEventHandlers(); + const {onBlur, onFocus, ...eventHandlersWithoutBlurAndFocus} = + this.state.pressability.getEventHandlers(); const accessibilityState = this.props.disabled != null diff --git a/Libraries/Components/Touchable/TouchableOpacity.js b/Libraries/Components/Touchable/TouchableOpacity.js index 01b59674ad38..4ce0692c3582 100644 --- a/Libraries/Components/Touchable/TouchableOpacity.js +++ b/Libraries/Components/Touchable/TouchableOpacity.js @@ -210,11 +210,8 @@ class TouchableOpacity extends React.Component { render(): React.Node { // BACKWARD-COMPATIBILITY: Focus and blur events were never supported before // adopting `Pressability`, so preserve that behavior. - const { - onBlur, - onFocus, - ...eventHandlersWithoutBlurAndFocus - } = this.state.pressability.getEventHandlers(); + const {onBlur, onFocus, ...eventHandlersWithoutBlurAndFocus} = + this.state.pressability.getEventHandlers(); const accessibilityState = this.props.disabled != null diff --git a/Libraries/Components/Touchable/TouchableWithoutFeedback.js b/Libraries/Components/Touchable/TouchableWithoutFeedback.js index 0b2c305b232d..db4aaa4d599f 100755 --- a/Libraries/Components/Touchable/TouchableWithoutFeedback.js +++ b/Libraries/Components/Touchable/TouchableWithoutFeedback.js @@ -106,11 +106,8 @@ class TouchableWithoutFeedback extends React.Component { // BACKWARD-COMPATIBILITY: Focus and blur events were never supported before // adopting `Pressability`, so preserve that behavior. - const { - onBlur, - onFocus, - ...eventHandlersWithoutBlurAndFocus - } = this.state.pressability.getEventHandlers(); + const {onBlur, onFocus, ...eventHandlersWithoutBlurAndFocus} = + this.state.pressability.getEventHandlers(); const elementProps: {[string]: mixed, ...} = { ...eventHandlersWithoutBlurAndFocus, diff --git a/Libraries/Components/View/ViewNativeComponent.js b/Libraries/Components/View/ViewNativeComponent.js index 4ca5ec9cf3c4..a38c2a0a3b6e 100644 --- a/Libraries/Components/View/ViewNativeComponent.js +++ b/Libraries/Components/View/ViewNativeComponent.js @@ -16,13 +16,12 @@ import ReactNativeViewViewConfigAndroid from './ReactNativeViewViewConfigAndroid import {type ViewProps as Props} from './ViewPropTypes'; import * as React from 'react'; -const ViewNativeComponent: HostComponent = NativeComponentRegistry.get( - 'RCTView', - () => +const ViewNativeComponent: HostComponent = + NativeComponentRegistry.get('RCTView', () => Platform.OS === 'android' ? ReactNativeViewViewConfigAndroid : {uiViewClassName: 'RCTView'}, -); + ); interface NativeCommands { +hotspotUpdate: ( diff --git a/Libraries/Core/Devtools/__tests__/parseErrorStack-test.js b/Libraries/Core/Devtools/__tests__/parseErrorStack-test.js index a92172c98761..ce7117bd268c 100644 --- a/Libraries/Core/Devtools/__tests__/parseErrorStack-test.js +++ b/Libraries/Core/Devtools/__tests__/parseErrorStack-test.js @@ -16,8 +16,8 @@ function getFakeError() { return new Error('Happy Cat'); } -describe('parseErrorStack', function() { - it('parses error stack', function() { +describe('parseErrorStack', function () { + it('parses error stack', function () { const stack = parseErrorStack(getFakeError().stack); expect(stack.length).toBeGreaterThan(0); @@ -26,7 +26,7 @@ describe('parseErrorStack', function() { expect(firstFrame.file).toMatch(/parseErrorStack-test\.js$/); }); - it('does not support framesToPop', function() { + it('does not support framesToPop', function () { function getWrappedError() { const error = getFakeError(); error.framesToPop = 1; @@ -37,7 +37,7 @@ describe('parseErrorStack', function() { expect(stack[0].methodName).toEqual('getFakeError'); }); - it('ignores bad inputs', function() { + it('ignores bad inputs', function () { expect(parseErrorStack(undefined)).toEqual([]); expect(parseErrorStack(null)).toEqual([]); }); diff --git a/Libraries/Core/Devtools/parseHermesStack.js b/Libraries/Core/Devtools/parseHermesStack.js index 70d47a0991d5..e9cdfd091cb2 100644 --- a/Libraries/Core/Devtools/parseHermesStack.js +++ b/Libraries/Core/Devtools/parseHermesStack.js @@ -58,7 +58,8 @@ export type HermesParsedStack = {| // 4. source URL (filename) // 5. line number (1 based) // 6. column number (1 based) or virtual offset (0 based) -const RE_FRAME = /^ {4}at (.+?)(?: \((native)\)?| \((address at )?(.*?):(\d+):(\d+)\))$/; +const RE_FRAME = + /^ {4}at (.+?)(?: \((native)\)?| \((address at )?(.*?):(\d+):(\d+)\))$/; // Capturing groups: // 1. count of skipped frames diff --git a/Libraries/Core/ExceptionsManager.js b/Libraries/Core/ExceptionsManager.js index 00caaf92ab9c..4c17ddb4db1a 100644 --- a/Libraries/Core/ExceptionsManager.js +++ b/Libraries/Core/ExceptionsManager.js @@ -102,8 +102,8 @@ function reportException( isComponentError: !!e.isComponentError, }); } else if (isFatal || e.type !== 'warn') { - const NativeExceptionsManager = require('./NativeExceptionsManager') - .default; + const NativeExceptionsManager = + require('./NativeExceptionsManager').default; if (NativeExceptionsManager) { NativeExceptionsManager.reportException(data); } diff --git a/Libraries/Core/NativeExceptionsManager.js b/Libraries/Core/NativeExceptionsManager.js index 3716edbd4c7e..b79e331917ea 100644 --- a/Libraries/Core/NativeExceptionsManager.js +++ b/Libraries/Core/NativeExceptionsManager.js @@ -57,9 +57,8 @@ export interface Spec extends TurboModule { const Platform = require('../Utilities/Platform'); -const NativeModule = TurboModuleRegistry.getEnforcing( - 'ExceptionsManager', -); +const NativeModule = + TurboModuleRegistry.getEnforcing('ExceptionsManager'); const ExceptionsManager = { reportFatalException( diff --git a/Libraries/Core/Timers/JSTimers.js b/Libraries/Core/Timers/JSTimers.js index 5c2f0d854e5f..9522d52077e3 100644 --- a/Libraries/Core/Timers/JSTimers.js +++ b/Libraries/Core/Timers/JSTimers.js @@ -114,7 +114,7 @@ function _callTimer(timerID: number, frameTime: number, didTimeout: ?boolean) { callback(global.performance.now()); } else if (type === 'requestIdleCallback') { callback({ - timeRemaining: function() { + timeRemaining: function () { // TODO: Optimisation: allow running for longer than one frame if // there are no pending JS calls on the bridge from native. This // would require a way to check the bridge queue synchronously. @@ -209,7 +209,11 @@ const JSTimers = { * @param {function} func Callback to be invoked after `duration` ms. * @param {number} duration Number of milliseconds. */ - setTimeout: function(func: Function, duration: number, ...args: any): number { + setTimeout: function ( + func: Function, + duration: number, + ...args: any + ): number { const id = _allocateCallback( () => func.apply(undefined, args), 'setTimeout', @@ -222,7 +226,7 @@ const JSTimers = { * @param {function} func Callback to be invoked every `duration` ms. * @param {number} duration Number of milliseconds. */ - setInterval: function( + setInterval: function ( func: Function, duration: number, ...args: any @@ -243,7 +247,7 @@ const JSTimers = { * @param {function} func Callback to be invoked before the end of the * current JavaScript execution loop. */ - queueReactNativeMicrotask: function(func: Function, ...args: any) { + queueReactNativeMicrotask: function (func: Function, ...args: any) { const id = _allocateCallback( () => func.apply(undefined, args), 'queueReactNativeMicrotask', @@ -255,7 +259,7 @@ const JSTimers = { /** * @param {function} func Callback to be invoked every frame. */ - requestAnimationFrame: function(func: Function) { + requestAnimationFrame: function (func: Function) { const id = _allocateCallback(func, 'requestAnimationFrame'); createTimer(id, 1, Date.now(), /* recurring */ false); return id; @@ -266,7 +270,7 @@ const JSTimers = { * with time remaining in frame. * @param {?object} options */ - requestIdleCallback: function(func: Function, options: ?Object) { + requestIdleCallback: function (func: Function, options: ?Object) { if (requestIdleCallbacks.length === 0) { setSendIdleEvents(true); } @@ -304,7 +308,7 @@ const JSTimers = { return id; }, - cancelIdleCallback: function(timerID: number) { + cancelIdleCallback: function (timerID: number) { _freeCallback(timerID); const index = requestIdleCallbacks.indexOf(timerID); if (index !== -1) { @@ -322,15 +326,15 @@ const JSTimers = { } }, - clearTimeout: function(timerID: number) { + clearTimeout: function (timerID: number) { _freeCallback(timerID); }, - clearInterval: function(timerID: number) { + clearInterval: function (timerID: number) { _freeCallback(timerID); }, - clearReactNativeMicrotask: function(timerID: number) { + clearReactNativeMicrotask: function (timerID: number) { _freeCallback(timerID); const index = reactNativeMicrotasks.indexOf(timerID); if (index !== -1) { @@ -338,7 +342,7 @@ const JSTimers = { } }, - cancelAnimationFrame: function(timerID: number) { + cancelAnimationFrame: function (timerID: number) { _freeCallback(timerID); }, @@ -346,7 +350,7 @@ const JSTimers = { * This is called from the native side. We are passed an array of timerIDs, * and */ - callTimers: function(timersToCall: Array) { + callTimers: function (timersToCall: Array) { invariant( timersToCall.length !== 0, 'Cannot call `callTimers` with an empty list of IDs.', @@ -378,7 +382,7 @@ const JSTimers = { } }, - callIdleCallbacks: function(frameTime: number) { + callIdleCallbacks: function (frameTime: number) { if ( FRAME_DURATION - (global.performance.now() - frameTime) < IDLE_CALLBACK_FRAME_DEADLINE diff --git a/Libraries/Core/Timers/__tests__/JSTimers-test.js b/Libraries/Core/Timers/__tests__/JSTimers-test.js index 371e8548a91b..2df2001c7e3d 100644 --- a/Libraries/Core/Timers/__tests__/JSTimers-test.js +++ b/Libraries/Core/Timers/__tests__/JSTimers-test.js @@ -26,8 +26,8 @@ jest const JSTimers = require('../JSTimers'); -describe('JSTimers', function() { - beforeEach(function() { +describe('JSTimers', function () { + beforeEach(function () { jest.spyOn(console, 'warn'); global.setTimeout = JSTimers.setTimeout; }); @@ -36,24 +36,24 @@ describe('JSTimers', function() { console.warn.mockRestore(); }); - it('should call function with setTimeout', function() { + it('should call function with setTimeout', function () { let didCall = false; - const id = JSTimers.setTimeout(function() { + const id = JSTimers.setTimeout(function () { didCall = true; }); JSTimers.callTimers([id]); expect(didCall).toBe(true); }); - it('should call nested setTimeout when cleared', function() { + it('should call nested setTimeout when cleared', function () { let id1, id2, id3; let callCount = 0; - id1 = JSTimers.setTimeout(function() { + id1 = JSTimers.setTimeout(function () { JSTimers.clearTimeout(id1); - id2 = JSTimers.setTimeout(function() { + id2 = JSTimers.setTimeout(function () { JSTimers.clearTimeout(id2); - id3 = JSTimers.setTimeout(function() { + id3 = JSTimers.setTimeout(function () { callCount += 1; }); }); @@ -65,15 +65,15 @@ describe('JSTimers', function() { expect(callCount).toBe(1); }); - it('should call nested queueReactNativeMicrotask when cleared', function() { + it('should call nested queueReactNativeMicrotask when cleared', function () { let id1, id2, id3; let callCount = 0; - id1 = JSTimers.queueReactNativeMicrotask(function() { + id1 = JSTimers.queueReactNativeMicrotask(function () { JSTimers.clearReactNativeMicrotask(id1); - id2 = JSTimers.queueReactNativeMicrotask(function() { + id2 = JSTimers.queueReactNativeMicrotask(function () { JSTimers.clearReactNativeMicrotask(id2); - id3 = JSTimers.queueReactNativeMicrotask(function() { + id3 = JSTimers.queueReactNativeMicrotask(function () { callCount += 1; }); }); @@ -85,15 +85,15 @@ describe('JSTimers', function() { expect(callCount).toBe(1); }); - it('should call nested requestAnimationFrame when cleared', function() { + it('should call nested requestAnimationFrame when cleared', function () { let id1, id2, id3; let callCount = 0; - id1 = JSTimers.requestAnimationFrame(function() { + id1 = JSTimers.requestAnimationFrame(function () { JSTimers.cancelAnimationFrame(id1); - id2 = JSTimers.requestAnimationFrame(function() { + id2 = JSTimers.requestAnimationFrame(function () { JSTimers.cancelAnimationFrame(id2); - id3 = JSTimers.requestAnimationFrame(function() { + id3 = JSTimers.requestAnimationFrame(function () { callCount += 1; }); }); @@ -105,15 +105,15 @@ describe('JSTimers', function() { expect(callCount).toBe(1); }); - it('should call nested setInterval when cleared', function() { + it('should call nested setInterval when cleared', function () { let id1, id2, id3; let callCount = 0; - id1 = JSTimers.setInterval(function() { + id1 = JSTimers.setInterval(function () { JSTimers.clearInterval(id1); - id2 = JSTimers.setInterval(function() { + id2 = JSTimers.setInterval(function () { JSTimers.clearInterval(id2); - id3 = JSTimers.setInterval(function() { + id3 = JSTimers.setInterval(function () { callCount += 1; }); }); @@ -125,21 +125,21 @@ describe('JSTimers', function() { expect(callCount).toBe(1); }); - it('should call function with setInterval', function() { + it('should call function with setInterval', function () { const callback = jest.fn(); const id = JSTimers.setInterval(callback); JSTimers.callTimers([id]); expect(callback).toBeCalledTimes(1); }); - it('should call function with queueReactNativeMicrotask', function() { + it('should call function with queueReactNativeMicrotask', function () { const callback = jest.fn(); JSTimers.queueReactNativeMicrotask(callback); JSTimers.callReactNativeMicrotasks(); expect(callback).toBeCalledTimes(1); }); - it('should not call function with clearReactNativeMicrotask', function() { + it('should not call function with clearReactNativeMicrotask', function () { const callback = jest.fn(); const id = JSTimers.queueReactNativeMicrotask(callback); JSTimers.clearReactNativeMicrotask(id); @@ -147,14 +147,14 @@ describe('JSTimers', function() { expect(callback).not.toBeCalled(); }); - it('should call functions in the right order with queueReactNativeMicrotask', function() { + it('should call functions in the right order with queueReactNativeMicrotask', function () { let count = 0; let firstCalled = null; let secondCalled = null; - JSTimers.queueReactNativeMicrotask(function() { + JSTimers.queueReactNativeMicrotask(function () { firstCalled = count++; }); - JSTimers.queueReactNativeMicrotask(function() { + JSTimers.queueReactNativeMicrotask(function () { secondCalled = count++; }); JSTimers.callReactNativeMicrotasks(); @@ -162,14 +162,14 @@ describe('JSTimers', function() { expect(secondCalled).toBe(1); }); - it('should call functions in the right order with nested queueReactNativeMicrotask', function() { + it('should call functions in the right order with nested queueReactNativeMicrotask', function () { let count = 0; let firstCalled = null; let secondCalled = null; let thirdCalled = null; - JSTimers.queueReactNativeMicrotask(function() { + JSTimers.queueReactNativeMicrotask(function () { firstCalled = count++; - JSTimers.queueReactNativeMicrotask(function() { + JSTimers.queueReactNativeMicrotask(function () { thirdCalled = count++; }); secondCalled = count++; @@ -180,12 +180,12 @@ describe('JSTimers', function() { expect(thirdCalled).toBe(2); }); - it('should call nested queueReactNativeMicrotask', function() { + it('should call nested queueReactNativeMicrotask', function () { let firstCalled = false; let secondCalled = false; - JSTimers.queueReactNativeMicrotask(function() { + JSTimers.queueReactNativeMicrotask(function () { firstCalled = true; - JSTimers.queueReactNativeMicrotask(function() { + JSTimers.queueReactNativeMicrotask(function () { secondCalled = true; }); }); @@ -194,14 +194,14 @@ describe('JSTimers', function() { expect(secondCalled).toBe(true); }); - it('should call function with requestAnimationFrame', function() { + it('should call function with requestAnimationFrame', function () { const callback = jest.fn(); const id = JSTimers.requestAnimationFrame(callback); JSTimers.callTimers([id]); expect(callback).toBeCalledTimes(1); }); - it("should not call function if we don't callTimers", function() { + it("should not call function if we don't callTimers", function () { const callback = jest.fn(); JSTimers.setTimeout(callback, 10); expect(callback).not.toBeCalled(); @@ -211,7 +211,7 @@ describe('JSTimers', function() { expect(callback).not.toBeCalled(); }); - it('should call setInterval as many times as callTimers is called', function() { + it('should call setInterval as many times as callTimers is called', function () { const callback = jest.fn(); const id = JSTimers.setInterval(callback, 10); JSTimers.callTimers([id]); @@ -221,13 +221,13 @@ describe('JSTimers', function() { expect(callback).toBeCalledTimes(4); }); - it("should only call the function who's id we pass in", function() { + it("should only call the function who's id we pass in", function () { let firstCalled = false; let secondCalled = false; - JSTimers.setTimeout(function() { + JSTimers.setTimeout(function () { firstCalled = true; }); - const secondID = JSTimers.setTimeout(function() { + const secondID = JSTimers.setTimeout(function () { secondCalled = true; }); JSTimers.callTimers([secondID]); @@ -235,13 +235,13 @@ describe('JSTimers', function() { expect(secondCalled).toBe(true); }); - it('should work with calling multiple timers', function() { + it('should work with calling multiple timers', function () { let firstCalled = false; let secondCalled = false; - const firstID = JSTimers.setTimeout(function() { + const firstID = JSTimers.setTimeout(function () { firstCalled = true; }); - const secondID = JSTimers.setTimeout(function() { + const secondID = JSTimers.setTimeout(function () { secondCalled = true; }); JSTimers.callTimers([firstID, secondID]); @@ -249,27 +249,27 @@ describe('JSTimers', function() { expect(secondCalled).toBe(true); }); - it('should still execute all callbacks even if one throws', function() { - const firstID = JSTimers.setTimeout(function() { + it('should still execute all callbacks even if one throws', function () { + const firstID = JSTimers.setTimeout(function () { throw new Error('error'); }, 10); let secondCalled = false; - const secondID = JSTimers.setTimeout(function() { + const secondID = JSTimers.setTimeout(function () { secondCalled = true; }, 10); expect(JSTimers.callTimers.bind(null, [firstID, secondID])).toThrow(); expect(secondCalled).toBe(true); }); - it('should clear timers even if callback throws', function() { - const timerID = JSTimers.setTimeout(function() { + it('should clear timers even if callback throws', function () { + const timerID = JSTimers.setTimeout(function () { throw new Error('error'); }, 10); expect(JSTimers.callTimers.bind(null, [timerID])).toThrow('error'); JSTimers.callTimers.bind(null, [timerID]); }); - it('should not warn if callback is called on cancelled timer', function() { + it('should not warn if callback is called on cancelled timer', function () { const callback = jest.fn(); const timerID = JSTimers.setTimeout(callback, 10); JSTimers.clearTimeout(timerID); @@ -278,12 +278,12 @@ describe('JSTimers', function() { expect(console.warn).not.toBeCalled(); }); - it('should warn when callTimers is called with garbage timer id', function() { + it('should warn when callTimers is called with garbage timer id', function () { JSTimers.callTimers([1337]); expect(console.warn).toBeCalled(); }); - it('should only call callback once for setTimeout', function() { + it('should only call callback once for setTimeout', function () { const callback = jest.fn(); const timerID = JSTimers.setTimeout(callback, 10); // First time the timer fires, should call callback @@ -295,7 +295,7 @@ describe('JSTimers', function() { expect(console.warn).not.toBeCalled(); }); - it('should only call callback once for requestAnimationFrame', function() { + it('should only call callback once for requestAnimationFrame', function () { const callback = jest.fn(); const timerID = JSTimers.requestAnimationFrame(callback, 10); // First time the timer fires, should call callback @@ -307,11 +307,11 @@ describe('JSTimers', function() { expect(console.warn).not.toBeCalled(); }); - it('should re-throw first exception', function() { - const timerID1 = JSTimers.setTimeout(function() { + it('should re-throw first exception', function () { + const timerID1 = JSTimers.setTimeout(function () { throw new Error('first error'); }); - const timerID2 = JSTimers.setTimeout(function() { + const timerID2 = JSTimers.setTimeout(function () { throw new Error('second error'); }); expect(JSTimers.callTimers.bind(null, [timerID1, timerID2])).toThrowError( @@ -319,8 +319,8 @@ describe('JSTimers', function() { ); }); - it('should pass along errors thrown from queueReactNativeMicrotask', function() { - JSTimers.queueReactNativeMicrotask(function() { + it('should pass along errors thrown from queueReactNativeMicrotask', function () { + JSTimers.queueReactNativeMicrotask(function () { throw new Error('error within queueReactNativeMicrotask'); }); @@ -336,12 +336,12 @@ describe('JSTimers', function() { ); }); - it('should throw all errors from queueReactNativeMicrotask', function() { - JSTimers.queueReactNativeMicrotask(function() { + it('should throw all errors from queueReactNativeMicrotask', function () { + JSTimers.queueReactNativeMicrotask(function () { throw new Error('first error'); }); - JSTimers.queueReactNativeMicrotask(function() { + JSTimers.queueReactNativeMicrotask(function () { throw new Error('second error'); }); @@ -361,8 +361,8 @@ describe('JSTimers', function() { ); }); - it('should pass along errors thrown from setTimeout', function() { - const timerID = JSTimers.setTimeout(function() { + it('should pass along errors thrown from setTimeout', function () { + const timerID = JSTimers.setTimeout(function () { throw new Error('error within setTimeout'); }); @@ -371,11 +371,11 @@ describe('JSTimers', function() { ); }); - it('should throw all errors from setTimeout', function() { - const firstTimerID = JSTimers.setTimeout(function() { + it('should throw all errors from setTimeout', function () { + const firstTimerID = JSTimers.setTimeout(function () { throw new Error('first error'); }); - const secondTimerID = JSTimers.setTimeout(function() { + const secondTimerID = JSTimers.setTimeout(function () { throw new Error('second error'); }); @@ -391,8 +391,8 @@ describe('JSTimers', function() { ); }); - it('should pass along errors thrown from setInterval', function() { - const timerID = JSTimers.setInterval(function() { + it('should pass along errors thrown from setInterval', function () { + const timerID = JSTimers.setInterval(function () { throw new Error('error within setInterval'); }); expect(JSTimers.callTimers.bind(null, [timerID])).toThrowError( @@ -400,7 +400,7 @@ describe('JSTimers', function() { ); }); - it('should not call to native when clearing a null timer', function() { + it('should not call to native when clearing a null timer', function () { const timerID = JSTimers.setTimeout(() => {}); JSTimers.clearTimeout(timerID); NativeTiming.deleteTimer = jest.fn(); diff --git a/Libraries/Core/setUpAlert.js b/Libraries/Core/setUpAlert.js index f4615ba8c2a5..7d37fef72bb3 100644 --- a/Libraries/Core/setUpAlert.js +++ b/Libraries/Core/setUpAlert.js @@ -15,7 +15,7 @@ * You can use this module directly, or just require InitializeCore. */ if (!global.alert) { - global.alert = function(text) { + global.alert = function (text) { // Require Alert on demand. Requiring it too early can lead to issues // with things like Platform not being fully initialized. require('../Alert/Alert').alert('Alert', '' + text); diff --git a/Libraries/Core/setUpDeveloperTools.js b/Libraries/Core/setUpDeveloperTools.js index 86f2732643ac..4c4a6a6cb81b 100644 --- a/Libraries/Core/setUpDeveloperTools.js +++ b/Libraries/Core/setUpDeveloperTools.js @@ -58,7 +58,7 @@ if (__DEV__) { 'debug', ].forEach(level => { const originalFunction = console[level]; - console[level] = function(...args) { + console[level] = function (...args) { HMRClient.log(level, args); originalFunction.apply(console, args); }; diff --git a/Libraries/Core/setUpPerformance.js b/Libraries/Core/setUpPerformance.js index 12cace05f812..c253b76f4308 100644 --- a/Libraries/Core/setUpPerformance.js +++ b/Libraries/Core/setUpPerformance.js @@ -19,7 +19,7 @@ if (!global.performance) { * https://developer.mozilla.org/en-US/docs/Web/API/Performance/now */ if (typeof global.performance.now !== 'function') { - global.performance.now = function() { + global.performance.now = function () { const performanceNow = global.nativePerformanceNow || Date.now; return performanceNow(); }; diff --git a/Libraries/Core/setUpRegeneratorRuntime.js b/Libraries/Core/setUpRegeneratorRuntime.js index 426e9b3b1604..5cac97ec5796 100644 --- a/Libraries/Core/setUpRegeneratorRuntime.js +++ b/Libraries/Core/setUpRegeneratorRuntime.js @@ -22,7 +22,7 @@ let hasNativeGenerator; try { // If this function was lowered by regenerator-transform, it will try to // access `global.regeneratorRuntime` which doesn't exist yet and will throw. - hasNativeGenerator = hasNativeConstructor(function*() {}, + hasNativeGenerator = hasNativeConstructor(function* () {}, 'GeneratorFunction'); } catch { // In this case, we know generators are not provided natively. diff --git a/Libraries/Core/setUpSegmentFetcher.js b/Libraries/Core/setUpSegmentFetcher.js index d48810ae22ca..49ae1c6f33b0 100644 --- a/Libraries/Core/setUpSegmentFetcher.js +++ b/Libraries/Core/setUpSegmentFetcher.js @@ -27,8 +27,8 @@ function __fetchSegment( }>, callback: (?Error) => void, ) { - const SegmentFetcher = require('./SegmentFetcher/NativeSegmentFetcher') - .default; + const SegmentFetcher = + require('./SegmentFetcher/NativeSegmentFetcher').default; SegmentFetcher.fetchSegment( segmentId, options, @@ -61,8 +61,8 @@ function __getSegment( }>, callback: (?Error, ?string) => void, ) { - const SegmentFetcher = require('./SegmentFetcher/NativeSegmentFetcher') - .default; + const SegmentFetcher = + require('./SegmentFetcher/NativeSegmentFetcher').default; if (!SegmentFetcher.getSegment) { throw new Error('SegmentFetcher.getSegment must be defined'); diff --git a/Libraries/DeprecatedPropTypes/DeprecatedColorPropType.js b/Libraries/DeprecatedPropTypes/DeprecatedColorPropType.js index caa6858a2001..7265fa60aee3 100644 --- a/Libraries/DeprecatedPropTypes/DeprecatedColorPropType.js +++ b/Libraries/DeprecatedPropTypes/DeprecatedColorPropType.js @@ -11,7 +11,7 @@ const normalizeColor = require('../StyleSheet/normalizeColor'); -const colorPropType = function( +const colorPropType = function ( isRequired, props, propName, diff --git a/Libraries/DeprecatedPropTypes/DeprecatedStyleSheetPropType.js b/Libraries/DeprecatedPropTypes/DeprecatedStyleSheetPropType.js index f692187a6789..ac336be274ac 100644 --- a/Libraries/DeprecatedPropTypes/DeprecatedStyleSheetPropType.js +++ b/Libraries/DeprecatedPropTypes/DeprecatedStyleSheetPropType.js @@ -15,10 +15,10 @@ const flattenStyle = require('../StyleSheet/flattenStyle'); function DeprecatedStyleSheetPropType(shape: { [key: string]: ReactPropsCheckType, - ..., + ... }): ReactPropsCheckType { const shapePropType = deprecatedCreateStrictShapeTypeChecker(shape); - return function(props, propName, componentName, location?, ...rest) { + return function (props, propName, componentName, location?, ...rest) { let newProps = props; if (props[propName]) { // Just make a dummy prop object with only the flattened style diff --git a/Libraries/DeprecatedPropTypes/DeprecatedTransformPropTypes.js b/Libraries/DeprecatedPropTypes/DeprecatedTransformPropTypes.js index daba0d83676c..48c918a415ff 100644 --- a/Libraries/DeprecatedPropTypes/DeprecatedTransformPropTypes.js +++ b/Libraries/DeprecatedPropTypes/DeprecatedTransformPropTypes.js @@ -14,7 +14,7 @@ const ReactPropTypes = require('prop-types'); const deprecatedPropType = require('../Utilities/deprecatedPropType'); -const TransformMatrixPropType = function( +const TransformMatrixPropType = function ( props: Object, propName: string, componentName: string, @@ -27,7 +27,7 @@ const TransformMatrixPropType = function( } }; -const DecomposedMatrixPropType = function( +const DecomposedMatrixPropType = function ( props: Object, propName: string, componentName: string, diff --git a/Libraries/DeprecatedPropTypes/deprecatedCreateStrictShapeTypeChecker.js b/Libraries/DeprecatedPropTypes/deprecatedCreateStrictShapeTypeChecker.js index b9249abab95e..240844ea5c67 100644 --- a/Libraries/DeprecatedPropTypes/deprecatedCreateStrictShapeTypeChecker.js +++ b/Libraries/DeprecatedPropTypes/deprecatedCreateStrictShapeTypeChecker.js @@ -14,7 +14,7 @@ const invariant = require('invariant'); function deprecatedCreateStrictShapeTypeChecker(shapeTypes: { [key: string]: ReactPropsCheckType, - ..., + ... }): ReactPropsChainableTypeChecker { function checkType( isRequired, diff --git a/Libraries/EventEmitter/NativeEventEmitter.js b/Libraries/EventEmitter/NativeEventEmitter.js index f999dddf3e44..dbe164fd882f 100644 --- a/Libraries/EventEmitter/NativeEventEmitter.js +++ b/Libraries/EventEmitter/NativeEventEmitter.js @@ -36,7 +36,8 @@ export type {EventSubscription}; * can theoretically listen to `RCTDeviceEventEmitter` (although discouraged). */ export default class NativeEventEmitter - implements IEventEmitter { + implements IEventEmitter +{ _nativeModule: ?NativeModule; constructor(nativeModule: ?NativeModule) { diff --git a/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js b/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js index 6863f81ef5f6..ecaed2cfa23c 100644 --- a/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js +++ b/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js @@ -18,7 +18,8 @@ import RCTDeviceEventEmitter from '../RCTDeviceEventEmitter'; * Mock `NativeEventEmitter` to ignore Native Modules. */ export default class NativeEventEmitter - implements IEventEmitter { + implements IEventEmitter +{ addListener>( eventType: TEvent, listener: (...args: $ElementType) => mixed, diff --git a/Libraries/HeapCapture/HeapCapture.js b/Libraries/HeapCapture/HeapCapture.js index 1e76fd2cb1b6..b13099ecec83 100644 --- a/Libraries/HeapCapture/HeapCapture.js +++ b/Libraries/HeapCapture/HeapCapture.js @@ -11,7 +11,7 @@ import NativeJSCHeapCapture from './NativeJSCHeapCapture'; const HeapCapture = { - captureHeap: function(path: string) { + captureHeap: function (path: string) { let error = null; try { global.nativeCaptureHeap(path); diff --git a/Libraries/Image/AssetSourceResolver.js b/Libraries/Image/AssetSourceResolver.js index ee81537631cc..af702130fbfb 100644 --- a/Libraries/Image/AssetSourceResolver.js +++ b/Libraries/Image/AssetSourceResolver.js @@ -159,10 +159,8 @@ class AssetSourceResolver { }; } - static pickScale: ( - scales: Array, - deviceScale?: number, - ) => number = pickScale; + static pickScale: (scales: Array, deviceScale?: number) => number = + pickScale; } module.exports = AssetSourceResolver; diff --git a/Libraries/Image/Image.android.js b/Libraries/Image/Image.android.js index 935064389feb..24b0f55b3782 100644 --- a/Libraries/Image/Image.android.js +++ b/Libraries/Image/Image.android.js @@ -40,12 +40,12 @@ function getSize( failure?: (error: any) => void, ): any { return NativeImageLoaderAndroid.getSize(url) - .then(function(sizes) { + .then(function (sizes) { success(sizes.width, sizes.height); }) .catch( failure || - function() { + function () { console.warn('Failed to get size for image: ' + url); }, ); @@ -64,12 +64,12 @@ function getSizeWithHeaders( failure?: (error: any) => void, ): any { return NativeImageLoaderAndroid.getSizeWithHeaders(url, headers) - .then(function(sizes) { + .then(function (sizes) { success(sizes.width, sizes.height); }) .catch( failure || - function() { + function () { console.warn('Failed to get size for image: ' + url); }, ); diff --git a/Libraries/Image/Image.ios.js b/Libraries/Image/Image.ios.js index 2601ad6253ec..953d01716d51 100644 --- a/Libraries/Image/Image.ios.js +++ b/Libraries/Image/Image.ios.js @@ -33,7 +33,7 @@ function getSize( .then(([width, height]) => success(width, height)) .catch( failure || - function() { + function () { console.warn('Failed to get size for image ' + uri); }, ); @@ -46,12 +46,12 @@ function getSizeWithHeaders( failure?: (error: any) => void, ): any { return NativeImageLoaderIOS.getSizeWithHeaders(uri, headers) - .then(function(sizes) { + .then(function (sizes) { success(sizes.width, sizes.height); }) .catch( failure || - function() { + function () { console.warn('Failed to get size for image: ' + uri); }, ); diff --git a/Libraries/Image/ImageAnalyticsTagContext.js b/Libraries/Image/ImageAnalyticsTagContext.js index 54d8b65a26b2..742a042c98d5 100644 --- a/Libraries/Image/ImageAnalyticsTagContext.js +++ b/Libraries/Image/ImageAnalyticsTagContext.js @@ -12,9 +12,8 @@ import * as React from 'react'; type ContextType = ?string; -const Context: React.Context = React.createContext( - null, -); +const Context: React.Context = + React.createContext(null); if (__DEV__) { Context.displayName = 'ImageAnalyticsTagContext'; diff --git a/Libraries/Image/ImagePickerIOS.js b/Libraries/Image/ImagePickerIOS.js index 1d7438f2b53d..60ae31ba764e 100644 --- a/Libraries/Image/ImagePickerIOS.js +++ b/Libraries/Image/ImagePickerIOS.js @@ -12,15 +12,15 @@ import NativeImagePickerIOS from './NativeImagePickerIOS'; import invariant from 'invariant'; const ImagePickerIOS = { - canRecordVideos: function(callback: (result: boolean) => void): void { + canRecordVideos: function (callback: (result: boolean) => void): void { invariant(NativeImagePickerIOS, 'ImagePickerIOS is not available'); return NativeImagePickerIOS.canRecordVideos(callback); }, - canUseCamera: function(callback: (result: boolean) => void): void { + canUseCamera: function (callback: (result: boolean) => void): void { invariant(NativeImagePickerIOS, 'ImagePickerIOS is not available'); return NativeImagePickerIOS.canUseCamera(callback); }, - openCameraDialog: function( + openCameraDialog: function ( config: $ReadOnly<{| unmirrorFrontFacingCamera?: boolean, videoMode?: boolean, @@ -49,7 +49,7 @@ const ImagePickerIOS = { cancelCallback, ); }, - openSelectDialog: function( + openSelectDialog: function ( config: $ReadOnly<{| showImages?: boolean, showVideos?: boolean, @@ -86,7 +86,7 @@ const ImagePickerIOS = { * It is safe to call this method for urlsthat aren't video URLs; * it will be a no-op. */ - removePendingVideo: function(url: string): void { + removePendingVideo: function (url: string): void { invariant(NativeImagePickerIOS, 'ImagePickerIOS is not available'); NativeImagePickerIOS.removePendingVideo(url); }, @@ -94,7 +94,7 @@ const ImagePickerIOS = { * WARNING: In most cases, removePendingVideo should be used instead because * clearAllPendingVideos could clear out pending videos made by other callers. */ - clearAllPendingVideos: function(): void { + clearAllPendingVideos: function (): void { invariant(NativeImagePickerIOS, 'ImagePickerIOS is not available'); NativeImagePickerIOS.clearAllPendingVideos(); }, diff --git a/Libraries/Image/ImageViewNativeComponent.js b/Libraries/Image/ImageViewNativeComponent.js index 7f26d89dcff4..652f59d9b6d2 100644 --- a/Libraries/Image/ImageViewNativeComponent.js +++ b/Libraries/Image/ImageViewNativeComponent.js @@ -36,9 +36,8 @@ type Props = $ReadOnly<{ loadingIndicatorSrc?: ?string, }>; -const ImageViewNativeComponent: HostComponent = NativeComponentRegistry.get( - 'RCTImageView', - () => ({ +const ImageViewNativeComponent: HostComponent = + NativeComponentRegistry.get('RCTImageView', () => ({ uiViewClassName: 'RCTImageView', bubblingEventTypes: {}, directEventTypes: { @@ -93,7 +92,6 @@ const ImageViewNativeComponent: HostComponent = NativeComponentRegistry.g process: require('../StyleSheet/processColor'), }, }, - }), -); + })); export default ImageViewNativeComponent; diff --git a/Libraries/Image/NativeImageLoaderAndroid.js b/Libraries/Image/NativeImageLoaderAndroid.js index c55fe6eb9d6c..f75ddbfde694 100644 --- a/Libraries/Image/NativeImageLoaderAndroid.js +++ b/Libraries/Image/NativeImageLoaderAndroid.js @@ -14,9 +14,7 @@ import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; export interface Spec extends TurboModule { +abortRequest: (requestId: number) => void; +getConstants: () => {||}; - +getSize: ( - uri: string, - ) => Promise< + +getSize: (uri: string) => Promise< $ReadOnly<{ width: number, height: number, diff --git a/Libraries/Image/TextInlineImageNativeComponent.js b/Libraries/Image/TextInlineImageNativeComponent.js index c17de2581f0c..6e6cddbc822d 100644 --- a/Libraries/Image/TextInlineImageNativeComponent.js +++ b/Libraries/Image/TextInlineImageNativeComponent.js @@ -39,9 +39,8 @@ type Props = $ReadOnly<{ internal_analyticTag?: ?string, }>; -const TextInlineImage: HostComponent = NativeComponentRegistry.get( - 'RCTTextInlineImage', - () => ({ +const TextInlineImage: HostComponent = + NativeComponentRegistry.get('RCTTextInlineImage', () => ({ uiViewClassName: 'RCTImageView', bubblingEventTypes: {}, directEventTypes: { @@ -96,7 +95,6 @@ const TextInlineImage: HostComponent = NativeComponentRegistry.get process: require('../StyleSheet/processColor'), }, }, - }), -); + })); module.exports = TextInlineImage; diff --git a/Libraries/Image/__tests__/resolveAssetSource-test.js b/Libraries/Image/__tests__/resolveAssetSource-test.js index c9fa18374bbf..2fc46ed6f59f 100644 --- a/Libraries/Image/__tests__/resolveAssetSource-test.js +++ b/Libraries/Image/__tests__/resolveAssetSource-test.js @@ -21,8 +21,8 @@ describe('resolveAssetSource', () => { AssetRegistry = require('@react-native/assets/registry'); resolveAssetSource = require('../resolveAssetSource'); - NativeSourceCode = require('../../NativeModules/specs/NativeSourceCode') - .default; + NativeSourceCode = + require('../../NativeModules/specs/NativeSourceCode').default; Platform = require('../../Utilities/Platform'); }); @@ -81,8 +81,7 @@ describe('resolveAssetSource', () => { __packager_asset: true, width: 100, height: 200, - uri: - 'http://10.0.0.1:8081/assets/module/a/logo.png?platform=ios&hash=5b6f00f', + uri: 'http://10.0.0.1:8081/assets/module/a/logo.png?platform=ios&hash=5b6f00f', scale: 1, }, ); @@ -105,8 +104,7 @@ describe('resolveAssetSource', () => { __packager_asset: true, width: 100, height: 200, - uri: - 'http://10.0.0.1:8081/assets/module/a/logo@2x.png?platform=ios&hash=5b6f00f', + uri: 'http://10.0.0.1:8081/assets/module/a/logo@2x.png?platform=ios&hash=5b6f00f', scale: 2, }, ); @@ -248,8 +246,7 @@ describe('resolveAssetSource', () => { __packager_asset: true, width: 100, height: 200, - uri: - 'file:///sdcard/Path/To/Simulator/drawable-mdpi/awesomemodule_subdir_logo1_.png', + uri: 'file:///sdcard/Path/To/Simulator/drawable-mdpi/awesomemodule_subdir_logo1_.png', scale: 1, }, ); @@ -281,8 +278,7 @@ describe('resolveAssetSource', () => { __packager_asset: true, width: 100, height: 200, - uri: - 'file:///sdcard/Path/To/Simulator/drawable-mdpi/awesomemodule_subdir_logo1_.png', + uri: 'file:///sdcard/Path/To/Simulator/drawable-mdpi/awesomemodule_subdir_logo1_.png', scale: 1, }, ); diff --git a/Libraries/Inspector/NetworkOverlay.js b/Libraries/Inspector/NetworkOverlay.js index 45e6bdadcbf0..1de327a827f8 100644 --- a/Libraries/Inspector/NetworkOverlay.js +++ b/Libraries/Inspector/NetworkOverlay.js @@ -397,11 +397,8 @@ class NetworkOverlay extends React.Component { _indicateAdditionalRequests = (): void => { if (this._requestsListView) { const distanceFromEndThreshold = LISTVIEW_CELL_HEIGHT * 2; - const { - offset, - visibleLength, - contentLength, - } = this._requestsListViewScrollMetrics; + const {offset, visibleLength, contentLength} = + this._requestsListViewScrollMetrics; const distanceFromEnd = contentLength - visibleLength - offset; const isCloseToEnd = distanceFromEnd <= distanceFromEndThreshold; if (isCloseToEnd) { diff --git a/Libraries/Interaction/BridgeSpyStallHandler.js b/Libraries/Interaction/BridgeSpyStallHandler.js index e90777d41528..340d046cacc4 100644 --- a/Libraries/Interaction/BridgeSpyStallHandler.js +++ b/Libraries/Interaction/BridgeSpyStallHandler.js @@ -16,7 +16,7 @@ const MessageQueue = require('../BatchedBridge/MessageQueue'); const infoLog = require('../Utilities/infoLog'); const BridgeSpyStallHandler = { - register: function() { + register: function () { let spyBuffer = []; MessageQueue.spy(data => { spyBuffer.push(data); diff --git a/Libraries/Interaction/FrameRateLogger.js b/Libraries/Interaction/FrameRateLogger.js index cad15c2cac71..3c3bf48c91f1 100644 --- a/Libraries/Interaction/FrameRateLogger.js +++ b/Libraries/Interaction/FrameRateLogger.js @@ -33,7 +33,7 @@ const FrameRateLogger = { * Enable `debug` to see local logs of what's going on. `reportStackTraces` will grab stack traces * during UI thread stalls and upload them if the native module supports it. */ - setGlobalOptions: function(options: { + setGlobalOptions: function (options: { debug?: boolean, reportStackTraces?: boolean, ... @@ -58,7 +58,7 @@ const FrameRateLogger = { * Must call `setContext` before any events can be properly tracked, which is done automatically * in `AppRegistry`, but navigation is also a common place to hook in. */ - setContext: function(context: string) { + setContext: function (context: string) { NativeFrameRateLogger && NativeFrameRateLogger.setContext(context); }, diff --git a/Libraries/Interaction/InteractionManager.js b/Libraries/Interaction/InteractionManager.js index b5a84145d502..5823196aba49 100644 --- a/Libraries/Interaction/InteractionManager.js +++ b/Libraries/Interaction/InteractionManager.js @@ -86,9 +86,7 @@ const InteractionManager = { * Schedule a function to run after all interactions have completed. Returns a cancellable * "promise". */ - runAfterInteractions( - task: ?Task, - ): { + runAfterInteractions(task: ?Task): { then: ( onFulfill?: ?(void) => ?(Promise | U), onReject?: ?(error: mixed) => ?(Promise | U), @@ -122,7 +120,7 @@ const InteractionManager = { ); } }, - cancel: function() { + cancel: function () { _taskQueue.cancelTasks(tasks); }, }; diff --git a/Libraries/Interaction/JSEventLoopWatchdog.js b/Libraries/Interaction/JSEventLoopWatchdog.js index 9d9f6cc05b07..bcba47164fee 100644 --- a/Libraries/Interaction/JSEventLoopWatchdog.js +++ b/Libraries/Interaction/JSEventLoopWatchdog.js @@ -35,20 +35,20 @@ type Handler = { * queried with `getStats`. */ const JSEventLoopWatchdog = { - getStats: function(): Object { + getStats: function (): Object { return {stallCount, totalStallTime, longestStall, acceptableBusyTime}; }, - reset: function() { + reset: function () { infoLog('JSEventLoopWatchdog: reset'); totalStallTime = 0; stallCount = 0; longestStall = 0; lastInterval = global.performance.now(); }, - addHandler: function(handler: Handler) { + addHandler: function (handler: Handler) { handlers.push(handler); }, - install: function({thresholdMS}: {thresholdMS: number, ...}) { + install: function ({thresholdMS}: {thresholdMS: number, ...}) { acceptableBusyTime = thresholdMS; if (installed) { return; diff --git a/Libraries/Interaction/PanResponder.js b/Libraries/Interaction/PanResponder.js index a41d34e01856..ee13970532d0 100644 --- a/Libraries/Interaction/PanResponder.js +++ b/Libraries/Interaction/PanResponder.js @@ -383,9 +383,7 @@ const PanResponder = { * accordingly. (numberActiveTouches) may not be totally accurate unless you * are the responder. */ - create( - config: PanResponderConfig, - ): $TEMPORARY$object<{| + create(config: PanResponderConfig): $TEMPORARY$object<{| getInteractionHandle: () => ?number, panHandlers: $TEMPORARY$object<{| onMoveShouldSetResponder: (event: PressEvent) => boolean, @@ -462,7 +460,8 @@ const PanResponder = { onResponderGrant(event: PressEvent): boolean { if (!interactionState.handle) { - interactionState.handle = InteractionManager.createInteractionHandle(); + interactionState.handle = + InteractionManager.createInteractionHandle(); } gestureState.x0 = currentCentroidX(event.touchHistory); gestureState.y0 = currentCentroidY(event.touchHistory); diff --git a/Libraries/Interaction/TouchHistoryMath.js b/Libraries/Interaction/TouchHistoryMath.js index 19cf76a9f1b8..2cf7704b3f20 100644 --- a/Libraries/Interaction/TouchHistoryMath.js +++ b/Libraries/Interaction/TouchHistoryMath.js @@ -24,7 +24,7 @@ const TouchHistoryMath = { * touches vs. previous centroid of now actively moving touches. * @return {number} value of centroid in specified dimension. */ - centroidDimension: function( + centroidDimension: function ( touchHistory, touchesChangedAfter, isXAxis, @@ -81,7 +81,7 @@ const TouchHistoryMath = { return count > 0 ? total / count : TouchHistoryMath.noCentroid; }, - currentCentroidXOfTouchesChangedAfter: function( + currentCentroidXOfTouchesChangedAfter: function ( touchHistory, touchesChangedAfter, ) { @@ -93,7 +93,7 @@ const TouchHistoryMath = { ); }, - currentCentroidYOfTouchesChangedAfter: function( + currentCentroidYOfTouchesChangedAfter: function ( touchHistory, touchesChangedAfter, ) { @@ -105,7 +105,7 @@ const TouchHistoryMath = { ); }, - previousCentroidXOfTouchesChangedAfter: function( + previousCentroidXOfTouchesChangedAfter: function ( touchHistory, touchesChangedAfter, ) { @@ -117,7 +117,7 @@ const TouchHistoryMath = { ); }, - previousCentroidYOfTouchesChangedAfter: function( + previousCentroidYOfTouchesChangedAfter: function ( touchHistory, touchesChangedAfter, ) { @@ -129,7 +129,7 @@ const TouchHistoryMath = { ); }, - currentCentroidX: function(touchHistory) { + currentCentroidX: function (touchHistory) { return TouchHistoryMath.centroidDimension( touchHistory, 0, // touchesChangedAfter @@ -138,7 +138,7 @@ const TouchHistoryMath = { ); }, - currentCentroidY: function(touchHistory) { + currentCentroidY: function (touchHistory) { return TouchHistoryMath.centroidDimension( touchHistory, 0, // touchesChangedAfter diff --git a/Libraries/JSInspector/NetworkAgent.js b/Libraries/JSInspector/NetworkAgent.js index f1811978709e..e8e2f43b2a2d 100644 --- a/Libraries/JSInspector/NetworkAgent.js +++ b/Libraries/JSInspector/NetworkAgent.js @@ -275,12 +275,7 @@ class NetworkAgent extends InspectorAgent { this._interceptor = null; } - getResponseBody({ - requestId, - }: { - requestId: RequestId, - ... - }): { + getResponseBody({requestId}: {requestId: RequestId, ...}): { body: ?string, base64Encoded: boolean, ... diff --git a/Libraries/LayoutAnimation/LayoutAnimation.js b/Libraries/LayoutAnimation/LayoutAnimation.js index efb12afa5dc7..331308f36bed 100644 --- a/Libraries/LayoutAnimation/LayoutAnimation.js +++ b/Libraries/LayoutAnimation/LayoutAnimation.js @@ -70,7 +70,7 @@ function configureNext( config, onAnimationComplete, onAnimationDidFail ?? - function() {} /* this will only be called if configuration parsing fails */, + function () {} /* this will only be called if configuration parsing fails */, ); return; } @@ -81,9 +81,9 @@ function configureNext( if (UIManager?.configureNextLayoutAnimation) { UIManager.configureNextLayoutAnimation( config, - onAnimationComplete ?? function() {}, + onAnimationComplete ?? function () {}, onAnimationDidFail ?? - function() {} /* this should never be called in Non-Fabric */, + function () {} /* this should never be called in Non-Fabric */, ); } } diff --git a/Libraries/Lists/FillRateHelper.js b/Libraries/Lists/FillRateHelper.js index 6e18000b48f7..bcbd415be2a8 100644 --- a/Libraries/Lists/FillRateHelper.js +++ b/Libraries/Lists/FillRateHelper.js @@ -54,9 +54,10 @@ class FillRateHelper { _mostlyBlankStartTime = (null: ?number); _samplesStartTime = (null: ?number); - static addListener( - callback: FillRateInfo => void, - ): {remove: () => void, ...} { + static addListener(callback: FillRateInfo => void): { + remove: () => void, + ... + } { if (_sampleRate === null) { console.warn('Call `FillRateHelper.setSampleRate` before `addListener`.'); } diff --git a/Libraries/Lists/FlatList.js b/Libraries/Lists/FlatList.js index 5e49715a8e71..7f4932458e95 100644 --- a/Libraries/Lists/FlatList.js +++ b/Libraries/Lists/FlatList.js @@ -408,14 +408,13 @@ class FlatList extends React.PureComponent, void> { super(props); this._checkProps(this.props); if (this.props.viewabilityConfigCallbackPairs) { - this._virtualizedListPairs = this.props.viewabilityConfigCallbackPairs.map( - pair => ({ + this._virtualizedListPairs = + this.props.viewabilityConfigCallbackPairs.map(pair => ({ viewabilityConfig: pair.viewabilityConfig, onViewableItemsChanged: this._createOnViewableItemsChanged( pair.onViewableItemsChanged, ), - }), - ); + })); } else if (this.props.onViewableItemsChanged) { this._virtualizedListPairs.push({ /* $FlowFixMe[incompatible-call] (>=0.63.0 site=react_native_fb) This diff --git a/Libraries/Lists/ViewabilityHelper.js b/Libraries/Lists/ViewabilityHelper.js index 8b1d49fd8ba1..aa59185fa1d1 100644 --- a/Libraries/Lists/ViewabilityHelper.js +++ b/Libraries/Lists/ViewabilityHelper.js @@ -102,9 +102,7 @@ class ViewabilityHelper { itemCount: number, scrollOffset: number, viewportHeight: number, - getFrameMetrics: ( - index: number, - ) => ?{ + getFrameMetrics: (index: number) => ?{ length: number, offset: number, ... @@ -116,10 +114,8 @@ class ViewabilityHelper { ... }, ): Array { - const { - itemVisiblePercentThreshold, - viewAreaCoveragePercentThreshold, - } = this._config; + const {itemVisiblePercentThreshold, viewAreaCoveragePercentThreshold} = + this._config; const viewAreaMode = viewAreaCoveragePercentThreshold != null; const viewablePercentThreshold = viewAreaMode ? viewAreaCoveragePercentThreshold @@ -179,9 +175,7 @@ class ViewabilityHelper { itemCount: number, scrollOffset: number, viewportHeight: number, - getFrameMetrics: ( - index: number, - ) => ?{ + getFrameMetrics: (index: number) => ?{ length: number, offset: number, ... diff --git a/Libraries/Lists/VirtualizeUtils.js b/Libraries/Lists/VirtualizeUtils.js index 1d80b378aa8d..11dfd8cc2036 100644 --- a/Libraries/Lists/VirtualizeUtils.js +++ b/Libraries/Lists/VirtualizeUtils.js @@ -20,9 +20,7 @@ import invariant from 'invariant'; export function elementsThatOverlapOffsets( offsets: Array, itemCount: number, - getFrameMetrics: ( - index: number, - ) => { + getFrameMetrics: (index: number) => { length: number, offset: number, ... @@ -96,9 +94,7 @@ export function computeWindowedRenderLimits( last: number, ... }, - getFrameMetricsApprox: ( - index: number, - ) => { + getFrameMetricsApprox: (index: number) => { length: number, offset: number, ... diff --git a/Libraries/Lists/VirtualizedList.js b/Libraries/Lists/VirtualizedList.js index efd740bfb7a9..c411032c269c 100644 --- a/Libraries/Lists/VirtualizedList.js +++ b/Libraries/Lists/VirtualizedList.js @@ -441,9 +441,9 @@ class VirtualizedList extends React.PureComponent { ); invariant( index < getItemCount(data), - `scrollToIndex out of range: requested index ${index} is out of 0 to ${getItemCount( - data, - ) - 1}`, + `scrollToIndex out of range: requested index ${index} is out of 0 to ${ + getItemCount(data) - 1 + }`, ); if (!getItemLayout && index > this._highestMeasuredFrameIndex) { invariant( @@ -882,11 +882,8 @@ class VirtualizedList extends React.PureComponent { ); } } - const { - ListEmptyComponent, - ListFooterComponent, - ListHeaderComponent, - } = this.props; + const {ListEmptyComponent, ListFooterComponent, ListHeaderComponent} = + this.props; const {data, horizontal} = this.props; const isVirtualizationDisabled = this._isVirtualizationDisabled(); const inversionStyle = this.props.inverted @@ -1496,12 +1493,8 @@ class VirtualizedList extends React.PureComponent { } _maybeCallOnEndReached() { - const { - data, - getItemCount, - onEndReached, - onEndReachedThreshold, - } = this.props; + const {data, getItemCount, onEndReached, onEndReachedThreshold} = + this.props; const {contentLength, visibleLength, offset} = this._scrollMetrics; const distanceFromEnd = contentLength - visibleLength - offset; const threshold = @@ -1588,15 +1581,11 @@ class VirtualizedList extends React.PureComponent { // know our offset from our offset from our parent return; } - ({ - visibleLength, - contentLength, - offset, - dOffset, - } = this._convertParentScrollMetrics({ - visibleLength, - offset, - })); + ({visibleLength, contentLength, offset, dOffset} = + this._convertParentScrollMetrics({ + visibleLength, + offset, + })); } const dt = this._scrollMetrics.timestamp diff --git a/Libraries/Lists/VirtualizedListContext.js b/Libraries/Lists/VirtualizedListContext.js index b2f8d063dca0..c79fd146b18e 100644 --- a/Libraries/Lists/VirtualizedListContext.js +++ b/Libraries/Lists/VirtualizedListContext.js @@ -64,9 +64,8 @@ type Context = $ReadOnly<{ debugInfo: ListDebugInfo, }>; -export const VirtualizedListContext: React.Context = React.createContext( - null, -); +export const VirtualizedListContext: React.Context = + React.createContext(null); if (__DEV__) { VirtualizedListContext.displayName = 'VirtualizedListContext'; } diff --git a/Libraries/Lists/VirtualizedSectionList.js b/Libraries/Lists/VirtualizedSectionList.js index 977fa3a0d785..a3d858d2ff7c 100644 --- a/Libraries/Lists/VirtualizedSectionList.js +++ b/Libraries/Lists/VirtualizedSectionList.js @@ -240,9 +240,7 @@ class VirtualizedSectionList< return (info && info.key) || String(index); }; - _subExtractor( - index: number, - ): ?{ + _subExtractor(index: number): ?{ section: SectionT, // Key of the section or combined key for section + item key: string, @@ -339,63 +337,58 @@ class VirtualizedSectionList< } }; - _renderItem = (listItemCount: number) => ({ - item, - index, - }: { - item: Item, - index: number, - ... - }) => { - const info = this._subExtractor(index); - if (!info) { - return null; - } - const infoIndex = info.index; - if (infoIndex == null) { - const {section} = info; - if (info.header === true) { - const {renderSectionHeader} = this.props; - return renderSectionHeader ? renderSectionHeader({section}) : null; + _renderItem = + (listItemCount: number) => + ({item, index}: {item: Item, index: number, ...}) => { + const info = this._subExtractor(index); + if (!info) { + return null; + } + const infoIndex = info.index; + if (infoIndex == null) { + const {section} = info; + if (info.header === true) { + const {renderSectionHeader} = this.props; + return renderSectionHeader ? renderSectionHeader({section}) : null; + } else { + const {renderSectionFooter} = this.props; + return renderSectionFooter ? renderSectionFooter({section}) : null; + } } else { - const {renderSectionFooter} = this.props; - return renderSectionFooter ? renderSectionFooter({section}) : null; + const renderItem = info.section.renderItem || this.props.renderItem; + const SeparatorComponent = this._getSeparatorComponent( + index, + info, + listItemCount, + ); + invariant(renderItem, 'no renderItem!'); + return ( + + ); } - } else { - const renderItem = info.section.renderItem || this.props.renderItem; - const SeparatorComponent = this._getSeparatorComponent( - index, - info, - listItemCount, - ); - invariant(renderItem, 'no renderItem!'); - return ( - - ); - } - }; + }; _updatePropsFor = (cellKey, value) => { const updateProps = this._updatePropsMap[cellKey]; @@ -506,10 +499,8 @@ function ItemWithSeparator(props: ItemWithSeparatorProps): React.Node { inverted, } = props; - const [ - leadingSeparatorHiglighted, - setLeadingSeparatorHighlighted, - ] = React.useState(false); + const [leadingSeparatorHiglighted, setLeadingSeparatorHighlighted] = + React.useState(false); const [separatorHighlighted, setSeparatorHighlighted] = React.useState(false); diff --git a/Libraries/Lists/__tests__/FillRateHelper-test.js b/Libraries/Lists/__tests__/FillRateHelper-test.js index a0b0b3b4f48d..f3c11323c1c5 100644 --- a/Libraries/Lists/__tests__/FillRateHelper-test.js +++ b/Libraries/Lists/__tests__/FillRateHelper-test.js @@ -40,13 +40,13 @@ function computeResult({helper, props, state, scroll}): number { ); } -describe('computeBlankness', function() { +describe('computeBlankness', function () { beforeEach(() => { FillRateHelper.setSampleRate(1); FillRateHelper.setMinSampleCount(0); }); - it('computes correct blankness of viewport', function() { + it('computes correct blankness of viewport', function () { const helper = new FillRateHelper(getFrameMetrics); rowFramesGlobal = { header: {y: 0, height: 0, inLayout: true}, @@ -65,7 +65,7 @@ describe('computeBlankness', function() { expect(blankness).toBe(1); }); - it('skips frames that are not in layout', function() { + it('skips frames that are not in layout', function () { const helper = new FillRateHelper(getFrameMetrics); rowFramesGlobal = { header: {y: 0, height: 0, inLayout: false}, @@ -79,7 +79,7 @@ describe('computeBlankness', function() { expect(blankness).toBe(0.3); }); - it('sampling rate can disable', function() { + it('sampling rate can disable', function () { let helper = new FillRateHelper(getFrameMetrics); rowFramesGlobal = { header: {y: 0, height: 0, inLayout: true}, @@ -96,7 +96,7 @@ describe('computeBlankness', function() { expect(blankness).toBe(0); }); - it('can handle multiple listeners and unsubscribe', function() { + it('can handle multiple listeners and unsubscribe', function () { const listeners = [jest.fn(), jest.fn(), jest.fn()]; const subscriptions = listeners.map(listener => FillRateHelper.addListener(listener), diff --git a/Libraries/Lists/__tests__/ViewabilityHelper-test.js b/Libraries/Lists/__tests__/ViewabilityHelper-test.js index 6240824b68c0..301679785f9a 100644 --- a/Libraries/Lists/__tests__/ViewabilityHelper-test.js +++ b/Libraries/Lists/__tests__/ViewabilityHelper-test.js @@ -22,8 +22,8 @@ function createViewToken(index: number, isViewable: boolean) { return {key: data[index].key, isViewable}; } -describe('computeViewableItems', function() { - it('returns all 4 entirely visible rows as viewable', function() { +describe('computeViewableItems', function () { + it('returns all 4 entirely visible rows as viewable', function () { const helper = new ViewabilityHelper({ viewAreaCoveragePercentThreshold: 50, }); @@ -39,7 +39,7 @@ describe('computeViewableItems', function() { ).toEqual([0, 1, 2, 3]); }); - it('returns top 2 rows as viewable (1. entirely visible and 2. majority)', function() { + it('returns top 2 rows as viewable (1. entirely visible and 2. majority)', function () { const helper = new ViewabilityHelper({ viewAreaCoveragePercentThreshold: 50, }); @@ -55,7 +55,7 @@ describe('computeViewableItems', function() { ).toEqual([0, 1]); }); - it('returns only 2nd row as viewable (majority)', function() { + it('returns only 2nd row as viewable (majority)', function () { const helper = new ViewabilityHelper({ viewAreaCoveragePercentThreshold: 50, }); @@ -71,7 +71,7 @@ describe('computeViewableItems', function() { ).toEqual([1]); }); - it('handles empty input', function() { + it('handles empty input', function () { const helper = new ViewabilityHelper({ viewAreaCoveragePercentThreshold: 50, }); @@ -82,7 +82,7 @@ describe('computeViewableItems', function() { ).toEqual([]); }); - it('handles different view area coverage percent thresholds', function() { + it('handles different view area coverage percent thresholds', function () { rowFrames = { a: {y: 0, height: 50}, b: {y: 50, height: 150}, @@ -128,7 +128,7 @@ describe('computeViewableItems', function() { ).toEqual([1, 2]); }); - it('handles different item visible percent thresholds', function() { + it('handles different item visible percent thresholds', function () { rowFrames = { a: {y: 0, height: 50}, b: {y: 50, height: 150}, @@ -165,8 +165,8 @@ describe('computeViewableItems', function() { }); }); -describe('onUpdate', function() { - it('returns 1 visible row as viewable then scrolls away', function() { +describe('onUpdate', function () { + it('returns 1 visible row as viewable then scrolls away', function () { const helper = new ViewabilityHelper(); rowFrames = { a: {y: 0, height: 50}, @@ -212,7 +212,7 @@ describe('onUpdate', function() { }); }); - it('returns 1st visible row then 1st and 2nd then just 2nd', function() { + it('returns 1st visible row then 1st and 2nd then just 2nd', function () { const helper = new ViewabilityHelper(); rowFrames = { a: {y: 0, height: 200}, @@ -268,7 +268,7 @@ describe('onUpdate', function() { }); }); - it('minimumViewTime delays callback', function() { + it('minimumViewTime delays callback', function () { const helper = new ViewabilityHelper({ minimumViewTime: 350, viewAreaCoveragePercentThreshold: 0, @@ -302,7 +302,7 @@ describe('onUpdate', function() { }); }); - it('minimumViewTime skips briefly visible items', function() { + it('minimumViewTime skips briefly visible items', function () { const helper = new ViewabilityHelper({ minimumViewTime: 350, viewAreaCoveragePercentThreshold: 0, @@ -343,7 +343,7 @@ describe('onUpdate', function() { }); }); - it('waitForInteraction blocks callback until interaction', function() { + it('waitForInteraction blocks callback until interaction', function () { const helper = new ViewabilityHelper({ waitForInteraction: true, viewAreaCoveragePercentThreshold: 0, @@ -385,7 +385,7 @@ describe('onUpdate', function() { }); }); - it('returns the right visible row after the underlying data changed', function() { + it('returns the right visible row after the underlying data changed', function () { const helper = new ViewabilityHelper(); rowFrames = { a: {y: 0, height: 200}, diff --git a/Libraries/Lists/__tests__/VirtualizeUtils-test.js b/Libraries/Lists/__tests__/VirtualizeUtils-test.js index 389f4f537583..0181eabeb88c 100644 --- a/Libraries/Lists/__tests__/VirtualizeUtils-test.js +++ b/Libraries/Lists/__tests__/VirtualizeUtils-test.js @@ -12,35 +12,35 @@ import {elementsThatOverlapOffsets, newRangeCount} from '../VirtualizeUtils'; -describe('newRangeCount', function() { - it('handles subset', function() { +describe('newRangeCount', function () { + it('handles subset', function () { expect(newRangeCount({first: 1, last: 4}, {first: 2, last: 3})).toBe(0); }); - it('handles forward disjoint set', function() { + it('handles forward disjoint set', function () { expect(newRangeCount({first: 1, last: 4}, {first: 6, last: 9})).toBe(4); }); - it('handles reverse disjoint set', function() { + it('handles reverse disjoint set', function () { expect(newRangeCount({first: 6, last: 8}, {first: 1, last: 4})).toBe(4); }); - it('handles superset', function() { + it('handles superset', function () { expect(newRangeCount({first: 1, last: 4}, {first: 0, last: 5})).toBe(2); }); - it('handles end extension', function() { + it('handles end extension', function () { expect(newRangeCount({first: 1, last: 4}, {first: 1, last: 8})).toBe(4); }); - it('handles front extension', function() { + it('handles front extension', function () { expect(newRangeCount({first: 1, last: 4}, {first: 0, last: 4})).toBe(1); }); - it('handles forward intersect', function() { + it('handles forward intersect', function () { expect(newRangeCount({first: 1, last: 4}, {first: 3, last: 6})).toBe(2); }); - it('handles reverse intersect', function() { + it('handles reverse intersect', function () { expect(newRangeCount({first: 3, last: 6}, {first: 1, last: 4})).toBe(2); }); }); -describe('elementsThatOverlapOffsets', function() { - it('handles fixed length', function() { +describe('elementsThatOverlapOffsets', function () { + it('handles fixed length', function () { const offsets = [0, 250, 350, 450]; function getFrameMetrics(index: number) { return { @@ -49,13 +49,10 @@ describe('elementsThatOverlapOffsets', function() { }; } expect(elementsThatOverlapOffsets(offsets, 100, getFrameMetrics)).toEqual([ - 0, - 2, - 3, - 4, + 0, 2, 3, 4, ]); }); - it('handles variable length', function() { + it('handles variable length', function () { const offsets = [150, 250, 900]; const frames = [ {offset: 0, length: 50}, @@ -68,7 +65,7 @@ describe('elementsThatOverlapOffsets', function() { elementsThatOverlapOffsets(offsets, frames.length, ii => frames[ii]), ).toEqual([1, 1, 3]); }); - it('handles out of bounds', function() { + it('handles out of bounds', function () { const offsets = [150, 900]; const frames = [ {offset: 0, length: 50}, @@ -79,7 +76,7 @@ describe('elementsThatOverlapOffsets', function() { elementsThatOverlapOffsets(offsets, frames.length, ii => frames[ii]), ).toEqual([1]); }); - it('errors on non-increasing offsets', function() { + it('errors on non-increasing offsets', function () { const offsets = [150, 50]; const frames = [ {offset: 0, length: 50}, diff --git a/Libraries/LogBox/Data/LogBoxData.js b/Libraries/LogBox/Data/LogBoxData.js index 1c2f84260245..2c1f48da169a 100644 --- a/Libraries/LogBox/Data/LogBoxData.js +++ b/Libraries/LogBox/Data/LogBoxData.js @@ -71,7 +71,7 @@ let updateTimeout = null; let _isDisabled = false; let _selectedIndex = -1; -let warningFilter: WarningFilter = function(format) { +let warningFilter: WarningFilter = function (format) { return { finalFormat: format, forceDialogImmediately: false, diff --git a/Libraries/LogBox/Data/parseLogBoxLog.js b/Libraries/LogBox/Data/parseLogBoxLog.js index df75479bb5dd..66d3273f5237 100644 --- a/Libraries/LogBox/Data/parseLogBoxLog.js +++ b/Libraries/LogBox/Data/parseLogBoxLog.js @@ -14,9 +14,12 @@ import type {ExceptionData} from '../../Core/NativeExceptionsManager'; import type {LogBoxLogData} from './LogBoxLog'; import parseErrorStack from '../../Core/Devtools/parseErrorStack'; -const BABEL_TRANSFORM_ERROR_FORMAT = /^(?:TransformError )?(?:SyntaxError: |ReferenceError: )(.*): (.*) \((\d+):(\d+)\)\n\n([\s\S]+)/; -const BABEL_CODE_FRAME_ERROR_FORMAT = /^(?: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; +const BABEL_TRANSFORM_ERROR_FORMAT = + /^(?:TransformError )?(?:SyntaxError: |ReferenceError: )(.*): (.*) \((\d+):(\d+)\)\n\n([\s\S]+)/; +const BABEL_CODE_FRAME_ERROR_FORMAT = + /^(?: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; export type ExtendedExceptionData = ExceptionData & { isComponentError: boolean, @@ -51,9 +54,7 @@ export type ComponentStack = $ReadOnlyArray; const SUBSTITUTION = UTFSequence.BOM + '%s'; -export function parseInterpolation( - args: $ReadOnlyArray, -): $ReadOnly<{| +export function parseInterpolation(args: $ReadOnlyArray): $ReadOnly<{| category: Category, message: Message, |}> { @@ -186,13 +187,8 @@ export function parseLogBoxException( const metroInternalError = message.match(METRO_ERROR_FORMAT); if (metroInternalError) { - const [ - content, - fileName, - row, - column, - codeFrame, - ] = metroInternalError.slice(1); + const [content, fileName, row, column, codeFrame] = + metroInternalError.slice(1); return { level: 'fatal', @@ -219,13 +215,8 @@ export function parseLogBoxException( const babelTransformError = message.match(BABEL_TRANSFORM_ERROR_FORMAT); if (babelTransformError) { // Transform errors are thrown from inside the Babel transformer. - const [ - fileName, - content, - row, - column, - codeFrame, - ] = babelTransformError.slice(1); + const [fileName, content, row, column, codeFrame] = + babelTransformError.slice(1); return { level: 'syntax', @@ -318,9 +309,7 @@ export function parseLogBoxException( }; } -export function parseLogBoxLog( - args: $ReadOnlyArray, -): {| +export function parseLogBoxLog(args: $ReadOnlyArray): {| componentStack: ComponentStack, category: Category, message: Message, diff --git a/Libraries/LogBox/UI/__tests__/LogBoxInspectorMesageHeader-test.js b/Libraries/LogBox/UI/__tests__/LogBoxInspectorMesageHeader-test.js index 7326a02c0091..7cabd321ee77 100644 --- a/Libraries/LogBox/UI/__tests__/LogBoxInspectorMesageHeader-test.js +++ b/Libraries/LogBox/UI/__tests__/LogBoxInspectorMesageHeader-test.js @@ -12,8 +12,8 @@ 'use strict'; const React = require('react'); -const LogBoxInspectorMessageHeader = require('../LogBoxInspectorMessageHeader') - .default; +const LogBoxInspectorMessageHeader = + require('../LogBoxInspectorMessageHeader').default; const render = require('../../../../jest/renderer'); describe('LogBoxInspectorMessageHeader', () => { diff --git a/Libraries/LogBox/UI/__tests__/LogBoxInspectorReactFrames-test.js b/Libraries/LogBox/UI/__tests__/LogBoxInspectorReactFrames-test.js index 117fbafde0e3..386f8c6bbe06 100644 --- a/Libraries/LogBox/UI/__tests__/LogBoxInspectorReactFrames-test.js +++ b/Libraries/LogBox/UI/__tests__/LogBoxInspectorReactFrames-test.js @@ -12,8 +12,8 @@ 'use strict'; const React = require('react'); -const LogBoxInspectorReactFrames = require('../LogBoxInspectorReactFrames') - .default; +const LogBoxInspectorReactFrames = + require('../LogBoxInspectorReactFrames').default; const LogBoxLog = require('../../Data/LogBoxLog').default; const render = require('../../../../jest/renderer'); diff --git a/Libraries/LogBox/UI/__tests__/LogBoxInspectorSourceMapStatus-test.js b/Libraries/LogBox/UI/__tests__/LogBoxInspectorSourceMapStatus-test.js index b44c4decf47e..dd5d768eb475 100644 --- a/Libraries/LogBox/UI/__tests__/LogBoxInspectorSourceMapStatus-test.js +++ b/Libraries/LogBox/UI/__tests__/LogBoxInspectorSourceMapStatus-test.js @@ -12,8 +12,8 @@ 'use strict'; const React = require('react'); -const LogBoxInspectorSourceMapStatus = require('../LogBoxInspectorSourceMapStatus') - .default; +const LogBoxInspectorSourceMapStatus = + require('../LogBoxInspectorSourceMapStatus').default; const render = require('../../../../jest/renderer'); describe('LogBoxInspectorSourceMapStatus', () => { diff --git a/Libraries/LogBox/UI/__tests__/LogBoxInspectorStackFrame-test.js b/Libraries/LogBox/UI/__tests__/LogBoxInspectorStackFrame-test.js index b52175d54abc..4b0e508b7f6a 100644 --- a/Libraries/LogBox/UI/__tests__/LogBoxInspectorStackFrame-test.js +++ b/Libraries/LogBox/UI/__tests__/LogBoxInspectorStackFrame-test.js @@ -12,8 +12,8 @@ 'use strict'; const React = require('react'); -const LogBoxInspectorStackFrame = require('../LogBoxInspectorStackFrame') - .default; +const LogBoxInspectorStackFrame = + require('../LogBoxInspectorStackFrame').default; const render = require('../../../../jest/renderer'); describe('LogBoxInspectorStackFrame', () => { diff --git a/Libraries/NativeComponent/NativeComponentRegistry.js b/Libraries/NativeComponent/NativeComponentRegistry.js index 2e90c650a02c..cc8986ae694d 100644 --- a/Libraries/NativeComponent/NativeComponentRegistry.js +++ b/Libraries/NativeComponent/NativeComponentRegistry.js @@ -33,9 +33,7 @@ let componentNameToExists: Map = new Map(); * the current environment. */ export function setRuntimeConfigProvider( - runtimeConfigProvider: ( - name: string, - ) => ?{ + runtimeConfigProvider: (name: string) => ?{ native: boolean, strict: boolean, verify: boolean, @@ -132,7 +130,7 @@ export function getWithFallback_DEPRECATED( } } - const FallbackNativeComponent = function(props: Config): React.Node { + const FallbackNativeComponent = function (props: Config): React.Node { return null; }; FallbackNativeComponent.displayName = `Fallback(${name})`; diff --git a/Libraries/Network/XHRInterceptor.js b/Libraries/Network/XHRInterceptor.js index 65c32e5606d7..e9c26b5b6c57 100644 --- a/Libraries/Network/XHRInterceptor.js +++ b/Libraries/Network/XHRInterceptor.js @@ -75,7 +75,7 @@ const XHRInterceptor = { } // Override `open` method for all XHR requests to intercept the request // method and url, then pass them through the `openCallback`. - XMLHttpRequest.prototype.open = function(method, url) { + XMLHttpRequest.prototype.open = function (method, url) { if (openCallback) { openCallback(method, url, this); } @@ -84,7 +84,7 @@ const XHRInterceptor = { // Override `setRequestHeader` method for all XHR requests to intercept // the request headers, then pass them through the `requestHeaderCallback`. - XMLHttpRequest.prototype.setRequestHeader = function(header, value) { + XMLHttpRequest.prototype.setRequestHeader = function (header, value) { if (requestHeaderCallback) { requestHeaderCallback(header, value, this); } @@ -93,7 +93,7 @@ const XHRInterceptor = { // Override `send` method of all XHR requests to intercept the data sent, // register listeners to intercept the response, and invoke the callbacks. - XMLHttpRequest.prototype.send = function(data) { + XMLHttpRequest.prototype.send = function (data) { if (sendCallback) { sendCallback(data, this); } @@ -106,9 +106,8 @@ const XHRInterceptor = { } if (this.readyState === this.HEADERS_RECEIVED) { const contentTypeString = this.getResponseHeader('Content-Type'); - const contentLengthString = this.getResponseHeader( - 'Content-Length', - ); + const contentLengthString = + this.getResponseHeader('Content-Length'); let responseContentType, responseSize; if (contentTypeString) { responseContentType = contentTypeString.split(';')[0]; diff --git a/Libraries/Network/__tests__/FormData-test.js b/Libraries/Network/__tests__/FormData-test.js index 5ea0263aac35..b93b8a533429 100644 --- a/Libraries/Network/__tests__/FormData-test.js +++ b/Libraries/Network/__tests__/FormData-test.js @@ -12,7 +12,7 @@ const FormData = require('../FormData'); -describe('FormData', function() { +describe('FormData', function () { var formData; beforeEach(() => { @@ -23,7 +23,7 @@ describe('FormData', function() { formData = null; }); - it('should return non blob null', function() { + it('should return non blob null', function () { formData.append('null', null); const expectedPart = { @@ -36,7 +36,7 @@ describe('FormData', function() { expect(formData.getParts()[0]).toMatchObject(expectedPart); }); - it('should return blob', function() { + it('should return blob', function () { formData.append('photo', { uri: 'arbitrary/path', type: 'image/jpeg', diff --git a/Libraries/Network/__tests__/XMLHttpRequest-test.js b/Libraries/Network/__tests__/XMLHttpRequest-test.js index f769d356f788..1968be210bcb 100644 --- a/Libraries/Network/__tests__/XMLHttpRequest-test.js +++ b/Libraries/Network/__tests__/XMLHttpRequest-test.js @@ -28,15 +28,15 @@ jest .dontMock('event-target-shim') .setMock('../../BatchedBridge/NativeModules', { Networking: { - addListener: function() {}, - removeListeners: function() {}, + addListener: function () {}, + removeListeners: function () {}, sendRequest(options, callback) { if (typeof callback === 'function') { // android does not pass a callback callback(requestId); } }, - abortRequest: function() {}, + abortRequest: function () {}, }, PlatformConstants: { getConstants() { @@ -47,7 +47,7 @@ jest const XMLHttpRequest = require('../XMLHttpRequest'); -describe('XMLHttpRequest', function() { +describe('XMLHttpRequest', function () { let xhr; let handleTimeout; let handleError; @@ -88,7 +88,7 @@ describe('XMLHttpRequest', function() { handleReadyStateChange = null; }); - it('should transition readyState correctly', function() { + it('should transition readyState correctly', function () { expect(xhr.readyState).toBe(xhr.UNSENT); xhr.open('GET', 'blabla'); @@ -98,7 +98,7 @@ describe('XMLHttpRequest', function() { expect(xhr.readyState).toBe(xhr.OPENED); }); - it('should expose responseType correctly', function() { + it('should expose responseType correctly', function () { expect(xhr.responseType).toBe(''); jest.spyOn(console, 'warn').mockReturnValue(undefined); @@ -123,7 +123,7 @@ describe('XMLHttpRequest', function() { }).toThrow(); }); - it('should expose responseText correctly', function() { + it('should expose responseText correctly', function () { xhr.responseType = ''; expect(xhr.responseText).toBe(''); expect(xhr.response).toBe(''); @@ -150,7 +150,7 @@ describe('XMLHttpRequest', function() { expect(xhr.responseText).toBe('Some data'); }); - it('should call ontimeout function when the request times out', function() { + it('should call ontimeout function when the request times out', function () { xhr.open('GET', 'blabla'); xhr.send(); setRequestId(3); @@ -170,7 +170,7 @@ describe('XMLHttpRequest', function() { expect(handleLoad).not.toBeCalled(); }); - it('should call onerror function when the request times out', function() { + it('should call onerror function when the request times out', function () { xhr.open('GET', 'blabla'); xhr.send(); setRequestId(4); @@ -191,7 +191,7 @@ describe('XMLHttpRequest', function() { expect(handleLoad).not.toBeCalled(); }); - it('should call onload function when there is no error', function() { + it('should call onload function when there is no error', function () { xhr.open('GET', 'blabla'); xhr.send(); setRequestId(5); @@ -212,7 +212,7 @@ describe('XMLHttpRequest', function() { expect(handleTimeout).not.toBeCalled(); }); - it('should call upload onprogress', function() { + it('should call upload onprogress', function () { xhr.open('GET', 'blabla'); xhr.send(); @@ -231,7 +231,7 @@ describe('XMLHttpRequest', function() { expect(handleProgress.mock.calls[0][0].total).toBe(100); }); - it('should combine response headers with CRLF', function() { + it('should combine response headers with CRLF', function () { xhr.open('GET', 'blabla'); xhr.send(); setRequestId(7); @@ -293,7 +293,7 @@ describe('XMLHttpRequest', function() { expect(GlobalPerformanceLogger.stopTimespan).not.toHaveBeenCalled(); }); - it('should sort and lowercase response headers', function() { + it('should sort and lowercase response headers', function () { // Derived from XHR Web Platform Test: https://github.com/web-platform-tests/wpt/blob/master/xhr/getallresponseheaders.htm xhr.open('GET', 'blabla'); xhr.send(); diff --git a/Libraries/Performance/SamplingProfiler.js b/Libraries/Performance/SamplingProfiler.js index a1c0ece4d166..4f3a211eb132 100644 --- a/Libraries/Performance/SamplingProfiler.js +++ b/Libraries/Performance/SamplingProfiler.js @@ -11,7 +11,7 @@ 'use strict'; const SamplingProfiler = { - poke: function(token: number): void { + poke: function (token: number): void { let error = null; let result = null; try { @@ -28,8 +28,8 @@ const SamplingProfiler = { error = e.toString(); } - const NativeJSCSamplingProfiler = require('./NativeJSCSamplingProfiler') - .default; + const NativeJSCSamplingProfiler = + require('./NativeJSCSamplingProfiler').default; if (NativeJSCSamplingProfiler) { NativeJSCSamplingProfiler.operationComplete(token, result, error); } diff --git a/Libraries/PermissionsAndroid/PermissionsAndroid.js b/Libraries/PermissionsAndroid/PermissionsAndroid.js index 8d8ceb4e9bb7..5d9ff0d7af9e 100644 --- a/Libraries/PermissionsAndroid/PermissionsAndroid.js +++ b/Libraries/PermissionsAndroid/PermissionsAndroid.js @@ -223,9 +223,10 @@ class PermissionsAndroid { ); if (rationale) { - const shouldShowRationale = await NativePermissionsAndroid.shouldShowRequestPermissionRationale( - permission, - ); + const shouldShowRationale = + await NativePermissionsAndroid.shouldShowRequestPermissionRationale( + permission, + ); if (shouldShowRationale && !!NativeDialogManagerAndroid) { return new Promise((resolve, reject) => { diff --git a/Libraries/Pressability/Pressability.js b/Libraries/Pressability/Pressability.js index bb3c6d4d2822..6446d1476f35 100644 --- a/Libraries/Pressability/Pressability.js +++ b/Libraries/Pressability/Pressability.js @@ -545,8 +545,8 @@ export default class Pressability { if (process.env.NODE_ENV === 'test') { // We are setting this in order to find this node in ReactNativeTestTools - responderEventHandlers.onStartShouldSetResponder.testOnly_pressabilityConfig = () => - this._config; + responderEventHandlers.onStartShouldSetResponder.testOnly_pressabilityConfig = + () => this._config; } const mouseEventHandlers = diff --git a/Libraries/Pressability/PressabilityPerformanceEventEmitter.js b/Libraries/Pressability/PressabilityPerformanceEventEmitter.js index ec49f2bf9a4d..3412f8bbf13f 100644 --- a/Libraries/Pressability/PressabilityPerformanceEventEmitter.js +++ b/Libraries/Pressability/PressabilityPerformanceEventEmitter.js @@ -14,7 +14,8 @@ export type PressabilityPerformanceEvent = $ReadOnly<{| signal: TouchSignal, nativeTimestamp: number, |}>; -export type PressabilityPerformanceEventListener = PressabilityPerformanceEvent => void; +export type PressabilityPerformanceEventListener = + PressabilityPerformanceEvent => void; class PressabilityPerformanceEventEmitter { _listeners: Array = []; @@ -42,6 +43,7 @@ class PressabilityPerformanceEventEmitter { } } -const PressabilityPerformanceEventEmitterSingleton: PressabilityPerformanceEventEmitter = new PressabilityPerformanceEventEmitter(); +const PressabilityPerformanceEventEmitterSingleton: PressabilityPerformanceEventEmitter = + new PressabilityPerformanceEventEmitter(); export default PressabilityPerformanceEventEmitterSingleton; diff --git a/Libraries/PushNotificationIOS/PushNotificationIOS.js b/Libraries/PushNotificationIOS/PushNotificationIOS.js index 288d06d9a7b5..d1d78cc860c9 100644 --- a/Libraries/PushNotificationIOS/PushNotificationIOS.js +++ b/Libraries/PushNotificationIOS/PushNotificationIOS.js @@ -37,11 +37,12 @@ type NativePushNotificationIOSEventDefinitions = { localNotificationReceived: [{...}], }; -const PushNotificationEmitter = new NativeEventEmitter( - // T88715063: NativeEventEmitter only used this parameter on iOS. Now it uses it on all platforms, so this code was modified automatically to preserve its behavior - // If you want to use the native module on other platforms, please remove this condition and test its behavior - Platform.OS !== 'ios' ? null : NativePushNotificationManagerIOS, -); +const PushNotificationEmitter = + new NativeEventEmitter( + // T88715063: NativeEventEmitter only used this parameter on iOS. Now it uses it on all platforms, so this code was modified automatically to preserve its behavior + // If you want to use the native module on other platforms, please remove this condition and test its behavior + Platform.OS !== 'ios' ? null : NativePushNotificationManagerIOS, + ); const _notifHandlers = new Map(); diff --git a/Libraries/ReactNative/AppContainer.js b/Libraries/ReactNative/AppContainer.js index 23da450a3108..8f848da5cae4 100644 --- a/Libraries/ReactNative/AppContainer.js +++ b/Libraries/ReactNative/AppContainer.js @@ -82,8 +82,8 @@ class AppContainer extends React.Component { !global.__RCTProfileIsProfiling && !this.props.internal_excludeLogBox ) { - const LogBoxNotificationContainer = require('../LogBox/LogBoxNotificationContainer') - .default; + const LogBoxNotificationContainer = + require('../LogBox/LogBoxNotificationContainer').default; logBox = ; } } diff --git a/Libraries/ReactNative/AppRegistry.js b/Libraries/ReactNative/AppRegistry.js index f1ff791dd3d0..e6cd67571953 100644 --- a/Libraries/ReactNative/AppRegistry.js +++ b/Libraries/ReactNative/AppRegistry.js @@ -59,9 +59,8 @@ let runCount = 1; const sections: Runnables = {}; const taskProviders: Map = new Map(); const taskCancelProviders: Map = new Map(); -let componentProviderInstrumentationHook: ComponentProviderInstrumentationHook = ( - component: ComponentProvider, -) => component(); +let componentProviderInstrumentationHook: ComponentProviderInstrumentationHook = + (component: ComponentProvider) => component(); let wrapperComponentProvider: ?WrapperComponentProvider; let showArchitectureIndicator = false; diff --git a/Libraries/ReactNative/I18nManager.js b/Libraries/ReactNative/I18nManager.js index 1095ab81cdb3..fb4fe46857d4 100644 --- a/Libraries/ReactNative/I18nManager.js +++ b/Libraries/ReactNative/I18nManager.js @@ -18,11 +18,8 @@ const i18nConstants: {| function getI18nManagerConstants() { if (NativeI18nManager) { - const { - isRTL, - doLeftAndRightSwapInRTL, - localeIdentifier, - } = NativeI18nManager.getConstants(); + const {isRTL, doLeftAndRightSwapInRTL, localeIdentifier} = + NativeI18nManager.getConstants(); return {isRTL, doLeftAndRightSwapInRTL, localeIdentifier}; } diff --git a/Libraries/ReactNative/PaperUIManager.js b/Libraries/ReactNative/PaperUIManager.js index 87cc101db310..f3288c871b3a 100644 --- a/Libraries/ReactNative/PaperUIManager.js +++ b/Libraries/ReactNative/PaperUIManager.js @@ -38,9 +38,8 @@ function getViewManagerConfig(viewManagerName: string): any { NativeUIManager.getConstantsForViewManager ) { try { - viewManagerConfigs[ - viewManagerName - ] = NativeUIManager.getConstantsForViewManager(viewManagerName); + viewManagerConfigs[viewManagerName] = + NativeUIManager.getConstantsForViewManager(viewManagerName); } catch (e) { console.error( "NativeUIManager.getConstantsForViewManager('" + diff --git a/Libraries/ReactNative/RootTag.js b/Libraries/ReactNative/RootTag.js index 03c83a86af97..b41117a11410 100644 --- a/Libraries/ReactNative/RootTag.js +++ b/Libraries/ReactNative/RootTag.js @@ -13,9 +13,8 @@ import * as React from 'react'; // TODO: Make this into an opaque type. export opaque type RootTag = number; -export const RootTagContext: React$Context = React.createContext( - 0, -); +export const RootTagContext: React$Context = + React.createContext(0); if (__DEV__) { RootTagContext.displayName = 'RootTagContext'; diff --git a/Libraries/Storage/AsyncStorage.js b/Libraries/Storage/AsyncStorage.js index 15080dbc42c3..d254e8093f93 100644 --- a/Libraries/Storage/AsyncStorage.js +++ b/Libraries/Storage/AsyncStorage.js @@ -47,13 +47,13 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#getitem */ - getItem: function( + getItem: function ( key: string, callback?: ?(error: ?Error, result: ?string) => void, ): Promise { invariant(RCTAsyncStorage, 'RCTAsyncStorage not available'); return new Promise((resolve, reject) => { - RCTAsyncStorage.multiGet([key], function(errors, result) { + RCTAsyncStorage.multiGet([key], function (errors, result) { // Unpack result to get value from [[key,value]] const value = result && result[0] && result[0][1] ? result[0][1] : null; const errs = convertErrors(errors); @@ -72,14 +72,14 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#setitem */ - setItem: function( + setItem: function ( key: string, value: string, callback?: ?(error: ?Error) => void, ): Promise { invariant(RCTAsyncStorage, 'RCTAsyncStorage not available'); return new Promise((resolve, reject) => { - RCTAsyncStorage.multiSet([[key, value]], function(errors) { + RCTAsyncStorage.multiSet([[key, value]], function (errors) { const errs = convertErrors(errors); callback && callback(errs && errs[0]); if (errs) { @@ -96,13 +96,13 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#removeitem */ - removeItem: function( + removeItem: function ( key: string, callback?: ?(error: ?Error) => void, ): Promise { invariant(RCTAsyncStorage, 'RCTAsyncStorage not available'); return new Promise((resolve, reject) => { - RCTAsyncStorage.multiRemove([key], function(errors) { + RCTAsyncStorage.multiRemove([key], function (errors) { const errs = convertErrors(errors); callback && callback(errs && errs[0]); if (errs) { @@ -122,14 +122,14 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#mergeitem */ - mergeItem: function( + mergeItem: function ( key: string, value: string, callback?: ?(error: ?Error) => void, ): Promise { invariant(RCTAsyncStorage, 'RCTAsyncStorage not available'); return new Promise((resolve, reject) => { - RCTAsyncStorage.multiMerge([[key, value]], function(errors) { + RCTAsyncStorage.multiMerge([[key, value]], function (errors) { const errs = convertErrors(errors); callback && callback(errs && errs[0]); if (errs) { @@ -148,10 +148,10 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#clear */ - clear: function(callback?: ?(error: ?Error) => void): Promise { + clear: function (callback?: ?(error: ?Error) => void): Promise { invariant(RCTAsyncStorage, 'RCTAsyncStorage not available'); return new Promise((resolve, reject) => { - RCTAsyncStorage.clear(function(error) { + RCTAsyncStorage.clear(function (error) { callback && callback(convertError(error)); if (error && convertError(error)) { reject(convertError(error)); @@ -167,12 +167,12 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#getallkeys */ - getAllKeys: function( + getAllKeys: function ( callback?: ?(error: ?Error, keys: ?Array) => void, ): Promise> { invariant(RCTAsyncStorage, 'RCTAsyncStorage not available'); return new Promise((resolve, reject) => { - RCTAsyncStorage.getAllKeys(function(error, keys) { + RCTAsyncStorage.getAllKeys(function (error, keys) { callback && callback(convertError(error), keys); if (error) { reject(convertError(error)); @@ -198,7 +198,7 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#flushgetrequests * */ - flushGetRequests: function(): void { + flushGetRequests: function (): void { const getRequests = this._getRequests; const getKeys = this._getKeys; @@ -206,7 +206,7 @@ const AsyncStorage = { this._getKeys = []; invariant(RCTAsyncStorage, 'RCTAsyncStorage not available'); - RCTAsyncStorage.multiGet(getKeys, function(errors, result) { + RCTAsyncStorage.multiGet(getKeys, function (errors, result) { // Even though the runtime complexity of this is theoretically worse vs if we used a map, // it's much, much faster in practice for the data sets we deal with (we avoid // allocating result pair arrays). This was heavily benchmarked. @@ -237,7 +237,7 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#multiget */ - multiGet: function( + multiGet: function ( keys: Array, callback?: ?(errors: ?Array, result: ?Array>) => void, ): Promise>> { @@ -272,13 +272,13 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#multiset */ - multiSet: function( + multiSet: function ( keyValuePairs: Array>, callback?: ?(errors: ?Array) => void, ): Promise { invariant(RCTAsyncStorage, 'RCTAsyncStorage not available'); return new Promise((resolve, reject) => { - RCTAsyncStorage.multiSet(keyValuePairs, function(errors) { + RCTAsyncStorage.multiSet(keyValuePairs, function (errors) { const error = convertErrors(errors); callback && callback(error); if (error) { @@ -295,13 +295,13 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#multiremove */ - multiRemove: function( + multiRemove: function ( keys: Array, callback?: ?(errors: ?Array) => void, ): Promise { invariant(RCTAsyncStorage, 'RCTAsyncStorage not available'); return new Promise((resolve, reject) => { - RCTAsyncStorage.multiRemove(keys, function(errors) { + RCTAsyncStorage.multiRemove(keys, function (errors) { const error = convertErrors(errors); callback && callback(error); if (error) { @@ -321,13 +321,13 @@ const AsyncStorage = { * * See https://reactnative.dev/docs/asyncstorage.html#multimerge */ - multiMerge: function( + multiMerge: function ( keyValuePairs: Array>, callback?: ?(errors: ?Array) => void, ): Promise { invariant(RCTAsyncStorage, 'RCTAsyncStorage not available'); return new Promise((resolve, reject) => { - RCTAsyncStorage.multiMerge(keyValuePairs, function(errors) { + RCTAsyncStorage.multiMerge(keyValuePairs, function (errors) { const error = convertErrors(errors); callback && callback(error); if (error) { diff --git a/Libraries/StyleSheet/StyleSheet.js b/Libraries/StyleSheet/StyleSheet.js index 785fbfe199e3..208e49a9218e 100644 --- a/Libraries/StyleSheet/StyleSheet.js +++ b/Libraries/StyleSheet/StyleSheet.js @@ -74,7 +74,8 @@ export type ImageStyleProp = ____ImageStyleProp_Internal; * through to an underlying component. Using this is almost always a mistake * and using one of the other more restrictive types is likely the right choice. */ -export type DangerouslyImpreciseStyleProp = ____DangerouslyImpreciseStyleProp_Internal; +export type DangerouslyImpreciseStyleProp = + ____DangerouslyImpreciseStyleProp_Internal; /** * Utility type for getting the values for specific style keys. diff --git a/Libraries/StyleSheet/StyleSheetTypes.js b/Libraries/StyleSheet/StyleSheetTypes.js index 5a32873e3456..8b636caad80a 100644 --- a/Libraries/StyleSheet/StyleSheetTypes.js +++ b/Libraries/StyleSheet/StyleSheetTypes.js @@ -673,7 +673,7 @@ export type ____ImageStyleProp_Internal = GenericStyleProp< export type ____Styles_Internal = { +[key: string]: $Shape<____DangerouslyImpreciseStyle_Internal>, - ..., + ... }; export type ____FlattenStyleProp_Internal<+TStyleProp> = $Call< diff --git a/Libraries/StyleSheet/__tests__/normalizeColor-test.js b/Libraries/StyleSheet/__tests__/normalizeColor-test.js index f07498751e28..175cfb234472 100644 --- a/Libraries/StyleSheet/__tests__/normalizeColor-test.js +++ b/Libraries/StyleSheet/__tests__/normalizeColor-test.js @@ -22,10 +22,10 @@ it('forwards calls to @react-native/normalize-color', () => { describe('iOS', () => { if (OS === 'ios') { - const PlatformColor = require('../PlatformColorValueTypes.ios') - .PlatformColor; - const DynamicColorIOS = require('../PlatformColorValueTypesIOS.ios') - .DynamicColorIOS; + const PlatformColor = + require('../PlatformColorValueTypes.ios').PlatformColor; + const DynamicColorIOS = + require('../PlatformColorValueTypesIOS.ios').DynamicColorIOS; it('should normalize iOS PlatformColor colors', () => { const color = PlatformColor('systemRedColor'); @@ -79,8 +79,8 @@ describe('iOS', () => { describe('Android', () => { if (OS === 'android') { - const PlatformColor = require('../PlatformColorValueTypes.android') - .PlatformColor; + const PlatformColor = + require('../PlatformColorValueTypes.android').PlatformColor; it('should normalize Android PlatformColor colors', () => { const color = PlatformColor('?attr/colorPrimary'); diff --git a/Libraries/StyleSheet/__tests__/processColor-test.js b/Libraries/StyleSheet/__tests__/processColor-test.js index d428b854e8f5..eeb83fc7356c 100644 --- a/Libraries/StyleSheet/__tests__/processColor-test.js +++ b/Libraries/StyleSheet/__tests__/processColor-test.js @@ -13,12 +13,12 @@ const {OS} = require('../../Utilities/Platform'); const processColor = require('../processColor'); -const PlatformColorIOS = require('../PlatformColorValueTypes.ios') - .PlatformColor; -const DynamicColorIOS = require('../PlatformColorValueTypesIOS.ios') - .DynamicColorIOS; -const PlatformColorAndroid = require('../PlatformColorValueTypes.android') - .PlatformColor; +const PlatformColorIOS = + require('../PlatformColorValueTypes.ios').PlatformColor; +const DynamicColorIOS = + require('../PlatformColorValueTypesIOS.ios').DynamicColorIOS; +const PlatformColorAndroid = + require('../PlatformColorValueTypes.android').PlatformColor; const platformSpecific = OS === 'android' diff --git a/Libraries/StyleSheet/__tests__/processColorArray-test.js b/Libraries/StyleSheet/__tests__/processColorArray-test.js index 3ccc582a1166..a4d545d5f0a0 100644 --- a/Libraries/StyleSheet/__tests__/processColorArray-test.js +++ b/Libraries/StyleSheet/__tests__/processColorArray-test.js @@ -13,12 +13,12 @@ const {OS} = require('../../Utilities/Platform'); const processColorArray = require('../processColorArray'); -const PlatformColorIOS = require('../PlatformColorValueTypes.ios') - .PlatformColor; -const DynamicColorIOS = require('../PlatformColorValueTypesIOS.ios') - .DynamicColorIOS; -const PlatformColorAndroid = require('../PlatformColorValueTypes.android') - .PlatformColor; +const PlatformColorIOS = + require('../PlatformColorValueTypes.ios').PlatformColor; +const DynamicColorIOS = + require('../PlatformColorValueTypesIOS.ios').DynamicColorIOS; +const PlatformColorAndroid = + require('../PlatformColorValueTypes.android').PlatformColor; const platformSpecific = OS === 'android' @@ -70,11 +70,7 @@ describe('processColorArray', () => { const colors = ['red', '???', null, undefined, false]; const colorFromStringArray = processColorArray(colors); const expectedIntArray = [ - 0xffff0000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, + 0xffff0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, ].map(platformSpecific); expect(colorFromStringArray).toEqual(expectedIntArray); diff --git a/Libraries/StyleSheet/__tests__/setNormalizedColorAlpha-test.js b/Libraries/StyleSheet/__tests__/setNormalizedColorAlpha-test.js index bc400b56c94c..15b40d95e039 100644 --- a/Libraries/StyleSheet/__tests__/setNormalizedColorAlpha-test.js +++ b/Libraries/StyleSheet/__tests__/setNormalizedColorAlpha-test.js @@ -13,22 +13,22 @@ const setNormalizedColorAlpha = require('../setNormalizedColorAlpha'); const normalizeColor = require('../normalizeColor'); -describe('setNormalizedColorAlpha', function() { - it('should adjust the alpha of the color passed in', function() { +describe('setNormalizedColorAlpha', function () { + it('should adjust the alpha of the color passed in', function () { expect(setNormalizedColorAlpha(0xffffffff, 0.4)).toBe(0xffffff66); expect(setNormalizedColorAlpha(0x204080ff, 0.6)).toBe(0x20408099); }); - it('should clamp invalid input', function() { + it('should clamp invalid input', function () { expect(setNormalizedColorAlpha(0xffffffff, 1.5)).toBe(0xffffffff); expect(setNormalizedColorAlpha(0xffffffff, -1)).toBe(0xffffff00); }); - it("should ignore the color's original alpha", function() { + it("should ignore the color's original alpha", function () { expect(setNormalizedColorAlpha(0x204080aa, 0.8)).toBe(0x204080cc); }); - it('should return the original color when alpha is unchanged', function() { + it('should return the original color when alpha is unchanged', function () { const originalColor = normalizeColor('blue'); expect(setNormalizedColorAlpha(originalColor, 1)).toBe(originalColor); }); diff --git a/Libraries/StyleSheet/processColor.js b/Libraries/StyleSheet/processColor.js index 93a5c383540f..af24a1ecf528 100644 --- a/Libraries/StyleSheet/processColor.js +++ b/Libraries/StyleSheet/processColor.js @@ -31,8 +31,8 @@ function processColor(color?: ?(number | ColorValue)): ?ProcessedColorValue { } if (typeof normalizedColor === 'object') { - const processColorObject = require('./PlatformColorValueTypes') - .processColorObject; + const processColorObject = + require('./PlatformColorValueTypes').processColorObject; const processedColorObj = processColorObject(normalizedColor); diff --git a/Libraries/StyleSheet/splitLayoutProps.js b/Libraries/StyleSheet/splitLayoutProps.js index e871390a190f..092c69357484 100644 --- a/Libraries/StyleSheet/splitLayoutProps.js +++ b/Libraries/StyleSheet/splitLayoutProps.js @@ -10,9 +10,7 @@ import type {____ViewStyle_Internal} from './StyleSheetTypes'; -export default function splitLayoutProps( - props: ?____ViewStyle_Internal, -): { +export default function splitLayoutProps(props: ?____ViewStyle_Internal): { outer: ?____ViewStyle_Internal, inner: ?____ViewStyle_Internal, } { diff --git a/Libraries/Text/Text.js b/Libraries/Text/Text.js index 22474f0711fc..f57cb4eac7ed 100644 --- a/Libraries/Text/Text.js +++ b/Libraries/Text/Text.js @@ -71,7 +71,8 @@ const Text: React.AbstractComponent< setHighlighted(false); onPressOut?.(event); }, - onResponderTerminationRequest_DEPRECATED: onResponderTerminationRequest, + onResponderTerminationRequest_DEPRECATED: + onResponderTerminationRequest, onStartShouldSetResponder_DEPRECATED: onStartShouldSetResponder, } : null, diff --git a/Libraries/Text/TextNativeComponent.js b/Libraries/Text/TextNativeComponent.js index 1263d953bb34..da238a1222a5 100644 --- a/Libraries/Text/TextNativeComponent.js +++ b/Libraries/Text/TextNativeComponent.js @@ -21,9 +21,8 @@ type NativeTextProps = $ReadOnly<{ selectionColor?: ?ProcessedColorValue, }>; -export const NativeText: HostComponent = (createReactNativeComponentClass( - 'RCTText', - () => ({ +export const NativeText: HostComponent = + (createReactNativeComponentClass('RCTText', () => ({ validAttributes: { ...ReactNativeViewAttributes.UIView, isHighlighted: true, @@ -51,8 +50,7 @@ export const NativeText: HostComponent = (createReactNativeComp }, }, uiViewClassName: 'RCTText', - }), -): any); + })): any); export const NativeVirtualText: HostComponent = !global.RN$Bridgeless && !UIManager.hasViewManagerConfig('RCTVirtualText') diff --git a/Libraries/Utilities/Appearance.js b/Libraries/Utilities/Appearance.js index ea4c26ac7b33..b66bb92116b4 100644 --- a/Libraries/Utilities/Appearance.js +++ b/Libraries/Utilities/Appearance.js @@ -30,11 +30,12 @@ type NativeAppearanceEventDefinitions = { }; if (NativeAppearance) { - const nativeEventEmitter = new NativeEventEmitter( - // T88715063: NativeEventEmitter only used this parameter on iOS. Now it uses it on all platforms, so this code was modified automatically to preserve its behavior - // If you want to use the native module on other platforms, please remove this condition and test its behavior - Platform.OS !== 'ios' ? null : NativeAppearance, - ); + const nativeEventEmitter = + new NativeEventEmitter( + // T88715063: NativeEventEmitter only used this parameter on iOS. Now it uses it on all platforms, so this code was modified automatically to preserve its behavior + // If you want to use the native module on other platforms, please remove this condition and test its behavior + Platform.OS !== 'ios' ? null : NativeAppearance, + ); nativeEventEmitter.addListener( 'appearanceChanged', (newAppearance: AppearancePreferences) => { diff --git a/Libraries/Utilities/BackHandler.android.js b/Libraries/Utilities/BackHandler.android.js index b4c14b1d783e..0f2bcb5e4a37 100644 --- a/Libraries/Utilities/BackHandler.android.js +++ b/Libraries/Utilities/BackHandler.android.js @@ -17,7 +17,7 @@ type BackPressEventName = 'backPress' | 'hardwareBackPress'; const _backPressSubscriptions = []; -RCTDeviceEventEmitter.addListener(DEVICE_BACK_EVENT, function() { +RCTDeviceEventEmitter.addListener(DEVICE_BACK_EVENT, function () { for (let i = _backPressSubscriptions.length - 1; i >= 0; i--) { if (_backPressSubscriptions[i]()) { return; @@ -65,7 +65,7 @@ type TBackHandler = {| ) => void, |}; const BackHandler: TBackHandler = { - exitApp: function(): void { + exitApp: function (): void { if (!NativeDeviceEventManager) { return; } @@ -78,7 +78,7 @@ const BackHandler: TBackHandler = { * * - `hardwareBackPress`: Fires when the Android hardware back button is pressed. */ - addEventListener: function( + addEventListener: function ( eventName: BackPressEventName, handler: () => ?boolean, ): {remove: () => void, ...} { @@ -93,7 +93,7 @@ const BackHandler: TBackHandler = { /** * Removes the event handler. */ - removeEventListener: function( + removeEventListener: function ( eventName: BackPressEventName, handler: () => ?boolean, ): void { diff --git a/Libraries/Utilities/HMRClient.js b/Libraries/Utilities/HMRClient.js index e1d8f56c49ab..30953b16182b 100644 --- a/Libraries/Utilities/HMRClient.js +++ b/Libraries/Utilities/HMRClient.js @@ -308,8 +308,8 @@ function dismissRedbox() { ) { NativeRedBox.dismiss(); } else { - const NativeExceptionsManager = require('../Core/NativeExceptionsManager') - .default; + const NativeExceptionsManager = + require('../Core/NativeExceptionsManager').default; NativeExceptionsManager && NativeExceptionsManager.dismissRedbox && NativeExceptionsManager.dismissRedbox(); diff --git a/Libraries/Utilities/JSDevSupportModule.js b/Libraries/Utilities/JSDevSupportModule.js index 396f1a2fb81d..c0d0b773fbfb 100644 --- a/Libraries/Utilities/JSDevSupportModule.js +++ b/Libraries/Utilities/JSDevSupportModule.js @@ -12,13 +12,12 @@ import NativeJSDevSupport from './NativeJSDevSupport'; const ReactNative = require('../Renderer/shims/ReactNative'); const JSDevSupportModule = { - getJSHierarchy: function(tag: number) { + getJSHierarchy: function (tag: number) { if (NativeJSDevSupport) { const constants = NativeJSDevSupport.getConstants(); try { - const { - computeComponentStackForErrorReporting, - } = ReactNative.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + const {computeComponentStackForErrorReporting} = + ReactNative.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; const componentStack = computeComponentStackForErrorReporting(tag); if (!componentStack) { NativeJSDevSupport.onFailure( diff --git a/Libraries/Utilities/MatrixMath.js b/Libraries/Utilities/MatrixMath.js index d2d6421106b5..aa25bf63c487 100755 --- a/Libraries/Utilities/MatrixMath.js +++ b/Libraries/Utilities/MatrixMath.js @@ -17,11 +17,11 @@ const invariant = require('invariant'); * matrices, which are reusable. */ const MatrixMath = { - createIdentityMatrix: function() { + createIdentityMatrix: function () { return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; }, - createCopy: function(m) { + createCopy: function (m) { return [ m[0], m[1], @@ -42,7 +42,7 @@ const MatrixMath = { ]; }, - createOrthographic: function(left, right, bottom, top, near, far) { + createOrthographic: function (left, right, bottom, top, near, far) { const a = 2 / (right - left); const b = 2 / (top - bottom); const c = -2 / (far - near); @@ -54,7 +54,7 @@ const MatrixMath = { return [a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, 0, tx, ty, tz, 1]; }, - createFrustum: function(left, right, bottom, top, near, far) { + createFrustum: function (left, right, bottom, top, near, far) { const r_width = 1 / (right - left); const r_height = 1 / (top - bottom); const r_depth = 1 / (near - far); @@ -73,7 +73,7 @@ const MatrixMath = { * * @param fovInRadians - field of view in radians */ - createPerspective: function(fovInRadians, aspect, near, far) { + createPerspective: function (fovInRadians, aspect, near, far) { const h = 1 / Math.tan(fovInRadians / 2); const r_depth = 1 / (near - far); const C = (far + near) * r_depth; @@ -81,41 +81,41 @@ const MatrixMath = { return [h / aspect, 0, 0, 0, 0, h, 0, 0, 0, 0, C, -1, 0, 0, D, 0]; }, - createTranslate2d: function(x, y) { + createTranslate2d: function (x, y) { const mat = MatrixMath.createIdentityMatrix(); MatrixMath.reuseTranslate2dCommand(mat, x, y); return mat; }, - reuseTranslate2dCommand: function(matrixCommand, x, y) { + reuseTranslate2dCommand: function (matrixCommand, x, y) { matrixCommand[12] = x; matrixCommand[13] = y; }, - reuseTranslate3dCommand: function(matrixCommand, x, y, z) { + reuseTranslate3dCommand: function (matrixCommand, x, y, z) { matrixCommand[12] = x; matrixCommand[13] = y; matrixCommand[14] = z; }, - createScale: function(factor) { + createScale: function (factor) { const mat = MatrixMath.createIdentityMatrix(); MatrixMath.reuseScaleCommand(mat, factor); return mat; }, - reuseScaleCommand: function(matrixCommand, factor) { + reuseScaleCommand: function (matrixCommand, factor) { matrixCommand[0] = factor; matrixCommand[5] = factor; }, - reuseScale3dCommand: function(matrixCommand, x, y, z) { + reuseScale3dCommand: function (matrixCommand, x, y, z) { matrixCommand[0] = x; matrixCommand[5] = y; matrixCommand[10] = z; }, - reusePerspectiveCommand: function(matrixCommand, p) { + reusePerspectiveCommand: function (matrixCommand, p) { matrixCommand[11] = -1 / p; }, @@ -131,14 +131,14 @@ const MatrixMath = { matrixCommand[10] = factor; }, - reuseRotateXCommand: function(matrixCommand, radians) { + reuseRotateXCommand: function (matrixCommand, radians) { matrixCommand[5] = Math.cos(radians); matrixCommand[6] = Math.sin(radians); matrixCommand[9] = -Math.sin(radians); matrixCommand[10] = Math.cos(radians); }, - reuseRotateYCommand: function(matrixCommand, amount) { + reuseRotateYCommand: function (matrixCommand, amount) { matrixCommand[0] = Math.cos(amount); matrixCommand[2] = -Math.sin(amount); matrixCommand[8] = Math.sin(amount); @@ -146,28 +146,28 @@ const MatrixMath = { }, // http://www.w3.org/TR/css3-transforms/#recomposing-to-a-2d-matrix - reuseRotateZCommand: function(matrixCommand, radians) { + reuseRotateZCommand: function (matrixCommand, radians) { matrixCommand[0] = Math.cos(radians); matrixCommand[1] = Math.sin(radians); matrixCommand[4] = -Math.sin(radians); matrixCommand[5] = Math.cos(radians); }, - createRotateZ: function(radians) { + createRotateZ: function (radians) { const mat = MatrixMath.createIdentityMatrix(); MatrixMath.reuseRotateZCommand(mat, radians); return mat; }, - reuseSkewXCommand: function(matrixCommand, radians) { + reuseSkewXCommand: function (matrixCommand, radians) { matrixCommand[4] = Math.tan(radians); }, - reuseSkewYCommand: function(matrixCommand, radians) { + reuseSkewYCommand: function (matrixCommand, radians) { matrixCommand[1] = Math.tan(radians); }, - multiplyInto: function(out, a, b) { + multiplyInto: function (out, a, b) { const a00 = a[0], a01 = a[1], a02 = a[2], diff --git a/Libraries/Utilities/PerformanceLoggerContext.js b/Libraries/Utilities/PerformanceLoggerContext.js index 92b777880990..934147902c8d 100644 --- a/Libraries/Utilities/PerformanceLoggerContext.js +++ b/Libraries/Utilities/PerformanceLoggerContext.js @@ -19,9 +19,8 @@ import type {IPerformanceLogger} from './createPerformanceLogger'; * should be available in every component. * See React docs about using Context: https://reactjs.org/docs/context.html */ -const PerformanceLoggerContext: React.Context = React.createContext( - GlobalPerformanceLogger, -); +const PerformanceLoggerContext: React.Context = + React.createContext(GlobalPerformanceLogger); if (__DEV__) { PerformanceLoggerContext.displayName = 'PerformanceLoggerContext'; } diff --git a/Libraries/Utilities/SceneTracker.js b/Libraries/Utilities/SceneTracker.js index 23b0c7dcae39..ce078ec6f90d 100644 --- a/Libraries/Utilities/SceneTracker.js +++ b/Libraries/Utilities/SceneTracker.js @@ -26,9 +26,10 @@ const SceneTracker = { return _activeScene; }, - addActiveSceneChangedListener( - callback: (scene: Scene) => void, - ): {remove: () => void, ...} { + addActiveSceneChangedListener(callback: (scene: Scene) => void): { + remove: () => void, + ... + } { _listeners.push(callback); return { remove: () => { diff --git a/Libraries/Utilities/__mocks__/BackHandler.js b/Libraries/Utilities/__mocks__/BackHandler.js index b90bf09d870f..ba8b111722d9 100644 --- a/Libraries/Utilities/__mocks__/BackHandler.js +++ b/Libraries/Utilities/__mocks__/BackHandler.js @@ -14,7 +14,7 @@ const _backPressSubscriptions = new Set(); const BackHandler = { exitApp: jest.fn(), - addEventListener: function( + addEventListener: function ( eventName: BackPressEventName, handler: () => ?boolean, ): {remove: () => void} { @@ -24,14 +24,14 @@ const BackHandler = { }; }, - removeEventListener: function( + removeEventListener: function ( eventName: BackPressEventName, handler: () => ?boolean, ): void { _backPressSubscriptions.delete(handler); }, - mockPressBack: function() { + mockPressBack: function () { let invokeDefault = true; const subscriptions = [..._backPressSubscriptions].reverse(); for (let i = 0; i < subscriptions.length; ++i) { diff --git a/Libraries/Utilities/__tests__/MatrixMath-test.js b/Libraries/Utilities/__tests__/MatrixMath-test.js index f6b62319946e..3b657ccb642d 100644 --- a/Libraries/Utilities/__tests__/MatrixMath-test.js +++ b/Libraries/Utilities/__tests__/MatrixMath-test.js @@ -24,22 +24,7 @@ describe('MatrixMath', () => { it('decomposes a 4x4 matrix to produce accurate Z-axis angles', () => { expect( MatrixMath.decomposeMatrix([ - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, ]).rotationDegrees, ).toEqual([0, 0, 0]); @@ -140,17 +125,13 @@ describe('MatrixMath', () => { mat = MatrixMath.createIdentityMatrix(); MatrixMath.reuseRotateYCommand(mat, degreesToRadians(222)); expect(MatrixMath.decomposeMatrix(mat).rotationDegrees).toEqual([ - 0, - -138, - 0, + 0, -138, 0, ]); mat = MatrixMath.createIdentityMatrix(); MatrixMath.reuseRotateYCommand(mat, degreesToRadians(270)); expect(MatrixMath.decomposeMatrix(mat).rotationDegrees).toEqual([ - 0, - -90, - 0, + 0, -90, 0, ]); mat = MatrixMath.createIdentityMatrix(); @@ -173,17 +154,13 @@ describe('MatrixMath', () => { mat = MatrixMath.createIdentityMatrix(); MatrixMath.reuseRotateXCommand(mat, degreesToRadians(222)); expect(MatrixMath.decomposeMatrix(mat).rotationDegrees).toEqual([ - -138, - 0, - 0, + -138, 0, 0, ]); mat = MatrixMath.createIdentityMatrix(); MatrixMath.reuseRotateXCommand(mat, degreesToRadians(270)); expect(MatrixMath.decomposeMatrix(mat).rotationDegrees).toEqual([ - -90, - 0, - 0, + -90, 0, 0, ]); mat = MatrixMath.createIdentityMatrix(); diff --git a/Libraries/Utilities/__tests__/SceneTracker-test.js b/Libraries/Utilities/__tests__/SceneTracker-test.js index 909da1685aaf..b3530bf7638f 100644 --- a/Libraries/Utilities/__tests__/SceneTracker-test.js +++ b/Libraries/Utilities/__tests__/SceneTracker-test.js @@ -12,8 +12,8 @@ const SceneTracker = require('../SceneTracker'); -describe('setActiveScene', function() { - it('can handle multiple listeners and unsubscribe', function() { +describe('setActiveScene', function () { + it('can handle multiple listeners and unsubscribe', function () { const listeners = [jest.fn(), jest.fn(), jest.fn()]; const subscriptions = listeners.map(listener => SceneTracker.addActiveSceneChangedListener(listener), diff --git a/Libraries/Utilities/__tests__/buildStyleInterpolator-test.js b/Libraries/Utilities/__tests__/buildStyleInterpolator-test.js index ef5cc10d42d3..2c0a597086a8 100644 --- a/Libraries/Utilities/__tests__/buildStyleInterpolator-test.js +++ b/Libraries/Utilities/__tests__/buildStyleInterpolator-test.js @@ -12,7 +12,7 @@ const buildStyleInterpolator = require('../buildStyleInterpolator'); -const validateEmpty = function(interpolator, value, validator) { +const validateEmpty = function (interpolator, value, validator) { const emptyObject = {}; let changed = interpolator(emptyObject, value); validator(emptyObject); @@ -20,8 +20,8 @@ const validateEmpty = function(interpolator, value, validator) { changed = interpolator(emptyObject, value); expect(changed).toBe(false); }; -describe('buildStyleInterpolator', function() { - it('should linearly interpolate without extrapolating', function() { +describe('buildStyleInterpolator', function () { + it('should linearly interpolate without extrapolating', function () { const testAnim = { opacity: { from: 100, @@ -45,35 +45,35 @@ describe('buildStyleInterpolator', function() { }, }; const interpolator = buildStyleInterpolator(testAnim); - validateEmpty(interpolator, 0, function(res) { + validateEmpty(interpolator, 0, function (res) { expect(res).toEqual({ opacity: 100, left: 200, top: 23.5, }); }); - validateEmpty(interpolator, 1, function(res) { + validateEmpty(interpolator, 1, function (res) { expect(res).toEqual({ opacity: 200, left: 300, top: 23.5, }); }); - validateEmpty(interpolator, -0.1, function(res) { + validateEmpty(interpolator, -0.1, function (res) { expect(res).toEqual({ opacity: 100, left: 200, top: 23.5, }); }); - validateEmpty(interpolator, 1.1, function(res) { + validateEmpty(interpolator, 1.1, function (res) { expect(res).toEqual({ opacity: 200, left: 300, top: 23.5, }); }); - validateEmpty(interpolator, 0.5, function(res) { + validateEmpty(interpolator, 0.5, function (res) { expect(res).toEqual({ opacity: 150, left: 250, @@ -81,7 +81,7 @@ describe('buildStyleInterpolator', function() { }); }); }); - it('should linearly interpolate with extrapolating', function() { + it('should linearly interpolate with extrapolating', function () { const testAnim = { opacity: { from: 100, @@ -107,35 +107,35 @@ describe('buildStyleInterpolator', function() { }, }; const interpolator = buildStyleInterpolator(testAnim); - validateEmpty(interpolator, 0, function(res) { + validateEmpty(interpolator, 0, function (res) { expect(res).toEqual({ opacity: 100, left: 200, top: 23.5, }); }); - validateEmpty(interpolator, 1, function(res) { + validateEmpty(interpolator, 1, function (res) { expect(res).toEqual({ opacity: 200, left: 300, top: 23.5, }); }); - validateEmpty(interpolator, -0.1, function(res) { + validateEmpty(interpolator, -0.1, function (res) { expect(res).toEqual({ opacity: 90, left: 190, top: 23.5, }); }); - validateEmpty(interpolator, 1.1, function(res) { + validateEmpty(interpolator, 1.1, function (res) { expect(res).toEqual({ opacity: 210, left: 310, top: 23.5, }); }); - validateEmpty(interpolator, 0.5, function(res) { + validateEmpty(interpolator, 0.5, function (res) { expect(res).toEqual({ opacity: 150, left: 250, @@ -143,7 +143,7 @@ describe('buildStyleInterpolator', function() { }); }); }); - it('should round accordingly', function() { + it('should round accordingly', function () { const testAnim = { opacity: { from: 0, @@ -156,38 +156,38 @@ describe('buildStyleInterpolator', function() { }, }; const interpolator = buildStyleInterpolator(testAnim); - validateEmpty(interpolator, 0, function(res) { + validateEmpty(interpolator, 0, function (res) { expect(res).toEqual({ opacity: 0, }); }); - validateEmpty(interpolator, 0.5, function(res) { + validateEmpty(interpolator, 0.5, function (res) { expect(res).toEqual({ opacity: 0.5, }); }); - validateEmpty(interpolator, 0.4, function(res) { + validateEmpty(interpolator, 0.4, function (res) { expect(res).toEqual({ opacity: 0.5, }); }); - validateEmpty(interpolator, 0.26, function(res) { + validateEmpty(interpolator, 0.26, function (res) { expect(res).toEqual({ opacity: 0.5, }); }); - validateEmpty(interpolator, 0.74, function(res) { + validateEmpty(interpolator, 0.74, function (res) { expect(res).toEqual({ opacity: 0.5, }); }); - validateEmpty(interpolator, 0.76, function(res) { + validateEmpty(interpolator, 0.76, function (res) { expect(res).toEqual({ opacity: 1.0, }); }); }); - it('should detect changes correctly', function() { + it('should detect changes correctly', function () { const testAnim = { opacity: { from: 0, @@ -228,7 +228,7 @@ describe('buildStyleInterpolator', function() { }); expect(res).toBe(false); }); - it('should handle identity', function() { + it('should handle identity', function () { const testAnim = { opacity: { type: 'identity', @@ -249,7 +249,7 @@ describe('buildStyleInterpolator', function() { }); expect(res).toBe(false); }); - it('should translate', function() { + it('should translate', function () { const testAnim = { transformTranslate: { from: {x: 1, y: 10, z: 100}, @@ -271,7 +271,7 @@ describe('buildStyleInterpolator', function() { }); expect(res).toBe(true); }); - it('should scale', function() { + it('should scale', function () { const testAnim = { transformScale: { from: {x: 1, y: 10, z: 100}, @@ -293,7 +293,7 @@ describe('buildStyleInterpolator', function() { }); expect(res).toBe(true); }); - it('should combine scale and translate', function() { + it('should combine scale and translate', function () { const testAnim = { transformScale: { from: {x: 1, y: 10, z: 100}, @@ -322,7 +322,7 @@ describe('buildStyleInterpolator', function() { }); expect(res).toBe(true); }); - it('should step', function() { + it('should step', function () { const testAnim = { opacity: { threshold: 13, diff --git a/Libraries/Utilities/__tests__/deepFreezeAndThrowOnMutationInDev-test.js b/Libraries/Utilities/__tests__/deepFreezeAndThrowOnMutationInDev-test.js index b813f2fbbd53..65cf9cd6b218 100644 --- a/Libraries/Utilities/__tests__/deepFreezeAndThrowOnMutationInDev-test.js +++ b/Libraries/Utilities/__tests__/deepFreezeAndThrowOnMutationInDev-test.js @@ -10,7 +10,7 @@ const deepFreezeAndThrowOnMutationInDev = require('../deepFreezeAndThrowOnMutationInDev'); -describe('deepFreezeAndThrowOnMutationInDev', function() { +describe('deepFreezeAndThrowOnMutationInDev', function () { it('should be a noop on non object values', () => { __DEV__ = true; expect(() => deepFreezeAndThrowOnMutationInDev('')).not.toThrow(); diff --git a/Libraries/Utilities/__tests__/mapWithSeparator-test.js b/Libraries/Utilities/__tests__/mapWithSeparator-test.js index 1adbc2bcb152..e1743c6c750e 100644 --- a/Libraries/Utilities/__tests__/mapWithSeparator-test.js +++ b/Libraries/Utilities/__tests__/mapWithSeparator-test.js @@ -17,10 +17,10 @@ describe('mapWithSeparator', () => { const array = [1, 2, 3]; const result = mapWithSeparator( array, - function(value) { + function (value) { return value * 2; }, - function() { + function () { return 0; }, ); @@ -31,10 +31,10 @@ describe('mapWithSeparator', () => { const array = [1, 2, 3]; const result = mapWithSeparator( array, - function(value, index) { + function (value, index) { return index; }, - function(index) { + function (index) { return index; }, ); @@ -45,10 +45,10 @@ describe('mapWithSeparator', () => { const array = [3, 2, 1]; const result = mapWithSeparator( array, - function(value, index, arr) { + function (value, index, arr) { return arr[index]; }, - function(index) { + function (index) { return index; }, ); @@ -59,10 +59,10 @@ describe('mapWithSeparator', () => { const array = []; const result = mapWithSeparator( array, - function(value) { + function (value) { return value * 2; }, - function() { + function () { return 0; }, ); diff --git a/Libraries/Utilities/__tests__/stringifySafe-test.js b/Libraries/Utilities/__tests__/stringifySafe-test.js index f6cb307cf223..00aac657bad7 100644 --- a/Libraries/Utilities/__tests__/stringifySafe-test.js +++ b/Libraries/Utilities/__tests__/stringifySafe-test.js @@ -25,7 +25,7 @@ describe('stringifySafe', () => { }); it('stringifySafe stringifies function values', () => { - expect(stringifySafe(function() {})).toEqual('function () {}'); + expect(stringifySafe(function () {})).toEqual('function () {}'); }); it('stringifySafe stringifies non-circular objects', () => { diff --git a/Libraries/Utilities/__tests__/useMergeRefs-test.js b/Libraries/Utilities/__tests__/useMergeRefs-test.js index 73627f3ee70f..6aa105a5b8a8 100644 --- a/Libraries/Utilities/__tests__/useMergeRefs-test.js +++ b/Libraries/Utilities/__tests__/useMergeRefs-test.js @@ -66,9 +66,11 @@ function mockRefRegistry(): { } { const registry = []; return { - mockCallbackRef: (name: string): (T => mixed) => current => { - registry.push({[name]: TestViewInstance.fromValue(current)}); - }, + mockCallbackRef: + (name: string): (T => mixed) => + current => { + registry.push({[name]: TestViewInstance.fromValue(current)}); + }, mockObjectRef: (name: string): {current: T, ...} => ({ // $FlowIgnore[unsafe-getters-setters] - Intentional. set current(current) { diff --git a/Libraries/Utilities/__tests__/verifyComponentAttributeEquivalence-test.js b/Libraries/Utilities/__tests__/verifyComponentAttributeEquivalence-test.js index 43a507335d39..6ba3bf70b841 100644 --- a/Libraries/Utilities/__tests__/verifyComponentAttributeEquivalence-test.js +++ b/Libraries/Utilities/__tests__/verifyComponentAttributeEquivalence-test.js @@ -12,8 +12,8 @@ jest.dontMock('../verifyComponentAttributeEquivalence'); -const verifyComponentAttributeEquivalence = require('../verifyComponentAttributeEquivalence') - .default; +const verifyComponentAttributeEquivalence = + require('../verifyComponentAttributeEquivalence').default; const TestComponentNativeViewConfig = { uiViewClassName: 'TestComponent', diff --git a/Libraries/Utilities/buildStyleInterpolator.js b/Libraries/Utilities/buildStyleInterpolator.js index ed86a32df6bc..b647ed0f1a70 100644 --- a/Libraries/Utilities/buildStyleInterpolator.js +++ b/Libraries/Utilities/buildStyleInterpolator.js @@ -19,7 +19,7 @@ const InitialOperationField = { }; const InterpolateMatrix = { - transformScale: function(mat, x, y, z) { + transformScale: function (mat, x, y, z) { mat[0] = mat[0] * x; mat[1] = mat[1] * x; mat[2] = mat[2] * x; @@ -33,7 +33,7 @@ const InterpolateMatrix = { mat[10] = mat[10] * z; mat[11] = mat[11] * z; }, - transformTranslate: function(mat, x, y, z) { + transformTranslate: function (mat, x, y, z) { mat[12] = mat[0] * x + mat[4] * y + mat[8] * z + mat[12]; mat[13] = mat[1] * x + mat[5] * y + mat[9] * z + mat[13]; mat[14] = mat[2] * x + mat[6] * y + mat[10] * z + mat[14]; @@ -41,7 +41,7 @@ const InterpolateMatrix = { }, }; -const computeNextValLinear = function(anim, from, to, value) { +const computeNextValLinear = function (anim, from, to, value) { const hasRoundRatio = 'round' in anim; const roundRatio = anim.round; let ratio = (value - anim.min) / (anim.max - anim.min); @@ -58,11 +58,11 @@ const computeNextValLinear = function(anim, from, to, value) { return nextVal; }; -const computeNextValLinearScalar = function(anim, value) { +const computeNextValLinearScalar = function (anim, value) { return computeNextValLinear(anim, anim.from, anim.to, value); }; -const setNextValAndDetectChange = function(result, name, nextVal, didChange) { +const setNextValAndDetectChange = function (result, name, nextVal, didChange) { if (!didChange) { const prevVal = result[name]; result[name] = nextVal; @@ -73,7 +73,7 @@ const setNextValAndDetectChange = function(result, name, nextVal, didChange) { return didChange; }; -const initIdentity = function(mat) { +const initIdentity = function (mat) { mat[0] = 1; mat[1] = 0; mat[2] = 0; @@ -92,7 +92,7 @@ const initIdentity = function(mat) { mat[15] = 1; }; -const computeNextMatrixOperationField = function( +const computeNextMatrixOperationField = function ( anim, name, dim, @@ -106,7 +106,7 @@ const computeNextMatrixOperationField = function( } }; -const computeTransform = function( +const computeTransform = function ( anim, name, value, @@ -169,7 +169,7 @@ const computeTransform = function( * @return {function} Function accepting style object, that mutates that style * object and returns a boolean describing if any update was actually applied. */ -const buildStyleInterpolator = function(anims) { +const buildStyleInterpolator = function (anims) { function styleInterpolator(result, value) { let didChange = false; let didMatrix = false; diff --git a/Libraries/Utilities/codegenNativeComponent.js b/Libraries/Utilities/codegenNativeComponent.js index 129de1ad44ad..eb1bf7f8ec25 100644 --- a/Libraries/Utilities/codegenNativeComponent.js +++ b/Libraries/Utilities/codegenNativeComponent.js @@ -43,8 +43,9 @@ function codegenNativeComponent( componentNameInUse = options.paperComponentNameDeprecated; } else { throw new Error( - `Failed to find native component for either ${componentName} or ${options.paperComponentNameDeprecated ?? - '(unknown)'}`, + `Failed to find native component for either ${componentName} or ${ + options.paperComponentNameDeprecated ?? '(unknown)' + }`, ); } } diff --git a/Libraries/Utilities/differ/__tests__/deepDiffer-test.js b/Libraries/Utilities/differ/__tests__/deepDiffer-test.js index d1a35a20589a..a18c3bf3cf04 100644 --- a/Libraries/Utilities/differ/__tests__/deepDiffer-test.js +++ b/Libraries/Utilities/differ/__tests__/deepDiffer-test.js @@ -12,7 +12,7 @@ const deepDiffer = require('../deepDiffer'); -describe('deepDiffer', function() { +describe('deepDiffer', function () { it('should diff primitives of the same type', () => { expect(deepDiffer(1, 2)).toBe(true); expect(deepDiffer(42, 42)).toBe(false); diff --git a/Libraries/Utilities/differ/__tests__/matricesDiffer-test.js b/Libraries/Utilities/differ/__tests__/matricesDiffer-test.js index 26cc35ce3f5b..9f740a498ce7 100644 --- a/Libraries/Utilities/differ/__tests__/matricesDiffer-test.js +++ b/Libraries/Utilities/differ/__tests__/matricesDiffer-test.js @@ -12,7 +12,7 @@ const matricesDiffer = require('../matricesDiffer'); -describe('matricesDiffer', function() { +describe('matricesDiffer', function () { it('diffs matrices with single element', () => { var x = [1]; var y = [2]; diff --git a/Libraries/Utilities/differ/deepDiffer.js b/Libraries/Utilities/differ/deepDiffer.js index ff8bd4628d13..d6dc88c8cb34 100644 --- a/Libraries/Utilities/differ/deepDiffer.js +++ b/Libraries/Utilities/differ/deepDiffer.js @@ -25,7 +25,7 @@ function unstable_setLogListeners(listeners: ?LogListeners) { /* * @returns {bool} true if different, false if equal */ -const deepDiffer = function( +const deepDiffer = function ( one: any, two: any, maxDepthOrOptions: Options | number = -1, diff --git a/Libraries/Utilities/differ/insetsDiffer.js b/Libraries/Utilities/differ/insetsDiffer.js index 48aa7cac3c80..89b0f33a739e 100644 --- a/Libraries/Utilities/differ/insetsDiffer.js +++ b/Libraries/Utilities/differ/insetsDiffer.js @@ -25,7 +25,7 @@ const dummyInsets = { bottom: undefined, }; -const insetsDiffer = function(one: Inset, two: Inset): boolean { +const insetsDiffer = function (one: Inset, two: Inset): boolean { one = one || dummyInsets; two = two || dummyInsets; return ( diff --git a/Libraries/Utilities/differ/matricesDiffer.js b/Libraries/Utilities/differ/matricesDiffer.js index 1726ad361e37..51bd170a03bd 100644 --- a/Libraries/Utilities/differ/matricesDiffer.js +++ b/Libraries/Utilities/differ/matricesDiffer.js @@ -18,7 +18,7 @@ * @param {MatrixMath.Matrix} two Second matrix. * @return {boolean} Whether or not the two matrices differ. */ -const matricesDiffer = function(one, two) { +const matricesDiffer = function (one, two) { if (one === two) { return false; } diff --git a/Libraries/Utilities/differ/pointsDiffer.js b/Libraries/Utilities/differ/pointsDiffer.js index 28d94a3b7064..7250ac9ecacb 100644 --- a/Libraries/Utilities/differ/pointsDiffer.js +++ b/Libraries/Utilities/differ/pointsDiffer.js @@ -18,7 +18,7 @@ type Point = { const dummyPoint = {x: undefined, y: undefined}; -const pointsDiffer = function(one: ?Point, two: ?Point): boolean { +const pointsDiffer = function (one: ?Point, two: ?Point): boolean { one = one || dummyPoint; two = two || dummyPoint; return one !== two && (one.x !== two.x || one.y !== two.y); diff --git a/Libraries/Utilities/differ/sizesDiffer.js b/Libraries/Utilities/differ/sizesDiffer.js index 63ab71d32437..6b38bf7d46e7 100644 --- a/Libraries/Utilities/differ/sizesDiffer.js +++ b/Libraries/Utilities/differ/sizesDiffer.js @@ -11,7 +11,7 @@ const dummySize = {width: undefined, height: undefined}; -const sizesDiffer = function(one, two) { +const sizesDiffer = function (one, two) { one = one || dummySize; two = two || dummySize; return one !== two && (one.width !== two.width || one.height !== two.height); diff --git a/Libraries/Utilities/logError.js b/Libraries/Utilities/logError.js index 45252c6d0f63..c8322d34a727 100644 --- a/Libraries/Utilities/logError.js +++ b/Libraries/Utilities/logError.js @@ -15,7 +15,7 @@ * `console.error` as a failure callback - it's not properly bound. If passes an * `Error` object, it will print the message and stack. */ -const logError = function(...args: $ReadOnlyArray) { +const logError = function (...args: $ReadOnlyArray) { if (args.length === 1 && args[0] instanceof Error) { const err = args[0]; console.error('Error: "' + err.message + '". Stack:\n' + err.stack); diff --git a/Libraries/Utilities/mergeIntoFast.js b/Libraries/Utilities/mergeIntoFast.js index 663f897ae5d5..5a1a27c2e235 100644 --- a/Libraries/Utilities/mergeIntoFast.js +++ b/Libraries/Utilities/mergeIntoFast.js @@ -17,7 +17,7 @@ * @param {object} one Object to assign to. * @param {object} two Object to assign from. */ -const mergeIntoFast = function(one: Object, two: Object): void { +const mergeIntoFast = function (one: Object, two: Object): void { for (const keyTwo in two) { one[keyTwo] = two[keyTwo]; } diff --git a/Libraries/Utilities/truncate.js b/Libraries/Utilities/truncate.js index fb3814b4a5ae..a06371a8052f 100644 --- a/Libraries/Utilities/truncate.js +++ b/Libraries/Utilities/truncate.js @@ -24,7 +24,7 @@ const defaultOptions = { }; // maxChars (including ellipsis) -const truncate = function( +const truncate = function ( str: ?string, maxChars: number, options?: truncateOptions, diff --git a/Libraries/Vibration/Vibration.js b/Libraries/Vibration/Vibration.js index 797928a7d3dc..dc3157462984 100644 --- a/Libraries/Vibration/Vibration.js +++ b/Libraries/Vibration/Vibration.js @@ -70,7 +70,7 @@ const Vibration = { * * See https://reactnative.dev/docs/vibration.html#vibrate */ - vibrate: function( + vibrate: function ( pattern: number | Array = _default_vibration_length, repeat: boolean = false, ) { @@ -100,7 +100,7 @@ const Vibration = { * * See https://reactnative.dev/docs/vibration.html#cancel */ - cancel: function() { + cancel: function () { if (Platform.OS === 'ios') { _vibrating = false; } else { diff --git a/Libraries/WebSocket/WebSocketInterceptor.js b/Libraries/WebSocket/WebSocketInterceptor.js index db8c7d215e10..0e4a78d630b4 100644 --- a/Libraries/WebSocket/WebSocketInterceptor.js +++ b/Libraries/WebSocket/WebSocketInterceptor.js @@ -142,7 +142,7 @@ const WebSocketInterceptor = { // Override `connect` method for all RCTWebSocketModule requests // to intercept the request url, protocols, options and socketId, // then pass them through the `connectCallback`. - NativeWebSocketModule.connect = function( + NativeWebSocketModule.connect = function ( url, protocols, options, @@ -156,7 +156,7 @@ const WebSocketInterceptor = { // Override `send` method for all RCTWebSocketModule requests to intercept // the data sent, then pass them through the `sendCallback`. - NativeWebSocketModule.send = function(data, socketId) { + NativeWebSocketModule.send = function (data, socketId) { if (sendCallback) { sendCallback(data, socketId); } @@ -165,7 +165,7 @@ const WebSocketInterceptor = { // Override `sendBinary` method for all RCTWebSocketModule requests to // intercept the data sent, then pass them through the `sendCallback`. - NativeWebSocketModule.sendBinary = function(data, socketId) { + NativeWebSocketModule.sendBinary = function (data, socketId) { if (sendCallback) { sendCallback(WebSocketInterceptor._arrayBufferToString(data), socketId); } @@ -174,7 +174,7 @@ const WebSocketInterceptor = { // Override `close` method for all RCTWebSocketModule requests to intercept // the close information, then pass them through the `closeCallback`. - NativeWebSocketModule.close = function() { + NativeWebSocketModule.close = function () { if (closeCallback) { if (arguments.length === 3) { closeCallback(arguments[0], arguments[1], arguments[2]); diff --git a/Libraries/WebSocket/__tests__/WebSocket-test.js b/Libraries/WebSocket/__tests__/WebSocket-test.js index 52d8fb5b375d..a2e30b66cc7b 100644 --- a/Libraries/WebSocket/__tests__/WebSocket-test.js +++ b/Libraries/WebSocket/__tests__/WebSocket-test.js @@ -20,7 +20,7 @@ jest.setMock('../../BatchedBridge/NativeModules', { const WebSocket = require('../WebSocket'); -describe('WebSocket', function() { +describe('WebSocket', function () { it('should have connection lifecycle constants defined on the class', () => { expect(WebSocket.CONNECTING).toEqual(0); }); diff --git a/Libraries/promiseRejectionTrackingOptions.js b/Libraries/promiseRejectionTrackingOptions.js index ac828127df58..caabab05e34b 100644 --- a/Libraries/promiseRejectionTrackingOptions.js +++ b/Libraries/promiseRejectionTrackingOptions.js @@ -10,7 +10,7 @@ import typeof {enable} from 'promise/setimmediate/rejection-tracking'; -type ExtractOptionsType =

((options?: ?P) => void) => P; +type ExtractOptionsType =

(((options?: ?P) => void)) => P; let rejectionTrackingOptions: $Call = { allRejections: true, diff --git a/ReactAndroid/src/androidTest/js/Asserts.js b/ReactAndroid/src/androidTest/js/Asserts.js index 2c9710fbd937..ea6eca6248f2 100644 --- a/ReactAndroid/src/androidTest/js/Asserts.js +++ b/ReactAndroid/src/androidTest/js/Asserts.js @@ -14,7 +14,7 @@ const {NativeModules} = require('react-native'); const {Assert} = NativeModules; const Asserts = { - assertEquals: function(expected, actual, msg) { + assertEquals: function (expected, actual, msg) { if (expected !== actual) { Assert.fail( msg || @@ -30,7 +30,7 @@ const Asserts = { Assert.success(); } }, - assertTrue: function(expr, msg) { + assertTrue: function (expr, msg) { Asserts.assertEquals(true, expr, msg); }, }; diff --git a/ReactAndroid/src/androidTest/js/CatalystRootViewTestModule.js b/ReactAndroid/src/androidTest/js/CatalystRootViewTestModule.js index dd02631da37e..c2adb598214c 100644 --- a/ReactAndroid/src/androidTest/js/CatalystRootViewTestModule.js +++ b/ReactAndroid/src/androidTest/js/CatalystRootViewTestModule.js @@ -41,7 +41,7 @@ class CatalystRootViewTestApp extends React.Component { } const ReactRootViewTestModule = { - setHeight: function(height) { + setHeight: function (height) { that.setState({height: height}); }, }; diff --git a/ReactAndroid/src/androidTest/js/MeasureLayoutTestModule.js b/ReactAndroid/src/androidTest/js/MeasureLayoutTestModule.js index dfca8095e2ae..4e3d342ba0c1 100644 --- a/ReactAndroid/src/androidTest/js/MeasureLayoutTestModule.js +++ b/ReactAndroid/src/androidTest/js/MeasureLayoutTestModule.js @@ -71,66 +71,66 @@ function shouldNotCallThisCallback() { const MeasureLayoutTestModule = { MeasureLayoutTestApp: MeasureLayoutTestApp, - verifyMeasureOnViewA: function() { - UIManager.measure(A, function(a, b, width, height, x, y) { + verifyMeasureOnViewA: function () { + UIManager.measure(A, function (a, b, width, height, x, y) { assertEquals(500, width); assertEquals(500, height); assertEquals(0, x); assertEquals(0, y); }); }, - verifyMeasureOnViewC: function() { - UIManager.measure(C, function(a, b, width, height, x, y) { + verifyMeasureOnViewC: function () { + UIManager.measure(C, function (a, b, width, height, x, y) { assertEquals(50, width); assertEquals(150, height); assertEquals(150, x); assertEquals(150, y); }); }, - verifyMeasureLayoutCRelativeToA: function() { - UIManager.measureLayout(C, A, shouldNotCallThisCallback, function( - x, - y, - width, - height, - ) { - assertEquals(50, width); - assertEquals(150, height); - assertEquals(150, x); - assertEquals(150, y); - }); + verifyMeasureLayoutCRelativeToA: function () { + UIManager.measureLayout( + C, + A, + shouldNotCallThisCallback, + function (x, y, width, height) { + assertEquals(50, width); + assertEquals(150, height); + assertEquals(150, x); + assertEquals(150, y); + }, + ); }, - verifyMeasureLayoutCRelativeToB: function() { - UIManager.measureLayout(C, B, shouldNotCallThisCallback, function( - x, - y, - width, - height, - ) { - assertEquals(50, width); - assertEquals(150, height); - assertEquals(100, x); - assertEquals(70, y); - }); + verifyMeasureLayoutCRelativeToB: function () { + UIManager.measureLayout( + C, + B, + shouldNotCallThisCallback, + function (x, y, width, height) { + assertEquals(50, width); + assertEquals(150, height); + assertEquals(100, x); + assertEquals(70, y); + }, + ); }, - verifyMeasureLayoutCRelativeToSelf: function() { - UIManager.measureLayout(C, C, shouldNotCallThisCallback, function( - x, - y, - width, - height, - ) { - assertEquals(50, width); - assertEquals(150, height); - assertEquals(0, x); - assertEquals(0, y); - }); + verifyMeasureLayoutCRelativeToSelf: function () { + UIManager.measureLayout( + C, + C, + shouldNotCallThisCallback, + function (x, y, width, height) { + assertEquals(50, width); + assertEquals(150, height); + assertEquals(0, x); + assertEquals(0, y); + }, + ); }, - verifyMeasureLayoutRelativeToParentOnViewA: function() { + verifyMeasureLayoutRelativeToParentOnViewA: function () { UIManager.measureLayoutRelativeToParent( A, shouldNotCallThisCallback, - function(x, y, width, height) { + function (x, y, width, height) { assertEquals(500, width); assertEquals(500, height); assertEquals(0, x); @@ -138,11 +138,11 @@ const MeasureLayoutTestModule = { }, ); }, - verifyMeasureLayoutRelativeToParentOnViewB: function() { + verifyMeasureLayoutRelativeToParentOnViewB: function () { UIManager.measureLayoutRelativeToParent( B, shouldNotCallThisCallback, - function(x, y, width, height) { + function (x, y, width, height) { assertEquals(200, width); assertEquals(300, height); assertEquals(50, x); @@ -150,11 +150,11 @@ const MeasureLayoutTestModule = { }, ); }, - verifyMeasureLayoutRelativeToParentOnViewC: function() { + verifyMeasureLayoutRelativeToParentOnViewC: function () { UIManager.measureLayoutRelativeToParent( C, shouldNotCallThisCallback, - function(x, y, width, height) { + function (x, y, width, height) { assertEquals(50, width); assertEquals(150, height); assertEquals(100, x); @@ -162,40 +162,40 @@ const MeasureLayoutTestModule = { }, ); }, - verifyMeasureLayoutDRelativeToB: function() { + verifyMeasureLayoutDRelativeToB: function () { UIManager.measureLayout( D, B, - function() { + function () { assertEquals(true, true); }, shouldNotCallThisCallback, ); }, - verifyMeasureLayoutNonExistentTag: function() { + verifyMeasureLayoutNonExistentTag: function () { UIManager.measureLayout( 192, A, - function() { + function () { assertEquals(true, true); }, shouldNotCallThisCallback, ); }, - verifyMeasureLayoutNonExistentAncestor: function() { + verifyMeasureLayoutNonExistentAncestor: function () { UIManager.measureLayout( B, 192, - function() { + function () { assertEquals(true, true); }, shouldNotCallThisCallback, ); }, - verifyMeasureLayoutRelativeToParentNonExistentTag: function() { + verifyMeasureLayoutRelativeToParentNonExistentTag: function () { UIManager.measureLayoutRelativeToParent( 192, - function() { + function () { assertEquals(true, true); }, shouldNotCallThisCallback, diff --git a/ReactAndroid/src/androidTest/js/ProgressBarTestModule.js b/ReactAndroid/src/androidTest/js/ProgressBarTestModule.js index 655c747ee7c3..42d85a20541a 100644 --- a/ReactAndroid/src/androidTest/js/ProgressBarTestModule.js +++ b/ReactAndroid/src/androidTest/js/ProgressBarTestModule.js @@ -40,7 +40,7 @@ class ProgressBarSampleApp extends React.Component { } const ProgressBarTestModule = { - renderProgressBarApplication: function(rootTag) { + renderProgressBarApplication: function (rootTag) { renderApplication(ProgressBarSampleApp, {}, rootTag); }, }; diff --git a/ReactAndroid/src/androidTest/js/ScrollViewTestModule.js b/ReactAndroid/src/androidTest/js/ScrollViewTestModule.js index 11ee033dc849..c138a80ddfc1 100644 --- a/ReactAndroid/src/androidTest/js/ScrollViewTestModule.js +++ b/ReactAndroid/src/androidTest/js/ScrollViewTestModule.js @@ -51,7 +51,7 @@ class Item extends React.Component { } } -const getInitialState = function() { +const getInitialState = function () { const data = []; for (let i = 0; i < NUM_ITEMS; i++) { data[i] = {text: 'Item ' + i + '!'}; @@ -61,28 +61,28 @@ const getInitialState = function() { }; }; -const onScroll = function(e) { +const onScroll = function (e) { ScrollListener.onScroll( e.nativeEvent.contentOffset.x, e.nativeEvent.contentOffset.y, ); }; -const onScrollBeginDrag = function(e) { +const onScrollBeginDrag = function (e) { ScrollListener.onScrollBeginDrag( e.nativeEvent.contentOffset.x, e.nativeEvent.contentOffset.y, ); }; -const onScrollEndDrag = function(e) { +const onScrollEndDrag = function (e) { ScrollListener.onScrollEndDrag( e.nativeEvent.contentOffset.x, e.nativeEvent.contentOffset.y, ); }; -const onItemPress = function(itemNumber) { +const onItemPress = function (itemNumber) { ScrollListener.onItemPress(itemNumber); }; diff --git a/ReactAndroid/src/androidTest/js/ShareTestModule.js b/ReactAndroid/src/androidTest/js/ShareTestModule.js index fc80b761a126..b1409298c63a 100644 --- a/ReactAndroid/src/androidTest/js/ShareTestModule.js +++ b/ReactAndroid/src/androidTest/js/ShareTestModule.js @@ -23,7 +23,7 @@ class ShareTestApp extends React.Component { const ShareTestModule = { ShareTestApp: ShareTestApp, - showShareDialog: function(content, options) { + showShareDialog: function (content, options) { Share.share(content, options).then( () => RecordingModule.recordOpened(), ({code, message}) => RecordingModule.recordError(), diff --git a/ReactAndroid/src/androidTest/js/SubviewsClippingTestModule.js b/ReactAndroid/src/androidTest/js/SubviewsClippingTestModule.js index ee2367f8b7cb..6ee56d3bf490 100644 --- a/ReactAndroid/src/androidTest/js/SubviewsClippingTestModule.js +++ b/ReactAndroid/src/androidTest/js/SubviewsClippingTestModule.js @@ -342,21 +342,21 @@ class SubviewsClippingTestApp extends React.Component { const SubviewsClippingTestModule = { App: SubviewsClippingTestApp, - renderClippingSample1: function() { + renderClippingSample1: function () { appInstance.setComponent(); }, - renderClippingSample2: function() { + renderClippingSample2: function () { appInstance.setComponent(); }, - renderUpdatingSample1: function(update1, update2) { + renderUpdatingSample1: function (update1, update2) { appInstance.setComponent( , ); }, - renderUpdatingSample2: function(update) { + renderUpdatingSample2: function (update) { appInstance.setComponent(); }, - renderScrollViewTest: function() { + renderScrollViewTest: function () { appInstance.setComponent(); }, }; diff --git a/ReactAndroid/src/androidTest/js/SwipeRefreshLayoutTestModule.js b/ReactAndroid/src/androidTest/js/SwipeRefreshLayoutTestModule.js index 2feb21e37e92..14f81bbb3dbc 100644 --- a/ReactAndroid/src/androidTest/js/SwipeRefreshLayoutTestModule.js +++ b/ReactAndroid/src/androidTest/js/SwipeRefreshLayoutTestModule.js @@ -77,7 +77,7 @@ class SwipeRefreshLayoutTestApp extends React.Component { const SwipeRefreshLayoutTestModule = { SwipeRefreshLayoutTestApp, - setRows: function(rows) { + setRows: function (rows) { if (app != null) { app.setState({rows}); } diff --git a/ReactAndroid/src/androidTest/js/TestJSLocaleModule.js b/ReactAndroid/src/androidTest/js/TestJSLocaleModule.js index 756846f97611..b15d1646bb0c 100644 --- a/ReactAndroid/src/androidTest/js/TestJSLocaleModule.js +++ b/ReactAndroid/src/androidTest/js/TestJSLocaleModule.js @@ -15,10 +15,10 @@ const BatchedBridge = require('react-native/Libraries/BatchedBridge/BatchedBridg const {Recording} = NativeModules; const TestJSLocaleModule = { - toUpper: function(s) { + toUpper: function (s) { Recording.record(s.toUpperCase()); }, - toLower: function(s) { + toLower: function (s) { Recording.record(s.toLowerCase()); }, }; diff --git a/ReactAndroid/src/androidTest/js/TestJSToJavaParametersModule.js b/ReactAndroid/src/androidTest/js/TestJSToJavaParametersModule.js index cf602236522b..6053ebf57f61 100644 --- a/ReactAndroid/src/androidTest/js/TestJSToJavaParametersModule.js +++ b/ReactAndroid/src/androidTest/js/TestJSToJavaParametersModule.js @@ -15,26 +15,26 @@ const BatchedBridge = require('react-native/Libraries/BatchedBridge/BatchedBridg const {Recording} = NativeModules; const TestJSToJavaParametersModule = { - returnBasicTypes: function() { + returnBasicTypes: function () { Recording.receiveBasicTypes('foo', 3.14, true, null); }, - returnBoxedTypes: function() { + returnBoxedTypes: function () { Recording.receiveBoxedTypes(42, 3.14, true); }, - returnDynamicTypes: function() { + returnDynamicTypes: function () { Recording.receiveDynamic('foo'); Recording.receiveDynamic(3.14); }, - returnArrayWithBasicTypes: function() { + returnArrayWithBasicTypes: function () { Recording.receiveArray(['foo', 3.14, -111, true, null]); }, - returnNestedArray: function() { + returnNestedArray: function () { Recording.receiveArray(['we', ['have', ['to', ['go', ['deeper']]]]]); }, - returnArrayWithMaps: function() { + returnArrayWithMaps: function () { Recording.receiveArray([{m1k1: 'm1v1', m1k2: 'm1v2'}, {m2k1: 'm2v1'}]); }, - returnMapWithBasicTypes: function() { + returnMapWithBasicTypes: function () { Recording.receiveMap({ stringKey: 'stringValue', doubleKey: 3.14, @@ -43,24 +43,24 @@ const TestJSToJavaParametersModule = { nullKey: null, }); }, - returnNestedMap: function() { + returnNestedMap: function () { Recording.receiveMap({ weHaveToGoDeeper: { inception: true, }, }); }, - returnMapWithArrays: function() { + returnMapWithArrays: function () { Recording.receiveMap({ empty: [], ints: [43, 44], mixed: [77, 'string', ['another', 'array']], }); }, - returnArrayWithStringDoubleIntMapArrayBooleanNull: function() { + returnArrayWithStringDoubleIntMapArrayBooleanNull: function () { Recording.receiveArray(['string', 3.14, 555, {}, [], true, null]); }, - returnMapWithStringDoubleIntMapArrayBooleanNull: function() { + returnMapWithStringDoubleIntMapArrayBooleanNull: function () { Recording.receiveMap({ string: 'string', double: 3, @@ -71,13 +71,13 @@ const TestJSToJavaParametersModule = { null: null, }); }, - returnArrayWithLargeInts: function() { + returnArrayWithLargeInts: function () { Recording.receiveArray([2147483648, -5555555555]); }, - returnMapWithLargeInts: function() { + returnMapWithLargeInts: function () { Recording.receiveMap({first: -2147483649, second: 5551231231}); }, - returnMapForMerge1: function() { + returnMapForMerge1: function () { Recording.receiveMap({ a: 1, b: 41, @@ -87,7 +87,7 @@ const TestJSToJavaParametersModule = { f: null, }); }, - returnMapForMerge2: function() { + returnMapForMerge2: function () { Recording.receiveMap({ a: 'overwrite', d: 77, @@ -96,7 +96,7 @@ const TestJSToJavaParametersModule = { newkey: 'newvalue', }); }, - returnMapWithMultibyteUTF8CharacterString: function() { + returnMapWithMultibyteUTF8CharacterString: function () { Recording.receiveMap({ 'one-byte': 'a', 'two-bytes': '\u00A2', @@ -106,7 +106,7 @@ const TestJSToJavaParametersModule = { '\u017C\u00F3\u0142\u0107 g\u0119\u015Bl\u0105 \u6211 \uD83D\uDE0E ja\u017A\u0107', }); }, - returnArrayWithMultibyteUTF8CharacterString: function() { + returnArrayWithMultibyteUTF8CharacterString: function () { Recording.receiveArray([ 'a', '\u00A2', diff --git a/ReactAndroid/src/androidTest/js/TestJavaToJSArgumentsModule.js b/ReactAndroid/src/androidTest/js/TestJavaToJSArgumentsModule.js index 9340844166a6..fc30e4bd1003 100644 --- a/ReactAndroid/src/androidTest/js/TestJavaToJSArgumentsModule.js +++ b/ReactAndroid/src/androidTest/js/TestJavaToJSArgumentsModule.js @@ -29,20 +29,20 @@ function assertStrictStringEquals(a, b) { } const TestJavaToJSArgumentsModule = { - receiveBasicTypes: function(str, dbl, bool, null_arg) { + receiveBasicTypes: function (str, dbl, bool, null_arg) { assertEquals('foo', str); assertEquals(3.14, dbl); assertEquals(true, bool); assertEquals(null, null_arg); }, - receiveArrayWithBasicTypes: function(arr) { + receiveArrayWithBasicTypes: function (arr) { assertEquals(4, arr.length); assertEquals('red panda', arr[0]); assertEquals(1.19, arr[1]); assertEquals(true, arr[2]); assertEquals(null, arr[3]); }, - receiveNestedArray: function(arr) { + receiveNestedArray: function (arr) { assertEquals(2, arr.length); assertEquals('level1', arr[0]); const arr2 = arr[1]; @@ -50,7 +50,7 @@ const TestJavaToJSArgumentsModule = { const arr3 = arr2[1]; assertEquals('level3', arr3[0]); }, - receiveArrayWithMaps: function(arr) { + receiveArrayWithMaps: function (arr) { assertEquals(2, arr.length); const m1 = arr[0]; const m2 = arr[1]; @@ -58,17 +58,17 @@ const TestJavaToJSArgumentsModule = { assertEquals('m1v2', m1.m1k2); assertEquals('m2v1', m2.m2k1); }, - receiveMapWithBasicTypes: function(map) { + receiveMapWithBasicTypes: function (map) { assertEquals('stringValue', map.stringKey); assertEquals(3.14, map.doubleKey); assertEquals(true, map.booleanKey); assertEquals(null, map.nullKey); }, - receiveNestedMap: function(map) { + receiveNestedMap: function (map) { const nestedMap = map.nestedMap; assertEquals('foxes', nestedMap.animals); }, - receiveMapWithArrays: function(map) { + receiveMapWithArrays: function (map) { const a1 = map.array1; const a2 = map.array2; assertEquals(3, a1.length); @@ -76,7 +76,7 @@ const TestJavaToJSArgumentsModule = { assertEquals(3, a1[0]); assertEquals(9, a2[1]); }, - receiveMapAndArrayWithNullValues: function(map, array) { + receiveMapAndArrayWithNullValues: function (map, array) { assertEquals(null, map.string); assertEquals(null, map.array); assertEquals(null, map.map); @@ -85,7 +85,7 @@ const TestJavaToJSArgumentsModule = { assertEquals(null, array[1]); assertEquals(null, array[2]); }, - receiveMapWithMultibyteUTF8CharacterString: function(map) { + receiveMapWithMultibyteUTF8CharacterString: function (map) { assertStrictStringEquals('\u00A2', map['two-bytes']); assertStrictStringEquals('\u20AC', map['three-bytes']); assertStrictStringEquals('\uD83D\uDE1C', map['four-bytes']); @@ -94,7 +94,7 @@ const TestJavaToJSArgumentsModule = { map.mixed, ); }, - receiveArrayWithMultibyteUTF8CharacterString: function(array) { + receiveArrayWithMultibyteUTF8CharacterString: function (array) { assertTrue(true); assertStrictStringEquals('\u00A2', array[0]); assertStrictStringEquals('\u20AC', array[1]); diff --git a/ReactAndroid/src/androidTest/js/TestJavaToJSReturnValuesModule.js b/ReactAndroid/src/androidTest/js/TestJavaToJSReturnValuesModule.js index 7cfac525898b..d6b00e3000eb 100644 --- a/ReactAndroid/src/androidTest/js/TestJavaToJSReturnValuesModule.js +++ b/ReactAndroid/src/androidTest/js/TestJavaToJSReturnValuesModule.js @@ -16,13 +16,13 @@ const {assertEquals, assertTrue} = require('./Asserts'); const {TestModule} = NativeModules; const TestJavaToJSReturnValuesModule = { - callMethod: function(methodName, expectedType, expectedJSON) { + callMethod: function (methodName, expectedType, expectedJSON) { const result = TestModule[methodName](); assertEquals(expectedType, typeof result); assertEquals(expectedJSON, JSON.stringify(result)); }, - triggerException: function() { + triggerException: function () { try { TestModule.triggerException(); } catch (ex) { diff --git a/ReactAndroid/src/androidTest/js/TextInputTestModule.js b/ReactAndroid/src/androidTest/js/TextInputTestModule.js index 606d1ffd24f9..82dd39772a4c 100644 --- a/ReactAndroid/src/androidTest/js/TextInputTestModule.js +++ b/ReactAndroid/src/androidTest/js/TextInputTestModule.js @@ -176,7 +176,7 @@ const styles = StyleSheet.create({ const TextInputTestModule = { TextInputTestApp, - setValueRef: function(ref, value) { + setValueRef: function (ref, value) { app.refs[ref].setNativeProps({ text: value, }); diff --git a/ReactAndroid/src/androidTest/js/ViewRenderingTestModule.js b/ReactAndroid/src/androidTest/js/ViewRenderingTestModule.js index f0806d7e4fe7..f004a4e8419e 100644 --- a/ReactAndroid/src/androidTest/js/ViewRenderingTestModule.js +++ b/ReactAndroid/src/androidTest/js/ViewRenderingTestModule.js @@ -64,19 +64,19 @@ class TransformSampleApp extends React.Component { } const ViewRenderingTestModule = { - renderViewApplication: function(rootTag) { + renderViewApplication: function (rootTag) { renderApplication(ViewSampleApp, {}, rootTag); }, - renderMarginApplication: function(rootTag) { + renderMarginApplication: function (rootTag) { renderApplication(MarginSampleApp, {}, rootTag); }, - renderBorderApplication: function(rootTag) { + renderBorderApplication: function (rootTag) { renderApplication(BorderSampleApp, {}, rootTag); }, - renderTransformApplication: function(rootTag) { + renderTransformApplication: function (rootTag) { renderApplication(TransformSampleApp, {}, rootTag); }, - updateMargins: function() { + updateMargins: function () { updateMargins(); }, }; diff --git a/ReactCommon/hermes/inspector/tools/msggen/src/HeaderWriter.js b/ReactCommon/hermes/inspector/tools/msggen/src/HeaderWriter.js index d217c2e86b4f..a5f951783ab9 100644 --- a/ReactCommon/hermes/inspector/tools/msggen/src/HeaderWriter.js +++ b/ReactCommon/hermes/inspector/tools/msggen/src/HeaderWriter.js @@ -70,7 +70,7 @@ export class HeaderWriter { this.stream.write('struct UnknownRequest;\n\n'); const namespaceMap: Map> = new Map(); - const addToMap = function(type) { + const addToMap = function (type) { const domain = type.domain; let types = namespaceMap.get(domain); if (!types) { diff --git a/ReactCommon/hermes/inspector/tools/msggen/src/index.js b/ReactCommon/hermes/inspector/tools/msggen/src/index.js index b1452d509f91..b9a420c592f5 100644 --- a/ReactCommon/hermes/inspector/tools/msggen/src/index.js +++ b/ReactCommon/hermes/inspector/tools/msggen/src/index.js @@ -83,7 +83,7 @@ function buildGraph(desc: Descriptor): Graph { const commands = desc.commands; const events = desc.events; - const maybeAddPropEdges = function(nodeId: string, props: ?Array) { + const maybeAddPropEdges = function (nodeId: string, props: ?Array) { if (props) { for (const prop of props) { const refId = prop.getRefDebuggerName(); diff --git a/bots/code-analysis-bot.js b/bots/code-analysis-bot.js index 5da10c52175f..bdcaec1befcb 100644 --- a/bots/code-analysis-bot.js +++ b/bots/code-analysis-bot.js @@ -30,8 +30,7 @@ function push(arr, key, value) { const converterSummary = { eslint: '`eslint` found some issues. Run `yarn lint --fix` to automatically fix problems.', - flow: - '`flow` found some issues. Run `yarn flow check` to analyze your code and address any errors.', + flow: '`flow` found some issues. Run `yarn flow check` to analyze your code and address any errors.', shellcheck: '`shellcheck` found some issues. Run `yarn shellcheck` to analyze shell scripts.', 'google-java-format': @@ -51,20 +50,20 @@ const converterSummary = { * is an array of objects of the shape message and line. */ const converters = { - raw: function(output, input) { + raw: function (output, input) { for (let key in input) { - input[key].forEach(function(message) { + input[key].forEach(function (message) { push(output, key, message); }); } }, - 'google-java-format': function(output, input) { + 'google-java-format': function (output, input) { if (!input) { return; } - input.forEach(function(change) { + input.forEach(function (change) { push(output, change.file, { message: `\`google-java-format\` suggested changes: \`\`\`diff @@ -77,12 +76,12 @@ ${change.description} }); }, - flow: function(output, input) { + flow: function (output, input) { if (!input || !input.errors) { return; } - input.errors.forEach(function(error) { + input.errors.forEach(function (error) { push(output, error.message[0].path, { message: error.message.map(message => message.descr).join(' '), line: error.message[0].line, @@ -91,13 +90,13 @@ ${change.description} }); }, - eslint: function(output, input) { + eslint: function (output, input) { if (!input) { return; } - input.forEach(function(file) { - file.messages.forEach(function(message) { + input.forEach(function (file) { + file.messages.forEach(function (message) { push(output, file.filePath, { message: message.ruleId + ': ' + message.message, line: message.line, @@ -107,12 +106,12 @@ ${change.description} }); }, - shellcheck: function(output, input) { + shellcheck: function (output, input) { if (!input) { return; } - input.forEach(function(report) { + input.forEach(function (report) { push(output, report.file, { message: '**[SC' + @@ -285,10 +284,10 @@ async function main(messages, owner, repo, pull_number) { let content = ''; process.stdin.resume(); -process.stdin.on('data', function(buf) { +process.stdin.on('data', function (buf) { content += buf.toString(); }); -process.stdin.on('end', function() { +process.stdin.on('end', function () { let messages = {}; // Since we send a few http requests to setup the process, we don't want diff --git a/bots/dangerfile.js b/bots/dangerfile.js index 428652b80208..91803ed12981 100644 --- a/bots/dangerfile.js +++ b/bots/dangerfile.js @@ -51,7 +51,8 @@ if (!includesTestPlan) { } // Regex looks for given categories, types, a file/framework/component, and a message - broken into 4 capture groups -const changelogRegex = /\[\s?(ANDROID|GENERAL|IOS|JS|JAVASCRIPT|INTERNAL)\s?\]\s?\[\s?(ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY)\s?\]\s*?-?\s*?(.*)/gi; +const changelogRegex = + /\[\s?(ANDROID|GENERAL|IOS|JS|JAVASCRIPT|INTERNAL)\s?\]\s?\[\s?(ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY)\s?\]\s*?-?\s*?(.*)/gi; const internalChangelogRegex = /\[\s?(INTERNAL)\s?\].*/gi; const includesChangelog = danger.github.pr.body && diff --git a/bots/make-comment.js b/bots/make-comment.js index 0ab9b4f2b591..7d07076b6df3 100644 --- a/bots/make-comment.js +++ b/bots/make-comment.js @@ -56,12 +56,8 @@ async function updateComment(octokit, issueParams, body, replacePattern) { * @param {string} replacePattern Pattern for finding the comment to update */ async function createOrUpdateComment(body, replacePattern) { - const { - GITHUB_TOKEN, - GITHUB_OWNER, - GITHUB_REPO, - GITHUB_PR_NUMBER, - } = process.env; + const {GITHUB_TOKEN, GITHUB_OWNER, GITHUB_REPO, GITHUB_PR_NUMBER} = + process.env; if (!GITHUB_TOKEN || !GITHUB_OWNER || !GITHUB_REPO || !GITHUB_PR_NUMBER) { if (!GITHUB_TOKEN) { console.error( diff --git a/jest/assetFileTransformer.js b/jest/assetFileTransformer.js index 03b018ffb7c0..c4730114f46a 100644 --- a/jest/assetFileTransformer.js +++ b/jest/assetFileTransformer.js @@ -12,8 +12,8 @@ /* eslint-env node */ const path = require('path'); -const createCacheKeyFunction = require('@jest/create-cache-key-function') - .default; +const createCacheKeyFunction = + require('@jest/create-cache-key-function').default; module.exports = { // Mocks asset requires to return the filename. Makes it possible to test that diff --git a/jest/preprocessor.js b/jest/preprocessor.js index e209750d6973..c6b78449600f 100644 --- a/jest/preprocessor.js +++ b/jest/preprocessor.js @@ -14,8 +14,8 @@ const babelRegisterOnly = require('metro-babel-register'); const nullthrows = require('nullthrows'); -const createCacheKeyFunction = require('@jest/create-cache-key-function') - .default; +const createCacheKeyFunction = + require('@jest/create-cache-key-function').default; const t = require('@babel/types'); const {statements} = require('@babel/template').default; diff --git a/jest/setup.js b/jest/setup.js index 8aed65f3b82f..69e937fdd3a0 100644 --- a/jest/setup.js +++ b/jest/setup.js @@ -25,10 +25,10 @@ global.Promise = jest.requireActual('promise'); global.regeneratorRuntime = jest.requireActual('regenerator-runtime/runtime'); global.window = global; -global.requestAnimationFrame = function(callback) { +global.requestAnimationFrame = function (callback) { return setTimeout(callback, 0); }; -global.cancelAnimationFrame = function(id) { +global.cancelAnimationFrame = function (id) { clearTimeout(id); }; @@ -353,7 +353,7 @@ jest }) .mock( '../Libraries/Utilities/verifyComponentAttributeEquivalence', - () => function() {}, + () => function () {}, ) .mock('../Libraries/Components/View/ViewNativeComponent', () => { const React = require('react'); diff --git a/packages/babel-plugin-codegen/__test_fixtures__/failures.js b/packages/babel-plugin-codegen/__test_fixtures__/failures.js index 6ba62d5a2c66..40e46fd5b58f 100644 --- a/packages/babel-plugin-codegen/__test_fixtures__/failures.js +++ b/packages/babel-plugin-codegen/__test_fixtures__/failures.js @@ -82,7 +82,9 @@ export default (codegenNativeComponent('Module'): NativeType); `; module.exports = { - 'CommandsExportedWithDifferentNameNativeComponent.js': COMMANDS_EXPORTED_WITH_DIFFERENT_NAME, - 'CommandsExportedWithShorthandNativeComponent.js': COMMANDS_EXPORTED_WITH_SHORTHAND, + 'CommandsExportedWithDifferentNameNativeComponent.js': + COMMANDS_EXPORTED_WITH_DIFFERENT_NAME, + 'CommandsExportedWithShorthandNativeComponent.js': + COMMANDS_EXPORTED_WITH_SHORTHAND, 'OtherCommandsExportNativeComponent.js': OTHER_COMMANDS_EXPORT, }; diff --git a/packages/babel-plugin-codegen/index.js b/packages/babel-plugin-codegen/index.js index 235eb6679694..2e59816d9d2b 100644 --- a/packages/babel-plugin-codegen/index.js +++ b/packages/babel-plugin-codegen/index.js @@ -53,7 +53,7 @@ function isCodegenDeclaration(declaration) { return false; } -module.exports = function({parse, types: t}) { +module.exports = function ({parse, types: t}) { return { pre(state) { this.code = state.code; diff --git a/packages/eslint-plugin-codegen/react-native-modules.js b/packages/eslint-plugin-codegen/react-native-modules.js index 476624d024b7..c5f19fc0c30b 100644 --- a/packages/eslint-plugin-codegen/react-native-modules.js +++ b/packages/eslint-plugin-codegen/react-native-modules.js @@ -99,7 +99,7 @@ function rule(context) { let isModule = false; return { - 'Program:exit': function(node) { + 'Program:exit': function (node) { if (!isModule) { return; } @@ -112,10 +112,8 @@ function rule(context) { }); } - const { - buildModuleSchema, - createParserErrorCapturer, - } = requireModuleParser(); + const {buildModuleSchema, createParserErrorCapturer} = + requireModuleParser(); const flowParser = require('flow-parser'); const [parsingErrors, tryParse] = createParserErrorCapturer(); diff --git a/packages/eslint-plugin-react-native-community/__tests__/platform-colors-test.js b/packages/eslint-plugin-react-native-community/__tests__/platform-colors-test.js index 75343c258649..6e3ee40f91ce 100644 --- a/packages/eslint-plugin-react-native-community/__tests__/platform-colors-test.js +++ b/packages/eslint-plugin-react-native-community/__tests__/platform-colors-test.js @@ -29,23 +29,19 @@ eslintTester.run('../platform-colors', rule, { errors: [{message: rule.meta.messages.platformColorArgsLength}], }, { - code: - "const labelColor = 'labelColor'; const color = PlatformColor(labelColor);", + code: "const labelColor = 'labelColor'; const color = PlatformColor(labelColor);", errors: [{message: rule.meta.messages.platformColorArgTypes}], }, { - code: - "const tuple = {light: 'black', dark: 'white'}; const color = DynamicColorIOS(tuple);", + code: "const tuple = {light: 'black', dark: 'white'}; const color = DynamicColorIOS(tuple);", errors: [{message: rule.meta.messages.dynamicColorIOSArg}], }, { - code: - "const black = 'black'; const color = DynamicColorIOS({light: black, dark: 'white'});", + code: "const black = 'black'; const color = DynamicColorIOS({light: black, dark: 'white'});", errors: [{message: rule.meta.messages.dynamicColorIOSLight}], }, { - code: - "const white = 'white'; const color = DynamicColorIOS({light: 'black', dark: white});", + code: "const white = 'white'; const color = DynamicColorIOS({light: 'black', dark: white});", errors: [{message: rule.meta.messages.dynamicColorIOSDark}], }, ], diff --git a/packages/eslint-plugin-react-native-community/platform-colors.js b/packages/eslint-plugin-react-native-community/platform-colors.js index 12e8f908f90a..e24e7b7aaa27 100644 --- a/packages/eslint-plugin-react-native-community/platform-colors.js +++ b/packages/eslint-plugin-react-native-community/platform-colors.js @@ -29,9 +29,9 @@ module.exports = { schema: [], }, - create: function(context) { + create: function (context) { return { - CallExpression: function(node) { + CallExpression: function (node) { if (node.callee.name === 'PlatformColor') { const args = node.arguments; if (args.length === 0) { diff --git a/packages/normalize-color/index.js b/packages/normalize-color/index.js index 15f50bd788f6..fb8a8bb5675e 100644 --- a/packages/normalize-color/index.js +++ b/packages/normalize-color/index.js @@ -40,8 +40,8 @@ function normalizeColor(color) { if ((match = matchers.rgb.exec(color))) { return ( ((parse255(match[1]) << 24) | // r - (parse255(match[2]) << 16) | // g - (parse255(match[3]) << 8) | // b + (parse255(match[2]) << 16) | // g + (parse255(match[3]) << 8) | // b 0x000000ff) >>> // a 0 ); @@ -50,8 +50,8 @@ function normalizeColor(color) { if ((match = matchers.rgba.exec(color))) { return ( ((parse255(match[1]) << 24) | // r - (parse255(match[2]) << 16) | // g - (parse255(match[3]) << 8) | // b + (parse255(match[2]) << 16) | // g + (parse255(match[3]) << 8) | // b parse1(match[4])) >>> // a 0 ); @@ -61,11 +61,11 @@ function normalizeColor(color) { return ( parseInt( match[1] + - match[1] + // r - match[2] + - match[2] + // g - match[3] + - match[3] + // b + match[1] + // r + match[2] + + match[2] + // g + match[3] + + match[3] + // b 'ff', // a 16, ) >>> 0 @@ -81,11 +81,11 @@ function normalizeColor(color) { return ( parseInt( match[1] + - match[1] + // r - match[2] + - match[2] + // g - match[3] + - match[3] + // b + match[1] + // r + match[2] + + match[2] + // g + match[3] + + match[3] + // b match[4] + match[4], // a 16, diff --git a/packages/react-native-codegen/scripts/build.js b/packages/react-native-codegen/scripts/build.js index 9eefd4fdbb8f..c3f8f2ae788e 100644 --- a/packages/react-native-codegen/scripts/build.js +++ b/packages/react-native-codegen/scripts/build.js @@ -47,10 +47,7 @@ const fixedWidth = str => { if (lastString.length < WIDTH) { lastString += Array(WIDTH - lastString.length).join(chalk.dim('.')); } - return strs - .slice(0, -1) - .concat(lastString) - .join('\n'); + return strs.slice(0, -1).concat(lastString).join('\n'); }; function getBuildPath(file, buildFolder) { diff --git a/packages/react-native-codegen/src/generators/components/CppHelpers.js b/packages/react-native-codegen/src/generators/components/CppHelpers.js index bbf8a48347b3..2b42636dc734 100644 --- a/packages/react-native-codegen/src/generators/components/CppHelpers.js +++ b/packages/react-native-codegen/src/generators/components/CppHelpers.js @@ -20,10 +20,7 @@ function upperCaseFirst(inString: string): string { } function toSafeCppString(input: string): string { - return input - .split('-') - .map(upperCaseFirst) - .join(''); + return input.split('-').map(upperCaseFirst).join(''); } function toIntEnumValueName(propName: string, value: number): string { diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js index 171cb5bb517c..a747240c19cb 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js @@ -24,7 +24,7 @@ type FilesOutput = Map; type ComponentCollection = $ReadOnly<{ [component: string]: ComponentShape, - ..., + ... }>; const FileTemplate = ({ diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js index 8ada23c7a929..e61f103ae5a3 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js @@ -32,7 +32,7 @@ type StructsMap = Map; type ComponentCollection = $ReadOnly<{ [component: string]: ComponentShape, - ..., + ... }>; const FileTemplate = ({componentEmitters}: {componentEmitters: string}) => ` diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js index 03015faee376..be65aedca7bc 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js @@ -160,10 +160,7 @@ module.exports = { const replacedTemplate = FileTemplate({ componentClasses: componentProps, libraryName, - imports: Array.from(allImports) - .sort() - .join('\n') - .trim(), + imports: Array.from(allImports).sort().join('\n').trim(), }); return new Map([[fileName, replacedTemplate]]); diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js index 72a31c67f1e1..ad4760c1f2d9 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js @@ -660,7 +660,7 @@ function generateStructs( elementProperties, nameParts.concat([prop.name]), ); - nestedStructs.forEach(function(value, key) { + nestedStructs.forEach(function (value, key) { structs.set(key, value); }); @@ -684,7 +684,7 @@ function generateStructs( elementProperties, nameParts.concat([prop.name]), ); - nestedStructs.forEach(function(value, key) { + nestedStructs.forEach(function (value, key) { structs.set(key, value); }); @@ -725,7 +725,7 @@ function generateStructs( elementProperties, nameParts.concat([prop.name]), ); - nestedStructs.forEach(function(value, key) { + nestedStructs.forEach(function (value, key) { structs.set(key, value); }); @@ -906,9 +906,7 @@ module.exports = { const replacedTemplate = FileTemplate({ componentClasses, - imports: Array.from(allImports) - .sort() - .join('\n'), + imports: Array.from(allImports).sort().join('\n'), }); return new Map([[fileName, replacedTemplate]]); diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js index 030abcd6d713..b01eeac4be29 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js @@ -322,9 +322,7 @@ module.exports = { const extendString = getClassExtendString(component); const replacedTemplate = FileTemplate({ - imports: Array.from(imports) - .sort() - .join('\n'), + imports: Array.from(imports).sort().join('\n'), packageName: normalizedPackageName, className, extendClasses: extendString, diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js index 31e27513a2dd..d1fbdfb9a247 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js @@ -266,9 +266,7 @@ module.exports = { const extendString = getClassExtendString(component); const replacedTemplate = FileTemplate({ - imports: Array.from(imports) - .sort() - .join('\n'), + imports: Array.from(imports).sort().join('\n'), packageName: normalizedPackageName, className, extendClasses: extendString, diff --git a/packages/react-native-codegen/src/generators/components/GenerateTests.js b/packages/react-native-codegen/src/generators/components/GenerateTests.js index 4da5c40c2d96..d3f65ea3522b 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateTests.js +++ b/packages/react-native-codegen/src/generators/components/GenerateTests.js @@ -202,10 +202,7 @@ module.exports = { .filter(Boolean) .join(''); - const imports = Array.from(allImports) - .sort() - .join('\n') - .trim(); + const imports = Array.from(allImports).sort().join('\n').trim(); const replacedTemplate = FileTemplate({ imports, diff --git a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js index 035ba93efce0..b68b5919c78a 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js +++ b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js @@ -432,9 +432,7 @@ module.exports = { const replacedTemplate = FileTemplate({ componentConfig: moduleResults, - imports: Array.from(imports) - .sort() - .join('\n'), + imports: Array.from(imports).sort().join('\n'), }); return new Map([[fileName, replacedTemplate]]); diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js index 27eba9c32f1e..908c88ee2a41 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js @@ -162,11 +162,8 @@ function serializePropertyIntoHostFunction( property: NativeModulePropertyShape, resolveAlias: AliasResolver, ): string { - const [ - propertyTypeAnnotation, - ] = unwrapNullable( - property.typeAnnotation, - ); + const [propertyTypeAnnotation] = + unwrapNullable(property.typeAnnotation); const isVoid = propertyTypeAnnotation.returnTypeAnnotation.type === 'VoidTypeAnnotation'; diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js index fe919e910cef..21da201a7c7d 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js @@ -138,11 +138,10 @@ module.exports = { const traversedProperties = properties .map(prop => { - const [ - propTypeAnnotation, - ] = unwrapNullable( - prop.typeAnnotation, - ); + const [propTypeAnnotation] = + unwrapNullable( + prop.typeAnnotation, + ); const traversedArgs = propTypeAnnotation.params .map(param => { const translatedParam = translatePrimitiveJSTypeToCpp( diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js index 60b7274b7868..d0969a6bffe8 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js @@ -184,10 +184,8 @@ function translateParamTypeToJniType( resolveAlias: AliasResolver, ): string { const {optional, typeAnnotation: nullableTypeAnnotation} = param; - const [ - typeAnnotation, - nullable, - ] = unwrapNullable(nullableTypeAnnotation); + const [typeAnnotation, nullable] = + unwrapNullable(nullableTypeAnnotation); const isRequired = !optional && !nullable; let realTypeAnnotation = typeAnnotation; @@ -291,9 +289,8 @@ function translateMethodTypeToJniSignature( resolveAlias: AliasResolver, ): string { const {name, typeAnnotation} = property; - let [ - {returnTypeAnnotation, params}, - ] = unwrapNullable(typeAnnotation); + let [{returnTypeAnnotation, params}] = + unwrapNullable(typeAnnotation); params = [...params]; let processedReturnTypeAnnotation = returnTypeAnnotation; @@ -330,11 +327,8 @@ function translateMethodForImplementation( property: NativeModulePropertyShape, resolveAlias: AliasResolver, ): string { - const [ - propertyTypeAnnotation, - ] = unwrapNullable( - property.typeAnnotation, - ); + const [propertyTypeAnnotation] = + unwrapNullable(property.typeAnnotation); const {returnTypeAnnotation} = propertyTypeAnnotation; if ( @@ -395,11 +389,10 @@ module.exports = { hasteModuleName, methods: properties .map(({name: propertyName, typeAnnotation}) => { - const [ - {returnTypeAnnotation, params}, - ] = unwrapNullable( - typeAnnotation, - ); + const [{returnTypeAnnotation, params}] = + unwrapNullable( + typeAnnotation, + ); if ( propertyName === 'getConstants' && diff --git a/packages/react-native-codegen/src/parsers/flow/components/events.js b/packages/react-native-codegen/src/parsers/flow/components/events.js index b950f8245590..f6c68c80fcd5 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/events.js +++ b/packages/react-native-codegen/src/parsers/flow/components/events.js @@ -191,11 +191,8 @@ function buildEventSchema( return null; } - const { - argumentProps, - bubblingType, - paperTopLevelNameDeprecated, - } = findEventArgumentsAndType(typeAnnotation, types); + const {argumentProps, bubblingType, paperTopLevelNameDeprecated} = + findEventArgumentsAndType(typeAnnotation, types); if (bubblingType && argumentProps) { if (paperTopLevelNameDeprecated != null) { @@ -237,7 +234,7 @@ type EventTypeAST = Object; type TypeMap = { // $FlowFixMe[unclear-type] there's no flowtype for ASTs [string]: Object, - ..., + ... }; function getEvents( diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-e2e-test.js b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-e2e-test.js index ef3354df45f3..411890dec515 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-e2e-test.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/module-parser-e2e-test.js @@ -155,10 +155,8 @@ describe('Flow Module Parser', () => { expect(param).not.toBe(null); expect(param.name).toBe(paramName); expect(param.optional).toBe(optional); - const [ - paramTypeAnnotation, - isParamTypeAnnotationNullable, - ] = unwrapNullable(param.typeAnnotation); + const [paramTypeAnnotation, isParamTypeAnnotationNullable] = + unwrapNullable(param.typeAnnotation); expect(isParamTypeAnnotationNullable).toBe(nullable); return [paramTypeAnnotation, module]; @@ -232,12 +230,10 @@ describe('Flow Module Parser', () => { expect(paramTypeAnnotation.elementType).not.toBe(null); invariant(paramTypeAnnotation.elementType != null, ''); - const [ - elementType, - isElementTypeNullable, - ] = unwrapNullable( - paramTypeAnnotation.elementType, - ); + const [elementType, isElementTypeNullable] = + unwrapNullable( + paramTypeAnnotation.elementType, + ); expect(isElementTypeNullable).toBe(false); return [elementType, module]; } @@ -371,10 +367,8 @@ describe('Flow Module Parser', () => { expect(param.optional).toBe(optional); // The TypeAliasAnnotation is called Animal, and is nullable - const [ - paramTypeAnnotation, - isParamTypeAnnotationNullable, - ] = unwrapNullable(param.typeAnnotation); + const [paramTypeAnnotation, isParamTypeAnnotationNullable] = + unwrapNullable(param.typeAnnotation); expect(paramTypeAnnotation.type).toBe('TypeAliasTypeAnnotation'); invariant( paramTypeAnnotation.type === 'TypeAliasTypeAnnotation', @@ -446,10 +440,8 @@ describe('Flow Module Parser', () => { expect(properties[0].name).toBe(propName); expect(properties[0].optional).toBe(isPropOptional); - const [ - propertyTypeAnnotation, - isPropertyTypeAnnotationNullable, - ] = unwrapNullable(properties[0].typeAnnotation); + const [propertyTypeAnnotation, isPropertyTypeAnnotationNullable] = + unwrapNullable(properties[0].typeAnnotation); expect(propertyTypeAnnotation).not.toBe(null); expect(isPropertyTypeAnnotationNullable).toBe(isPropNullable); @@ -537,18 +529,15 @@ describe('Flow Module Parser', () => { '', ); - const { - elementType: nullableElementType, - } = property.typeAnnotation; + const {elementType: nullableElementType} = + property.typeAnnotation; expect(nullableElementType).not.toBe(null); invariant(nullableElementType != null, ''); - const [ - elementType, - isElementTypeNullable, - ] = unwrapNullable( - nullableElementType, - ); + const [elementType, isElementTypeNullable] = + unwrapNullable( + nullableElementType, + ); expect(isElementTypeNullable).toBe(false); @@ -709,16 +698,12 @@ describe('Flow Module Parser', () => { expect(module.spec.properties[0]).not.toBe(null); - const [ - functionTypeAnnotation, - isFunctionTypeAnnotationNullable, - ] = unwrapNullable(module.spec.properties[0].typeAnnotation); + const [functionTypeAnnotation, isFunctionTypeAnnotationNullable] = + unwrapNullable(module.spec.properties[0].typeAnnotation); expect(isFunctionTypeAnnotationNullable).toBe(false); - const [ - returnTypeAnnotation, - isReturnTypeAnnotationNullable, - ] = unwrapNullable(functionTypeAnnotation.returnTypeAnnotation); + const [returnTypeAnnotation, isReturnTypeAnnotationNullable] = + unwrapNullable(functionTypeAnnotation.returnTypeAnnotation); expect(returnTypeAnnotation.type).toBe('VoidTypeAnnotation'); expect(isReturnTypeAnnotationNullable).toBe(false); }); @@ -746,16 +731,12 @@ describe('Flow Module Parser', () => { `); expect(module.spec.properties[0]).not.toBe(null); - const [ - functionTypeAnnotation, - isFunctionTypeAnnotationNullable, - ] = unwrapNullable(module.spec.properties[0].typeAnnotation); + const [functionTypeAnnotation, isFunctionTypeAnnotationNullable] = + unwrapNullable(module.spec.properties[0].typeAnnotation); expect(isFunctionTypeAnnotationNullable).toBe(false); - const [ - returnTypeAnnotation, - isReturnTypeAnnotationNullable, - ] = unwrapNullable(functionTypeAnnotation.returnTypeAnnotation); + const [returnTypeAnnotation, isReturnTypeAnnotationNullable] = + unwrapNullable(functionTypeAnnotation.returnTypeAnnotation); expect(isReturnTypeAnnotationNullable).toBe(IS_RETURN_TYPE_NULLABLE); return [returnTypeAnnotation, module]; @@ -823,10 +804,8 @@ describe('Flow Module Parser', () => { expect(elementType).not.toBe(null); invariant(elementType != null, ''); - const [ - elementTypeAnnotation, - isElementTypeAnnotation, - ] = unwrapNullable(elementType); + const [elementTypeAnnotation, isElementTypeAnnotation] = + unwrapNullable(elementType); expect(isElementTypeAnnotation).toBe(false); return [elementTypeAnnotation, module]; @@ -837,9 +816,8 @@ describe('Flow Module Parser', () => { describe('Primitive Element Types', () => { PRIMITIVES.forEach(([FLOW_TYPE, PARSED_TYPE_NAME]) => { it(`should parse methods that have ${RETURN_TYPE_DESCRIPTION} return of type 'Array<${FLOW_TYPE}>'`, () => { - const [elementType, module] = parseArrayElementReturnType( - FLOW_TYPE, - ); + const [elementType, module] = + parseArrayElementReturnType(FLOW_TYPE); expect(elementType.type).toBe(PARSED_TYPE_NAME); }); }); @@ -863,9 +841,8 @@ describe('Flow Module Parser', () => { }); it(`should parse methods that have ${RETURN_TYPE_DESCRIPTION} return type of some array of an alias`, () => { - const [elementType, module] = parseArrayElementReturnType( - 'Animal', - ); + const [elementType, module] = + parseArrayElementReturnType('Animal'); expect(elementType.type).toBe('TypeAliasTypeAnnotation'); invariant(elementType.type === 'TypeAliasTypeAnnotation', ''); expect(elementType.name).toBe('Animal'); @@ -873,9 +850,8 @@ describe('Flow Module Parser', () => { }); it(`should parse methods that have ${RETURN_TYPE_DESCRIPTION} return of type 'Array<{foo: ?string}>'`, () => { - const [elementType] = parseArrayElementReturnType( - '{foo: ?string}', - ); + const [elementType] = + parseArrayElementReturnType('{foo: ?string}'); expect(elementType.type).toBe('ObjectTypeAnnotation'); invariant(elementType.type === 'ObjectTypeAnnotation', ''); @@ -887,10 +863,8 @@ describe('Flow Module Parser', () => { expect(properties[0].name).toBe('foo'); expect(properties[0].typeAnnotation).not.toBe(null); - const [ - propertyTypeAnnotation, - isPropertyTypeAnnotationNullable, - ] = unwrapNullable(properties[0].typeAnnotation); + const [propertyTypeAnnotation, isPropertyTypeAnnotationNullable] = + unwrapNullable(properties[0].typeAnnotation); expect(propertyTypeAnnotation.type).toBe('StringTypeAnnotation'); expect(isPropertyTypeAnnotationNullable).toBe(true); @@ -1084,13 +1058,11 @@ describe('Flow Module Parser', () => { propName: string, arrayElementType: string, ): [NativeModuleBaseTypeAnnotation, NativeModuleSchema] { - const [ - property, - module, - ] = parseObjectLiteralReturnTypeProp( - propName, - `Array<${arrayElementType}>`, - ); + const [property, module] = + parseObjectLiteralReturnTypeProp( + propName, + `Array<${arrayElementType}>`, + ); expect(property.name).toBe(propName); expect(property.typeAnnotation.type).toBe( 'ArrayTypeAnnotation', @@ -1100,18 +1072,15 @@ describe('Flow Module Parser', () => { '', ); - const { - elementType: nullableElementType, - } = property.typeAnnotation; + const {elementType: nullableElementType} = + property.typeAnnotation; expect(nullableElementType).not.toBe(null); invariant(nullableElementType != null, ''); - const [ - elementType, - isElementTypeNullable, - ] = unwrapNullable( - nullableElementType, - ); + const [elementType, isElementTypeNullable] = + unwrapNullable( + nullableElementType, + ); expect(isElementTypeNullable).toBe(false); return [elementType, module]; diff --git a/packages/react-native-codegen/src/parsers/flow/modules/index.js b/packages/react-native-codegen/src/parsers/flow/modules/index.js index ffbb50af3987..63e145476088 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/index.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/index.js @@ -71,11 +71,8 @@ function translateTypeAnnotation( aliasMap: {...NativeModuleAliasMap}, tryParse: ParserErrorCapturer, ): Nullable { - const { - nullable, - typeAnnotation, - typeAliasResolutionStatus, - } = resolveTypeAnnotation(flowTypeAnnotation, types); + const {nullable, typeAnnotation, typeAliasResolutionStatus} = + resolveTypeAnnotation(flowTypeAnnotation, types); switch (typeAnnotation.type) { case 'GenericTypeAnnotation': { @@ -234,18 +231,16 @@ function translateTypeAnnotation( const {optional, key} = property; - const [ - propertyTypeAnnotation, - isPropertyNullable, - ] = unwrapNullable( - translateTypeAnnotation( - hasteModuleName, - property.value, - types, - aliasMap, - tryParse, - ), - ); + const [propertyTypeAnnotation, isPropertyNullable] = + unwrapNullable( + translateTypeAnnotation( + hasteModuleName, + property.value, + types, + aliasMap, + tryParse, + ), + ); if (propertyTypeAnnotation.type === 'FunctionTypeAnnotation') { throw new UnsupportedObjectPropertyValueTypeAnnotationParserError( @@ -417,18 +412,16 @@ function translateFunctionTypeAnnotation( } const paramName = flowParam.name.name; - const [ - paramTypeAnnotation, - isParamTypeAnnotationNullable, - ] = unwrapNullable( - translateTypeAnnotation( - hasteModuleName, - flowParam.typeAnnotation, - types, - aliasMap, - tryParse, - ), - ); + const [paramTypeAnnotation, isParamTypeAnnotationNullable] = + unwrapNullable( + translateTypeAnnotation( + hasteModuleName, + flowParam.typeAnnotation, + types, + aliasMap, + tryParse, + ), + ); if (paramTypeAnnotation.type === 'VoidTypeAnnotation') { throw new UnsupportedFunctionParamTypeAnnotationParserError( diff --git a/packages/rn-tester/RCTTest/RCTSnapshotNativeComponent.js b/packages/rn-tester/RCTTest/RCTSnapshotNativeComponent.js index f9a30031b154..e10b75c7e178 100644 --- a/packages/rn-tester/RCTTest/RCTSnapshotNativeComponent.js +++ b/packages/rn-tester/RCTTest/RCTSnapshotNativeComponent.js @@ -26,8 +26,7 @@ type NativeProps = $ReadOnly<{| testIdentifier?: ?string, |}>; -const RCTSnapshotNativeComponent: HostComponent = requireNativeComponent( - 'RCTSnapshot', -); +const RCTSnapshotNativeComponent: HostComponent = + requireNativeComponent('RCTSnapshot'); module.exports = RCTSnapshotNativeComponent; diff --git a/packages/rn-tester/RNTesterUnitTests/RNTesterUnitTestsBundle.js b/packages/rn-tester/RNTesterUnitTests/RNTesterUnitTestsBundle.js index 20f4cc8caa1a..251bb2711b5c 100644 --- a/packages/rn-tester/RNTesterUnitTests/RNTesterUnitTestsBundle.js +++ b/packages/rn-tester/RNTesterUnitTests/RNTesterUnitTestsBundle.js @@ -11,7 +11,7 @@ // eslint-disable-next-line no-unused-vars const __fbBatchedBridge = { - flushedQueue: function() { + flushedQueue: function () { return null; }, }; diff --git a/packages/rn-tester/e2e/test-init.js b/packages/rn-tester/e2e/test-init.js index 5120acdf1b2e..4f913d449b92 100644 --- a/packages/rn-tester/e2e/test-init.js +++ b/packages/rn-tester/e2e/test-init.js @@ -35,7 +35,7 @@ beforeAll(async () => { }); }); -beforeEach(async function() { +beforeEach(async function () { await adapter.beforeEach(); }); diff --git a/packages/rn-tester/js/components/RNTesterTheme.js b/packages/rn-tester/js/components/RNTesterTheme.js index 25697d21419c..0d671f7a89ca 100644 --- a/packages/rn-tester/js/components/RNTesterTheme.js +++ b/packages/rn-tester/js/components/RNTesterTheme.js @@ -109,6 +109,7 @@ export const RNTesterDarkTheme = { }; export const themes = {light: RNTesterLightTheme, dark: RNTesterDarkTheme}; -export const RNTesterThemeContext: React.Context = React.createContext( - Appearance.getColorScheme() === 'dark' ? themes.dark : themes.light, -); +export const RNTesterThemeContext: React.Context = + React.createContext( + Appearance.getColorScheme() === 'dark' ? themes.dark : themes.light, + ); diff --git a/packages/rn-tester/js/components/TextLegend.js b/packages/rn-tester/js/components/TextLegend.js index 68f5fba87be4..72db39bbf026 100644 --- a/packages/rn-tester/js/components/TextLegend.js +++ b/packages/rn-tester/js/components/TextLegend.js @@ -23,8 +23,7 @@ const PANGRAMS = { hebrew: 'דג סקרן שט בים מאוכזב ולפתע מצא חברה', hindi: 'ऋषियों को सताने वाले दुष्ट राक्षसों के राजा रावण का सर्वनाश करने वाले विष्णुवतार भगवान श्रीराम, अयोध्या के महाराज दशरथ के बड़े सपुत्र थे।', - igbo: - 'Nne, nna, wepụ he’l’ụjọ dum n’ime ọzụzụ ụmụ, vufesi obi nye Chukwu, ṅụrịanụ, gbakọọnụ kpaa, kwee ya ka o guzoshie ike; ọ ghaghị ito, nwapụta ezi agwa', + igbo: 'Nne, nna, wepụ he’l’ụjọ dum n’ime ọzụzụ ụmụ, vufesi obi nye Chukwu, ṅụrịanụ, gbakọọnụ kpaa, kwee ya ka o guzoshie ike; ọ ghaghị ito, nwapụta ezi agwa', irish: 'D’fhuascail Íosa Úrmhac na hÓighe Beannaithe pór Éava agus Ádhaimh', japanese: '色は匂へど 散りぬるを 我が世誰ぞ 常ならむ 有為の奥山 今日越えて 浅き夢見じ 酔ひもせず', @@ -35,8 +34,7 @@ const PANGRAMS = { romanian: 'Muzicologă în bej vând whisky și tequila, preț fix.', russian: 'Эх, чужак, общий съём цен шляп (юфть) – вдрызг!', swedish: 'Yxskaftbud, ge vår WC-zonmö IQ-hjälp.', - thai: - 'เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอยฯ', + thai: 'เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอยฯ', }; export default function TextLegend(): React.Node { diff --git a/packages/rn-tester/js/components/createExamplePage.js b/packages/rn-tester/js/components/createExamplePage.js index 477717fef1fc..596e73b4b5fd 100644 --- a/packages/rn-tester/js/components/createExamplePage.js +++ b/packages/rn-tester/js/components/createExamplePage.js @@ -15,7 +15,7 @@ const React = require('react'); import RNTesterModuleContainer from './RNTesterModuleContainer'; import type {RNTesterModule} from '../types/RNTesterTypes'; -const createExamplePage = function( +const createExamplePage = function ( title: ?string, exampleModule: RNTesterModule, ): React.ComponentType { diff --git a/packages/rn-tester/js/examples/AnimatedGratuitousApp/AnExApp.js b/packages/rn-tester/js/examples/AnimatedGratuitousApp/AnExApp.js index 2bebbe67ad00..aa40b1ea5209 100644 --- a/packages/rn-tester/js/examples/AnimatedGratuitousApp/AnExApp.js +++ b/packages/rn-tester/js/examples/AnimatedGratuitousApp/AnExApp.js @@ -241,7 +241,7 @@ class AnExApp extends React.Component { } else { let onLayout = null; if (!this.state.restLayouts[idx]) { - onLayout = function(index, e) { + onLayout = function (index, e) { const layout = e.nativeEvent.layout; this.setState(state => { state.restLayouts[index] = layout; diff --git a/packages/rn-tester/js/examples/AnimatedGratuitousApp/AnExScroll.js b/packages/rn-tester/js/examples/AnimatedGratuitousApp/AnExScroll.js index 35c98ee89b8b..4183459262d1 100644 --- a/packages/rn-tester/js/examples/AnimatedGratuitousApp/AnExScroll.js +++ b/packages/rn-tester/js/examples/AnimatedGratuitousApp/AnExScroll.js @@ -113,12 +113,10 @@ const styles = StyleSheet.create({ }); const HAWK_PIC = { - uri: - 'https://scontent-sea1-1.xx.fbcdn.net/hphotos-xfa1/t39.1997-6/10734304_1562225620659674_837511701_n.png', + uri: 'https://scontent-sea1-1.xx.fbcdn.net/hphotos-xfa1/t39.1997-6/10734304_1562225620659674_837511701_n.png', }; const BUNNY_PIC = { - uri: - 'https://scontent-sea1-1.xx.fbcdn.net/hphotos-xaf1/t39.1997-6/851564_531111380292237_1898871086_n.png', + uri: 'https://scontent-sea1-1.xx.fbcdn.net/hphotos-xaf1/t39.1997-6/851564_531111380292237_1898871086_n.png', }; module.exports = AnExScroll; diff --git a/packages/rn-tester/js/examples/Button/ButtonExample.js b/packages/rn-tester/js/examples/Button/ButtonExample.js index f3b3e057832a..017997df1b13 100644 --- a/packages/rn-tester/js/examples/Button/ButtonExample.js +++ b/packages/rn-tester/js/examples/Button/ButtonExample.js @@ -29,7 +29,7 @@ exports.description = 'Simple React Native button component.'; exports.examples = [ { title: 'Button with default styling', - render: function(): React.Node { + render: function (): React.Node { return (