Commit Graph

1050 Commits

Author SHA1 Message Date
Michel Weststrate
51bfc8f05d Cleanup logger
Summary: Some cleanup around Logger, like renaming `getInstance` -> `getLogger`

Reviewed By: aigoncharov

Differential Revision: D31480828

fbshipit-source-id: d2fa9dc2b45bc34d846d45e396a74b80906d3ad5
2021-10-12 16:00:52 -07:00
Michel Weststrate
91d96774f6 Move files to flipper-common
Summary: Moved Logger, sleep, timeout and server contract types to flipper-common packages.

Reviewed By: passy

Differential Revision: D31475790

fbshipit-source-id: 42d2147698875f9e919ad5250f9953f3bff3ec2d
2021-10-12 16:00:52 -07:00
Michel Weststrate
cfd44b592a Further decouple server from UI
Summary: Further decoupling of `server/` from the rest of the code base. Also fixed a problem with promise chaining causing promises to create unhandled rejection errors.

Reviewed By: passy

Differential Revision: D31474919

fbshipit-source-id: 027cccbe9b57d856c94d63c093d39b6cb3e53312
2021-10-12 16:00:52 -07:00
Anton Nikolaev
1fae3a24c9 Convert all connectivity logs from "log" to "info"
Summary: In a diff down the stack I introduced sending of info/warn/error logs to Scuba. Here I'm just changing level of all connectivity-related logging to "info" as they often required for investigations.

Reviewed By: mweststrate

Differential Revision: D31532770

fbshipit-source-id: 956d6712918291579b3beb12cb91ab69ce1e3859
2021-10-12 07:19:41 -07:00
Anton Nikolaev
64ce2e6f69 Show all plugins in the list even if there is no selected device / app
Summary: Just a small fix to ensure all plugins are shown in the list even if no device / app is connected to Flipper. We show them under "Unavailable plugins" with  explanation why they not available. This allows user to check plugin documentation even without connecting anything to Flipper.

Reviewed By: passy

Differential Revision: D31532732

fbshipit-source-id: 4e481b3d6923bb073a1478b2bd283db25a374c72
2021-10-12 07:19:41 -07:00
Anton Nikolaev
5e3bddc08e Fold warnings about plugins in legacy mode into a single message
Summary: As we now send warn logs to server - it better to reduce their count. This diff folds all the warnings for plugins using the legacy API into one warning.

Reviewed By: passy

Differential Revision: D31532559

fbshipit-source-id: 0621a170e11e9d9645964dd8ecf2f9e753273225
2021-10-12 07:19:41 -07:00
Pascal Hartig
dd190ef2e0 Big dep bump
Summary: Conservatively bumping only patch versions (except the ones we know break stuff).

Reviewed By: nikoant

Differential Revision: D31511737

fbshipit-source-id: 5b55b4689e71975824577f0ac43d806ca37ea232
2021-10-11 02:32:44 -07:00
Pascal Hartig
26ed0875cb Change adb path resolution
Summary:
Quick drive-by change.

`path.resolve` accepts var-args so we don't resolve
to the wrong path on non-Unix systems.

Reviewed By: mweststrate

Differential Revision: D31502481

fbshipit-source-id: a963cd37d13eb8ef68bccf375f3e074fa8961a9e
2021-10-08 09:45:27 -07:00
Pascal Hartig
92ec974040 Update adb failure logging
Summary:
This is not actionable on our end because this will get
triggered for anyone setting a wrong ANDROID_HOME path.

Reviewed By: mweststrate

Differential Revision: D31502390

fbshipit-source-id: 529f1ba940cf6e38363933f706d167196116231a
2021-10-08 09:45:27 -07:00
Michel Weststrate
c3ff0ff355 Set up Flipper decapitated packages
Summary:
This diff introduces the packages necessary for Flipper decapitated.

* flipper-common: utilities & types shared between client, server, flipper-plugin
* flipper-server-core: all device & client management goes in here. Basically flipper's backend
* flipper-ui-core: all UI goes in here, as far as it doesn't depend on Electron
* desktop: the Electron app, will load server-core and ui-core, and glue them together, providing implementations for some electron specific stuff like dialgos
* flipper-server: A node process hosting flipper-server-core, that can be connected to over websockets. And probably can serve a browser version of the UI as well.
* flipper-ui-browser: thin wrapper around flipper-ui-core, providing some browser specific behavior / stubs.
* flipper-dump: (might remove later), but want to hack a quick and dirt flipper dump in here, as alternative way to test flipper-server-core.

This diff just creates the packages, but doesn't move any code, so it can be summarized as:

restoftheowl

Reviewed By: nikoant

Differential Revision: D30218646

