Commit Graph

1383 Commits

Author SHA1 Message Date
Michel Weststrate
be25df6490 Documented createDataSource, DataSource & DataSourceView
Summary: Per title

Reviewed By: nikoant

Differential Revision: D26978363

fbshipit-source-id: b3cfeda0fb0f6556e1ba9041325ae080cba69a7b
2021-03-16 15:03:47 -07:00
Michel Weststrate
602152665b Split DataSource & DataSourceView
Summary:
This diff is primarily cosmetic, just pushing code around to make the API more intuitive. Most importantly, DataSource was split into DataSource and DataSourceView classes, the latter being accessible through `datasource.view`.

The benefit of this is two fold:
1. Conceptually it is much clearer now which operations operate on the _source_ records, and which ones on the derived _view_.
2. This will make it easier in the future to support multiple views to be based on a single data source.

This refactoring also nicely found 2 cases where datasource logic and view logic were mixed.

The only semantic change in this diff is that both DataSource and DataSourceView are now iterable, so that one can do a `for (const record of ds)` / `for (const record of ds.view)`

Reviewed By: nikoant

Differential Revision: D26976838

fbshipit-source-id: 3726e92b3c6ee3417dc66cbbe6e288797eecf70e
2021-03-16 15:03:47 -07:00
Michel Weststrate
d73f6578a7 Support linkify-ing urls
Summary:
Changelog: The new logs plugin will linkify urls and pretty print json-like messages

This implements one of our top papercuts (see linked task), and the WP request over here: https://fb.workplace.com/groups/flipperfyi/permalink/902949260471370/. Partially addresses

https://github.com/facebook/flipper/issues/1162
https://github.com/facebook/flipper/issues/1010
https://github.com/facebook/flipper/issues/2029

Reviewed By: nikoant

Differential Revision: D26947007

fbshipit-source-id: be0fdb476765905ae6b63bd8799c9c6093014de3
2021-03-16 15:03:47 -07:00
Michel Weststrate
66774c90c6 Added support for serialization
Summary: Make sure that DataSources can be serialized directly with a single setting, just like plain state atoms

Reviewed By: nikoant

Differential Revision: D26944954

fbshipit-source-id: 2b0d625d7d67f27a7c2e33dd7c4b534dfa4d3e82
2021-03-16 15:03:46 -07:00
Michel Weststrate
dd4cf9cb4a Optimize shift & process some todo's
Summary:
Noticed in the previous diff that shift is relatively slow for sorted datasources, the reason is that it needs to do a lot of binary searches, and binary search / sorting a full data set is roughly ~20 times slower than resorting a full set, and we're dropping 10% of the data in our test. So if we are shifting too many items in a sorted set, we instead fall back to a rebuild (for non-sorted, shift is super fast because we only drop a bunch of items from the start).

Also solved some more perf related todo's, or made notes about them.

Reviewed By: nikoant

Differential Revision: D26913144

fbshipit-source-id: ee1c04fda1730653affdede0ad22da795e19c2af
2021-03-16 15:03:46 -07:00
Michel Weststrate
bb20c7fd00 Implemented perf tests
Summary:
Added some performance tests for DataSource. Currently simply using jest to run them in a single run, so that is not the most isolated setup (we do GC between tests), but helps to find some global trends at least.

For every scenario two datasets are used, one of 100.000 items, and one of 200.000 items, to verify that all important functions scale roughly linearly or better.

The `append` and `update` test cases perform 1000 insertions / updates. All other tests are singular.

The keyed vs unkeyed variation verifies that we don't drop performance if we maintain a by-key lookup table.

The sorted variations start with an initially already sorted and filtered setup. This nicely show that the datasource really starts to shine with its insertion sort versus full reallocating and sorting

The reference fake implementation does what we do in most cases in Flipper: shallow clone and allocate an entirely new array to append / update data to preserve immutability. Its comparison is pretty terribly, especially considering that in the perf tests we 'render' only once, skewing the stats in favor of the fake implementation: only at the end of the entire batch of updates we sort & filter once (so after inserting a thousand items for example).

In contrast the datasource tests will keep its data sorted at all times, so 'rendering' is already included in the measurements. For the fake datasource, resorting the full 200K rows after each insert would pretty much put bitcoin caused global warming to shame. Also note that the increased GC pressure isn't incorporated in the fake implementation, as we GC outside the measurements.

Reviewed By: nikoant

Differential Revision: D26913145

fbshipit-source-id: 955f1923dce40997cd2e81ea9e80832c6e71c99c
2021-03-16 15:03:46 -07:00
Michel Weststrate
2a3458aff8 Implemented shift operation and limit option
Summary: This diff implements the shift operation, which removes (efficiently) the first (oldest) N records from the datasource. Also implemented a `limit` option to truncate automatically and limit memory usage

