Summary:
^
Basically, update Jest and fix any raised issues. Mainly:
- Update necessary dependencies
- Update snapshots
- `useFakeTimers` caused a few issues which meant that the way we hook into the performance object had to be tweaked. The main code change is: `//fbsource/xplat/sonar/desktop/scripts/jest-setup-after.tsx`
- `mocked` -> `jest.mocked`
Changelog: Update Jest to v29.5.1
Reviewed By: antonk52
Differential Revision: D46319818
fbshipit-source-id: d218ca8f7e43abac6b00844953ddeb7f4e1010a2
Summary: On my mac localhost resolves to an IP6 address by the new adb lib. This should fix it.
Reviewed By: LukeDefeo
Differential Revision: D46314612
fbshipit-source-id: 3771efd2c6b79fe9ae9851ce4aac35bcede28847
Summary:
It seems the available binary for macOS arm64 is not signed:
```
codesign -dv --verbose=4 ./node-v16.16.0-macos-arm64
./node-v16.16.0-macos-arm64: code object is not signed
```
This is an issue as it crashes for our flipper server releases.
This can be compared to a binary downloaded from the Node distribution page:
```
codesign -dv --verbose=4 ./node
Executable=/Users/realpassy/Downloads/node-v16.15.0-darwin-arm64/bin/node
Identifier=node
Format=Mach-O thin (arm64)
CodeDirectory v=20500 size=597360 flags=0x10000(runtime) hashes=18657+7 location=embedded
VersionPlatform=1
VersionMin=720896
VersionSDK=721152
Hash type=sha256 size=32
CandidateCDHash sha256=31cdf84cac42a622c1a68558376700a2dd12d40d
CandidateCDHashFull sha256=31cdf84cac42a622c1a68558376700a2dd12d40d81c5118f3b0e0370c414eb69
Hash choices=sha256
CMSDigest=31cdf84cac42a622c1a68558376700a2dd12d40d81c5118f3b0e0370c414eb69
CMSDigestType=2
Executable Segment base=0
Executable Segment limit=56082432
Executable Segment flags=0x1
Page size=4096
Launch Constraints:
None
CDHash=31cdf84cac42a622c1a68558376700a2dd12d40d
Signature size=8986
Authority=Developer ID Application: Node.js Foundation (HX7739G8FX)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=26 Apr 2022 at 23:00:57
Info.plist=not bound
TeamIdentifier=HX7739G8FX
Runtime Version=11.1.0
Sealed Resources=none
Internal requirements count=1 size=164
```
For additional context:
Node binary by using pkg-fetch. We just get the binary from this release page: https://github.com/vercel/pkg-fetch/releases/tag/v3.4
The exact binary we're downloading is https://github.com/vercel/pkg-fetch/releases/download/v3.4/node-v16.15.0-macos-arm64
If you just download that via Chrome, it will trigger Gatekeeper and you need to manually click "Allow" in the system privacy settings. You can also do the same by just running:
xattr -c ./node-v16*
Afterwards you can:
chmod +x ./node*
It will crash in the same way that it does after our distribution.
Reviewed By: passy
Differential Revision: D46225503
fbshipit-source-id: f0ae2d5101b99c9db7fe80333573caef52c787a2
Summary: It is hard to pass auth token to Jest E2E tests.
Reviewed By: lblasa
Differential Revision: D46279204
fbshipit-source-id: ee0138c3bd014bafb416f7fa8951fb25b25b4067
Summary: It seems that adb path has changed on the jest-e2e side. That might case the flipper e2e test failure. With this fallback we have granular control of the path.
Reviewed By: antonk52
Differential Revision: D46278512
fbshipit-source-id: 97310459de54eeb003eefb3a3ff06af8b13bebae
Summary:
Need to answer:
- Certificate exchange success rate, fails and errors a day per OS and device type.
Reviewed By: antonk52
Differential Revision: D46221301
fbshipit-source-id: 03c6993aa15f56fdf98a7abd57d00b2af0e9ce1a
Summary: Same as previous diff but for plain socket.
Reviewed By: antonk52
Differential Revision: D46220933
fbshipit-source-id: 235ca860891b8514dd0d743d32fe85f15a2cdd7e
Summary: Same as previous diff but for TLS attempts.
Reviewed By: antonk52
Differential Revision: D46220897
fbshipit-source-id: 9495c39edffbdebe0ba21ec7320b63bad8759dde
Summary:
Need to answer:
- How many app connections a day/week?
- How many connections a day/week per app?
- How many connections a day/week per os?
- How many connections a day/week over WWW exchange?
- How many connections a day/week over FS exchange?
- How many connections over a device?
- How many connections over a simulator?
Reviewed By: antonk52
Differential Revision: D46220581
fbshipit-source-id: 6783f49b59cba91cd04625044314973d98cef301
Summary:
Need to answer:
- How many starts a day over time
Reviewed By: antonk52
Differential Revision: D46219995
fbshipit-source-id: bffaeadf684a2d34c6e145784c5a86dbaf5f532a
Summary:
Need to answer:
- Proxy errors rate over time
Reviewed By: antonk52
Differential Revision: D46219927
fbshipit-source-id: 1ad8cc60303ed3aa34828b9ff87009ff7754a146
Summary:
Some times the socket can already be in use by an existing process. Track it as to quantify how likely this is found in production. May remove later.
Need to answer:
- Socket already in use rate over time
Reviewed By: antonk52
Differential Revision: D46219768
fbshipit-source-id: 27da82cddb707f729a1d43079e84c221bb544a82
Summary:
Define the tracker interface and replace the existing authentication token verification tracking.
Subsequent diffs will add analytics for remaining connectivity areas.
Need to answer:
- No tokens rate over time
- Unable to verify tokens rate over time
Reviewed By: antonk52
Differential Revision: D46219661
fbshipit-source-id: dfc41cae664bc1ef211d312990120111fca3808b
Summary:
Brotli response decoding was introduced via https://github.com/facebook/flipper/pull/4288, and released in 0.177.0. We noticed from that release that many of our iOS response bodies were not being rendered. It simply showed `(empty)` in the `Response Body` section.
As noted in the gzip decoder ([here](2a52656d0b/desktop/plugins/public/network/utils.tsx (L117-L119))) within Flipper, iOS already provides an inflated `data` value, so it doesn't need inflating again.
This PR adds a best-effort guess to detect when the same problem arises in the Brotli decoder.
I'm definitely not a Brotli expert, but according to [this SO post](https://stackoverflow.com/questions/39008957/is-there-a-way-to-check-if-a-buffer-is-in-brotli-compressed-format), there's no sure-fire way to detect Brotli data, and some blobs of random data will still present as Brotli. We may still occasionally see false positives that continue to show `(empty)`, however in my testing, all of our server responses have rendered JSON responses perfectly.
The library used for decoding doesn't throw an error on failure with any responses we've seen, it just simply returns a 0-length buffer. So the naïve approach taken in this PR simply looks for a 0-length output buffer on a non-zero-length input buffer, and concludes "probably not Brotli, shrug emoji".
## Changelog
Ignore Brotli decode result on 0-length return value
Pull Request resolved: https://github.com/facebook/flipper/pull/4632
Test Plan:
We can use Facebook's servers to test this. Fire up a RN app, and add the following somewhere you can run it:
```typescript
fetch('https://graph.facebook.com/facebook/picture?redirect=false', {
headers: {
'accept-encoding': 'br',
},
})
```
Before this patch, we can see that `Response Body` is `(empty)` in Flipper:
<img width="1211" alt="Screenshot 2023-03-30 at 1 26 48 am" src="https://user-images.githubusercontent.com/33126/228690254-988b5a01-5d7b-4ab3-b6dc-49f3b0607d10.png">
But after this patch, we can see some valid JSON in the `Response Body`:
<img width="1213" alt="Screenshot 2023-03-30 at 1 26 07 am" src="https://user-images.githubusercontent.com/33126/228690351-9611759a-5b7d-4ccb-9170-22b950c8afbe.png">
Most importantly, both responses have `Content-Encoding: br` headers.
Reviewed By: passy
Differential Revision: D46219337
Pulled By: mweststrate
fbshipit-source-id: 2ae775d381fa325c6d9e543bdbc617d1fd986671
Summary:
The file manifest.json is injected with the auth token and it happens with every launch.
Because the file is tracked, these changes will always get picked no matter what the .gitignore file specifies, because is a tracked file.
So, the solution is to have a template with a different name, that gets copied into the right location during build time.
Reviewed By: LukeDefeo
Differential Revision: D46184772
fbshipit-source-id: 938b9433045485d9846a6a50c1c955ebe7925581
Summary:
Replace an existing running instance, if any.
This is useful for:
- Applying updates
- Ensuring freshness of server
Reviewed By: passy
Differential Revision: D46146814
fbshipit-source-id: bfb760f3ab26b7632510773609f1c6ca3a97c4ec
Summary:
Right now, this simply avoids trying to create a server instance if one appears to be already running.
In a future change, we may decide to kill the existing instance and replace it with a new one.
But, in this case, running this as is will be useful as it will provide the connection URL with the auth token.
Also remove flipper server dependency from finding installation. In this case, we don't need it and can use `os.getPlatform()` instead.
Reviewed By: antonk52
Differential Revision: D46144843
fbshipit-source-id: 2922843b916d37e0126e43ae65a622f87a6920ec
Summary: We didn't define the build for aarch64 locally previously, so packer didn't know how to bundle it up. Since it shares the layout of x64, we will also save on CDN resources because it will automatically get deduplicated.
Reviewed By: lblasa, antonk52
Differential Revision: D46144879
fbshipit-source-id: 20087010db02d3965ed0c5d4add72e0b19849d13
Summary:
There's a picture with a broken link in the hero section:
{F999641292}
I checked a list of existing static images and found one which was on this place before: https://fburl.com/code/yh73399d. But the image no longer align with others, since it has low resolution and an old version of the Flipper interface, so I decided to simply remove the broken image from the page.
Reviewed By: passy
Differential Revision: D46074714
fbshipit-source-id: 186b17b9b992f123fc667c701b4f49d9e3cbbb2d
Summary:
This diff has been automatically generated by the inpage editor.
NOTE: If you want to update this diff, go via the preview link inside the static docs section below.
Ensure you are editing the same page that was used to create this diff.
Reviewed By: mweststrate
Differential Revision: D45996048
fbshipit-source-id: a509d9393d2b61ec044cdf1b749b5b6083070ff3
Summary:
[android] Remove deprecated kotlin plugin
See https://goo.gle/kotlin-android-extensions-deprecation.
We don't seem to be making use of the extension.
Pull Request resolved: https://github.com/facebook/flipper/pull/4749
Test Plan:
```
./gradlew :android:assembleDebug
```
CI
Task: T153938450
Reviewed By: antonk52
Differential Revision: D46066063
Pulled By: passy
fbshipit-source-id: 1ae58535ca408bf29c97d5a945013f968f5b47a2
Summary:
When looking at some of our logcats in logview, I noticed lots of StrictMode warnings related to a WebSocket not being tagged, and I figured out it was due to FlipperSocketImpl.
By making sure TrafficStats stats tag is set no matter if the SSL factory is used or not, it reduces the amount of StrictMode warnings we see.
Related diff: D38280819
Differential Revision: D46024367
fbshipit-source-id: 92a0bfcef8698a61ef9b27949a5bc0859e03448f
Summary: Fixes Github CI failures on main (see T153688440)
Reviewed By: lblasa
Differential Revision: D46016296
fbshipit-source-id: 61c624797aa4a9a967b7c9f81fbe71b5908de236
Summary: Recently , we started verifying a special token for every websocket connection. It made e2e tests fail. We are going to use this bypass flag in jest e2e envs.
Reviewed By: lblasa
Differential Revision: D46025343
fbshipit-source-id: c2e6e0b561286fb8b571565243a45cdfb56a54a9
Summary:
Bumps [metro-react-native-babel-preset](https://github.com/facebook/metro) from 0.76.0 to 0.76.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/facebook/metro/releases">metro-react-native-babel-preset's releases</a>.</em></p>
<blockquote>
<h2>v0.76.4</h2>
<ul>
<li><strong>[Feature]</strong>: Support the <a href="https://developer.chrome.com/articles/x-google-ignore-list/"><code>x_google_ignoreList</code></a> source map extension. (<a href="https://redirect.github.com/facebook/metro/pull/973">facebook/metro#973</a>, 82bd64a9720174a9e2a02fb73bbef292153e20f1 by <a href="https://github.com/motiz88"><code>@motiz88</code></a>)</li>
<li><strong>[Feature]</strong>: Support bundling KTX files as image assets. (<a href="https://redirect.github.com/facebook/metro/pull/975">facebook/metro#975</a> by <a href="https://github.com/rshest"><code>@rshest</code></a>)</li>
<li><strong>[Fix]</strong>: Fix crash on a module added+modified+removed between updates. (5d7305e2f3a9f5f4aebc889a452afb03b1db12a7 by <a href="https://github.com/robhogan"><code>@robhogan</code></a>)</li>
<li><strong>[Fix]</strong>: Fix missed modification on module removed+modified+added between updates. (5d7305e2f3a9f5f4aebc889a452afb03b1db12a7 by <a href="https://github.com/robhogan"><code>@robhogan</code></a>)</li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/facebook/metro/compare/v0.76.3...v0.76.4">https://github.com/facebook/metro/compare/v0.76.3...v0.76.4</a></p>
<h2>v0.76.3</h2>
<ul>
<li><strong>[Feature]</strong>: Support custom <code>__loadBundleAsync</code> implementations in the default <code>asyncRequire</code> function. See the <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0605-lazy-bundling.md">lazy bundling RFC</a> for more details. (<a href="ac3adced45</a>, <a href="f07ce5c455</a> by <a href="https://github.com/motiz88"><code>@motiz88</code></a>)</li>
<li><strong>[Feature]</strong>: Support <code>lazy</code> parameter in bundle requests. See the <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0605-lazy-bundling.md">lazy bundling RFC</a> for more details. (<a href="4ef14f9a2f</a> by <a href="https://github.com/motiz88"><code>@motiz88</code></a>)</li>
<li><strong>[Feature]</strong>: Preserve comments in unminified builds, while continuing to strip all comments from minified builds. (<a href="https://redirect.github.com/facebook/metro/pull/967">facebook/metro#967</a> by <a href="https://github.com/tido64"><code>@tido64</code></a>)</li>
<li><strong>[Deprecated]</strong>: The <code>transformer.asyncRequireModulePath</code> config option is deprecated. Use <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0605-lazy-bundling.md#__loadbundleasync-in-metro"><code>__loadBundleAsync</code></a> instead.(<a href="c7b684f0ae</a> by <a href="https://github.com/motiz88"><code>@motiz88</code></a>)</li>
</ul>
<blockquote>
<p>NOTE: Experimental features are not covered by semver and can change at any time.</p>
</blockquote>
<ul>
<li><strong>[Experimental]</strong> Package Exports unstable_conditionNames now defaults to ['require', 'import'] (<a href="e70ceef126</a> by <a href="https://github.com/huntie"><code>@huntie</code></a>)</li>
<li><strong>[Experimental]</strong> Removed <code>server.experimentalImportBundleSupport</code> config option. (<a href="4ef14f9a2f</a> by <a href="https://github.com/motiz88"><code>@motiz88</code></a>)</li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/facebook/metro/compare/v0.76.2...v0.76.3">https://github.com/facebook/metro/compare/v0.76.2...v0.76.3</a></p>
<h2>v0.76.2</h2>
<ul>
<li><strong>[Feature]</strong>: Added customizeStack hook to Metro's <code>/symbolicate</code> endpoint to allow custom frame skipping logic on a stack level. (<a href="ce266ddafd</a> by <a href="https://github.com/GijsWeterings"><code>@GijsWeterings</code></a>)</li>
<li><strong>[Feature]</strong>: Re-export <code>metro-core</code>'s <code>Terminal</code> from <code>metro</code>. (<a href="86e3f934d4</a> by <a href="https://github.com/robhogan"><code>@robhogan</code></a>)</li>
<li><strong>[Feature]</strong>: Re-export <code>metro-config</code>'s <code>resolveConfig</code> from <code>metro</code>. (<a href="cc1666415f</a> by <a href="https://github.com/robhogan"><code>@robhogan</code></a>)</li>
<li><strong>[Types]</strong>: Remove dependency on <code>types/babel__code-frame</code>. (<a href="41cdc034a9</a> by <a href="https://github.com/robhogan"><code>@robhogan</code></a>)</li>
<li><strong>[Types]</strong>: Remove dependency on <code>types/ws</code>. (<a href="7deb525916</a> by <a href="https://github.com/robhogan"><code>@robhogan</code></a>)</li>
<li><strong>[Types]</strong>: Fix TypeScript types entry point for metro-source-map. (<a href="3238bbc9f4</a> by <a href="https://github.com/huntie"><code>@huntie</code></a>)</li>
<li><strong>[Deprecated]</strong>: Deprecate <code>ResolutionContext.getPackageForModule</code>. (<a href="2d0a01cd7e</a> by <a href="https://github.com/huntie"><code>@huntie</code></a>)</li>
</ul>
<blockquote>
<p>NOTE: Experimental features are not covered by semver and can change at any time.</p>
</blockquote>
<ul>
<li><strong>[Experimental]</strong>: Pass full path and query params to <code>asyncRequire</code> for lazy bundles. (<a href="61a30b7fc2</a> by <a href="https://github.com/motiz88"><code>@motiz88</code></a>)</li>
<li><strong>[Experimental]</strong>: Fix bug where Package Exports warnings may have been logged for nested <code>node_modules</code> path candidates. (<a href="29c77bff31</a> by <a href="https://github.com/huntie"><code>@huntie</code></a>)</li>
<li><strong>[Experimental]</strong>: Fix <code>package.json</code> discovery against root package specifiers for Package Exports. (<a href="b995303024</a> by <a href="https://github.com/huntie"><code>@huntie</code></a>, fixes <a href="https://redirect.github.com/facebook/metro/issues/965">facebook/metro#965</a> reported by <a href="https://github.com/shamilovtim"><code>@shamilovtim</code></a>)</li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/facebook/metro/compare/v0.76.1...v0.76.2">https://github.com/facebook/metro/compare/v0.76.1...v0.76.2</a></p>
<h2>v0.76.1</h2>
<ul>
<li><strong>[Feature]</strong>: Support custom transformer/resolver options in <code>metro build</code> and <code>runBuild</code> API. (<a href="fcfecc9672</a> by <a href="https://github.com/motiz88"><code>@motiz88</code></a>)</li>
<li><strong>[Feature]</strong>: <code>metro get-dependencies --entryFile <entryFile></code> can now be called as <code>metro get-dependencies <entryFile></code>. (<a href="6fdce04007</a> by <a href="https://github.com/huntie"><code>@huntie</code></a>)</li>
<li><strong>[Feature]</strong>: Add <code>Content-Type</code> and <code>Content-Length</code> headers for assets to Metro server. (<a href="https://redirect.github.com/facebook/metro/pull/953">facebook/metro#953</a> by <a href="https://github.com/aleqsio"><code>@aleqsio</code></a>, <a href="https://redirect.github.com/facebook/metro/pull/961">facebook/metro#961</a> by <a href="https://github.com/byCedric"><code>@byCedric</code></a>)</li>
<li><strong>[Feature]</strong>: Expose <code>mergeConfig</code> util from <code>metro</code> package. (<a href="aa8ec904ce</a> by <a href="https://github.com/huntie"><code>@huntie</code></a>)</li>
<li><strong>[Fix]</strong>: <code>metro-file-map</code>: consistently abort crawl when <code>end()</code> is called. (<a href="51877a8c50</a> by <a href="https://github.com/motiz88"><code>@motiz88</code></a>)</li>
<li><strong>[Fix]</strong>: <code>metro-config</code>: Don't mutate argument to <code>loadConfig</code>. (<a href="38ec62d1a0</a> by <a href="https://github.com/motiz88"><code>@motiz88</code></a>)</li>
<li><strong>[Fix]</strong>: Babel transformers: Provide correct absolute source path to plugins when Metro is not run from the project root. (<a href="de19bbd33f</a> by <a href="https://github.com/robhogan"><code>@robhogan</code></a>)</li>
<li><strong>[Fix]</strong>: <a href="https://facebook.github.io/metro/docs/configuration/#assetexts"><code>resolver.assetExts</code></a> will now match asset files for extension values that include a dot (<code>.</code>). (<a href="6d65a328e6</a> by <a href="https://github.com/huntie"><code>@huntie</code></a>)</li>
<li><strong>[Fix]</strong>: Don't register an <a href="https://nodejs.org/api/process.html#event-unhandledrejection"><code>unhandledRejection</code></a> listener, fix spammy EventEmitter leak warning. (<a href="833f2ffc36</a> by <a href="https://github.com/motiz88"><code>@motiz88</code></a>)</li>
<li><strong>[Types]</strong>: Add bundled TypeScript definitions (partial) for all packages previously on DefinitelyTyped. (<a href="c022c361d0</a>, <a href="07732e778b</a>, <a href="9ee5280bd4</a> by <a href="https://github.com/huntie"><code>@huntie</code></a>, with <a href="https://github.com/afoxman"><code>@afoxman</code></a> and <a href="https://github.com/tido64"><code>@tido64</code></a>)</li>
</ul>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="5d7305e2f3"><code>5d7305e</code></a> Fix graph delta bugs when a dependency is added+modified+removed / removed+mo...</li>
<li><a href="cc9a3463ae"><code>cc9a346</code></a> Release 0.76.4</li>
<li><a href="d21cff8720"><code>d21cff8</code></a> Bump TypeScript in template from 4.8.4 to 5.0.4</li>
<li><a href="024caf7349"><code>024caf7</code></a> Remove Promise libdef override in xplat</li>
<li><a href="c11f75acfc"><code>c11f75a</code></a> Bump "image-size" dependency version 0.6.0->1.0.2 and enable KTX support (<a href="https://redirect.github.com/facebook/metro/issues/975">https://github.com/facebook/flipper/issues/975</a>)</li>
<li><a href="4bcee6a108"><code>4bcee6a</code></a> upgrade to flow v0.205.1</li>
<li><a href="e04c65d4a6"><code>e04c65d</code></a> Codemod <code>$Shape</code> to <code>Partial</code>, some final updates</li>
<li><a href="97d5544f8d"><code>97d5544</code></a> Deploy 0.205.0 to xplat (<a href="https://redirect.github.com/facebook/metro/issues/37172">#37172</a>)</li>
<li><a href="b2facd9e14"><code>b2facd9</code></a> Add package migration guide to Package Exports docs</li>
<li><a href="453f3a677a"><code>453f3a6</code></a> Add Package Exports guide detailing breaking changes</li>
<li>Additional commits viewable in <a href="https://github.com/facebook/metro/compare/v0.76.0...v0.76.4">compare view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `dependabot rebase` will rebase this PR
- `dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `dependabot merge` will merge this PR after your CI passes on it
- `dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `dependabot cancel merge` will cancel a previously requested merge and block automerging
- `dependabot reopen` will reopen this PR if it is closed
- `dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
</details>
Pull Request resolved: https://github.com/facebook/flipper/pull/4740
Reviewed By: passy
Differential Revision: D46015991
Pulled By: ivanmisuno
fbshipit-source-id: f67ea03a882ce313c5fa772bdb7afacba4c9cf55