fbshipit-source-id: 735598a1261a98e584f52504b5eba01ec0afa162
2021-10-08 01:33:03 -07:00
Michel Weststrate
d56375970d Cleaning up sheet abstraction to use Ant/flipper-plugin dialogs instead
Summary:
This diff cleans up order remaining dialogs, the ones involved in exporting to file or url. Includes some legacy component cleanup boyscouting, but not too much.

This removes a lot of code where state of the wizard was stored globally, and makes it locally instead.

Other code that was removed involves interaction with the old UI, which allowed import / export to be running in the background as well. (which is no longer needed since we optimised the process)

Reviewed By: timur-valiev

Differential Revision: D30192000

fbshipit-source-id: 13be883c5bf217a3d58b610b78516359e9bd0ebc
2021-10-06 09:10:19 -07:00
Michel Weststrate
9e5575cf69 Dialog management cleanup
Summary:
This diff moves the dialogs

* Settings
* Plugin Manager
* Doctor
* Sign in
* Changelog

To use the imperative dialog APIs, rather then organising them through reducers which adds a lot of indirection which isn't really needed but hard to follow.

Reviewed By: passy

Differential Revision: D30192002

fbshipit-source-id: ba38b2e700da3e442653786448fcbf85074981ad
2021-10-06 09:10:19 -07:00
Michel Weststrate
89b193b438 Clean up Sheet abstraction
Summary: This stack gets rid of Flippers old sheet abstraction that relies on native (Electron) overlays, and implements it using Ant dialogs instead. Also removes a lot of code by making dialog API imperative, rather than reducer organised, like done in the deeplink handling.

Reviewed By: passy

Differential Revision: D30192001

fbshipit-source-id: 9bca3274bd039207e58f8f9394027515e391671d
2021-10-06 09:10:19 -07:00
Michel Weststrate
740093d0d9 Separate Client in server and client part
Summary: This diff separates the concept of a Client as now on the UI, from the concept of a Client as known on the server, and makes all interactions with client and vice versa async.

Reviewed By: timur-valiev

Differential Revision: D31235682

fbshipit-source-id: 99089e9b390b4c5359f97f6f2b15bf4b182b6cb9
2021-10-06 09:10:19 -07:00
Pascal Hartig
37529af074 Track plugin selection steps
Summary: Sets up some logging for the various drop-out points when going through the deeplink flow.

Reviewed By: lblasa

Differential Revision: D31345623

fbshipit-source-id: a06ca97c1e687e39ea97a1f47fd8bb614149056f
2021-10-05 11:41:58 -07:00
Michel Weststrate
026f8fc308 Store clients as Map rather than array
Summary: Refactor clients storage: array -> map. A lot of logic looks up clients by their id, which is currently done with an array.find operation, which is pretty inefficient. This diff changes it to a map, that is pretty important, as in the next diff the decoupled client message handing will need to find the client again for every message that arrives.

Reviewed By: timur-valiev

Differential Revision: D31303536

fbshipit-source-id: ca3f540a3de7665930d2354436d37cb0fbfd5546
2021-10-04 07:27:24 -07:00
Michel Weststrate
c9a34d3cc2 Fix inconsistent handling of app id and name
Summary:
Changelog: Improved plugin / device / app selection handing.

During some refactorings I discovered that the `connetions.selectedApp` field contained sometimes an application id, and sometimes just the name. This caused inconsistent behavior especially in unit tests.

I've cleaned that up, and renamed it to `selectedAppId` where applicable, to make the distinction more clear.

And, in contrast, userPreferredApp now always has a name, not an id.

During refactoring our existing selection update logic was quite in the way, which was overcomplicated still, since during the sandy chrome migration, the reducers needed to be able to handle both the old UI, and the new application selection UI. That logic has been simplified now, and a lot of tests were added.

As a further simplification the preferredApp/Device/Plugin are now only read and used when updating selection, but not when running selectors.

Reviewed By: timur-valiev

Differential Revision: D31305180

fbshipit-source-id: 2dbd9f9c33950227cc63aa29cc4a98bdd0db8e7a
2021-10-04 07:27:24 -07:00
Pascal Hartig
20185f37ab Init and error logging
Summary:
Set up some basic logging for deep link usage at the entry point and error cases.

More granular logging coming up next.

Reviewed By: nikoant

Differential Revision: D31337822

fbshipit-source-id: 171eae68fb3d9a11aa155087baf6f8309bbd7295
2021-10-01 12:18:55 -07:00
Pascal Hartig
9ce424adf7 Allowlist some remote usages
Summary: Some drive-by changes as I'm working on other stuff.

Reviewed By: mweststrate

Differential Revision: D31337500

fbshipit-source-id: 8f348af06b7c4b159703d7adf160a7380ba57b22
2021-10-01 08:08:36 -07:00
Pascal Hartig
7dd9cce9f2 Wire up logger
Summary:
Splitting this up into the wiring and the actual usage.
This just ensures we have a logger in place for handling
deeplinks.