Reviewed By: nikoant

Differential Revision: D26883673

fbshipit-source-id: c5ebaf2a327d56cbbe38280c6376c833bcf68b8c
2021-03-16 15:03:46 -07:00
Michel Weststrate
564d440b4a Implemented remove operation
Summary: Implemented `remove`, which, for a typical data source should not be needed. But that would be famous last words and wanted to prevent painting ourselves in a corner, so implemented it. Also because part of the logic is need for the `shift` operation (see next diff), which is much more important.

Reviewed By: priteshrnandgaonkar

Differential Revision: D26883672

fbshipit-source-id: 0dbfcdd3d5a16c4a2d53b0272000d183c67d0034
2021-03-16 15:03:45 -07:00
Michel Weststrate
a610c821d3 Store preferences and scrolling, refactor to useReducer
Reviewed By: priteshrnandgaonkar

Differential Revision: D26848266

fbshipit-source-id: 738d52556b9fb65ec5b5de7c727467227167b9b9
2021-03-16 15:03:45 -07:00
Michel Weststrate
55981b5259 Introduce pause button
Summary: ..and some earlier reviews comments has been processed + some fine tuning on the ui

Reviewed By: priteshrnandgaonkar

Differential Revision: D26816559

fbshipit-source-id: adf2586763be185ee8e7cc22b2827ecefe4e4cab
2021-03-16 15:03:45 -07:00
Michel Weststrate
525e079284 Implement deeplink, creating pastes, log deduplication
Summary:
This diff implements the remaining features in the logs plugin:

- deeplinking
- merging duplicate rows

The logs plugin source code has now been reduced from originally `935` to `285` LoC. All optimisation code has been removed from the plugin:

* debouncing data processing
* pre-rendering (and storing!) all rows

Finally applied some further styling tweaks and applied some renames to DataTable / DataSource + types finetuning. Some more will follow.
Fixed a emotion warning in unit tests which was pretty annoying.

Reviewed By: passy

Differential Revision: D26666190

fbshipit-source-id: e45e289b4422ebeb46cad927cfc0cfcc9566834f
2021-03-16 15:03:45 -07:00
Michel Weststrate
dec8e88aeb Add row styling
Summary:
Added styling / coloring to the new logs plugin, to bring it closer to feature completeness. Made the colum headers slightly more compact

Also made the API more foolproof by introducing the `useAssertStableRef` hook, that will protect against accidentally passing in props that would invalidate rendering every time.

Reviewed By: passy

Differential Revision: D26635063

fbshipit-source-id: 60b2af8db3cc3c12d8d25d922cf1735aed91dd2c
2021-03-16 15:03:45 -07:00
Michel Weststrate
a3b3df639b Show feedback if there are no records visible
Summary:
Per title. Give the user some feedback on why he doesn't see any records (filtering to aggressive vs there are simply no records).

Fixes the old Flipper behavior where tables are merely empty, which always looks kinda broken to me. (Didn't it work, or is there nothing?)

Reviewed By: nikoant

Differential Revision: D26611173

fbshipit-source-id: 7ac798bd7d5c31f6d9fbacf30c6727d2e0e94570
2021-03-16 15:03:44 -07:00
Michel Weststrate
59e6c98669 User experience improvements
Summary:
This diff has some jak-shaving UX improvements after playing with the DataTable a bit more:

Selection
* deselecting a row from a larger set will make the last selected item the default selection
* re-selecting an item in a single selection will unselect it

Column Filtering
* Introduced button to toggle between filtering on all, nothing, and the values present in the current selection

Column sorting
* The up / down arrows are now inidividually clickable, rather than action as a general toggle
* Title still works as a general toggle between asc / desc / not sorted

Context menu
* I found the context menu for column selection and on the selected rows itself a bit finicky to find and click and not super intuitive for noob users. Merged both menus instead into a single hamburger menu adjacent to the search bar

Reviewed By: passy

Differential Revision: D26580038

fbshipit-source-id: 220f501a1d996acbd51088c08ea866caed768572
2021-03-16 15:03:44 -07:00
Michel Weststrate
59a1327261 Introduce multi selection
Summary:
Make sure DataTable supports multiselection, which works largely the same as before, with a few changes

* shift + click and ctrl + click work as expected
* shift + keyboard navigation works as expected
* drag selection works as expected
* drag selection when dragging accross screens, or Shift icmw with HOME / END / PageUp / PageDown works as expect
* text selection stil works as expected

The context menu items have been updated as well
* filter will filter on all the distinct values in the selection
* copying cells will copy all cells of the given column in the selection, separated by newline
* copying rows / creating a past will create a json array of the selection

Not done yet

- Shifting the selection after inserting rows hasn't been implemented yet
- I'm not entirely happy with the context menu trigger, maybe a hamburger button in the toolbar will be better

Reviewed By: nikoant

Differential Revision: D26548228

fbshipit-source-id: 5d1cddd6aad02ce9649d7980ab3a223e222da893
2021-03-16 15:03:44 -07:00
Michel Weststrate
5c3a8742ef Introduce context menu
Summary:
Introduced a context menu for DataTable with some default options. Opted to put it under a visible hovered dropdown instead of on right-click, since this better alings with Ant's design guides (we don't have context clicks anywhere else I think), but if it isn't convincing we can still change it.

Included some default actions, to set up quick filters, and to copy values. For copying rows, implemented it to by default take the JSON from a row, rather than space separated values like in ManagedTable, as many existing plugins customize the onCopy handler to just do that, so it seemed like a better default since it is a richer format. If there are good use cases for the previous behavior, we'll probably find out after the old release :)

Introduced utility to copy text to clipboard in FlipperLib, but decoupled it from Electron.

Didn't include multi select yet, that will be done in a next diff.

Reviewed By: nikoant

Differential Revision: D26513161

fbshipit-source-id: b2b1b20b0a6f4ada9de2566bf6b02171f722c4aa
2021-03-16 15:03:44 -07:00
Michel Weststrate
11eb19da4c Introduce column filters
Summary:
Beyond a search across all columns, it is now possible to specific columns for specific values:

* for a row to be visible, all active column filters need to be matched (e.g. both a filter on time and app has to be satisfied)
* if multiple values within a column are filtered for, these are -or-ed.
* if no value at all within a column is checked, even when they are defined, the column won't take part in filtering
* if there is a general search and column filters, a row has to satisfy both

Filters can be preconfigured, pre-configured filters cannot be removed.

Reseting will reset the filters back to their original

Move `useMemoize` to flipper-plugin

Merged the `ui/utils` and `utils` folder inside `flipper-plugin`

Reviewed By: nikoant

Differential Revision: D26450260

fbshipit-source-id: 11693d5d140cea03cad91c1e0f3438d7b129cf29
2021-03-16 15:03:44 -07:00
Michel Weststrate
8aabce477b Introduce range finder
Summary: Show a hint during scrolling of the relative offset the user is looking at. This is based on the current virtualisation window, so not 100% accurate, but probably still provides the right signal to the user. See the bottom right of the recording

Reviewed By: nikoant

Differential Revision: D26450261

fbshipit-source-id: 206a860024e346c6b872edc3fc7919019046a6d7
2021-03-16 15:03:44 -07:00
Michel Weststrate
1ce665ceaf Added selection / keyboard navigation
Summary: per title

Reviewed By: nikoant

Differential Revision: D26368673

fbshipit-source-id: 7a458e28af1229ee8193dfe2a6d156afd9282acd
2021-03-16 15:03:43 -07:00
Michel Weststrate
fb7c09c972 Add support for search and custom actions
Summary: Introduced search bar and support for custom buttons therein.

Reviewed By: nikoant

Differential Revision: D26338666

fbshipit-source-id: e53cd3c4381e11f5f90c05c92e39a6c8ac2eca65
2021-03-16 15:03:43 -07:00
Michel Weststrate
44bb5b1beb Introduced sorting, column visibility and column resizing
Summary:
Add support for resizable columns, column sorting, and hiding / showing columns

Moved some utilities from Flipper to flipper-plugin, such as Interactive and LowPassFilter

Split DataTable into two components; DataSourceRenderer which takes care of purely rendering the virtualization, and DataTable that has the Chrome around that, such as column headers, search bar, etc.

Reviewed By: nikoant

Differential Revision: D26321105

fbshipit-source-id: 32b8fc03b4fb97b3af52b23e273c3e5b8cbc4498
2021-03-16 15:03:43 -07:00
Michel Weststrate
86ad413669 Initial logs with datasource / datatable setup
Summary:
First rudementary setup of DataTable component that follows a data source. Initially used react-virtuose library, but it performed really badly by doing expensive layout shifts and having troublesome scroll handling. Switched to react-virtual library, which is a bit more level, but much more efficient, and the source code is actually understandable :)

Features:
- hook up to window events of datasource
- high and low prio rendering, based on where the change is happening (should be optimized further)
- sticky scrolling support
- initial column configuration (custom rendering, styling, columns etc will follow in next diffs)

Reviewed By: nikoant

Differential Revision: D26175665

fbshipit-source-id: 224be13b1b32d35e7e01c1dc4198811e2af31102
2021-03-16 15:03:43 -07:00
Michel Weststrate
5b76a0c717 Introduce subscribing to output changes
Summary: This diff introduces the possibility to subscribe to the `output` set of the datasource. It emits three possible event: `reset`, `update`, `shift`.