Reviewed By: mweststrate

Differential Revision: D31337457

fbshipit-source-id: b088a7396e38554a87502ba7d5669dbef1b398d7
2021-10-01 08:08:36 -07:00
Pascal Hartig
4aa7439fbf Fix Flipper lints #10
Summary:
Grey -> gray. "Cancelled" seems quite common in APIs though, so I disabled that.
A few promise cleanups

Reviewed By: aigoncharov

Differential Revision: D31323610

fbshipit-source-id: c8863d995936f451c24eb408fe5c26677187f089
2021-10-01 08:08:35 -07:00
Pascal Hartig
fe3eda024b Replace promisify(child_process.*)
Summary:
Promisify leads to weird types and sometimes unexpected runtime behaviour. Replacing it with the dep we use everywhere.

It's just really annoying that `stdout` is here explicitly `| null` which isn't the case in the default types.

Reviewed By: timur-valiev

Differential Revision: D31278303

fbshipit-source-id: eadbc49b287704e71a5ecba0d9a311eac91dc6f8
2021-10-01 08:06:11 -07:00
Pascal Hartig
7706b26d7a Exclusively use idb or xcrun for querying devices
Summary:
Simplifies the logic by only using idb when available to query *both* simulators and physical devices.

Changelog: Prefer idb for device listing when available.

Reviewed By: mweststrate

Differential Revision: D31271539