Reviewed By: jknoxville

Differential Revision: D26100104

fbshipit-source-id: b5fac2289206fab9fb8a437b96ab84034a8b5832
2021-03-16 15:03:43 -07:00
Michel Weststrate
50a8bc91ff Introduce filter
Summary:
Context: https://fb.workplace.com/notes/470523670998369

Per title, also restructured internal logic so that only on intermediate data structure is needed: `output`. This is because we don't need store filter information because we can run that plainly, on the incoming events without storing anything. Sorting is performed directly on `output`. Reverse isn't performed at all, but rather applied lazily when requesting a specific item (so it isn't reflected in output)

Reviewed By: nikoant

Differential Revision: D25976469

fbshipit-source-id: 777f8fdeba09729e19c97c176525b702066b6c2e
2021-03-16 15:03:42 -07:00
Michel Weststrate
6e4fcbdae3 Introduce clear() & reset()
Summary:
clear will drop all current records but keep any view preferences. This typically relates to the "clear" button in Flipper.

reset on the other hand will keep the current records, but just reset the view preferences to the default, dropping any filters and sorting criteria

Reviewed By: nikoant

Differential Revision: D25975612

fbshipit-source-id: 5b419f259bffc049daf125090c6754aa6528919b
2021-03-16 15:03:42 -07:00
Michel Weststrate
66864b8f54 Implement reversing the data source
Summary:
For context see https://fb.workplace.com/notes/470523670998369

This diff adds support for reversing the data collection (in a table this would be used to toggle between ascending and descending sorting). The actual implementation is cleaned up in next diffs and the intermediate collection introduced here is dropped, so this diff is basically only about the unit tests, the implementation is not interesting at this point.

Reviewed By: nikoant

Differential Revision: D25975353

fbshipit-source-id: 2da6da2ed940c2e49e1986696d9b93a7b984db9b
2021-03-16 15:03:42 -07:00
Michel Weststrate
dfda71c350 Implemented sorting
Summary:
For context see https://fb.workplace.com/notes/470523670998369

This diff adds the capability to apply a sorting, and inserts item in a sorted way using binary search in a temporarily intermediate collection. (That collection is optimized away in later diffs, so it is mostly the idea and the tests that are interesting)

Reviewed By: nikoant

Differential Revision: D25953336

fbshipit-source-id: a51b05e25242f0835280ada99798676311511ef0
2021-03-16 15:03:42 -07:00
Michel Weststrate
0dc1abdac4 Initial DataSource setup
Summary:
For context see https://fb.workplace.com/notes/470523670998369

This diff introduces the DataSource abstraction, that can store records. If a key is set a key -> record mapping is stored, to make it easy to update existing records using `upsert`, without knowing their exact index.

Internal storage will be slightly altered in upcoming diffs, so don't pay to much attention to that part.

Reviewed By: nikoant

Differential Revision: D25953337

fbshipit-source-id: 1c3b53a2fcf61abaf061946be4af21d2aecc6c6d
2021-03-16 15:03:42 -07:00
Anton Nikolaev
b2776f1c36 Fix for tests after call to "build-plugins"
Summary: After calling "bundle-all-plugins" locally, "yarn test" is failing with obscure message, because some tests are trying to import built bundles instead of "index.tsx". This diff fixes that.

Reviewed By: passy

Differential Revision: D26986246

fbshipit-source-id: cffe988dc642e2c5d2b2028581cd162350186e0c
2021-03-11 17:07:12 -08:00
generatedunixname89002005306973
59204328c3 Flipper Release: v0.80.0
Summary: Releasing version 0.80.0

Reviewed By: priteshrnandgaonkar

Differential Revision: D26979913

fbshipit-source-id: a309ac59160d2464931f06b978f535c7c712bf08
2021-03-11 08:45:12 -08:00
Anton Nikolaev
f508a35ff9 Fix patch release versioning for open-source version
Summary: Patch was always set to "0" for open source releases even if it is set to "1" in package.json

Reviewed By: passy

Differential Revision: D26975947

fbshipit-source-id: b3f127c9746797fbb5a79dfcd9bd52210c3a7df8
2021-03-11 04:32:21 -08:00
bizzguy
f61b5a1a86 Network plugin - support mocks in imported devices (#2040)
Summary:
It is not currently possible to create mock routes from imported network logs.  This PR will provide that functionality.

See this issue for more details: https://github.com/facebook/flipper/issues/1988

## Changelog

Network plugin - create mocks from imported network logs

Pull Request resolved: https://github.com/facebook/flipper/pull/2040

Test Plan:
Use sample app to create network activity
Export network activity
Import network activity
Create mocks from imported network activity
Verify that mocks work using sample app

Reviewed By: mweststrate

Differential Revision: D26947187

Pulled By: passy

fbshipit-source-id: 5e4e0197c49bb7a8227a70e574613381815e6d30
2021-03-11 03:08:08 -08:00
Anton Nikolaev
58b2daea02 Bundle all plugins script
Summary: New script which bundles all plugins. It is faster to bundle them all in one script rather than call "build-plugin" for each of them. The new script will be used in CI to catch regressions when some plugins cannot be bundled into standalone packages.

Reviewed By: passy

Differential Revision: D26918103

fbshipit-source-id: dbc5c4cd706e8d585718a198dbd7ae9ffd988e28
2021-03-10 08:09:02 -08:00
Anton Nikolaev
c065760d15 Stable babel transformation cache key
Summary:
This diff makes babel transformation cache key stable. With the previous approach it was changed on each CI build so it was not possible to persist cache between builds. Now it is computed from the transformation package content after each build. Because of that it is equal for every CI build while Babel transformations unchanged and so we could use same cache on different Sandcastle agents.

In addition to that, it makes it possible to specify directory for Metro cache so we can save/restore it in CI builds.

Reviewed By: mweststrate

Differential Revision: D26877989

fbshipit-source-id: 7cb04a177f86e61986585e5a74d9c7396ddddc18
2021-03-10 08:09:02 -08:00
Anton Nikolaev
baeb8ba5be Performance improvements for "build-plugin" task
Summary:
Few improvements for "build-plugin" task which together with Sandcastle command changes (D26872427) helps to build all plugins in CI ~30% faster if most of them has not changed (which is usually the case):
1) compute package checksum in the same script to not call additional yarn scripts for each plugin
2) avoid packaging plugin if it's checksum has not changed since last release

Reviewed By: mweststrate

Differential Revision: D26872253

fbshipit-source-id: 968102d32a1550ea7503f1169f0ef2863296383f
2021-03-10 08:09:02 -08:00
Pritesh Nandgaonkar
5df0fd6e52 Update the device name for DummyDevice type
Summary: This diff updates the device display name in the drop down for DummyDevice

Reviewed By: mweststrate

Differential Revision: D26945724

fbshipit-source-id: 6a82c6353f6d8dfe6d3a60e06f0f78d00c39ff59
2021-03-10 06:34:37 -08:00
Pritesh Nandgaonkar
50f31f9fe0 Update the device plugins supported devices arguments
Summary:
Device plugins won't work for DummyDevice type as the device id is a fake one for this.

This diff updates the "supportedDevices" for the plugins.

Reviewed By: mweststrate

Differential Revision: D26944601

fbshipit-source-id: a29acc288f8f0c564f52db02914e7b0491b211d2
2021-03-10 06:34:36 -08:00
Pritesh Nandgaonkar
60994bd41f Rename ClientDevice to DummyDevice
Summary: Rename ClientDevice to DummyDevice. It is being currently used in the case when we do cert exchange through WWW/Distillery. In this mode we are not able to figure out the exact device id(instead we create a fake one) and thus we would not like to use Android or IOSDevice for such cases.

Reviewed By: mweststrate

Differential Revision: D26944415