fbshipit-source-id: ac5b73ca5b00b7707bf87cd4d3a6af6e0c0ae214
2021-10-01 08:06:11 -07:00
dependabot[bot]
27938a7e96 Bump @testing-library/dom from 8.2.0 to 8.6.0 in /desktop (#2914)
Summary:
Bumps [testing-library/dom](https://github.com/testing-library/dom-testing-library) from 8.2.0 to 8.6.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/testing-library/dom-testing-library/releases"><code>@​testing-library/dom</code>'s releases</a>.</em></p>
<blockquote>
<h2>v8.6.0</h2>
<h1><a href="https://github.com/testing-library/dom-testing-library/compare/v8.5.0...v8.6.0">8.6.0</a> (2021-09-22)</h1>
<h3>Features</h3>
<ul>
<li>Add support for firing all transition events (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1036">https://github.com/facebook/flipper/issues/1036</a>) (<a href="669602c37c">669602c</a>)</li>
</ul>
<h2>v8.5.0</h2>
<h1><a href="https://github.com/testing-library/dom-testing-library/compare/v8.4.0...v8.5.0">8.5.0</a> (2021-09-11)</h1>
<h3>Features</h3>
<ul>
<li><strong>config:</strong> Add <code>unstable_advanceTimersWrapper</code> (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1022">https://github.com/facebook/flipper/issues/1022</a>) (<a href="45830f580c">45830f5</a>)</li>
</ul>
<h2>v8.4.0</h2>
<h1><a href="https://github.com/testing-library/dom-testing-library/compare/v8.3.0...v8.4.0">8.4.0</a> (2021-09-11)</h1>
<h3>Bug Fixes</h3>
<ul>
<li>Use syntax compatible with older TypeScript versions (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1026">https://github.com/facebook/flipper/issues/1026</a>) (<a href="8311c8d29b">8311c8d</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>Add element type generic argument to queries (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1023">https://github.com/facebook/flipper/issues/1023</a>) (<a href="f55f19bdc8">f55f19b</a>)</li>
</ul>
<h2>v8.3.0</h2>
<h1><a href="https://github.com/testing-library/dom-testing-library/compare/v8.2.0...v8.3.0">8.3.0</a> (2021-09-07)</h1>
<h3>Features</h3>
<ul>
<li>restore prettyDOM logging for Cypress (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1018">https://github.com/facebook/flipper/issues/1018</a>) (<a href="460115a471">460115a</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="669602c37c"><code>669602c</code></a> feat: Add support for firing all transition events (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1036">https://github.com/facebook/flipper/issues/1036</a>)</li>
<li><a href="45830f580c"><code>45830f5</code></a> feat(config): Add <code>unstable_advanceTimersWrapper</code> (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1022">https://github.com/facebook/flipper/issues/1022</a>)</li>
<li><a href="c7ba19337a"><code>c7ba193</code></a> docs: add dfoverdx as a contributor for code (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1029">https://github.com/facebook/flipper/issues/1029</a>)</li>
<li><a href="f55f19bdc8"><code>f55f19b</code></a> feat: Add element type generic argument to queries (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1023">https://github.com/facebook/flipper/issues/1023</a>)</li>
<li><a href="8311c8d29b"><code>8311c8d</code></a> fix: Use syntax compatible with older TypeScript versions (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1026">https://github.com/facebook/flipper/issues/1026</a>)</li>
<li><a href="74c63b7be5"><code>74c63b7</code></a> test: Ensure broken node 16.9.0 isn't used (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1028">#1028</a>)</li>
<li><a href="7b125de130"><code>7b125de</code></a> test: Run full matrix even if a single job fails (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1027">https://github.com/facebook/flipper/issues/1027</a>)</li>
<li><a href="ba8dfb884b"><code>ba8dfb8</code></a> docs: add istateside as a contributor for code, test (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1024">https://github.com/facebook/flipper/issues/1024</a>)</li>
<li><a href="460115a471"><code>460115a</code></a> feat: restore prettyDOM logging for Cypress (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1018">https://github.com/facebook/flipper/issues/1018</a>)</li>
<li><a href="bb79e3027d"><code>bb79e30</code></a> chore(types): Convert src/query-helpers to TS (<a href="https://github-redirect.dependabot.com/testing-library/dom-testing-library/issues/1016">https://github.com/facebook/flipper/issues/1016</a>)</li>
<li>See full diff in <a href="https://github.com/testing-library/dom-testing-library/compare/v8.2.0...v8.6.0">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@testing-library/dom&package-manager=npm_and_yarn&previous-version=8.2.0&new-version=8.6.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/2914

Reviewed By: mweststrate

Differential Revision: D31240098

Pulled By: passy

fbshipit-source-id: 76368d85ca2f28dc0dacb779373ae3beecff146a
2021-10-01 03:37:28 -07:00
dependabot[bot]
1e80107048 Bump js-base64 from 3.7.0 to 3.7.2 in /desktop (#2917)
Summary:
Bumps [js-base64](https://github.com/dankogai/js-base64) from 3.7.0 to 3.7.2.
<details>
<summary>Commits</summary>
<ul>
<li><a href="bf0845d5b5"><code>bf0845d</code></a> version 3.7.2</li>
<li><a href="bbd711c62a"><code>bbd711c</code></a> improve handling of padding =</li>
<li><a href="cb2434f152"><code>cb2434f</code></a> Create codeql-analysis.yml</li>
<li><a href="4c54242333"><code>4c54242</code></a> Create SECURITY.md</li>
<li><a href="8119845603"><code>8119845</code></a> version 3.7.1</li>
<li><a href="e4362c7c51"><code>e4362c7</code></a> package.json: empty <code>dependencies</code></li>
<li>See full diff in <a href="https://github.com/dankogai/js-base64/compare/3.7.0...3.7.2">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=js-base64&package-manager=npm_and_yarn&previous-version=3.7.0&new-version=3.7.2)](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/2917

Reviewed By: mweststrate

Differential Revision: D31240067

Pulled By: passy

fbshipit-source-id: 4724b72e84a10fea3a40a4e1da84a9f6347ec495
2021-10-01 03:37:28 -07:00
dependabot[bot]
1945b4e9d0 Bump @testing-library/react from 12.0.0 to 12.1.1 in /desktop (#2916)
Summary:
Bumps [testing-library/react](https://github.com/testing-library/react-testing-library) from 12.0.0 to 12.1.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/testing-library/react-testing-library/releases"><code>@​testing-library/react</code>'s releases</a>.</em></p>
<blockquote>
<h2>v12.1.1</h2>
<h2><a href="https://github.com/testing-library/react-testing-library/compare/v12.1.0...v12.1.1">12.1.1</a> (2021-09-27)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>TS:</strong> make wrapper allow a simple function comp (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/966">https://github.com/facebook/flipper/issues/966</a>) (<a href="cde904cd16">cde904c</a>)</li>
</ul>
<h2>v12.1.0</h2>
<h1><a href="https://github.com/testing-library/react-testing-library/compare/v12.0.0...v12.1.0">12.1.0</a> (2021-09-11)</h1>
<h3>Features</h3>
<ul>
<li>improve JSDocs for RenderOptions (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/909">https://github.com/facebook/flipper/issues/909</a>) (<a href="fbacb0da99">fbacb0d</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="cde904cd16"><code>cde904c</code></a> fix(TS): make wrapper allow a simple function comp (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/966">https://github.com/facebook/flipper/issues/966</a>)</li>
<li><a href="a218b63163"><code>a218b63</code></a> docs: add akashshyamdev as a contributor for bug (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/967">https://github.com/facebook/flipper/issues/967</a>)</li>
<li><a href="84851dc660"><code>84851dc</code></a> test: Backport tests using the full timer matrix (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/962">https://github.com/facebook/flipper/issues/962</a>)</li>
<li><a href="3325061cac"><code>3325061</code></a> docs: add ImADrafter as a contributor for doc (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/961">https://github.com/facebook/flipper/issues/961</a>)</li>
<li><a href="fbacb0da99"><code>fbacb0d</code></a> feat: improve JSDocs for RenderOptions (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/909">https://github.com/facebook/flipper/issues/909</a>)</li>
<li><a href="071a6fdc1d"><code>071a6fd</code></a> test: Format codebase with prettier (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/959">https://github.com/facebook/flipper/issues/959</a>)</li>
<li><a href="68fd459149"><code>68fd459</code></a> test: Ensure broken node 16.9.0 isn't used (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/960">https://github.com/facebook/flipper/issues/960</a>)</li>
<li><a href="8f3bd3c34f"><code>8f3bd3c</code></a> docs: add leschdom as a contributor for doc (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/941">https://github.com/facebook/flipper/issues/941</a>)</li>
<li><a href="801edaa0d6"><code>801edaa</code></a> docs(CONTRIBUTING): update links (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/932">https://github.com/facebook/flipper/issues/932</a>)</li>
<li>See full diff in <a href="https://github.com/testing-library/react-testing-library/compare/v12.0.0...v12.1.1">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@testing-library/react&package-manager=npm_and_yarn&previous-version=12.0.0&new-version=12.1.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/2916

Reviewed By: mweststrate

Differential Revision: D31240071

Pulled By: passy

fbshipit-source-id: 3a0c24594b0cd1893d310a5dda3d7cd452167c86
2021-10-01 03:37:28 -07:00
Ananya Arun
ed80dcf26c Fetch logs to create paste and autofill them
Summary:
Added fetching logs for flipper and autofilling them too with the create paste link in the description of the support form.

Changed the on click load form function to async to handle this as createPaste returns a promise and not the URL directly.

Reviewed By: mweststrate

Differential Revision: D31268006

fbshipit-source-id: 2a9ee08948198781adadd2b3b9c447f179db7d5c
2021-09-30 04:15:36 -07:00
Ananya Arun
8fd012a8a3 Autofill title and description in the support form
Summary: Added autofill for title and description. Description are the list of steps users have taken to troubleshoot.

Reviewed By: mweststrate

Differential Revision: D31263065

fbshipit-source-id: 932e6cb42438cd2da0d7e8686f0f7e0fa69ee586
2021-09-29 18:28:20 -07:00
Michel Weststrate
ef6e802244 Some Client related cleanups
Summary:
Client up `client.device` (which had no code references anymore) / `client.deviceSync`. Cleaned up feature code for old SDKs (pre 2, which is 3 years old).

This makes decapitating Client a little simpler in the rest of the stack.

Reviewed By: passy

Differential Revision: D31235436

fbshipit-source-id: 919679c1830e2b9368d0787d7b363c090305edb8
2021-09-29 07:01:18 -07:00
Michel Weststrate
906578cc01 Remove flipper_frozen_data GK
Summary: Removed an old GK that has been 100% for all employees for months.

Reviewed By: passy

Differential Revision: D31233413

fbshipit-source-id: ce7d871c5c4f46e9264fdc1c2e4042f0362464f1
2021-09-29 07:01:18 -07:00
Michel Weststrate
e32a377c65 Fix eagerly rejection ADB spawn error
Summary: Fix unnecessary unhandled promise rejection.

Reviewed By: passy

Differential Revision: D31267305

fbshipit-source-id: 90b22fdfa1721f10ad92dbeca74c2ee1988ac15c
2021-09-29 06:56:37 -07:00
Michel Weststrate
816720d708 Stop reporting 'Failed to fetch' errors
Summary: Failed to fetch promise rejections should not be reported

Reviewed By: passy

Differential Revision: D31266851

fbshipit-source-id: ce3c15db5504c01d66b44e032c2b7fb752ec2ec3
2021-09-29 06:56:37 -07:00
dependabot[bot]
f5e4d27bc4 Bump pretty-format from 27.1.0 to 27.2.0 in /desktop (#2861)
Summary:
Bumps [pretty-format](https://github.com/facebook/jest/tree/HEAD/packages/pretty-format) from 27.1.0 to 27.2.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/facebook/jest/releases">pretty-format's releases</a>.</em></p>
<blockquote>
<h2>27.2.0</h2>
<h3>Features</h3>
<ul>
<li><code>[jest-resolver, jest-runtime]</code> Pass <code>conditions</code> to custom resolvers to enable them to implement support for package.json <code>exports</code> field (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11859">#11859</a>)</li>
<li><code>[jest-runtime]</code> Allow custom envs to specify <code>exportConditions</code> which is passed together with Jest's own conditions to custom resolvers (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11863">#11863</a>)</li>
</ul>
<h3>Fixes</h3>
<ul>
<li><code>[jest/reporters]</code> Use async transform if available to transform files with no coverage (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11852">#11852</a>)</li>
<li><code>[jest-util]</code> Return correct value from <code>process.send</code> stub (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11799">#11799</a>)</li>
</ul>
<h2>27.1.1</h2>
<h3>Features</h3>
<ul>
<li><code>[jest-runtime]</code> Add experimental, limited (and undocumented) support for mocking ECMAScript Modules (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11818">#11818</a>)</li>
</ul>
<h3>Fixes</h3>
<ul>
<li><code>[jest-resolver]</code> Support <code>node:</code> prefix when importing Node core modules with ESM (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11817">#11817</a>)</li>
<li><code>[jest-types]</code> Export the <code>PrettyFormatOptions</code> interface (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11801">#11801</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/facebook/jest/blob/main/CHANGELOG.md">pretty-format's changelog</a>.</em></p>
<blockquote>
<h2>27.2.0</h2>
<h3>Features</h3>
<ul>
<li><code>[jest-resolver, jest-runtime]</code> Pass <code>conditions</code> to custom resolvers to enable them to implement support for package.json <code>exports</code> field (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11859">#11859</a>)</li>
<li><code>[jest-runtime]</code> Allow custom envs to specify <code>exportConditions</code> which is passed together with Jest's own conditions to custom resolvers (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11863">#11863</a>)</li>
</ul>
<h3>Fixes</h3>
<ul>
<li><code>[jest/reporters]</code> Use async transform if available to transform files with no coverage (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11852">#11852</a>)</li>
<li><code>[jest-util]</code> Return correct value from <code>process.send</code> stub (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11799">#11799</a>)</li>
</ul>
<h2>27.1.1</h2>
<h3>Features</h3>
<ul>
<li><code>[jest-runtime]</code> Add experimental, limited (and undocumented) support for mocking ECMAScript Modules (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11818">#11818</a>)</li>
</ul>
<h3>Fixes</h3>
<ul>
<li><code>[jest-resolver]</code> Support <code>node:</code> prefix when importing Node core modules with ESM (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11817">#11817</a>)</li>
<li><code>[jest-types]</code> Export the <code>PrettyFormatOptions</code> interface (<a href="https://github-redirect.dependabot.com/facebook/jest/pull/11801">#11801</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="b05635c539"><code>b05635c</code></a> v27.2.0</li>
<li><a href="d6e5ddb0c3"><code>d6e5ddb</code></a> Rename all links to main (<a href="https://github.com/facebook/jest/tree/HEAD/packages/pretty-format/issues/11856">#11856</a>)</li>
<li><a href="111198b62d"><code>111198b</code></a> v27.1.1</li>
<li>See full diff in <a href="https://github.com/facebook/jest/commits/v27.2.0/packages/pretty-format">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pretty-format&package-manager=npm_and_yarn&previous-version=27.1.0&new-version=27.2.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/2861

Reviewed By: timur-valiev

Differential Revision: D30961750

Pulled By: mweststrate

fbshipit-source-id: 2c7a43755e840713b2233abbad7ce131785268b8
2021-09-29 04:38:38 -07:00
Ananya Arun
e974b28c8f Add no device found error msg to guide
Summary:
Added noDeviceErrorMsg as a JSX.Element that will display 'No device found' if there are no devices detected. It is an empty JSX.Element otherwise and nothing is displayed as shown in the video.

I am using a JS variable as a JSX element in this diff. This simplifies the if else checks needed inside return, and reused the same styling we have.

Reviewed By: mweststrate

Differential Revision: D31193647

fbshipit-source-id: dea96232785c9e2987be1513fa3462452c996e66
2021-09-28 09:57:49 -07:00
Joseph Chereshnovsky
795a3d30a0 Migrate away from deprecated instruments utility (#2903)
Summary:
The "instruments" utility was deprecated in Xcode 12 and removed now from Xcode 13, causing all the iOS 15 / Xcode 13  builds to fail to work with Flipper.

See deprecation notice here: https://developer.apple.com/documentation/xcode-release-notes/xcode-12-release-notes

> The instruments command is now deprecated in favor of its replacement: xctrace. Use xctrace to record, import, and export data from Instruments .trace files. (36641078)

The corresponding bug was reported here:
https://github.com/facebook/flipper/issues/2896

That call should be replaced with `xcrun xctrace` run and that is what we are doing here.

IMPORTANT: There was a workaround on killing the stale `instruments` proceses and that utility function is removed as part of this PR, as `instruments` were slow and inefficient, marked for deprecation more than a year ago. `xctrace` should not have that kind of issue and it doesn't make sense to keep this workaround now.

## Changelog

The "instruments" call replaced with `xcrun xctrace` use, to align with deprecation introduced in Xcode 12 and offer Xcode 13 compatibility.

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

Test Plan:
In order to test this we should run the Flipper desktop app and make sure it connects to the Simulator started out of Xcode 13
It fails to do so in `master` version right now, see https://github.com/facebook/flipper/issues/2896

Reviewed By: mweststrate

Differential Revision: D31150276

Pulled By: passy

fbshipit-source-id: 0b45ae23c15a8481a91b1effe814176b04adbf3e
2021-09-28 08:21:34 -07:00
dependabot[bot]
169feb6dc6 Bump @testing-library/react from 12.0.0 to 12.1.0 in /desktop (#2887)
Summary:
Bumps [testing-library/react](https://github.com/testing-library/react-testing-library) from 12.0.0 to 12.1.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/testing-library/react-testing-library/releases"><code>@​testing-library/react</code>'s releases</a>.</em></p>
<blockquote>
<h2>v12.1.0</h2>
<h1><a href="https://github.com/testing-library/react-testing-library/compare/v12.0.0...v12.1.0">12.1.0</a> (2021-09-11)</h1>
<h3>Features</h3>
<ul>
<li>improve JSDocs for RenderOptions (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/909">https://github.com/facebook/flipper/issues/909</a>) (<a href="fbacb0da99">fbacb0d</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="3325061cac"><code>3325061</code></a> docs: add ImADrafter as a contributor for doc (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/961">https://github.com/facebook/flipper/issues/961</a>)</li>
<li><a href="fbacb0da99"><code>fbacb0d</code></a> feat: improve JSDocs for RenderOptions (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/909">https://github.com/facebook/flipper/issues/909</a>)</li>
<li><a href="071a6fdc1d"><code>071a6fd</code></a> test: Format codebase with prettier (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/959">https://github.com/facebook/flipper/issues/959</a>)</li>
<li><a href="68fd459149"><code>68fd459</code></a> test: Ensure broken node 16.9.0 isn't used (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/960">https://github.com/facebook/flipper/issues/960</a>)</li>
<li><a href="8f3bd3c34f"><code>8f3bd3c</code></a> docs: add leschdom as a contributor for doc (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/941">https://github.com/facebook/flipper/issues/941</a>)</li>
<li><a href="801edaa0d6"><code>801edaa</code></a> docs(CONTRIBUTING): update links (<a href="https://github-redirect.dependabot.com/testing-library/react-testing-library/issues/932">https://github.com/facebook/flipper/issues/932</a>)</li>
<li>See full diff in <a href="https://github.com/testing-library/react-testing-library/compare/v12.0.0...v12.1.0">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@testing-library/react&package-manager=npm_and_yarn&previous-version=12.0.0&new-version=12.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/2887

Reviewed By: mweststrate

Differential Revision: D31203906

Pulled By: passy

fbshipit-source-id: a4d9c57c36dc5949396df841742a17f51a42c079
2021-09-27 12:42:27 -07:00
Michel Weststrate
f98526a2c9 Added unit tests to protect against broken startup sequence
Summary: Add unit tests to test errors thrown from plugins during initialisation, as follow up for D31127969 (a72e46c792). From the 4 tests cases added (first load plugin then device, device then plugin, first load plugin then client, first client then plugin), the first case was indeed failing before the mentioned diff and not registering the device.

Reviewed By: passy

Differential Revision: D31142583

fbshipit-source-id: 8e44c667316192231d1bb5e4d76c5bf1207ba835
2021-09-27 12:16:20 -07:00
Michel Weststrate
b539f4d870 Fix startLogging / stopLogging for ArchivedDevice
Summary:
Unit test would fail on trying to emit server commands when creating a ArchivedDevice. But archived devices can silently ignore log start commands, which fixes the failing test as well.

Example failing run: https://github.com/facebook/flipper/runs/3685776120

I'm not sure why the test wasn't _always_ failing

Reviewed By: lblasa

Differential Revision: D31142584

fbshipit-source-id: 57106ecdace9f72444eaf68ee9fa024c84556a1c
2021-09-27 02:16:45 -07:00
Michel Weststrate
987755bb09 Improve device destruction code [8/n]
Summary: Some cleanup in device destruction code. This diff wraps up the stack that decouples device management from the UI. Next steps are client management, and system management (file access / command execution)

Reviewed By: passy

Differential Revision: D31084036

fbshipit-source-id: 93efee7dba2193589d3c08c51128ce03de5eff7f
2021-09-27 02:12:53 -07:00
Michel Weststrate
a72e46c792 Fix error handling in plugin loading
Summary: If a device plugin throw an error in it's initialization, it would prevent the device itself from being registered. This fixes that. As shown in the comments of for example: https://fb.workplace.com/groups/flippersupport/permalink/1218627761951213/

Reviewed By: ananyaarun

Differential Revision: D31127969

fbshipit-source-id: 9824d23b275f1f9e866f841035961e4707ff8e04
2021-09-23 02:52:54 -07:00
Michel Weststrate
3882357579 Factor out realDevice [7/n]
Summary: `device.realDevice` was the escape hatch used in Sandy plugins to give access to device specific features like taking screenshots, clearing logs or accessing `adb`. Since in decapitated Flipper that won't be possible anymore (since plugins run in the client but device implementations on the server), all escape hatches have been bridged in this stack, and we can get of the `realDevice` interaction, by explicitly exposing those cases, which makes it type safe as well.

Reviewed By: passy

Differential Revision: D31079509

fbshipit-source-id: c9ec2e044d0dec0ccb1de287cf424907b198f818
2021-09-22 09:03:33 -07:00
Michel Weststrate
11a27f9e1a Support forward command [6/n]
Summary: Support the adb forward command

Reviewed By: jameslawson

Differential Revision: D31055957

fbshipit-source-id: bc0593320d0e187ddfc8120c1684746f9e9c4cf5
2021-09-22 09:03:33 -07:00
Michel Weststrate
4463e7ede2 Restore metro functionality [4/n]
Summary: Restored Metro functionality; progress reports, metro logs, RN/Hermes debugging, reload / dev menu button

Reviewed By: passy

Differential Revision: D31055958

fbshipit-source-id: c243035c343c14718a9afe275c8f5f36a1aa3a94
2021-09-22 09:03:32 -07:00
Michel Weststrate
3428ce2968 Restore device icons [3/n]
Summary: Restored support for device icons which was disabled in previous diff

Reviewed By: passy

Differential Revision: D31054802

fbshipit-source-id: 107a53f06159211534cb9a2316340af7a7ca530a
2021-09-22 09:03:32 -07:00
Michel Weststrate
2d838efd4d Separate device in server and client version [2/n]
Summary:
This stack takes care of handling care of moving all device interactions over the (possible) async channel FlipperServer. The FlipperServer interface (see previous diff) allows listening to specific server events using `on`, and emit commands to be executed by the server by using `exec` (e.g. `exec('take-screenshot', serial) => Promise<buffer>`).

FlipperServerImpl implements this interface on the server side.

The device implementations are split as follows

```
server / backend process:

ServerDevice
- iOSDevice
- AndroidDevice
- MetroDevice
- DummyDevice
- Mac/Windows Device

frontend / ui:

BaseDevice: a normal connected, device, implements device apis as they already existed
- ArchivedDevice (note that this doesn't have a server counterpart)
- TestDevice (for unit tests, with stubbed backend communication)

```

All features of devices are for simplicity unified (since the deviations are small), where specific device types might not implement certain features like taking screenshots or running shell commands.

To avoid making this diff unnecessarily big, some open Todo's will be addressed later in this stack, and it shouldn't be landed alone.

Reviewed By: timur-valiev

Differential Revision: D30909346

fbshipit-source-id: cce0bee94fdd5db59bebe3577a6084219a038719
2021-09-22 09:03:32 -07:00
Michel Weststrate
845d0755f1 Move common types to flipper-plugin [1/n]
Summary: This is the first diff in a stack of many where server and UI logic is further decoupled to be only communication through an event listener / emitting commands, where all data going over these media is json serializable. In this diff we extract the common interfaces that are to be used by both server and UI layer.

Reviewed By: passy

Differential Revision: D30899609

fbshipit-source-id: dc3c783707d47671f1d0f5dbf99cde17a8f69062
2021-09-22 09:03:32 -07:00
Alex Yur
d5aaa0034d Improve UI when no devices connected
Summary: Remove empty dropdown when no devices connected. Show 'No devices available' test instead.

Reviewed By: passy

Differential Revision: D31088007

fbshipit-source-id: 8a3bf0e8fbff04c7dfe2581f95576b3ab5ed4bcb
2021-09-21 11:44:35 -07:00
Wenhuan Li
4244563b67 fix take screenshot button state
Summary: Take screenshot button state is not reset after screenshot taken. So Flipper can only take 1 screenshot per session.

Reviewed By: mweststrate

Differential Revision: D31018526

fbshipit-source-id: dc7b00f26c77ec94a8a15047f5ae835acdb710c7
2021-09-17 11:24:08 -07:00
Michel Weststrate
c865446312 Fixed issue where ADB would be initialised, despite being disabled in settings
Summary:
As reported here: https://github.com/facebook/flipper/issues/2873, ADB would be initialised, even when disabled explicitly, resulting in an error if ADB could not be found.

Changelog: Fix: made sure that the "Android disabled" setting is respected.

Reviewed By: lblasa

Differential Revision: D31019099

fbshipit-source-id: 9d57945f2c21655426da42eb976dd46d8605d007
2021-09-17 07:24:57 -07:00
Michel Weststrate
dcac1db50f Cleanup android utilities
Summary: Some code simplification. The validation functions are not async, so don't need promises. By combining the internal and non internal files, a lot of utilities can be kept local instead of exposing them

Reviewed By: lblasa

Differential Revision: D31018355

fbshipit-source-id: be568a70fc84971dbce82a8478495edf7dafb4a5
2021-09-17 07:24:57 -07:00