fbshipit-source-id: f9f76e8997cf5402ba5627ae1959f5a11e078bb1
2021-03-10 06:34:36 -08:00
dependabot[bot]
6531b1ff5c Bump @ant-design/icons from 4.4.0 to 4.5.0 in /desktop (#2019)
Summary:
Bumps [ant-design/icons](https://github.com/ant-design/ant-design-icons) from 4.4.0 to 4.5.0.
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/ant-design/ant-design-icons/commits">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@ant-design/icons&package-manager=npm_and_yarn&previous-version=4.4.0&new-version=4.5.0)](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/2019

Reviewed By: mweststrate

Differential Revision: D26889248

Pulled By: passy

fbshipit-source-id: 753cc63b9417b5e33eb0593122b248fc0c69b0f7
2021-03-10 04:39:03 -08:00
dependabot[bot]
f87cad5eca Bump @oclif/dev-cli from 1.22.2 to 1.26.0 in /desktop (#2016)
Summary:
Bumps [oclif/dev-cli](https://github.com/oclif/dev-cli) from 1.22.2 to 1.26.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/oclif/dev-cli/releases"><code>@​oclif/dev-cli's releases</code></a>.</em></p>
<blockquote>
<h2>v1.26.0</h2>
<h1><a href="https://github.com/oclif/dev-cli/compare/v1.25.1...v1.26.0">1.26.0</a> (2020-12-10)</h1>
<h3>Features</h3>
<ul>
<li>adding region, sslEnabled and s3ForcePathStyle through env vars (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/280">https://github.com/facebook/flipper/issues/280</a>) (<a href="9a317382e1">9a31738</a>)</li>
</ul>
<h2>v1.25.1</h2>
<h2><a href="https://github.com/oclif/dev-cli/compare/v1.25.0...v1.25.1">1.25.1</a> (2020-12-02)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>find yarn.lock in a yarn workspace (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/156">https://github.com/facebook/flipper/issues/156</a>) (<a href="fd59d36b24">fd59d36</a>)</li>
</ul>
<h2>v1.25.0</h2>
<h1><a href="https://github.com/oclif/dev-cli/compare/v1.24.4...v1.25.0">1.25.0</a> (2020-12-02)</h1>
<h3>Features</h3>
<ul>
<li>add macos uninstaller (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/137">https://github.com/facebook/flipper/issues/137</a>) (<a href="6e3b34bba9">6e3b34b</a>)</li>
</ul>
<h2>v1.24.4</h2>
<h2><a href="https://github.com/oclif/dev-cli/compare/v1.24.3...v1.24.4">1.24.4</a> (2020-12-02)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>delete the uninstall registry key (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/136">https://github.com/facebook/flipper/issues/136</a>) (<a href="0949b0d985">0949b0d</a>)</li>
</ul>
<h2>v1.24.3</h2>
<h2><a href="https://github.com/oclif/dev-cli/compare/v1.24.2...v1.24.3">1.24.3</a> (2020-12-02)</h2>
<h3>Reverts</h3>
<ul>
<li>Revert &quot;chore(deps): bump fs-extra from 8.1.0 to 9.0.1 (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/274">https://github.com/facebook/flipper/issues/274</a>)&quot; (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/275">https://github.com/facebook/flipper/issues/275</a>) (<a href="dbdbd8b05e">dbdbd8b</a>), closes <a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/274">https://github.com/facebook/flipper/issues/274</a> <a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/275">https://github.com/facebook/flipper/issues/275</a></li>
</ul>
<h2>v1.24.2</h2>
<h2><a href="https://github.com/oclif/dev-cli/compare/v1.24.1...v1.24.2">1.24.2</a> (2020-12-01)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>restore command descriptions in README generation (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/268">https://github.com/facebook/flipper/issues/268</a>) (<a href="e02ebe7053">e02ebe7</a>), closes <a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/267">https://github.com/facebook/flipper/issues/267</a></li>
</ul>
<h2>v1.24.1</h2>
<h2><a href="https://github.com/oclif/dev-cli/compare/v1.24.0...v1.24.1">1.24.1</a> (2020-11-20)</h2>

</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/oclif/dev-cli/blob/master/CHANGELOG.md"><code>@​oclif/dev-cli's changelog</code></a>.</em></p>
<blockquote>
<h2><a href="https://github.com/oclif/dev-cli/compare/v1.25.0...v1.25.1">1.25.1</a> (2020-12-02)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>find yarn.lock in a yarn workspace (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/156">https://github.com/facebook/flipper/issues/156</a>) (<a href="fd59d36b24">fd59d36</a>)</li>
</ul>
<h1><a href="https://github.com/oclif/dev-cli/compare/v1.24.4...v1.25.0">1.25.0</a> (2020-12-02)</h1>
<h3>Features</h3>
<ul>
<li>add macos uninstaller (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/137">https://github.com/facebook/flipper/issues/137</a>) (<a href="6e3b34bba9">6e3b34b</a>)</li>
</ul>
<h2><a href="https://github.com/oclif/dev-cli/compare/v1.24.3...v1.24.4">1.24.4</a> (2020-12-02)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>delete the uninstall registry key (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/136">https://github.com/facebook/flipper/issues/136</a>) (<a href="0949b0d985">0949b0d</a>)</li>
</ul>
<h2><a href="https://github.com/oclif/dev-cli/compare/v1.24.2...v1.24.3">1.24.3</a> (2020-12-02)</h2>
<h3>Reverts</h3>
<ul>
<li>Revert &quot;chore(deps): bump fs-extra from 8.1.0 to 9.0.1 (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/274">https://github.com/facebook/flipper/issues/274</a>)&quot; (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/275">https://github.com/facebook/flipper/issues/275</a>) (<a href="dbdbd8b05e">dbdbd8b</a>), closes <a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/274">https://github.com/facebook/flipper/issues/274</a> <a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/275">https://github.com/facebook/flipper/issues/275</a></li>
</ul>
<h2><a href="https://github.com/oclif/dev-cli/compare/v1.24.1...v1.24.2">1.24.2</a> (2020-12-01)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>restore command descriptions in README generation (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/268">https://github.com/facebook/flipper/issues/268</a>) (<a href="e02ebe7053">e02ebe7</a>), closes <a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/267">https://github.com/facebook/flipper/issues/267</a></li>
</ul>
<h2><a href="https://github.com/oclif/dev-cli/compare/v1.24.0...v1.24.1">1.24.1</a> (2020-11-20)</h2>
<h3>Bug Fixes</h3>

</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="81f28676e0"><code>81f2867</code></a> chore(release): 1.26.0 [skip ci]</li>
<li><a href="9a317382e1"><code>9a31738</code></a> feat: adding region, sslEnabled and s3ForcePathStyle through env vars (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/280">https://github.com/facebook/flipper/issues/280</a>)</li>
<li><a href="6b319b274c"><code>6b319b2</code></a> chore(release): 1.25.1 [skip ci]</li>
<li><a href="fd59d36b24"><code>fd59d36</code></a> fix: find yarn.lock in a yarn workspace (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/156">https://github.com/facebook/flipper/issues/156</a>)</li>
<li><a href="4da752ae48"><code>4da752a</code></a> chore(release): 1.25.0 [skip ci]</li>
<li><a href="6e3b34bba9"><code>6e3b34b</code></a> feat: add macos uninstaller (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/137">https://github.com/facebook/flipper/issues/137</a>)</li>
<li><a href="902ea696aa"><code>902ea69</code></a> chore(release): 1.24.4 [skip ci]</li>
<li><a href="0949b0d985"><code>0949b0d</code></a> fix: delete the uninstall registry key (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/136">https://github.com/facebook/flipper/issues/136</a>)</li>
<li><a href="c0a444e424"><code>c0a444e</code></a> chore(deps): bump tslib from 1.14.1 to 2.0.3 (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/278">https://github.com/facebook/flipper/issues/278</a>)</li>
<li><a href="447ea9782e"><code>447ea97</code></a> chore(deps-dev): bump oclif/test from 1.2.4 to 1.2.8 (<a href="https://github-redirect.dependabot.com/oclif/dev-cli/issues/276">https://github.com/facebook/flipper/issues/276</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/oclif/dev-cli/compare/v1.22.2...v1.26.0">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@oclif/dev-cli&package-manager=npm_and_yarn&previous-version=1.22.2&new-version=1.26.0)](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/2016

Reviewed By: mweststrate

Differential Revision: D26889217

Pulled By: passy

fbshipit-source-id: 0204a506af211567cb6153aa053967abb2440596
2021-03-10 04:39:03 -08:00
dependabot[bot]
6ac66a0d2d Bump @types/archiver from 3.1.1 to 5.1.0 in /desktop (#2020)
Summary:
Bumps [types/archiver](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/archiver) from 3.1.1 to 5.1.0.
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/archiver">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/archiver&package-manager=npm_and_yarn&previous-version=3.1.1&new-version=5.1.0)](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/2020

Reviewed By: mweststrate

Differential Revision: D26889183

Pulled By: passy

fbshipit-source-id: 60ab86160e29ebf53d8291bac14ef25da9c99e2e
2021-03-10 03:51:55 -08:00
dependabot[bot]
b9afadf4a4 Bump @types/node from 14.14.10 to 14.14.31 in /desktop (#2021)
Summary:
Bumps [types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 14.14.10 to 14.14.31.
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/node&package-manager=npm_and_yarn&previous-version=14.14.10&new-version=14.14.31)](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/2021

Reviewed By: mweststrate

Differential Revision: D26889123

Pulled By: passy

fbshipit-source-id: 1c7616e2556fec89db5d6a5b45bb75bcffef82f7
2021-03-09 11:23:26 -08:00
dependabot[bot]
27c5f2390e Bump @types/jest from 26.0.15 to 26.0.20 in /desktop (#2024)
Summary:
Bumps [types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 26.0.15 to 26.0.20.
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jest">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/jest&package-manager=npm_and_yarn&previous-version=26.0.15&new-version=26.0.20)](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/2024

Reviewed By: mweststrate

Differential Revision: D26843905

Pulled By: passy

fbshipit-source-id: b9537ff8c371ee9660943361e3eeafba23707928
2021-03-09 09:46:30 -08:00
dependabot[bot]
fe63f93306 Bump npm-api from 1.0.0 to 1.0.1 in /desktop (#2023)
Summary:
Bumps [npm-api](https://github.com/doowb/npm-api) from 1.0.0 to 1.0.1.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/doowb/npm-api/blob/master/CHANGELOG.md">npm-api's changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<h2>key</h2>
<p>Changelog entries are classified using the following labels <em>(from [keep-a-changelog][]</em>):</p>
<ul>
<li><code>added</code>: for new features</li>
<li><code>changed</code>: for changes in existing functionality</li>
<li><code>deprecated</code>: for once-stable features removed in upcoming releases</li>
<li><code>removed</code>: for deprecated features removed in this release</li>
<li><code>fixed</code>: for any bug fixes</li>
</ul>
<h2>[Unreleased]</h2>
<h3>Added</h3>
<ul>
<li>Used <a href="https://github.com/generate/generate-log">generate-log</a> to add a CHANGELOG.md</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="54ed79976c"><code>54ed799</code></a> 1.0.1</li>
<li><a href="eb3a173fea"><code>eb3a173</code></a> run verb to generate README documentation</li>
<li><a href="45e73252e8"><code>45e7325</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/doowb/npm-api/issues/14">https://github.com/facebook/flipper/issues/14</a> from Hypnosphi/remove-request</li>
<li><a href="98281dfe6e"><code>98281df</code></a> Replace request with node-fetch</li>
<li><a href="5bc3fde2f7"><code>5bc3fde</code></a> update description and run verb to generate README documentation</li>
<li><a href="1ebcbadbe6"><code>1ebcbad</code></a> update code comments and generate README documentation with verb</li>
<li><a href="77ba08195e"><code>77ba081</code></a> use generate-log to create a changelog.md</li>
<li>See full diff in <a href="https://github.com/doowb/npm-api/compare/1.0.0...1.0.1">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=npm-api&package-manager=npm_and_yarn&previous-version=1.0.0&new-version=1.0.1)](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/2023

Reviewed By: mweststrate

Differential Revision: D26889073

Pulled By: passy

fbshipit-source-id: c78387d9c6764e605ac72d302f8f590ca96417a2
2021-03-09 05:29:05 -08:00
bizzguy
d07b74eed0 Network Plugin - Disable routes (#1969)
Summary:
Mock routes may contain quite a bit of data for header values and response bodies.  Currently, to turn off a mock a user must delete the mock and then go through the process of creating it when needed again.  This change will allow a user to temporarily disable a mock without deleting it.

A checkbox on the Routes list is used to enable/disable mocks.  As shown in this screenshot:

![image](https://user-images.githubusercontent.com/337874/109360670-3a3fb280-784d-11eb-83fd-724f0bb067d3.png)

## Changelog

Network Plugin - disable/enable mock routes

Pull Request resolved: https://github.com/facebook/flipper/pull/1969

Test Plan:
Create mocks using sample app
Verify that mocks are working as expected
Disable the mocks
Verify that the client has been updated with mocks (minus the disabled ones) user Flipper Messages plugin
Use the sample app to send the disabled requests again and verify that they are not mocked

Reviewed By: mweststrate

Differential Revision: D26888815

Pulled By: passy

fbshipit-source-id: cb8a05a27dd69ba4d2b60085a077efe795a99a7c
2021-03-08 11:52:36 -08:00
Pritesh Nandgaonkar
226e042e1d Fix the broken xcode detection due to space
Summary: Due to the space in the path, `fs.pathExists` returned false even if the path was existent. Thus added `.trim()` to fix it.

Reviewed By: passy

Differential Revision: D26869404

fbshipit-source-id: 146a96262353177e786f5100a1dad9af7c7d398b
2021-03-08 04:59:42 -08:00
Pritesh Nandgaonkar
a2d559c8c0 Detect Physical iOS device without Xcode
Summary:
This diff adds the support of detecting physical device in Flipper even if the xcode is not installed and there is no cli tool installed.

See the demo.

Reviewed By: timur-valiev

Differential Revision: D26816588

fbshipit-source-id: 5f052998fcbe5c51385222d16df0e1855177b552
2021-03-05 11:36:20 -08:00
Ostap Manastyrski
b26ca1502d Remove time display on android screen recordings
Summary:
Changelog: Creating an Android screen recording no longer includes meta information like frame rate.

Context: https://fb.workplace.com/groups/flippersupport/permalink/1088379648309359/

Before:
{F454408806}

Reviewed By: mweststrate

Differential Revision: D26765408

fbshipit-source-id: 560d7ba4ff4ccff1b4a17f1c1073efe7638e397a
2021-03-05 10:28:36 -08:00
Anton Nikolaev
095667b742 Fix "failed to find appMatchPatterns" error
Summary: Fixed an error which happens on second and subsequent device connection to Flipper

Reviewed By: passy

Differential Revision: D26829255

fbshipit-source-id: 17eb603647626a2168e330ec67f4a89783219356
2021-03-05 03:50:24 -08:00
generatedunixname89002005306973
85e5c33265 Flipper Release: v0.79.1
Summary: Releasing version 0.79.1

Reviewed By: passy

Differential Revision: D26820464

fbshipit-source-id: 8ca29bca6b011159e158c43806760f2a2056fc0b
2021-03-04 12:03:50 -08:00