From 6fcaaabb1733e644f21acc7f0845c807ac123325 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Thu, 8 Sep 2022 04:26:41 -0700 Subject: [PATCH 0001/1651] Remove unused observer Summary: ^ This was replaced by `ApplicationRef` Reviewed By: antonk52 Differential Revision: D39313539 fbshipit-source-id: ad9b5c3ed963046ba0349fd5112bb9cb5de7640b --- .../uidebugger/core/ApplicationObserver.kt | 99 ------------------- 1 file changed, 99 deletions(-) delete mode 100644 android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/ApplicationObserver.kt diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/ApplicationObserver.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/ApplicationObserver.kt deleted file mode 100644 index 650e0459d..000000000 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/ApplicationObserver.kt +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.core - -import android.app.Activity -import android.app.Application -import android.os.Bundle -import android.view.View -import java.lang.ref.WeakReference - -class ApplicationObserver(val application: Application) : Application.ActivityLifecycleCallbacks { - interface ActivityStackChangedListener { - fun onActivityStackChanged(stack: List) - } - - interface ActivityDestroyedListener { - fun onActivityDestroyed(activity: Activity) - } - - private val rootsResolver: RootViewResolver - private val activities: MutableList> - private var activityStackChangedlistener: ActivityStackChangedListener? = null - private var activityDestroyedListener: ActivityDestroyedListener? = null - - override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { - activities.add(WeakReference(activity)) - activityStackChangedlistener?.let { listener -> - listener.onActivityStackChanged(this.activitiesStack) - } - } - override fun onActivityStarted(activity: Activity) {} - override fun onActivityResumed(activity: Activity) {} - override fun onActivityPaused(activity: Activity) {} - override fun onActivityStopped(activity: Activity) {} - override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} - override fun onActivityDestroyed(activity: Activity) { - val activityIterator: MutableIterator> = activities.iterator() - - while (activityIterator.hasNext()) { - if (activityIterator.next().get() === activity) { - activityIterator.remove() - } - } - - activityDestroyedListener?.let { listener -> listener.onActivityDestroyed(activity) } - - activityStackChangedlistener?.let { listener -> - listener.onActivityStackChanged(this.activitiesStack) - } - } - - fun setActivityStackChangedListener(listener: ActivityStackChangedListener?) { - activityStackChangedlistener = listener - } - - fun setActivityDestroyedListener(listener: ActivityDestroyedListener?) { - activityDestroyedListener = listener - } - - val activitiesStack: List - get() { - val stack: MutableList = ArrayList(activities.size) - val activityIterator: MutableIterator> = activities.iterator() - while (activityIterator.hasNext()) { - val activity: Activity? = activityIterator.next().get() - if (activity == null) { - activityIterator.remove() - } else { - stack.add(activity) - } - } - return stack - } - - val rootViews: List - get() { - val roots = rootsResolver.listActiveRootViews() - roots?.let { roots -> - val viewRoots: MutableList = ArrayList(roots.size) - for (root in roots) { - viewRoots.add(root.view) - } - return viewRoots - } - - return emptyList() - } - - init { - rootsResolver = RootViewResolver() - application.registerActivityLifecycleCallbacks(this) - activities = ArrayList>() - } -} From 13afb8b8024db49303315cb63daf39aa95ce6662 Mon Sep 17 00:00:00 2001 From: Joshua May Date: Thu, 8 Sep 2022 04:27:00 -0700 Subject: [PATCH 0002/1651] Use supplied path when installing plugin from NPM to prevent escaping issues (#3825) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Resolves https://github.com/facebook/flipper/issues/3819 This PR fixes Flipper's plugin installation, so that scoped plugins (with `/` in the name) can be successfully installed (+removed). In more detail, Flipper's function [`installPluginFromNpm()`](https://github.com/facebook/flipper/blob/69bac4a3d6b5546ef6bd05b8124c33304380a758/desktop/plugin-lib/src/pluginInstaller.tsx#L99-L114) relies on the `live-plugin-manager` package to handle the NPM package to a temporary directory. Before this patch, Flipper would assume the name of the directory (incorrectly). This patch simply uses the directory as provided by `live-plugin-manager`'s result. If we use `shopify/flipper-plugin-react-native-performance` as a concrete example after this patch: - `installPluginFromNpm()` is called to install `shopify/flipper-plugin-react-native-performance` - `plugManNoDep.install()` installs the plugin to `/path/to/tmp/shopify/flipper-plugin-react-native-performance` - note: before this patch, it would have been assumed to be installed to: `/path/to/tmp/shopify__flipper-plugin-react-native-performance` which does not exist - `installPluginFromTempDir()` is called to install the package to `~/.flipper/installed-plugins/shopify__flipper-plugin-react-native-performance/{version}` (where `{version}` is the current version, i.e. `1.0.0`) Once the plugin is in `~/.flipper/installed-plugins/`, the escaping is correctly applied consistently by Flipper, and there are no further issues managing/using the plugin. ## Changelog Fixed errors when installing scoped NPM plugins Pull Request resolved: https://github.com/facebook/flipper/pull/3825 Test Plan: Ideally we'd have some unit tests, but mocking out the NPM fetching in `live-plugin-manager` seems like a bunch of work. If you have some shortcuts, let me know, because this would be useful to test across platforms. But in the meantime, we can easily manually test this. ### Reproduce the failure First, let's reproduce the failure: - run Flipper 0.150.0 (or `yarn start` on master, etc) - open plugin marketplace, attempt to install scoped plugins - installation will fail (with ⚠️ icon) Screen Shot 2022-06-20 at 1 18 21 pm - logs will show a failure to read `package.json` Screen Shot 2022-06-20 at 1 18 39 pm ### Demonstrate success - run Flipper from this branch (via `yarn start`) - open plugin marketplace, attempt to install scoped plugins - installation will succeed, with notification to restart Flipper image - (package can also be successfully used/upgraded/uninstalled) Reviewed By: lawrencelomax Differential Revision: D39345564 Pulled By: lblasa fbshipit-source-id: 729d70a29c7941e59ac03bb21061fc1d2bc8d998 --- desktop/plugin-lib/src/pluginInstaller.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/desktop/plugin-lib/src/pluginInstaller.tsx b/desktop/plugin-lib/src/pluginInstaller.tsx index 6cc04ae9e..eaa0bf16f 100644 --- a/desktop/plugin-lib/src/pluginInstaller.tsx +++ b/desktop/plugin-lib/src/pluginInstaller.tsx @@ -22,7 +22,6 @@ import {InstalledPluginDetails} from 'flipper-common'; import {getInstalledPluginDetails, isPluginDir} from './getPluginDetails'; import { getPluginVersionInstallationDir, - getPluginDirNameFromPackageName, getPluginInstallationDir, pluginInstallationDir, legacyPluginInstallationDir, @@ -102,12 +101,8 @@ export async function installPluginFromNpm(name: string) { await fs.ensureDir(tmpDir); const plugManNoDep = providePluginManagerNoDependencies(); plugManNoDep.options.pluginsPath = tmpDir; - await plugManNoDep.install(name); - const pluginTempDir = path.join( - tmpDir, - getPluginDirNameFromPackageName(name), - ); - return await installPluginFromTempDir(pluginTempDir); + const pluginInfo = await plugManNoDep.install(name); + return await installPluginFromTempDir(pluginInfo.location); } finally { await fs.remove(tmpDir); } From 73b6f93f90021488d6e2e724f37906b99f2b0cd0 Mon Sep 17 00:00:00 2001 From: Maykon Michel Palma Date: Thu, 8 Sep 2022 04:31:13 -0700 Subject: [PATCH 0003/1651] fix!: dependency.platforms.ios.project is not allowed on RN 0.69 (#3860) Summary: BREAKING CHANGE: it won't work with react-native CLI 4.2.2 as it will search for an xcode project Fixes https://github.com/facebook/flipper/issues/3859 ## Changelog fix: dependency.platforms.ios.project is not allowed on RN 0.69 Pull Request resolved: https://github.com/facebook/flipper/pull/3860 Test Plan: I don't know how to test my branch directly, but I did a simple change that can easily be tested with this method: Start a fresh `react-native` 0.69 project: ``` npx react-native init flipperBugTest ``` Then install `react-native-flipper` package: ``` yarn add -D react-native-flipper ``` Navigate to `flipperBugTest/node_modules/react-native-flipper` and delete `react-native.config.js` file. And start `react-native` metro: ``` react-native start ``` Reviewed By: antonk52 Differential Revision: D39345618 Pulled By: lblasa fbshipit-source-id: 2cc74e2dd7100aab693c8e66f01d5b4ced402dd3 --- .../react-native.config.js | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 react-native/react-native-flipper/react-native.config.js diff --git a/react-native/react-native-flipper/react-native.config.js b/react-native/react-native-flipper/react-native.config.js deleted file mode 100644 index 9b962ed1c..000000000 --- a/react-native/react-native-flipper/react-native.config.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -module.exports = { - dependency: { - platforms: { - ios: { - // This file should not be needed at all, but without it. - // cli 4.2.2 will search for an xcode project - project: '.', - }, - }, - }, -}; From 2fb90369f1a67e140e4b380f2683d5fe36a25eb3 Mon Sep 17 00:00:00 2001 From: Anton Kastritskiy Date: Thu, 8 Sep 2022 06:56:06 -0700 Subject: [PATCH 0004/1651] automatic update for docusaurus-plugin-internaldocs-fb@1.0.0,@docusaurus/core@2.1.0,@docusaurus/plugin-client-redirects@2.1.0,@docusaurus/preset-classic@2.1.0 Differential Revision: D39310992 fbshipit-source-id: 18dd5e935f76fa99d4a4b377b9f5c5ac271c2e52 --- website/package.json | 8 +- website/src/theme/EmbeddedLayout/index.js | 5 +- website/yarn.lock | 1885 ++++++++++++--------- 3 files changed, 1113 insertions(+), 785 deletions(-) diff --git a/website/package.json b/website/package.json index 1cdd30913..40bbeb6e6 100644 --- a/website/package.json +++ b/website/package.json @@ -12,14 +12,14 @@ }, "devDependencies": { "@ant-design/icons": "^4.7.0", - "@docusaurus/core": "^2.0.0-beta.21", - "@docusaurus/plugin-client-redirects": "2.0.0-beta.21", - "@docusaurus/preset-classic": "^2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/plugin-client-redirects": "2.1.0", + "@docusaurus/preset-classic": "2.1.0", "@emotion/css": "^11.7.1", "@emotion/styled": "^11.6.0", "@types/fs-extra": "^9.0.13", "antd": "^4.18.7", - "docusaurus-plugin-internaldocs-fb": "0.12.3", + "docusaurus-plugin-internaldocs-fb": "1.0.0", "file-cli": "^1.2.0", "flipper-plugin": "^0.131.1", "fs-extra": "^10.0.0", diff --git a/website/src/theme/EmbeddedLayout/index.js b/website/src/theme/EmbeddedLayout/index.js index b5eab042c..9155c59ed 100644 --- a/website/src/theme/EmbeddedLayout/index.js +++ b/website/src/theme/EmbeddedLayout/index.js @@ -7,9 +7,10 @@ import React from 'react'; import clsx from 'clsx'; -import LayoutProviders from '@theme/LayoutProviders'; +import LayoutProviders from '@theme/Layout/Provider'; import Head from '@docusaurus/Head'; -import {ThemeClassNames, useKeyboardNavigation} from '@docusaurus/theme-common'; +import {ThemeClassNames} from '@docusaurus/theme-common'; +import {useKeyboardNavigation} from '@docusaurus/theme-common/internal'; import './styles.css'; function EmbeddedLayout(props) { diff --git a/website/yarn.lock b/website/yarn.lock index 416829390..27b8242de 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -2,17 +2,24 @@ # yarn lockfile v1 -"@algolia/autocomplete-core@1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.6.3.tgz#76832fffb6405ac2c87bac5a040b8a31a1cdef80" - integrity sha512-dqQqRt01fX3YuVFrkceHsoCnzX0bLhrrg8itJI1NM68KjrPYQPYsE+kY8EZTCM4y8VDnhqJErR73xe/ZsV+qAA== +"@algolia/autocomplete-core@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.7.1.tgz#025538b8a9564a9f3dd5bcf8a236d6951c76c7d1" + integrity sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg== dependencies: - "@algolia/autocomplete-shared" "1.6.3" + "@algolia/autocomplete-shared" "1.7.1" -"@algolia/autocomplete-shared@1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.6.3.tgz#52085ce89a755977841ed0a463aa31ce8f1dea97" - integrity sha512-UV46bnkTztyADFaETfzFC5ryIdGVb2zpAoYgu0tfcuYWjhg1KbLXveFffZIrGVoboqmAk1b+jMrl6iCja1i3lg== +"@algolia/autocomplete-preset-algolia@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.1.tgz#7dadc5607097766478014ae2e9e1c9c4b3f957c8" + integrity sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg== + dependencies: + "@algolia/autocomplete-shared" "1.7.1" + +"@algolia/autocomplete-shared@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.1.tgz#95c3a0b4b78858fed730cf9c755b7d1cd0c82c74" + integrity sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg== "@algolia/cache-browser-local-storage@4.10.3": version "4.10.3" @@ -283,6 +290,13 @@ dependencies: "@babel/highlight" "^7.16.7" +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/code-frame@^7.8.3": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" @@ -300,6 +314,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.5.tgz#acac0c839e317038c73137fbb6ef71a1d6238471" integrity sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.0.tgz#2a592fd89bacb1fcde68de31bee4f2f2dacb0e86" + integrity sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw== + "@babel/core@7.12.9": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" @@ -322,7 +341,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.15.5", "@babel/core@^7.18.2": +"@babel/core@^7.15.5": version "7.18.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000" integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ== @@ -343,6 +362,27 @@ json5 "^2.2.1" semver "^6.3.0" +"@babel/core@^7.18.6": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.0.tgz#d2f5f4f2033c00de8096be3c9f45772563e150c3" + integrity sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.0" + "@babel/helper-compilation-targets" "^7.19.0" + "@babel/helper-module-transforms" "^7.19.0" + "@babel/helpers" "^7.19.0" + "@babel/parser" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + "@babel/generator@^7.12.5", "@babel/generator@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15" @@ -370,6 +410,15 @@ "@jridgewell/gen-mapping" "^0.3.0" jsesc "^2.5.1" +"@babel/generator@^7.18.7", "@babel/generator@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.0.tgz#785596c06425e59334df2ccee63ab166b738419a" + integrity sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg== + dependencies: + "@babel/types" "^7.19.0" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" @@ -391,6 +440,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191" @@ -399,13 +455,13 @@ "@babel/helper-explode-assignable-expression" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" "@babel/helper-compilation-targets@^7.13.0": version "7.15.0" @@ -427,7 +483,17 @@ browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.18.2": +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz#537ec8339d53e806ed422f1e06c8f17d55b96bb0" + integrity sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA== + dependencies: + "@babel/compat-data" "^7.19.0" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-compilation-targets@^7.18.2": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== @@ -461,7 +527,7 @@ "@babel/helper-replace-supers" "^7.15.4" "@babel/helper-split-export-declaration" "^7.15.4" -"@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0": +"@babel/helper-create-class-features-plugin@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19" integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg== @@ -474,6 +540,19 @@ "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz#bfd6904620df4e46470bae4850d66be1054c404b" + integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-create-regexp-features-plugin@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" @@ -482,13 +561,13 @@ "@babel/helper-annotate-as-pure" "^7.14.5" regexpu-core "^4.7.1" -"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd" - integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" + integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^5.0.1" + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.1.0" "@babel/helper-define-polyfill-provider@^0.2.2": version "0.2.3" @@ -504,15 +583,13 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== +"@babel/helper-define-polyfill-provider@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073" + integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg== dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" @@ -523,6 +600,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + "@babel/helper-explode-assignable-expression@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz#8aa72e708205c7bb643e45c73b4386cdf2a1f645" @@ -530,12 +612,12 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" "@babel/helper-function-name@^7.14.5": version "7.14.5" @@ -555,7 +637,7 @@ "@babel/template" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": +"@babel/helper-function-name@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== @@ -563,6 +645,14 @@ "@babel/template" "^7.16.7" "@babel/types" "^7.17.0" +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + "@babel/helper-get-function-arity@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" @@ -598,6 +688,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-member-expression-to-functions@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b" @@ -619,6 +716,13 @@ dependencies: "@babel/types" "^7.17.0" +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== + dependencies: + "@babel/types" "^7.18.9" + "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" @@ -640,6 +744,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.14.5": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08" @@ -682,6 +793,20 @@ "@babel/traverse" "^7.18.0" "@babel/types" "^7.18.0" +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" + integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + "@babel/helper-optimise-call-expression@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" @@ -703,6 +828,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-plugin-utils@7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" @@ -723,6 +855,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== +"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" + integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== + "@babel/helper-remap-async-to-generator@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz#51439c913612958f54a987a4ffc9ee587a2045d6" @@ -741,14 +878,15 @@ "@babel/helper-wrap-function" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== +"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" "@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.0": version "7.15.0" @@ -770,7 +908,7 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-replace-supers@^7.16.7", "@babel/helper-replace-supers@^7.18.2": +"@babel/helper-replace-supers@^7.16.7": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz#41fdfcc9abaf900e18ba6e5931816d9062a7b2e0" integrity sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q== @@ -781,6 +919,17 @@ "@babel/traverse" "^7.18.2" "@babel/types" "^7.18.2" +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" + integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + "@babel/helper-simple-access@^7.14.8": version "7.14.8" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" @@ -795,13 +944,20 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-simple-access@^7.17.7", "@babel/helper-simple-access@^7.18.2": +"@babel/helper-simple-access@^7.17.7": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== dependencies: "@babel/types" "^7.18.2" +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-skip-transparent-expression-wrappers@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" @@ -816,12 +972,12 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" + integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.18.9" "@babel/helper-split-export-declaration@^7.14.5": version "7.14.5" @@ -844,6 +1000,18 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": version "7.14.9" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" @@ -859,6 +1027,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" @@ -869,6 +1042,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + "@babel/helper-wrap-function@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz#5919d115bf0fe328b8a5d63bcb610f51601f2bff" @@ -889,15 +1067,15 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== +"@babel/helper-wrap-function@^7.18.9": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" + integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" "@babel/helpers@^7.12.5": version "7.15.3" @@ -917,6 +1095,15 @@ "@babel/traverse" "^7.18.2" "@babel/types" "^7.18.2" +"@babel/helpers@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" + integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== + dependencies: + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" @@ -944,6 +1131,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.12.7", "@babel/parser@^7.14.5", "@babel/parser@^7.15.0": version "7.15.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862" @@ -954,17 +1150,22 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== -"@babel/parser@^7.16.7", "@babel/parser@^7.18.3", "@babel/parser@^7.18.5": +"@babel/parser@^7.16.7", "@babel/parser@^7.18.5": version "7.18.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e" - integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw== +"@babel/parser@^7.18.10", "@babel/parser@^7.18.8", "@babel/parser@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.0.tgz#497fcafb1d5b61376959c1c338745ef0577aa02c" + integrity sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": version "7.15.4" @@ -975,14 +1176,14 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" "@babel/plugin-proposal-optional-chaining" "^7.14.5" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753" - integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" + integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" "@babel/plugin-proposal-async-generator-functions@^7.15.8": version "7.15.8" @@ -993,13 +1194,14 @@ "@babel/helper-remap-async-to-generator" "^7.15.4" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-async-generator-functions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03" - integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ== +"@babel/plugin-proposal-async-generator-functions@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.0.tgz#cf5740194f170467df20581712400487efc79ff1" + integrity sha512-nhEByMUTx3uZueJ/QkJuSlCfN4FGg+xy+vRsfGQGzSauq5ks2Deid2+05Q3KhfaUjvec1IGhw/Zm3cFm8JigTQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-proposal-class-properties@^7.14.5": @@ -1010,13 +1212,13 @@ "@babel/helper-create-class-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-class-properties@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4" - integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw== +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-class-static-block@^7.15.4": version "7.15.4" @@ -1027,13 +1229,13 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-class-static-block@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz#7d02253156e3c3793bdb9f2faac3a1c05f0ba710" - integrity sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA== +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" + integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import@^7.14.5": @@ -1044,12 +1246,12 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-proposal-export-namespace-from@^7.14.5": @@ -1060,12 +1262,12 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378" - integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ== +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-json-strings@^7.14.5": @@ -1076,12 +1278,12 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664" - integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg== +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-proposal-logical-assignment-operators@^7.14.5": @@ -1092,12 +1294,12 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-logical-assignment-operators@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23" - integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" + integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": @@ -1108,12 +1310,12 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be" - integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-proposal-numeric-separator@^7.14.5": @@ -1124,12 +1326,12 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-proposal-object-rest-spread@7.12.1": @@ -1152,16 +1354,16 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.15.4" -"@babel/plugin-proposal-object-rest-spread@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz#79f2390c892ba2a68ec112eb0d895cfbd11155e8" - integrity sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw== +"@babel/plugin-proposal-object-rest-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" + integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.17.12" + "@babel/plugin-transform-parameters" "^7.18.8" "@babel/plugin-proposal-optional-catch-binding@^7.14.5": version "7.14.5" @@ -1171,12 +1373,12 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining@^7.14.5": @@ -1188,13 +1390,13 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174" - integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ== +"@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.14.5": @@ -1205,13 +1407,13 @@ "@babel/helper-create-class-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-private-methods@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c" - integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A== +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-private-property-in-object@^7.15.4": version "7.15.4" @@ -1223,14 +1425,14 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-private-property-in-object@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d" - integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg== +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" + integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": @@ -1241,13 +1443,13 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d" - integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A== +"@babel/plugin-proposal-unicode-property-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -1284,12 +1486,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz#58096a92b11b2e4e54b24c6a0cc0e5e607abcedd" - integrity sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw== +"@babel/plugin-syntax-import-assertions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" + integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -1319,6 +1521,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -1382,6 +1591,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-syntax-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" + integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-arrow-functions@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" @@ -1389,12 +1605,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45" - integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA== +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" + integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-async-to-generator@^7.14.5": version "7.14.5" @@ -1405,14 +1621,14 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-remap-async-to-generator" "^7.14.5" -"@babel/plugin-transform-async-to-generator@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832" - integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ== +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" + integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" "@babel/plugin-transform-block-scoped-functions@^7.14.5": version "7.14.5" @@ -1421,12 +1637,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.15.3": version "7.15.3" @@ -1435,12 +1651,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoping@^7.17.12": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz#7988627b3e9186a13e4d7735dc9c34a056613fb9" - integrity sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw== +"@babel/plugin-transform-block-scoping@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" + integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-classes@^7.15.4": version "7.15.4" @@ -1455,18 +1671,19 @@ "@babel/helper-split-export-declaration" "^7.15.4" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.17.12": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz#51310b812a090b846c784e47087fa6457baef814" - integrity sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A== +"@babel/plugin-transform-classes@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz#0e61ec257fba409c41372175e7c1e606dc79bb20" + integrity sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-replace-supers" "^7.18.2" - "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.19.0" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.14.5": @@ -1476,12 +1693,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-computed-properties@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f" - integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ== +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" + integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-destructuring@^7.14.7": version "7.14.7" @@ -1490,12 +1707,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-destructuring@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858" - integrity sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw== +"@babel/plugin-transform-destructuring@^7.18.13": + version "7.18.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz#9e03bc4a94475d62b7f4114938e6c5c33372cbf5" + integrity sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.14.5" @@ -1505,13 +1722,13 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-dotall-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== +"@babel/plugin-transform-dotall-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-duplicate-keys@^7.14.5": version "7.14.5" @@ -1520,12 +1737,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-duplicate-keys@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c" - integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw== +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-exponentiation-operator@^7.14.5": version "7.14.5" @@ -1535,13 +1752,13 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-for-of@^7.15.4": version "7.15.4" @@ -1550,12 +1767,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-for-of@^7.18.1": - version "7.18.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz#ed14b657e162b72afbbb2b4cdad277bf2bb32036" - integrity sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg== +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-function-name@^7.14.5": version "7.14.5" @@ -1565,14 +1782,14 @@ "@babel/helper-function-name" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-literals@^7.14.5": version "7.14.5" @@ -1581,12 +1798,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-literals@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae" - integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ== +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-member-expression-literals@^7.14.5": version "7.14.5" @@ -1595,12 +1812,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-amd@^7.14.5": version "7.14.5" @@ -1611,13 +1828,13 @@ "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-amd@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz#7ef1002e67e36da3155edc8bf1ac9398064c02ed" - integrity sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA== +"@babel/plugin-transform-modules-amd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21" + integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-commonjs@^7.15.4": @@ -1630,14 +1847,14 @@ "@babel/helper-simple-access" "^7.15.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz#1aa8efa2e2a6e818b6a7f2235fceaf09bdb31e9e" - integrity sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ== +"@babel/plugin-transform-modules-commonjs@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" + integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-simple-access" "^7.18.2" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.15.4": @@ -1651,15 +1868,15 @@ "@babel/helper-validator-identifier" "^7.14.9" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.18.0": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.5.tgz#87f11c44fbfd3657be000d4897e192d9cb535996" - integrity sha512-SEewrhPpcqMF1V7DhnEbhVJLrC+nnYfe1E0piZMZXBpxi9WvZqWGwpsk7JYP7wPWeqaBh4gyKlBhHJu3uz5g4Q== +"@babel/plugin-transform-modules-systemjs@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz#5f20b471284430f02d9c5059d9b9a16d4b085a1f" + integrity sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A== dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.19.0" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-validator-identifier" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-umd@^7.14.5": @@ -1670,13 +1887,13 @@ "@babel/helper-module-transforms" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-modules-umd@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz#56aac64a2c2a1922341129a4597d1fd5c3ff020f" - integrity sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA== +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": version "7.14.9" @@ -1685,13 +1902,13 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931" - integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.0.tgz#58c52422e4f91a381727faed7d513c89d7f41ada" + integrity sha512-HDSuqOQzkU//kfGdiHBt71/hkDTApw4U/cMVgKgX7PqfB3LOaK+2GtCEsBu1dL9CkswDm0Gwehht1dCr421ULQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-regexp-features-plugin" "^7.19.0" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-new-target@^7.14.5": version "7.14.5" @@ -1700,12 +1917,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-new-target@^7.17.12": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.5.tgz#8c228c4a07501dd12c95c5f23d1622131cc23931" - integrity sha512-TuRL5uGW4KXU6OsRj+mLp9BM7pO8e7SGNTEokQRRxHFkXYMFiy2jlKSZPFtI/mKORDzciH+hneskcSOp0gU8hg== +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-object-super@^7.14.5": version "7.14.5" @@ -1715,13 +1932,13 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-replace-supers" "^7.14.5" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" "@babel/plugin-transform-parameters@^7.12.1": version "7.14.5" @@ -1737,12 +1954,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-parameters@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766" - integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA== +"@babel/plugin-transform-parameters@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" + integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-property-literals@^7.14.5": version "7.14.5" @@ -1751,12 +1968,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-constant-elements@^7.14.5": version "7.17.12" @@ -1772,6 +1989,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-react-jsx-development@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" @@ -1779,6 +2003,13 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.16.7" +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz#2aa20022709cd6a3f40b45d60603d5f269586dba" @@ -1790,6 +2021,17 @@ "@babel/plugin-syntax-jsx" "^7.17.12" "@babel/types" "^7.17.12" +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" + integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.19.0" + "@babel/plugin-transform-react-pure-annotations@^7.16.7": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz#ef82c8e310913f3522462c9ac967d395092f1954" @@ -1798,6 +2040,14 @@ "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-regenerator@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" @@ -1805,12 +2055,12 @@ dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-regenerator@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz#44274d655eb3f1af3f3a574ba819d3f48caf99d5" - integrity sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw== +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" + integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" regenerator-transform "^0.15.0" "@babel/plugin-transform-reserved-words@^7.14.5": @@ -1820,23 +2070,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-reserved-words@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f" - integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA== +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-runtime@^7.18.2": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.5.tgz#f4d3188ba6a8815793993c71c2c225d0ee1d7743" - integrity sha512-Q17hHxXr2fplrE+5BSC1j1Fo5cOA8YeP8XW3/1paI8MzF/faZGh0MaH1KC4jLAvqLPamQWHB5/B7KqSLY1kuHA== +"@babel/plugin-transform-runtime@^7.18.6": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz#37d14d1fa810a368fd635d4d1476c0154144a96f" + integrity sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.2" + babel-plugin-polyfill-corejs3 "^0.5.3" + babel-plugin-polyfill-regenerator "^0.4.0" semver "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.14.5": @@ -1846,12 +2096,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-spread@^7.15.8": version "7.15.8" @@ -1861,13 +2111,13 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" -"@babel/plugin-transform-spread@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5" - integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg== +"@babel/plugin-transform-spread@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" + integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-transform-sticky-regex@^7.14.5": version "7.14.5" @@ -1876,12 +2126,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-template-literals@^7.14.5": version "7.14.5" @@ -1890,12 +2140,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-template-literals@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz#31ed6915721864847c48b656281d0098ea1add28" - integrity sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g== +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typeof-symbol@^7.14.5": version "7.14.5" @@ -1904,12 +2154,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typeof-symbol@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889" - integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw== +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.17.12": version "7.18.4" @@ -1920,6 +2170,15 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-typescript" "^7.17.12" +"@babel/plugin-transform-typescript@^7.18.6": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.0.tgz#50c3a68ec8efd5e040bde2cd764e8e16bc0cbeaf" + integrity sha512-DOOIywxPpkQHXijXv+s9MDAyZcLp12oYRl3CMWZ6u7TjSoCBq/KqHR/nNFR3+i2xqheZxoF0H2XyL7B6xeSRuA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.19.0" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-typescript" "^7.18.6" + "@babel/plugin-transform-unicode-escapes@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" @@ -1927,12 +2186,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-unicode-regex@^7.14.5": version "7.14.5" @@ -1942,13 +2201,13 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/preset-env@^7.15.6": version "7.15.8" @@ -2029,38 +2288,38 @@ core-js-compat "^3.16.0" semver "^6.3.0" -"@babel/preset-env@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.2.tgz#f47d3000a098617926e674c945d95a28cb90977a" - integrity sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q== +"@babel/preset-env@^7.18.6": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.0.tgz#fd18caf499a67d6411b9ded68dc70d01ed1e5da7" + integrity sha512-1YUju1TAFuzjIQqNM9WsF4U6VbD/8t3wEAlw3LFYuuEr+ywqLRcSXxFKz4DCEj+sN94l/XTDiUXYRrsvMpz9WQ== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-compilation-targets" "^7.18.2" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12" - "@babel/plugin-proposal-async-generator-functions" "^7.17.12" - "@babel/plugin-proposal-class-properties" "^7.17.12" - "@babel/plugin-proposal-class-static-block" "^7.18.0" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.17.12" - "@babel/plugin-proposal-json-strings" "^7.17.12" - "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.18.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.17.12" - "@babel/plugin-proposal-private-methods" "^7.17.12" - "@babel/plugin-proposal-private-property-in-object" "^7.17.12" - "@babel/plugin-proposal-unicode-property-regex" "^7.17.12" + "@babel/compat-data" "^7.19.0" + "@babel/helper-compilation-targets" "^7.19.0" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.19.0" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.18.9" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.17.12" + "@babel/plugin-syntax-import-assertions" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -2070,43 +2329,43 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.17.12" - "@babel/plugin-transform-async-to-generator" "^7.17.12" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.17.12" - "@babel/plugin-transform-classes" "^7.17.12" - "@babel/plugin-transform-computed-properties" "^7.17.12" - "@babel/plugin-transform-destructuring" "^7.18.0" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.17.12" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.18.1" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.17.12" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.18.0" - "@babel/plugin-transform-modules-commonjs" "^7.18.2" - "@babel/plugin-transform-modules-systemjs" "^7.18.0" - "@babel/plugin-transform-modules-umd" "^7.18.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12" - "@babel/plugin-transform-new-target" "^7.17.12" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.17.12" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.18.0" - "@babel/plugin-transform-reserved-words" "^7.17.12" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.17.12" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.18.2" - "@babel/plugin-transform-typeof-symbol" "^7.17.12" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.18.9" + "@babel/plugin-transform-classes" "^7.19.0" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.18.13" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.18.6" + "@babel/plugin-transform-modules-commonjs" "^7.18.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.0" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.0" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.18.2" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" + "@babel/types" "^7.19.0" + babel-plugin-polyfill-corejs2 "^0.3.2" + babel-plugin-polyfill-corejs3 "^0.5.3" + babel-plugin-polyfill-regenerator "^0.4.0" core-js-compat "^3.22.1" semver "^6.3.0" @@ -2132,7 +2391,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.14.5", "@babel/preset-react@^7.17.12": +"@babel/preset-react@^7.14.5": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.17.12.tgz#62adbd2d1870c0de3893095757ed5b00b492ab3d" integrity sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA== @@ -2144,7 +2403,19 @@ "@babel/plugin-transform-react-jsx-development" "^7.16.7" "@babel/plugin-transform-react-pure-annotations" "^7.16.7" -"@babel/preset-typescript@^7.15.0", "@babel/preset-typescript@^7.17.12": +"@babel/preset-react@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + +"@babel/preset-typescript@^7.15.0": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz#40269e0a0084d56fc5731b6c40febe1c9a4a3e8c" integrity sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg== @@ -2153,10 +2424,19 @@ "@babel/helper-validator-option" "^7.16.7" "@babel/plugin-transform-typescript" "^7.17.12" -"@babel/runtime-corejs3@^7.18.3": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz#52f0241a31e0ec61a6187530af6227c2846bd60c" - integrity sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q== +"@babel/preset-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" + +"@babel/runtime-corejs3@^7.18.6": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.0.tgz#0df75cb8e5ecba3ca9e658898694e5326d52397f" + integrity sha512-JyXXoCu1N8GLuKc2ii8y5RGma5FMpFeO2nAQIe0Yzrbq+rQnN+sFj47auLblR5ka6aHNGPDgv8G/iI2Grb0ldQ== dependencies: core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" @@ -2175,13 +2455,20 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.12.13", "@babel/runtime@^7.18.3": +"@babel/runtime@^7.12.13": version "7.18.3" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.18.6": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" + integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.12.7", "@babel/template@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" @@ -2209,6 +2496,15 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" @@ -2239,7 +2535,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5": +"@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5": version "7.18.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd" integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA== @@ -2255,6 +2551,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.18.8", "@babel/traverse@^7.18.9", "@babel/traverse@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.0.tgz#eb9c561c7360005c592cc645abafe0c3c4548eed" + integrity sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.0" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.19.0" + "@babel/types" "^7.19.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.12.7", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.0", "@babel/types@^7.4.4": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" @@ -2271,7 +2583,7 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" -"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4": +"@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4": version "7.18.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== @@ -2279,6 +2591,15 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" + integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA== + dependencies: + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" @@ -2316,43 +2637,44 @@ resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz#c3c5ae543c897caa9c2a68630bed355be5f9990f" integrity sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ== -"@docsearch/css@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.1.0.tgz#6781cad43fc2e034d012ee44beddf8f93ba21f19" - integrity sha512-bh5IskwkkodbvC0FzSg1AxMykfDl95hebEKwxNoq4e5QaGzOXSBgW8+jnMFZ7JU4sTBiB04vZWoUSzNrPboLZA== +"@docsearch/css@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.2.1.tgz#c05d7818b0e43b42f9efa2d82a11c36606b37b27" + integrity sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g== -"@docsearch/react@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.1.0.tgz#da943a64c01ee82b04e53b691806469272f943f7" - integrity sha512-bjB6ExnZzf++5B7Tfoi6UXgNwoUnNOfZ1NyvnvPhWgCMy5V/biAtLL4o7owmZSYdAKeFSvZ5Lxm0is4su/dBWg== +"@docsearch/react@^3.1.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.2.1.tgz#112ad88db07367fa6fd933d67d58421d8d8289aa" + integrity sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ== dependencies: - "@algolia/autocomplete-core" "1.6.3" - "@docsearch/css" "3.1.0" + "@algolia/autocomplete-core" "1.7.1" + "@algolia/autocomplete-preset-algolia" "1.7.1" + "@docsearch/css" "3.2.1" algoliasearch "^4.0.0" -"@docusaurus/core@2.0.0-beta.21", "@docusaurus/core@^2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-beta.21.tgz#50897317b22dbd94b1bf91bb30c2a0fddd15a806" - integrity sha512-qysDMVp1M5UozK3u/qOxsEZsHF7jeBvJDS+5ItMPYmNKvMbNKeYZGA0g6S7F9hRDwjIlEbvo7BaX0UMDcmTAWA== +"@docusaurus/core@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.1.0.tgz#4aedc306f4c4cd2e0491b641bf78941d4b480ab6" + integrity sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q== dependencies: - "@babel/core" "^7.18.2" - "@babel/generator" "^7.18.2" + "@babel/core" "^7.18.6" + "@babel/generator" "^7.18.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.18.2" - "@babel/preset-env" "^7.18.2" - "@babel/preset-react" "^7.17.12" - "@babel/preset-typescript" "^7.17.12" - "@babel/runtime" "^7.18.3" - "@babel/runtime-corejs3" "^7.18.3" - "@babel/traverse" "^7.18.2" - "@docusaurus/cssnano-preset" "2.0.0-beta.21" - "@docusaurus/logger" "2.0.0-beta.21" - "@docusaurus/mdx-loader" "2.0.0-beta.21" + "@babel/plugin-transform-runtime" "^7.18.6" + "@babel/preset-env" "^7.18.6" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@babel/runtime" "^7.18.6" + "@babel/runtime-corejs3" "^7.18.6" + "@babel/traverse" "^7.18.8" + "@docusaurus/cssnano-preset" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/mdx-loader" "2.1.0" "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.0.0-beta.21" - "@docusaurus/utils-common" "2.0.0-beta.21" - "@docusaurus/utils-validation" "2.0.0-beta.21" - "@slorber/static-site-generator-webpack-plugin" "^4.0.4" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-common" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" + "@slorber/static-site-generator-webpack-plugin" "^4.0.7" "@svgr/webpack" "^6.2.1" autoprefixer "^10.4.7" babel-loader "^8.2.5" @@ -2365,10 +2687,10 @@ combine-promises "^1.1.0" commander "^5.1.0" copy-webpack-plugin "^11.0.0" - core-js "^3.22.7" + core-js "^3.23.3" css-loader "^6.7.1" css-minimizer-webpack-plugin "^4.0.0" - cssnano "^5.1.9" + cssnano "^5.1.12" del "^6.1.1" detect-port "^1.3.0" escape-html "^1.0.3" @@ -2381,7 +2703,7 @@ import-fresh "^3.3.0" leven "^3.1.0" lodash "^4.17.21" - mini-css-extract-plugin "^2.6.0" + mini-css-extract-plugin "^2.6.1" postcss "^8.4.14" postcss-loader "^7.0.0" prompts "^2.4.2" @@ -2392,49 +2714,48 @@ react-router "^5.3.3" react-router-config "^5.1.1" react-router-dom "^5.3.3" - remark-admonitions "^1.2.1" rtl-detect "^1.0.4" semver "^7.3.7" serve-handler "^6.1.3" shelljs "^0.8.5" - terser-webpack-plugin "^5.3.1" + terser-webpack-plugin "^5.3.3" tslib "^2.4.0" update-notifier "^5.1.0" url-loader "^4.1.1" wait-on "^6.0.1" - webpack "^5.72.1" + webpack "^5.73.0" webpack-bundle-analyzer "^4.5.0" - webpack-dev-server "^4.9.0" + webpack-dev-server "^4.9.3" webpack-merge "^5.8.0" webpackbar "^5.0.2" -"@docusaurus/cssnano-preset@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.21.tgz#38113877a5857c3f9d493522085d20909dcec474" - integrity sha512-fhTZrg1vc6zYYZIIMXpe1TnEVGEjqscBo0s1uomSwKjjtMgu7wkzc1KKJYY7BndsSA+fVVkZ+OmL/kAsmK7xxw== +"@docusaurus/cssnano-preset@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz#5b42107769b7cbc61655496090bc262d7788d6ab" + integrity sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ== dependencies: - cssnano-preset-advanced "^5.3.5" + cssnano-preset-advanced "^5.3.8" postcss "^8.4.14" postcss-sort-media-queries "^4.2.1" tslib "^2.4.0" -"@docusaurus/logger@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.0.0-beta.21.tgz#f6ab4133917965349ae03fd9111a940b24d4fd12" - integrity sha512-HTFp8FsSMrAj7Uxl5p72U+P7rjYU/LRRBazEoJbs9RaqoKEdtZuhv8MYPOCh46K9TekaoquRYqag2o23Qt4ggA== +"@docusaurus/logger@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.1.0.tgz#86c97e948f578814d3e61fc2b2ad283043cbe87a" + integrity sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q== dependencies: chalk "^4.1.2" tslib "^2.4.0" -"@docusaurus/mdx-loader@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.21.tgz#52af341e21f22be882d2155a7349bea10f5d77a3" - integrity sha512-AI+4obJnpOaBOAYV6df2ux5Y1YJCBS+MhXFf0yhED12sVLJi2vffZgdamYd/d/FwvWDw6QLs/VD2jebd7P50yQ== +"@docusaurus/mdx-loader@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz#3fca9576cc73a22f8e7d9941985590b9e47a8526" + integrity sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg== dependencies: - "@babel/parser" "^7.18.3" - "@babel/traverse" "^7.18.2" - "@docusaurus/logger" "2.0.0-beta.21" - "@docusaurus/utils" "2.0.0-beta.21" + "@babel/parser" "^7.18.8" + "@babel/traverse" "^7.18.8" + "@docusaurus/logger" "2.1.0" + "@docusaurus/utils" "2.1.0" "@mdx-js/mdx" "^1.6.22" escape-html "^1.0.3" file-loader "^6.2.0" @@ -2444,151 +2765,162 @@ remark-emoji "^2.2.0" stringify-object "^3.3.0" tslib "^2.4.0" + unified "^9.2.2" unist-util-visit "^2.0.3" url-loader "^4.1.1" - webpack "^5.72.1" + webpack "^5.73.0" -"@docusaurus/module-type-aliases@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.21.tgz#345f1c1a99407775d1d3ffc1a90c2df93d50a9b8" - integrity sha512-gRkWICgQZiqSJgrwRKWjXm5gAB+9IcfYdUbCG0PRPP/G8sNs9zBIOY4uT4Z5ox2CWFEm44U3RTTxj7BiLVMBXw== +"@docusaurus/module-type-aliases@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz#322f8fd5b436af2154c0dddfa173435730e66261" + integrity sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ== dependencies: - "@docusaurus/types" "2.0.0-beta.21" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "2.1.0" + "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" "@types/react-router-dom" "*" react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" -"@docusaurus/plugin-client-redirects@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.0.0-beta.21.tgz#bf0c3e94d89c7bd15933dacdfefc17fec22c5d76" - integrity sha512-4xzrti0au7SaQT/cxr+FM9b+R5gfOSFODwQJ2QeTXbkdiz1+9DV3bp8nB/2CmzZ9ApY5lsueXNpa4n7+UAngrA== +"@docusaurus/plugin-client-redirects@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.1.0.tgz#4141040552faad48aefc5bc8f3827c3c4eba1ab8" + integrity sha512-3PhzwHSyZWqBAFPJuLJE3dZVuKWQEj9ReQP85Z3/2hpnQoVNBgAqc+64FIko0FvvK1iluLeasO7NWGyuATngvw== dependencies: - "@docusaurus/core" "2.0.0-beta.21" - "@docusaurus/logger" "2.0.0-beta.21" - "@docusaurus/utils" "2.0.0-beta.21" - "@docusaurus/utils-common" "2.0.0-beta.21" - "@docusaurus/utils-validation" "2.0.0-beta.21" + "@docusaurus/core" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-common" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" eta "^1.12.3" fs-extra "^10.1.0" lodash "^4.17.21" tslib "^2.4.0" -"@docusaurus/plugin-content-blog@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.21.tgz#86211deeea901ddcd77ca387778e121e93ee8d01" - integrity sha512-IP21yJViP3oBmgsWBU5LhrG1MZXV4mYCQSoCAboimESmy1Z11RCNP2tXaqizE3iTmXOwZZL+SNBk06ajKCEzWg== +"@docusaurus/plugin-content-blog@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz#32b1a7cd4b0026f4a76fce4edc5cfdd0edb1ec42" + integrity sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg== dependencies: - "@docusaurus/core" "2.0.0-beta.21" - "@docusaurus/logger" "2.0.0-beta.21" - "@docusaurus/mdx-loader" "2.0.0-beta.21" - "@docusaurus/utils" "2.0.0-beta.21" - "@docusaurus/utils-common" "2.0.0-beta.21" - "@docusaurus/utils-validation" "2.0.0-beta.21" - cheerio "^1.0.0-rc.11" + "@docusaurus/core" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/mdx-loader" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-common" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" + cheerio "^1.0.0-rc.12" feed "^4.2.2" fs-extra "^10.1.0" lodash "^4.17.21" reading-time "^1.5.0" - remark-admonitions "^1.2.1" tslib "^2.4.0" unist-util-visit "^2.0.3" utility-types "^3.10.0" - webpack "^5.72.1" + webpack "^5.73.0" -"@docusaurus/plugin-content-docs@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.21.tgz#b3171fa9aed99e367b6eb7111187bd0e3dcf2949" - integrity sha512-aa4vrzJy4xRy81wNskyhE3wzRf3AgcESZ1nfKh8xgHUkT7fDTZ1UWlg50Jb3LBCQFFyQG2XQB9N6llskI/KUnw== +"@docusaurus/plugin-content-docs@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz#3fcdf258c13dde27268ce7108a102b74ca4c279b" + integrity sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q== dependencies: - "@docusaurus/core" "2.0.0-beta.21" - "@docusaurus/logger" "2.0.0-beta.21" - "@docusaurus/mdx-loader" "2.0.0-beta.21" - "@docusaurus/utils" "2.0.0-beta.21" - "@docusaurus/utils-validation" "2.0.0-beta.21" + "@docusaurus/core" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/mdx-loader" "2.1.0" + "@docusaurus/module-type-aliases" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" + "@types/react-router-config" "^5.0.6" combine-promises "^1.1.0" fs-extra "^10.1.0" import-fresh "^3.3.0" js-yaml "^4.1.0" lodash "^4.17.21" - remark-admonitions "^1.2.1" tslib "^2.4.0" utility-types "^3.10.0" - webpack "^5.72.1" + webpack "^5.73.0" -"@docusaurus/plugin-content-pages@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.21.tgz#df6b4c5c4cde8a0ea491a30002e84941ca7bf0cf" - integrity sha512-DmXOXjqNI+7X5hISzCvt54QIK6XBugu2MOxjxzuqI7q92Lk/EVdraEj5mthlH8IaEH/VlpWYJ1O9TzLqX5vH2g== +"@docusaurus/plugin-content-pages@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz#714d24f71d49dbfed888f50c15e975c2154c3ce8" + integrity sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g== dependencies: - "@docusaurus/core" "2.0.0-beta.21" - "@docusaurus/mdx-loader" "2.0.0-beta.21" - "@docusaurus/utils" "2.0.0-beta.21" - "@docusaurus/utils-validation" "2.0.0-beta.21" + "@docusaurus/core" "2.1.0" + "@docusaurus/mdx-loader" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" fs-extra "^10.1.0" - remark-admonitions "^1.2.1" tslib "^2.4.0" - webpack "^5.72.1" + webpack "^5.73.0" -"@docusaurus/plugin-debug@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.21.tgz#dfa212fd90fe2f54439aacdc8c143e8ce96b0d27" - integrity sha512-P54J4q4ecsyWW0Jy4zbimSIHna999AfbxpXGmF1IjyHrjoA3PtuakV1Ai51XrGEAaIq9q6qMQkEhbUd3CffGAw== +"@docusaurus/plugin-debug@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz#b3145affb40e25cf342174638952a5928ddaf7dc" + integrity sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw== dependencies: - "@docusaurus/core" "2.0.0-beta.21" - "@docusaurus/utils" "2.0.0-beta.21" + "@docusaurus/core" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" fs-extra "^10.1.0" react-json-view "^1.21.3" tslib "^2.4.0" -"@docusaurus/plugin-google-analytics@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.21.tgz#5475c58fb23603badf41d84298569f6c46b4e6b2" - integrity sha512-+5MS0PeGaJRgPuNZlbd/WMdQSpOACaxEz7A81HAxm6kE+tIASTW3l8jgj1eWFy/PGPzaLnQrEjxI1McAfnYmQw== +"@docusaurus/plugin-google-analytics@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz#c9a7269817b38e43484d38fad9996e39aac4196c" + integrity sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg== dependencies: - "@docusaurus/core" "2.0.0-beta.21" - "@docusaurus/utils-validation" "2.0.0-beta.21" + "@docusaurus/core" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.21.tgz#a4a101089994a7103c1cc7cddb15170427b185d6" - integrity sha512-4zxKZOnf0rfh6myXLG7a6YZfQcxYDMBsWqANEjCX77H5gPdK+GHZuDrxK6sjFvRBv4liYCrNjo7HJ4DpPoT0zA== +"@docusaurus/plugin-google-gtag@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz#e4f351dcd98b933538d55bb742650a2a36ca9a32" + integrity sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA== dependencies: - "@docusaurus/core" "2.0.0-beta.21" - "@docusaurus/utils-validation" "2.0.0-beta.21" + "@docusaurus/core" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" tslib "^2.4.0" -"@docusaurus/plugin-sitemap@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.21.tgz#8bfa695eada2ec95c9376a884641237ffca5dd3d" - integrity sha512-/ynWbcXZXcYZ6sT2X6vAJbnfqcPxwdGEybd0rcRZi4gBHq6adMofYI25AqELmnbBDxt0If+vlAeUHFRG5ueP7Q== +"@docusaurus/plugin-sitemap@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz#b316bb9a42a1717845e26bd4e2d3071748a54b47" + integrity sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw== dependencies: - "@docusaurus/core" "2.0.0-beta.21" - "@docusaurus/logger" "2.0.0-beta.21" - "@docusaurus/utils" "2.0.0-beta.21" - "@docusaurus/utils-common" "2.0.0-beta.21" - "@docusaurus/utils-validation" "2.0.0-beta.21" + "@docusaurus/core" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-common" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" fs-extra "^10.1.0" sitemap "^7.1.1" tslib "^2.4.0" -"@docusaurus/preset-classic@^2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.21.tgz#1362d8650ebed22633db411caaba80075f7c86ce" - integrity sha512-KvBnIUu7y69pNTJ9UhX6SdNlK6prR//J3L4rhN897tb8xx04xHHILlPXko2Il+C3Xzgh3OCgyvkoz9K6YlFTDw== +"@docusaurus/preset-classic@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz#45b23c8ec10c96ded9ece128fac3a39b10bcbc56" + integrity sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w== dependencies: - "@docusaurus/core" "2.0.0-beta.21" - "@docusaurus/plugin-content-blog" "2.0.0-beta.21" - "@docusaurus/plugin-content-docs" "2.0.0-beta.21" - "@docusaurus/plugin-content-pages" "2.0.0-beta.21" - "@docusaurus/plugin-debug" "2.0.0-beta.21" - "@docusaurus/plugin-google-analytics" "2.0.0-beta.21" - "@docusaurus/plugin-google-gtag" "2.0.0-beta.21" - "@docusaurus/plugin-sitemap" "2.0.0-beta.21" - "@docusaurus/theme-classic" "2.0.0-beta.21" - "@docusaurus/theme-common" "2.0.0-beta.21" - "@docusaurus/theme-search-algolia" "2.0.0-beta.21" + "@docusaurus/core" "2.1.0" + "@docusaurus/plugin-content-blog" "2.1.0" + "@docusaurus/plugin-content-docs" "2.1.0" + "@docusaurus/plugin-content-pages" "2.1.0" + "@docusaurus/plugin-debug" "2.1.0" + "@docusaurus/plugin-google-analytics" "2.1.0" + "@docusaurus/plugin-google-gtag" "2.1.0" + "@docusaurus/plugin-sitemap" "2.1.0" + "@docusaurus/theme-classic" "2.1.0" + "@docusaurus/theme-common" "2.1.0" + "@docusaurus/theme-search-algolia" "2.1.0" + "@docusaurus/types" "2.1.0" "@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": version "5.5.2" @@ -2598,115 +2930,125 @@ "@types/react" "*" prop-types "^15.6.2" -"@docusaurus/theme-classic@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.21.tgz#6df5b9ea2d389dafb6f59badeabb3eda060b5017" - integrity sha512-Ge0WNdTefD0VDQfaIMRRWa8tWMG9+8/OlBRd5MK88/TZfqdBq7b/gnCSaalQlvZwwkj6notkKhHx72+MKwWUJA== +"@docusaurus/theme-classic@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz#d957a907ea8dd035c1cf911d0fbe91d8f24aef3f" + integrity sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng== dependencies: - "@docusaurus/core" "2.0.0-beta.21" - "@docusaurus/plugin-content-blog" "2.0.0-beta.21" - "@docusaurus/plugin-content-docs" "2.0.0-beta.21" - "@docusaurus/plugin-content-pages" "2.0.0-beta.21" - "@docusaurus/theme-common" "2.0.0-beta.21" - "@docusaurus/theme-translations" "2.0.0-beta.21" - "@docusaurus/utils" "2.0.0-beta.21" - "@docusaurus/utils-common" "2.0.0-beta.21" - "@docusaurus/utils-validation" "2.0.0-beta.21" + "@docusaurus/core" "2.1.0" + "@docusaurus/mdx-loader" "2.1.0" + "@docusaurus/module-type-aliases" "2.1.0" + "@docusaurus/plugin-content-blog" "2.1.0" + "@docusaurus/plugin-content-docs" "2.1.0" + "@docusaurus/plugin-content-pages" "2.1.0" + "@docusaurus/theme-common" "2.1.0" + "@docusaurus/theme-translations" "2.1.0" + "@docusaurus/types" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-common" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" "@mdx-js/react" "^1.6.22" - clsx "^1.1.1" + clsx "^1.2.1" copy-text-to-clipboard "^3.0.1" - infima "0.2.0-alpha.39" + infima "0.2.0-alpha.42" lodash "^4.17.21" nprogress "^0.2.0" postcss "^8.4.14" - prism-react-renderer "^1.3.3" + prism-react-renderer "^1.3.5" prismjs "^1.28.0" react-router-dom "^5.3.3" rtlcss "^3.5.0" tslib "^2.4.0" + utility-types "^3.10.0" -"@docusaurus/theme-common@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.0-beta.21.tgz#508478251982d01655ef505ccb2420db38623db8" - integrity sha512-fTKoTLRfjuFG6c3iwnVjIIOensxWMgdBKLfyE5iih3Lq7tQgkE7NyTGG9BKLrnTJ7cAD2UXdXM9xbB7tBf1qzg== +"@docusaurus/theme-common@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.1.0.tgz#dff4d5d1e29efc06125dc06f7b259f689bb3f24d" + integrity sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag== dependencies: - "@docusaurus/module-type-aliases" "2.0.0-beta.21" - "@docusaurus/plugin-content-blog" "2.0.0-beta.21" - "@docusaurus/plugin-content-docs" "2.0.0-beta.21" - "@docusaurus/plugin-content-pages" "2.0.0-beta.21" - clsx "^1.1.1" + "@docusaurus/mdx-loader" "2.1.0" + "@docusaurus/module-type-aliases" "2.1.0" + "@docusaurus/plugin-content-blog" "2.1.0" + "@docusaurus/plugin-content-docs" "2.1.0" + "@docusaurus/plugin-content-pages" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^1.2.1" parse-numeric-range "^1.3.0" - prism-react-renderer "^1.3.3" + prism-react-renderer "^1.3.5" tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.21.tgz#2891f11372e2542e4e1426c3100b72c2d30d4d68" - integrity sha512-T1jKT8MVSSfnztSqeebUOpWHPoHKtwDXtKYE0xC99JWoZ+mMfv8AFhVSoSddn54jLJjV36mxg841eHQIySMCpQ== +"@docusaurus/theme-search-algolia@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz#e7cdf64b6f7a15b07c6dcf652fd308cfdaabb0ee" + integrity sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg== dependencies: - "@docsearch/react" "^3.1.0" - "@docusaurus/core" "2.0.0-beta.21" - "@docusaurus/logger" "2.0.0-beta.21" - "@docusaurus/plugin-content-docs" "2.0.0-beta.21" - "@docusaurus/theme-common" "2.0.0-beta.21" - "@docusaurus/theme-translations" "2.0.0-beta.21" - "@docusaurus/utils" "2.0.0-beta.21" - "@docusaurus/utils-validation" "2.0.0-beta.21" + "@docsearch/react" "^3.1.1" + "@docusaurus/core" "2.1.0" + "@docusaurus/logger" "2.1.0" + "@docusaurus/plugin-content-docs" "2.1.0" + "@docusaurus/theme-common" "2.1.0" + "@docusaurus/theme-translations" "2.1.0" + "@docusaurus/utils" "2.1.0" + "@docusaurus/utils-validation" "2.1.0" algoliasearch "^4.13.1" - algoliasearch-helper "^3.8.2" - clsx "^1.1.1" + algoliasearch-helper "^3.10.0" + clsx "^1.2.1" eta "^1.12.3" fs-extra "^10.1.0" lodash "^4.17.21" tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.21.tgz#5da60ffc58de256b96316c5e0fe2733c1e83f22c" - integrity sha512-dLVT9OIIBs6MpzMb1bAy+C0DPJK3e3DNctG+ES0EP45gzEqQxzs4IsghpT+QDaOsuhNnAlosgJpFWX3rqxF9xA== +"@docusaurus/theme-translations@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz#ce9a2955afd49bff364cfdfd4492b226f6dd3b6e" + integrity sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg== dependencies: fs-extra "^10.1.0" tslib "^2.4.0" -"@docusaurus/types@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.0-beta.21.tgz#36659c6c012663040dcd4cbc97b5d7a555dae229" - integrity sha512-/GH6Npmq81eQfMC/ikS00QSv9jNyO1RXEpNSx5GLA3sFX8Iib26g2YI2zqNplM8nyxzZ2jVBuvUoeODTIbTchQ== +"@docusaurus/types@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.1.0.tgz#01e13cd9adb268fffe87b49eb90302d5dc3edd6b" + integrity sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ== dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" commander "^5.1.0" - history "^4.9.0" joi "^17.6.0" react-helmet-async "^1.3.0" utility-types "^3.10.0" - webpack "^5.72.1" + webpack "^5.73.0" webpack-merge "^5.8.0" -"@docusaurus/utils-common@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.0.0-beta.21.tgz#81e86ed04ad62b75e9ba6a5e7689dc23d5f36a0a" - integrity sha512-5w+6KQuJb6pUR2M8xyVuTMvO5NFQm/p8TOTDFTx60wt3p0P1rRX00v6FYsD4PK6pgmuoKjt2+Ls8dtSXc4qFpQ== +"@docusaurus/utils-common@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.1.0.tgz#248434751096f8c6c644ed65eed2a5a070a227f8" + integrity sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg== dependencies: tslib "^2.4.0" -"@docusaurus/utils-validation@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.21.tgz#10169661be5f8a233f4c12202ee5802ccb77400f" - integrity sha512-6NG1FHTRjv1MFzqW//292z7uCs77vntpWEbZBHk3n67aB1HoMn5SOwjLPtRDjbCgn6HCHFmdiJr6euCbjhYolg== +"@docusaurus/utils-validation@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz#c8cf1d8454d924d9a564fefa86436268f43308e3" + integrity sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ== dependencies: - "@docusaurus/logger" "2.0.0-beta.21" - "@docusaurus/utils" "2.0.0-beta.21" + "@docusaurus/logger" "2.1.0" + "@docusaurus/utils" "2.1.0" joi "^17.6.0" js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@2.0.0-beta.21": - version "2.0.0-beta.21" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-beta.21.tgz#8fc4499c4cfedd29805025d930f8008cad255044" - integrity sha512-M/BrVCDmmUPZLxtiStBgzpQ4I5hqkggcpnQmEN+LbvbohjbtVnnnZQ0vptIziv1w8jry/woY+ePsyOO7O/yeLQ== +"@docusaurus/utils@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.1.0.tgz#b77b45b22e61eb6c2dcad8a7e96f6db0409b655f" + integrity sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A== dependencies: - "@docusaurus/logger" "2.0.0-beta.21" + "@docusaurus/logger" "2.1.0" "@svgr/webpack" "^6.2.1" file-loader "^6.2.0" fs-extra "^10.1.0" @@ -2720,7 +3062,7 @@ shelljs "^0.8.5" tslib "^2.4.0" url-loader "^4.1.1" - webpack "^5.72.1" + webpack "^5.73.0" "@emotion/babel-plugin@^11.3.0", "@emotion/babel-plugin@^11.7.1": version "11.7.2" @@ -2868,6 +3210,15 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/resolve-uri@^3.0.3": version "3.0.7" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" @@ -2878,6 +3229,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + "@jridgewell/source-map@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" @@ -2891,7 +3247,15 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== -"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.14": + version "0.3.15" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" + integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.9": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== @@ -3015,7 +3379,7 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@slorber/static-site-generator-webpack-plugin@^4.0.4": +"@slorber/static-site-generator-webpack-plugin@^4.0.7": version "4.0.7" resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== @@ -3405,7 +3769,7 @@ dependencies: "@types/react" "*" -"@types/react-router-config@*": +"@types/react-router-config@*", "@types/react-router-config@^5.0.6": version "5.0.6" resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.6.tgz#87c5c57e72d241db900d9734512c50ccec062451" integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== @@ -3679,6 +4043,11 @@ acorn@^8.5.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.7.1: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + address@^1.0.1, address@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -3731,10 +4100,10 @@ ajv@^8.0.0, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" -algoliasearch-helper@^3.8.2: - version "3.9.0" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.9.0.tgz#1e99d351ecdcff48449644157a8d250c7c592828" - integrity sha512-siWWl8QYJ3sh1yzJf9h/cHHpZC8wuPoPdVx5OtQ8X62ruUembTwvsLYoicrL7pF7fsYxdyvJfV9Yb2/nrVGrfg== +algoliasearch-helper@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.11.0.tgz#c4355056d97748a92f6ff0d4fce153b96b561ddb" + integrity sha512-TLl/MSjtQ98mgkd8hngWkzSjE+dAWldZ1NpJtv2mT+ZoFJ2P2zDE85oF9WafJOXWN9FbVRmyxpO5H+qXcNaFng== dependencies: "@algolia/events" "^4.0.1" @@ -4043,13 +4412,13 @@ babel-plugin-polyfill-corejs2@^0.2.2: "@babel/helper-define-polyfill-provider" "^0.2.2" semver "^6.1.1" -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== +babel-plugin-polyfill-corejs2@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d" + integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q== dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.2" semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.2.5: @@ -4060,12 +4429,12 @@ babel-plugin-polyfill-corejs3@^0.2.5: "@babel/helper-define-polyfill-provider" "^0.2.2" core-js-compat "^3.16.2" -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" - integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== +babel-plugin-polyfill-corejs3@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" + integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/helper-define-polyfill-provider" "^0.3.2" core-js-compat "^3.21.0" babel-plugin-polyfill-regenerator@^0.2.2: @@ -4075,12 +4444,12 @@ babel-plugin-polyfill-regenerator@^0.2.2: dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== +babel-plugin-polyfill-regenerator@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz#8f51809b6d5883e07e71548d75966ff7635527fe" + integrity sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/helper-define-polyfill-provider" "^0.3.2" bail@^1.0.0: version "1.0.5" @@ -4313,7 +4682,7 @@ caniuse-lite@^1.0.30001335: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001358.tgz#473d35dabf5e448b463095cab7924e96ccfb8c00" integrity sha512-hvp8PSRymk85R20bsDra7ZTCpSVGN/PAz9pSAjPSjKC+rNmnUk5vCRgJwiTT/O4feQ/yu/drvZYpKxxhbFuChw== -ccount@^1.0.0, ccount@^1.0.3: +ccount@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== @@ -4387,10 +4756,10 @@ cheerio-select@^2.1.0: domhandler "^5.0.3" domutils "^3.0.1" -cheerio@^1.0.0-rc.11: - version "1.0.0-rc.11" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.11.tgz#1be84be1a126958366bcc57a11648cd9b30a60c2" - integrity sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag== +cheerio@^1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== dependencies: cheerio-select "^2.1.0" dom-serializer "^2.0.0" @@ -4399,7 +4768,6 @@ cheerio@^1.0.0-rc.11: htmlparser2 "^8.0.1" parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" - tslib "^2.4.0" chokidar@^3.1.5, chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.2" @@ -4494,11 +4862,6 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -clsx@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== - clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" @@ -4640,10 +5003,10 @@ configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== consola@^2.15.3: version "2.15.3" @@ -4749,10 +5112,10 @@ core-js@^3.14.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.16.1.tgz#f4485ce5c9f3c6a7cb18fa80488e08d362097249" integrity sha512-AAkP8i35EbefU+JddyWi12AWE9f2N/qr/pwnDtWz4nyUIBGMJPX99ANFFRSw6FefM374lDujdtLDyhN2A/btHw== -core-js@^3.22.7: - version "3.23.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.23.2.tgz#e07a60ca8b14dd129cabdc3d2551baf5a01c76f0" - integrity sha512-ELJOWxNrJfOH/WK4VJ3Qd+fOqZuOuDNDJz0xG6Bt4mGg2eO/UT9CljCrbqDGovjLKUrGajEEBcoTOc0w+yBYeQ== +core-js@^3.23.3: + version "3.25.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.25.0.tgz#be71d9e0dd648ffd70c44a7ec2319d039357eceb" + integrity sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA== core-util-is@~1.0.0: version "1.0.2" @@ -4894,7 +5257,7 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-advanced@^5.3.5: +cssnano-preset-advanced@^5.3.8: version "5.3.8" resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz#027b1d05ef896d908178c483f0ec4190cb50ef9a" integrity sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg== @@ -4946,7 +5309,16 @@ cssnano-utils@^3.1.0: resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== -cssnano@^5.1.8, cssnano@^5.1.9: +cssnano@^5.1.12: + version "5.1.13" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.13.tgz#83d0926e72955332dc4802a7070296e6258efc0a" + integrity sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ== + dependencies: + cssnano-preset-default "^5.2.12" + lilconfig "^2.0.3" + yaml "^1.10.2" + +cssnano@^5.1.8: version "5.1.12" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.12.tgz#bcd0b64d6be8692de79332c501daa7ece969816c" integrity sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ== @@ -5659,10 +6031,10 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" -docusaurus-plugin-internaldocs-fb@0.12.3: - version "0.12.3" - resolved "https://registry.yarnpkg.com/docusaurus-plugin-internaldocs-fb/-/docusaurus-plugin-internaldocs-fb-0.12.3.tgz#803197faa9d23cc590d44c3c63a32f250e555e87" - integrity sha512-zttBKv8hBXzOTXifzWIeA2rLXpZO/Jz/iSnu2gp0elnRU08uPEHojiPcn3wPi8kyVWjuoXysKJUP+X81Du3nsA== +docusaurus-plugin-internaldocs-fb@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-internaldocs-fb/-/docusaurus-plugin-internaldocs-fb-1.0.0.tgz#a786ad130a797aaa1090016af5a02a600bf62b5e" + integrity sha512-2XhzeNSLa/UfM/pYTLIfH7U7T6G9FEp1neV1YLV/ygbOwEh/l1ybtS7D5uzVmuvo+QYr0m73M6dxmGYFSNSgpQ== dependencies: "@mdx-js/mdx" "^2.1.1" "@mdx-js/react" "^1.6.22" @@ -5853,10 +6225,10 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.9.3: - version "5.9.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" - integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== +enhanced-resolve@^5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -6695,17 +7067,6 @@ hast-to-hyperscript@^9.0.0: unist-util-is "^4.0.0" web-namespaces "^1.0.0" -hast-util-from-parse5@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz#3089dc0ee2ccf6ec8bc416919b51a54a589e097c" - integrity sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA== - dependencies: - ccount "^1.0.3" - hastscript "^5.0.0" - property-information "^5.0.0" - web-namespaces "^1.1.2" - xtend "^4.0.1" - hast-util-from-parse5@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" @@ -6775,16 +7136,6 @@ hast-util-whitespace@^2.0.0: resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz#4fc1086467cc1ef5ba20673cb6b03cec3a970f1c" integrity sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg== -hastscript@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a" - integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== - dependencies: - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - hastscript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" @@ -7037,10 +7388,10 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infima@0.2.0-alpha.39: - version "0.2.0-alpha.39" - resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.39.tgz#054b13ac44f3e9a42bc083988f1a1586add2f59c" - integrity sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw== +infima@0.2.0-alpha.42: + version "0.2.0-alpha.42" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.42.tgz#f6e86a655ad40877c6b4d11b2ede681eb5470aa5" + integrity sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww== inflight@^1.0.4: version "1.0.6" @@ -8565,7 +8916,7 @@ mini-create-react-context@^0.4.0: "@babel/runtime" "^7.12.1" tiny-warning "^1.0.3" -mini-css-extract-plugin@^2.6.0: +mini-css-extract-plugin@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz#9a1251d15f2035c342d99a468ab9da7a0451b71e" integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== @@ -8961,11 +9312,6 @@ parse5-htmlparser2-tree-adapter@^7.0.0: domhandler "^5.0.2" parse5 "^7.0.0" -parse5@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - parse5@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -9428,10 +9774,10 @@ prism-react-renderer@^1.2.1: resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz#392460acf63540960e5e3caa699d851264e99b89" integrity sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg== -prism-react-renderer@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.3.tgz#9b5a4211a6756eee3c96fee9a05733abc0b0805c" - integrity sha512-Viur/7tBTCH2HmYzwCHmt2rEFn+rdIWNIINXyg0StiISbDiIhHKhrFuEK8eMkKgvsIYSjgGqy/hNyucHp6FpoQ== +prism-react-renderer@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" + integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== prismjs@^1.28.0: version "1.28.0" @@ -10274,10 +10620,10 @@ regexpu-core@^4.2.0, regexpu-core@^4.7.1: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" -regexpu-core@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" - integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== +regexpu-core@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" + integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.0.1" @@ -10324,29 +10670,11 @@ regjsparser@^0.8.2: dependencies: jsesc "~0.5.0" -rehype-parse@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-6.0.2.tgz#aeb3fdd68085f9f796f1d3137ae2b85a98406964" - integrity sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug== - dependencies: - hast-util-from-parse5 "^5.0.0" - parse5 "^5.0.0" - xtend "^4.0.0" - relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -remark-admonitions@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/remark-admonitions/-/remark-admonitions-1.2.1.tgz#87caa1a442aa7b4c0cafa04798ed58a342307870" - integrity sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow== - dependencies: - rehype-parse "^6.0.2" - unified "^8.4.2" - unist-util-visit "^2.0.1" - remark-emoji@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" @@ -11234,16 +11562,16 @@ terser-webpack-plugin@^5.1.3: source-map "^0.6.1" terser "^5.7.0" -terser-webpack-plugin@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" - integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== +terser-webpack-plugin@^5.3.3: + version "5.3.6" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== dependencies: - "@jridgewell/trace-mapping" "^0.3.7" + "@jridgewell/trace-mapping" "^0.3.14" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.0" - terser "^5.7.2" + terser "^5.14.1" terser@^5.10.0: version "5.14.1" @@ -11255,6 +11583,16 @@ terser@^5.10.0: commander "^2.20.0" source-map-support "~0.5.20" +terser@^5.14.1: + version "5.15.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.0.tgz#e16967894eeba6e1091509ec83f0c60e179f2425" + integrity sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + terser@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.1.tgz#2dc7a61009b66bb638305cb2a824763b116bf784" @@ -11519,18 +11857,7 @@ unified@^10.0.0: trough "^2.0.0" vfile "^5.0.0" -unified@^8.4.2: - version "8.4.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-8.4.2.tgz#13ad58b4a437faa2751a4a4c6a16f680c500fff1" - integrity sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unified@^9.2.1: +unified@^9.2.1, unified@^9.2.2: version "9.2.2" resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== @@ -11900,7 +12227,7 @@ warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchpack@^2.3.1: +watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== @@ -11915,7 +12242,7 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -web-namespaces@^1.0.0, web-namespaces@^1.1.2: +web-namespaces@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== @@ -11951,10 +12278,10 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.9.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz#c188db28c7bff12f87deda2a5595679ebbc3c9bc" - integrity sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q== +webpack-dev-server@^4.9.3: + version "4.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz#290ee594765cd8260adfe83b2d18115ea04484e7" + integrity sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -11968,7 +12295,7 @@ webpack-dev-server@^4.9.0: chokidar "^3.5.3" colorette "^2.0.10" compression "^1.7.4" - connect-history-api-fallback "^1.6.0" + connect-history-api-fallback "^2.0.0" default-gateway "^6.0.3" express "^4.17.3" graceful-fs "^4.2.6" @@ -12004,21 +12331,21 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.72.1: - version "5.73.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" - integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== +webpack@^5.73.0: + version "5.74.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" + integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" + acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" + enhanced-resolve "^5.10.0" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" @@ -12031,7 +12358,7 @@ webpack@^5.72.1: schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + watchpack "^2.4.0" webpack-sources "^3.2.3" webpackbar@^5.0.2: From 926ba9608e2e76301e6ebe8fe32b664d12ccfe6a Mon Sep 17 00:00:00 2001 From: Flipper Bot <> Date: Thu, 8 Sep 2022 08:03:07 -0700 Subject: [PATCH 0005/1651] Flipper Release: v0.163.0 Summary: Releasing version 0.163.0 Reviewed By: aigoncharov Differential Revision: D39303682 fbshipit-source-id: fa6bd8a1cb08c0f45803d027632d7432e64680e2 --- desktop/package.json | 2 +- desktop/plugins/public/layout/docs/setup.mdx | 2 +- desktop/plugins/public/leak_canary/docs/setup.mdx | 2 +- desktop/plugins/public/network/docs/setup.mdx | 2 +- docs/getting-started/android-native.mdx | 4 ++-- docs/getting-started/react-native-ios.mdx | 2 +- docs/getting-started/react-native.mdx | 4 ++-- gradle.properties | 2 +- js/js-flipper/package.json | 2 +- react-native/react-native-flipper/package.json | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index 5366adbd8..6e7c33944 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -169,7 +169,7 @@ "npm": "use yarn instead", "yarn": "^1.16" }, - "version": "0.162.0", + "version": "0.163.0", "workspaces": { "packages": [ "scripts", diff --git a/desktop/plugins/public/layout/docs/setup.mdx b/desktop/plugins/public/layout/docs/setup.mdx index 49c15af23..94cbe537f 100644 --- a/desktop/plugins/public/layout/docs/setup.mdx +++ b/desktop/plugins/public/layout/docs/setup.mdx @@ -27,7 +27,7 @@ You also need to compile in the `litho-annotations` package, as Flipper reflects ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.162.0' + debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.163.0' debugImplementation 'com.facebook.litho:litho-annotations:0.19.0' // ... } diff --git a/desktop/plugins/public/leak_canary/docs/setup.mdx b/desktop/plugins/public/leak_canary/docs/setup.mdx index 983db1bd6..7a22f2268 100644 --- a/desktop/plugins/public/leak_canary/docs/setup.mdx +++ b/desktop/plugins/public/leak_canary/docs/setup.mdx @@ -8,7 +8,7 @@ To setup the Leak Ca ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.162.0' + debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.163.0' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1' } ``` diff --git a/desktop/plugins/public/network/docs/setup.mdx b/desktop/plugins/public/network/docs/setup.mdx index 1dcfb6f6e..2e603f6d2 100644 --- a/desktop/plugins/public/network/docs/setup.mdx +++ b/desktop/plugins/public/network/docs/setup.mdx @@ -12,7 +12,7 @@ The network plugin is shipped as a separate Maven artifact, as follows: ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.162.0' + debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.163.0' } ``` diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index 1513a6963..237af819f 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -24,10 +24,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.162.0' + debugImplementation 'com.facebook.flipper:flipper:0.163.0' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.162.0' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.163.0' } ``` diff --git a/docs/getting-started/react-native-ios.mdx b/docs/getting-started/react-native-ios.mdx index 7b2007404..ddb0de1e6 100644 --- a/docs/getting-started/react-native-ios.mdx +++ b/docs/getting-started/react-native-ios.mdx @@ -51,7 +51,7 @@ Add all of the code below to your `ios/Podfile`: platform :ios, '9.0' def flipper_pods() - flipperkit_version = '0.162.0' # should match the version of your Flipper client app + flipperkit_version = '0.163.0' # should match the version of your Flipper client app pod 'FlipperKit', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/FlipperKitLayoutPlugin', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/SKIOSNetworkPlugin', '~>' + flipperkit_version, :configuration => 'Debug' diff --git a/docs/getting-started/react-native.mdx b/docs/getting-started/react-native.mdx index ed8535ea2..24e977354 100644 --- a/docs/getting-started/react-native.mdx +++ b/docs/getting-started/react-native.mdx @@ -32,7 +32,7 @@ By default, React Native might ship with an outdated Flipper SDK. To make sure y Android: -1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.162.0`. +1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.163.0`. 2. Run `./gradlew clean` in the `android` directory. iOS: @@ -42,7 +42,7 @@ react-native version => 0.69.0 2. Run `pod install --repo-update` in the `ios` directory. react-native version < 0.69.0 -1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.162.0' })`. +1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.163.0' })`. 2. Run `pod install --repo-update` in the `ios` directory. ## Manual Setup diff --git a/gradle.properties b/gradle.properties index f6567a584..0472b5da8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.162.1-SNAPSHOT +VERSION_NAME=0.163.0 GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper diff --git a/js/js-flipper/package.json b/js/js-flipper/package.json index 605f352bc..66169b1d6 100644 --- a/js/js-flipper/package.json +++ b/js/js-flipper/package.json @@ -1,7 +1,7 @@ { "name": "js-flipper", "title": "JS Flipper Bindings for Web-Socket based clients", - "version": "0.162.0", + "version": "0.163.0", "main": "lib/index.js", "browser": { "os": false diff --git a/react-native/react-native-flipper/package.json b/react-native/react-native-flipper/package.json index dd0b81f27..7b0feeea7 100644 --- a/react-native/react-native-flipper/package.json +++ b/react-native/react-native-flipper/package.json @@ -1,7 +1,7 @@ { "name": "react-native-flipper", "title": "React Native Flipper Bindings", - "version": "0.162.0", + "version": "0.163.0", "description": "Flipper bindings for React Native", "main": "index.js", "types": "index.d.ts", From acc2cac7301b71021b65dc063314e5efd373aaa0 Mon Sep 17 00:00:00 2001 From: Flipper Bot <> Date: Thu, 8 Sep 2022 08:03:07 -0700 Subject: [PATCH 0006/1651] Flipper Snapshot Bump: v0.163.1-SNAPSHOT Summary: Releasing snapshot version 0.163.1-SNAPSHOT Reviewed By: aigoncharov Differential Revision: D39303681 fbshipit-source-id: 335603f78ef21cc04ee3568f46c0a13a5febc698 --- docs/getting-started/android-native.mdx | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index 237af819f..4cba499fa 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -124,10 +124,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.162.1-SNAPSHOT' + debugImplementation 'com.facebook.flipper:flipper:0.163.1-SNAPSHOT' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.162.1-SNAPSHOT' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.163.1-SNAPSHOT' } ``` diff --git a/gradle.properties b/gradle.properties index 0472b5da8..f332eff78 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.163.0 +VERSION_NAME=0.163.1-SNAPSHOT GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper From 8070d31d870a49e36d473b29210e8b5c7b2d4f97 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Thu, 8 Sep 2022 08:59:29 -0700 Subject: [PATCH 0007/1651] Edit react-native-android.mdx using inpage editor Summary: This diff has been automatically generated by the inpage editor. If you want to update this diff, go through the preview link that would be attached to the test plan. Please ensure you are editing the same page that was used to create this diff. Reviewed By: antonk52 Differential Revision: D39345371 fbshipit-source-id: c6d42685d3ecf2d898094c3a688f7c754f318963 --- docs/getting-started/react-native-android.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/react-native-android.mdx b/docs/getting-started/react-native-android.mdx index 7e8972755..4992b8a91 100644 --- a/docs/getting-started/react-native-android.mdx +++ b/docs/getting-started/react-native-android.mdx @@ -6,7 +6,7 @@ sidebar_label: Manual Android Setup import useBaseUrl from '@docusaurus/useBaseUrl'; import Link from '@docusaurus/Link'; -::note +:::note The information within this page is meant for people manually adding Flipper to a React Native 0.62+ app. This should only be necessary if you have an existing app that cannot be upgraded with the [React Native Upgrade tool](https://reactnative.dev/docs/upgrading). ::: From d2ce30942f41fc8d68d909ed139c7dd6b9c4cb40 Mon Sep 17 00:00:00 2001 From: Anton Kastritskiy Date: Thu, 8 Sep 2022 17:10:27 -0700 Subject: [PATCH 0008/1651] add missing close code block backticks Reviewed By: jknoxville Differential Revision: D39355460 fbshipit-source-id: 5eee036cde24738f0352cc5bd0f8ef22463427dd --- docs/internals/documentation-formatting.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/internals/documentation-formatting.mdx b/docs/internals/documentation-formatting.mdx index ca48abec4..5fb18f517 100644 --- a/docs/internals/documentation-formatting.mdx +++ b/docs/internals/documentation-formatting.mdx @@ -87,6 +87,7 @@ addPlugin({ onDisconnect() { } }) +``` For more code blocks features, such as line highlighting, see the Docusaurus [Code blocks](https://docusaurus.io/docs/markdown-features/code-blocks) document. From a9fe38107670eded3d4f542c122a9346cb7a644a Mon Sep 17 00:00:00 2001 From: Andrey Goncharov Date: Fri, 9 Sep 2022 06:30:04 -0700 Subject: [PATCH 0009/1651] Add more detailed errors for assertConnected Differential Revision: D39383946 fbshipit-source-id: e11a29c77c5abe7f3fee5e979c596efd31ef4ec2 --- .../src/__tests__/test-utils.node.tsx | 4 ++- desktop/flipper-plugin/src/plugin/Plugin.tsx | 28 +++++++++++++------ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/desktop/flipper-plugin/src/__tests__/test-utils.node.tsx b/desktop/flipper-plugin/src/__tests__/test-utils.node.tsx index b3ab3c7d1..6e5f6f667 100644 --- a/desktop/flipper-plugin/src/__tests__/test-utils.node.tsx +++ b/desktop/flipper-plugin/src/__tests__/test-utils.node.tsx @@ -166,7 +166,9 @@ test('a plugin cannot send messages after being disconnected', async () => { await instance.getCurrentState(); } catch (e) { threw = true; // for some weird reason expect(async () => instance.getCurrentState()).toThrow(...) doesn't work today... - expect(e).toMatchInlineSnapshot(`[Error: Plugin is not connected]`); + expect(e).toMatchInlineSnapshot( + `[Error: SandyPluginInstance.assertConnected -> plugin is not connected]`, + ); } expect(threw).toBeTruthy(); }); diff --git a/desktop/flipper-plugin/src/plugin/Plugin.tsx b/desktop/flipper-plugin/src/plugin/Plugin.tsx index aa8aa4d44..c7fd847f5 100644 --- a/desktop/flipper-plugin/src/plugin/Plugin.tsx +++ b/desktop/flipper-plugin/src/plugin/Plugin.tsx @@ -292,14 +292,26 @@ export class SandyPluginInstance extends BasePluginInstance { private assertConnected() { this.assertNotDestroyed(); - if ( - // This is a better-safe-than-sorry; just the first condition should suffice - !this.connected.get() || - !this.realClient.connected.get() || - !this.device.isConnected || - this.device.isArchived - ) { - throw new Error('Plugin is not connected'); + // This is a better-safe-than-sorry; just the first condition should suffice + if (!this.connected.get()) { + throw new Error( + 'SandyPluginInstance.assertConnected -> plugin is not connected', + ); + } + if (!this.realClient.connected.get()) { + throw new Error( + 'SandyPluginInstance.assertConnected -> realClient is not connected', + ); + } + if (!this.device.isConnected) { + throw new Error( + 'SandyPluginInstance.assertConnected -> device is not connected', + ); + } + if (this.device.isArchived) { + throw new Error( + 'SandyPluginInstance.assertConnected -> device is archived', + ); } } } From c76c993ce49f7d5b8c4c4d319f599e05c2df5a31 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Sep 2022 03:48:43 -0700 Subject: [PATCH 0010/1651] Introduced concept of active child Summary: A node can have an active child, if present we assume all others are inactive and we don't traverse them. This means the activities not on top and view pager views not active will not be scanned. Additionally on the desktop we are automatically collapsing these views. The net result is a lot less work done on the main thread Reviewed By: lblasa Differential Revision: D39310126 fbshipit-source-id: ebd0c69d46f2d42fe42e678c8327fcdc73d08385 --- .../uidebugger/core/LayoutTraversal.kt | 22 +++++++++++++-- .../uidebugger/core/NativeScanScheduler.kt | 8 +----- .../descriptors/AbstractChainedDescriptor.kt | 8 ++++++ .../descriptors/ActivityDescriptor.kt | 3 +++ .../descriptors/ApplicationRefDescriptor.kt | 4 ++- .../descriptors/ButtonDescriptor.kt | 3 +++ .../uidebugger/descriptors/Descriptor.kt | 27 ------------------- .../descriptors/DescriptorRegister.kt | 2 ++ .../uidebugger/descriptors/NodeDescriptor.kt | 6 +++++ .../descriptors/ObjectDescriptor.kt | 3 +++ .../descriptors/TextViewDescriptor.kt | 4 +++ .../uidebugger/descriptors/ViewDescriptor.kt | 4 +++ .../descriptors/ViewGroupDescriptor.kt | 4 +++ .../descriptors/ViewPagerDescriptor.kt | 19 +++++++++++++ .../descriptors/WindowDescriptor.kt | 4 +++ .../flipper/plugins/uidebugger/model/Node.kt | 3 ++- .../public/ui-debugger/components/main.tsx | 21 ++++++++++++--- desktop/plugins/public/ui-debugger/types.tsx | 1 + 18 files changed, 104 insertions(+), 42 deletions(-) create mode 100644 android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewPagerDescriptor.kt diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/LayoutTraversal.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/LayoutTraversal.kt index 31de1cd28..e90f4f58a 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/LayoutTraversal.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/LayoutTraversal.kt @@ -40,19 +40,37 @@ class LayoutTraversal( descriptor.getChildren(node, children) val childrenIds = mutableListOf() + + val activeChild = descriptor.getActiveChild(node) for (child in children) { // it might make sense one day to remove id from the descriptor since its always the // hash code val childDescriptor = descriptorRegister.descriptorForClassUnsafe(child::class.java).asAny() childrenIds.add(childDescriptor.getId(child)) - stack.add(child) + // if there is an active child then dont traverse it + if (activeChild == null) { + stack.add(child) + } + } + + var activeChildId: String? = null + if (activeChild != null) { + stack.add(activeChild) + activeChildId = + descriptorRegister.descriptorForClassUnsafe(activeChild.javaClass).getId(activeChild) } val attributes = mutableMapOf() descriptor.getData(node, attributes) - result.add(Node(descriptor.getId(node), descriptor.getName(node), attributes, childrenIds)) + result.add( + Node( + descriptor.getId(node), + descriptor.getName(node), + attributes, + childrenIds, + activeChildId)) } catch (exception: Exception) { Log.e(LogTag, "Error while processing node ${node.javaClass.name} ${node} ", exception) } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt index ca64f169a..0406d2803 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt @@ -33,13 +33,7 @@ class NativeScanScheduler(val context: Context) : Scheduler.Task { Log.d( "LAYOUT_SCHEDULER", - Thread.currentThread().name + - Looper.myLooper() + - ", produced: " + - { - nodes.count() - } + - " nodes") + "${Thread.currentThread().name}${Looper.myLooper()} produced: ${nodes.count()} nodes") return ScanResult(txId++, start, scanEnd, nodes) } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/AbstractChainedDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/AbstractChainedDescriptor.kt index 2d57d301b..51896a363 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/AbstractChainedDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/AbstractChainedDescriptor.kt @@ -34,6 +34,12 @@ abstract class AbstractChainedDescriptor : Descriptor(), ChainedDescriptor open fun onInit() {} + final override fun getActiveChild(node: T): Any? { + // ask each descriptor in the chain for an active child, if none available look up the chain + // until no more super descriptors + return onGetActiveChild(node) ?: mSuper?.getActiveChild(node) + } + /** * A globally unique ID used to identify a node in a hierarchy. If your node does not have a * globally unique ID it is fine to rely on [System.identityHashCode]. @@ -52,6 +58,8 @@ abstract class AbstractChainedDescriptor : Descriptor(), ChainedDescriptor return onGetName(node) } + abstract fun onGetActiveChild(node: T): Any? + abstract fun onGetName(node: T): String /** The children this node exposes in the inspector. */ diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt index dcb8089a0..69d958979 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt @@ -13,6 +13,9 @@ import com.facebook.flipper.plugins.uidebugger.stetho.FragmentCompat class ActivityDescriptor : AbstractChainedDescriptor() { override fun onInit() {} + override fun onGetActiveChild(node: Activity): Any? { + return null + } override fun onGetId(activity: Activity): String { return Integer.toString(System.identityHashCode(activity)) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt index 8fe43684f..19d6e4b68 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt @@ -16,6 +16,9 @@ class ApplicationRefDescriptor : AbstractChainedDescriptor() { val rootResolver = RootViewResolver() override fun onInit() {} + override fun onGetActiveChild(node: ApplicationRef): Any? { + return if (node.activitiesStack.size > 0) node.activitiesStack.last() else null + } override fun onGetId(applicationRef: ApplicationRef): String { return applicationRef.application.packageName @@ -38,7 +41,6 @@ class ApplicationRefDescriptor : AbstractChainedDescriptor() { if (activity.window.decorView == root.view) { children.add(activity) added = true - break } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ButtonDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ButtonDescriptor.kt index e7c3af119..740e4a548 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ButtonDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ButtonDescriptor.kt @@ -26,4 +26,7 @@ class ButtonDescriptor : AbstractChainedDescriptor + From 7626453f552c7ff05d2940f46f1a57d5362d1d4e Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 11 Nov 2022 08:28:25 -0800 Subject: [PATCH 0284/1651] Fall back to memory password storage if keytar is not available Summary: Not in all environments keytar is available, but still it will be useful to be able to login to intern with Flipper, even for temporarily sessions. This solution falls back to in memory storage. Note that the underlying assuption is that multiple different users are not connected to the same Flipper server, as this would share their session! https://fb.workplace.com/groups/flippersupport/permalink/1498550730625580/ Reviewed By: passy Differential Revision: D41218132 fbshipit-source-id: 6e518d742df639bfbdc9a36ed1fa56ecb363a0b0 --- .../flipper-server-core/src/utils/keytar.tsx | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/desktop/flipper-server-core/src/utils/keytar.tsx b/desktop/flipper-server-core/src/utils/keytar.tsx index 4c81233ed..9b569b536 100644 --- a/desktop/flipper-server-core/src/utils/keytar.tsx +++ b/desktop/flipper-server-core/src/utils/keytar.tsx @@ -19,11 +19,17 @@ export type KeytarModule = { }; export class KeytarManager { + private memoryFallback = new Map(); + constructor(private keytar: KeytarModule | undefined) {} public async writeKeychain(service: string, password: string): Promise { if (this.keytar == null) { - throw new Error('Keytar is not available.'); + console.warn( + 'Keytar is not available, using session only memory storage as fallback', + ); + this.memoryFallback.set(service, password); + return; } await this.keytar.deletePassword(service, os.userInfo().username); @@ -31,17 +37,17 @@ export class KeytarManager { } public async unsetKeychain(service: string): Promise { - await this.keytar?.deletePassword(service, os.userInfo().username); + if (this.keytar) { + await this.keytar.deletePassword(service, os.userInfo().username); + } else { + this.memoryFallback.delete(service); + } } public async retrieveToken(service: string): Promise { - if (this.keytar == null) { - throw new Error('Keytar is not available.'); - } - const token = await this.keytar.getPassword( - service, - os.userInfo().username, - ); + const token = this.keytar + ? await this.keytar.getPassword(service, os.userInfo().username) + : this.memoryFallback.get(service); if (!token) { throw new UserNotSignedInError(); } From a4d3167faef9690b7a8e0742f460711315de08c7 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 14 Nov 2022 07:05:58 -0800 Subject: [PATCH 0285/1651] Application, window and activity all inherit window bounds Reviewed By: lblasa Differential Revision: D41218326 fbshipit-source-id: aa0fad5c80e482629a70240da81c347217d12ea7 --- .../descriptors/ActivityDescriptor.kt | 4 ++++ .../descriptors/ApplicationRefDescriptor.kt | 7 ++----- .../uidebugger/descriptors/WindowDescriptor.kt | 4 ++++ .../plugins/uidebugger/util/DisplayMetrics.kt | 18 ++++++++++++++++++ 4 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/DisplayMetrics.kt diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt index 51c5ee847..bdc61b947 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt @@ -9,9 +9,13 @@ package com.facebook.flipper.plugins.uidebugger.descriptors import android.app.Activity import com.facebook.flipper.plugins.uidebugger.core.FragmentTracker +import com.facebook.flipper.plugins.uidebugger.model.Bounds +import com.facebook.flipper.plugins.uidebugger.util.DisplayMetrics object ActivityDescriptor : ChainedDescriptor() { + override fun onGetBounds(node: Activity): Bounds = DisplayMetrics.getDisplayBounds() + override fun onGetName(node: Activity): String { return node.javaClass.simpleName } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt index 38534fb39..aadf19c8f 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt @@ -8,10 +8,10 @@ package com.facebook.flipper.plugins.uidebugger.descriptors import android.app.Activity -import android.content.res.Resources import android.view.View import com.facebook.flipper.plugins.uidebugger.core.ApplicationRef import com.facebook.flipper.plugins.uidebugger.model.Bounds +import com.facebook.flipper.plugins.uidebugger.util.DisplayMetrics object ApplicationRefDescriptor : ChainedDescriptor() { @@ -19,10 +19,7 @@ object ApplicationRefDescriptor : ChainedDescriptor() { return if (node.activitiesStack.isNotEmpty()) node.activitiesStack.last() else null } - override fun onGetBounds(node: ApplicationRef): Bounds { - val displayMetrics = Resources.getSystem().displayMetrics - return Bounds(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels) - } + override fun onGetBounds(node: ApplicationRef): Bounds = DisplayMetrics.getDisplayBounds() override fun onGetName(node: ApplicationRef): String { val applicationInfo = node.application.applicationInfo diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt index 47f084a0c..60913a292 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt @@ -10,11 +10,13 @@ package com.facebook.flipper.plugins.uidebugger.descriptors import android.annotation.SuppressLint import android.util.TypedValue import android.view.Window +import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.model.Color import com.facebook.flipper.plugins.uidebugger.model.Inspectable import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.InspectableValue import com.facebook.flipper.plugins.uidebugger.model.MetadataId +import com.facebook.flipper.plugins.uidebugger.util.DisplayMetrics import java.lang.reflect.Field object WindowDescriptor : ChainedDescriptor() { @@ -31,6 +33,8 @@ object WindowDescriptor : ChainedDescriptor() { return node.javaClass.simpleName } + override fun onGetBounds(node: Window): Bounds = DisplayMetrics.getDisplayBounds() + override fun onGetChildren(node: Window): List = listOf(node.decorView) @SuppressLint("PrivateApi") diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/DisplayMetrics.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/DisplayMetrics.kt new file mode 100644 index 000000000..03fec5f30 --- /dev/null +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/DisplayMetrics.kt @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.flipper.plugins.uidebugger.util + +import android.content.res.Resources +import com.facebook.flipper.plugins.uidebugger.model.Bounds + +object DisplayMetrics { + fun getDisplayBounds(): Bounds { + val displayMetrics = Resources.getSystem().displayMetrics + return Bounds(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels) + } +} From 1398e2aa8a97296ed7fae7a814f0446c1815ef47 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 14 Nov 2022 07:05:58 -0800 Subject: [PATCH 0286/1651] Make node bounds mandatory in protocol Summary: This makes life on the desktop easier as 99% of the time bounds were there but we were dealing with non sensical non null branches. Reviewed By: lblasa Differential Revision: D41218325 fbshipit-source-id: e490d3775720c1c55dcb8f4a2a85520294f5e2a9 --- .../litho/descriptors/MountedDawable.kt | 51 ------------------- .../descriptors/ChainedDescriptor.kt | 5 +- .../uidebugger/descriptors/NodeDescriptor.kt | 2 +- .../descriptors/ObjectDescriptor.kt | 2 +- .../descriptors/OffsetChildDescriptor.kt | 7 +-- .../flipper/plugins/uidebugger/model/Node.kt | 2 +- .../traversal/PartialLayoutTraversal.kt | 2 +- 7 files changed, 9 insertions(+), 62 deletions(-) delete mode 100644 android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/MountedDawable.kt diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/MountedDawable.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/MountedDawable.kt deleted file mode 100644 index e66895dcf..000000000 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/MountedDawable.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.litho.descriptors - -import android.graphics.Bitmap -import com.facebook.flipper.plugins.uidebugger.descriptors.* -import com.facebook.flipper.plugins.uidebugger.model.Bounds -import com.facebook.flipper.plugins.uidebugger.model.InspectableObject -import com.facebook.flipper.plugins.uidebugger.model.MetadataId - -/** a drawable or view that is mounted, along with the correct descriptor */ -class MountedObject(val obj: Any, val descriptor: NodeDescriptor) - -object MountedObjectDescriptor : NodeDescriptor { - - override fun getBounds(node: MountedObject): Bounds? { - val bounds = node.descriptor.getBounds(node.obj) - bounds?.let { b -> - /** - * When we ask android for the bounds the x,y offset is w.r.t to the nearest android parent - * view group. From UI debuggers perspective using the raw android offset will double the - * total offset of this native view as the offset is included by the litho components between - * the mounted view and its native parent - */ - return Bounds(0, 0, b.width, b.height) - } - return null - } - - override fun getName(node: MountedObject): String = node.descriptor.getName(node.obj) - - override fun getQualifiedName(node: MountedObject): String = - node.descriptor.getQualifiedName(node.obj) - - override fun getChildren(node: MountedObject): List = node.descriptor.getChildren(node.obj) - - override fun getActiveChild(node: MountedObject): Any? = node.descriptor.getActiveChild(node.obj) - - override fun getData(node: MountedObject): Map = - node.descriptor.getData(node.obj) - - override fun getTags(node: MountedObject): Set = node.descriptor.getTags(node.obj) - - override fun getSnapshot(node: MountedObject, bitmap: Bitmap?): Bitmap? = - node.descriptor.getSnapshot(node.obj, bitmap) -} diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt index 6243759e6..164b4b686 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt @@ -67,8 +67,9 @@ abstract class ChainedDescriptor : NodeDescriptor { abstract fun onGetName(node: T): String - final override fun getBounds(node: T): Bounds? { - return onGetBounds(node) ?: mSuper?.getBounds(node) + final override fun getBounds(node: T): Bounds { + val bounds = onGetBounds(node) ?: mSuper?.getBounds(node) + return bounds ?: Bounds(0, 0, 0, 0) } open fun onGetBounds(node: T): Bounds? = null diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt index 26514b68f..1fda161ee 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt @@ -34,7 +34,7 @@ object BaseTags { interface NodeDescriptor { /** Should be w.r.t the direct parent */ - fun getBounds(node: T): Bounds? + fun getBounds(node: T): Bounds /** * The name used to identify this node in the inspector. Does not need to be unique. A good diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt index 7dd61cf5f..a909a4c1e 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt @@ -28,7 +28,7 @@ object ObjectDescriptor : NodeDescriptor { override fun getData(node: Any) = mutableMapOf() - override fun getBounds(node: Any): Bounds? = null + override fun getBounds(node: Any): Bounds = Bounds(0, 0, 0, 0) override fun getTags(node: Any): Set = setOf(BaseTags.Unknown) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt index ef7aeb5cd..a606787b5 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt @@ -21,12 +21,9 @@ class OffsetChild(val child: Any, val descriptor: NodeDescriptor, val x: In object OffsetChildDescriptor : NodeDescriptor { - override fun getBounds(node: OffsetChild): Bounds? { + override fun getBounds(node: OffsetChild): Bounds { val bounds = node.descriptor.getBounds(node.child) - bounds?.let { b -> - return Bounds(node.x, node.y, b.width, b.height) - } - return null + return Bounds(node.x, node.y, bounds.width, bounds.height) } override fun getName(node: OffsetChild): String = node.descriptor.getName(node.child) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Node.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Node.kt index 5530e83d5..ed44d3936 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Node.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Node.kt @@ -15,7 +15,7 @@ data class Node( val qualifiedName: String, val name: String, val attributes: Map, - val bounds: Bounds?, + val bounds: Bounds, val tags: Set, val children: List, val activeChild: Id?, diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt index e8d84f3c0..3626c4d12 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt @@ -59,7 +59,7 @@ class PartialLayoutTraversal( descriptor.getQualifiedName(node), descriptor.getName(node), emptyMap(), - null, + descriptor.getBounds(node), emptySet(), emptyList(), null)) From bfe098485fbcbaa8c687d2b4a100659354ef780d Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 14 Nov 2022 07:05:58 -0800 Subject: [PATCH 0287/1651] Nested node structure for vizualiser Summary: This structure makes sense for the vizualiser which itself is a nested structure. It also saves the awkward branch of there is no key in the map. Reviewed By: lblasa Differential Revision: D40670371 fbshipit-source-id: 6c1b960a77749be9e8a193decf6b8d50ce6c7968 --- .../components/Visualization2D.tsx | 83 ++++++++++++------- desktop/plugins/public/ui-debugger/types.tsx | 10 +++ 2 files changed, 61 insertions(+), 32 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index c4acc75dd..8725a057b 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -8,7 +8,7 @@ */ import React from 'react'; -import {Id, Snapshot, Tag, UINode} from '../types'; +import {Id, NestedNode, Snapshot, Tag, UINode} from '../types'; import {styled, Layout, theme} from 'flipper-plugin'; export const Visualization2D: React.FC< @@ -33,12 +33,16 @@ export const Visualization2D: React.FC< modifierPressed, }) => { //todo, do a bfs search for the first bounds found - const rootBounds = nodes.get(rootId)?.bounds; - const rootSnapshot = snapshots.get(rootId); - if (!rootBounds) { + const rootSnapshot = snapshots.get(rootId); + const root = toNestedNode(rootId, nodes); + + if (!root) { return null; } + + const rootBounds = root.bounds; + return (
{ @@ -66,8 +70,7 @@ export const Visualization2D: React.FC< /> ) : null} ; + node: NestedNode; snapshots: Map; modifierPressed: boolean; hoveredNode?: Id; @@ -100,38 +99,31 @@ function Visualization2DNode({ onSelectNode: (id?: Id) => void; onHoverNode: (id?: Id) => void; }) { - const node = nodes.get(nodeId); - const snapshot = snapshots.get(nodeId); + const snapshot = snapshots.get(node.id); - if (!node) { - return null; - } + const isHovered = hoveredNode === node.id; + const isSelected = selectedNode === node.id; - const isHovered = hoveredNode === nodeId; - const isSelected = selectedNode === nodeId; - - let childrenIds: Id[] = []; + let nestedChildren: NestedNode[]; //if there is an active child don't draw the other children //this means we don't draw overlapping activities / tabs etc - if (node.activeChild) { - childrenIds = [node.activeChild]; + if (node.activeChildIdx) { + nestedChildren = [node.children[node.activeChildIdx]]; } else { - childrenIds = node.children; + nestedChildren = node.children; } // stop drawing children if hovered with the modifier so you // can see parent views without their children getting in the way if (isHovered && modifierPressed) { - childrenIds = []; + nestedChildren = []; } - const children = childrenIds.map((childId) => ( + const children = nestedChildren.map((child) => ( { e.stopPropagation(); - onHoverNode(nodeId); + onHoverNode(node.id); }} onMouseLeave={(e) => { e.stopPropagation(); - onHoverNode(parentId); + // onHoverNode(parentId); }} onClick={(e) => { e.stopPropagation(); @@ -232,3 +224,30 @@ const OuterBorder = styled.div({ function toPx(n: number) { return `${n / 2}px`; } + +function toNestedNode( + rootId: Id, + nodes: Map, +): NestedNode | undefined { + function uiNodeToNestedNode(node: UINode): NestedNode { + const activeChildIdx = node.activeChild + ? node.children.indexOf(node.activeChild) + : undefined; + + return { + id: node.id, + name: node.name, + attributes: node.attributes, + children: node.children + .map((childId) => nodes.get(childId)) + .filter((child) => child != null) + .map((child) => uiNodeToNestedNode(child!!)), + bounds: node.bounds, + tags: node.tags, + activeChildIdx: activeChildIdx, + }; + } + + const root = nodes.get(rootId); + return root ? uiNodeToNestedNode(root) : undefined; +} diff --git a/desktop/plugins/public/ui-debugger/types.tsx b/desktop/plugins/public/ui-debugger/types.tsx index 9ceffc060..6307ca006 100644 --- a/desktop/plugins/public/ui-debugger/types.tsx +++ b/desktop/plugins/public/ui-debugger/types.tsx @@ -50,6 +50,16 @@ export type UpdateMetadataEvent = { attributeMetadata: Record; }; +export type NestedNode = { + id: Id; + name: string; + attributes: Record; + children: NestedNode[]; + bounds: Bounds; + tags: Tag[]; + activeChildIdx?: number; +}; + export type UINode = { id: Id; qualifiedName: string; From 062e87f50f25fe49f383d0bc4c59f8c298101723 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 14 Nov 2022 07:05:58 -0800 Subject: [PATCH 0288/1651] Use mouse position for hit test for 2D vizualizer Summary: The Dom events for the divs that are very close together were not firing correctly causing the old implementation to not track the hovered node correctly. This was really frustrating trying to select a node amongst many close neighbours. The new approach uses the mouse x,y position and performs a hit test. Currently we do a dfs looking for the first deepest child that interests the mouse x,y. In a future diff we will extract a list when there are multiple candidates. Hovered node was removed from react props since both the tree and visualisor depend on it meaning when hover state changes the whole app is rerendered. Instead we have moved hover state to an atom which is subscribed to by each visualsation node. Only if the old or new value matches the particular nodes id do we set state. The viz nodes were memo'd to prevent children renderning. The result is that for a hover change at most 2 nodes out of the 500 or so will rerender. I attempted to do the same with the tree but it wasnt working with the controlled tree environment + focus state. The perf seems fine as is so will leave it for now Reviewed By: lblasa Differential Revision: D41218324 fbshipit-source-id: 7f80bcee256abad2689a88d7e209f92417aab672 --- .../public/ui-debugger/components/Tree.tsx | 19 +- .../components/Visualization2D.tsx | 173 +++++++++++++----- .../public/ui-debugger/components/main.tsx | 5 - desktop/plugins/public/ui-debugger/index.tsx | 3 + .../plugins/public/ui-debugger/package.json | 1 + 5 files changed, 146 insertions(+), 55 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 07091083a..2d66bd345 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -8,7 +8,7 @@ */ import {Id, UINode} from '../types'; -import React, {useEffect, useRef} from 'react'; +import React, {useEffect, useMemo, useRef} from 'react'; import { Tree as ComplexTree, ControlledTreeEnvironment, @@ -26,19 +26,19 @@ export function Tree(props: { rootId: Id; nodes: Map; selectedNode?: Id; - hoveredNode?: Id; onSelectNode: (id: Id) => void; - onHoveredNode: (id?: Id) => void; }) { const instance = usePlugin(plugin); const expandedItems = useValue(instance.treeState).expandedNodes; - const items = toComplexTree(props.nodes); + const items = useMemo(() => toComplexTree(props.nodes), [props.nodes]); + const hoveredNode = useValue(instance.hoveredNode); const treeRef = useRef(); + useEffect(() => { //this makes the keyboard arrow controls work always, even when using the visualiser treeRef.current?.focusTree('tree', true); - }, [props.hoveredNode, props.selectedNode]); + }, [hoveredNode, props.selectedNode]); return ( props.onHoveredNode(item.index)} + onFocusItem={(item) => { + instance.hoveredNode.set(item.index); + }} onExpandItem={(item) => { instance.treeState.update((draft) => { draft.expandedNodes.push(item.index); @@ -85,8 +87,9 @@ export function Tree(props: { actions.selectItem(); } }, + onMouseOver: () => { - props.onHoveredNode(item.index); + instance.hoveredNode.set(item.index); }, }), }}> diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index 8725a057b..30070bb29 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -7,47 +7,81 @@ * @format */ -import React from 'react'; -import {Id, NestedNode, Snapshot, Tag, UINode} from '../types'; -import {styled, Layout, theme} from 'flipper-plugin'; +import React, {useEffect, useMemo, useRef, useState} from 'react'; +import { + Bounds, + Coordinate, + Id, + NestedNode, + Snapshot, + Tag, + UINode, +} from '../types'; + +import {styled, theme, usePlugin, Atom} from 'flipper-plugin'; +import {plugin} from '../index'; +import {throttle} from 'lodash'; export const Visualization2D: React.FC< { rootId: Id; nodes: Map; snapshots: Map; - hoveredNode?: Id; selectedNode?: Id; onSelectNode: (id?: Id) => void; - onHoverNode: (id?: Id) => void; modifierPressed: boolean; } & React.HTMLAttributes > = ({ rootId, nodes, snapshots, - hoveredNode, selectedNode, onSelectNode, - onHoverNode, modifierPressed, }) => { - //todo, do a bfs search for the first bounds found + const root = useMemo(() => toNestedNode(rootId, nodes), [rootId, nodes]); + const rootNodeRef = useRef(); + const instance = usePlugin(plugin); - const rootSnapshot = snapshots.get(rootId); - const root = toNestedNode(rootId, nodes); + useEffect(() => { + const mouseListener = throttle((ev: MouseEvent) => { + const domRect = rootNodeRef.current?.getBoundingClientRect(); + if (!root || !domRect) { + return; + } + + //make the mouse coord relative to the dom rect of the visualizer + const offsetMouse = offsetCoordinate( + {x: ev.clientX, y: ev.clientY}, + domRect, + ); + const scaledMouse = { + x: offsetMouse.x * pxScaleFactor, + y: offsetMouse.y * pxScaleFactor, + }; + + const targeted = hitTest(root, scaledMouse, root.bounds); + if (targeted && targeted.id !== instance.hoveredNode.get()) { + instance.hoveredNode.set(targeted.id); + } + }, MouseThrottle); + window.addEventListener('mousemove', mouseListener); + + return () => { + window.removeEventListener('mousemove', mouseListener); + }; + }, [instance.hoveredNode, root]); if (!root) { return null; } - const rootBounds = root.bounds; - return (
{ e.stopPropagation(); - onHoverNode(undefined); + instance.hoveredNode.set(undefined); }} style={{ /** @@ -58,50 +92,62 @@ export const Visualization2D: React.FC< * which despite the name acts are a reference point for absolute positioning... */ position: 'relative', - width: toPx(rootBounds.width), - height: toPx(rootBounds.height), + width: toPx(root.bounds.width), + height: toPx(root.bounds.height), overflow: 'hidden', }}> - {rootSnapshot ? ( - - ) : null} -
); }; +const MemoedVisualizationNode2D = React.memo( + Visualization2DNode, + (prev, next) => { + return ( + prev.node === next.node && + prev.modifierPressed === next.modifierPressed && + prev.selectedNode === next.selectedNode + ); + }, +); + function Visualization2DNode({ node, snapshots, - hoveredNode, selectedNode, onSelectNode, - onHoverNode, modifierPressed, }: { node: NestedNode; snapshots: Map; modifierPressed: boolean; - hoveredNode?: Id; selectedNode?: Id; onSelectNode: (id?: Id) => void; - onHoverNode: (id?: Id) => void; }) { const snapshot = snapshots.get(node.id); + const instance = usePlugin(plugin); + + const [isHovered, setIsHovered] = useState(false); + useEffect(() => { + const listener = (newValue?: Id, prevValue?: Id) => { + if (prevValue === node.id || newValue === node.id) { + setIsHovered(newValue === node.id); + } + }; + instance.hoveredNode.subscribe(listener); + return () => { + instance.hoveredNode.unsubscribe(listener); + }; + }, [instance.hoveredNode, node.id]); - const isHovered = hoveredNode === node.id; const isSelected = selectedNode === node.id; let nestedChildren: NestedNode[]; @@ -121,13 +167,11 @@ function Visualization2DNode({ } const children = nestedChildren.map((child) => ( - @@ -151,21 +195,13 @@ function Visualization2DNode({ ? theme.selectionBackgroundColor : 'transparent', }} - onMouseEnter={(e) => { - e.stopPropagation(); - onHoverNode(node.id); - }} - onMouseLeave={(e) => { - e.stopPropagation(); - // onHoverNode(parentId); - }} onClick={(e) => { e.stopPropagation(); + const hoveredNode = instance.hoveredNode.get(); if (hoveredNode === selectedNode) { onSelectNode(undefined); } else { - //the way click is resolved doesn't always match what is hovered, this is a way to ensure what is hovered is selected onSelectNode(hoveredNode); } }}> @@ -221,8 +257,11 @@ const OuterBorder = styled.div({ borderRadius: '10px', }); +const pxScaleFactor = 2; +const MouseThrottle = 32; + function toPx(n: number) { - return `${n / 2}px`; + return `${n / pxScaleFactor}px`; } function toNestedNode( @@ -251,3 +290,53 @@ function toNestedNode( const root = nodes.get(rootId); return root ? uiNodeToNestedNode(root) : undefined; } + +function hitTest( + node: NestedNode, + mouseCoordinate: Coordinate, + parentBounds: Bounds, +): NestedNode | undefined { + const nodeBounds = node.bounds || parentBounds; + + if (boundsContainsCoordinate(nodeBounds, mouseCoordinate)) { + let children = node.children; + + if (node.activeChildIdx) { + children = [node.children[node.activeChildIdx]]; + } + const offsetMouseCoord = offsetCoordinate(mouseCoordinate, nodeBounds); + for (const child of children) { + const childHit = hitTest( + child, + offsetMouseCoord, + (parentBounds = nodeBounds), + ); + if (childHit) { + return childHit; + } + } + + return node; + } + + return undefined; +} + +function boundsContainsCoordinate(bounds: Bounds, coordinate: Coordinate) { + return ( + coordinate.x >= bounds.x && + coordinate.x <= bounds.x + bounds.width && + coordinate.y >= bounds.y && + coordinate.y <= bounds.y + bounds.height + ); +} + +function offsetCoordinate( + coordinate: Coordinate, + offset: Coordinate, +): Coordinate { + return { + x: coordinate.x - offset.x, + y: coordinate.y - offset.y, + }; +} diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index dc781c970..0c4b45cbe 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -27,7 +27,6 @@ export function Component() { const [showPerfStats, setShowPerfStats] = useState(false); const [selectedNode, setSelectedNode] = useState(undefined); - const [hoveredNode, setHoveredNode] = useState(undefined); useHotkeys('ctrl+i', () => setShowPerfStats((show) => !show)); @@ -55,9 +54,7 @@ export function Component() { @@ -66,8 +63,6 @@ export function Component() { rootId={rootId} nodes={nodes} snapshots={snapshots} - hoveredNode={hoveredNode} - onHoverNode={setHoveredNode} selectedNode={selectedNode} onSelectNode={setSelectedNode} modifierPressed={ctrlPressed} diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index bcdfbb11a..744a3d901 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -52,6 +52,8 @@ export function plugin(client: PluginClient) { const treeState = createState({expandedNodes: []}); + const hoveredNode = createState(undefined); + client.onMessage('coordinateUpdate', (event) => { nodes.update((draft) => { const node = draft.get(event.nodeId); @@ -101,6 +103,7 @@ export function plugin(client: PluginClient) { nodes, metadata, snapshots, + hoveredNode, perfEvents, treeState, }; diff --git a/desktop/plugins/public/ui-debugger/package.json b/desktop/plugins/public/ui-debugger/package.json index f51191943..beba5b62b 100644 --- a/desktop/plugins/public/ui-debugger/package.json +++ b/desktop/plugins/public/ui-debugger/package.json @@ -13,6 +13,7 @@ "flipper-plugin" ], "dependencies": { + "lodash": "^4.17.21", "react-color": "^2.19.3", "react-complex-tree" : "^1.1.11", "react-hotkeys-hook": "^3.4.7" From 477eae1993798813d227d0bcd2cc3562ce21b664 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 14 Nov 2022 07:05:58 -0800 Subject: [PATCH 0289/1651] Hit test can produce multiple nodes Summary: There are situations where multiple siblings overlap and they are both hit. Previously we picked the first one in the hierachy. Now we produce a list of hit children. The list will not have 2 nodes in the same ancestor path. We store the hovered nodes as a list as we may want to present a modal in future to ask user which node they indented to select. That said simply sorting nodes by area seems to give decent results so we can start with this Reviewed By: lblasa Differential Revision: D41220271 fbshipit-source-id: 643a369113da28e8c4749725a7aee7aa5d08c401 --- .../public/ui-debugger/components/Tree.tsx | 11 ++- .../components/Visualization2D.tsx | 93 +++++++++++-------- desktop/plugins/public/ui-debugger/index.tsx | 6 +- 3 files changed, 65 insertions(+), 45 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 2d66bd345..4b3102c9c 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -21,6 +21,7 @@ import { InteractionMode, TreeEnvironmentRef, } from 'react-complex-tree/lib/esm/types'; +import {head} from 'lodash'; export function Tree(props: { rootId: Id; @@ -32,13 +33,13 @@ export function Tree(props: { const expandedItems = useValue(instance.treeState).expandedNodes; const items = useMemo(() => toComplexTree(props.nodes), [props.nodes]); - const hoveredNode = useValue(instance.hoveredNode); + const hoveredNodes = useValue(instance.hoveredNodes); const treeRef = useRef(); useEffect(() => { //this makes the keyboard arrow controls work always, even when using the visualiser treeRef.current?.focusTree('tree', true); - }, [hoveredNode, props.selectedNode]); + }, [hoveredNodes, props.selectedNode]); return ( { - instance.hoveredNode.set(item.index); + instance.hoveredNodes.set([item.index]); }} onExpandItem={(item) => { instance.treeState.update((draft) => { @@ -89,7 +90,7 @@ export function Tree(props: { }, onMouseOver: () => { - instance.hoveredNode.set(item.index); + instance.hoveredNodes.set([item.index]); }, }), }}> diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index 30070bb29..3e1fc2f84 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -18,9 +18,9 @@ import { UINode, } from '../types'; -import {styled, theme, usePlugin, Atom} from 'flipper-plugin'; +import {styled, theme, usePlugin} from 'flipper-plugin'; import {plugin} from '../index'; -import {throttle} from 'lodash'; +import {throttle, isEqual, head} from 'lodash'; export const Visualization2D: React.FC< { @@ -60,9 +60,13 @@ export const Visualization2D: React.FC< y: offsetMouse.y * pxScaleFactor, }; - const targeted = hitTest(root, scaledMouse, root.bounds); - if (targeted && targeted.id !== instance.hoveredNode.get()) { - instance.hoveredNode.set(targeted.id); + const hitNodes = hitTest(root, scaledMouse).map((node) => node.id); + + if ( + hitNodes.length > 0 && + !isEqual(hitNodes, instance.hoveredNodes.get()) + ) { + instance.hoveredNodes.set(hitNodes); } }, MouseThrottle); window.addEventListener('mousemove', mouseListener); @@ -70,7 +74,7 @@ export const Visualization2D: React.FC< return () => { window.removeEventListener('mousemove', mouseListener); }; - }, [instance.hoveredNode, root]); + }, [instance.hoveredNodes, root]); if (!root) { return null; @@ -81,7 +85,7 @@ export const Visualization2D: React.FC< ref={rootNodeRef as any} onMouseLeave={(e) => { e.stopPropagation(); - instance.hoveredNode.set(undefined); + instance.hoveredNodes.set([]); }} style={{ /** @@ -137,16 +141,16 @@ function Visualization2DNode({ const [isHovered, setIsHovered] = useState(false); useEffect(() => { - const listener = (newValue?: Id, prevValue?: Id) => { - if (prevValue === node.id || newValue === node.id) { - setIsHovered(newValue === node.id); + const listener = (newValue?: Id[], prevValue?: Id[]) => { + if (head(prevValue) === node.id || head(newValue) === node.id) { + setIsHovered(head(newValue) === node.id); } }; - instance.hoveredNode.subscribe(listener); + instance.hoveredNodes.subscribe(listener); return () => { - instance.hoveredNode.unsubscribe(listener); + instance.hoveredNodes.unsubscribe(listener); }; - }, [instance.hoveredNode, node.id]); + }, [instance.hoveredNodes, node.id]); const isSelected = selectedNode === node.id; @@ -198,11 +202,11 @@ function Visualization2DNode({ onClick={(e) => { e.stopPropagation(); - const hoveredNode = instance.hoveredNode.get(); - if (hoveredNode === selectedNode) { + const hoveredNodes = instance.hoveredNodes.get(); + if (hoveredNodes[0] === selectedNode) { onSelectNode(undefined); } else { - onSelectNode(hoveredNode); + onSelectNode(hoveredNodes[0]); } }}> @@ -291,35 +295,48 @@ function toNestedNode( return root ? uiNodeToNestedNode(root) : undefined; } -function hitTest( - node: NestedNode, - mouseCoordinate: Coordinate, - parentBounds: Bounds, -): NestedNode | undefined { - const nodeBounds = node.bounds || parentBounds; +function hitTest(node: NestedNode, mouseCoordinate: Coordinate): NestedNode[] { + const res: NestedNode[] = []; - if (boundsContainsCoordinate(nodeBounds, mouseCoordinate)) { - let children = node.children; + function hitTestRec(node: NestedNode, mouseCoordinate: Coordinate): boolean { + const nodeBounds = node.bounds; - if (node.activeChildIdx) { - children = [node.children[node.activeChildIdx]]; - } - const offsetMouseCoord = offsetCoordinate(mouseCoordinate, nodeBounds); - for (const child of children) { - const childHit = hitTest( - child, - offsetMouseCoord, - (parentBounds = nodeBounds), - ); - if (childHit) { - return childHit; + if (boundsContainsCoordinate(nodeBounds, mouseCoordinate)) { + let children = node.children; + + if (node.activeChildIdx != null) { + children = [node.children[node.activeChildIdx]]; } + const offsetMouseCoord = offsetCoordinate(mouseCoordinate, nodeBounds); + let childHit = false; + + for (const child of children) { + childHit = hitTestRec(child, offsetMouseCoord) || childHit; + } + + if (!childHit) { + res.push(node); + } + + return true; } - return node; + return false; } - return undefined; + hitTestRec(node, mouseCoordinate); + + return res.sort((a, b) => { + const areaA = a.bounds.height * a.bounds.width; + const areaB = b.bounds.height * b.bounds.width; + if (areaA > areaB) { + return 1; + } else if (areaA < areaB) { + return -1; + } else { + return 0; + } + }); } function boundsContainsCoordinate(bounds: Bounds, coordinate: Coordinate) { diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index 744a3d901..f7bbd4964 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -52,7 +52,9 @@ export function plugin(client: PluginClient) { const treeState = createState({expandedNodes: []}); - const hoveredNode = createState(undefined); + //The reason for the array as that user could be hovering multiple overlapping nodes at once in the visualiser. + //The nodes are sorted by area since you most likely want to select the smallest node under your cursor + const hoveredNodes = createState([]); client.onMessage('coordinateUpdate', (event) => { nodes.update((draft) => { @@ -103,7 +105,7 @@ export function plugin(client: PluginClient) { nodes, metadata, snapshots, - hoveredNode, + hoveredNodes, perfEvents, treeState, }; From f70b2a2d1ead3bf295983c0d0c435df1f9c6fbaf Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 14 Nov 2022 07:05:58 -0800 Subject: [PATCH 0290/1651] Fragment bounds Reviewed By: lblasa Differential Revision: D41220272 fbshipit-source-id: e3ff054c7aa8c290e3c04e70a71cb7d752393cfe --- .../uidebugger/descriptors/DescriptorRegister.kt | 5 +++-- .../descriptors/FragmentFrameworkDescriptor.kt | 11 +++++++++-- .../descriptors/FragmentSupportDescriptor.kt | 11 +++++++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/DescriptorRegister.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/DescriptorRegister.kt index 2166946f8..77faea846 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/DescriptorRegister.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/DescriptorRegister.kt @@ -38,8 +38,9 @@ class DescriptorRegister { mapping.register(Drawable::class.java, DrawableDescriptor) mapping.register(ColorDrawable::class.java, ColorDrawableDescriptor) mapping.register(OffsetChild::class.java, OffsetChildDescriptor) - mapping.register(android.app.Fragment::class.java, FragmentFrameworkDescriptor) - mapping.register(androidx.fragment.app.Fragment::class.java, FragmentSupportDescriptor) + mapping.register(android.app.Fragment::class.java, FragmentFrameworkDescriptor(mapping)) + mapping.register( + androidx.fragment.app.Fragment::class.java, FragmentSupportDescriptor(mapping)) return mapping } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt index 7a9135f5b..e76f636dc 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt @@ -8,14 +8,18 @@ package com.facebook.flipper.plugins.uidebugger.descriptors import android.os.Bundle +import androidx.fragment.app.Fragment +import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.model.Inspectable import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.InspectableValue import com.facebook.flipper.plugins.uidebugger.model.MetadataId -object FragmentFrameworkDescriptor : ChainedDescriptor() { +class FragmentFrameworkDescriptor(val register: DescriptorRegister) : + ChainedDescriptor() { + + private val NAMESPACE = "Fragment" - private const val NAMESPACE = "Fragment" private var SectionId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) @@ -23,6 +27,9 @@ object FragmentFrameworkDescriptor : ChainedDescriptor() { return node.javaClass.simpleName } + override fun onGetBounds(node: android.app.Fragment): Bounds? = + node.view?.let { register.descriptorForClassUnsafe(it.javaClass).getBounds(it) } + override fun onGetChildren(node: android.app.Fragment): List = node.view?.let { view -> listOf(view) } ?: listOf() diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt index d866e4eff..4c4117f8d 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt @@ -7,14 +7,18 @@ package com.facebook.flipper.plugins.uidebugger.descriptors +import androidx.fragment.app.Fragment +import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.model.Inspectable import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.InspectableValue import com.facebook.flipper.plugins.uidebugger.model.MetadataId -object FragmentSupportDescriptor : ChainedDescriptor() { +class FragmentSupportDescriptor(val register: DescriptorRegister) : + ChainedDescriptor() { + + private val NAMESPACE = "Fragment" - private const val NAMESPACE = "Fragment" private var SectionId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) @@ -22,6 +26,9 @@ object FragmentSupportDescriptor : ChainedDescriptor = node.view?.let { view -> listOf(view) } ?: listOf() From 7a28ed1fe53a39d4e7fe04a856941758b85ae06c Mon Sep 17 00:00:00 2001 From: Ranesh Saha Date: Tue, 15 Nov 2022 03:23:55 -0800 Subject: [PATCH 0291/1651] Pipe through --updater/--no-updater flag for flipper.exe (#4277) Summary: In our organization, Flipper is distributed in a version controlled way. As a result, we do not want users to manually update or receive prompts to update when a new version is available. There is already a `--updater` flag in the command line arguments for flipper.exe, but it isn't piped through. This change pipes it through and disables all update related UI when `--no-updater` is passed in. ## Changelog Support --updater and --no-updater options for flipper.exe Pull Request resolved: https://github.com/facebook/flipper/pull/4277 Test Plan: Ran `yarn build --win` in flipper/desktop, and launched flipper.exe from flipper/dist/win-unpacked with the `--updater`, `--no-updater` and no flags and ensured the proper behavior was observed (update UI shows by default or when `--updater` is specified, and doesn't show when `--no-updater` is specified). Reviewed By: passy Differential Revision: D41298321 Pulled By: mweststrate fbshipit-source-id: 5ddfede2700954f0fdd6a111b20d0836fab25565 --- desktop/flipper-common/src/settings.tsx | 3 ++- .../src/utils/__tests__/processConfig.node.tsx | 3 +++ desktop/flipper-server-core/src/utils/processConfig.tsx | 2 ++ desktop/flipper-ui-core/src/chrome/UpdateIndicator.tsx | 1 + .../src/dispatcher/handleOpenPluginDeeplink.tsx | 7 ++++++- desktop/scripts/jest-setup-after.tsx | 1 + 6 files changed, 15 insertions(+), 2 deletions(-) diff --git a/desktop/flipper-common/src/settings.tsx b/desktop/flipper-common/src/settings.tsx index de730cc13..9568d7680 100644 --- a/desktop/flipper-common/src/settings.tsx +++ b/desktop/flipper-common/src/settings.tsx @@ -77,7 +77,7 @@ export type LauncherSettings = { }; // Settings that primarily only apply to Electron atm -// TODO: further separte between flipper-ui config and Electron config +// TODO: further separate between flipper-ui config and Electron config export type ProcessConfig = { disabledPlugins: string[]; lastWindowPosition: { @@ -90,6 +90,7 @@ export type ProcessConfig = { launcherMsg: string | null; // Controls whether to delegate to the launcher if present. launcherEnabled: boolean; + updaterEnabled: boolean; // Control whether to suppress "update available" notifications suppressPluginUpdateNotifications?: boolean; }; diff --git a/desktop/flipper-server-core/src/utils/__tests__/processConfig.node.tsx b/desktop/flipper-server-core/src/utils/__tests__/processConfig.node.tsx index 0f41b8865..5e4a3d0f4 100644 --- a/desktop/flipper-server-core/src/utils/__tests__/processConfig.node.tsx +++ b/desktop/flipper-server-core/src/utils/__tests__/processConfig.node.tsx @@ -18,6 +18,7 @@ test('config is decoded from env', () => { screenCapturePath: '/my/screenshot/path', launcherEnabled: false, suppressPluginUpdateNotifications: true, + updaterEnabled: true, }), }); @@ -28,6 +29,7 @@ test('config is decoded from env', () => { screenCapturePath: '/my/screenshot/path', launcherEnabled: false, suppressPluginUpdateNotifications: true, + updaterEnabled: true, }); }); @@ -39,5 +41,6 @@ test('config is decoded from env with defaults', () => { screenCapturePath: undefined, launcherEnabled: true, suppressPluginUpdateNotifications: false, + updaterEnabled: true, }); }); diff --git a/desktop/flipper-server-core/src/utils/processConfig.tsx b/desktop/flipper-server-core/src/utils/processConfig.tsx index 547be1755..a71904453 100644 --- a/desktop/flipper-server-core/src/utils/processConfig.tsx +++ b/desktop/flipper-server-core/src/utils/processConfig.tsx @@ -18,6 +18,8 @@ export function loadProcessConfig(env: NodeJS.ProcessEnv): ProcessConfig { screenCapturePath: json.screenCapturePath, launcherEnabled: typeof json.launcherEnabled === 'boolean' ? json.launcherEnabled : true, + updaterEnabled: + typeof json.updaterEnabled === 'boolean' ? json.updaterEnabled : true, suppressPluginUpdateNotifications: typeof json.suppressPluginUpdateNotifications === 'boolean' ? json.suppressPluginUpdateNotifications diff --git a/desktop/flipper-ui-core/src/chrome/UpdateIndicator.tsx b/desktop/flipper-ui-core/src/chrome/UpdateIndicator.tsx index caf69eb71..cebab7698 100644 --- a/desktop/flipper-ui-core/src/chrome/UpdateIndicator.tsx +++ b/desktop/flipper-ui-core/src/chrome/UpdateIndicator.tsx @@ -85,6 +85,7 @@ export default function UpdateIndicator() { } } else if ( version && + config.updaterEnabled && !config.suppressPluginUpdateNotifications && isProduction() ) { diff --git a/desktop/flipper-ui-core/src/dispatcher/handleOpenPluginDeeplink.tsx b/desktop/flipper-ui-core/src/dispatcher/handleOpenPluginDeeplink.tsx index 50f420686..efa2ae416 100644 --- a/desktop/flipper-ui-core/src/dispatcher/handleOpenPluginDeeplink.tsx +++ b/desktop/flipper-ui-core/src/dispatcher/handleOpenPluginDeeplink.tsx @@ -284,7 +284,12 @@ async function waitForLogin(store: Store) { async function verifyFlipperIsUpToDate(title: string) { const config = getRenderHostInstance().serverConfig.processConfig; - if (!isProduction() || isTest() || config.suppressPluginUpdateNotifications) { + if ( + !isProduction() || + isTest() || + !config.updaterEnabled || + config.suppressPluginUpdateNotifications + ) { return; } const currentVersion = getAppVersion(); diff --git a/desktop/scripts/jest-setup-after.tsx b/desktop/scripts/jest-setup-after.tsx index 313e9ce92..1fd69331f 100644 --- a/desktop/scripts/jest-setup-after.tsx +++ b/desktop/scripts/jest-setup-after.tsx @@ -137,6 +137,7 @@ function createStubRenderHost(): RenderHost { launcherEnabled: false, launcherMsg: null, screenCapturePath: `/dev/null`, + updaterEnabled: true, suppressPluginUpdateNotifications: false, }, settings: { From 66984c6d133667bd21e338f2c61ff63c081a5012 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 15 Nov 2022 06:18:12 -0800 Subject: [PATCH 0292/1651] Organise 'Under the Hood' Summary: This change alphabetically sorts the 'Under the Hood' section and adds a 'Meta' parent category for everything that is internal as to add a visual cue of what is internal and whats not. Reviewed By: passy Differential Revision: D41273678 fbshipit-source-id: 1acf8da184762d5924bff90b6691be1e4be92c46 --- docs/extending/testing-rn.mdx | 2 +- website/sidebars.js | 48 +++++++++++++++++++---------------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/docs/extending/testing-rn.mdx b/docs/extending/testing-rn.mdx index 613c943e1..aa3b458d4 100644 --- a/docs/extending/testing-rn.mdx +++ b/docs/extending/testing-rn.mdx @@ -1,7 +1,7 @@ --- id: testing-rn title: Testing React Native Changes in the Sample App -sidebar_label: Testing RN Changes +sidebar_label: Testing React Native Changes --- import useBaseUrl from '@docusaurus/useBaseUrl'; diff --git a/website/sidebars.js b/website/sidebars.js index c5f14e020..7c9d94520 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -150,31 +150,35 @@ module.exports = { { 'Contributing to the Documentation': ['internals/documentation-formatting', 'internals/documentation-writing-guide'], }, + 'internals/device-identifiers', + 'internals/linters', 'extending/public-releases', 'extending/testing-rn', - 'internals/linters', - 'internals/device-identifiers', ...fbInternalOnly([ - 'fb/release-infra', - 'fb/LauncherConfig', - 'fb/hacking-on-launcher', - 'fb/arc_uiqr', - 'fb/Flipper-fbsource-Pinning', - 'fb/Flipper-Release-Cycle', - 'fb/Add-Support-Group-to-Flipper-Support-Form', - 'fb/Alerts', - 'fb/bundling', - 'fb/Electron-Upgrade', - 'fb/flipper-analytics', - 'fb/Navigation-Plugin-Development-Guide', - 'fb/Oncall-Runbook', - 'fb/sandcastle', - 'fb/Star-Ratings', - 'fb/sandcastle-overview', - 'fb/error-logging', - 'fb/scribe', - 'fb/async-testing', - 'fb/connections', + { + "Meta": [ + 'fb/release-infra', + 'fb/LauncherConfig', + 'fb/hacking-on-launcher', + 'fb/arc_uiqr', + 'fb/Flipper-fbsource-Pinning', + 'fb/Flipper-Release-Cycle', + 'fb/Add-Support-Group-to-Flipper-Support-Form', + 'fb/Alerts', + 'fb/bundling', + 'fb/Electron-Upgrade', + 'fb/flipper-analytics', + 'fb/Navigation-Plugin-Development-Guide', + 'fb/Oncall-Runbook', + 'fb/sandcastle', + 'fb/Star-Ratings', + 'fb/sandcastle-overview', + 'fb/error-logging', + 'fb/scribe', + 'fb/async-testing', + 'fb/connections', + ] + } ]), ], }, From 4ba34fcb4ff23be1ff100c2bd957656e74784aa6 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 15 Nov 2022 06:18:12 -0800 Subject: [PATCH 0293/1651] Categorise 'Under the Hood -> Meta' section Summary: ^ Reviewed By: passy Differential Revision: D41274192 fbshipit-source-id: 602a3c79e971d6f5ea8617ac638c95131e59a820 --- website/sidebars.js | 56 ++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/website/sidebars.js b/website/sidebars.js index 7c9d94520..4b1dc24c8 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -157,26 +157,46 @@ module.exports = { ...fbInternalOnly([ { "Meta": [ - 'fb/release-infra', - 'fb/LauncherConfig', - 'fb/hacking-on-launcher', 'fb/arc_uiqr', - 'fb/Flipper-fbsource-Pinning', - 'fb/Flipper-Release-Cycle', - 'fb/Add-Support-Group-to-Flipper-Support-Form', - 'fb/Alerts', - 'fb/bundling', - 'fb/Electron-Upgrade', - 'fb/flipper-analytics', - 'fb/Navigation-Plugin-Development-Guide', - 'fb/Oncall-Runbook', - 'fb/sandcastle', - 'fb/Star-Ratings', - 'fb/sandcastle-overview', - 'fb/error-logging', - 'fb/scribe', - 'fb/async-testing', 'fb/connections', + { + 'Data Pipelines': [ + 'fb/flipper-analytics', + 'fb/scribe', + 'fb/error-logging', + ] + }, + 'fb/Electron-Upgrade', + { + 'Launcher': [ + 'fb/hacking-on-launcher', + 'fb/LauncherConfig', + ] + }, + 'fb/bundling', + 'fb/Navigation-Plugin-Development-Guide', + { + 'Releases': [ + 'fb/Flipper-Release-Cycle', + 'fb/release-infra', + 'fb/Flipper-fbsource-Pinning', + ] + }, + { + 'Sandcastle': [ + 'fb/sandcastle-overview', + 'fb/sandcastle', + ] + }, + { + 'Support': [ + 'fb/Alerts', + 'fb/Add-Support-Group-to-Flipper-Support-Form', + 'fb/Oncall-Runbook', + ] + }, + 'fb/Star-Ratings', + 'fb/async-testing', ] } ]), From 6f8b57bbdda2c273221184a1381b7c6f69d76574 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 15 Nov 2022 06:18:12 -0800 Subject: [PATCH 0294/1651] Data Pipelines overview Summary: Pretty much copy/paste from Pascal's post on data pipelines as it provides a quick overview of things involved Reviewed By: passy Differential Revision: D41274753 fbshipit-source-id: 337b034d2460ba448582b9dea70b835898627faa --- website/sidebars.js | 1 + 1 file changed, 1 insertion(+) diff --git a/website/sidebars.js b/website/sidebars.js index 4b1dc24c8..e345622dd 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -161,6 +161,7 @@ module.exports = { 'fb/connections', { 'Data Pipelines': [ + 'fb/data-pipelines', 'fb/flipper-analytics', 'fb/scribe', 'fb/error-logging', From 9aee09bc708fd66d9133469ad7a754453e52c455 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 15 Nov 2022 06:18:12 -0800 Subject: [PATCH 0295/1651] Data pipeline deep dive Summary: ^ Reviewed By: antonk52 Differential Revision: D41304481 fbshipit-source-id: 7ebb57d1b6940483dd273c69f9790c346363a2d0 --- website/sidebars.js | 1 + 1 file changed, 1 insertion(+) diff --git a/website/sidebars.js b/website/sidebars.js index e345622dd..c48008664 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -162,6 +162,7 @@ module.exports = { { 'Data Pipelines': [ 'fb/data-pipelines', + 'fb/data-pipelines-details', 'fb/flipper-analytics', 'fb/scribe', 'fb/error-logging', From 53c15b2e590d9c25696a9fa0e832ec0c5c4504ba Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 16 Nov 2022 10:38:23 -0800 Subject: [PATCH 0296/1651] Remove litho observer Summary: There seem to be a number of issues with registering to all changes properly for litho observer. Removing it and allowing the decor view to do a full traversal fixes a number of problems. The performance with hardware rendering seems to be fine. This should be stopgap untill we tackle time travel properly Reviewed By: lblasa Differential Revision: D41304501 fbshipit-source-id: 5b7cdbd0dac04ba0dbf8dd5e449c99f0db4d0863 --- .../plugins/uidebugger/litho/UIDebuggerLithoSupport.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt index 069bb6c66..d2bb0234a 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt @@ -26,7 +26,5 @@ object UIDebuggerLithoSupport { register.register(MatrixDrawable::class.java, MatrixDrawableDescriptor) } - fun addObserver(observerFactory: TreeObserverFactory) { - observerFactory.register(LithoViewTreeObserverBuilder) - } + fun addObserver(observerFactory: TreeObserverFactory) {} } From 1d920efe10dfb44ce856822840415cb734a91085 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 16 Nov 2022 10:38:23 -0800 Subject: [PATCH 0297/1651] Change hit test to explore all nodes Summary: Previously we would only consider a node hit if the nouse pos was inside every parents. There are a few reason why this isnt ideal: 1. Fragments are return 0 bounds 2. Many hierachys (particually in litho ) have nonsensical strucutres where your parent may have hieght 0, or children overflow parents bounds. Therefore it was impossible to select many nodes but unclear why Reviewed By: lblasa Differential Revision: D41304499 fbshipit-source-id: d75c8060f71fa0b972f136cb11258b62a9c98ebc --- .../components/Visualization2D.tsx | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index 3e1fc2f84..40d0cc704 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -301,27 +301,26 @@ function hitTest(node: NestedNode, mouseCoordinate: Coordinate): NestedNode[] { function hitTestRec(node: NestedNode, mouseCoordinate: Coordinate): boolean { const nodeBounds = node.bounds; - if (boundsContainsCoordinate(nodeBounds, mouseCoordinate)) { - let children = node.children; + const thisNodeHit = boundsContainsCoordinate(nodeBounds, mouseCoordinate); - if (node.activeChildIdx != null) { - children = [node.children[node.activeChildIdx]]; - } - const offsetMouseCoord = offsetCoordinate(mouseCoordinate, nodeBounds); - let childHit = false; + let children = node.children; - for (const child of children) { - childHit = hitTestRec(child, offsetMouseCoord) || childHit; - } + if (node.activeChildIdx != null) { + children = [node.children[node.activeChildIdx]]; + } + const offsetMouseCoord = offsetCoordinate(mouseCoordinate, nodeBounds); + let childHit = false; - if (!childHit) { - res.push(node); - } - - return true; + for (const child of children) { + childHit = hitTestRec(child, offsetMouseCoord) || childHit; } - return false; + const hit = thisNodeHit && !childHit; + if (hit) { + res.push(node); + } + + return hit; } hitTestRec(node, mouseCoordinate); From f6060d004634c2bea1b3e316f08e4fb389a979bb Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 16 Nov 2022 10:38:23 -0800 Subject: [PATCH 0298/1651] Fragment return 0 bounds Summary: In a previous diff the Bounds was made mandatory and the fragment bounds was set to be the same as the underlying view. this caused the offset to be doubled since the underlying view would also apply that offset. Since fragments dont contribute to layout and are purely for lifecycle we can set it to 0 and handle it on the desktop Reviewed By: lblasa Differential Revision: D41304500 fbshipit-source-id: 39591b3ef0c746bd7a4ec8d61fed623cc7c94944 --- .../uidebugger/descriptors/FragmentFrameworkDescriptor.kt | 3 +-- .../uidebugger/descriptors/FragmentSupportDescriptor.kt | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt index e76f636dc..88570b9f8 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt @@ -27,8 +27,7 @@ class FragmentFrameworkDescriptor(val register: DescriptorRegister) : return node.javaClass.simpleName } - override fun onGetBounds(node: android.app.Fragment): Bounds? = - node.view?.let { register.descriptorForClassUnsafe(it.javaClass).getBounds(it) } + override fun onGetBounds(node: android.app.Fragment): Bounds? = Bounds(0, 0, 0, 0) override fun onGetChildren(node: android.app.Fragment): List = node.view?.let { view -> listOf(view) } ?: listOf() diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt index 4c4117f8d..593f51461 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt @@ -26,8 +26,7 @@ class FragmentSupportDescriptor(val register: DescriptorRegister) : return node.javaClass.simpleName } - override fun onGetBounds(node: Fragment): Bounds? = - node.view?.let { register.descriptorForClassUnsafe(it.javaClass).getBounds(it) } + override fun onGetBounds(node: Fragment): Bounds = Bounds(0, 0, 0, 0) override fun onGetChildren(node: androidx.fragment.app.Fragment): List = node.view?.let { view -> listOf(view) } ?: listOf() From 0ebedc9c493137e12714898883a83c7e0359f5d5 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 16 Nov 2022 10:38:23 -0800 Subject: [PATCH 0299/1651] Add Id to node descriptor interface Summary: There were 2 situations where the UI hadn't changed but we were sending a nodes with a different Id accross traversals which confuses things on the desktop 1. By removing the litho observer we are repeatidly scanning the entire hierachy on scroll or when a video plays. The debug component that represents litho views are not stable, they are generated each time even if the underlying component is the same 2. Offset child is generated by us each time and the old id refered to the generated offset child not the underlying object This diff addresses these 2 cases by allowing a descriptor to choose the ID. The nodeId convience method was used in a lot of places. For the places where the id ended up in the protocol we have migrated to the descriptors getID. In some other places it is only used internally or for logging. In this case I have renamed the method and changed the return type from Id to int so it cant be accidently used in the protocol Reviewed By: lblasa Differential Revision: D41307239 fbshipit-source-id: 655b230180a6d02d66888e86b2293eead3385455 --- .../plugins/uidebugger/litho/LithoObserver.kt | 13 +++++++------ .../litho/descriptors/DebugComponentDescriptor.kt | 6 ++++++ .../plugins/uidebugger/UIDebuggerFlipperPlugin.kt | 6 ++++-- .../plugins/uidebugger/core/NativeScanScheduler.kt | 7 +++++-- .../uidebugger/descriptors/NodeDescriptor.kt | 11 +++++------ .../uidebugger/descriptors/OffsetChildDescriptor.kt | 2 ++ .../plugins/uidebugger/observers/TreeObserver.kt | 12 ++++++------ .../uidebugger/traversal/PartialLayoutTraversal.kt | 13 ++++++++----- .../plugins/uidebugger/util/ObjectIdentity.kt | 12 ++++++++++++ 9 files changed, 55 insertions(+), 27 deletions(-) create mode 100644 android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/ObjectIdentity.kt diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt index 1a209d319..5700b4f9a 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt @@ -13,7 +13,6 @@ import android.view.ViewTreeObserver import com.facebook.flipper.plugins.uidebugger.LogTag import com.facebook.flipper.plugins.uidebugger.core.Context import com.facebook.flipper.plugins.uidebugger.descriptors.ViewDescriptor -import com.facebook.flipper.plugins.uidebugger.descriptors.nodeId import com.facebook.flipper.plugins.uidebugger.litho.descriptors.LithoViewDescriptor import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.model.Coordinate @@ -21,6 +20,7 @@ import com.facebook.flipper.plugins.uidebugger.observers.CoordinateUpdate import com.facebook.flipper.plugins.uidebugger.observers.TreeObserver import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverBuilder import com.facebook.flipper.plugins.uidebugger.scheduler.throttleLatest +import com.facebook.flipper.plugins.uidebugger.util.objectIdentity import com.facebook.litho.LithoView import com.facebook.rendercore.extensions.ExtensionState import com.facebook.rendercore.extensions.MountExtension @@ -56,10 +56,10 @@ class LithoViewTreeObserver(val context: Context) : TreeObserver() { @SuppressLint("PrivateApi") override fun subscribe(node: Any) { - Log.d(LogTag, "Subscribing to litho view ${node.nodeId()}") - nodeRef = node as LithoView + Log.d(LogTag, "Subscribing to litho view ${nodeRef?.objectIdentity()}") + val lithoDebuggerExtension = LithoDebuggerExtension(this) node.registerUIDebugger(lithoDebuggerExtension) @@ -69,7 +69,8 @@ class LithoViewTreeObserver(val context: Context) : TreeObserver() { val bounds = ViewDescriptor.onGetBounds(node) if (bounds != lastBounds) { context.treeObserverManager.enqueueUpdate( - CoordinateUpdate(this.type, node.nodeId(), Coordinate(bounds.x, bounds.y))) + CoordinateUpdate( + this.type, LithoViewDescriptor.getId(node), Coordinate(bounds.x, bounds.y))) lastBounds = bounds } } @@ -89,7 +90,7 @@ class LithoViewTreeObserver(val context: Context) : TreeObserver() { } override fun unsubscribe() { - Log.d(LogTag, "Unsubscribing from litho view ${nodeRef?.nodeId()}") + Log.d(LogTag, "Unsubscribing from litho view ${nodeRef?.objectIdentity()}") nodeRef?.viewTreeObserver?.removeOnPreDrawListener(preDrawListener) nodeRef?.unregisterUIDebugger() nodeRef = null @@ -107,7 +108,7 @@ class LithoDebuggerExtension(val observer: LithoViewTreeObserver) : MountExtensi * mounting includes adding updating or removing views from the heriachy */ override fun afterMount(state: ExtensionState) { - Log.i(LogTag, "After mount called for litho view ${observer.nodeRef?.nodeId()}") + Log.i(LogTag, "After mount called for litho view ${observer.nodeRef?.objectIdentity()}") observer.lastBounds = ViewDescriptor.onGetBounds(state.rootHost) observer.processUpdate(observer.context, state.rootHost as Any) } diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt index 3614697e3..d88df74e4 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt @@ -20,6 +20,12 @@ import com.facebook.litho.DebugComponent class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescriptor { private val NAMESPACE = "DebugComponent" + /* + * Debug component is generated on the fly so use the underlying component instance which is + * immutable + */ + override fun getId(node: DebugComponent): Id = System.identityHashCode(node.component) + override fun getName(node: DebugComponent): String = node.component.simpleName override fun getQualifiedName(node: com.facebook.litho.DebugComponent): String = diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt index fc76db82d..b5bf9ae54 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt @@ -12,9 +12,9 @@ import android.util.Log import com.facebook.flipper.core.FlipperConnection import com.facebook.flipper.core.FlipperPlugin import com.facebook.flipper.plugins.uidebugger.core.* +import com.facebook.flipper.plugins.uidebugger.descriptors.ApplicationRefDescriptor import com.facebook.flipper.plugins.uidebugger.descriptors.DescriptorRegister import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister -import com.facebook.flipper.plugins.uidebugger.descriptors.nodeId import com.facebook.flipper.plugins.uidebugger.model.InitEvent import com.facebook.flipper.plugins.uidebugger.model.MetadataUpdateEvent import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory @@ -51,7 +51,9 @@ class UIDebuggerFlipperPlugin( connection.send( InitEvent.name, - Json.encodeToString(InitEvent.serializer(), InitEvent(context.applicationRef.nodeId()))) + Json.encodeToString( + InitEvent.serializer(), + InitEvent(ApplicationRefDescriptor.getId(context.applicationRef)))) connection.send( MetadataUpdateEvent.name, diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt index 9276d93a6..582353bba 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt @@ -10,8 +10,8 @@ package com.facebook.flipper.plugins.uidebugger.core import android.os.Looper import android.util.Log import com.facebook.flipper.plugins.uidebugger.LogTag +import com.facebook.flipper.plugins.uidebugger.descriptors.ApplicationRefDescriptor import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister -import com.facebook.flipper.plugins.uidebugger.descriptors.nodeId import com.facebook.flipper.plugins.uidebugger.model.MetadataUpdateEvent import com.facebook.flipper.plugins.uidebugger.model.Node import com.facebook.flipper.plugins.uidebugger.model.PerfStatsEvent @@ -66,7 +66,10 @@ class NativeScanScheduler(val context: Context) : Scheduler.Task { Json.encodeToString( SubtreeUpdateEvent.serializer(), SubtreeUpdateEvent( - input.txId, observerType, context.applicationRef.nodeId(), input.nodes)) + input.txId, + observerType, + ApplicationRefDescriptor.getId(context.applicationRef), + input.nodes)) val serializationEnd = System.currentTimeMillis() context.connectionRef.connection?.send( diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt index 1fda161ee..ac075a36f 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt @@ -31,8 +31,13 @@ object BaseTags { val AccessibleNativeAndroid = setOf(Android, Native, Accessibility) } +typealias Id = Int + interface NodeDescriptor { + /** Used to detect the same node across traversals */ + fun getId(node: T): Id = System.identityHashCode(node) + /** Should be w.r.t the direct parent */ fun getBounds(node: T): Bounds @@ -76,9 +81,3 @@ interface NodeDescriptor { */ fun getTags(node: T): Set } - -typealias Id = Int - -fun Any.nodeId(): Id { - return System.identityHashCode(this) -} diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt index a606787b5..04f57c17e 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt @@ -21,6 +21,8 @@ class OffsetChild(val child: Any, val descriptor: NodeDescriptor, val x: In object OffsetChildDescriptor : NodeDescriptor { + override fun getId(node: OffsetChild): Id = node.descriptor.getId(node.child) + override fun getBounds(node: OffsetChild): Bounds { val bounds = node.descriptor.getBounds(node.child) return Bounds(node.x, node.y, bounds.width, bounds.height) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt index 687295026..f8aad5695 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt @@ -13,7 +13,7 @@ import com.facebook.flipper.plugins.uidebugger.common.BitmapPool import com.facebook.flipper.plugins.uidebugger.core.Context import com.facebook.flipper.plugins.uidebugger.descriptors.Id import com.facebook.flipper.plugins.uidebugger.descriptors.NodeDescriptor -import com.facebook.flipper.plugins.uidebugger.descriptors.nodeId +import com.facebook.flipper.plugins.uidebugger.util.objectIdentity /* * Represents a stateful observer that manages some subtree in the UI Hierarchy. @@ -49,19 +49,19 @@ abstract class TreeObserver { // Add any new observers observableRoots.forEach { observable -> - if (!children.containsKey(observable.nodeId())) { + if (!children.containsKey(observable.objectIdentity())) { context.observerFactory.createObserver(observable, context)?.let { observer -> Log.d( LogTag, - "Observer ${this.type} discovered new child of type ${observer.type} Node ID ${observable.nodeId()}") + "Observer ${this.type} discovered new child of type ${observer.type} Node ID ${observable.objectIdentity()}") observer.subscribe(observable) - children[observable.nodeId()] = observer + children[observable.objectIdentity()] = observer } } } // Remove any old observers - val observableRootsIdentifiers = observableRoots.map { it.nodeId() } + val observableRootsIdentifiers = observableRoots.map { it.objectIdentity() } val removables = mutableListOf() children.keys.forEach { key -> if (!observableRootsIdentifiers.contains(key)) { @@ -92,7 +92,7 @@ abstract class TreeObserver { context.treeObserverManager.enqueueUpdate( SubtreeUpdate( type, - root.nodeId(), + root.objectIdentity(), visitedNodes, startTimestamp, traversalCompleteTime, diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt index 3626c4d12..26fd41dfc 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt @@ -12,7 +12,6 @@ import com.facebook.flipper.plugins.uidebugger.LogTag import com.facebook.flipper.plugins.uidebugger.descriptors.DescriptorRegister import com.facebook.flipper.plugins.uidebugger.descriptors.Id import com.facebook.flipper.plugins.uidebugger.descriptors.NodeDescriptor -import com.facebook.flipper.plugins.uidebugger.descriptors.nodeId import com.facebook.flipper.plugins.uidebugger.model.Node import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory @@ -55,7 +54,7 @@ class PartialLayoutTraversal( if (shallow.contains(node)) { visited.add( Node( - node.nodeId(), + descriptor.getId(node), descriptor.getQualifiedName(node), descriptor.getName(node), emptyMap(), @@ -71,14 +70,18 @@ class PartialLayoutTraversal( val children = descriptor.getChildren(node) val activeChild = descriptor.getActiveChild(node) + var activeChildId: Id? = null if (activeChild != null) { - activeChildId = activeChild.nodeId() + val activeChildDescriptor = + descriptorRegister.descriptorForClassUnsafe(activeChild.javaClass) + activeChildId = activeChildDescriptor.getId(activeChild) } val childrenIds = mutableListOf() children.forEach { child -> - childrenIds.add(child.nodeId()) + val childDescriptor = descriptorRegister.descriptorForClassUnsafe(child.javaClass) + childrenIds.add(childDescriptor.getId(child)) stack.add(child) // If there is an active child then don't traverse it if (activeChild != null && activeChild != child) { @@ -91,7 +94,7 @@ class PartialLayoutTraversal( val tags = descriptor.getTags(node) visited.add( Node( - node.nodeId(), + descriptor.getId(node), descriptor.getQualifiedName(node), descriptor.getName(node), attributes, diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/ObjectIdentity.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/ObjectIdentity.kt new file mode 100644 index 000000000..5961a34c0 --- /dev/null +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/ObjectIdentity.kt @@ -0,0 +1,12 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.flipper.plugins.uidebugger.util + +fun Any.objectIdentity(): Int { + return System.identityHashCode(this) +} From 0ac8c2a6b3348797b070285bd27a78f64cef9fc1 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Thu, 17 Nov 2022 04:42:22 -0800 Subject: [PATCH 0300/1651] Migrate enum possible values to metadata Summary: Before this change, possible values for an enumeration were embedded within the attribute value itself. After this change, possible values are located within the attribute metadata. Reviewed By: LukeDefeo Differential Revision: D41337003 fbshipit-source-id: cef5654a679e9b961e82993abb201b518fcbcd00 --- .../props/ComponentPropExtractor.kt | 68 +++-- .../descriptors/props/LayoutPropExtractor.kt | 80 ++++-- .../plugins/uidebugger/common/EnumMapping.kt | 31 ++- .../descriptors/ImageViewDescriptor.kt | 23 +- .../descriptors/MetadataRegister.kt | 16 +- .../uidebugger/descriptors/ViewDescriptor.kt | 259 ++++++++++-------- .../descriptors/ViewGroupDescriptor.kt | 25 +- .../plugins/uidebugger/model/Metadata.kt | 1 + .../flipper/plugins/uidebugger/model/Types.kt | 3 +- .../plugins/uidebugger/EnumMappingTest.kt | 3 +- 10 files changed, 312 insertions(+), 197 deletions(-) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt index 48160e2ec..421210d55 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt @@ -39,13 +39,6 @@ object ComponentPropExtractor { declaredField.isAccessible = true val name = declaredField.name - - val metadata = MetadataRegister.get(component.simpleName, name) - val identifier = - metadata?.id - ?: MetadataRegister.registerDynamic( - MetadataRegister.TYPE_ATTRIBUTE, component.simpleName, name) - val declaredFieldAnnotation = declaredField.getAnnotation(Prop::class.java) // Only expose `@Prop` annotated fields for Spec components @@ -64,10 +57,12 @@ object ComponentPropExtractor { val resType = declaredFieldAnnotation.resType if (resType == ResType.COLOR) { if (prop != null) { + val identifier = getMetadataId(component.simpleName, name) props[identifier] = InspectableValue.Color(Color.fromColor(prop as Int)) } continue } else if (resType == ResType.DRAWABLE) { + val identifier = getMetadataId(component.simpleName, name) props[identifier] = fromDrawable(prop as Drawable?) continue } @@ -77,18 +72,42 @@ object ComponentPropExtractor { EditorRegistry.read(declaredField.type, declaredField, component) if (editorValue != null) { - props[identifier] = toInspectable(name, editorValue) + addProp(props, component.simpleName, name, editorValue) } } return props } - private fun fromDrawable(d: Drawable?): Inspectable = - when (d) { - is ColorDrawable -> InspectableValue.Color(Color.fromColor(d.color)) - else -> InspectableValue.Unknown(d.toString()) - } + private fun getMetadataId( + namespace: String, + key: String, + mutable: Boolean = false, + possibleValues: Set? = emptySet() + ): MetadataId { + val metadata = MetadataRegister.get(namespace, key) + val identifier = + metadata?.id + ?: MetadataRegister.registerDynamic( + MetadataRegister.TYPE_ATTRIBUTE, namespace, key, mutable, possibleValues) + return identifier + } + + private fun addProp( + props: MutableMap, + namespace: String, + name: String, + value: EditorValue + ) { + var possibleValues: MutableSet? = null + if (value is EditorPick) { + possibleValues = mutableSetOf() + value.values.forEach { possibleValues.add(InspectableValue.Text(it)) } + } + + val identifier = getMetadataId(namespace, name, false, possibleValues) + props[identifier] = toInspectable(name, value) + } private fun toInspectable(name: String, editorValue: EditorValue): Inspectable { return editorValue.`when`( @@ -97,13 +116,16 @@ object ComponentPropExtractor { val fields = mutableMapOf() shape.value.entries.forEach { entry -> - val metadata = MetadataRegister.get(name, entry.key) - val identifier = - metadata?.id - ?: MetadataRegister.registerDynamic( - MetadataRegister.TYPE_LAYOUT, name, entry.key) - val value = toInspectable(entry.key, entry.value) + + val shapeEditorValue = entry.value + var possibleValues: MutableSet? = null + if (shapeEditorValue is EditorPick) { + possibleValues = mutableSetOf() + shapeEditorValue.values.forEach { possibleValues.add(InspectableValue.Text(it)) } + } + + val identifier = getMetadataId(name, entry.key, false, possibleValues) fields[identifier] = value } @@ -116,7 +138,7 @@ object ComponentPropExtractor { } override fun isPick(pick: EditorPick?): Inspectable = - InspectableValue.Enum(Enumeration(pick?.values ?: setOf(), pick?.selected)) + InspectableValue.Enum(Enumeration(pick?.selected)) override fun isNumber(number: EditorNumber): Inspectable = InspectableValue.Number(number.value) @@ -130,4 +152,10 @@ object ComponentPropExtractor { override fun isBool(bool: EditorBool): Inspectable = InspectableValue.Boolean(bool.value) }) } + + private fun fromDrawable(d: Drawable?): Inspectable = + when (d) { + is ColorDrawable -> InspectableValue.Color(Color.fromColor(d.color)) + else -> InspectableValue.Unknown(d.toString()) + } } diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt index 936b4d8cb..4c30f6663 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt @@ -9,6 +9,7 @@ package com.facebook.flipper.plugins.uidebugger.litho.descriptors.props import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable +import com.facebook.flipper.plugins.uidebugger.common.enumToInspectableSet import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister import com.facebook.flipper.plugins.uidebugger.model.* import com.facebook.litho.DebugComponent @@ -23,19 +24,54 @@ object LayoutPropExtractor { MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "foreground") private val DirectionId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "direction") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "direction", + false, + enumToInspectableSet()) private val FlexDirectionId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "flexDirection") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "flexDirection", + false, + enumToInspectableSet()) private val JustifyContentId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "justifyContent") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "justifyContent", + false, + enumToInspectableSet()) private val AlignItemsId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignItems") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "alignItems", + false, + enumToInspectableSet()) private val AlignSelfId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignSelf") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "alignSelf", + false, + enumToInspectableSet()) private val AlignContentId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignContent") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "alignContent", + false, + enumToInspectableSet()) private val PositionTypeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "positionType") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "positionType", + false, + enumToInspectableSet()) private val FlexGrowId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "flexGrow") @@ -94,22 +130,14 @@ object LayoutPropExtractor { layout.background?.let { drawable -> props[BackgroundId] = fromDrawable(drawable) } layout.foreground?.let { drawable -> props[ForegroundId] = fromDrawable(drawable) } - props[DirectionId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.layoutDirection.name)) + props[DirectionId] = InspectableValue.Enum(Enumeration(layout.layoutDirection.name)) - props[FlexDirectionId] = - InspectableValue.Enum( - Enumeration(enumToSet(), layout.flexDirection.name)) - props[JustifyContentId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.justifyContent.name)) - props[AlignItemsId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.alignItems.name)) - props[AlignSelfId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.alignSelf.name)) - props[AlignContentId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.alignContent.name)) - props[PositionTypeId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.positionType.name)) + props[FlexDirectionId] = InspectableValue.Enum(Enumeration(layout.flexDirection.name)) + props[JustifyContentId] = InspectableValue.Enum(Enumeration(layout.justifyContent.name)) + props[AlignItemsId] = InspectableValue.Enum(Enumeration(layout.alignItems.name)) + props[AlignSelfId] = InspectableValue.Enum(Enumeration(layout.alignSelf.name)) + props[AlignContentId] = InspectableValue.Enum(Enumeration(layout.alignContent.name)) + props[PositionTypeId] = InspectableValue.Enum(Enumeration(layout.positionType.name)) props[FlexGrowId] = InspectableValue.Text(layout.flexGrow.toString()) props[FlexShrinkId] = InspectableValue.Text(layout.flexShrink.toString()) @@ -199,12 +227,4 @@ object LayoutPropExtractor { is ColorDrawable -> InspectableValue.Color(Color.fromColor(d.color)) else -> InspectableValue.Unknown(d.toString()) } - - private inline fun > enumerator(): Iterator = enumValues().iterator() - private inline fun > enumToSet(): Set { - val set = mutableSetOf() - val values = enumerator() - values.forEach { set.add(it.name) } - return set - } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt index bb191b175..a6e1666aa 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt @@ -33,10 +33,39 @@ open class EnumMapping(private val mapping: Map) { "Could not convert string $key to enum value, possible values ${mapping.entries} ") } + fun getInspectableValues(): Set { + val set: MutableSet = mutableSetOf() + mapping.entries.forEach { set.add(InspectableValue.Text(it.key)) } + return set + } + fun toInspectable(value: T): InspectableValue.Enum { - return InspectableValue.Enum(Enumeration(mapping.keys, getStringRepresentation(value))) + return InspectableValue.Enum(Enumeration(getStringRepresentation(value))) } companion object { const val NoMapping = "__UNKNOWN_ENUM_VALUE__" } } + +inline fun > enumerator(): Iterator = enumValues().iterator() + +inline fun > enumToSet(): Set { + val set = mutableSetOf() + val values = enumerator() + values.forEach { set.add(it.name) } + return set +} + +inline fun > enumToInspectableSet(): Set { + val set = mutableSetOf() + val values = enumerator() + values.forEach { set.add(InspectableValue.Text(it.name)) } + return set +} + +inline fun > enumMapping(): EnumMapping { + val map = mutableMapOf() + val values = enumerator() + values.forEach { map[it.name] = it } + return EnumMapping(map) +} diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt index 0d968df7a..475041910 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt @@ -10,6 +10,8 @@ package com.facebook.flipper.plugins.uidebugger.descriptors import android.widget.ImageView import android.widget.ImageView.ScaleType import com.facebook.flipper.plugins.uidebugger.common.EnumMapping +import com.facebook.flipper.plugins.uidebugger.common.enumMapping +import com.facebook.flipper.plugins.uidebugger.common.enumToInspectableSet import com.facebook.flipper.plugins.uidebugger.model.Inspectable import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.MetadataId @@ -21,7 +23,12 @@ object ImageViewDescriptor : ChainedDescriptor() { private var SectionId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) private var ScaleTypeAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "scaleType") + MetadataRegister.register( + MetadataRegister.TYPE_ATTRIBUTE, + NAMESPACE, + "scaleType", + false, + enumToInspectableSet()) override fun onGetName(node: ImageView): String = node.javaClass.simpleName @@ -35,17 +42,5 @@ object ImageViewDescriptor : ChainedDescriptor() { attributeSections[SectionId] = InspectableObject(props) } - private val scaleTypeMapping: EnumMapping = - object : - EnumMapping( - mapOf( - "CENTER" to ScaleType.CENTER, - "CENTER_CROP" to ScaleType.CENTER_CROP, - "CENTER_INSIDE" to ScaleType.CENTER_INSIDE, - "FIT_CENTER" to ScaleType.FIT_CENTER, - "FIT_END" to ScaleType.FIT_END, - "FIT_START" to ScaleType.FIT_START, - "FIT_XY" to ScaleType.FIT_XY, - "MATRIX" to ScaleType.MATRIX, - )) {} + private val scaleTypeMapping: EnumMapping = enumMapping() } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt index fd80ad99c..5282d28c4 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt @@ -7,6 +7,7 @@ package com.facebook.flipper.plugins.uidebugger.descriptors +import com.facebook.flipper.plugins.uidebugger.model.InspectableValue import com.facebook.flipper.plugins.uidebugger.model.Metadata import com.facebook.flipper.plugins.uidebugger.model.MetadataId @@ -34,7 +35,8 @@ object MetadataRegister { type: String, namespace: String, name: String, - mutable: Boolean + mutable: Boolean, + possibleValues: Set? ): MetadataId { val key = key(namespace, name) metadata[key]?.let { m -> @@ -42,7 +44,7 @@ object MetadataRegister { } val identifier = ++generator - metadata[key] = Metadata(identifier, type, namespace, name, mutable) + metadata[key] = Metadata(identifier, type, namespace, name, mutable, possibleValues) return identifier } @@ -50,18 +52,20 @@ object MetadataRegister { type: String, namespace: String, name: String, - mutable: Boolean = false + mutable: Boolean = false, + possibleValues: Set? = emptySet() ): MetadataId { - return register(staticMetadata, type, namespace, name, mutable) + return register(staticMetadata, type, namespace, name, mutable, possibleValues) } fun registerDynamic( type: String, namespace: String, name: String, - mutable: Boolean = false + mutable: Boolean = false, + possibleValues: Set? = emptySet() ): MetadataId { - return register(dynamicMetadata, type, namespace, name, mutable) + return register(dynamicMetadata, type, namespace, name, mutable, possibleValues) } fun get(namespace: String, name: String): Metadata? { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt index db44c039f..4d9fb81c6 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt @@ -29,6 +29,111 @@ import java.lang.reflect.Field object ViewDescriptor : ChainedDescriptor() { + private val LayoutParamsMapping: EnumMapping = + object : + EnumMapping( + mapOf( + "WRAP_CONTENT" to ViewGroup.LayoutParams.WRAP_CONTENT, + "MATCH_PARENT" to ViewGroup.LayoutParams.MATCH_PARENT, + "FILL_PARENT" to ViewGroup.LayoutParams.FILL_PARENT, + )) {} + + private val VisibilityMapping: EnumMapping = + object : + EnumMapping( + mapOf( + "VISIBLE" to View.VISIBLE, + "INVISIBLE" to View.INVISIBLE, + "GONE" to View.GONE, + )) {} + + private val LayoutDirectionMapping: EnumMapping = + when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { + object : + EnumMapping( + mapOf( + "LAYOUT_DIRECTION_INHERIT" to View.LAYOUT_DIRECTION_INHERIT, + "LAYOUT_DIRECTION_LOCALE" to View.LAYOUT_DIRECTION_LOCALE, + "LAYOUT_DIRECTION_LTR" to View.LAYOUT_DIRECTION_LTR, + "LAYOUT_DIRECTION_RTL" to View.LAYOUT_DIRECTION_RTL, + )) {} + } + else -> { + object : EnumMapping(emptyMap()) {} + } + } + + private val TextDirectionMapping: EnumMapping = + when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { + object : + EnumMapping( + mapOf( + "TEXT_DIRECTION_INHERIT" to View.TEXT_DIRECTION_INHERIT, + "TEXT_DIRECTION_FIRST_STRONG" to View.TEXT_DIRECTION_FIRST_STRONG, + "TEXT_DIRECTION_ANY_RTL" to View.TEXT_DIRECTION_ANY_RTL, + "TEXT_DIRECTION_LTR" to View.TEXT_DIRECTION_LTR, + "TEXT_DIRECTION_RTL" to View.TEXT_DIRECTION_RTL, + "TEXT_DIRECTION_LOCALE" to View.TEXT_DIRECTION_LOCALE, + )) {} + } + Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> { + object : + EnumMapping( + mapOf( + "TEXT_DIRECTION_INHERIT" to View.TEXT_DIRECTION_INHERIT, + "TEXT_DIRECTION_FIRST_STRONG" to View.TEXT_DIRECTION_FIRST_STRONG, + "TEXT_DIRECTION_ANY_RTL" to View.TEXT_DIRECTION_ANY_RTL, + "TEXT_DIRECTION_LTR" to View.TEXT_DIRECTION_LTR, + "TEXT_DIRECTION_RTL" to View.TEXT_DIRECTION_RTL, + "TEXT_DIRECTION_LOCALE" to View.TEXT_DIRECTION_LOCALE, + "TEXT_DIRECTION_FIRST_STRONG_LTR" to View.TEXT_DIRECTION_FIRST_STRONG_LTR, + "TEXT_DIRECTION_FIRST_STRONG_RTL" to View.TEXT_DIRECTION_FIRST_STRONG_RTL, + )) {} + } + else -> { + object : EnumMapping(emptyMap()) {} + } + } + + private val TextAlignmentMapping: EnumMapping = + when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { + object : + EnumMapping( + mapOf( + "TEXT_ALIGNMENT_INHERIT" to View.TEXT_ALIGNMENT_INHERIT, + "TEXT_ALIGNMENT_GRAVITY" to View.TEXT_ALIGNMENT_GRAVITY, + "TEXT_ALIGNMENT_TEXT_START" to View.TEXT_ALIGNMENT_TEXT_START, + "TEXT_ALIGNMENT_TEXT_END" to View.TEXT_ALIGNMENT_TEXT_END, + "TEXT_ALIGNMENT_CENTER" to View.TEXT_ALIGNMENT_CENTER, + "TEXT_ALIGNMENT_VIEW_START" to View.TEXT_ALIGNMENT_VIEW_START, + "TEXT_ALIGNMENT_VIEW_END" to View.TEXT_ALIGNMENT_VIEW_END, + )) {} + } + else -> { + object : EnumMapping(emptyMap()) {} + } + } + + private val GravityMapping = + object : + EnumMapping( + mapOf( + "NONE" to -1, + "NO_GRAVITY" to Gravity.NO_GRAVITY, + "LEFT" to Gravity.LEFT, + "TOP" to Gravity.TOP, + "RIGHT" to Gravity.RIGHT, + "BOTTOM" to Gravity.BOTTOM, + "CENTER" to Gravity.CENTER, + "CENTER_VERTICAL" to Gravity.CENTER_VERTICAL, + "FILL_VERTICAL" to Gravity.FILL_VERTICAL, + "CENTER_HORIZONTAL" to Gravity.CENTER_HORIZONTAL, + "FILL_HORIZONTAL" to Gravity.FILL_HORIZONTAL, + )) {} + private const val NAMESPACE = "View" private var SectionId = @@ -54,13 +159,23 @@ object ViewDescriptor : ChainedDescriptor() { private val LayoutParamsAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutParams") private val LayoutDirectionAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutDirection") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "layoutDirection", + false, + LayoutDirectionMapping.getInspectableValues()) private val TranslationAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "translation") private val ElevationAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "elevation") private val VisibilityAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "visibility") + MetadataRegister.register( + MetadataRegister.TYPE_ATTRIBUTE, + NAMESPACE, + "visibility", + false, + VisibilityMapping.getInspectableValues()) private val BackgroundAttributeId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "background") @@ -82,9 +197,19 @@ object ViewDescriptor : ChainedDescriptor() { MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "selected") private val TextDirectionAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "textDirection") + MetadataRegister.register( + MetadataRegister.TYPE_ATTRIBUTE, + NAMESPACE, + "textDirection", + false, + TextDirectionMapping.getInspectableValues()) private val TextAlignmentAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "textAlignment") + MetadataRegister.register( + MetadataRegister.TYPE_ATTRIBUTE, + NAMESPACE, + "textAlignment", + false, + TextAlignmentMapping.getInspectableValues()) private val TagAttributeId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "tag") @@ -92,16 +217,31 @@ object ViewDescriptor : ChainedDescriptor() { MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "keyedTags") private val WidthAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "width") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "width", + false, + LayoutParamsMapping.getInspectableValues()) private val HeightAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "height") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "height", + false, + LayoutParamsMapping.getInspectableValues()) private val MarginAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "margin") private val WeightAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "weight") private val GravityAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "gravity") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "gravity", + false, + GravityMapping.getInspectableValues()) override fun onGetName(node: View): String = node.javaClass.simpleName @@ -310,111 +450,6 @@ object ViewDescriptor : ChainedDescriptor() { return tags } - private val LayoutParamsMapping: EnumMapping = - object : - EnumMapping( - mapOf( - "WRAP_CONTENT" to ViewGroup.LayoutParams.WRAP_CONTENT, - "MATCH_PARENT" to ViewGroup.LayoutParams.MATCH_PARENT, - "FILL_PARENT" to ViewGroup.LayoutParams.FILL_PARENT, - )) {} - - private val VisibilityMapping: EnumMapping = - object : - EnumMapping( - mapOf( - "VISIBLE" to View.VISIBLE, - "INVISIBLE" to View.INVISIBLE, - "GONE" to View.GONE, - )) {} - - private val LayoutDirectionMapping: EnumMapping = - when { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { - object : - EnumMapping( - mapOf( - "LAYOUT_DIRECTION_INHERIT" to View.LAYOUT_DIRECTION_INHERIT, - "LAYOUT_DIRECTION_LOCALE" to View.LAYOUT_DIRECTION_LOCALE, - "LAYOUT_DIRECTION_LTR" to View.LAYOUT_DIRECTION_LTR, - "LAYOUT_DIRECTION_RTL" to View.LAYOUT_DIRECTION_RTL, - )) {} - } - else -> { - object : EnumMapping(emptyMap()) {} - } - } - - private val TextDirectionMapping: EnumMapping = - when { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { - object : - EnumMapping( - mapOf( - "TEXT_DIRECTION_INHERIT" to View.TEXT_DIRECTION_INHERIT, - "TEXT_DIRECTION_FIRST_STRONG" to View.TEXT_DIRECTION_FIRST_STRONG, - "TEXT_DIRECTION_ANY_RTL" to View.TEXT_DIRECTION_ANY_RTL, - "TEXT_DIRECTION_LTR" to View.TEXT_DIRECTION_LTR, - "TEXT_DIRECTION_RTL" to View.TEXT_DIRECTION_RTL, - "TEXT_DIRECTION_LOCALE" to View.TEXT_DIRECTION_LOCALE, - )) {} - } - Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> { - object : - EnumMapping( - mapOf( - "TEXT_DIRECTION_INHERIT" to View.TEXT_DIRECTION_INHERIT, - "TEXT_DIRECTION_FIRST_STRONG" to View.TEXT_DIRECTION_FIRST_STRONG, - "TEXT_DIRECTION_ANY_RTL" to View.TEXT_DIRECTION_ANY_RTL, - "TEXT_DIRECTION_LTR" to View.TEXT_DIRECTION_LTR, - "TEXT_DIRECTION_RTL" to View.TEXT_DIRECTION_RTL, - "TEXT_DIRECTION_LOCALE" to View.TEXT_DIRECTION_LOCALE, - "TEXT_DIRECTION_FIRST_STRONG_LTR" to View.TEXT_DIRECTION_FIRST_STRONG_LTR, - "TEXT_DIRECTION_FIRST_STRONG_RTL" to View.TEXT_DIRECTION_FIRST_STRONG_RTL, - )) {} - } - else -> { - object : EnumMapping(emptyMap()) {} - } - } - - private val TextAlignmentMapping: EnumMapping = - when { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { - object : - EnumMapping( - mapOf( - "TEXT_ALIGNMENT_INHERIT" to View.TEXT_ALIGNMENT_INHERIT, - "TEXT_ALIGNMENT_GRAVITY" to View.TEXT_ALIGNMENT_GRAVITY, - "TEXT_ALIGNMENT_TEXT_START" to View.TEXT_ALIGNMENT_TEXT_START, - "TEXT_ALIGNMENT_TEXT_END" to View.TEXT_ALIGNMENT_TEXT_END, - "TEXT_ALIGNMENT_CENTER" to View.TEXT_ALIGNMENT_CENTER, - "TEXT_ALIGNMENT_VIEW_START" to View.TEXT_ALIGNMENT_VIEW_START, - "TEXT_ALIGNMENT_VIEW_END" to View.TEXT_ALIGNMENT_VIEW_END, - )) {} - } - else -> { - object : EnumMapping(emptyMap()) {} - } - } - - private val GravityMapping = - object : - EnumMapping( - mapOf( - "NONE" to -1, - "NO_GRAVITY" to Gravity.NO_GRAVITY, - "LEFT" to Gravity.LEFT, - "TOP" to Gravity.TOP, - "RIGHT" to Gravity.RIGHT, - "BOTTOM" to Gravity.BOTTOM, - "CENTER" to Gravity.CENTER, - "CENTER_VERTICAL" to Gravity.CENTER_VERTICAL, - "FILL_VERTICAL" to Gravity.FILL_VERTICAL, - "CENTER_HORIZONTAL" to Gravity.CENTER_HORIZONTAL, - "FILL_HORIZONTAL" to Gravity.FILL_HORIZONTAL, - )) {} - private var KeyedTagsField: Field? = null private var ListenerInfoField: Field? = null private var OnClickListenerField: Field? = null diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt index 97ee6db19..7e6bee089 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt @@ -17,6 +17,14 @@ import com.facebook.flipper.plugins.uidebugger.model.* object ViewGroupDescriptor : ChainedDescriptor() { + private val LayoutModeMapping: EnumMapping = + object : + EnumMapping( + mapOf( + "LAYOUT_MODE_CLIP_BOUNDS" to ViewGroupCompat.LAYOUT_MODE_CLIP_BOUNDS, + "LAYOUT_MODE_OPTICAL_BOUNDS" to ViewGroupCompat.LAYOUT_MODE_OPTICAL_BOUNDS, + )) {} + private const val NAMESPACE = "ViewGroup" private var SectionId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) @@ -41,9 +49,14 @@ object ViewGroupDescriptor : ChainedDescriptor() { } private val LayoutModeAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutMode") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "layoutMode", + false, + LayoutModeMapping.getInspectableValues()) private val ClipChildrenAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutMode") + MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "clipChildren") private val ClipToPaddingAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "clipToPadding") @@ -63,12 +76,4 @@ object ViewGroupDescriptor : ChainedDescriptor() { attributeSections[SectionId] = InspectableObject(props) } - - private val LayoutModeMapping: EnumMapping = - object : - EnumMapping( - mapOf( - "LAYOUT_MODE_CLIP_BOUNDS" to ViewGroupCompat.LAYOUT_MODE_CLIP_BOUNDS, - "LAYOUT_MODE_OPTICAL_BOUNDS" to ViewGroupCompat.LAYOUT_MODE_OPTICAL_BOUNDS, - )) {} } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Metadata.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Metadata.kt index 58716453f..b77db7c26 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Metadata.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Metadata.kt @@ -21,5 +21,6 @@ data class Metadata( val namespace: String, val name: String, val mutable: kotlin.Boolean, + val possibleValues: Set? = emptySet(), val tags: List? = emptyList() ) {} diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt index 89eaa47f1..03edf021e 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt @@ -63,5 +63,4 @@ data class Size( @Serializable(with = NumberSerializer::class) val height: Number ) {} -@kotlinx.serialization.Serializable -data class Enumeration(val values: Set, val value: String?) +@kotlinx.serialization.Serializable data class Enumeration(val value: String?) diff --git a/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt b/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt index 770932633..115cf36ae 100644 --- a/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt +++ b/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt @@ -39,7 +39,6 @@ class EnumMappingTest { @Test fun testTurnsIntoEnumInspectable() { assertThat( - visibility.toInspectable(View.GONE), - equalTo(InspectableValue.Enum(Enumeration(setOf("VISIBLE", "INVISIBLE", "GONE"), "GONE")))) + visibility.toInspectable(View.GONE), equalTo(InspectableValue.Enum(Enumeration("GONE")))) } } From f1cbe7ed79f50f522552055f706f3ea7a835e74f Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Thu, 17 Nov 2022 05:32:02 -0800 Subject: [PATCH 0301/1651] Fix millisecond display for date formatting Summary: If we have a milliseconds portion of a date that's <100, we'd fill in zeroes in a symmetrical way (around the value) rather than filling in at the front, which led to some confusion. Reviewed By: mweststrate Differential Revision: D41342194 fbshipit-source-id: a8f60110dcad8bfa77b81abed88df0b0643c780e --- desktop/flipper-plugin/src/ui/DataFormatter.tsx | 4 ++-- .../flipper-plugin/src/ui/__tests__/DataFormatter.node.tsx | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/desktop/flipper-plugin/src/ui/DataFormatter.tsx b/desktop/flipper-plugin/src/ui/DataFormatter.tsx index 5a087a5e8..41b0abd61 100644 --- a/desktop/flipper-plugin/src/ui/DataFormatter.tsx +++ b/desktop/flipper-plugin/src/ui/DataFormatter.tsx @@ -13,7 +13,7 @@ import { CopyOutlined, } from '@ant-design/icons'; import {Button, Typography} from 'antd'; -import {isPlainObject, pad} from 'lodash'; +import {isPlainObject, padStart} from 'lodash'; import React, {createElement, Fragment, isValidElement, useState} from 'react'; import {_tryGetFlipperLibImplementation} from 'flipper-plugin-core'; import {safeStringify} from 'flipper-plugin-core'; @@ -57,7 +57,7 @@ export const DataFormatter = { res = value.toTimeString().split(' ')[0] + '.' + - pad('' + value.getMilliseconds(), 3, '0'); + padStart('' + value.getMilliseconds(), 3, '0'); break; } if (value instanceof Map) { diff --git a/desktop/flipper-plugin/src/ui/__tests__/DataFormatter.node.tsx b/desktop/flipper-plugin/src/ui/__tests__/DataFormatter.node.tsx index 5fc1818d5..97f57f229 100644 --- a/desktop/flipper-plugin/src/ui/__tests__/DataFormatter.node.tsx +++ b/desktop/flipper-plugin/src/ui/__tests__/DataFormatter.node.tsx @@ -21,6 +21,9 @@ test('default formatter', () => { expect( DataFormatter.format(new Date(2020, 2, 3, 5, 8, 4, 244654)), ).toMatchInlineSnapshot(`"05:12:08.654"`); + expect( + DataFormatter.format(new Date(1668609938.068577 * 1000)), + ).toMatchInlineSnapshot(`"01:45:38.068"`); expect(DataFormatter.format('test')).toMatchInlineSnapshot(`"test"`); expect(DataFormatter.format({hello: 'world'})).toMatchInlineSnapshot(` From 6268c7b45561c0791ef9f3eda93c4ec5423c5f21 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Fri, 18 Nov 2022 02:34:33 -0800 Subject: [PATCH 0302/1651] Litho margins Summary: Litho margins/padding/borders have the following attributes: - left, top, right, bottom - horizontal, vertical - all - start, end This change processes these attributes and creates a SpaceBox inspectable which enables the margin visualiser in Flipper Desktop. Reviewed By: LukeDefeo Differential Revision: D41375299 fbshipit-source-id: be8bac1819f2b17c2fd1b1b86678aa0559278609 --- .../descriptors/props/LayoutPropExtractor.kt | 347 ++++++++++++++---- 1 file changed, 272 insertions(+), 75 deletions(-) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt index 4c30f6663..fa4a256e9 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt @@ -122,102 +122,299 @@ object LayoutPropExtractor { private val RotationId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "rotation") + private val EmptyId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "") + private val NoneId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "none") + private val SizeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "size") + private val ViewOutputId = + MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "viewOutput") + + fun getInspectableBox( + left: YogaValue?, + top: YogaValue?, + right: YogaValue?, + bottom: YogaValue?, + horizontal: YogaValue?, + vertical: YogaValue?, + all: YogaValue?, + start: YogaValue?, + end: YogaValue? + ): InspectableObject { + val props = mutableMapOf() + + var actualLeft = 0 + var actualTop = 0 + var actualRight = 0 + var actualBottom = 0 + + all?.let { yogaValue -> + if (yogaValue.unit != YogaUnit.UNDEFINED) { + if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { + val intValue = yogaValue.value.toInt() + actualLeft = intValue + actualTop = intValue + actualRight = intValue + actualBottom = intValue + } + + props[AllId] = InspectableValue.Text(yogaValue.toString()) + } + } + + horizontal?.let { yogaValue -> + if (yogaValue.unit != YogaUnit.UNDEFINED) { + if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { + val intValue = yogaValue.value.toInt() + actualLeft = intValue + actualRight = intValue + } + + props[HorizontalId] = InspectableValue.Text(yogaValue.toString()) + } + } + + vertical?.let { yogaValue -> + if (yogaValue.unit != YogaUnit.UNDEFINED) { + if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { + val intValue = yogaValue.value.toInt() + actualTop = intValue + actualBottom = intValue + } + + props[VerticalId] = InspectableValue.Text(yogaValue.toString()) + } + } + + left?.let { yogaValue -> + if (yogaValue.unit != YogaUnit.UNDEFINED) { + if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { + val intValue = yogaValue.value.toInt() + actualLeft = intValue + } + + props[LeftId] = InspectableValue.Text(yogaValue.toString()) + } + } + + right?.let { yogaValue -> + if (yogaValue.unit != YogaUnit.UNDEFINED) { + if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { + val intValue = yogaValue.value.toInt() + actualRight = intValue + } + + props[RightId] = InspectableValue.Text(yogaValue.toString()) + } + } + + top?.let { yogaValue -> + if (yogaValue.unit != YogaUnit.UNDEFINED) { + if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { + val intValue = yogaValue.value.toInt() + actualTop = intValue + } + + props[TopId] = InspectableValue.Text(yogaValue.toString()) + } + } + + bottom?.let { yogaValue -> + if (yogaValue.unit != YogaUnit.UNDEFINED) { + if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { + val intValue = yogaValue.value.toInt() + actualBottom = intValue + } + + props[BottomId] = InspectableValue.Text(yogaValue.toString()) + } + } + + props[EmptyId] = + InspectableValue.SpaceBox(SpaceBox(actualTop, actualRight, actualBottom, actualLeft)) + + return InspectableObject(props) + } + + fun getInspectableBoxRaw( + left: Float?, + top: Float?, + right: Float?, + bottom: Float?, + horizontal: Float?, + vertical: Float?, + all: Float?, + start: Float?, + end: Float? + ): InspectableObject { + val props = mutableMapOf() + + var actualLeft = 0 + var actualTop = 0 + var actualRight = 0 + var actualBottom = 0 + + all?.let { value -> + if (!value.isNaN()) { + val intValue = value.toInt() + actualLeft = intValue + actualTop = intValue + actualRight = intValue + actualBottom = intValue + props[AllId] = InspectableValue.Number(value) + } + } + + horizontal?.let { value -> + if (!value.isNaN()) { + val intValue = value.toInt() + actualLeft = intValue + actualRight = intValue + props[HorizontalId] = InspectableValue.Number(value) + } + } + + vertical?.let { value -> + if (!value.isNaN()) { + val intValue = value.toInt() + actualTop = intValue + actualBottom = intValue + props[VerticalId] = InspectableValue.Number(value) + } + } + + left?.let { value -> + if (!value.isNaN()) { + val intValue = value.toInt() + actualLeft = intValue + props[LeftId] = InspectableValue.Number(value) + } + } + + right?.let { value -> + if (!value.isNaN()) { + val intValue = value.toInt() + actualRight = intValue + props[RightId] = InspectableValue.Number(value) + } + } + + top?.let { value -> + if (!value.isNaN()) { + val intValue = value.toInt() + actualTop = intValue + props[TopId] = InspectableValue.Number(value) + } + } + + bottom?.let { value -> + if (!value.isNaN()) { + val intValue = value.toInt() + actualBottom = intValue + props[BottomId] = InspectableValue.Number(value) + } + } + + props[EmptyId] = + InspectableValue.SpaceBox(SpaceBox(actualTop, actualRight, actualBottom, actualLeft)) + + return InspectableObject(props) + } + fun getProps(component: DebugComponent): Map { val props = mutableMapOf() val layout = component.layoutNode ?: return props - layout.background?.let { drawable -> props[BackgroundId] = fromDrawable(drawable) } - layout.foreground?.let { drawable -> props[ForegroundId] = fromDrawable(drawable) } - - props[DirectionId] = InspectableValue.Enum(Enumeration(layout.layoutDirection.name)) - - props[FlexDirectionId] = InspectableValue.Enum(Enumeration(layout.flexDirection.name)) - props[JustifyContentId] = InspectableValue.Enum(Enumeration(layout.justifyContent.name)) props[AlignItemsId] = InspectableValue.Enum(Enumeration(layout.alignItems.name)) props[AlignSelfId] = InspectableValue.Enum(Enumeration(layout.alignSelf.name)) props[AlignContentId] = InspectableValue.Enum(Enumeration(layout.alignContent.name)) - props[PositionTypeId] = InspectableValue.Enum(Enumeration(layout.positionType.name)) - - props[FlexGrowId] = InspectableValue.Text(layout.flexGrow.toString()) - props[FlexShrinkId] = InspectableValue.Text(layout.flexShrink.toString()) - props[FlexBasisId] = InspectableValue.Text(layout.flexBasis.toString()) - - props[WidthId] = InspectableValue.Text(layout.width.toString()) - props[MinWidthId] = InspectableValue.Text(layout.minWidth.toString()) - props[MaxWidthId] = InspectableValue.Text(layout.maxWidth.toString()) - - props[HeightId] = InspectableValue.Text(layout.height.toString()) - props[MinHeightId] = InspectableValue.Text(layout.minHeight.toString()) - props[MaxHeightId] = InspectableValue.Text(layout.maxHeight.toString()) props[AspectRatioId] = InspectableValue.Text(layout.aspectRatio.toString()) - val marginProps = mutableMapOf() - marginProps[LeftId] = InspectableValue.Text(layout.getMargin(YogaEdge.LEFT).toString()) - marginProps[TopId] = InspectableValue.Text(layout.getMargin(YogaEdge.TOP).toString()) - marginProps[RightId] = InspectableValue.Text(layout.getMargin(YogaEdge.RIGHT).toString()) - marginProps[BottomId] = InspectableValue.Text(layout.getMargin(YogaEdge.BOTTOM).toString()) - marginProps[StartId] = InspectableValue.Text(layout.getMargin(YogaEdge.START).toString()) - marginProps[EndId] = InspectableValue.Text(layout.getMargin(YogaEdge.END).toString()) - marginProps[HorizontalId] = - InspectableValue.Text(layout.getMargin(YogaEdge.HORIZONTAL).toString()) - marginProps[VerticalId] = InspectableValue.Text(layout.getMargin(YogaEdge.VERTICAL).toString()) - marginProps[AllId] = InspectableValue.Text(layout.getMargin(YogaEdge.ALL).toString()) + layout.background?.let { drawable -> props[BackgroundId] = fromDrawable(drawable) } - props[MarginId] = InspectableObject(marginProps) + props[DirectionId] = InspectableValue.Enum(Enumeration(layout.layoutDirection.name)) - val paddingProps = mutableMapOf() - paddingProps[LeftId] = InspectableValue.Text(layout.getPadding(YogaEdge.LEFT).toString()) - paddingProps[TopId] = InspectableValue.Text(layout.getPadding(YogaEdge.TOP).toString()) - paddingProps[RightId] = InspectableValue.Text(layout.getPadding(YogaEdge.RIGHT).toString()) - paddingProps[BottomId] = InspectableValue.Text(layout.getPadding(YogaEdge.BOTTOM).toString()) - paddingProps[StartId] = InspectableValue.Text(layout.getPadding(YogaEdge.START).toString()) - paddingProps[EndId] = InspectableValue.Text(layout.getPadding(YogaEdge.END).toString()) - paddingProps[HorizontalId] = - InspectableValue.Text(layout.getPadding(YogaEdge.HORIZONTAL).toString()) - paddingProps[VerticalId] = - InspectableValue.Text(layout.getPadding(YogaEdge.VERTICAL).toString()) - paddingProps[AllId] = InspectableValue.Text(layout.getPadding(YogaEdge.ALL).toString()) + props[FlexBasisId] = InspectableValue.Text(layout.flexBasis.toString()) + props[FlexDirectionId] = InspectableValue.Enum(Enumeration(layout.flexDirection.name)) + props[FlexGrowId] = InspectableValue.Text(layout.flexGrow.toString()) + props[FlexShrinkId] = InspectableValue.Text(layout.flexShrink.toString()) - props[PaddingId] = InspectableObject(paddingProps) + layout.foreground?.let { drawable -> props[ForegroundId] = fromDrawable(drawable) } - val borderProps = mutableMapOf() - borderProps[LeftId] = InspectableValue.Text(layout.getBorderWidth(YogaEdge.LEFT).toString()) - borderProps[TopId] = InspectableValue.Text(layout.getBorderWidth(YogaEdge.TOP).toString()) - borderProps[RightId] = InspectableValue.Text(layout.getBorderWidth(YogaEdge.RIGHT).toString()) - borderProps[BottomId] = InspectableValue.Text(layout.getBorderWidth(YogaEdge.BOTTOM).toString()) - borderProps[StartId] = InspectableValue.Text(layout.getBorderWidth(YogaEdge.START).toString()) - borderProps[EndId] = InspectableValue.Text(layout.getBorderWidth(YogaEdge.END).toString()) - borderProps[HorizontalId] = - InspectableValue.Text(layout.getBorderWidth(YogaEdge.HORIZONTAL).toString()) - borderProps[VerticalId] = - InspectableValue.Text(layout.getBorderWidth(YogaEdge.VERTICAL).toString()) - borderProps[AllId] = InspectableValue.Text(layout.getBorderWidth(YogaEdge.ALL).toString()) + props[JustifyContentId] = InspectableValue.Enum(Enumeration(layout.justifyContent.name)) - props[BorderId] = InspectableObject(borderProps) + props[PositionTypeId] = InspectableValue.Enum(Enumeration(layout.positionType.name)) - val positionProps = mutableMapOf() - positionProps[LeftId] = InspectableValue.Text(layout.getPosition(YogaEdge.LEFT).toString()) - positionProps[TopId] = InspectableValue.Text(layout.getPosition(YogaEdge.TOP).toString()) - positionProps[RightId] = InspectableValue.Text(layout.getPosition(YogaEdge.RIGHT).toString()) - positionProps[BottomId] = InspectableValue.Text(layout.getPosition(YogaEdge.BOTTOM).toString()) - positionProps[StartId] = InspectableValue.Text(layout.getPosition(YogaEdge.START).toString()) - positionProps[EndId] = InspectableValue.Text(layout.getPosition(YogaEdge.END).toString()) - positionProps[HorizontalId] = - InspectableValue.Text(layout.getPosition(YogaEdge.HORIZONTAL).toString()) - positionProps[VerticalId] = - InspectableValue.Text(layout.getPosition(YogaEdge.VERTICAL).toString()) - positionProps[AllId] = InspectableValue.Text(layout.getPosition(YogaEdge.ALL).toString()) + val size: MutableMap = mutableMapOf() + size[WidthId] = InspectableValue.Text(layout.width.toString()) + if (layout.minWidth.unit != YogaUnit.UNDEFINED) + size[MinWidthId] = InspectableValue.Text(layout.minWidth.toString()) + if (layout.maxWidth.unit != YogaUnit.UNDEFINED) + size[MaxWidthId] = InspectableValue.Text(layout.maxWidth.toString()) + size[HeightId] = InspectableValue.Text(layout.height.toString()) + if (layout.minHeight.unit != YogaUnit.UNDEFINED) + size[MinHeightId] = InspectableValue.Text(layout.minHeight.toString()) + if (layout.maxHeight.unit != YogaUnit.UNDEFINED) + size[MaxHeightId] = InspectableValue.Text(layout.maxHeight.toString()) - props[PositionId] = InspectableObject(positionProps) + props[SizeId] = InspectableObject(size) - props[HasViewOutputId] = InspectableValue.Boolean(layout.hasViewOutput()) + props[MarginId] = + getInspectableBox( + layout.getMargin(YogaEdge.LEFT), + layout.getMargin(YogaEdge.TOP), + layout.getMargin(YogaEdge.RIGHT), + layout.getMargin(YogaEdge.BOTTOM), + layout.getMargin(YogaEdge.HORIZONTAL), + layout.getMargin(YogaEdge.VERTICAL), + layout.getMargin(YogaEdge.ALL), + layout.getMargin(YogaEdge.START), + layout.getMargin(YogaEdge.END)) + + props[PaddingId] = + getInspectableBox( + layout.getPadding(YogaEdge.LEFT), + layout.getPadding(YogaEdge.TOP), + layout.getPadding(YogaEdge.RIGHT), + layout.getPadding(YogaEdge.BOTTOM), + layout.getPadding(YogaEdge.HORIZONTAL), + layout.getPadding(YogaEdge.VERTICAL), + layout.getPadding(YogaEdge.ALL), + layout.getPadding(YogaEdge.START), + layout.getPadding(YogaEdge.END)) + + props[BorderId] = + getInspectableBoxRaw( + layout.getBorderWidth(YogaEdge.LEFT), + layout.getBorderWidth(YogaEdge.TOP), + layout.getBorderWidth(YogaEdge.RIGHT), + layout.getBorderWidth(YogaEdge.BOTTOM), + layout.getBorderWidth(YogaEdge.HORIZONTAL), + layout.getBorderWidth(YogaEdge.VERTICAL), + layout.getBorderWidth(YogaEdge.ALL), + layout.getBorderWidth(YogaEdge.START), + layout.getBorderWidth(YogaEdge.END)) + + props[PositionId] = + getInspectableBox( + layout.getPosition(YogaEdge.LEFT), + layout.getPosition(YogaEdge.TOP), + layout.getPosition(YogaEdge.RIGHT), + layout.getPosition(YogaEdge.BOTTOM), + layout.getPosition(YogaEdge.HORIZONTAL), + layout.getPosition(YogaEdge.VERTICAL), + layout.getPosition(YogaEdge.ALL), + layout.getPosition(YogaEdge.START), + layout.getPosition(YogaEdge.END)) + + val viewOutput: MutableMap = mutableMapOf() + viewOutput[HasViewOutputId] = InspectableValue.Boolean(layout.hasViewOutput()) if (layout.hasViewOutput()) { - props[AlphaId] = InspectableValue.Number(layout.alpha) - props[ScaleId] = InspectableValue.Number(layout.scale) - props[RotationId] = InspectableValue.Number(layout.rotation) + viewOutput[AlphaId] = InspectableValue.Number(layout.alpha) + viewOutput[RotationId] = InspectableValue.Number(layout.rotation) + viewOutput[ScaleId] = InspectableValue.Number(layout.scale) } + props[ViewOutputId] = InspectableObject(viewOutput) return props } From 1adcf2bc68acf137c41d99c967012b5dfc80dff5 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Fri, 18 Nov 2022 05:21:56 -0800 Subject: [PATCH 0303/1651] No data available Summary: If there are no attributes for a given section, display a 'No data available' message rather than having an empty panel. Reviewed By: antonk52 Differential Revision: D41400252 fbshipit-source-id: 0337702f638b9b917e6b3be5962838d2eb15c20d --- .../sidebar/inspector/AttributesInspector.tsx | 45 ++++++++++++------- desktop/static/icons.json | 5 ++- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx index 6ad1c4f35..12cc3c62b 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx @@ -32,6 +32,7 @@ import { RowStyle, TextAttributeValueStyle, } from './Styles'; +import {Glyph} from 'flipper'; const NumberValue = styled.span(NumberAttributeValueStyle); const TextValue = styled.span(TextAttributeValueStyle); @@ -207,23 +208,37 @@ export const AttributesInspector: React.FC = ({ mode, rawDisplayEnabled = false, }) => { + const keys = Object.keys(node.attributes); + const sections = keys + .map(function (key, _) { + const metadataId: number = Number(key); + /** + * The node top-level attributes refer to the displayable panels. + * The panel name is obtained by querying the metadata. + * The inspectable contains the actual attributes belonging to each panel. + */ + return createSection( + mode, + metadata, + metadata.get(metadataId)?.name ?? '', + node.attributes[metadataId] as InspectableObject, + ); + }) + .filter((section) => section !== undefined); + + if (sections.length === 0) { + return ( +
+ +

No data is available

+
+ ); + } + return ( <> - {Object.keys(node.attributes).map(function (key, _) { - const metadataId: number = Number(key); - /** - * The node top-level attributes refer to the displayable panels. - * The panel name is obtained by querying the metadata. - * The inspectable contains the actual attributes belonging to each panel. - */ - return createSection( - mode, - metadata, - metadata.get(metadataId)?.name ?? '', - node.attributes[metadataId] as InspectableObject, - ); - })} - {rawDisplayEnabled ?? ( + {...sections} + {rawDisplayEnabled && ( diff --git a/desktop/static/icons.json b/desktop/static/icons.json index a74dda590..f43a07261 100644 --- a/desktop/static/icons.json +++ b/desktop/static/icons.json @@ -254,7 +254,8 @@ 16 ], "stop": [ - 16 + 16, + 24 ], "target": [ 12, @@ -658,4 +659,4 @@ "square-ruler": [ 16 ] -} \ No newline at end of file +} From 85fe53a9e289ea3166ea0b0afa958a6d524a7a1d Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Mon, 21 Nov 2022 03:39:40 -0800 Subject: [PATCH 0304/1651] Run date formatter test on unix only Summary: The test added in D41342194 (https://github.com/facebook/flipper/commit/f1cbe7ed79f50f522552055f706f3ea7a835e74f) fails on Windows: https://github.com/facebook/flipper/actions/runs/3489945702/jobs/5840723948 Turns out this is a known issue: https://github.com/facebook/flipper/blob/1adcf2bc68acf137c41d99c967012b5dfc80dff5/desktop/flipper-plugin-core/src/utils/__tests__/shallowSerialization.node.tsx#L228 So, following the advice there and running it on unix only. Reviewed By: lawrencelomax Differential Revision: D41403510 fbshipit-source-id: e08ce4be58adf0547bffec50850c7c259b4e33d5 --- .../src/ui/__tests__/DataFormatter.node.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/desktop/flipper-plugin/src/ui/__tests__/DataFormatter.node.tsx b/desktop/flipper-plugin/src/ui/__tests__/DataFormatter.node.tsx index 97f57f229..cf39436f6 100644 --- a/desktop/flipper-plugin/src/ui/__tests__/DataFormatter.node.tsx +++ b/desktop/flipper-plugin/src/ui/__tests__/DataFormatter.node.tsx @@ -21,9 +21,6 @@ test('default formatter', () => { expect( DataFormatter.format(new Date(2020, 2, 3, 5, 8, 4, 244654)), ).toMatchInlineSnapshot(`"05:12:08.654"`); - expect( - DataFormatter.format(new Date(1668609938.068577 * 1000)), - ).toMatchInlineSnapshot(`"01:45:38.068"`); expect(DataFormatter.format('test')).toMatchInlineSnapshot(`"test"`); expect(DataFormatter.format({hello: 'world'})).toMatchInlineSnapshot(` @@ -74,6 +71,13 @@ test('default formatter', () => { `); }); +test.unix('date formatter', () => { + // dates on windows don't support changed timezones + expect( + DataFormatter.format(new Date(1668609938.068577 * 1000)), + ).toMatchInlineSnapshot(`"01:45:38.068"`); +}); + test('linkify formatter', () => { const linkify = (value: any) => DataFormatter.format(value, DataFormatter.linkify); From c92a9ae03e8d7f53d9d74554b6004bb5d4419c72 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Mon, 21 Nov 2022 04:51:23 -0800 Subject: [PATCH 0305/1651] Enrich raw data with metadata Summary: As metadata got split from attributes, raw data became harder to read. This change annotates raw data with attribute names to ease readability and thus usability. Reviewed By: antonk52 Differential Revision: D41400622 fbshipit-source-id: 8bebb2bd368490b9d7a2b4435749cdf0570b7571 --- .../sidebar/inspector/AttributesInspector.tsx | 3 +- .../public/ui-debugger/dataTransform.tsx | 71 +++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 desktop/plugins/public/ui-debugger/dataTransform.tsx diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx index 12cc3c62b..e4bdd1c34 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx @@ -33,6 +33,7 @@ import { TextAttributeValueStyle, } from './Styles'; import {Glyph} from 'flipper'; +import {transform} from '../../../dataTransform'; const NumberValue = styled.span(NumberAttributeValueStyle); const TextValue = styled.span(TextAttributeValueStyle); @@ -240,7 +241,7 @@ export const AttributesInspector: React.FC = ({ {...sections} {rawDisplayEnabled && ( - + )} diff --git a/desktop/plugins/public/ui-debugger/dataTransform.tsx b/desktop/plugins/public/ui-debugger/dataTransform.tsx new file mode 100644 index 000000000..daa865335 --- /dev/null +++ b/desktop/plugins/public/ui-debugger/dataTransform.tsx @@ -0,0 +1,71 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import {Inspectable, InspectableObject, Metadata, MetadataId} from './types'; + +function transformAny( + metadata: Map, + inspectable: Inspectable, +): any { + switch (inspectable.type) { + case 'boolean': + case 'text': + case 'number': + case 'color': + case 'size': + case 'bounds': + case 'coordinate': + case 'coordinate3d': + case 'space': + return inspectable.value; + case 'enum': + return inspectable.value.value; + case 'object': + return transformObject(metadata, inspectable); + default: + return JSON.parse(JSON.stringify(inspectable)); + } +} + +function transformObject( + metadata: Map, + inspectableObject: InspectableObject, +): any { + const object: any = {}; + Object.keys(inspectableObject.fields).forEach((key, _index) => { + const metadataId: number = Number(key); + const meta = metadata.get(metadataId); + if (!meta) { + return; + } + + const inspectable = inspectableObject.fields[metadataId]; + object[meta.name] = transformAny(metadata, inspectable); + }); + + return object; +} + +export function transform( + attributes: Record, + metadata: Map, +): any { + const object: any = {}; + Object.keys(attributes).forEach((key) => { + const metadataId: number = Number(key); + const meta = metadata.get(metadataId); + if (!meta) { + return; + } + + const inspectable = attributes[metadataId] as InspectableObject; + object[meta.name] = transformObject(metadata, inspectable); + }); + return object; +} From 5e200dd7ec2bf1bb1b29c791c1ac358fb2d1a8b7 Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Mon, 21 Nov 2022 05:05:54 -0800 Subject: [PATCH 0306/1651] Add docs about code freeze Summary: Wanted to write about this for a while as we're reinventing the rules every time we get to this time of the year. :) Reviewed By: LukeDefeo, antonk52 Differential Revision: D41434886 fbshipit-source-id: 445c6c259bee74874472cf246fdc209e82514fcd --- website/sidebars.js | 1 + 1 file changed, 1 insertion(+) diff --git a/website/sidebars.js b/website/sidebars.js index c48008664..11328949e 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -199,6 +199,7 @@ module.exports = { }, 'fb/Star-Ratings', 'fb/async-testing', + 'fb/code-freeze', ] } ]), From 5b3e110821c5e50fb7b1fe1972a932bd00370565 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Mon, 21 Nov 2022 05:30:18 -0800 Subject: [PATCH 0307/1651] Remove Enumeration type Summary: Enumeration used to be a type containing a single property value of type string. The InspectableEnum is a type that had an Enumeration value and possible values. As we removed possible values from the enum value, this structure no longer serves its purpose. Reviewed By: antonk52 Differential Revision: D41400874 fbshipit-source-id: e5c2d1e15ee9b3074ddd69f75ee9b8150d44379f --- .../descriptors/props/ComponentPropExtractor.kt | 7 +++---- .../litho/descriptors/props/LayoutPropExtractor.kt | 14 +++++++------- .../plugins/uidebugger/common/EnumMapping.kt | 3 +-- .../plugins/uidebugger/model/Inspectable.kt | 4 +--- .../flipper/plugins/uidebugger/model/Types.kt | 2 -- .../flipper/plugins/uidebugger/EnumMappingTest.kt | 4 +--- .../sidebar/inspector/AttributesInspector.tsx | 2 +- .../plugins/public/ui-debugger/dataTransform.tsx | 3 +-- desktop/plugins/public/ui-debugger/types.tsx | 2 +- 9 files changed, 16 insertions(+), 25 deletions(-) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt index 421210d55..5cb18b9c3 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt @@ -137,8 +137,7 @@ object ComponentPropExtractor { return InspectableArray(0, values ?: listOf()) } - override fun isPick(pick: EditorPick?): Inspectable = - InspectableValue.Enum(Enumeration(pick?.selected)) + override fun isPick(pick: EditorPick): Inspectable = InspectableValue.Enum(pick.selected) override fun isNumber(number: EditorNumber): Inspectable = InspectableValue.Number(number.value) @@ -146,8 +145,8 @@ object ComponentPropExtractor { override fun isColor(number: EditorColor): Inspectable = InspectableValue.Color(number.value.toInt().let { Color.fromColor(it) }) - override fun isString(string: EditorString?): Inspectable = - InspectableValue.Text(string?.value ?: "") + override fun isString(string: EditorString): Inspectable = + InspectableValue.Text(string.value ?: "") override fun isBool(bool: EditorBool): Inspectable = InspectableValue.Boolean(bool.value) }) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt index fa4a256e9..602bbd019 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt @@ -324,26 +324,26 @@ object LayoutPropExtractor { val layout = component.layoutNode ?: return props - props[AlignItemsId] = InspectableValue.Enum(Enumeration(layout.alignItems.name)) - props[AlignSelfId] = InspectableValue.Enum(Enumeration(layout.alignSelf.name)) - props[AlignContentId] = InspectableValue.Enum(Enumeration(layout.alignContent.name)) + props[AlignItemsId] = InspectableValue.Enum(layout.alignItems.name) + props[AlignSelfId] = InspectableValue.Enum(layout.alignSelf.name) + props[AlignContentId] = InspectableValue.Enum(layout.alignContent.name) props[AspectRatioId] = InspectableValue.Text(layout.aspectRatio.toString()) layout.background?.let { drawable -> props[BackgroundId] = fromDrawable(drawable) } - props[DirectionId] = InspectableValue.Enum(Enumeration(layout.layoutDirection.name)) + props[DirectionId] = InspectableValue.Enum(layout.layoutDirection.name) props[FlexBasisId] = InspectableValue.Text(layout.flexBasis.toString()) - props[FlexDirectionId] = InspectableValue.Enum(Enumeration(layout.flexDirection.name)) + props[FlexDirectionId] = InspectableValue.Enum(layout.flexDirection.name) props[FlexGrowId] = InspectableValue.Text(layout.flexGrow.toString()) props[FlexShrinkId] = InspectableValue.Text(layout.flexShrink.toString()) layout.foreground?.let { drawable -> props[ForegroundId] = fromDrawable(drawable) } - props[JustifyContentId] = InspectableValue.Enum(Enumeration(layout.justifyContent.name)) + props[JustifyContentId] = InspectableValue.Enum(layout.justifyContent.name) - props[PositionTypeId] = InspectableValue.Enum(Enumeration(layout.positionType.name)) + props[PositionTypeId] = InspectableValue.Enum(layout.positionType.name) val size: MutableMap = mutableMapOf() size[WidthId] = InspectableValue.Text(layout.width.toString()) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt index a6e1666aa..12c685d8e 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt @@ -9,7 +9,6 @@ package com.facebook.flipper.plugins.uidebugger.common import android.util.Log import com.facebook.flipper.plugins.uidebugger.LogTag -import com.facebook.flipper.plugins.uidebugger.model.Enumeration import com.facebook.flipper.plugins.uidebugger.model.InspectableValue // Maintains 2 way mapping between some enum value and a readable string representation @@ -40,7 +39,7 @@ open class EnumMapping(private val mapping: Map) { } fun toInspectable(value: T): InspectableValue.Enum { - return InspectableValue.Enum(Enumeration(getStringRepresentation(value))) + return InspectableValue.Enum(getStringRepresentation(value)) } companion object { const val NoMapping = "__UNKNOWN_ENUM_VALUE__" diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Inspectable.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Inspectable.kt index a4c511689..efcabee79 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Inspectable.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Inspectable.kt @@ -85,9 +85,7 @@ sealed class InspectableValue : Inspectable() { @SerialName("enum") @kotlinx.serialization.Serializable - data class Enum( - val value: com.facebook.flipper.plugins.uidebugger.model.Enumeration, - ) : InspectableValue() + data class Enum(val value: String) : InspectableValue() @SerialName("unknown") @kotlinx.serialization.Serializable diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt index 03edf021e..fe5b87d06 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt @@ -62,5 +62,3 @@ data class Size( @Serializable(with = NumberSerializer::class) val width: Number, @Serializable(with = NumberSerializer::class) val height: Number ) {} - -@kotlinx.serialization.Serializable data class Enumeration(val value: String?) diff --git a/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt b/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt index 115cf36ae..226c6c671 100644 --- a/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt +++ b/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt @@ -9,7 +9,6 @@ package com.facebook.flipper.plugins.uidebugger import android.view.View import com.facebook.flipper.plugins.uidebugger.common.EnumMapping -import com.facebook.flipper.plugins.uidebugger.model.Enumeration import com.facebook.flipper.plugins.uidebugger.model.InspectableValue import org.hamcrest.CoreMatchers.* import org.hamcrest.MatcherAssert.assertThat @@ -38,7 +37,6 @@ class EnumMappingTest { @Test fun testTurnsIntoEnumInspectable() { - assertThat( - visibility.toInspectable(View.GONE), equalTo(InspectableValue.Enum(Enumeration("GONE")))) + assertThat(visibility.toInspectable(View.GONE), equalTo(InspectableValue.Enum("GONE"))) } } diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx index e4bdd1c34..54a167189 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx @@ -102,7 +102,7 @@ function create( case 'enum': return ( - {inspectable.value.value} + {inspectable.value} ); case 'text': diff --git a/desktop/plugins/public/ui-debugger/dataTransform.tsx b/desktop/plugins/public/ui-debugger/dataTransform.tsx index daa865335..7836c8c22 100644 --- a/desktop/plugins/public/ui-debugger/dataTransform.tsx +++ b/desktop/plugins/public/ui-debugger/dataTransform.tsx @@ -22,10 +22,9 @@ function transformAny( case 'bounds': case 'coordinate': case 'coordinate3d': + case 'enum': case 'space': return inspectable.value; - case 'enum': - return inspectable.value.value; case 'object': return transformObject(metadata, inspectable); default: diff --git a/desktop/plugins/public/ui-debugger/types.tsx b/desktop/plugins/public/ui-debugger/types.tsx index 6307ca006..a1557c729 100644 --- a/desktop/plugins/public/ui-debugger/types.tsx +++ b/desktop/plugins/public/ui-debugger/types.tsx @@ -155,7 +155,7 @@ export type InspectableBoolean = { export type InspectableEnum = { type: 'enum'; - value: {value: string; values: string[]}; + value: string; }; export type InspectableColor = { From c95c59342ee1719a13cf0c747fd955edf2abf79b Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Mon, 21 Nov 2022 07:09:43 -0800 Subject: [PATCH 0308/1651] Remove CK from Sample (#4321) Summary: Pull Request resolved: https://github.com/facebook/flipper/pull/4321 ^ Reviewed By: antonk52 Differential Revision: D41434959 fbshipit-source-id: 35fe20a2e04af1d6011f0fb9c82aee4eb504fdc7 --- FlipperKit.podspec | 2 +- iOS/Sample/AppDelegate.m | 5 +- iOS/Sample/MainStoryBoard.storyboard | 111 ++++++++------------ iOS/Sample/MainViewController.mm | 8 -- iOS/Sample/Podfile | 5 +- iOS/Sample/Podfile.lock | 23 +--- iOS/Sample/RootViewController.h | 12 --- iOS/Sample/RootViewController.mm | 85 --------------- iOS/Sample/Sample.xcodeproj/project.pbxproj | 8 -- 9 files changed, 50 insertions(+), 209 deletions(-) delete mode 100644 iOS/Sample/RootViewController.h delete mode 100644 iOS/Sample/RootViewController.mm diff --git a/FlipperKit.podspec b/FlipperKit.podspec index 2403a7219..72876874e 100644 --- a/FlipperKit.podspec +++ b/FlipperKit.podspec @@ -153,7 +153,7 @@ Pod::Spec.new do |spec| ss.header_dir = "FlipperKitLayoutComponentKitSupport" ss.dependency 'FlipperKit/Core' ss.dependency 'ComponentKit', '0.31' - ss.dependency 'RenderCore', '0.31' # Pinning it to 0.30, as there won't be any new releases from CK team. + ss.dependency 'RenderCore', '0.31' ss.dependency 'FlipperKit/FlipperKitLayoutPlugin' ss.dependency 'FlipperKit/FlipperKitLayoutTextSearchable' ss.dependency 'FlipperKit/FlipperKitHighlightOverlay' diff --git a/iOS/Sample/AppDelegate.m b/iOS/Sample/AppDelegate.m index c22195b6a..0a7236137 100644 --- a/iOS/Sample/AppDelegate.m +++ b/iOS/Sample/AppDelegate.m @@ -8,7 +8,6 @@ #import "AppDelegate.h" #import #import -#import #import #import #import @@ -16,7 +15,6 @@ #import #import "MainViewController.h" -#import "RootViewController.h" #if !FB_SONARKIT_ENABLED #error \ @@ -34,8 +32,7 @@ SKDescriptorMapper* layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults]; - [FlipperKitLayoutComponentKitSupport - setUpWithDescriptorMapper:layoutDescriptorMapper]; + [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]]; diff --git a/iOS/Sample/MainStoryBoard.storyboard b/iOS/Sample/MainStoryBoard.storyboard index 294d872e2..161bcbb26 100644 --- a/iOS/Sample/MainStoryBoard.storyboard +++ b/iOS/Sample/MainStoryBoard.storyboard @@ -1,11 +1,8 @@ - - - - + + - - + @@ -19,10 +16,10 @@ - + - - - + - + - - + - + @@ -100,6 +96,7 @@ + @@ -131,7 +128,6 @@ -
@@ -151,13 +147,12 @@ - + - - - - - - + - - - - + - - + + -
@@ -276,12 +253,12 @@ - + - - - - + - - + - + @@ -416,7 +392,6 @@ - @@ -429,6 +404,6 @@ - + diff --git a/iOS/Sample/MainViewController.mm b/iOS/Sample/MainViewController.mm index 98eafe48f..d517de842 100644 --- a/iOS/Sample/MainViewController.mm +++ b/iOS/Sample/MainViewController.mm @@ -10,7 +10,6 @@ #import #import "CommunicationDemoViewController.h" #import "NetworkViewController.h" -#import "RootViewController.h" #import "UserDefaultsViewController.h" @interface MainViewController () @@ -29,13 +28,6 @@ [self.navigationController pushViewController:controller animated:true]; } -- (IBAction)tappedComponentKitLayout:(UIButton*)sender { - RootViewController* rootViewController = [RootViewController new]; - - [self.navigationController pushViewController:rootViewController - animated:true]; -} - - (IBAction)tappedNetworkInspector:(UIButton*)sender { UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryBoard" bundle:nil]; diff --git a/iOS/Sample/Podfile b/iOS/Sample/Podfile index f2212b18f..cd49c16aa 100644 --- a/iOS/Sample/Podfile +++ b/iOS/Sample/Podfile @@ -6,8 +6,8 @@ target 'Sample' do platform :ios, '10.0' # See docs/getting-started/ios-native.mdx - pod 'FlipperKit', :path => '../../FlipperKit.podspec', :configuration => 'Debug' - pod 'FlipperKit/FlipperKitLayoutComponentKitSupport', :path => '../../FlipperKit.podspec', :configuration => 'Debug' + pod 'FlipperKit', :path => '../../FlipperKit.podspec', :configuration => 'Debug' + pod 'FlipperKit/FlipperKitLayoutPlugin', :path => '../../FlipperKit.podspec', :configuration => 'Debug' pod 'FlipperKit/SKIOSNetworkPlugin', :path => '../../FlipperKit.podspec', :configuration => 'Debug' pod 'FlipperKit/FlipperKitUserDefaultsPlugin', :path => '../../FlipperKit.podspec', :configuration => 'Debug' pod 'FlipperKit/FlipperKitExamplePlugin', :path => '../../FlipperKit.podspec', :configuration => 'Debug' @@ -21,7 +21,6 @@ target 'Sample' do pod 'Flipper-Boost-iOSX', :configuration => 'Debug' pod 'OpenSSL-Universal', :configuration => 'Debug' pod 'CocoaAsyncSocket', :configuration => 'Debug' - pod 'ComponentKit', '~> 0.31' pod 'SocketRocket', '~> 0.6.0' end diff --git a/iOS/Sample/Podfile.lock b/iOS/Sample/Podfile.lock index 04012a669..5507722d4 100644 --- a/iOS/Sample/Podfile.lock +++ b/iOS/Sample/Podfile.lock @@ -1,8 +1,5 @@ PODS: - CocoaAsyncSocket (7.6.5) - - ComponentKit (0.31): - - RenderCore (= 0.31) - - Yoga (~> 1.14) - Flipper (0.172.0): - Flipper-Folly (~> 2.6) - Flipper-Boost-iOSX (1.76.0.1.11) @@ -37,14 +34,6 @@ PODS: - FlipperKit/FlipperKitExamplePlugin (0.172.0): - FlipperKit/Core - FlipperKit/FlipperKitHighlightOverlay (0.172.0) - - FlipperKit/FlipperKitLayoutComponentKitSupport (0.172.0): - - ComponentKit (= 0.31) - - FlipperKit/Core - - FlipperKit/FlipperKitHighlightOverlay - - FlipperKit/FlipperKitLayoutHelpers - - FlipperKit/FlipperKitLayoutPlugin - - FlipperKit/FlipperKitLayoutTextSearchable - - RenderCore (= 0.31) - FlipperKit/FlipperKitLayoutHelpers (0.172.0): - FlipperKit/Core - FlipperKit/FlipperKitHighlightOverlay @@ -73,7 +62,6 @@ PODS: - FlipperKit/FlipperKitNetworkPlugin - libevent (2.1.12) - OpenSSL-Universal (1.1.1100) - - RenderCore (0.31) - SocketRocket (0.6.0) - Yoga (1.14.0) - YogaKit (1.18.1): @@ -81,7 +69,6 @@ PODS: DEPENDENCIES: - CocoaAsyncSocket - - ComponentKit (~> 0.31) - Flipper (from `../../Flipper.podspec`) - Flipper-Boost-iOSX - Flipper-DoubleConversion @@ -90,7 +77,7 @@ DEPENDENCIES: - Flipper-PeerTalk - FlipperKit (from `../../FlipperKit.podspec`) - FlipperKit/FlipperKitExamplePlugin (from `../../FlipperKit.podspec`) - - FlipperKit/FlipperKitLayoutComponentKitSupport (from `../../FlipperKit.podspec`) + - FlipperKit/FlipperKitLayoutPlugin (from `../../FlipperKit.podspec`) - FlipperKit/FlipperKitReactPlugin (from `../../FlipperKit.podspec`) - FlipperKit/FlipperKitUserDefaultsPlugin (from `../../FlipperKit.podspec`) - FlipperKit/SKIOSNetworkPlugin (from `../../FlipperKit.podspec`) @@ -101,7 +88,6 @@ DEPENDENCIES: SPEC REPOS: https://github.com/CocoaPods/Specs: - CocoaAsyncSocket - - ComponentKit - Flipper-Boost-iOSX - Flipper-DoubleConversion - Flipper-Fmt @@ -110,7 +96,6 @@ SPEC REPOS: - Flipper-PeerTalk - libevent - OpenSSL-Universal - - RenderCore - SocketRocket - Yoga - YogaKit @@ -123,7 +108,6 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - ComponentKit: 7bf7048b9814afc6b6641645a14177f95fd9b9ae Flipper: e57750a29313c49b9783a310150053d32b2b2b6f Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30 @@ -134,11 +118,10 @@ SPEC CHECKSUMS: FlipperKit: 02fd59af13a1465d04268cbffe3f93505f0a1dc2 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c - RenderCore: 090beb17b5bff80b86929a7ceb49df789923d23a SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 Yoga: cff67a400f6b74dc38eb0bad4f156673d9aa980c YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: 8f7b8c1a8e7cee47eaef4736990315bfc090e2af +PODFILE CHECKSUM: 7dae704c5712701d2a19d89e7f391cfa926d728c -COCOAPODS: 1.11.3 +COCOAPODS: 1.11.2 diff --git a/iOS/Sample/RootViewController.h b/iOS/Sample/RootViewController.h deleted file mode 100644 index 2c3e2b2b1..000000000 --- a/iOS/Sample/RootViewController.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import - -@interface RootViewController : UIViewController - -@end diff --git a/iOS/Sample/RootViewController.mm b/iOS/Sample/RootViewController.mm deleted file mode 100644 index dcde5977b..000000000 --- a/iOS/Sample/RootViewController.mm +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import "RootViewController.h" - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -@interface RootViewController () - -@property(strong, nonatomic) CKComponentHostingView* rootCKHostingView; - -@end - -@implementation RootViewController - -- (instancetype)init { - if (self = [super init]) { - _rootCKHostingView = [[CKComponentHostingView alloc] - initWithComponentProviderFunc:componentForModel - sizeRangeProvider: - [CKComponentFlexibleSizeRangeProvider - providerWithFlexibility: - CKComponentSizeRangeFlexibleHeight]]; - - [self.view addSubview:_rootCKHostingView]; - [self loadViewIfNeeded]; - } - return self; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - self.navigationItem.title = @"ComponentKit Layout"; - self.edgesForExtendedLayout = UIRectEdgeNone; -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - _rootCKHostingView.frame = self.view.bounds; -} - -static CKComponent* componentForModel( - id model, - id context) { - return CK::BackgroundLayoutComponentBuilder() - .component(CK::FlexboxComponentBuilder() - .child( - {.component = CK::ButtonComponentBuilder() - .action(nil) - .title(@"Purple") - .titleColor(UIColor.purpleColor) - .build()}) - .child( - {.component = CK::ButtonComponentBuilder() - .action(nil) - .title(@"Brown") - .titleColor(UIColor.brownColor) - .build()}) - .child( - {.component = CK::ButtonComponentBuilder() - .action(nil) - .title(@"Cyan") - .titleColor(UIColor.cyanColor) - .build()}) - .build()) - .background(CK::ImageComponentBuilder() - .image([UIImage imageNamed:@"sonarpattern"]) - .build()) - .build(); -} - -@end diff --git a/iOS/Sample/Sample.xcodeproj/project.pbxproj b/iOS/Sample/Sample.xcodeproj/project.pbxproj index 2afb5f129..188805211 100644 --- a/iOS/Sample/Sample.xcodeproj/project.pbxproj +++ b/iOS/Sample/Sample.xcodeproj/project.pbxproj @@ -13,7 +13,6 @@ 53D59DB320ABA18400207065 /* NetworkViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53D59DAA20ABA18300207065 /* NetworkViewController.m */; }; 53D59DB420ABA18400207065 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 53D59DAB20ABA18300207065 /* AppDelegate.m */; }; 53D59DB520ABA18400207065 /* MainViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 53D59DAD20ABA18300207065 /* MainViewController.mm */; }; - 53D59DB620ABA18400207065 /* RootViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 53D59DAF20ABA18300207065 /* RootViewController.mm */; }; 53D59DB720ABA18400207065 /* MainStoryBoard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53D59DB020ABA18400207065 /* MainStoryBoard.storyboard */; }; 53D59DB820ABA18400207065 /* Icons.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53D59DB120ABA18400207065 /* Icons.xcassets */; }; 53E0DE5420ABA0E4005682E1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53E0DE5320ABA0E4005682E1 /* main.m */; }; @@ -29,8 +28,6 @@ 53D59DAB20ABA18300207065 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; }; 53D59DAC20ABA18300207065 /* NetworkViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkViewController.h; sourceTree = SOURCE_ROOT; }; 53D59DAD20ABA18300207065 /* MainViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MainViewController.mm; sourceTree = SOURCE_ROOT; }; - 53D59DAE20ABA18300207065 /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = SOURCE_ROOT; }; - 53D59DAF20ABA18300207065 /* RootViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RootViewController.mm; sourceTree = SOURCE_ROOT; }; 53D59DB020ABA18400207065 /* MainStoryBoard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = MainStoryBoard.storyboard; sourceTree = SOURCE_ROOT; }; 53D59DB120ABA18400207065 /* Icons.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Icons.xcassets; sourceTree = SOURCE_ROOT; }; 53D59DB220ABA18400207065 /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = SOURCE_ROOT; }; @@ -68,8 +65,6 @@ 53D59DAA20ABA18300207065 /* NetworkViewController.m */, 4E10233F216AD7B400160734 /* UserDefaultsViewController.h */, 4E102340216AD7B400160734 /* UserDefaultsViewController.m */, - 53D59DAE20ABA18300207065 /* RootViewController.h */, - 53D59DAF20ABA18300207065 /* RootViewController.mm */, 53E0DE5220ABA0E4005682E1 /* Info.plist */, 53E0DE5320ABA0E4005682E1 /* main.m */, 534252A9217DECCD0092D02B /* CommunicationDemoViewController.h */, @@ -228,7 +223,6 @@ 53D59DB420ABA18400207065 /* AppDelegate.m in Sources */, 53B4A36B217E2B6200B36A53 /* CommunicationDemoViewController.mm in Sources */, 53D59DB520ABA18400207065 /* MainViewController.mm in Sources */, - 53D59DB620ABA18400207065 /* RootViewController.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -359,7 +353,6 @@ "$(inherited)", "\"${PODS_ROOT}/Headers/Public\"", "\"${PODS_ROOT}/Headers/Public/CocoaAsyncSocket\"", - "\"${PODS_ROOT}/Headers/Public/ComponentKit\"", "\"${PODS_ROOT}/Headers/Public/DoubleConversion\"", "\"${PODS_ROOT}/Headers/Public/Folly\"", "\"${PODS_ROOT}/Headers/Public/PeerTalk\"", @@ -424,7 +417,6 @@ "$(inherited)", "\"${PODS_ROOT}/Headers/Public\"", "\"${PODS_ROOT}/Headers/Public/CocoaAsyncSocket\"", - "\"${PODS_ROOT}/Headers/Public/ComponentKit\"", "\"${PODS_ROOT}/Headers/Public/DoubleConversion\"", "\"${PODS_ROOT}/Headers/Public/Folly\"", "\"${PODS_ROOT}/Headers/Public/PeerTalk\"", From 7ec09b4f95f258baef0075531b36b29ec2d8867a Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 23 Nov 2022 03:45:26 -0800 Subject: [PATCH 0309/1651] Shift fetching litho attributes to background thread Summary: Due to litho component instances being immutable we are able to process them later if we hold on to the instance. We have added a Maybe deferred type which sort of resembles a Monad. It wraps a value which may or may not be calculated later. Reviewed By: lblasa Differential Revision: D41474251 fbshipit-source-id: 2ba6e688518dba55cf4aa5ba53f390a92cf0921f --- .../descriptors/DebugComponentDescriptor.kt | 21 +++++---- .../uidebugger/core/NativeScanScheduler.kt | 9 +++- .../descriptors/ChainedDescriptor.kt | 6 ++- .../uidebugger/descriptors/NodeDescriptor.kt | 3 +- .../descriptors/ObjectDescriptor.kt | 3 +- .../descriptors/OffsetChildDescriptor.kt | 3 +- .../plugins/uidebugger/model/Events.kt | 1 + .../observers/TreeObserverManager.kt | 16 ++++--- .../traversal/PartialLayoutTraversal.kt | 45 ++++++++++--------- .../plugins/uidebugger/util/MaybeDeferred.kt | 32 +++++++++++++ .../ui-debugger/components/PerfStats.tsx | 12 ++++- desktop/plugins/public/ui-debugger/types.tsx | 3 +- 12 files changed, 109 insertions(+), 45 deletions(-) create mode 100644 android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/MaybeDeferred.kt diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt index d88df74e4..035bcc698 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt @@ -15,6 +15,8 @@ import com.facebook.flipper.plugins.uidebugger.litho.descriptors.props.LayoutPro import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.MetadataId +import com.facebook.flipper.plugins.uidebugger.util.Deferred +import com.facebook.flipper.plugins.uidebugger.util.MaybeDeferred import com.facebook.litho.DebugComponent class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescriptor { @@ -67,19 +69,20 @@ class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescripto private val UserPropsId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "Litho Props") - override fun getData(node: DebugComponent): Map { + override fun getData(node: DebugComponent): MaybeDeferred> { + return Deferred { + val attributeSections = mutableMapOf() - val attributeSections = mutableMapOf() + val layoutProps = LayoutPropExtractor.getProps(node) + attributeSections[LayoutId] = InspectableObject(layoutProps.toMap()) - val layoutProps = LayoutPropExtractor.getProps(node) - attributeSections[LayoutId] = InspectableObject(layoutProps.toMap()) + if (!node.canResolve()) { + val props = ComponentPropExtractor.getProps(node.component) + attributeSections[UserPropsId] = InspectableObject(props.toMap()) + } - if (!node.canResolve()) { - val props = ComponentPropExtractor.getProps(node.component) - attributeSections[UserPropsId] = InspectableObject(props.toMap()) + attributeSections } - - return attributeSections } override fun getBounds(node: DebugComponent): Bounds = diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt index 582353bba..53eb74d07 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt @@ -19,13 +19,14 @@ import com.facebook.flipper.plugins.uidebugger.model.SubtreeUpdateEvent import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory import com.facebook.flipper.plugins.uidebugger.scheduler.Scheduler import com.facebook.flipper.plugins.uidebugger.traversal.PartialLayoutTraversal +import com.facebook.flipper.plugins.uidebugger.util.MaybeDeferred import kotlinx.serialization.json.Json data class ScanResult( val txId: Long, val scanStart: Long, val scanEnd: Long, - val nodes: List + val nodes: List> ) const val observerType = "FullScan" @@ -62,6 +63,9 @@ class NativeScanScheduler(val context: Context) : Scheduler.Task { } private fun sendSubtreeUpdate(input: ScanResult) { + val nodes = input.nodes.map { it.value() } + val deferredComputationComplete = System.currentTimeMillis() + val serialized = Json.encodeToString( SubtreeUpdateEvent.serializer(), @@ -69,7 +73,7 @@ class NativeScanScheduler(val context: Context) : Scheduler.Task { input.txId, observerType, ApplicationRefDescriptor.getId(context.applicationRef), - input.nodes)) + nodes)) val serializationEnd = System.currentTimeMillis() context.connectionRef.connection?.send( @@ -89,6 +93,7 @@ class NativeScanScheduler(val context: Context) : Scheduler.Task { input.scanStart, input.scanEnd, input.scanEnd, + deferredComputationComplete, serializationEnd, socketEnd, input.nodes.size))) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt index 164b4b686..42667e259 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt @@ -11,6 +11,8 @@ import android.graphics.Bitmap import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.MetadataId +import com.facebook.flipper.plugins.uidebugger.util.Immediate +import com.facebook.flipper.plugins.uidebugger.util.MaybeDeferred /** * A chained descriptor is a special type of descriptor that models the inheritance hierarchy in @@ -81,7 +83,7 @@ abstract class ChainedDescriptor : NodeDescriptor { open fun onGetChildren(node: T): List? = null - final override fun getData(node: T): Map { + final override fun getData(node: T): MaybeDeferred> { val builder = mutableMapOf() onGetData(node, builder) @@ -92,7 +94,7 @@ abstract class ChainedDescriptor : NodeDescriptor { curDescriptor = curDescriptor.mSuper } - return builder + return Immediate(builder) } /** diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt index ac075a36f..af52ebf63 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt @@ -11,6 +11,7 @@ import android.graphics.Bitmap import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.MetadataId +import com.facebook.flipper.plugins.uidebugger.util.MaybeDeferred /* Descriptors are an extension point used during traversal to extract data out of arbitrary @@ -73,7 +74,7 @@ interface NodeDescriptor { * Get the data to show for this node in the sidebar of the inspector. The object will be shown in * order and with a header matching the given name. */ - fun getData(node: T): Map + fun getData(node: T): MaybeDeferred> /** * Set of tags to describe this node in an abstract way for the UI Unfortunately this can't be an diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt index a909a4c1e..910a2b2e7 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt @@ -11,6 +11,7 @@ import android.graphics.Bitmap import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.MetadataId +import com.facebook.flipper.plugins.uidebugger.util.Immediate object ObjectDescriptor : NodeDescriptor { @@ -26,7 +27,7 @@ object ObjectDescriptor : NodeDescriptor { override fun getChildren(node: Any) = listOf() - override fun getData(node: Any) = mutableMapOf() + override fun getData(node: Any) = Immediate(mapOf()) override fun getBounds(node: Any): Bounds = Bounds(0, 0, 0, 0) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt index 04f57c17e..4278ca8e8 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt @@ -11,6 +11,7 @@ import android.graphics.Bitmap import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.MetadataId +import com.facebook.flipper.plugins.uidebugger.util.MaybeDeferred /** a drawable or view that is mounted, along with the correct descriptor */ class OffsetChild(val child: Any, val descriptor: NodeDescriptor, val x: Int, val y: Int) { @@ -37,7 +38,7 @@ object OffsetChildDescriptor : NodeDescriptor { override fun getActiveChild(node: OffsetChild): Any? = node.descriptor.getActiveChild(node.child) - override fun getData(node: OffsetChild): Map = + override fun getData(node: OffsetChild): MaybeDeferred> = node.descriptor.getData(node.child) override fun getTags(node: OffsetChild): Set = node.descriptor.getTags(node.child) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt index 6907441ca..ae6df92e5 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt @@ -58,6 +58,7 @@ data class PerfStatsEvent( val traversalComplete: Long, val snapshotComplete: Long, val queuingComplete: Long, + val deferredComputationComplete: Long, val serializationComplete: Long, val socketComplete: Long, val nodesCount: Int diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index 188f1158e..f5e1adfc8 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -23,6 +23,7 @@ import com.facebook.flipper.plugins.uidebugger.model.MetadataUpdateEvent import com.facebook.flipper.plugins.uidebugger.model.Node import com.facebook.flipper.plugins.uidebugger.model.PerfStatsEvent import com.facebook.flipper.plugins.uidebugger.model.SubtreeUpdateEvent +import com.facebook.flipper.plugins.uidebugger.util.MaybeDeferred import java.io.ByteArrayOutputStream import java.util.concurrent.atomic.AtomicInteger import kotlinx.coroutines.* @@ -37,7 +38,7 @@ data class CoordinateUpdate(val observerType: String, val nodeId: Id, val coordi data class SubtreeUpdate( val observerType: String, val rootId: Id, - val nodes: List, + val deferredNodes: List>, val startTime: Long, val traversalCompleteTime: Long, val snapshotComplete: Long, @@ -104,12 +105,13 @@ class TreeObserverManager(val context: Context) { sendMetadata() val serialized: String? + val nodes = treeUpdate.deferredNodes.map { it.value() } + val deferredComptationComplete = System.currentTimeMillis() if (treeUpdate.snapshot == null) { serialized = Json.encodeToString( SubtreeUpdateEvent.serializer(), - SubtreeUpdateEvent( - txId, treeUpdate.observerType, treeUpdate.rootId, treeUpdate.nodes)) + SubtreeUpdateEvent(txId, treeUpdate.observerType, treeUpdate.rootId, nodes)) } else { val stream = ByteArrayOutputStream() val base64Stream = Base64OutputStream(stream, Base64.DEFAULT) @@ -118,8 +120,7 @@ class TreeObserverManager(val context: Context) { serialized = Json.encodeToString( SubtreeUpdateEvent.serializer(), - SubtreeUpdateEvent( - txId, treeUpdate.observerType, treeUpdate.rootId, treeUpdate.nodes, snapshot)) + SubtreeUpdateEvent(txId, treeUpdate.observerType, treeUpdate.rootId, nodes, snapshot)) treeUpdate.snapshot.readyForReuse() } @@ -130,7 +131,7 @@ class TreeObserverManager(val context: Context) { val socketEnd = System.currentTimeMillis() Log.i( LogTag, - "Sent event for ${treeUpdate.observerType} root ID ${treeUpdate.rootId} nodes ${treeUpdate.nodes.size}") + "Sent event for ${treeUpdate.observerType} root ID ${treeUpdate.rootId} nodes ${nodes.size}") val perfStats = PerfStatsEvent( @@ -140,9 +141,10 @@ class TreeObserverManager(val context: Context) { traversalComplete = treeUpdate.traversalCompleteTime, snapshotComplete = treeUpdate.snapshotComplete, queuingComplete = onWorkerThread, + deferredComputationComplete = deferredComptationComplete, serializationComplete = serializationEnd, socketComplete = socketEnd, - nodesCount = treeUpdate.nodes.size) + nodesCount = nodes.size) context.connectionRef.connection?.send( PerfStatsEvent.name, Json.encodeToString(PerfStatsEvent.serializer(), perfStats)) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt index 26fd41dfc..1dde63542 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt @@ -14,6 +14,8 @@ import com.facebook.flipper.plugins.uidebugger.descriptors.Id import com.facebook.flipper.plugins.uidebugger.descriptors.NodeDescriptor import com.facebook.flipper.plugins.uidebugger.model.Node import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory +import com.facebook.flipper.plugins.uidebugger.util.Immediate +import com.facebook.flipper.plugins.uidebugger.util.MaybeDeferred /** * This will traverse the layout hierarchy until it sees a node that has an observer registered for @@ -29,9 +31,9 @@ class PartialLayoutTraversal( @Suppress("unchecked_cast") internal fun NodeDescriptor<*>.asAny(): NodeDescriptor = this as NodeDescriptor - fun traverse(root: Any): Pair, List> { + fun traverse(root: Any): Pair>, List> { - val visited = mutableListOf() + val visited = mutableListOf>() val observableRoots = mutableListOf() val stack = mutableListOf() @@ -53,15 +55,16 @@ class PartialLayoutTraversal( if (shallow.contains(node)) { visited.add( - Node( - descriptor.getId(node), - descriptor.getQualifiedName(node), - descriptor.getName(node), - emptyMap(), - descriptor.getBounds(node), - emptySet(), - emptyList(), - null)) + Immediate( + Node( + descriptor.getId(node), + descriptor.getQualifiedName(node), + descriptor.getName(node), + emptyMap(), + descriptor.getBounds(node), + emptySet(), + emptyList(), + null))) shallow.remove(node) continue @@ -93,15 +96,17 @@ class PartialLayoutTraversal( val bounds = descriptor.getBounds(node) val tags = descriptor.getTags(node) visited.add( - Node( - descriptor.getId(node), - descriptor.getQualifiedName(node), - descriptor.getName(node), - attributes, - bounds, - tags, - childrenIds, - activeChildId)) + attributes.map { attrs -> + Node( + descriptor.getId(node), + descriptor.getQualifiedName(node), + descriptor.getName(node), + attrs, + bounds, + tags, + childrenIds, + activeChildId) + }) } catch (exception: Exception) { Log.e(LogTag, "Error while processing node ${node.javaClass.name} $node", exception) } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/MaybeDeferred.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/MaybeDeferred.kt new file mode 100644 index 000000000..057a47209 --- /dev/null +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/util/MaybeDeferred.kt @@ -0,0 +1,32 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.flipper.plugins.uidebugger.util + +/** + * This abstracts over a value which could be available immediately or calculated later. The use + * case is for shifting computation to a background thread. + */ +abstract class MaybeDeferred { + abstract fun value(): T + + /** similar to map on an Option or Functor in a functional language. */ + abstract fun map(fn: (T) -> U): MaybeDeferred +} + +class Immediate(private val value: T) : MaybeDeferred() { + override fun value(): T = value + + override fun map(fn: (T) -> U): MaybeDeferred = Immediate(fn(value)) +} + +class Deferred(private val lazyLoader: () -> T) : MaybeDeferred() { + override fun value(): T = lazyLoader() + override fun map(fn: (T) -> U): MaybeDeferred { + return Deferred { fn(lazyLoader()) } + } +} diff --git a/desktop/plugins/public/ui-debugger/components/PerfStats.tsx b/desktop/plugins/public/ui-debugger/components/PerfStats.tsx index 3743f243b..fbff575aa 100644 --- a/desktop/plugins/public/ui-debugger/components/PerfStats.tsx +++ b/desktop/plugins/public/ui-debugger/components/PerfStats.tsx @@ -63,11 +63,21 @@ const columns: DataTableColumn[] = [ return formatDiff(row.snapshotComplete, row.queuingComplete); }, }, + { + key: 'deferredComputationComplete', + title: 'Deferred processing time', + onRender: (row: PerfStatsEvent) => { + return formatDiff(row.queuingComplete, row.deferredComputationComplete); + }, + }, { key: 'serializationComplete', title: 'Serialization time', onRender: (row: PerfStatsEvent) => { - return formatDiff(row.queuingComplete, row.serializationComplete); + return formatDiff( + row.deferredComputationComplete, + row.serializationComplete, + ); }, }, { diff --git a/desktop/plugins/public/ui-debugger/types.tsx b/desktop/plugins/public/ui-debugger/types.tsx index a1557c729..efed0e407 100644 --- a/desktop/plugins/public/ui-debugger/types.tsx +++ b/desktop/plugins/public/ui-debugger/types.tsx @@ -40,8 +40,9 @@ export type PerfStatsEvent = { start: number; traversalComplete: number; snapshotComplete: number; - serializationComplete: number; queuingComplete: number; + deferredComputationComplete: number; + serializationComplete: number; socketComplete: number; nodesCount: number; }; From ae5eeb137dd2a8ca74ffbc806116c0b610a9087e Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Wed, 23 Nov 2022 05:14:00 -0800 Subject: [PATCH 0310/1651] Add unknown type support in visualiser Summary: ^ In this case, the unknown value, which is a text will be displayed as sent by the client. Reviewed By: antonk52 Differential Revision: D41494094 fbshipit-source-id: 9295e3f7e055a8ce9b430137600108a4cdf32c90 --- .../components/sidebar/inspector/AttributesInspector.tsx | 6 ++++++ desktop/plugins/public/ui-debugger/types.tsx | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx index 54a167189..2b891063f 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx @@ -153,6 +153,12 @@ function create( ); + case 'unknown': + return ( + + {inspectable.value} + + ); case 'object': return ( ; }; + +export type InspectableUnknown = { + type: 'unknown'; + value: string; +}; From dbf3108c36770432c8ebc5bb26a4e6d448ce2e3f Mon Sep 17 00:00:00 2001 From: Hamdullah Shah Date: Wed, 23 Nov 2022 05:25:48 -0800 Subject: [PATCH 0311/1651] Fix Sidebar Size Summary: Set width of sidebar for `main` position in `MasterDetail`. Reviewed By: mweststrate Differential Revision: D41493698 fbshipit-source-id: a9f4804256a7ee46ed32f367e8b21ff57dd484e0 --- desktop/flipper-plugin/src/ui/MasterDetail.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/flipper-plugin/src/ui/MasterDetail.tsx b/desktop/flipper-plugin/src/ui/MasterDetail.tsx index ddbfb8d66..0e0560b27 100644 --- a/desktop/flipper-plugin/src/ui/MasterDetail.tsx +++ b/desktop/flipper-plugin/src/ui/MasterDetail.tsx @@ -228,7 +228,7 @@ export function MasterDetail({ return ( {table} - {sidebar} + {sidebar} ); case 'right': From ef64abb495bce4f441f4588ba58aee7ae3236ae4 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Wed, 23 Nov 2022 08:31:13 -0800 Subject: [PATCH 0312/1651] Improve color inspector Summary: Before this change, color inspector used a color picker that showed: color, rgba, hex. The problem is that engineers have to click on it to see these values. This change leaves the picker as is, but presents both hex and rgba inlined within the inspector thus avoiding extra interactions. Reviewed By: antonk52 Differential Revision: D41495740 fbshipit-source-id: c8af01e3060d2e6725295418293b1e30679c1b1f --- .../flipper/plugins/uidebugger/model/Types.kt | 2 +- .../sidebar/inspector/AttributesInspector.tsx | 9 +- .../sidebar/inspector/ColorInspector.tsx | 115 +++++++++++++++--- desktop/plugins/public/ui-debugger/types.tsx | 2 +- 4 files changed, 105 insertions(+), 23 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt index fe5b87d06..abb447526 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt @@ -29,7 +29,7 @@ data class SpaceBox(val top: Int, val right: Int, val bottom: Int, val left: Int } @kotlinx.serialization.Serializable -data class Color(val r: Int, val g: Int, val b: Int, val alpha: Int) { +data class Color(val r: Int, val g: Int, val b: Int, val a: Int) { companion object { fun fromColor(color: Int): Color { val alpha: Int = (color shr 24) and 0xFF / 255 diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx index 2b891063f..6c2e077e6 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx @@ -40,9 +40,11 @@ const TextValue = styled.span(TextAttributeValueStyle); const EnumValue = styled.span(EnumAttributeValueStyle); const ObjectContainer = styled.div(ObjectContainerStyle); const CenteredContentContainer = styled.div(AutoMarginStyle); + type NamedAttributeInspectorProps = { name: string; }; + const NamedAttributeInspector: React.FC = ({ name, children, @@ -119,9 +121,10 @@ function create( ); case 'color': return ( - - - + ); case 'size': return ( diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/ColorInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/ColorInspector.tsx index 27054a841..6bc67cd5a 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/ColorInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/ColorInspector.tsx @@ -8,46 +8,65 @@ */ import React from 'react'; -import {Popover} from 'antd'; +import {Col, Popover, Row} from 'antd'; import {Color} from '../../../types'; -import {SketchPicker, RGBColor, ColorResult} from 'react-color'; +import {SketchPicker, ColorResult} from 'react-color'; import {styled} from 'flipper-plugin'; -import {ColorInnerButtonStyle, ColorOuterButtonStyle} from './Styles'; +import { + AutoMarginStyle, + ColorInnerButtonStyle, + ColorOuterButtonStyle, + NumberAttributeValueStyle, + ObjectContainerStyle, + RowStyle, +} from './Styles'; +import {theme} from 'flipper-plugin'; -type State = { - color: RGBColor; +type Props = { + name: string; + color: Color; }; +const DefaultColor: Color = { + r: 255, + g: 255, + b: 255, + a: 1, +}; + +const CenteredContentContainer = styled.div(AutoMarginStyle); +const ObjectContainer = styled.div(ObjectContainerStyle); +const NumberValue = styled.span(NumberAttributeValueStyle); const OuterColorButton = styled.div(ColorOuterButtonStyle); const InnerColorButton = styled.div(ColorInnerButtonStyle); -class ColorInspector extends React.Component<{color: Color}> { - state: State = { - color: this.props.color ?? { - r: 255, - g: 255, - b: 255, - a: 1, - }, - }; +const RGBA = styled.span({color: theme.semanticColors.numberValue}); +const RGBAtoHEX = (color: Color) => { + const hex = + (color.r | (1 << 8)).toString(16).slice(1) + + (color.g | (1 << 8)).toString(16).slice(1) + + (color.b | (1 << 8)).toString(16).slice(1); + + return '#' + hex.toUpperCase(); +}; + +class ColorPicker extends React.Component<{color: Color}> { handleChange = (_color: ColorResult) => { // No color changes to be applied at this stage. - // this.setState({color: color.rgb}); }; - render() { return ( + } trigger="click"> @@ -56,4 +75,64 @@ class ColorInspector extends React.Component<{color: Color}> { } } +const ColorHEX: React.FC<{color: Color}> = ({color}) => ( + {RGBAtoHEX(color)} +); + +const ColorRGBA: React.FC<{color: Color}> = ({color}) => ( + <> + r: {color.r} g: {color.g} b:{' '} + {color.b} a: {color.a} + +); + +class ColorInspector extends React.Component { + render() { + return ( + <> + + + {this.props.name} + + + + + + + + + + + Hex + + + + + + + + + + + + RGBA + + + + + + + + + + ); + } +} + export default ColorInspector; diff --git a/desktop/plugins/public/ui-debugger/types.tsx b/desktop/plugins/public/ui-debugger/types.tsx index f712ba4d1..d1df5635b 100644 --- a/desktop/plugins/public/ui-debugger/types.tsx +++ b/desktop/plugins/public/ui-debugger/types.tsx @@ -115,7 +115,7 @@ export type Color = { r: number; g: number; b: number; - alpha: number; + a: number; }; export type Snapshot = string; From c23f62219b1c4517ec09a2361144dac9fdbca504 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Wed, 23 Nov 2022 08:31:13 -0800 Subject: [PATCH 0313/1651] Rename raw attributes flag to rawEnabled Summary: ^ IMHO, this is a better name. ... and secretly make it enabled by default Reviewed By: LukeDefeo Differential Revision: D41495973 fbshipit-source-id: f287a4beadb70587ff43ac896213a20746dd8c22 --- .../components/sidebar/inspector/AttributesInspector.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx index 6c2e077e6..5b9c96bcf 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx @@ -210,13 +210,13 @@ type Props = { node: UINode; metadata: Map; mode: InspectorMode; - rawDisplayEnabled?: boolean; + rawEnabled?: boolean; }; export const AttributesInspector: React.FC = ({ node, metadata, mode, - rawDisplayEnabled = false, + rawEnabled = true, }) => { const keys = Object.keys(node.attributes); const sections = keys @@ -248,7 +248,7 @@ export const AttributesInspector: React.FC = ({ return ( <> {...sections} - {rawDisplayEnabled && ( + {rawEnabled && ( From bd92bb7faf47df9da317711e75723541b4ab36e1 Mon Sep 17 00:00:00 2001 From: Kevin Strider Date: Thu, 24 Nov 2022 05:37:59 -0800 Subject: [PATCH 0314/1651] Creating Plugins Summary: This diff includes minor changes to the pages within the Creating Plugins section of Flipper Docs. Reviewed By: passy Differential Revision: D41497503 fbshipit-source-id: 5c5718b63bfff18322b28b547724415ab40a1810 --- docs/extending/client-plugin-lifecycle.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/extending/client-plugin-lifecycle.mdx b/docs/extending/client-plugin-lifecycle.mdx index 4cdee5285..2d9fe7b6f 100644 --- a/docs/extending/client-plugin-lifecycle.mdx +++ b/docs/extending/client-plugin-lifecycle.mdx @@ -13,7 +13,7 @@ For both types of plugin, it's recommended you start work after the `onConnect` For regular plugins, `onConnect` and `onDisconnect` are triggered when the user opens the plugin in the Flipper UI, and when they switch to another plugin, respectively. The process is illustrated in the following diagram. -Regular Plugin Lifecycle diagram +Regular Plugin Lifecycle diagram ## Background Plugin Lifecycle @@ -21,8 +21,8 @@ For background plugins, `onConnect` is called when Flipper first connects, and ` Even for background plugins, `onDisconnect` and `onConnect` may be called on a plugin (such as if the user restarts Flipper). Plugins should handle this accordingly by making sure to resend any important data to the reconnected instance. The process is illustrated in the following diagram. +Background Plugin Lifecycle diagram + :::warning Note that a plugin must be enabled by the user for its messages to be queued up. ::: - -Background Plugin Lifecycle diagram From 11688f2f11c27bd46301eb9c601050361881d6a3 Mon Sep 17 00:00:00 2001 From: Kevin Strider Date: Thu, 24 Nov 2022 05:41:07 -0800 Subject: [PATCH 0315/1651] Setup - Part 1 Summary: This diff includes minor changes to the pages within the Setup section of Flipper Docs. Reviewed By: passy Differential Revision: D41472932 fbshipit-source-id: 41894bba63a91e90869423af1d3635ac3fa0c20f --- docs/getting-started/index.mdx | 4 ++-- docs/getting-started/troubleshooting/android.mdx | 16 ++++------------ docs/getting-started/troubleshooting/general.mdx | 4 ++-- docs/getting-started/troubleshooting/ios.mdx | 11 +++++------ .../troubleshooting/react-native.mdx | 2 +- .../troubleshooting/troubleshooting.mdx | 6 +++--- 6 files changed, 17 insertions(+), 26 deletions(-) diff --git a/docs/getting-started/index.mdx b/docs/getting-started/index.mdx index 4f0555f24..adae1c894 100644 --- a/docs/getting-started/index.mdx +++ b/docs/getting-started/index.mdx @@ -55,5 +55,5 @@ If you are hacking a JS app, you should be good to go without any extra dependen ## Troubleshooting -If you run into problems, take a look at the [troubleshooting](troubleshooting/troubleshooting.mdx) section. -Failing that, check [GitHub Issues](https://github.com/facebook/flipper/issues).the [Workplace group](https://fb.workplace.com/groups/230455004101832/). +If you run into problems, take a look at the [Troubleshooting](troubleshooting/troubleshooting.mdx) section. +Failing that, have a look at [GitHub Issues](https://github.com/facebook/flipper/issues).the [Flipper Support](https://fb.workplace.com/groups/230455004101832/). diff --git a/docs/getting-started/troubleshooting/android.mdx b/docs/getting-started/troubleshooting/android.mdx index bed074025..cc75c42b1 100644 --- a/docs/getting-started/troubleshooting/android.mdx +++ b/docs/getting-started/troubleshooting/android.mdx @@ -7,7 +7,7 @@ custom_edit_url: https://www.internalfb.com/intern/diffusion/FBS/browsefile/mast import InternalAndroid from './fb/_android.mdx'; -Flipper is a work in progress and issues may occur. This page contains known issues associated with the Android platform and provides steps you can take to try to resolve them. +Flipper is a 'work in progress' and issues may occur. This page contains known issues associated with the Android platform and provides steps you can take to try to resolve them. @@ -61,19 +61,11 @@ debugImplementation('com.facebook.flipper:flipper:*') { ## Duplicate class `com.facebook.jni.*` -This can occur when mixing different versions of [FBJNI](https://github.com/facebookincubator/fbjni), -a library we use to interact with native C++ code. +This can occur when mixing different versions of [FBJNI](https://github.com/facebookincubator/fbjni), a library we use to interact with native C++ code. -Speficially, this can happen when the versions `0.0.x` and `0.1.x` are mixed. Version `0.1.0` of FBJNI -switched to using [Google Prefab](https://google.github.io/prefab/) for distributing native artifacts, -which made the split into combined, "java-only" and "header" packages redundant and only requires -a single dependency in your projects. +Speficially, this can happen when the versions `0.0.x` and `0.1.x` are mixed. Version `0.1.0` of FBJNI switched to using [Google Prefab](https://google.github.io/prefab/) for distributing native artifacts, which made the split into combined, "java-only" and "header" packages redundant and only requires a single dependency in your projects. -When including both "fbjni-java-only:0.0.1" and "fbjni:0.1.0" in one project, you will now -duplicate class errors during the build process. You must ensure that only one of the two -versions is used in your entire dependency tree. Start by looking at `./gradlew :myapp:dependencies` -to see where the different version requirements come from. Then exclude the FBJNI dependency from -one of them, e.g. +When including both "fbjni-java-only:0.0.1" and "fbjni:0.1.0" in one project, you will now duplicate class errors during the build process. You must ensure that only one of the two versions is used in your entire dependency tree. Start by looking at `./gradlew :myapp:dependencies` to see where the different version requirements come from. Then exclude the FBJNI dependency from one of them, as follows: ```groovy implementation("com.facebook.react:react-native:+") { diff --git a/docs/getting-started/troubleshooting/general.mdx b/docs/getting-started/troubleshooting/general.mdx index 56fb5c2c4..d6f7a231f 100644 --- a/docs/getting-started/troubleshooting/general.mdx +++ b/docs/getting-started/troubleshooting/general.mdx @@ -7,7 +7,7 @@ custom_edit_url: https://www.internalfb.com/intern/diffusion/FBS/browsefile/mast import InternalGeneral from './fb/_general.mdx'; -Flipper is a work in progress and issues may occur. This page contains known issues associated with the Mac desktop apps and provides steps you can take to try to resolve them. +Flipper is a 'work in progress' and issues may occur. This page mostly contains general issues associated with the Mac desktop apps (Android is mentioned) and provides steps you can take to try to resolve them. @@ -50,4 +50,4 @@ can do this in Android Studio using the [Virtual Device Manager](https://develop For **iOS**, after installing Xcode, you should have a default set of simulators set up. However, it is possible to delete them and there is no easy way to restore them afterwards. You can use [a script like this one](https://gist.github.com/dynamicguy/e8756a9f0f50af86d6e746d4b1ab6a09) to -recreate the default set. \ No newline at end of file +recreate the default set. diff --git a/docs/getting-started/troubleshooting/ios.mdx b/docs/getting-started/troubleshooting/ios.mdx index d75b6cc0f..c45b0c293 100644 --- a/docs/getting-started/troubleshooting/ios.mdx +++ b/docs/getting-started/troubleshooting/ios.mdx @@ -5,6 +5,8 @@ sidebar_label: iOS Issues custom_edit_url: https://www.internalfb.com/intern/diffusion/FBS/browsefile/master/xplat/sonar/docs/getting-started/troubleshooting/ios.mdx --- +Flipper is a 'work in progress' and issues may occur. This page contains known issues associated with the iOS platform and provides steps you can take to try to resolve them. + import InternalIos from './fb/_ios.mdx'; @@ -17,17 +19,14 @@ You'll need to manually add this [ViewController](https://github.com/facebook/fl ## iOS device not showing up -- Make sure [`idb`](https://fbidb.io/docs/installation) is installed and configured in the Flipper settings. +Make sure [idb](https://fbidb.io/docs/installation) is installed and configured in the Flipper settings. ## iOS simulator device not showing up -Ensure that your simulator is on the same version as selected in `xcode-select`. -You can do that by checking that commands `ps aux | grep CoreSimulator` and `xcode-select -p` shows the same Xcode version. -If not, update the xcode version by sudo `xcode-select --switch ` +Ensure that your simulator is on the same version as selected in `xcode-select`. You can do that by checking that commands `ps aux | grep CoreSimulator` and `xcode-select -p` shows the same Xcode version. If not, update the xcode version by sudo `xcode-select --switch ` ## iOS app connection error "Connection failed. Failed to find device..." -If during connecting iOS app to Flipper you see error message "Connection failed. Failed to find device while trying to connect app" - -try executing `idb kill` on a terminal and restarting Flipper as workaround to reset idb state. +If during connecting iOS app to Flipper you see error message "Connection failed. Failed to find device while trying to connect app" - try executing `idb kill` on a terminal and restarting Flipper as workaround to reset idb state. diff --git a/docs/getting-started/troubleshooting/react-native.mdx b/docs/getting-started/troubleshooting/react-native.mdx index 45eee1b7f..26083aaa7 100644 --- a/docs/getting-started/troubleshooting/react-native.mdx +++ b/docs/getting-started/troubleshooting/react-native.mdx @@ -8,7 +8,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl'; import InternalReactNative from './fb/_react-native.mdx'; -Flipper is a work in progress and issues may occur. This page contains known issues associated with React Native and provides steps you can take to try to resolve them. +Flipper is a 'work in progress' and issues may occur. This page contains known issues associated with React Native and provides steps you can take to try to resolve them. Make sure the project is using the [latest Flipper SDK](getting-started/react-native.mdx#using-the-latest-flipper-sdk). diff --git a/docs/getting-started/troubleshooting/troubleshooting.mdx b/docs/getting-started/troubleshooting/troubleshooting.mdx index 341062eb3..c3566d7c3 100644 --- a/docs/getting-started/troubleshooting/troubleshooting.mdx +++ b/docs/getting-started/troubleshooting/troubleshooting.mdx @@ -7,15 +7,15 @@ custom_edit_url: https://www.internalfb.com/intern/diffusion/FBS/browsefile/mast import InternalTroubleshooting from './fb/_troubleshooting.mdx'; -Flipper is a work in progress and, as such, there's a chance that issues may occur while you're using it. +Flipper is a 'work in progress' and, as such, there's a chance that issues may occur while you're using it. -The 'troubleshooting' section contains known issues that have occurred within various Flipper environments and the steps you can take if you encounter them. +This 'troubleshooting' section contains known issues that have occurred within various Flipper environments and the steps you can take if you encounter them. ## How to file an issue or ask a question? -If you are still blocked after checking Troubleshooting guide you may file an issue on [GitHub](https://github.com/facebook/flipper/issues) +If you are still blocked after checking Troubleshooting guide you may file an issue on [GitHub](https://github.com/facebook/flipper/issues) with the chrome DevTools logs and the output from the diagnostics screen, if relevant. From 98d2f37f10401eb96565df3fa7632bc423eb3f39 Mon Sep 17 00:00:00 2001 From: Kevin Strider Date: Thu, 24 Nov 2022 06:18:36 -0800 Subject: [PATCH 0316/1651] Setup - Part 2 Summary: This diff includes minor changes to the pages within the Setup section of Flipper Docs. Reviewed By: mweststrate Differential Revision: D41496698 fbshipit-source-id: a338931bd08e474ee348e25798463647f9a0be29 --- desktop/plugins/public/crash_reporter/docs/setup.mdx | 4 ++-- desktop/plugins/public/fresco/docs/setup.mdx | 2 +- desktop/plugins/public/leak_canary/docs/setup.mdx | 2 +- desktop/plugins/public/navigation/docs/setup.mdx | 4 ++-- docs/custom-ports.mdx | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/desktop/plugins/public/crash_reporter/docs/setup.mdx b/desktop/plugins/public/crash_reporter/docs/setup.mdx index 47eaefe4f..4099cdfaf 100644 --- a/desktop/plugins/public/crash_reporter/docs/setup.mdx +++ b/desktop/plugins/public/crash_reporter/docs/setup.mdx @@ -10,7 +10,7 @@ In order to send custom notifications, take the steps detailed below. ## Android -Instantiate and add the plugin in `FlipperClient`. +1. Instantiate and add the plugin in `FlipperClient`. ```java import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; @@ -18,7 +18,7 @@ import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; client.addPlugin(CrashReporterPlugin.getInstance()); ``` -Use the following API to trigger your custom crash notification. +2. Use the following API to trigger your custom crash notification. ```java import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; diff --git a/desktop/plugins/public/fresco/docs/setup.mdx b/desktop/plugins/public/fresco/docs/setup.mdx index b47478566..aff899d41 100644 --- a/desktop/plugins/public/fresco/docs/setup.mdx +++ b/desktop/plugins/public/fresco/docs/setup.mdx @@ -1,7 +1,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl'; import Link from '@docusaurus/Link'; -Currently, the Image plugin only supports [Fresco](https://frescolib.org/) for Android as backend. +Currently, the Images plugin only supports [Fresco](https://frescolib.org/) for Android as backend. If you'd like to see support for other image loading libraries, please post your request in the [Flipper Support](https://fb.workplace.com/groups/flippersupport) Workplace group. diff --git a/desktop/plugins/public/leak_canary/docs/setup.mdx b/desktop/plugins/public/leak_canary/docs/setup.mdx index 7964e6d4c..a9fa9fb8a 100644 --- a/desktop/plugins/public/leak_canary/docs/setup.mdx +++ b/desktop/plugins/public/leak_canary/docs/setup.mdx @@ -2,7 +2,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl'; import Link from '@docusaurus/Link'; -To setup the Leak Canary plugin, take the following steps: +To setup the LeakCanary plugin, take the following steps: 1. Ensure that you have an explicit dependency in your application's `build.gradle` including the plugin dependency, such as is shown in the following snippet: diff --git a/desktop/plugins/public/navigation/docs/setup.mdx b/desktop/plugins/public/navigation/docs/setup.mdx index b552f261c..2abdf2db3 100644 --- a/desktop/plugins/public/navigation/docs/setup.mdx +++ b/desktop/plugins/public/navigation/docs/setup.mdx @@ -18,7 +18,7 @@ This enables the Navigation Plugin to be integrated into existing navigation fra ### Using Android deep links -The Navigation Plugin can be used with built in [deep links for Android](https://developer.android.com/training/app-links/deep-linking). +The Navigation Plugin can be used with built-in [Deep Links for Android](https://developer.android.com/training/app-links/deep-linking). To deep link to an activity, edit the AndroidManifest.xml and add the intent filter for the given activity, as follows: @@ -50,7 +50,7 @@ The Navigation Plugin can easily be integrated into a third-party navigation fra #### AirBnB deep link dispatch -[Deep Link Dispatch](https://github.com/airbnb/DeepLinkDispatch) will work out of the box with Flipper for navigating to links, including support for url parameters. +[DeepLinkDispatch](https://github.com/airbnb/DeepLinkDispatch) will work out of the box with Flipper for navigating to links, including support for url parameters. To add logging, simply add a BroadcastReceiver to your app that is called on any incoming deep links: diff --git a/docs/custom-ports.mdx b/docs/custom-ports.mdx index b30a33c61..e108e9b5e 100644 --- a/docs/custom-ports.mdx +++ b/docs/custom-ports.mdx @@ -6,7 +6,7 @@ sidebar_label: Running Flipper with Custom Ports ## Flipper ports - mobile apps that support certificate exchange -:::information +:::info By default, Flipper runs its servers on ports 9088 and 9089. The mobile SDKs look for servers on those ports. ::: From 89740f7e0a1055578729c13344c50b4028a97754 Mon Sep 17 00:00:00 2001 From: Kevin Strider Date: Thu, 24 Nov 2022 06:18:38 -0800 Subject: [PATCH 0317/1651] Features Summary: This diff includes minor changes to the pages within the Features section of Flipper Docs. Reviewed By: passy Differential Revision: D41471000 fbshipit-source-id: 0a414d1e5e0cff5d874d3fe6eab647c3877b9caf --- .../plugins/public/crash_reporter/docs/overview.mdx | 2 +- desktop/plugins/public/fresco/docs/overview.mdx | 4 ++-- desktop/plugins/public/layout/docs/overview.mdx | 4 +--- desktop/plugins/public/logs/docs/overview.mdx | 2 +- desktop/plugins/public/navigation/docs/overview.mdx | 7 +++++-- docs/features/index.mdx | 12 ++++++++---- 6 files changed, 18 insertions(+), 13 deletions(-) diff --git a/desktop/plugins/public/crash_reporter/docs/overview.mdx b/desktop/plugins/public/crash_reporter/docs/overview.mdx index f6054e055..daffef9d7 100644 --- a/desktop/plugins/public/crash_reporter/docs/overview.mdx +++ b/desktop/plugins/public/crash_reporter/docs/overview.mdx @@ -1,6 +1,6 @@ import useBaseUrl from '@docusaurus/useBaseUrl'; -The Crash Reporter Plugin shows a notification in Flipper whenever an app crashes. You can click on the notification to see crash information such as stacktrace and other metadata. +The Crash Reporter plugin shows a notification in Flipper whenever an app crashes. You can click on the notification to see crash information such as stacktrace and other metadata. For Android, clicking on the 'Open in Logs' button jumps to the relevant row in the Logs plugin containing the crash information, as shown in the following screenshots. diff --git a/desktop/plugins/public/fresco/docs/overview.mdx b/desktop/plugins/public/fresco/docs/overview.mdx index 71b7bb19f..6b160b36d 100644 --- a/desktop/plugins/public/fresco/docs/overview.mdx +++ b/desktop/plugins/public/fresco/docs/overview.mdx @@ -12,8 +12,8 @@ Images are grouped by the different caching layers they are stored in. The curre ## Attribution -Images can be annotated with attributes that can help to determine the context in which an image was loaded and displayed. You can use that information to filter by a particular surface or only inspect images that are in the critical path of your application, for instance during a cold start. +Images can be annotated with attributes that can help to determine the context in which an image was loaded and displayed. You can use that information to filter by a particular surface or only inspect images that are in the critical path of your application (such as during a cold start). ## Leak Tracking -Dealing with large resources can require special APIs to be used that circumvent usual garbage collection. The plugin allows tracking `CloseableReference`s for Fresco on Android that weren't properly closed, which can help you improve the performance of your app. +Dealing with large resources can require special APIs to be used that circumvent usual garbage collection. The plugin enables the tracking of `CloseableReference`s for Fresco on Android that weren't properly closed, which can help you improve the performance of your app. diff --git a/desktop/plugins/public/layout/docs/overview.mdx b/desktop/plugins/public/layout/docs/overview.mdx index 6a4489ddd..fde245b9f 100644 --- a/desktop/plugins/public/layout/docs/overview.mdx +++ b/desktop/plugins/public/layout/docs/overview.mdx @@ -1,8 +1,6 @@ import useBaseUrl from '@docusaurus/useBaseUrl'; -The Layout Inspector in Flipper is useful for a wide variety of debugging scenarios. - -You can inspect what views the hierarchy is made up of as well as what properties each view has; this is incredibly useful when debugging issues with your product. +The Layout Inspector is useful for a wide variety of debugging scenarios. You can inspect what views the hierarchy is made up of as well as what properties each view has; this is incredibly useful when debugging issues with your product. In addition to Flipper, the Layout tab supports [Litho](https://fblitho.com) and [ComponentKit](https://componentkit.org) components; it integrates with these frameworks to present components in the hierarchy just as if they were native views, exposing all the layout properties, props, and state of the components. The Layout Inspector is further extensible to support other UI frameworks. diff --git a/desktop/plugins/public/logs/docs/overview.mdx b/desktop/plugins/public/logs/docs/overview.mdx index 3fabf0500..c93e207dd 100644 --- a/desktop/plugins/public/logs/docs/overview.mdx +++ b/desktop/plugins/public/logs/docs/overview.mdx @@ -18,6 +18,6 @@ Clicking on a tag, PID or TID in the table filters only for logs with the same v ### Expression Watcher -The Expression Watcher () in the sidebar can be used to 'watch' for certain logs to happen and count how often they occur. An expression can be a simple string, or a regular expression, matched against the logs. +The Expression Watcher in the sidebar can be used to 'watch' for certain logs to happen and count how often they occur. An expression can be a simple string, or a regular expression, matched against the logs. When the notify checkbox is enabled, Flipper sends notifications once the log is being processed. This lets you know when the 'watcher' triggered, even if Flipper is in the background. diff --git a/desktop/plugins/public/navigation/docs/overview.mdx b/desktop/plugins/public/navigation/docs/overview.mdx index 1ce99d050..3aaa1438e 100644 --- a/desktop/plugins/public/navigation/docs/overview.mdx +++ b/desktop/plugins/public/navigation/docs/overview.mdx @@ -1,9 +1,12 @@ import useBaseUrl from '@docusaurus/useBaseUrl'; -The Navigation Plugin enables users to quickly navigate to deep links within their mobile applications to help speed up the development cycle. The plugin is designed to integrate easily within your existing navigation framework or as a standalone tool. Users can bookmark deep links and jump to them via the button in the tool bar, as shown in the following screenshot. +The Navigation Plugin enables users to quickly navigate to deep links within their mobile applications to help speed up the development cycle. The plugin is designed to integrate easily within your existing navigation framework or as a standalone tool. + +Users can bookmark deep links and jump to them via the button in the tool bar, as shown in the following screenshot. Navigation Plugin Button -Navigation events within the app can also be logged to Flipper. This enables the user to view past navigation events and jump straight to them (see the following screenshot) or export the navigation events for reporting. + +Navigation events within the app can also be logged to Flipper, which enables the user to view past navigation events and jump straight to them (see the following screenshot) or export the navigation events for reporting. Navigation Plugin UI diff --git a/docs/features/index.mdx b/docs/features/index.mdx index 54238bd00..4489459f9 100644 --- a/docs/features/index.mdx +++ b/docs/features/index.mdx @@ -1,15 +1,19 @@ --- id: index -title: Features +title: Introduction --- import useBaseUrl from '@docusaurus/useBaseUrl'; -Flipper itself only provides the architectural platform. What makes it useful are the plugins built on top of it: [Logs](plugins/device-logs.mdx), [Layout Inspector](plugins/inspector.mdx) and [Network Inspector](plugins/network.mdx) are all plugins. Plugins can be built very specific to your business logic and the use-cases you have in your app. Flipper is shipped with a couple of built-in all-purpose plugins, but you're encouraged to [build your own](#build-your-own-plugin). Each plugin needs to be enabled individually. +Flipper itself only provides the architectural platform. What makes it useful are the plugins built on top of it, such as [Logs](plugins/device-logs.mdx), [Layout Inspector](plugins/inspector.mdx) and [Network Inspector](plugins/network.mdx). + +Plugins can be tailored to your business logic and the use-cases you have in your app. Flipper is shipped with a couple of built-in all-purpose plugins, but you're encouraged to build your own (see below). Each plugin needs to be enabled individually. Plugins ## Build your own plugin -The Flipper desktop app and the mobile native SDK establish a connection which is used to send data to and from the device. Flipper does not make any restrictions on what kind of data is being sent. This enables a lot of different use-cases where you want to better understand what is going inside your app. For example you can visualize the state of local caches, events happening or trigger actions on your app from the desktop. +The Flipper desktop app and the mobile native SDK establish a connection that is used to send data to and from the device. Flipper does not make any restrictions on what kind of data is being sent. This enables a lot of different use-cases where you want to better understand what is going inside your app. For example, you can visualize the state of local caches, events happening or trigger actions on your app from the desktop. -If there is no plugin that does exactly what you want, then you can build your own plugin tailored to your needs. A plugin always consists of the native implementation sending and receiving data and the desktop plugin visualizing data. To learn more and build your own plugin, see the [extend Flipper](../tutorial/intro.mdx) page. The native implementations are written in Java, Objective-C, or C++, the desktop UI is written in React. +If there is no plugin that does exactly what you want, you can build your own plugin tailored to your needs. A plugin always consists of the native implementation sending and receiving data and the desktop plugin visualizing data: the native implementations are written in Java, Objective-C, or C++, the desktop UI is written in React. + +To learn more and build your own plugin, see the [Creating Plugins](../tutorial/intro.mdx) section of the Flipper Docs. From 43f44652f43de1cfb5786c73cab04abb10bde498 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Thu, 24 Nov 2022 07:14:55 -0800 Subject: [PATCH 0318/1651] Change snapshots format to png Summary: There was an issue whereas snapshots were not properly rendered on retina devices. After running a few tests, the issue seems to be solved by changing the snapshot format from jpeg to png. Reviewed By: antonk52 Differential Revision: D41520939 fbshipit-source-id: 1563fe89162e41f71418357a7e58caaf46581f04 --- .../flipper/plugins/uidebugger/observers/TreeObserverManager.kt | 2 +- .../plugins/public/ui-debugger/components/Visualization2D.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index f5e1adfc8..3e974358a 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -115,7 +115,7 @@ class TreeObserverManager(val context: Context) { } else { val stream = ByteArrayOutputStream() val base64Stream = Base64OutputStream(stream, Base64.DEFAULT) - treeUpdate.snapshot.bitmap?.compress(Bitmap.CompressFormat.JPEG, 100, base64Stream) + treeUpdate.snapshot.bitmap?.compress(Bitmap.CompressFormat.PNG, 100, base64Stream) val snapshot = stream.toString() serialized = Json.encodeToString( diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index 40d0cc704..e034a812f 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -212,7 +212,7 @@ function Visualization2DNode({ {snapshot && ( )} From d101bf4eaa023348c31d1b0ff0b324abc73db1d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Nov 2022 08:35:35 -0800 Subject: [PATCH 0319/1651] Bump rules from 1.4.0 to 1.5.0 (#4311) Summary: Bumps rules from 1.4.0 to 1.5.0. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=androidx.test:rules&package-manager=gradle&previous-version=1.4.0&new-version=1.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) ---
Dependabot commands and options
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)
Pull Request resolved: https://github.com/facebook/flipper/pull/4311 Reviewed By: antonk52 Differential Revision: D41472307 Pulled By: passy fbshipit-source-id: c2b9c7e771051c1098fd7c8fd1f38672e83db581 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index fd92a4482..2e83761ed 100644 --- a/build.gradle +++ b/build.gradle @@ -106,7 +106,7 @@ ext.deps = [ leakcanary2 : 'com.squareup.leakcanary:leakcanary-android:2.8.1', protobuf : 'com.google.protobuf:protobuf-java:3.21.8', testCore : 'androidx.test:core:1.4.0', - testRules : 'androidx.test:rules:1.4.0', + testRules : 'androidx.test:rules:1.5.0', // Plugin dependencies frescoFlipper : 'com.facebook.fresco:flipper:2.6.0', frescoStetho : 'com.facebook.fresco:stetho:2.6.0', From 8c0f07f4bdff55d8e53f4daa4975c9858a0758a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Nov 2022 08:37:04 -0800 Subject: [PATCH 0320/1651] Bump espresso-intents from 3.4.0 to 3.5.0 (#4310) Summary: Bumps espresso-intents from 3.4.0 to 3.5.0. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=androidx.test.espresso:espresso-intents&package-manager=gradle&previous-version=3.4.0&new-version=3.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) ---
Dependabot commands and options
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)
Pull Request resolved: https://github.com/facebook/flipper/pull/4310 Reviewed By: antonk52 Differential Revision: D41472303 Pulled By: passy fbshipit-source-id: 89aa6aa62f5917c58b4ca7ce5a55099b971ad5c7 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2e83761ed..e2eab2c13 100644 --- a/build.gradle +++ b/build.gradle @@ -64,7 +64,7 @@ ext.deps = [ supportConstraintLayout: "androidx.constraintlayout:constraintlayout:2.1.4", supportSqlite : "androidx.sqlite:sqlite-framework:2.2.0", supportEspresso : 'androidx.test.espresso:espresso-core:3.4.0', - supportEspressoIntents : 'androidx.test.espresso:espresso-intents:3.4.0', + supportEspressoIntents : 'androidx.test.espresso:espresso-intents:3.5.0', supportTestRunner : 'androidx.test:runner:1.4.0', // Arch archPaging : 'android.arch.paging:runtime:1.0.1', From 6643ff1296846b204295fe7454f8c51f8659941e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Nov 2022 08:40:32 -0800 Subject: [PATCH 0321/1651] Bump com.github.ben-manes.versions from 0.42.0 to 0.44.0 (#4312) Summary: Bumps com.github.ben-manes.versions from 0.42.0 to 0.44.0. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.github.ben-manes.versions&package-manager=gradle&previous-version=0.42.0&new-version=0.44.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) ---
Dependabot commands and options
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)
Pull Request resolved: https://github.com/facebook/flipper/pull/4312 Reviewed By: antonk52 Differential Revision: D41472327 Pulled By: passy fbshipit-source-id: 44caad58d885c2df2bb2a0124c3406b43016fd95 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e2eab2c13..a36b9bda1 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ buildscript { plugins { id 'de.undercouch.download' version '5.2.1' - id 'com.github.ben-manes.versions' version '0.42.0' + id 'com.github.ben-manes.versions' version '0.44.0' } ext.isSnapshot = { VERSION_NAME.endsWith('-SNAPSHOT') } From 11b12b4e3846a3ff7279df924658b0fd9c7ee86c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Nov 2022 09:08:50 -0800 Subject: [PATCH 0322/1651] Bump @typescript-eslint/parser from 5.39.0 to 5.43.0 in /js/js-flipper (#4327) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.39.0 to 5.43.0.
Release notes

Sourced from @​typescript-eslint/parser's releases.

v5.43.0

5.43.0 (2022-11-14)

Bug Fixes

  • eslint-plugin: [no-shadow] handle false positives on generics and parameters (#5902) (769e8c8)
  • eslint-plugin: [promise-function-async] handle keyword token (#5907) (f25a94f)

Features

  • eslint-plugin: [consistent-type-imports] support fixing to inline types (#5050) (75dcdf1)
  • eslint-plugin: [naming-convention] add support for "override" and "async" modifiers (#5310) (#5610) (c759da1)
  • eslint-plugin: [prefer-optional-chain] support suggesting !foo || !foo.bar as a valid match for the rule (#5594) (923d486)

v5.42.1

5.42.1 (2022-11-07)

Bug Fixes

  • ast-spec: correct misnamed ExportNamedDeclaration AST type (#5913) (e88f4fa)
  • eslint-plugin: isTypeReadonly stack overflow (#5875) (#5876) (2d9a33c)

v5.42.0

5.42.0 (2022-10-31)

Bug Fixes

  • ast-spec: add TSQualifiedName to TypeNode union (#5906) (5c316c1)
  • eslint-plugin: [no-extra-parens] handle type assertion in extends clause (#5901) (8ed7219)
  • typescript-estree: don't allow single-run unless we're in type-aware linting mode (#5893) (891b087)

Features

  • eslint-plugin: [member-ordering] add natural sort order (#5662) (1eaae09)
  • eslint-plugin: [no-invalid-void-type] better report message for void used as a constituent inside a function return type (#5274) (d806bda)
  • typescript-estree: clarify docs and error for program project without matching TSConfig (#5762) (67744db)
  • utils: add RuleTester API for top-level dependency constraints (#5896) (0520d53)

v5.41.0

5.41.0 (2022-10-24)

... (truncated)

Changelog

Sourced from @​typescript-eslint/parser's changelog.

5.43.0 (2022-11-14)

Note: Version bump only for package @​typescript-eslint/parser

5.42.1 (2022-11-07)

Note: Version bump only for package @​typescript-eslint/parser

5.42.0 (2022-10-31)

Features

Reverts

5.41.0 (2022-10-24)

Note: Version bump only for package @​typescript-eslint/parser

5.40.1 (2022-10-17)

Note: Version bump only for package @​typescript-eslint/parser

5.40.0 (2022-10-10)

Note: Version bump only for package @​typescript-eslint/parser

Commits
  • 8af1b4d chore: publish v5.43.0
  • b8b24c2 chore: publish v5.42.1
  • 1e5e9ea chore: publish v5.42.0
  • 2ee81df Revert "feat(scope-manager): ignore ECMA version" (#5888)
  • 3b8d449 feat(scope-manager): ignore ECMA version (#5881)
  • fcf3f9d docs: Mention wide globs performance implications in monorepos docs and parse...
  • 9eea5f4 chore: publish v5.41.0
  • 0be356b chore: publish v5.40.1
  • 56f89d6 chore: nx migrate latest (14.8.4) (#5798)
  • 6ac0aa7 chore: publish v5.40.0
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@typescript-eslint/parser&package-manager=npm_and_yarn&previous-version=5.39.0&new-version=5.43.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) ---
Dependabot commands and options
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)
Pull Request resolved: https://github.com/facebook/flipper/pull/4327 Reviewed By: antonk52 Differential Revision: D41472367 Pulled By: passy fbshipit-source-id: 2f78282b41b0bb9c57b20585d781562ccba4f45f --- js/js-flipper/yarn.lock | 46 +++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/js/js-flipper/yarn.lock b/js/js-flipper/yarn.lock index f86e079a2..5205df862 100644 --- a/js/js-flipper/yarn.lock +++ b/js/js-flipper/yarn.lock @@ -809,13 +809,13 @@ tsutils "^3.21.0" "@typescript-eslint/parser@^5.27.1": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.39.0.tgz#93fa0bc980a3a501e081824f6097f7ca30aaa22b" - integrity sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA== + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.43.0.tgz#9c86581234b88f2ba406f0b99a274a91c11630fd" + integrity sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug== dependencies: - "@typescript-eslint/scope-manager" "5.39.0" - "@typescript-eslint/types" "5.39.0" - "@typescript-eslint/typescript-estree" "5.39.0" + "@typescript-eslint/scope-manager" "5.43.0" + "@typescript-eslint/types" "5.43.0" + "@typescript-eslint/typescript-estree" "5.43.0" debug "^4.3.4" "@typescript-eslint/scope-manager@5.39.0": @@ -826,6 +826,14 @@ "@typescript-eslint/types" "5.39.0" "@typescript-eslint/visitor-keys" "5.39.0" +"@typescript-eslint/scope-manager@5.43.0": + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz#566e46303392014d5d163704724872e1f2dd3c15" + integrity sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw== + dependencies: + "@typescript-eslint/types" "5.43.0" + "@typescript-eslint/visitor-keys" "5.43.0" + "@typescript-eslint/type-utils@5.39.0": version "5.39.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz#0a8c00f95dce4335832ad2dc6bc431c14e32a0a6" @@ -841,6 +849,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.39.0.tgz#f4e9f207ebb4579fd854b25c0bf64433bb5ed78d" integrity sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw== +"@typescript-eslint/types@5.43.0": + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.43.0.tgz#e4ddd7846fcbc074325293515fa98e844d8d2578" + integrity sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg== + "@typescript-eslint/typescript-estree@5.39.0": version "5.39.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz#c0316aa04a1a1f4f7f9498e3c13ef1d3dc4cf88b" @@ -854,6 +867,19 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.43.0": + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz#b6883e58ba236a602c334be116bfc00b58b3b9f2" + integrity sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg== + dependencies: + "@typescript-eslint/types" "5.43.0" + "@typescript-eslint/visitor-keys" "5.43.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + "@typescript-eslint/utils@5.39.0": version "5.39.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.39.0.tgz#b7063cca1dcf08d1d21b0d91db491161ad0be110" @@ -874,6 +900,14 @@ "@typescript-eslint/types" "5.39.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@5.43.0": + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz#cbbdadfdfea385310a20a962afda728ea106befa" + integrity sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg== + dependencies: + "@typescript-eslint/types" "5.43.0" + eslint-visitor-keys "^3.3.0" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" From 3722ac1feaa0e28dddad7ac9d46d287c13800fe2 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Thu, 24 Nov 2022 09:23:16 -0800 Subject: [PATCH 0323/1651] Permanent search bar Summary: Out of the box the library search has some issues. when search matches it steals focus from the input. Eventually we want to customise the rendering of the tree items anyway so this lays the foundation for taht Reviewed By: antonk52 Differential Revision: D41336524 fbshipit-source-id: 194f67023edd0675cd9bd8d6134260439c6b2785 --- .../flipper-plugin/src/__tests__/api.node.tsx | 3 + desktop/flipper-plugin/src/index.tsx | 7 +- .../public/ui-debugger/components/Tree.tsx | 219 ++++++++++++------ .../public/ui-debugger/components/main.tsx | 22 +- desktop/plugins/public/ui-debugger/index.tsx | 2 + docs/extending/flipper-plugin.mdx | 23 ++ 6 files changed, 202 insertions(+), 74 deletions(-) diff --git a/desktop/flipper-plugin/src/__tests__/api.node.tsx b/desktop/flipper-plugin/src/__tests__/api.node.tsx index 0af03ab3d..cd41a058e 100644 --- a/desktop/flipper-plugin/src/__tests__/api.node.tsx +++ b/desktop/flipper-plugin/src/__tests__/api.node.tsx @@ -39,6 +39,8 @@ test('Correct top level API exposed', () => { "Dialog", "ElementsInspector", "FileSelector", + "HighlightContext", + "HighlightProvider", "Layout", "MarkerTimeline", "MasterDetail", @@ -67,6 +69,7 @@ test('Correct top level API exposed', () => { "textContent", "theme", "timeout", + "useHighlighter", "useLocalStorageState", "useLogger", "useMemoize", diff --git a/desktop/flipper-plugin/src/index.tsx b/desktop/flipper-plugin/src/index.tsx index 0c71c42e7..9fdb4e898 100644 --- a/desktop/flipper-plugin/src/index.tsx +++ b/desktop/flipper-plugin/src/index.tsx @@ -70,7 +70,12 @@ export {Tabs, Tab} from './ui/Tabs'; export {useLocalStorageState} from './utils/useLocalStorageState'; export {FileSelector} from './ui/FileSelector'; -export {HighlightManager} from './ui/Highlight'; +export { + HighlightManager, + HighlightContext, + HighlightProvider, + useHighlighter, +} from './ui/Highlight'; export { DataValueExtractor, DataInspectorExpanded, diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 4b3102c9c..95604fe9c 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -13,14 +13,23 @@ import { Tree as ComplexTree, ControlledTreeEnvironment, TreeItem, + TreeInformation, + TreeItemRenderContext, + InteractionMode, + TreeEnvironmentRef, } from 'react-complex-tree'; import {plugin} from '../index'; -import {usePlugin, useValue} from 'flipper-plugin'; import { - InteractionMode, - TreeEnvironmentRef, -} from 'react-complex-tree/lib/esm/types'; + usePlugin, + useValue, + HighlightManager, + HighlightProvider, + HighlightContext, + useHighlighter, + theme, +} from 'flipper-plugin'; + import {head} from 'lodash'; export function Tree(props: { @@ -32,77 +41,155 @@ export function Tree(props: { const instance = usePlugin(plugin); const expandedItems = useValue(instance.treeState).expandedNodes; const items = useMemo(() => toComplexTree(props.nodes), [props.nodes]); - const hoveredNodes = useValue(instance.hoveredNodes); - const treeRef = useRef(); + const treeEnvRef = useRef(); + + const searchTerm = useValue(instance.searchTerm); useEffect(() => { //this makes the keyboard arrow controls work always, even when using the visualiser - treeRef.current?.focusTree('tree', true); - }, [hoveredNodes, props.selectedNode]); - return ( - item.data.name} - canRename={false} - canDragAndDrop={false} - canSearch - autoFocus - viewState={{ - tree: { - focusedItem: head(hoveredNodes), - expandedItems, - selectedItems: props.selectedNode ? [props.selectedNode] : [], - }, - }} - onFocusItem={(item) => { - instance.hoveredNodes.set([item.index]); - }} - onExpandItem={(item) => { - instance.treeState.update((draft) => { - draft.expandedNodes.push(item.index); - }); - }} - onCollapseItem={(item) => - instance.treeState.update((draft) => { - draft.expandedNodes = draft.expandedNodes.filter( - (expandedItemIndex) => expandedItemIndex !== item.index, - ); - }) - } - onSelectItems={(items) => props.onSelectNode(items[0])} - defaultInteractionMode={{ - mode: 'custom', - extends: InteractionMode.DoubleClickItemToExpand, - createInteractiveElementProps: ( - item, - treeId, - actions, - renderFlags, - ) => ({ - onClick: () => { - if (renderFlags.isSelected) { - actions.unselectItem(); - } else { - actions.selectItem(); - } - }, + treeEnvRef.current?.focusTree('tree', true); + }, [props.selectedNode]); - onMouseOver: () => { - instance.hoveredNodes.set([item.index]); + return ( + + item.data.name} + canRename={false} + canDragAndDrop={false} + viewState={{ + tree: { + focusedItem: head(hoveredNodes), + expandedItems, + selectedItems: props.selectedNode ? [props.selectedNode] : [], }, - }), - }}> - - + }} + onFocusItem={(item) => { + instance.hoveredNodes.set([item.index]); + }} + onExpandItem={(item) => { + instance.treeState.update((draft) => { + draft.expandedNodes.push(item.index); + }); + }} + onCollapseItem={(item) => + instance.treeState.update((draft) => { + draft.expandedNodes = draft.expandedNodes.filter( + (expandedItemIndex) => expandedItemIndex !== item.index, + ); + }) + } + renderItem={renderItem} + onSelectItems={(items) => props.onSelectNode(items[0])} + defaultInteractionMode={{ + mode: 'custom', + extends: InteractionMode.DoubleClickItemToExpand, + createInteractiveElementProps: ( + item, + treeId, + actions, + renderFlags, + ) => ({ + onClick: () => { + if (renderFlags.isSelected) { + actions.unselectItem(); + } else { + actions.selectItem(); + } + }, + + onMouseOver: () => { + instance.hoveredNodes.set([item.index]); + }, + }), + }}> + + + ); } +//copied from https://github.com/lukasbach/react-complex-tree/blob/e3dcc435933284376a0fc6e3cc651e67ead678b5/packages/core/src/renderers/createDefaultRenderers.tsx +const cx = (...classNames: Array) => + classNames.filter((cn) => !!cn).join(' '); +const renderDepthOffset = 5; + +function renderItem({ + item, + depth, + children, + arrow, + context, +}: { + item: TreeItem; + depth: number; + children: React.ReactNode | null; + title: React.ReactNode; + arrow: React.ReactNode; + context: TreeItemRenderContext; + info: TreeInformation; +}) { + return ( +
  • +
    + {arrow} +
    + +
    +
    + {children} +
  • + ); +} + +function HighlightedText(props: {text: string}) { + const highlightManager: HighlightManager = useHighlighter(); + return {highlightManager.render(props.text)}; +} + function toComplexTree(nodes: Map): Record> { const res: Record> = {}; for (const node of nodes.values()) { diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 0c4b45cbe..367aea63a 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -17,6 +17,7 @@ import {Tree} from './Tree'; import {Visualization2D} from './Visualization2D'; import {useKeyboardModifiers} from '../hooks/useKeyboardModifiers'; import {Inspector} from './sidebar/Inspector'; +import {Input} from 'antd'; export function Component() { const instance = usePlugin(plugin); @@ -30,6 +31,7 @@ export function Component() { useHotkeys('ctrl+i', () => setShowPerfStats((show) => !show)); + const searchTerm = useValue(instance.searchTerm); const {ctrlPressed} = useKeyboardModifiers(); function renderSidebar( @@ -51,14 +53,20 @@ export function Component() { if (rootId) { return ( - - + instance.searchTerm.set(e.target.value)} /> - + + + + ) { const rootId = createState(undefined); const metadata = createState>(new Map()); + const searchTerm = createState(''); client.onMessage('init', (event) => { rootId.set(event.rootId); @@ -108,6 +109,7 @@ export function plugin(client: PluginClient) { hoveredNodes, perfEvents, treeState, + searchTerm, }; } diff --git a/docs/extending/flipper-plugin.mdx b/docs/extending/flipper-plugin.mdx index 614db4eef..81e564e37 100644 --- a/docs/extending/flipper-plugin.mdx +++ b/docs/extending/flipper-plugin.mdx @@ -889,6 +889,29 @@ const [showWhitespace, setShowWhitespace] = useLocalStorageState( Layout elements can be used to organize the screen layout. See the [Style Guide](style-guide.mdx) for more details. +### HighlightContext + +### HighlightProvider + +React context provider for Highlight context. All wrapped componets can access context or use the useHighligher helper. Example +```typescript jsx + + + +```` + +### useHighlighter + +Hook to be used inside a Highlight context to render text with highlighting applied. Example +```typescript jsx +function HighlightedText(props: {text: string}) { + const highlightManager: HighlightManager = useHighlighter(); + return {highlightManager.render(props.text)}; +} +``` + ### DataTable ### DataFormatter From b576060339edfff1f218379b489b7b64ef60b3c1 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Thu, 24 Nov 2022 09:23:16 -0800 Subject: [PATCH 0324/1651] Pretty loading spinner Reviewed By: antonk52 Differential Revision: D41343098 fbshipit-source-id: 69b75e7a93344d2a05fa6fac9f466126feaf8cad --- .../public/ui-debugger/components/main.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 367aea63a..f2fb33d3e 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -17,7 +17,7 @@ import {Tree} from './Tree'; import {Visualization2D} from './Visualization2D'; import {useKeyboardModifiers} from '../hooks/useKeyboardModifiers'; import {Inspector} from './sidebar/Inspector'; -import {Input} from 'antd'; +import {Input, Spin} from 'antd'; export function Component() { const instance = usePlugin(plugin); @@ -80,5 +80,19 @@ export function Component() { ); } - return
    Loading...
    ; + return ( + + + + ); +} + +export function Centered(props: {children: React.ReactNode}) { + return ( + + + {props.children} + + + ); } From 01f7fa34e51e0468bbcf2f861ab5d6347e9e410d Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Thu, 24 Nov 2022 09:23:16 -0800 Subject: [PATCH 0325/1651] Remove per node snapshot in favour of single top level snapshot Summary: In order to support focus mode we need to have only 1 snapshot. In practice this is the case but we are making this more apparant in this diff. Reviewed By: lblasa Differential Revision: D41493003 fbshipit-source-id: 19ed7213d15adaea4732f4ec60309efa8dae6f94 --- .../components/Visualization2D.tsx | 44 ++++++------------- .../public/ui-debugger/components/main.tsx | 2 - desktop/plugins/public/ui-debugger/index.tsx | 13 +++--- 3 files changed, 22 insertions(+), 37 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index e034a812f..4494ff28e 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -8,17 +8,9 @@ */ import React, {useEffect, useMemo, useRef, useState} from 'react'; -import { - Bounds, - Coordinate, - Id, - NestedNode, - Snapshot, - Tag, - UINode, -} from '../types'; +import {Bounds, Coordinate, Id, NestedNode, Tag, UINode} from '../types'; -import {styled, theme, usePlugin} from 'flipper-plugin'; +import {styled, theme, usePlugin, useValue} from 'flipper-plugin'; import {plugin} from '../index'; import {throttle, isEqual, head} from 'lodash'; @@ -26,23 +18,16 @@ export const Visualization2D: React.FC< { rootId: Id; nodes: Map; - snapshots: Map; selectedNode?: Id; onSelectNode: (id?: Id) => void; modifierPressed: boolean; } & React.HTMLAttributes -> = ({ - rootId, - nodes, - snapshots, - selectedNode, - onSelectNode, - modifierPressed, -}) => { +> = ({rootId, nodes, selectedNode, onSelectNode, modifierPressed}) => { const root = useMemo(() => toNestedNode(rootId, nodes), [rootId, nodes]); const rootNodeRef = useRef(); const instance = usePlugin(plugin); + const snapshot = useValue(instance.snapshot); useEffect(() => { const mouseListener = throttle((ev: MouseEvent) => { const domRect = rootNodeRef.current?.getBoundingClientRect(); @@ -80,6 +65,7 @@ export const Visualization2D: React.FC< return null; } + const snapshotNode = snapshot && nodes.get(snapshot.nodeId); return (
    + {snapshot && snapshotNode && ( + + )} ; modifierPressed: boolean; selectedNode?: Id; onSelectNode: (id?: Id) => void; }) { - const snapshot = snapshots.get(node.id); const instance = usePlugin(plugin); const [isHovered, setIsHovered] = useState(false); @@ -174,7 +165,6 @@ function Visualization2DNode({ - {snapshot && ( - - )} {isHovered &&

    {node.name}

    } {children}
    diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index f2fb33d3e..80847c52f 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -24,7 +24,6 @@ export function Component() { const rootId = useValue(instance.rootId); const nodes: Map = useValue(instance.nodes); const metadata: Map = useValue(instance.metadata); - const snapshots: Map = useValue(instance.snapshots); const [showPerfStats, setShowPerfStats] = useState(false); const [selectedNode, setSelectedNode] = useState(undefined); @@ -70,7 +69,6 @@ export function Component() { ) { }); const nodes = createState>(new Map()); - const snapshots = createState>(new Map()); + const snapshot = createState<{nodeId: Id; base64Image: Snapshot} | null>( + null, + ); const treeState = createState({expandedNodes: []}); @@ -71,9 +73,10 @@ export function plugin(client: PluginClient) { const seenNodes = new Set(); client.onMessage('subtreeUpdate', (event) => { - snapshots.update((draft) => { - draft.set(event.rootId, event.snapshot); - }); + if (event.snapshot) { + snapshot.set({nodeId: event.rootId, base64Image: event.snapshot}); + } + nodes.update((draft) => { event.nodes.forEach((node) => { draft.set(node.id, node); @@ -105,7 +108,7 @@ export function plugin(client: PluginClient) { rootId, nodes, metadata, - snapshots, + snapshot, hoveredNodes, perfEvents, treeState, From 4b566dbe03f0b27ad4acea45b76df9561d2e6ea1 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Thu, 24 Nov 2022 09:23:16 -0800 Subject: [PATCH 0326/1651] Add ability to focus on a node to tree Summary: Added context menu to tree nodes that 'focuses' a node. This will make the node the root of the tree. Focus state can be removed again via context menu but we could add a permanent button in the future Reviewed By: lblasa Differential Revision: D41493002 fbshipit-source-id: 43ec7a25aeea0b169cbcbb1ac20ac22ea893fee2 --- .../public/ui-debugger/components/Tree.tsx | 129 +++++++++++++----- desktop/plugins/public/ui-debugger/index.tsx | 3 + 2 files changed, 99 insertions(+), 33 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 95604fe9c..23c16ceb4 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -25,12 +25,12 @@ import { useValue, HighlightManager, HighlightProvider, - HighlightContext, useHighlighter, theme, } from 'flipper-plugin'; import {head} from 'lodash'; +import {Dropdown, Menu} from 'antd'; export function Tree(props: { rootId: Id; @@ -40,7 +40,12 @@ export function Tree(props: { }) { const instance = usePlugin(plugin); const expandedItems = useValue(instance.treeState).expandedNodes; - const items = useMemo(() => toComplexTree(props.nodes), [props.nodes]); + const focused = useValue(instance.focusedNode); + + const items = useMemo( + () => toComplexTree(focused || props.rootId, props.nodes), + [focused, props.nodes, props.rootId], + ); const hoveredNodes = useValue(instance.hoveredNodes); const treeEnvRef = useRef(); @@ -109,7 +114,7 @@ export function Tree(props: { }}>
    @@ -149,58 +154,116 @@ function renderItem({ context.isDraggingOver && 'rct-tree-item-li-dragging-over', context.isSearchMatching && 'rct-tree-item-li-search-match', )}> -
    - {arrow} +
    - + {arrow} +
    + +
    -
    + + {children} ); } +type ContextMenuProps = {node: UINode; id: Id; title: string}; + +const ContextMenu: React.FC = ({id, title, children}) => { + const instance = usePlugin(plugin); + const focusedNode = instance.focusedNode.get(); + + return ( + ( + + {focusedNode !== head(instance.hoveredNodes.get()) && ( + { + instance.focusedNode.set(id); + }}> + Focus {title} + + )} + + {focusedNode && ( + { + instance.focusedNode.set(undefined); + }}> + Remove focus + + )} + + )} + trigger={['contextMenu']}> +
    {children}
    +
    + ); +}; + function HighlightedText(props: {text: string}) { const highlightManager: HighlightManager = useHighlighter(); return {highlightManager.render(props.text)}; } -function toComplexTree(nodes: Map): Record> { +const FakeNode: UINode = { + id: 'Fakeroot', + qualifiedName: 'Fakeroot', + name: 'Fakeroot', + children: [], + attributes: {}, + bounds: {x: 0, y: 0, height: 0, width: 0}, + tags: [], +}; + +function toComplexTree( + root: Id, + nodes: Map, +): Record> { const res: Record> = {}; for (const node of nodes.values()) { res[node.id] = { index: node.id, - canMove: false, - canRename: false, children: node.children, data: node, hasChildren: node.children.length > 0, }; } + + //the library doesnt render the root node so we insert a fake one which will never be rendered + //https://github.com/lukasbach/react-complex-tree/issues/42 + res[FakeNode.id] = { + index: FakeNode.id, + children: [root], + hasChildren: true, + data: FakeNode, + }; return res; } diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index 2cb1247e2..9f6fa540b 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -48,6 +48,8 @@ export function plugin(client: PluginClient) { perfEvents.append(event); }); + const focusedNode = createState(undefined); + const nodes = createState>(new Map()); const snapshot = createState<{nodeId: Id; base64Image: Snapshot} | null>( null, @@ -108,6 +110,7 @@ export function plugin(client: PluginClient) { rootId, nodes, metadata, + focusedNode, snapshot, hoveredNodes, perfEvents, From 8ae367dbf6a178276fa418ff48bc61cd3b77496e Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Thu, 24 Nov 2022 09:23:16 -0800 Subject: [PATCH 0327/1651] Added focus mode to vizualizer Summary: Introduced an outer div which is the size of the real root node so that focusing doesnt shift the UI. Reviewed By: antonk52 Differential Revision: D41492999 fbshipit-source-id: 336104e5d18d773953e0a58a699acc7660c4045f --- .../components/Visualization2D.tsx | 150 +++++++++++++----- 1 file changed, 112 insertions(+), 38 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index 4494ff28e..c630a617c 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -10,9 +10,9 @@ import React, {useEffect, useMemo, useRef, useState} from 'react'; import {Bounds, Coordinate, Id, NestedNode, Tag, UINode} from '../types'; -import {styled, theme, usePlugin, useValue} from 'flipper-plugin'; +import {produce, styled, theme, usePlugin, useValue} from 'flipper-plugin'; import {plugin} from '../index'; -import {throttle, isEqual, head} from 'lodash'; +import {head, isEqual, throttle} from 'lodash'; export const Visualization2D: React.FC< { @@ -23,15 +23,21 @@ export const Visualization2D: React.FC< modifierPressed: boolean; } & React.HTMLAttributes > = ({rootId, nodes, selectedNode, onSelectNode, modifierPressed}) => { - const root = useMemo(() => toNestedNode(rootId, nodes), [rootId, nodes]); const rootNodeRef = useRef(); const instance = usePlugin(plugin); const snapshot = useValue(instance.snapshot); + const focusedNodeId = useValue(instance.focusedNode); + + const focusState = useMemo(() => { + const rootNode = toNestedNode(rootId, nodes); + return rootNode && caclulateFocusState(rootNode, focusedNodeId); + }, [focusedNodeId, rootId, nodes]); + useEffect(() => { const mouseListener = throttle((ev: MouseEvent) => { const domRect = rootNodeRef.current?.getBoundingClientRect(); - if (!root || !domRect) { + if (!focusState || !domRect) { return; } @@ -45,7 +51,9 @@ export const Visualization2D: React.FC< y: offsetMouse.y * pxScaleFactor, }; - const hitNodes = hitTest(root, scaledMouse).map((node) => node.id); + const hitNodes = hitTest(focusState.focusedRoot, scaledMouse).map( + (node) => node.id, + ); if ( hitNodes.length > 0 && @@ -59,49 +67,62 @@ export const Visualization2D: React.FC< return () => { window.removeEventListener('mousemove', mouseListener); }; - }, [instance.hoveredNodes, root]); + }, [instance.hoveredNodes, focusState, nodes]); - if (!root) { + if (!focusState) { return null; } const snapshotNode = snapshot && nodes.get(snapshot.nodeId); return (
    { - e.stopPropagation(); - instance.hoveredNodes.set([]); - }} + //this div is to ensure that the size of the visualiser doesnt change when focusings on a subtree style={{ - /** - * This relative position is so the root visualization 2DNode and outer border has a non static element to - * position itself relative to. - * - * Subsequent Visualization2DNode are positioned relative to their parent as each one is position absolute - * which despite the name acts are a reference point for absolute positioning... - */ - position: 'relative', - width: toPx(root.bounds.width), - height: toPx(root.bounds.height), - overflow: 'hidden', + width: toPx(focusState.actualRoot.bounds.width), + height: toPx(focusState.actualRoot.bounds.height), }}> - {snapshot && snapshotNode && ( - { + e.stopPropagation(); + instance.hoveredNodes.set([]); + }} + style={{ + /** + * This relative position is so the rootNode visualization 2DNode and outer border has a non static element to + * position itself relative to. + * + * Subsequent Visualization2DNode are positioned relative to their parent as each one is position absolute + * which despite the name acts are a reference point for absolute positioning... + * + * When focused the global offset of the focussed node is used to offset and size this 'root' node + */ + position: 'relative', + + marginLeft: toPx(focusState.focusedRootGlobalOffset.x), + marginTop: toPx(focusState.focusedRootGlobalOffset.y), + width: toPx(focusState.focusedRoot.bounds.width), + height: toPx(focusState.focusedRoot.bounds.height), + overflow: 'hidden', + }}> + {snapshotNode && ( + + )} + - )} - - +
    ); }; @@ -279,6 +300,59 @@ function toNestedNode( return root ? uiNodeToNestedNode(root) : undefined; } +type FocusState = { + actualRoot: NestedNode; + focusedRoot: NestedNode; + focusedRootGlobalOffset: Coordinate; +}; + +function caclulateFocusState(root: NestedNode, target?: Id): FocusState { + const rootFocusState = { + actualRoot: root, + focusedRoot: root, + focusedRootGlobalOffset: {x: 0, y: 0}, + }; + if (target == null) { + return rootFocusState; + } + return ( + findNodeAndGlobalOffsetRec(root, {x: 0, y: 0}, root, target) || + rootFocusState + ); +} + +function findNodeAndGlobalOffsetRec( + node: NestedNode, + globalOffset: Coordinate, + root: NestedNode, + target: Id, +): FocusState | undefined { + const nextOffset = { + x: globalOffset.x + node.bounds.x, + y: globalOffset.y + node.bounds.y, + }; + if (node.id === target) { + //since we have already applied the this nodes offset to the root node in the visualiser we zero it out here so it isn't counted twice + const focusedRoot = produce(node, (draft) => { + draft.bounds.x = 0; + draft.bounds.y = 0; + }); + return { + actualRoot: root, + focusedRoot, + focusedRootGlobalOffset: nextOffset, + }; + } + + for (const child of node.children) { + const offset = findNodeAndGlobalOffsetRec(child, nextOffset, root, target); + if (offset != null) { + return offset; + } + } + return undefined; +} + function hitTest(node: NestedNode, mouseCoordinate: Coordinate): NestedNode[] { const res: NestedNode[] = []; From 32fe3948d957f238b6c16744313bbbb817fe3737 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Thu, 24 Nov 2022 09:23:16 -0800 Subject: [PATCH 0328/1651] Fix issue with visualizer hovering offscreen nodes Summary: If a node has a global negative offset (e.g from a view pager) its position will be outside of the visualizors bounds and could potentially be where the tree is. The user doesnt see the wireframes since overflow hidden is on the parent node. A situation can arise where when the mouse is over the tree the hit test returns an offscreen node and causes us to hover a random node rather than the tree node hover effect taking place. We are just adding a guard to say if the mouse is outside the dom rect for the root visualization node than dont run the hit test Reviewed By: lblasa Differential Revision: D41493001 fbshipit-source-id: ea7974de7f2b80126d52490526a21e2a3b487d3d --- .../public/ui-debugger/components/Visualization2D.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index c630a617c..e7e942d12 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -40,12 +40,15 @@ export const Visualization2D: React.FC< if (!focusState || !domRect) { return; } + const rawMouse = {x: ev.clientX, y: ev.clientY}; + + if (!boundsContainsCoordinate(domRect, rawMouse)) { + return; + } //make the mouse coord relative to the dom rect of the visualizer - const offsetMouse = offsetCoordinate( - {x: ev.clientX, y: ev.clientY}, - domRect, - ); + + const offsetMouse = offsetCoordinate(rawMouse, domRect); const scaledMouse = { x: offsetMouse.x * pxScaleFactor, y: offsetMouse.y * pxScaleFactor, From f78899b69f8ac42bcf8de027df79722fc0ff4ee1 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Thu, 24 Nov 2022 09:23:16 -0800 Subject: [PATCH 0329/1651] Store context menu open in app wide state to disable all hover effects which cause rerenders and mess up the context menu Summary: Mouse over event still fires for the dom nodes behind the context menu modal. This will cause state changes and rerenders. Some of the state the context menu depends on can change so it would cause the context menu items to change while its stil open. Now we dont fire those hover state changes while context menu active Reviewed By: lblasa Differential Revision: D41494947 fbshipit-source-id: 17918f15d74230d9c7070a4de7a0a0ce10a08001 --- desktop/plugins/public/ui-debugger/components/Tree.tsx | 9 ++++++++- desktop/plugins/public/ui-debugger/index.tsx | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 23c16ceb4..23d2beeb3 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -108,7 +108,9 @@ export function Tree(props: { }, onMouseOver: () => { - instance.hoveredNodes.set([item.index]); + if (!instance.isContextMenuOpen.get()) { + instance.hoveredNodes.set([item.index]); + } }, }), }}> @@ -201,12 +203,16 @@ const ContextMenu: React.FC = ({id, title, children}) => { return ( { + instance.isContextMenuOpen.set(visible); + }} overlay={() => ( {focusedNode !== head(instance.hoveredNodes.get()) && ( { instance.focusedNode.set(id); + instance.isContextMenuOpen.set(false); }}> Focus {title} @@ -216,6 +222,7 @@ const ContextMenu: React.FC = ({id, title, children}) => { { instance.focusedNode.set(undefined); + instance.isContextMenuOpen.set(false); }}> Remove focus diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index 9f6fa540b..5bb3e345f 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -48,6 +48,9 @@ export function plugin(client: PluginClient) { perfEvents.append(event); }); + //used to disabled hover effects which cause rerenders and mess up the existing context menu + const isContextMenuOpen = createState(false); + const focusedNode = createState(undefined); const nodes = createState>(new Map()); @@ -108,6 +111,7 @@ export function plugin(client: PluginClient) { return { rootId, + isContextMenuOpen, nodes, metadata, focusedNode, From ca67bfd9162010564dc4e78d35dea4b1656b357a Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Thu, 24 Nov 2022 09:23:16 -0800 Subject: [PATCH 0330/1651] Add context menu to visualizer Summary: Added context menu to visualizer similar to what we have on the tree Reviewed By: lblasa Differential Revision: D41494948 fbshipit-source-id: 0cfa4c98b7a68462a7103ed1ce9eaaff8c99aeee --- .../components/Visualization2D.tsx | 149 ++++++++++++------ 1 file changed, 101 insertions(+), 48 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index e7e942d12..49585a6f5 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -13,6 +13,7 @@ import {Bounds, Coordinate, Id, NestedNode, Tag, UINode} from '../types'; import {produce, styled, theme, usePlugin, useValue} from 'flipper-plugin'; import {plugin} from '../index'; import {head, isEqual, throttle} from 'lodash'; +import {Dropdown, Menu} from 'antd'; export const Visualization2D: React.FC< { @@ -37,7 +38,8 @@ export const Visualization2D: React.FC< useEffect(() => { const mouseListener = throttle((ev: MouseEvent) => { const domRect = rootNodeRef.current?.getBoundingClientRect(); - if (!focusState || !domRect) { + + if (!focusState || !domRect || instance.isContextMenuOpen.get()) { return; } const rawMouse = {x: ev.clientX, y: ev.clientY}; @@ -70,63 +72,68 @@ export const Visualization2D: React.FC< return () => { window.removeEventListener('mousemove', mouseListener); }; - }, [instance.hoveredNodes, focusState, nodes]); + }, [instance.hoveredNodes, focusState, nodes, instance.isContextMenuOpen]); if (!focusState) { return null; } const snapshotNode = snapshot && nodes.get(snapshot.nodeId); - return ( -
    -
    { - e.stopPropagation(); - instance.hoveredNodes.set([]); - }} - style={{ - /** - * This relative position is so the rootNode visualization 2DNode and outer border has a non static element to - * position itself relative to. - * - * Subsequent Visualization2DNode are positioned relative to their parent as each one is position absolute - * which despite the name acts are a reference point for absolute positioning... - * - * When focused the global offset of the focussed node is used to offset and size this 'root' node - */ - position: 'relative', - marginLeft: toPx(focusState.focusedRootGlobalOffset.x), - marginTop: toPx(focusState.focusedRootGlobalOffset.y), - width: toPx(focusState.focusedRoot.bounds.width), - height: toPx(focusState.focusedRoot.bounds.height), - overflow: 'hidden', + return ( + +
    - {snapshotNode && ( - { + e.stopPropagation(); + //the context menu triggers this callback but we dont want to remove hover effect + if (!instance.isContextMenuOpen.get()) { + instance.hoveredNodes.set([]); + } + }} + style={{ + /** + * This relative position is so the rootNode visualization 2DNode and outer border has a non static element to + * position itself relative to. + * + * Subsequent Visualization2DNode are positioned relative to their parent as each one is position absolute + * which despite the name acts are a reference point for absolute positioning... + * + * When focused the global offset of the focussed node is used to offset and size this 'root' node + */ + position: 'relative', + marginLeft: toPx(focusState.focusedRootGlobalOffset.x), + marginTop: toPx(focusState.focusedRootGlobalOffset.y), + width: toPx(focusState.focusedRoot.bounds.width), + height: toPx(focusState.focusedRoot.bounds.height), + overflow: 'hidden', + }}> + {snapshotNode && ( + + )} + - )} - +
    -
    + ); }; @@ -230,6 +237,52 @@ function Visualization2DNode({ ); } +const ContextMenu: React.FC<{nodes: Map}> = ({children}) => { + const instance = usePlugin(plugin); + + const focusedNodeId = useValue(instance.focusedNode); + const hoveredNodeId = head(useValue(instance.hoveredNodes)); + const nodes = useValue(instance.nodes); + const hoveredNode = hoveredNodeId ? nodes.get(hoveredNodeId) : null; + const isMenuOpen = useValue(instance.isContextMenuOpen); + + return ( + { + instance.isContextMenuOpen.set(open); + }} + trigger={['contextMenu']} + overlay={() => { + return ( + + {isMenuOpen && hoveredNode?.id !== focusedNodeId && ( + { + instance.focusedNode.set(hoveredNode?.id); + instance.isContextMenuOpen.set(false); + }}> + Focus {hoveredNode?.name} + + )} + {isMenuOpen && focusedNodeId != null && ( + { + instance.focusedNode.set(undefined); + instance.isContextMenuOpen.set(false); + }}> + Remove focus + + )} + + ); + }}> + {children} + + ); +}; + /** * this is the border that shows the green or blue line, it is implemented as a sibling to the * node itself so that it has the same size but the border doesnt affect the sizing of its children From 7fc64adfd4e11b5a1f478a658bbce0b99a911044 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Thu, 24 Nov 2022 09:23:16 -0800 Subject: [PATCH 0331/1651] Refactor out UI debugger menu item Summary: We have to do a couple of odd things to get the context menu items to behave. The code was duplicated between tree and visualizer. This custom component removes duplication and makes the approach a bit clearer (via js doc) Reviewed By: antonk52 Differential Revision: D41495718 fbshipit-source-id: ec98d5101e636a2c9034c656d29991d4fe348762 --- .../public/ui-debugger/components/Tree.tsx | 21 ++++----- .../components/Visualization2D.tsx | 24 +++++----- .../components/util/UIDebuggerMenuItem.tsx | 45 +++++++++++++++++++ 3 files changed, 67 insertions(+), 23 deletions(-) create mode 100644 desktop/plugins/public/ui-debugger/components/util/UIDebuggerMenuItem.tsx diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 23d2beeb3..9d0ed7504 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -31,6 +31,7 @@ import { import {head} from 'lodash'; import {Dropdown, Menu} from 'antd'; +import {UIDebuggerMenuItem} from './util/UIDebuggerMenuItem'; export function Tree(props: { rootId: Id; @@ -209,23 +210,23 @@ const ContextMenu: React.FC = ({id, title, children}) => { overlay={() => ( {focusedNode !== head(instance.hoveredNodes.get()) && ( - { instance.focusedNode.set(id); - instance.isContextMenuOpen.set(false); - }}> - Focus {title} - + }} + /> )} {focusedNode && ( - { instance.focusedNode.set(undefined); - instance.isContextMenuOpen.set(false); - }}> - Remove focus - + }} + /> )} )} diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index 49585a6f5..46b2066a1 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -14,6 +14,7 @@ import {produce, styled, theme, usePlugin, useValue} from 'flipper-plugin'; import {plugin} from '../index'; import {head, isEqual, throttle} from 'lodash'; import {Dropdown, Menu} from 'antd'; +import {UIDebuggerMenuItem} from './util/UIDebuggerMenuItem'; export const Visualization2D: React.FC< { @@ -244,7 +245,6 @@ const ContextMenu: React.FC<{nodes: Map}> = ({children}) => { const hoveredNodeId = head(useValue(instance.hoveredNodes)); const nodes = useValue(instance.nodes); const hoveredNode = hoveredNodeId ? nodes.get(hoveredNodeId) : null; - const isMenuOpen = useValue(instance.isContextMenuOpen); return ( }> = ({children}) => { overlay={() => { return ( - {isMenuOpen && hoveredNode?.id !== focusedNodeId && ( - { instance.focusedNode.set(hoveredNode?.id); - instance.isContextMenuOpen.set(false); - }}> - Focus {hoveredNode?.name} - + }} + /> )} - {isMenuOpen && focusedNodeId != null && ( - { instance.focusedNode.set(undefined); - instance.isContextMenuOpen.set(false); - }}> - Remove focus - + }} + /> )} ); diff --git a/desktop/plugins/public/ui-debugger/components/util/UIDebuggerMenuItem.tsx b/desktop/plugins/public/ui-debugger/components/util/UIDebuggerMenuItem.tsx new file mode 100644 index 000000000..2427b6f88 --- /dev/null +++ b/desktop/plugins/public/ui-debugger/components/util/UIDebuggerMenuItem.tsx @@ -0,0 +1,45 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import {Menu} from 'antd'; +import {usePlugin, useValue} from 'flipper-plugin'; +import {plugin} from '../../index'; +import React from 'react'; + +/** + * The Menu item visibility event does not fire when a menu item is clicked. + * This is apparently by design https://github.com/ant-design/ant-design/issues/4994#issuecomment-281585872 + * This component simply wraps a menu item but will ensure that the atom is set to false when an item is clicked. + * Additionally, it ensures menu items do not render when the atom is false + */ +export const UIDebuggerMenuItem: React.FC<{ + text: string; + onClick: () => void; +}> = ({text, onClick}) => { + const instance = usePlugin(plugin); + + const isMenuOpen = useValue(instance.isContextMenuOpen); + /** + * The menu is not a controlled component and seems to be a bit slow to close when user clicks on it. + * React may rerender the menu before it has time to close resulting in seeing an incorrect context menu for a frame. + * This is here to just hide all the menu items when the menu closes. A little strange but works well in practice. + */ + if (!isMenuOpen) { + return null; + } + return ( + { + onClick(); + instance.isContextMenuOpen.set(false); + }}> + {text} + + ); +}; From 6bb541a33f31b09e819d68367201b04fabf0030a Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Thu, 24 Nov 2022 09:23:16 -0800 Subject: [PATCH 0332/1651] Group app wide ui state into one object Summary: Should be a bit easier to see what UI state we are holding at the plugin instance level Reviewed By: lblasa Differential Revision: D41498272 fbshipit-source-id: 6d88086766efd9c39f71be7e2ce32c5058494c96 --- .../public/ui-debugger/components/Tree.tsx | 28 +++++++------- .../components/Visualization2D.tsx | 37 +++++++++++-------- .../public/ui-debugger/components/main.tsx | 4 +- .../components/util/UIDebuggerMenuItem.tsx | 4 +- desktop/plugins/public/ui-debugger/index.tsx | 29 +++++++-------- 5 files changed, 52 insertions(+), 50 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 9d0ed7504..18f042e62 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -40,17 +40,17 @@ export function Tree(props: { onSelectNode: (id: Id) => void; }) { const instance = usePlugin(plugin); - const expandedItems = useValue(instance.treeState).expandedNodes; - const focused = useValue(instance.focusedNode); + const expandedItems = useValue(instance.uiState.treeState).expandedNodes; + const focused = useValue(instance.uiState.focusedNode); const items = useMemo( () => toComplexTree(focused || props.rootId, props.nodes), [focused, props.nodes, props.rootId], ); - const hoveredNodes = useValue(instance.hoveredNodes); + const hoveredNodes = useValue(instance.uiState.hoveredNodes); const treeEnvRef = useRef(); - const searchTerm = useValue(instance.searchTerm); + const searchTerm = useValue(instance.uiState.searchTerm); useEffect(() => { //this makes the keyboard arrow controls work always, even when using the visualiser @@ -75,15 +75,15 @@ export function Tree(props: { }, }} onFocusItem={(item) => { - instance.hoveredNodes.set([item.index]); + instance.uiState.hoveredNodes.set([item.index]); }} onExpandItem={(item) => { - instance.treeState.update((draft) => { + instance.uiState.treeState.update((draft) => { draft.expandedNodes.push(item.index); }); }} onCollapseItem={(item) => - instance.treeState.update((draft) => { + instance.uiState.treeState.update((draft) => { draft.expandedNodes = draft.expandedNodes.filter( (expandedItemIndex) => expandedItemIndex !== item.index, ); @@ -109,8 +109,8 @@ export function Tree(props: { }, onMouseOver: () => { - if (!instance.isContextMenuOpen.get()) { - instance.hoveredNodes.set([item.index]); + if (!instance.uiState.isContextMenuOpen.get()) { + instance.uiState.hoveredNodes.set([item.index]); } }, }), @@ -200,21 +200,21 @@ type ContextMenuProps = {node: UINode; id: Id; title: string}; const ContextMenu: React.FC = ({id, title, children}) => { const instance = usePlugin(plugin); - const focusedNode = instance.focusedNode.get(); + const focusedNode = instance.uiState.focusedNode.get(); return ( { - instance.isContextMenuOpen.set(visible); + instance.uiState.isContextMenuOpen.set(visible); }} overlay={() => ( - {focusedNode !== head(instance.hoveredNodes.get()) && ( + {focusedNode !== head(instance.uiState.hoveredNodes.get()) && ( { - instance.focusedNode.set(id); + instance.uiState.focusedNode.set(id); }} /> )} @@ -224,7 +224,7 @@ const ContextMenu: React.FC = ({id, title, children}) => { key="remove-focus" text="Remove focus" onClick={() => { - instance.focusedNode.set(undefined); + instance.uiState.focusedNode.set(undefined); }} /> )} diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index 46b2066a1..e7309d4c6 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -29,7 +29,7 @@ export const Visualization2D: React.FC< const instance = usePlugin(plugin); const snapshot = useValue(instance.snapshot); - const focusedNodeId = useValue(instance.focusedNode); + const focusedNodeId = useValue(instance.uiState.focusedNode); const focusState = useMemo(() => { const rootNode = toNestedNode(rootId, nodes); @@ -40,7 +40,7 @@ export const Visualization2D: React.FC< const mouseListener = throttle((ev: MouseEvent) => { const domRect = rootNodeRef.current?.getBoundingClientRect(); - if (!focusState || !domRect || instance.isContextMenuOpen.get()) { + if (!focusState || !domRect || instance.uiState.isContextMenuOpen.get()) { return; } const rawMouse = {x: ev.clientX, y: ev.clientY}; @@ -63,9 +63,9 @@ export const Visualization2D: React.FC< if ( hitNodes.length > 0 && - !isEqual(hitNodes, instance.hoveredNodes.get()) + !isEqual(hitNodes, instance.uiState.hoveredNodes.get()) ) { - instance.hoveredNodes.set(hitNodes); + instance.uiState.hoveredNodes.set(hitNodes); } }, MouseThrottle); window.addEventListener('mousemove', mouseListener); @@ -73,7 +73,12 @@ export const Visualization2D: React.FC< return () => { window.removeEventListener('mousemove', mouseListener); }; - }, [instance.hoveredNodes, focusState, nodes, instance.isContextMenuOpen]); + }, [ + instance.uiState.hoveredNodes, + focusState, + nodes, + instance.uiState.isContextMenuOpen, + ]); if (!focusState) { return null; @@ -94,8 +99,8 @@ export const Visualization2D: React.FC< onMouseLeave={(e) => { e.stopPropagation(); //the context menu triggers this callback but we dont want to remove hover effect - if (!instance.isContextMenuOpen.get()) { - instance.hoveredNodes.set([]); + if (!instance.uiState.isContextMenuOpen.get()) { + instance.uiState.hoveredNodes.set([]); } }} style={{ @@ -169,11 +174,11 @@ function Visualization2DNode({ setIsHovered(head(newValue) === node.id); } }; - instance.hoveredNodes.subscribe(listener); + instance.uiState.hoveredNodes.subscribe(listener); return () => { - instance.hoveredNodes.unsubscribe(listener); + instance.uiState.hoveredNodes.unsubscribe(listener); }; - }, [instance.hoveredNodes, node.id]); + }, [instance.uiState.hoveredNodes, node.id]); const isSelected = selectedNode === node.id; @@ -224,7 +229,7 @@ function Visualization2DNode({ onClick={(e) => { e.stopPropagation(); - const hoveredNodes = instance.hoveredNodes.get(); + const hoveredNodes = instance.uiState.hoveredNodes.get(); if (hoveredNodes[0] === selectedNode) { onSelectNode(undefined); } else { @@ -241,15 +246,15 @@ function Visualization2DNode({ const ContextMenu: React.FC<{nodes: Map}> = ({children}) => { const instance = usePlugin(plugin); - const focusedNodeId = useValue(instance.focusedNode); - const hoveredNodeId = head(useValue(instance.hoveredNodes)); + const focusedNodeId = useValue(instance.uiState.focusedNode); + const hoveredNodeId = head(useValue(instance.uiState.hoveredNodes)); const nodes = useValue(instance.nodes); const hoveredNode = hoveredNodeId ? nodes.get(hoveredNodeId) : null; return ( { - instance.isContextMenuOpen.set(open); + instance.uiState.isContextMenuOpen.set(open); }} trigger={['contextMenu']} overlay={() => { @@ -260,7 +265,7 @@ const ContextMenu: React.FC<{nodes: Map}> = ({children}) => { key="focus" text={`Focus ${hoveredNode?.name}`} onClick={() => { - instance.focusedNode.set(hoveredNode?.id); + instance.uiState.focusedNode.set(hoveredNode?.id); }} /> )} @@ -269,7 +274,7 @@ const ContextMenu: React.FC<{nodes: Map}> = ({children}) => { key="remove-focus" text="Remove focus" onClick={() => { - instance.focusedNode.set(undefined); + instance.uiState.focusedNode.set(undefined); }} /> )} diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 80847c52f..17c88141a 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -30,7 +30,7 @@ export function Component() { useHotkeys('ctrl+i', () => setShowPerfStats((show) => !show)); - const searchTerm = useValue(instance.searchTerm); + const searchTerm = useValue(instance.uiState.searchTerm); const {ctrlPressed} = useKeyboardModifiers(); function renderSidebar( @@ -55,7 +55,7 @@ export function Component() { instance.searchTerm.set(e.target.value)} + onChange={(e) => instance.uiState.searchTerm.set(e.target.value)} /> = ({text, onClick}) => { const instance = usePlugin(plugin); - const isMenuOpen = useValue(instance.isContextMenuOpen); + const isMenuOpen = useValue(instance.uiState.isContextMenuOpen); /** * The menu is not a controlled component and seems to be a bit slow to close when user clicks on it. * React may rerender the menu before it has time to close resulting in seeing an incorrect context menu for a frame. @@ -37,7 +37,7 @@ export const UIDebuggerMenuItem: React.FC<{ { onClick(); - instance.isContextMenuOpen.set(false); + instance.uiState.isContextMenuOpen.set(false); }}> {text} diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index 5bb3e345f..af5796227 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -23,7 +23,6 @@ import './node_modules/react-complex-tree/lib/style.css'; export function plugin(client: PluginClient) { const rootId = createState(undefined); const metadata = createState>(new Map()); - const searchTerm = createState(''); client.onMessage('init', (event) => { rootId.set(event.rootId); @@ -48,21 +47,23 @@ export function plugin(client: PluginClient) { perfEvents.append(event); }); - //used to disabled hover effects which cause rerenders and mess up the existing context menu - const isContextMenuOpen = createState(false); - - const focusedNode = createState(undefined); - const nodes = createState>(new Map()); const snapshot = createState<{nodeId: Id; base64Image: Snapshot} | null>( null, ); - const treeState = createState({expandedNodes: []}); + const uiState = { + //used to disabled hover effects which cause rerenders and mess up the existing context menu + isContextMenuOpen: createState(false), - //The reason for the array as that user could be hovering multiple overlapping nodes at once in the visualiser. - //The nodes are sorted by area since you most likely want to select the smallest node under your cursor - const hoveredNodes = createState([]); + //The reason for the array as that user could be hovering multiple overlapping nodes at once in the visualiser. + //The nodes are sorted by area since you most likely want to select the smallest node under your cursor + hoveredNodes: createState([]), + + searchTerm: createState(''), + focusedNode: createState(undefined), + treeState: createState({expandedNodes: []}), + }; client.onMessage('coordinateUpdate', (event) => { nodes.update((draft) => { @@ -88,7 +89,7 @@ export function plugin(client: PluginClient) { }); }); - treeState.update((draft) => { + uiState.treeState.update((draft) => { for (const node of event.nodes) { if (!seenNodes.has(node.id)) { draft.expandedNodes.push(node.id); @@ -111,15 +112,11 @@ export function plugin(client: PluginClient) { return { rootId, - isContextMenuOpen, + uiState, nodes, metadata, - focusedNode, snapshot, - hoveredNodes, perfEvents, - treeState, - searchTerm, }; } From 8b6924559af0e0719d78bfc18c9c6a33ab358299 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Nov 2022 09:23:32 -0800 Subject: [PATCH 0333/1651] Bump rayon from 1.5.2 to 1.6.0 in /packer (#4322) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [rayon](https://github.com/rayon-rs/rayon) from 1.5.2 to 1.6.0.
    Changelog

    Sourced from rayon's changelog.

    Release rayon 1.6.0 / rayon-core 1.10.0 (2022-11-18)

    • The minimum supported rustc is now 1.56.
    • The new IndexedParallelIterator::fold_chunks and fold_chunks_with methods work like ParallelIterator::fold and fold_with with fixed-size chunks of items. This may be useful for predictable batching performance, without the allocation overhead of IndexedParallelIterator::chunks.
    • New "broadcast" methods run a given function on all threads in the pool. These run at a sort of reduced priority after each thread has exhausted their local work queue, but before they attempt work-stealing from other threads.
      • The global broadcast function and ThreadPool::broadcast method will block until completion, returning a Vec of all return values.
      • The global spawn_broadcast function and methods on ThreadPool, Scope, and ScopeFifo will run detached, without blocking the current thread.
    • Panicking methods now use #[track_caller] to report the caller's location.
    • Fixed a truncated length in vec::Drain when given an empty range.

    Contributors

    Thanks to all of the contributors for this release!

    Release rayon 1.5.3 (2022-05-13)

    • The new ParallelSliceMut::par_sort_by_cached_key is a stable sort that caches the keys for each item -- a parallel version of slice::sort_by_cached_key.

    Release rayon-core 1.9.3 (2022-05-13)

    • Fixed a use-after-free race in job notification.
    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rayon&package-manager=cargo&previous-version=1.5.2&new-version=1.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4322 Reviewed By: antonk52 Differential Revision: D41472340 Pulled By: passy fbshipit-source-id: 73924e9502283654444533f98d68d3edcc9d1c01 --- packer/Cargo.lock | 9 ++++----- packer/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packer/Cargo.lock b/packer/Cargo.lock index f05526730..d2f6e503d 100644 --- a/packer/Cargo.lock +++ b/packer/Cargo.lock @@ -532,11 +532,10 @@ checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" [[package]] name = "rayon" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221" +checksum = "1e060280438193c554f654141c9ea9417886713b7acd75974c85b18a69a88e0b" dependencies = [ - "autocfg", "crossbeam-deque", "either", "rayon-core", @@ -544,9 +543,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.2" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f51245e1e62e1f1629cbfec37b5793bbabcaeb90f30e94d2ba03564687353e4" +checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" dependencies = [ "crossbeam-channel", "crossbeam-deque", diff --git a/packer/Cargo.toml b/packer/Cargo.toml index 52c49fc14..abc62df8d 100644 --- a/packer/Cargo.toml +++ b/packer/Cargo.toml @@ -19,7 +19,7 @@ anyhow = "^1" sha2 = "0.10.6" data-encoding = "^2" serde_json = "^1" -rayon = "^1.5" +rayon = "^1.6" indicatif = "^0.16" xz2 = "0.1.7" ignore = "0.4.18" From aea6f84172e2a70439f8d0fcae4a8b964deac801 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Nov 2022 09:27:54 -0800 Subject: [PATCH 0334/1651] Bump @babel/generator from 7.17.10 to 7.20.4 in /desktop (#4328) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [babel/generator](https://github.com/babel/babel/tree/HEAD/packages/babel-generator) from 7.17.10 to 7.20.4.
    Release notes

    Sourced from @​babel/generator's releases.

    v7.20.4 (2022-11-08)

    :bug: Bug Fix

    Committers: 1

    v7.20.2 (2022-11-04)

    :bug: Bug Fix

    • babel-core, babel-helper-create-class-features-plugin, babel-helper-module-transforms, babel-helper-plugin-utils, babel-helper-simple-access, babel-node, babel-plugin-transform-block-scoping, babel-plugin-transform-classes, babel-plugin-transform-react-constant-elements, babel-preset-env, babel-standalone, babel-types
    • babel-plugin-transform-typescript
    • babel-parser
    • babel-generator
    • babel-plugin-proposal-decorators, babel-plugin-proposal-object-rest-spread, babel-plugin-transform-jscript
    • babel-plugin-transform-destructuring

    Committers: 3

    v7.20.1 (2022-11-01)

    Thanks @​ptomato for your first pull request!

    :bug: Bug Fix

    • babel-plugin-proposal-async-generator-functions
    • babel-plugin-proposal-class-properties, babel-traverse
    • babel-helpers, babel-plugin-proposal-duplicate-named-capturing-groups-regex, babel-plugin-transform-named-capturing-groups-regex
    • babel-parser
    • babel-helpers, babel-plugin-proposal-duplicate-named-capturing-groups-regex
    • babel-plugin-transform-async-to-generator, babel-plugin-transform-parameters, babel-preset-env

    ... (truncated)

    Changelog

    Sourced from @​babel/generator's changelog.

    v7.20.4 (2022-11-08)

    :bug: Bug Fix

    v7.20.3 (2022-11-07)

    :bug: Bug Fix

    v7.20.2 (2022-11-04)

    :bug: Bug Fix

    • babel-core, babel-helper-create-class-features-plugin, babel-helper-module-transforms, babel-helper-plugin-utils, babel-helper-simple-access, babel-node, babel-plugin-transform-block-scoping, babel-plugin-transform-classes, babel-plugin-transform-react-constant-elements, babel-preset-env, babel-standalone, babel-types
    • babel-plugin-transform-typescript
    • babel-parser
    • babel-generator
    • babel-plugin-proposal-decorators, babel-plugin-proposal-object-rest-spread, babel-plugin-transform-jscript
    • babel-plugin-transform-destructuring

    v7.20.1 (2022-11-01)

    :bug: Bug Fix

    • babel-plugin-proposal-async-generator-functions
    • babel-plugin-proposal-class-properties, babel-traverse
    • babel-helpers, babel-plugin-proposal-duplicate-named-capturing-groups-regex, babel-plugin-transform-named-capturing-groups-regex
    • babel-parser
    • babel-helpers, babel-plugin-proposal-duplicate-named-capturing-groups-regex
    • babel-plugin-transform-async-to-generator, babel-plugin-transform-parameters, babel-preset-env

    :house: Internal

    • babel-generator

    ... (truncated)

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@babel/generator&package-manager=npm_and_yarn&previous-version=7.17.10&new-version=7.20.4)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4328 Reviewed By: antonk52 Differential Revision: D41472371 Pulled By: passy fbshipit-source-id: 51318f0317b49b16b9f3fc480122903526887bbd --- desktop/babel-transformer/package.json | 2 +- desktop/yarn.lock | 95 +++++++++----------------- 2 files changed, 33 insertions(+), 64 deletions(-) diff --git a/desktop/babel-transformer/package.json b/desktop/babel-transformer/package.json index f3d6ce2b8..5d117ac84 100644 --- a/desktop/babel-transformer/package.json +++ b/desktop/babel-transformer/package.json @@ -10,7 +10,7 @@ "bugs": "https://github.com/facebook/flipper/issues", "dependencies": { "@babel/core": "^7.17.10", - "@babel/generator": "^7.17.10", + "@babel/generator": "^7.20.4", "@babel/parser": "^7.17.10", "@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", diff --git a/desktop/yarn.lock b/desktop/yarn.lock index 8a9abb426..71b3f6d09 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -266,31 +266,13 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.14.0", "@babel/generator@^7.17.3": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200" - integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg== +"@babel/generator@^7.14.0", "@babel/generator@^7.17.10", "@babel/generator@^7.17.3", "@babel/generator@^7.18.0", "@babel/generator@^7.20.4": + version "7.20.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" + integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA== dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189" - integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== - dependencies: - "@babel/types" "^7.17.10" - "@jridgewell/gen-mapping" "^0.1.0" - jsesc "^2.5.1" - -"@babel/generator@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.0.tgz#46d28e8a18fc737b028efb25ab105d74473af43f" - integrity sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg== - dependencies: - "@babel/types" "^7.18.0" - "@jridgewell/gen-mapping" "^0.3.0" + "@babel/types" "^7.20.2" + "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.12.13": @@ -669,11 +651,21 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + "@babel/helper-validator-option@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" @@ -2053,28 +2045,13 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.5", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== +"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.5", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.10", "@babel/types@^7.18.0", "@babel/types@^7.20.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" + integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4" - integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.0.tgz#ef523ea349722849cb4bf806e9342ede4d071553" - integrity sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@base2/pretty-print-object@1.0.1": @@ -2785,20 +2762,12 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" - integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== - dependencies: - "@jridgewell/set-array" "^1.0.0" + "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" @@ -2807,10 +2776,10 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== -"@jridgewell/set-array@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.0.tgz#1179863356ac8fbea64a5a4bcde93a4871012c01" - integrity sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.11" @@ -13410,7 +13379,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= From fbae680e06566b3672ced937ef8e5241e50a16a4 Mon Sep 17 00:00:00 2001 From: Kevin Strider Date: Thu, 24 Nov 2022 09:54:37 -0800 Subject: [PATCH 0335/1651] Under the Hood - Part 1 Summary: This diff includes minor changes to the pages within the Under the Hood section of Flipper Docs. Reviewed By: passy Differential Revision: D41521538 fbshipit-source-id: 35b372ffdde118faef2732e4cb7684fc9df18f87 --- docs/internals/contributing.mdx | 2 +- docs/internals/index.mdx | 22 +++++++++++++++++++++- docs/internals/linters.mdx | 2 +- website/sidebars.js | 8 ++++---- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/docs/internals/contributing.mdx b/docs/internals/contributing.mdx index 8177c798f..0e9221b79 100644 --- a/docs/internals/contributing.mdx +++ b/docs/internals/contributing.mdx @@ -4,7 +4,7 @@ title: Contributing to the Codebase --- import useBaseUrl from '@docusaurus/useBaseUrl'; -This page contains information that helps you make contributions to the Flipper codebase. +This page contains information that will help you make contributions to the Flipper codebase. ## Changelog Entries diff --git a/docs/internals/index.mdx b/docs/internals/index.mdx index c270b1f3c..b17561bd1 100644 --- a/docs/internals/index.mdx +++ b/docs/internals/index.mdx @@ -6,4 +6,24 @@ sidebar_label: Introduction This part of the site is for those interested in **how** Flipper works 'under the hood'. -The information contained within this section's pages help Developers modify the source code of the application itself. +'Under the Hood' contains the following topics: + +* [Contributing to the Codebase](contributing.mdx) - contains information that helps you make contributions to the Flipper codebase. +* [Contributing to the Documentation](documentation-writing-guide.mdx) - contains tips and guidelines on how to create effective documentation that will be valued by your target reader. +* [Device Identifiers](device-identifiers.mdx) - details availabe methods for obtaining device identifiers. +* [Linters](linters.mdx) - a list of Linters that are used to enforce sustainable coding practices within Flipper. +* [Public Flipper Releases](../extending/public-releases.mdx) - the mechanism behind Flipper releases on GitHub. +* [Testing React Native Changes](../extending/testing-rn.mdx) - how to use the 'ReactNativeFlippeExample' app to test React Native changes. + + + +In addition, the section contains a wide range of internal-only (see 'Under the Hood -> 'Internal') topics, such as: + +* [Data Pipelines](../fb/data-pipelines.mdx) - information on Deep Dive, Flipper Analytics, Scribe, Error Logging, plus a series of links relating to architecture, Static Docs, and code Pointers. +* [Launcher](../fb/hackin-on-launcher.mdx) - details of hacking on Launcher and the LauncherConfig. +* [Releases](../fb/Flipper-Release-Cycle.mdx) - information on the Flipper release cycle, the release infrastructure @ Meta, and Flipper fbsource pinning. +* [Sandcastle](../fb/sandcastle-overview.mdx) - provides an overview of Continuous Intergration-related topics, including: basic terminology, frameworks, commands, and how to overcome specific issues. +* [Support](../fb/Oncall-Runbook.mdx) - details of alerts, adding a Support group, and the Oncall Runbook. +* **Much more** - have a look at the what's available by exploring the 'Under the Hood' section of the NavBar. + + diff --git a/docs/internals/linters.mdx b/docs/internals/linters.mdx index ce0e9b401..1df2c92c1 100644 --- a/docs/internals/linters.mdx +++ b/docs/internals/linters.mdx @@ -4,7 +4,7 @@ title: Linters sidebar_label: Linters --- -Flipper Desktop comes with a variety of ESLint checks pre-enabled. This enables us to enforce sustainable coding practices and skip over discussions in code reviews. +Flipper Desktop comes with a variety of ESLint checks pre-enabled, which enable us to enforce sustainable coding practices and skip over discussions in code reviews. ## Specific Linters diff --git a/website/sidebars.js b/website/sidebars.js index 11328949e..8a32102d3 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -147,16 +147,16 @@ module.exports = { 'Under the Hood': [ 'internals/index', 'internals/contributing', - { - 'Contributing to the Documentation': ['internals/documentation-formatting', 'internals/documentation-writing-guide'], - }, 'internals/device-identifiers', 'internals/linters', 'extending/public-releases', 'extending/testing-rn', ...fbInternalOnly([ { - "Meta": [ + 'Internal': [ + { + 'Contributing to the Documentation': ['internals/documentation-formatting', 'internals/documentation-writing-guide'], + }, 'fb/arc_uiqr', 'fb/connections', { From 57ca283f31723737685bfd25bac270b21166ffed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Nov 2022 10:42:06 -0800 Subject: [PATCH 0336/1651] Bump typescript from 4.8.4 to 4.9.3 in /js/js-flipper (#4326) Summary: Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.8.4 to 4.9.3.
    Release notes

    Sourced from typescript's releases.

    TypeScript 4.9

    For release notes, check out the release announcement.

    Downloads are available on:

    Changes:

    • 93bd577458d55cd720b2677705feab5c91eb12ce Bump version to 4.9.3 and LKG.
    • 107f832b80df2dc97748021cb00af2b6813db75b Update LKG.
    • 31bee5682df130a14ffdd5742f994dbe7313dd0e Cherry-pick PR #50977 into release-4.9 (#51363) [ #50872 ]
    • 1e2fa7ae15f8530910fef8b916ec8a4ed0b59c45 Update version to 4.9.2-rc and LKG.
    • 7ab89e5c6e401d161f31f28a6c555a3ba530910e Merge remote-tracking branch 'origin/main' into release-4.9
    • e5cd686defb1a4cbdb36bd012357ba5bed28f371 Update package-lock.json
    • 8d40dc15d1b9945837e7860320fdccfe27c40cad Update package-lock.json
    • 5cfb3a2fe344a5350734305193e6cc99516285ca Only call return() for an abrupt completion in user code (#51297)
    • a7a9d158e817fcb0e94dc1c24e0a401b21be0cc9 Fix for broken baseline in yieldInForInInDownlevelGenerator (#51345)
    • 7f8426f4df0d0a7dd8b72079dafc3e60164a23b1 fix for-in enumeration containing yield in generator (#51295)
    • 3d2b4017eb6b9a2b94bc673291e56ae95e8beddd Fix assertion functions accessed via wildcard imports (#51324)
    • 64d0d5ae140b7b26a09e75114517b418d6bcaa9f fix(51301): Fixing an unused import at the end of a line removes the newline (#51320)
    • 754eeb2986bde30d5926e0fa99c87dda9266d01b Update CodeQL workflow and configuration, fix found bugs (#51263)
    • d8aad262006ad2d2c91aa7a0e4449b4b83c57f7b Update package-lock.json
    • d4f26c840b1db76c0b25a405c8e73830a2b45cbc fix(51245): Class with parameter decorator in arrow function causes "convert to default export" refactoring failure (#51256)
    • 16faf45682173ea437a50330feb4785578923d7f Update package-lock.json
    • 8b1ecdb701e2a2e19e9f8bcdd6b2beac087eabee fix(50654): "Move to a new file" breaks the declaration of referenced variable (#50681)
    • 170a17fad57eae619c5ef2b7bdb3ac00d6c32c47 Dom update 2022-10-25 (#51300)
    • 9c4e14d75174432f6a4dc5967a09712a6784ab88 Remove "No type information for this code" from baseline (#51311)
    • 88d25b4f232929df59729156dfda6b65277affec fix(50068): Refactors trigger debug failure when JSX text has a ' and a tag on the same line. (#51299)
    • 8bee69acf410d4986cb0cc102b949e2d133d5380 Update package-lock.json
    • 702de1eeaaef88a189e4d06e5a2aae287853790a Fix early call to return/throw on generator (#51294)
    • 2c12b1499908ad7718e65d20e264561207c22375 Add a GH Action to file a new issue if we go a week without seeing a typescript-error-deltas issue (#51271)
    • 6af270dee09d62516f6dc02ec102a745ffebc037 Update package-lock.json
    • 2cc4c16a26672a7ba6c97ba16309fcf334db7cae Update package-lock.json
    • 60934915d9ccc4ca9c0fb2cd060d7ec81601942b Fix apparent typo in getStringMappingType (#51248)
    • 61c26096e3373719ece686b84c698423890e9a5f Update package-lock.json
    • ef69116c41cb6805f89e6592eacb0ccb7f02207d Generate shortest rootDirs module specifier instead of first possible (#51244)
    • bbb42f453dc684e03d977c5b70391124d57543a9 Fix typo in canWatchDirectoryOrFile found by CodeQL (#51262)
    • a56b254ad3c52b598bc5d44f83f3d0a1cf806068 Include 'this' type parameter in isRelatedTo fast path (#51230)
    • 3abd351c0eea55758f27ee5558a4a1525b77f45b Fix super property transform in async arrow in method (#51240)
    • eed05112180e0d94f78aa02d676d49468f15dc31 Update package-lock.json
    • 2625c1feae25aede35465ca835440fc57bf13d52 Make the init config category order predictable (#51247)
    • 1ca99b34029dafad2c18af7bdc0711f4abf7e522 fix(50551): Destructuring assignment with var bypasses "variable is used before being assigned" check (2454) (#50560)
    • 3f28fa12dfecb8dfd66ce4684bf26f64e1f092f1 Update package-lock.json
    • 906ebe49334a3a9c2dbd73cd3c902898bc712b66 Revert structuredTypeRelatedTo change and fix isUnitLikeType (#51076)
    • 8ac465239f52de1da3ada8cdc4c3f107f4d62e45 change type (#51231)
    • 245a02cbed7ad50a21289730159abc8d19a66f40 fix(51222): Go-to-definition on return statements should jump to the containing function declaration (#51227)
    • 2dff34e8c4a91c0005ca9ccfb7e045e225b6f2e4 markAliasReferenced should include ExportValue as well (#51219)

    ... (truncated)

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=typescript&package-manager=npm_and_yarn&previous-version=4.8.4&new-version=4.9.3)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4326 Reviewed By: antonk52 Differential Revision: D41472364 Pulled By: passy fbshipit-source-id: 624e6e1c371ed9f287b0c66be33d6c1bafd8c98d --- js/js-flipper/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/js-flipper/yarn.lock b/js/js-flipper/yarn.lock index 5205df862..a9b3afd8e 100644 --- a/js/js-flipper/yarn.lock +++ b/js/js-flipper/yarn.lock @@ -3646,9 +3646,9 @@ type-fest@^0.21.3: integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== typescript@^4.7.3: - version "4.8.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + version "4.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" + integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== unbox-primitive@^1.0.2: version "1.0.2" From 748e02c6fb02571c01f8e4894bc8667c63be401f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Nov 2022 10:42:06 -0800 Subject: [PATCH 0337/1651] Bump eslint-plugin-react from 7.31.9 to 7.31.11 in /js/js-flipper (#4323) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.31.9 to 7.31.11.
    Release notes

    Sourced from eslint-plugin-react's releases.

    v7.31.11

    Fixed

    Changed

    https://github.com/facebook/flipper/issues/1000: jsx-eslint/eslint-plugin-react#1000 https://github.com/facebook/flipper/issues/1002: jsx-eslint/eslint-plugin-react#1002 https://github.com/facebook/flipper/issues/1005: jsx-eslint/eslint-plugin-react#1005 https://github.com/facebook/flipper/issues/100: jsx-eslint/eslint-plugin-react#100 https://github.com/facebook/flipper/issues/1010: jsx-eslint/eslint-plugin-react#1010 https://github.com/facebook/flipper/issues/1013: jsx-eslint/eslint-plugin-react#1013 https://github.com/facebook/flipper/issues/1022: jsx-eslint/eslint-plugin-react#1022 https://github.com/facebook/flipper/issues/1029: jsx-eslint/eslint-plugin-react#1029 https://github.com/facebook/flipper/issues/102: jsx-eslint/eslint-plugin-react#102 https://github.com/facebook/flipper/issues/1034: jsx-eslint/eslint-plugin-react#1034 https://github.com/facebook/flipper/issues/1038: jsx-eslint/eslint-plugin-react#1038 https://github.com/facebook/flipper/issues/1041: jsx-eslint/eslint-plugin-react#1041 https://github.com/facebook/flipper/issues/1043: jsx-eslint/eslint-plugin-react#1043 https://github.com/facebook/flipper/issues/1046: jsx-eslint/eslint-plugin-react#1046 https://github.com/facebook/flipper/issues/1047: jsx-eslint/eslint-plugin-react#1047 https://github.com/facebook/flipper/issues/1050: jsx-eslint/eslint-plugin-react#1050 https://github.com/facebook/flipper/issues/1053: jsx-eslint/eslint-plugin-react#1053 https://github.com/facebook/flipper/issues/1057: jsx-eslint/eslint-plugin-react#1057 https://github.com/facebook/flipper/issues/105: jsx-eslint/eslint-plugin-react#105 https://github.com/facebook/flipper/issues/1061: jsx-eslint/eslint-plugin-react#1061 https://github.com/facebook/flipper/issues/1062: jsx-eslint/eslint-plugin-react#1062 https://github.com/facebook/flipper/issues/1070: jsx-eslint/eslint-plugin-react#1070 https://github.com/facebook/flipper/issues/1071: jsx-eslint/eslint-plugin-react#1071 https://github.com/facebook/flipper/issues/1073: jsx-eslint/eslint-plugin-react#1073 https://github.com/facebook/flipper/issues/1076: jsx-eslint/eslint-plugin-react#1076 https://github.com/facebook/flipper/issues/1079: jsx-eslint/eslint-plugin-react#1079 https://github.com/facebook/flipper/issues/1088: jsx-eslint/eslint-plugin-react#1088 https://github.com/facebook/flipper/issues/1098: jsx-eslint/eslint-plugin-react#1098 https://github.com/facebook/flipper/issues/1101: jsx-eslint/eslint-plugin-react#1101 https://github.com/facebook/flipper/issues/1103: jsx-eslint/eslint-plugin-react#1103 https://github.com/facebook/flipper/issues/110: jsx-eslint/eslint-plugin-react#110 https://github.com/facebook/flipper/issues/1116: jsx-eslint/eslint-plugin-react#1116 https://github.com/facebook/flipper/issues/1117: jsx-eslint/eslint-plugin-react#1117 https://github.com/facebook/flipper/issues/1119: jsx-eslint/eslint-plugin-react#1119 https://github.com/facebook/flipper/issues/1121: jsx-eslint/eslint-plugin-react#1121 https://github.com/facebook/flipper/issues/1122: jsx-eslint/eslint-plugin-react#1122 https://github.com/facebook/flipper/issues/1123: jsx-eslint/eslint-plugin-react#1123 https://github.com/facebook/flipper/issues/1130: jsx-eslint/eslint-plugin-react#1130 https://github.com/facebook/flipper/issues/1131: jsx-eslint/eslint-plugin-react#1131

    ... (truncated)

    Changelog

    Sourced from eslint-plugin-react's changelog.

    7.31.11 - 2022.11.17

    Fixed

    Changed

    https://github.com/facebook/flipper/issues/3490: jsx-eslint/eslint-plugin-react#3490 https://github.com/facebook/flipper/issues/3484: jsx-eslint/eslint-plugin-react#3484 https://github.com/facebook/flipper/issues/3473: jsx-eslint/eslint-plugin-react#3473 https://github.com/facebook/flipper/issues/3469: jsx-eslint/eslint-plugin-react#3469 https://github.com/facebook/flipper/issues/3464: jsx-eslint/eslint-plugin-react#3464 https://github.com/facebook/flipper/issues/3459: jsx-eslint/eslint-plugin-react#3459

    7.31.10 - 2022.10.10

    Fixed

    https://github.com/facebook/flipper/issues/3455: jsx-eslint/eslint-plugin-react#3455

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=eslint-plugin-react&package-manager=npm_and_yarn&previous-version=7.31.9&new-version=7.31.11)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4323 Reviewed By: antonk52 Differential Revision: D41472345 Pulled By: passy fbshipit-source-id: 390a1440fe42d5fb2dcb3421284a4721dd21dac1 --- js/js-flipper/package.json | 2 +- js/js-flipper/yarn.lock | 273 ++++++++++++++++++++++--------------- 2 files changed, 165 insertions(+), 110 deletions(-) diff --git a/js/js-flipper/package.json b/js/js-flipper/package.json index 7ec18e574..283e6e3f7 100644 --- a/js/js-flipper/package.json +++ b/js/js-flipper/package.json @@ -45,7 +45,7 @@ "@types/node": "^17.0.41", "@types/sinon": "^10.0.11", "@types/ws": "^8.5.3", - "@typescript-eslint/eslint-plugin": "^5.27.1", + "@typescript-eslint/eslint-plugin": "^5.43.0", "@typescript-eslint/parser": "^5.27.1", "ansi-to-html": "^0.7.2", "cross-env": "^7.0.3", diff --git a/js/js-flipper/yarn.lock b/js/js-flipper/yarn.lock index a9b3afd8e..b8fffdc03 100644 --- a/js/js-flipper/yarn.lock +++ b/js/js-flipper/yarn.lock @@ -758,6 +758,11 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.4.tgz#ad899dad022bab6b5a9f0a0fe67c2f7a4a8950ed" integrity sha512-fOwvpvQYStpb/zHMx0Cauwywu9yLDmzWiiQBC7gJyq5tYLUXFZvDG7VK1B7WBxxjBJNKFOZ0zLoOQn8vmATbhw== +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + "@types/sinon@^10.0.11": version "10.0.13" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83" @@ -794,16 +799,17 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.27.1": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz#778b2d9e7f293502c7feeea6c74dca8eb3e67511" - integrity sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A== +"@typescript-eslint/eslint-plugin@^5.43.0": + version "5.44.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.44.0.tgz#105788f299050c917eb85c4d9fd04b089e3740de" + integrity sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw== dependencies: - "@typescript-eslint/scope-manager" "5.39.0" - "@typescript-eslint/type-utils" "5.39.0" - "@typescript-eslint/utils" "5.39.0" + "@typescript-eslint/scope-manager" "5.44.0" + "@typescript-eslint/type-utils" "5.44.0" + "@typescript-eslint/utils" "5.44.0" debug "^4.3.4" ignore "^5.2.0" + natural-compare-lite "^1.4.0" regexpp "^3.2.0" semver "^7.3.7" tsutils "^3.21.0" @@ -818,14 +824,6 @@ "@typescript-eslint/typescript-estree" "5.43.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz#873e1465afa3d6c78d8ed2da68aed266a08008d0" - integrity sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw== - dependencies: - "@typescript-eslint/types" "5.39.0" - "@typescript-eslint/visitor-keys" "5.39.0" - "@typescript-eslint/scope-manager@5.43.0": version "5.43.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz#566e46303392014d5d163704724872e1f2dd3c15" @@ -834,38 +832,33 @@ "@typescript-eslint/types" "5.43.0" "@typescript-eslint/visitor-keys" "5.43.0" -"@typescript-eslint/type-utils@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz#0a8c00f95dce4335832ad2dc6bc431c14e32a0a6" - integrity sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA== +"@typescript-eslint/scope-manager@5.44.0": + version "5.44.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz#988c3f34b45b3474eb9ff0674c18309dedfc3e04" + integrity sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g== dependencies: - "@typescript-eslint/typescript-estree" "5.39.0" - "@typescript-eslint/utils" "5.39.0" + "@typescript-eslint/types" "5.44.0" + "@typescript-eslint/visitor-keys" "5.44.0" + +"@typescript-eslint/type-utils@5.44.0": + version "5.44.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.44.0.tgz#bc5a6e8a0269850714a870c9268c038150dfb3c7" + integrity sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w== + dependencies: + "@typescript-eslint/typescript-estree" "5.44.0" + "@typescript-eslint/utils" "5.44.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.39.0.tgz#f4e9f207ebb4579fd854b25c0bf64433bb5ed78d" - integrity sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw== - "@typescript-eslint/types@5.43.0": version "5.43.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.43.0.tgz#e4ddd7846fcbc074325293515fa98e844d8d2578" integrity sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg== -"@typescript-eslint/typescript-estree@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz#c0316aa04a1a1f4f7f9498e3c13ef1d3dc4cf88b" - integrity sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA== - dependencies: - "@typescript-eslint/types" "5.39.0" - "@typescript-eslint/visitor-keys" "5.39.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" +"@typescript-eslint/types@5.44.0": + version "5.44.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.44.0.tgz#f3f0b89aaff78f097a2927fe5688c07e786a0241" + integrity sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ== "@typescript-eslint/typescript-estree@5.43.0": version "5.43.0" @@ -880,25 +873,32 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.39.0.tgz#b7063cca1dcf08d1d21b0d91db491161ad0be110" - integrity sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg== +"@typescript-eslint/typescript-estree@5.44.0": + version "5.44.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz#0461b386203e8d383bb1268b1ed1da9bc905b045" + integrity sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw== + dependencies: + "@typescript-eslint/types" "5.44.0" + "@typescript-eslint/visitor-keys" "5.44.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.44.0": + version "5.44.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.44.0.tgz#d733da4d79d6c30f1a68b531cdda1e0c1f00d52d" + integrity sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.39.0" - "@typescript-eslint/types" "5.39.0" - "@typescript-eslint/typescript-estree" "5.39.0" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.44.0" + "@typescript-eslint/types" "5.44.0" + "@typescript-eslint/typescript-estree" "5.44.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" - -"@typescript-eslint/visitor-keys@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz#8f41f7d241b47257b081ddba5d3ce80deaae61e2" - integrity sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg== - dependencies: - "@typescript-eslint/types" "5.39.0" - eslint-visitor-keys "^3.3.0" + semver "^7.3.7" "@typescript-eslint/visitor-keys@5.43.0": version "5.43.0" @@ -908,6 +908,14 @@ "@typescript-eslint/types" "5.43.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@5.44.0": + version "5.44.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz#10740dc28902bb903d12ee3a005cc3a70207d433" + integrity sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ== + dependencies: + "@typescript-eslint/types" "5.44.0" + eslint-visitor-keys "^3.3.0" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -994,15 +1002,15 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" -array-includes@^3.1.4, array-includes@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== +array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" array-union@^2.1.0: @@ -1019,16 +1027,27 @@ array.prototype.flat@^1.2.5: define-properties "^1.1.3" es-abstract "^1.19.0" -array.prototype.flatmap@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" - integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" @@ -1411,7 +1430,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: +es-abstract@^1.19.0, es-abstract@^1.19.5: version "1.20.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.3.tgz#90b143ff7aedc8b3d189bcfac7f1e3e3f81e9da1" integrity sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw== @@ -1441,6 +1460,36 @@ es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19 string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" +es-abstract@^1.20.4: + version "1.20.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -1605,24 +1654,25 @@ eslint-plugin-react-hooks@^4.5.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.29.4: - version "7.31.9" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.9.tgz#7474ad4e21db368f61d17e1f2e78d43dbbdd50b2" - integrity sha512-vrVJwusIw4L99lyfXjtCw8HWdloajsiYslMavogrBe2Gl8gr95TJsJnOMRasN4b4N24I3XuJf6aAV6MhyGmjqw== + version "7.31.11" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" + integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== dependencies: - array-includes "^3.1.5" - array.prototype.flatmap "^1.3.0" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.1" - object.values "^1.1.5" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" prop-types "^15.8.1" resolve "^2.0.0-next.3" semver "^6.3.0" - string.prototype.matchall "^4.0.7" + string.prototype.matchall "^4.0.8" eslint-rule-composer@^0.3.0: version "0.3.0" @@ -2145,7 +2195,7 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-callable@^1.1.4, is-callable@^1.2.6: +is-callable@^1.1.4, is-callable@^1.2.6, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -2921,6 +2971,11 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -2984,40 +3039,40 @@ object.assign@^4.1.3, object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -object.hasown@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" - integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" -object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== +object.values@^1.1.5, object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" once@^1.3.0: version "1.4.0" @@ -3256,7 +3311,7 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== -regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -3455,18 +3510,18 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.matchall@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" - integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" has-symbols "^1.0.3" internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" + regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" string.prototype.trimend@^1.0.5: From ea0af7c9312aab3f72ecec0be1ec8fe00731ed30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Nov 2022 10:42:06 -0800 Subject: [PATCH 0338/1651] Bump sinon from 14.0.1 to 14.0.2 in /js/js-flipper (#4315) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [sinon](https://github.com/sinonjs/sinon) from 14.0.1 to 14.0.2.
    Changelog

    Sourced from sinon's changelog.

    14.0.2

    • 4d70f6e0 Upgrade nise to latest (Morgan Roderick)
    • 96a0d756 Update @​sinonjs/samsam to latest (Morgan Roderick)
    • babb4736 Prefer @​sinonjs/commons@​2 (Morgan Roderick)

      That makes ES2017 support explicit

    Released by Morgan Roderick on 2022-11-07.

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sinon&package-manager=npm_and_yarn&previous-version=14.0.1&new-version=14.0.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4315 Reviewed By: antonk52 Differential Revision: D41472337 Pulled By: passy fbshipit-source-id: 7dea0e6e5f805770cf4ad6c634117b9a2fbd73e0 --- js/js-flipper/yarn.lock | 52 ++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/js/js-flipper/yarn.lock b/js/js-flipper/yarn.lock index b8fffdc03..50ea264d6 100644 --- a/js/js-flipper/yarn.lock +++ b/js/js-flipper/yarn.lock @@ -638,26 +638,40 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.26.tgz#84f9e8c1d93154e734a7947609a1dc7c7a81cc22" integrity sha512-1ZVIyyS1NXDRVT8GjWD5jULjhDyM3IsIHef2VGUMdnWOlX2tkPjyEX/7K0TGSH2S8EaPhp1ylFdjSjUGQ+gecg== -"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": +"@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@>=5", "@sinonjs/fake-timers@^9.1.2": +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^7.0.4": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" + integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/fake-timers@^9.1.2": version "9.1.2" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== dependencies: "@sinonjs/commons" "^1.7.0" -"@sinonjs/samsam@^6.1.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.1.1.tgz#627f7f4cbdb56e6419fa2c1a3e4751ce4f6a00b1" - integrity sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA== +"@sinonjs/samsam@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-7.0.1.tgz#5b5fa31c554636f78308439d220986b9523fc51f" + integrity sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw== dependencies: - "@sinonjs/commons" "^1.6.0" + "@sinonjs/commons" "^2.0.0" lodash.get "^4.4.2" type-detect "^4.0.8" @@ -2981,13 +2995,13 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -nise@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.1.tgz#ac4237e0d785ecfcb83e20f389185975da5c31f3" - integrity sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A== +nise@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.2.tgz#a7b8909c216b3491fd4fc0b124efb69f3939b449" + integrity sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA== dependencies: - "@sinonjs/commons" "^1.8.3" - "@sinonjs/fake-timers" ">=5" + "@sinonjs/commons" "^2.0.0" + "@sinonjs/fake-timers" "^7.0.4" "@sinonjs/text-encoding" "^0.7.1" just-extend "^4.0.2" path-to-regexp "^1.7.0" @@ -3442,15 +3456,15 @@ signal-exit@^3.0.3, signal-exit@^3.0.7: integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sinon@^14.0.0: - version "14.0.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.1.tgz#9f02e13ad86b695c0c554525e3bf7f8245b31a9c" - integrity sha512-JhJ0jCiyBWVAHDS+YSjgEbDn7Wgz9iIjA1/RK+eseJN0vAAWIWiXBdrnb92ELPyjsfreCYntD1ORtLSfIrlvSQ== + version "14.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.2.tgz#585a81a3c7b22cf950762ac4e7c28eb8b151c46f" + integrity sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w== dependencies: - "@sinonjs/commons" "^1.8.3" + "@sinonjs/commons" "^2.0.0" "@sinonjs/fake-timers" "^9.1.2" - "@sinonjs/samsam" "^6.1.1" + "@sinonjs/samsam" "^7.0.1" diff "^5.0.0" - nise "^5.1.1" + nise "^5.1.2" supports-color "^7.2.0" sisteransi@^1.0.5: From 3044ddc5c19a7fa457d9df7b5db7cb69dfe711ac Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Fri, 25 Nov 2022 08:14:08 -0800 Subject: [PATCH 0339/1651] Remove checkbox as boolean value Summary: Remove checkbox as we currently don't support editing values. Instead replace with a simple 'TRUE', 'FALSE' text. Reviewed By: antonk52 Differential Revision: D41532898 fbshipit-source-id: d4af37e30eb21ab761c39cb4ae45337247c80c9d --- .../components/sidebar/inspector/AttributesInspector.tsx | 6 ++++-- .../ui-debugger/components/sidebar/inspector/Styles.tsx | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx index 5b9c96bcf..13e948887 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx @@ -16,7 +16,7 @@ import { UINode, } from '../../../types'; import {DataInspector, Panel, styled} from 'flipper-plugin'; -import {Checkbox, Col, Row} from 'antd'; +import {Col, Row} from 'antd'; import {displayableName} from '../utilities/displayableName'; import ColorInspector from './ColorInspector'; import SizeInspector from './SizeInspector'; @@ -26,6 +26,7 @@ import Coordinate3DInspector from './Coordinate3DInspector'; import CoordinateInspector from './CoordinateInspector'; import { AutoMarginStyle, + BooleanAttributeValueStyle, EnumAttributeValueStyle, NumberAttributeValueStyle, ObjectContainerStyle, @@ -36,6 +37,7 @@ import {Glyph} from 'flipper'; import {transform} from '../../../dataTransform'; const NumberValue = styled.span(NumberAttributeValueStyle); +const BooleanValue = styled.span(BooleanAttributeValueStyle); const TextValue = styled.span(TextAttributeValueStyle); const EnumValue = styled.span(EnumAttributeValueStyle); const ObjectContainer = styled.div(ObjectContainerStyle); @@ -98,7 +100,7 @@ function create( case 'boolean': return ( - + {inspectable.value ? 'TRUE' : 'FALSE'} ); case 'enum': diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/Styles.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/Styles.tsx index 42519278f..849650cf8 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/Styles.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/Styles.tsx @@ -55,6 +55,12 @@ export const NumberAttributeValueStyle = { display: 'flex', } as const; +export const BooleanAttributeValueStyle = { + color: theme.semanticColors.booleanValue, + fontSize: theme.fontSize.small, + alignItems: 'center', +} as const; + export const TextAttributeValueStyle = { color: theme.semanticColors.stringValue, display: 'flex', From 7f5592a68b6844d9dfe2a23480850df2b52015b5 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Mon, 28 Nov 2022 02:40:38 -0800 Subject: [PATCH 0340/1651] Suggest ui-debugger from layout Summary: Increase awareness of ui-debugger by displaying a notification. Reviewed By: LukeDefeo Differential Revision: D41530681 fbshipit-source-id: bf0aaeb8bb5fdc88e2425371fb04155cec739ba4 --- desktop/plugins/public/layout/index.tsx | 44 ++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/desktop/plugins/public/layout/index.tsx b/desktop/plugins/public/layout/index.tsx index 126d2eb4d..bda5d01d5 100644 --- a/desktop/plugins/public/layout/index.tsx +++ b/desktop/plugins/public/layout/index.tsx @@ -34,7 +34,7 @@ import { IDEFileResolver, IDEType, } from 'flipper'; -import {message} from 'antd'; +import {message, notification} from 'antd'; import {getFlipperLib} from 'flipper-plugin'; type State = { @@ -216,6 +216,10 @@ export default class LayoutPlugin extends FlipperPlugin< private static isMylesInvoked = false; + componentDidMount() { + this.onSuggestUIDebugger(); + } + init() { if (!this.props.persistedState) { // If the selected plugin from the previous session was layout, then while importing the flipper export, the redux store doesn't get updated in the first render, due to which the plugin crashes, as it has no persisted state @@ -325,6 +329,43 @@ export default class LayoutPlugin extends FlipperPlugin< } }; + onSuggestUIDebugger = () => { + if ( + !getFlipperLib().GK('flipper_ui_debugger') && + this.device.os !== 'Android' + ) { + return; + } + + const key = `open-ui-debugger-${Date.now()}`; + const btn = ( + + ); + + notification.open({ + message: 'A new UI Debugger is available! 🎉', + description: `A new plugin for UI debugging is available! + Have you considered making the switch? Find it on your left panel.`, + duration: 30, + type: 'info', + btn, + key, + }); + }; + onToggleSnapshotMode = () => { this.setState((prevState) => ({inSnapshotMode: !prevState.inSnapshotMode})); }; @@ -340,6 +381,7 @@ export default class LayoutPlugin extends FlipperPlugin< }) : this.client; } + onToggleAlignmentMode = () => { if (this.state.selectedElement) { if (this.client.isConnected) { From 56b717c197f54aa991ea2a4d0eda9a004fa8c665 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Mon, 28 Nov 2022 02:54:42 -0800 Subject: [PATCH 0341/1651] Track performance Summary: Track performance for subtree updates Reviewed By: antonk52 Differential Revision: D41531057 fbshipit-source-id: b9cfd04e5d22796f026c56d2fc66c7dea8accb78 --- desktop/plugins/public/ui-debugger/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index af5796227..df1af2da3 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -44,6 +44,7 @@ export function plugin(client: PluginClient) { limit: 10 * 1024, }); client.onMessage('perfStats', (event) => { + client.logger.track('performance', 'subtreeUpdate', event, 'ui-debugger'); perfEvents.append(event); }); From ced04c7cec77517ffad7e504df6b5a67799e492f Mon Sep 17 00:00:00 2001 From: Kevin Strider Date: Mon, 28 Nov 2022 03:46:26 -0800 Subject: [PATCH 0342/1651] Under the Hood - Part 4 Summary: This diff includes minor changes to the pages within the Under the Hood section of Flipper Docs. The page Creating Plugins -> Desktop Plugin APIs -> QPL Linting -> Building a Linter is now removed from the sidebar. Reviewed By: lblasa Differential Revision: D41533283 fbshipit-source-id: 63e50210815fe2b67ea54991eb8a7bc16e04e1be --- docs/internals/documentation-formatting.mdx | 93 ++++--- docs/internals/documentation-standards.md | 66 +++++ .../internals/documentation-writing-guide.mdx | 252 ++++++++++++++---- docs/internals/index.mdx | 2 +- website/sidebars.js | 8 +- 5 files changed, 321 insertions(+), 100 deletions(-) create mode 100644 docs/internals/documentation-standards.md diff --git a/docs/internals/documentation-formatting.mdx b/docs/internals/documentation-formatting.mdx index 5fb18f517..0ba239801 100644 --- a/docs/internals/documentation-formatting.mdx +++ b/docs/internals/documentation-formatting.mdx @@ -1,35 +1,40 @@ --- id: documentation-formatting -title: Formatting Tips +title: Markdown Formatting +description: Tips and guidelines for Mardown used within Static Docs documentation +keywords: + - flipper website formatting + - flipper docs formatting --- This page provides recommendations on the use of a variety of Markdown features that help you create properly formatted documentation. -## Subsections +For tips and guidelines on when to use the same tools, and several others, see the [Writing Guide](documentation-writing-guide.mdx). -Use regular H2..H6 markdown headings for subsections. +## Structural format -```markdown -## Level 2 title +### Headers -### Level 3 title +* Start each main section with a level 2 header. +* Sub-sections should follow a hierarchical structure and should use header levels 3 to 5. -#### Level 4 title +**Markdown Example**: + +The following example Markdown shows how to use headers. + +```bash +## Level 2 header + +### Level 3 header + +#### Level 4 header + +##### Level 5 header ``` -```diff -- **Testing complex components** -+ ### Testing complex components -``` +## Markdown tools -:::tip - -* The page title will implicitly be formatted with H1, so start with H2. - -* Headings appear in the Table of Contents, which gives the reader an overview of the page and assists with navigation. -::: - -## Backticks +### Backticks Use Markdown backticks ( \` \), to provide emphasis for items such as file names, classes, methods, parameters, and expressions. @@ -91,26 +96,20 @@ addPlugin({ For more code blocks features, such as line highlighting, see the Docusaurus [Code blocks](https://docusaurus.io/docs/markdown-features/code-blocks) document. -## Links +### Links -Docusaurus supports regular Markdown links with absolute URLs, relative URLs, and relative file paths. +Avoid using bare URLs in your documentation. Instead, use referenced hyperlinks, as shown in the following table. -However, due to the [trailing slash issue](https://github.com/facebook/docusaurus/pull/4908), it's strongly recommended to link to page files (including their extension) instead of the page's URL. - -```diff -- Don't link to markdown page URLs: [Create a page](create-a-page). -+ Create links using full file names: [Create a page](create-a-page.md). -other text -- [Create internal only document](contributing-documentation#internal-only-content] -+ [Create internal only document](contributing-documentation.md#internal-only-content] -``` +| Type | Code | Displays as | +| :-- | :-- | :-- | +| **Bare URL** | `Upload the video to Pixelcloud at https://www.internalfb.com/intern/px/search` | Upload the video to Pixelcloud at https://www.internalfb.com/intern/px/search | +| **Referenced** | `Upload the video to [Pixelcloud](https://www.internalfb.com/intern/px/search)`| Upload the video to [Pixelcloud](https://www.internalfb.com/intern/px/search) | :::tip -Don't use absolute or internal docs links. -With relative links, the Static Docs engine will automatically use the right host depending on whether docs are accessed externally or internally. +Notice the use of square brackets around 'PixelCloud' in the referenced hyperlink. ::: -## Tabs +### Tabs To organize content in tabs, Docusaurus provides the `Tabs` React component: @@ -120,16 +119,16 @@ import TabItem from '@theme/TabItem'; - - Information about Flipper on iOS. + + Information about using Kotlin with Flipper. - - Information about Flipper on Android. + + Information about using Java with Flipper. ``` @@ -140,16 +139,16 @@ import TabItem from '@theme/TabItem'; **Result:** - - Information about Flipper on iOS. + + Information about using Kotlin with Flipper. - - Information about Flipper on Android. + + Information about using Java with Flipper. diff --git a/docs/internals/documentation-standards.md b/docs/internals/documentation-standards.md new file mode 100644 index 000000000..041593cb3 --- /dev/null +++ b/docs/internals/documentation-standards.md @@ -0,0 +1,66 @@ +--- +id: documentation-standards +title: Flipper Docs Standards +sidebar_label: Flipper Docs Standards +description: Provides a set of standards requirements to persist documentation standards +keywords: + - Flipper docs standards + - Flipper docs rules +--- +import useBaseUrl from '@docusaurus/useBaseUrl'; + +## Key standards + +The Flipper Docs team is committed to writing docs that serve users. To measure and maintain satisfactory documentation quality, the following key standards are used: + +| [Completeness](#completeness) | [Discoverability](#discoverability) | [Accessibility](#accessibility) | [Accuracy](#accuracy) | +|:--|:--|:--|:--| +| Is the information sufficient to give the reader a good understanding or to provide a solid solution to a problem? | If the information exists, is it easy to find? | Is the information accessible to readers of different capability? | Is the information accurate and up to date? | + +To help you achieve each of these standards, several points for consideration are listed in the following sub-sections (or you can select a column header to link to its sub-section). + +### Completeness + +Completeness is determined by how many questions, and the type of questions, the reader may have after reading your document. For example, if after reading a Flipper document on 'getting help and providing feedback', the reader asked the question "Where do I go if I'm a noob?" then the document might not be complete. + +To increase your document's completeness, consider the following: + +* Limit Assumptions. +* Trade-offs and limitations of APIs and approaches should be discussed openly. +* Where possible, describe alternatives to what you're describing: understanding the available options empowers people to feel confident in their choices. +* Give tips you think are particularly useful. +* The user shouldn't have to navigate to different documentation sources (such as Wiki pages and posts) to gain a core understanding. +* Explain what success looks like. +* The discussion of a technical topic shouldn't be in the 'Getting Started' section. +* Is each step explained, or does it rely on other knowledge? +* Empathize with the reader. Consider questions such as: "*Are they trying to learn how to do something?*" and "*Has something gone wrong and they're trying to figure out if a solution is possible?*" + +### Discoverability + +Discoverability is the degree to which a piece of information (instruction, guideline, code snippet, and so on) can be found within the Flipper Documentation website. + +To improve your document's discoverability, consider the following: + +* Add appropriate keywords to your file. The keywords are used by Static Doc's search tool. +* Is the information easy to find. Test for keyword searches to see if and where in the result list your documentation is listed. +* Consider the placement of the file (if you're adding a new one). + +### Accessibility + +Accessibility is the measure of how easy it is for users of different capability to read, understand and navigate your documentation. + +To improve your document's accessibility, think about the following: + +* Is non-standard terminology fully defined before being used (this includes the use of abbreviations). +* Is it easy to understand and apply the documented information? +* The most effective medium (words, diagrams, images, videos, examples, or a combination). + +### Accuracy + +Accuracy is determined by how relevant, correct, and up to date the content of your documentation is. + +To ensure your document's accuracy, think about the following: + +* Ensure that all 'Live' code samples are relevant to the topic being covered and provide appropriate output. +* Explain the relevant aspects of the snippet functionality clearly. +* When making any changes to procedure, architecture, or code, make the documentation of those changes part of the change request. diff --git a/docs/internals/documentation-writing-guide.mdx b/docs/internals/documentation-writing-guide.mdx index 043720dfd..2b3b39db4 100644 --- a/docs/internals/documentation-writing-guide.mdx +++ b/docs/internals/documentation-writing-guide.mdx @@ -1,67 +1,139 @@ --- id: documentation-writing-guide title: Writing Guide +description: Provides tips and guidelines for effective writing. +keywords: + - flipper website writing tips + - flipper docs writing tips + - flipper documentation guidelines --- import useBaseUrl from '@docusaurus/useBaseUrl'; -This page contains tips and guidelines on how to create effective documentation that will be valued by your target reader (a measure of its success). +To assist you in writing your documentation, this page contains tips and guidelines on how to create effective documentation that is valued by your target reader (a measure of its success). -We use StaticDocs, which is based on [Docusaurus](https://docusaurus.io/), for the Flipper documentation website. -The [StaticDocs](https://www.internalfb.com/intern/staticdocs/staticdocs/) homepage is an excellent starting point for information. +Flipper uses StaticDocs, which is based on [Docusaurus](https://docusaurus.io/), for the Flipper documentation website. The [StaticDocs](https://www.internalfb.com/intern/staticdocs/staticdocs/) homepage is an excellent starting point for information. ## Why Documentation Is Needed Some of the benefits of documentation include: -* It's immediately available from the [Flipper Documentation website](https://www.internalfb.com/intern/staticdocs/flipper/) -* Reduces the number of requests for support. -* Provides a permanent record of your valuable knowledge. +* **Immediate availability** - from the easily accessible [Flipper Documentation website](https://www.internalfb.com/intern/staticdocs/flipper/) +* **Fewer support requests** - the more information that's available online, the fewer the number of support requests. Also, colleagues that raise requests can be directed to the documentation website, which frees up the time of the person being asked. +* **Knowledge base** - provides a permanent record of Flipper knowledge, rather than it being isolated to one or more specialists. By making documentation part of your work routine, it becomes less of a burden: the more you write, the easier it gets. -## Getting Started +## Adding or editing content -Often, the most difficult aspect of creating documentation is figuring out how to get started. The following five steps provide some guidance that may help. +You may be creating content for a new document or updating the content of an existing document. Whatever the reason, there are two key points to consider before you make any changes: -1. **Consider your target reader** - reflect on questions similar to the following: +1. [Tone of voice](#tone-of-voice) - this is the 'voice style' used to communicate the content to the reader. +2. [Documentation style](#documentation-style) - this is the tools used to communicate the content to the reader, such as bullet points, images, tables, bold text, headers, videos, and so on. The trick is knowing when to use them and how to use them effectively. - * Why does the reader need this documentation? - * What is the reader's level of expertise? - * What is the best way to present the information to the reader? +Both of these key points are detailed in the following sub-sections. -2. **Create a document outline** - create a list of topics you would like to cover that help you to explain the main subject matter. Bearing in mind your target reader, put the topics into the order in which you think they make the most sense: this may involve grouping topics and noting any links between them. -3. **Create a new page** - when relevant, create a new page (.md file) in the correct repository folder, making sure you insert the required metadata. -4. **Convert topics into headers** - once you've organised the topics, convert them into headers for sections (topic groups) and sub-sections (topics). See below for details of how to use [Headers](#headers). -5. **Create an introduction** - write a brief introduction to your documentation, which states its purpose and an overview of its contents. Your reader will use this to save time and to determine if the document contains the required knowledge or not. +## Tone of voice -After taking these five steps, you'll have a basic structure for your documentation! The next step is to write the core content, that is, the information that is contained by each header. +:::note Important -## Creating the Core Content +The content of any material you create for any aspect of Meta's documentation must fully comply with Meta's values, policies, and initiatives, and must incorporate Meta's principles of diversity, equity and inclusion. -Using the right tone of voice can make your document interesting, engaging, and memorable. The remainder of this page contains guidelines on which tone to use and how to use a range of Markdown features. +For details, see the following: -### Tone of Voice +* [Meta People Portal](https://www.internalfb.com/intern/people/portal/facebook-inc). +* [Building Better: The Meta Code of Conduct](https://s21.q4cdn.com/399680738/files/doc_downloads/governance_documents/2022/06/FB_CoC_EXTERNAL_en_EN_Update_Final-6_2-FINAL-ua.pdf). +::: -'Tone of voice' is the style that you use to communicate the information contained within your documentation, it's like tone of voice you choose to use when speaking with someone. The following guidelines may help you to adopt the right tone of voice in your documentation. +Consider how you'd explain a work-related task to a colleague; the words you'd use and the manner in which you'd say them. Following are some points to consider, which will help you to adopt the write 'tone of voice' in your documentation: -* **Write in the Second Person (You/Your/Yours)** - the main benefit is that it increases the readers' sense of involvement in the content and promotes a friendly tone by addressing your reader directly. As a result, your document's reader will find the content more engaging, easier to remember, and easier to understand. -**Note**: this page has been written using the second person. +* **Semi-formal** - imagine talking to a colleague whom you've just met in the workplace. When explaining something to them, you wouldn't want to be too formal, but you'd also like to appear friendly. +* **Professional** - all communication must follow Meta company guidelines and policies and incorporate the principles of diversity, equity and inclusion. +* **Descriptive** - don't go off-topic: keep to the topic that is relevant to the page/section. Textual information should be well-explained but not excessive. Lists, images and videos can be used to reduce large blocks of text (see [Markdown Formatting](documentation-formatting.mdx)). +* **Engaging** - the correct use of pronouns can aid comprehension and help to keep the reader engaged and comprehension (see below). -* **Use First-Person Plural Pronouns (We/Our) sparingly** - the main reason is that such pronouns emphasise the writer's team or organisation rather than the reader, which goes against the principle of writing in the second person. The use of 'we' and 'our' can cause distraction or irritation to the reader because the reader might not know which group of people are being referred to with 'we' or 'our'. 'We' could even mean the writer and the reader! +### The magic of pronouns + +The correct use of pronouns can increase the reader's engagement, enjoyment, and comprehension of the information in your documentation. Following are some guidelines on when to use particular pronouns (it does matter): + +* **Use the pronouns 'You', 'Your', and 'Yours'** - the main benefit of using them is that it increases the reader's sense of involvement in the content and promotes a friendly tone by addressing the reader directly (think about how you'd explain something complex to your colleague). As a result, your page's reader will find the content more engaging, easier to remember, and easier to understand. These pronouns are especially useful when you want to detail a series of steps that the reader must follow. +* **Use the pronouns 'We' and 'Our'** - the main reason for their use is that they emphasise the reader's team or organisation, which gives the reader a sense of community and team spirit. These pronouns are especially useful when you want to describe something that involves the Flipper team, such as the reasons for the decision to use a particular technology or how the reader's actions can benefit the team. +* **Don't use the pronouns 'I' and 'My'** - the main reason is that it emphasizes the writer rather than the reader. Also, it may cause confusion, reduce engagement, or be the source of annoyance as the reader may not know the identity of the writer. + +### Spelling and grammar + +Bad spelling and grammar can have a negative effect on the tone of voice in your document (making it irritating to read and difficult to understand). + +The problem is that we all make unintentional spelling and grammar errors when writing. Fortunately, there are three steps you can take to reduce (or, hopefully, remove all) those errors: + +1. **Read it** - when you think you've finished, read though the content and make the appropriate corrections. +2. **MS Word it** - use the spelling and grammar checker to identify any errors. +3. **Review it** - before your page is published, it will be reviewed as part of its Diff lifecycle. Make sure you consider all of the changes suggested by the Reviewers. + +This is not going to be 100% effective every time, but it will definitely help to get as close to 100% as possible. + +## Documentation style + +Documentation style involves two areas of interest: + +* **Structural Format** - this includes the format of the page title and the headers and includes topics such as: + * How many words to use. + * How to capitalise. + * How to improve the discoverability of the content. +* **Documentation Tools** - this includes the following: + * When and how to use the available tools (such as bullet points, tables images, videos, and much more). + * How to format the content for the selected tool. + +## Structural format + +### Page title + +The title provides an at-a-glance summary of a page's content. It is also used in the SideBar so assists with navigation of the Flipper Documentation website. Consider the following guidelines before choosing a page title. + +* **Short but descriptive** - the title should be short but also descriptive enough to convey the main topic of the page's content. +* **Capitalization** - use the 'Title' case associated with the [Chicago Manual of Style (17th edition)](https://www.chicagomanualofstyle.org/home.html). For details of a helpful online tool, see [Header and title capitalization tool](#header-and-title-capitalization-tool), below. +* **Titles should be unique** - use a title that is not used elsewhere within the Flipper Documentation website. ### Headers -Good documentation is split into a series of sections that are logically structured and cover the subject matter. Headings are used for the document's Table of Contents, which provide the reader with an outline of the document and assist with navigation. +Good documentation is split into a series of sections that are logically structured and cover the subject matter. Headings are used for the document's Table of Contents, which provide the reader with an outline of the document and assists with navigation. -* **Headers indicate document structure** - start each main section with a level 2 header. Sub-sections (header levels 3 to 6) should follow a hierarchical structure and be associated with, or relevant to, their parent header. +* **Headers indicate document structure** - start each main section with a level 2 header. Sub-sections (header levels 3 to 5) should follow a hierarchical structure and be associated with, or relevant to, their parent header. * **Keep headers short** - while keeping your headers as short as possible, make sure they contain enough words to indicate the information contained within the section/sub-section. * **Keep Headers unique** - consider how a header will be listed in the result set of a search from the Static Docs website. -* **Capitalisation of headers** - capitalisation should be consistent throughout all Flipper documentation. Headers should be capitalised according to the headline style defined in the [Chicago Manual of Style (17th edition)](https://www.chicagomanualofstyle.org/home.html). +* **Capitalisation of headers** - use the 'Sentence' case associated with the [Chicago Manual of Style (17th edition)](https://www.chicagomanualofstyle.org/home.html). For details of a helpful online tool, see [Header and title capitalization tool](#header-and-title-capitalization-tool), below. +* **Use Blank Lines** - make sure there is one blank line between a heading and the text in its section/sub-section. -:::tip -To ensure you're complying with the Chicago Manual of Style, go to the online tool [Capitalize My Title](https://capitalizemytitle.com/style/Chicago/), select the Chicago tab and enter your heading. As you enter the heading, the tool automatically converts it to the Chicago style. +#### Header and title capitalization tool + +To assist with the capitalization of your page's title and headers, go to the online tool [Capitalize My Title](https://capitalizemytitle.com/style/Chicago/), then: + +* **For the title** - select the 'Chicago' tab and click the 'Title Case' option. +* **For headers** - select the 'Chicago' tab and click the 'Sentence case' option. + +As you enter the title/header, the tool automatically converts it to the selected style, which you can then copy/paste into your editor. + +#### Markdown code + +For examples of using Markdown for headers, see [Markdown Formatting](documentation-formatting.mdx#headers) + +## Markdown tools + +### Code snippets + +Code examples are one of the best ways to help your readers take their understanding to the next level by providing them with something they can actually view and experiment with on their own. + +:::note +Remember that a snippet is 'a small part or piece of a thing' so keep your snippet as short as possible and relevant to the section in which it's located. ::: +When providing code snippets, first create an example in the Flipper shell and then directly reference that example in your documentation. This enables the Flipper website to **ensure that code in its documentation always stays up-to-date and functional** + +Make sure there is one blank line between the code snippet and any surrounding text. + +#### Markdown code + +For an example of using Markdown for code snippets, see [Markdown Formatting](documentation-formatting.mdx#code-snippets) + ### Images Images includes pictures, diagrams, and screenshots. @@ -70,30 +142,82 @@ The well-known adage "*A picture is worth a thousand words.*" is true but must b * **No sensitive or personal data** - if you're taking a screenshot that features data, ensure it is test or sample data. * **Use a lossless format** - PNG and SVG files are ideal for websites and PDFs, other formats may look blurred. -* **Use a transparent background** - you don't know what colour background your reader will use when reading your documentation. By using a transparent background, you avoid potential colour clashes and unwanted image borders. -* **Avoid coloured borders and shadows** - again, you don't know what colour background your reader will use when reading your documentation. A coloured border or a shadow might look great against the colour you are using but could look ugly against a different background. -* **Size for readability** - there's little purpose in using any type of image if the text within it can't be read or needs a magnifying glass. Consider splitting your image into two or more images and show how they are connected. If using a screenshot, zoom in on a specific area of the screen and provide context. -* **Be color-consistent** - use the same colour and style for callouts and annotations throughout your documentation. -* **Consider dark mode backgrounds** - use of a dark mode is becoming increasingly common. With this in mind, test your image using light and dark mode; as a result, you may need to replace black/dark grey colours with pastel-coloured alternatives. +* **Use a transparent background** - by using a transparent background, you avoid potential color clashes and unwanted image borders caused by your reader's use of a colored or themed background. +* **Avoid colored borders and shadows** - a colored border or a shadow might look great against the color you are using but could look ugly against a differently colored background. +* **Consider dark mode backgrounds** - when relevant, test your image using light and dark mode; as a result, you may need to replace black/dark grey colors with pastel-colored alternatives (note: this does not apply to screenshots). +* **Size for readability**: + * There's little purpose in using any type of image if the text within it can't be read or needs a magnifying glass. + * If your image is large, consider splitting into two or more images and show how they are connected. + * If using a screenshot, zoom in on a specific area of the screen and provide context rather than capturing the whole screen. +* **Be consistent** - use the same color and style for callouts and annotations throughout your documentation. * **Refer to the image** - mention the image within the accompanying text. Such as "*As shown in the following image...*", or "*The image below provides an overview of...*" :::tip Keep in mind that images are meant to complement text, not replace it. Though a picture may be worth a thousand words, the reader still needs the detail contained within the text. ::: -### Videos +### Latin abbreviations -Videos are an effective method to present a lot of information to the reader. However, just like images, the use of videos must be accompanied by knowledge of how to use them effectively. Following are guidelines for the use of video in your documentation. +The use of some Latin abbreviations (such as 'e.g.', 'etc.', 'i.e.', 'et al.', and so on) should be avoided for the following reasons: -* **Watch the video** - before you use the video in your documentation, watch it to check that its good quality, relevant to the section in which it's located, and provides sufficient information. -* **Keep the content concise** - the content of the video should be limited to the specific purpose for which it is being used. For example, if a video is being used to illustrate configuration of a component, it should contain just that process. -* **Refer to the video** - mention the video within the section in which it's being used. Also, state the length of the video. For example: "*The above video demonstrates the slightly different 'Hg: Show Head Changes' command*". -* **State the length of the video** - if the length of the video is not shown in the video object, state it in the text. For example, "*The above 11-second video demonstrates the slightly different 'Hg: Show Head Changes' command*". +* Readers of the documentation may not use English as their 'first' language and may be unaware of the meaning of Latin abbreviations. +* Often, when used, Latin abbreviations are not correctly punctuated, which detracts from the professional tone of the page's content. -:::tip -When deciding to use a video, keep in mind that it takes much more time to produce a video than to change some text. A small change to a UI or a process is relatively easy to change in text. The same change in a video may mean it needs to be replaced or removed, which, ultimately, involves much more work. +When tempted to use the Latin abbreviations shown in the following table, consider using the English equivalent. + +| Latin | English Equivalent +|:--|:--| +| e.g. | for example | +| et al. | and colleagues / associates / team members | +| etc. | and so on / and the rest | +| i.e. | that is | +| N.B. | Note | + +:::note +**Key point**: whenever possible, use plain, easy-to-understand English in your documentation. ::: +### Links + +Within Flipper Docs, links are usually text-based and can be used to navigate your readers to several types of link targets, such as the following 'good' links: + +* For information on the type of links to avoid, see [Bad links](#bad-links), below. +* For examples of using Markdown for headers, see the [Markdown Formatting](documentation-formatting.mdx#headers) page. +* To learn all about Litho, see the [Litho Documentation](https://www.internalfb.com/intern/staticdocs/litho/docs/intro/motivation/) website. + +As can be seen in the link examples above, a link consists of the parts shown in the following table (but not necessarily in the same order). + +| Link part | Using the first example, above | +| :-- | :-- | +| Leading Phrase | "For information on the type of links to avoid, see" | +| Target description | [Bad links] | +| (Optional) Location | ", below" or "website"| +| Target | (#bad-links) or a URL| + +:::tip Tips + +* **Navigation** - tell your readers where they are going, especially if the link takes them away from the Flipper Docs website (see [Bad links](#bad-links), below). +* **Test** - check that your links do reach the expected target. +* **Access** - keep in mind that some readers may not have access to certain pages or domains. +* **Backticks** - don't use backticks in links as it changes the link's appearance. It has to look like a link for the user to know they can click on it. +::: + +#### Bad links + +It's worth remembering that the reader won't know beforehand where a link is taking them unless it's stated (or at least suggested) in the 'Target description' or the 'Location'. + +Therefore, it's not a good idea to use links such as the following: + +* For information on the type of links to avoid, see [below](#markdown-code). +* Click [here](documentation-formatting.mdx#headers) to see examples of using Markdown for headers. +* To learn all about Litho, click [here](https://www.internalfb.com/intern/staticdocs/litho/docs/intro/motivation/). + +'Bad' links could lead to navigation confusion, frustration, and loss of comprehension. + +#### Markdown code + +For additional guidelines on using Markdown for links, see [Markdown Formatting](documentation-formatting.mdx#links). + ### Lists If the information you wish to communicate involves a series of steps, follows a defined procedure, or indicates preference or ranking, use a [numbered list](#numbered-list), which is also known as an 'ordered' list. @@ -103,12 +227,14 @@ If the order of items in the list is irrelevant, use [bullet points](#bullet-poi #### Bullet Points * **Be concise but effective** - use as few words as possible but make sure the meaning is not lost. -* **Capitalise the first word** of each bullet. -* **Use emphasis** - where possible, emphasise the beginning of the bullet points to give the reader the chance to skim through easily but still get a basic understanding of the content of the list. +* **Capitalise the first word** - do this for each bullet. +* **One sentence per bullet point** - try to stick to one sentence per bullet point. +* **Use emphasis** - where possible, emphasize the beginning of each bullet point to give the reader the chance to skim through easily but still get a basic understanding of the content of the list. * **Use sentences or fragments, not both** - within a single list, avoid using bullets that are full sentences mixed with other bullets that are just sentence fragments, phrases, or names. * **Punctuate consistently:** - * If at least one bullet is a sentence, end all bullets with a full stop. Don't end a bullet with a semicolon (;). + * If at least one bullet is a sentence, end all bullets with a full stop. Don't end a bullet with a semicolon (;). * If all bullets are phrases, or fragments, use no end punctuation. +* **Use Blank Lines** - make sure there is one blank line above and below the list. #### Numbered List @@ -116,16 +242,42 @@ If the order of items in the list is irrelevant, use [bullet points](#bullet-poi 2. **Be logical** - the items in the list should follow a logical flow, which guides the reader though the content in a manner that makes sense. 3. **Keep the structure simple** - if your list is getting a bit complex in structure or stretches over several pages, consider breaking it up into a series of sub-sections. 4. **Punctuate consistently** - each item in the list should end with a full stop, unless the item contains [bullet points](#bullet-points). +5. **Use Blank Lines** - make sure there is one blank line above and below the numbered list. -### Code Snippets +###### Example lists -Code snippets provide invaluable 'how to' examples to the reader: often, they are copied directly into a Developer's code. +The bullet points used throughout this page provide examples of the style to be used. -Remember that a snippet is 'a small part or piece of a thing' so keep your snippet short as short as possible and relevant to the section in which it is located. +:::note +Sometimes, it might not be possible to use an emphasized phrase (the part that is in bold) for each bullet. In such cases, try to apply the other bullet point guidelines to your list. +::: -### Markdown Features +### Tabs -For tips and guidelines on formatting Markdown features, see [Formatting Tips](documentation-formatting.mdx). +Since Flipper supports multiple platforms, you may need to provide information that is specific to each platform. The Tab tool provides an excellent way of this information via use of the `CodeLanguageTabs` component. + +Tabs provide your reader with an easy method of switching from one platform (or process) to another without having to scroll up and down the page. + +#### Markdown code + +For an example of using Markdown for tabs, see [Markdown Formatting](documentation-formatting.mdx#tabs) + +### Videos + +Videos are an effective method of presenting a lot of information to the reader. However, just like [images](#images), the use of videos must be accompanied by knowledge of how to use them effectively. Following are guidelines for the use of video in your documentation: + +* **Watch the video** - before you use the video in your documentation, watch it to check that its good quality, relevant to the section in which it's located, and provides sufficient information. +* **Keep the content concise**: + * The content of the video should be limited to the specific purpose for which it is being used. + * For example, if a video is being used to illustrate configuration of a component, it should contain just that process. +* **Refer to the video** - mention the video within the section in which it's being used. +* **State the length of the video**: + * If the length of the video is not shown in the video object, state it in the text. + * For example, "*The following 11-second video demonstrates the slightly different 'Hg: Show Head Changes' command*". + +:::tip +When deciding to use a video, keep in mind that it takes much more time to produce a video than to change some text. A small change to a UI or a process is relatively easy to change in text. The same change in a video may mean it needs to be replaced or removed, which, ultimately, involves much more work. +::: ## Resources diff --git a/docs/internals/index.mdx b/docs/internals/index.mdx index b17561bd1..c4f4e30f3 100644 --- a/docs/internals/index.mdx +++ b/docs/internals/index.mdx @@ -17,7 +17,7 @@ This part of the site is for those interested in **how** Flipper works 'under th -In addition, the section contains a wide range of internal-only (see 'Under the Hood -> 'Internal') topics, such as: +In addition, 'Under the Hood' contains a wide range of internal-only topics (see the NavBar's 'Internal'), such as: * [Data Pipelines](../fb/data-pipelines.mdx) - information on Deep Dive, Flipper Analytics, Scribe, Error Logging, plus a series of links relating to architecture, Static Docs, and code Pointers. * [Launcher](../fb/hackin-on-launcher.mdx) - details of hacking on Launcher and the LauncherConfig. diff --git a/website/sidebars.js b/website/sidebars.js index 8a32102d3..b80c8b401 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -129,7 +129,7 @@ module.exports = { 'extending/node-apis', ...fbInternalOnly([ { - 'QPL Linting': ['fb/building-a-linter', 'fb/active-linters'], + 'QPL Linting': ['fb/active-linters'], }, ]), ], @@ -155,7 +155,11 @@ module.exports = { { 'Internal': [ { - 'Contributing to the Documentation': ['internals/documentation-formatting', 'internals/documentation-writing-guide'], + 'Contributing to the Documentation': [ + 'internals/documentation-standards', + 'internals/documentation-writing-guide', + 'internals/documentation-formatting', + ] }, 'fb/arc_uiqr', 'fb/connections', From 57dcf72763785bb39a961cb54a694d1197af8e7a Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 28 Nov 2022 05:09:20 -0800 Subject: [PATCH 0343/1651] Added ability to pause the incoming updates from the client Summary: There were a few subtleties around what to the auto expanding / collapsing for active children but otherwise this is quite straightforward Reviewed By: lblasa Differential Revision: D41548252 fbshipit-source-id: c153d00210d859463a51753dadf2e5aabeb7ea35 --- .../public/ui-debugger/components/main.tsx | 30 ++++-- desktop/plugins/public/ui-debugger/index.tsx | 98 +++++++++++++++---- 2 files changed, 101 insertions(+), 27 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 17c88141a..7d4fb19a9 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -11,13 +11,14 @@ import React, {useState} from 'react'; import {plugin} from '../index'; import {DetailSidebar, Layout, usePlugin, useValue} from 'flipper-plugin'; import {useHotkeys} from 'react-hotkeys-hook'; -import {Id, Metadata, MetadataId, Snapshot, UINode} from '../types'; +import {Id, Metadata, MetadataId, UINode} from '../types'; import {PerfStats} from './PerfStats'; import {Tree} from './Tree'; import {Visualization2D} from './Visualization2D'; import {useKeyboardModifiers} from '../hooks/useKeyboardModifiers'; import {Inspector} from './sidebar/Inspector'; -import {Input, Spin} from 'antd'; +import {Button, Input, Spin, Tooltip} from 'antd'; +import {PauseCircleOutlined, PlayCircleOutlined} from '@ant-design/icons'; export function Component() { const instance = usePlugin(plugin); @@ -33,6 +34,7 @@ export function Component() { const searchTerm = useValue(instance.uiState.searchTerm); const {ctrlPressed} = useKeyboardModifiers(); + const isPaused = useValue(instance.uiState.isPaused); function renderSidebar( node: UINode | undefined, metadata: Map, @@ -53,10 +55,26 @@ export function Component() { return ( - instance.uiState.searchTerm.set(e.target.value)} - /> + + instance.uiState.searchTerm.set(e.target.value)} + /> + + ; +}; + export function plugin(client: PluginClient) { const rootId = createState(undefined); const metadata = createState>(new Map()); @@ -49,14 +60,14 @@ export function plugin(client: PluginClient) { }); const nodes = createState>(new Map()); - const snapshot = createState<{nodeId: Id; base64Image: Snapshot} | null>( - null, - ); + const snapshot = createState(null); const uiState = { //used to disabled hover effects which cause rerenders and mess up the existing context menu isContextMenuOpen: createState(false), + isPaused: createState(false), + //The reason for the array as that user could be hovering multiple overlapping nodes at once in the visualiser. //The nodes are sorted by area since you most likely want to select the smallest node under your cursor hoveredNodes: createState([]), @@ -67,8 +78,8 @@ export function plugin(client: PluginClient) { }; client.onMessage('coordinateUpdate', (event) => { - nodes.update((draft) => { - const node = draft.get(event.nodeId); + liveClientData = produce(liveClientData, (draft) => { + const node = draft.nodes.get(event.nodeId); if (!node) { console.warn(`Coordinate update for non existing node `, event); } else { @@ -76,17 +87,48 @@ export function plugin(client: PluginClient) { node.bounds.y = event.coordinate.y; } }); + + if (uiState.isPaused.get()) { + return; + } + + nodes.set(liveClientData.nodes); }); + const setPlayPause = (isPaused: boolean) => { + uiState.isPaused.set(isPaused); + if (!isPaused) { + //When going back to play mode then set the atoms to the live state to rerender the latest + //Also need to fixed expanded state for any change in active child state + uiState.treeState.update((draft) => { + liveClientData.nodes.forEach((node) => { + collapseinActiveChildren(node, draft); + }); + }); + nodes.set(liveClientData.nodes); + snapshot.set(liveClientData.snapshotInfo); + } + }; + + //this is the client data is what drives all of desktop UI + //it is always up-to-date with the client regardless of whether we are paused or not + let liveClientData: LiveClientState = { + snapshotInfo: null, + nodes: new Map(), + }; + const seenNodes = new Set(); client.onMessage('subtreeUpdate', (event) => { - if (event.snapshot) { - snapshot.set({nodeId: event.rootId, base64Image: event.snapshot}); - } + liveClientData = produce(liveClientData, (draft) => { + if (event.snapshot) { + draft.snapshotInfo = { + nodeId: event.rootId, + base64Image: event.snapshot, + }; + } - nodes.update((draft) => { event.nodes.forEach((node) => { - draft.set(node.id, node); + draft.nodes.set(node.id, node); }); }); @@ -97,28 +139,42 @@ export function plugin(client: PluginClient) { } seenNodes.add(node.id); - if (node.activeChild) { - const inactiveChildren = node.children.filter( - (child) => child !== node.activeChild, - ); - - draft.expandedNodes = draft.expandedNodes.filter( - (nodeId) => !inactiveChildren.includes(nodeId), - ); - draft.expandedNodes.push(node.activeChild); + if (!uiState.isPaused.get()) { + //we need to not do this while paused as you may move to another screen / tab + //and it would collapse the tree node for the activity you were paused on. + collapseinActiveChildren(node, draft); } } }); + + if (!uiState.isPaused.get()) { + nodes.set(liveClientData.nodes); + snapshot.set(liveClientData.snapshotInfo); + } }); return { rootId, uiState, nodes, - metadata, snapshot, + metadata, perfEvents, + setPlayPause, }; } +function collapseinActiveChildren(node: UINode, draft: TreeState) { + if (node.activeChild) { + const inactiveChildren = node.children.filter( + (child) => child !== node.activeChild, + ); + + draft.expandedNodes = draft.expandedNodes.filter( + (nodeId) => !inactiveChildren.includes(nodeId), + ); + draft.expandedNodes.push(node.activeChild); + } +} + export {Component} from './components/main'; From 8eb08667608723b796fbe8edcf7167570c0b7939 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 28 Nov 2022 05:09:20 -0800 Subject: [PATCH 0344/1651] Add parent reference to desktop node Summary: There are some situations where we are doing a traversal of the entire node hierachy looking for something. In some situtations this linear search can be replaced with a walk up the anchestory path making the code easier to understand and more efficient Reviewed By: lblasa Differential Revision: D41548253 fbshipit-source-id: 4fb2141282f1f9663835c3b7812d30dcc59b707e --- desktop/plugins/public/ui-debugger/index.tsx | 18 +++++++++++++++++- desktop/plugins/public/ui-debugger/types.tsx | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index 0df383cbc..b7a905504 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -128,8 +128,9 @@ export function plugin(client: PluginClient) { } event.nodes.forEach((node) => { - draft.nodes.set(node.id, node); + draft.nodes.set(node.id, {...node}); }); + setParentPointers(rootId.get()!!, undefined, draft.nodes); }); uiState.treeState.update((draft) => { @@ -164,6 +165,21 @@ export function plugin(client: PluginClient) { }; } +function setParentPointers( + cur: Id, + parent: Id | undefined, + nodes: Map, +) { + const node = nodes.get(cur); + if (node == null) { + return; + } + node.parent = parent; + node.children.forEach((child) => { + setParentPointers(child, cur, nodes); + }); +} + function collapseinActiveChildren(node: UINode, draft: TreeState) { if (node.activeChild) { const inactiveChildren = node.children.filter( diff --git a/desktop/plugins/public/ui-debugger/types.tsx b/desktop/plugins/public/ui-debugger/types.tsx index d1df5635b..6af2e113d 100644 --- a/desktop/plugins/public/ui-debugger/types.tsx +++ b/desktop/plugins/public/ui-debugger/types.tsx @@ -63,6 +63,7 @@ export type NestedNode = { export type UINode = { id: Id; + parent?: Id; //this attribute doesn't come from the client and is set by the desktop qualifiedName: string; name: string; attributes: Record; From d9314c3b73efbe71f43b00041bc109e91248afbd Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 28 Nov 2022 05:09:20 -0800 Subject: [PATCH 0345/1651] Fix Focus mode bug when is the decendant of an inactive node. Summary: If you focus a node and then move activity then the focused nodes will no longer be active. this means that they are automatically collapsed in the tree and the visualizer wont be display it. Previously we didnt spot this and the focus state was wrong. Now we check that all parents are active whenever an update comes from client, if the focused node is no longer active after an update then we remove the focus Reviewed By: lblasa Differential Revision: D41548250 fbshipit-source-id: d536e0c466d9002fc53bcb43b9b29c7c7fa23ad2 --- desktop/plugins/public/ui-debugger/index.tsx | 50 ++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index b7a905504..9e1f09d87 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -12,6 +12,7 @@ import { createState, createDataSource, produce, + Atom, } from 'flipper-plugin'; import { Events, @@ -107,6 +108,7 @@ export function plugin(client: PluginClient) { }); nodes.set(liveClientData.nodes); snapshot.set(liveClientData.snapshotInfo); + checkFocusedNodeStillActive(uiState, nodes.get()); } }; @@ -151,6 +153,8 @@ export function plugin(client: PluginClient) { if (!uiState.isPaused.get()) { nodes.set(liveClientData.nodes); snapshot.set(liveClientData.snapshotInfo); + + checkFocusedNodeStillActive(uiState, nodes.get()); } }); @@ -180,6 +184,52 @@ function setParentPointers( }); } +function checkFocusedNodeStillActive( + uiState: { + isPaused: Atom; + searchTerm: Atom; + isContextMenuOpen: Atom; + hoveredNodes: Atom; + focusedNode: Atom; + treeState: Atom; + }, + nodes: Map, +) { + const focusedNodeId = uiState.focusedNode.get(); + const focusedNode = focusedNodeId && nodes.get(focusedNodeId); + if (focusedNode && !isFocusedNodeAncestryAllActive(focusedNode, nodes)) { + uiState.focusedNode.set(undefined); + } +} + +function isFocusedNodeAncestryAllActive( + focused: UINode, + nodes: Map, +): boolean { + let node = focused; + + while (node != null) { + if (node.parent == null) { + return true; + } + + const parent = nodes.get(node.parent); + + if (parent == null) { + //should also never happen + return false; + } + + if (parent.activeChild != null && parent.activeChild !== node.id) { + return false; + } + + node = parent; + } + //wont happen + return false; +} + function collapseinActiveChildren(node: UINode, draft: TreeState) { if (node.activeChild) { const inactiveChildren = node.children.filter( From 6183671a5de402a48607b177f2d309cb56abfd5b Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 28 Nov 2022 05:09:20 -0800 Subject: [PATCH 0346/1651] Improve presentation of node name in hover state for visualizer Summary: With the previous approach it was hard to read the name of the node, this should be a lot clearer. The tool top comes in a after a delay, the reason for this is because when i tried without a delay when you moved the mouse fast a ton of tooltips would appear and disappear when you passed over diffferent nodes and it was very distracting. 200ms seems to be about the sweet spot Reviewed By: lblasa Differential Revision: D41548248 fbshipit-source-id: 76460347730d5b1d2e968984e845be0c65255456 --- .../components/Visualization2D.tsx | 121 +++++++++++------- 1 file changed, 77 insertions(+), 44 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index e7309d4c6..e37e62291 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -13,7 +13,7 @@ import {Bounds, Coordinate, Id, NestedNode, Tag, UINode} from '../types'; import {produce, styled, theme, usePlugin, useValue} from 'flipper-plugin'; import {plugin} from '../index'; import {head, isEqual, throttle} from 'lodash'; -import {Dropdown, Menu} from 'antd'; +import {Dropdown, Menu, Tooltip} from 'antd'; import {UIDebuggerMenuItem} from './util/UIDebuggerMenuItem'; export const Visualization2D: React.FC< @@ -167,20 +167,8 @@ function Visualization2DNode({ }) { const instance = usePlugin(plugin); - const [isHovered, setIsHovered] = useState(false); - useEffect(() => { - const listener = (newValue?: Id[], prevValue?: Id[]) => { - if (head(prevValue) === node.id || head(newValue) === node.id) { - setIsHovered(head(newValue) === node.id); - } - }; - instance.uiState.hoveredNodes.subscribe(listener); - return () => { - instance.uiState.hoveredNodes.unsubscribe(listener); - }; - }, [instance.uiState.hoveredNodes, node.id]); - const isSelected = selectedNode === node.id; + const {isHovered, isLongHovered} = useHoverStates(node.id); let nestedChildren: NestedNode[]; @@ -208,41 +196,85 @@ function Visualization2DNode({ /> )); - const bounds = node.bounds ?? {x: 0, y: 0, width: 0, height: 0}; - return ( -
    { - e.stopPropagation(); - - const hoveredNodes = instance.uiState.hoveredNodes.get(); - if (hoveredNodes[0] === selectedNode) { - onSelectNode(undefined); - } else { - onSelectNode(hoveredNodes[0]); - } + - - {isHovered &&

    {node.name}

    } - {children} -
    +
    { + e.stopPropagation(); + + const hoveredNodes = instance.uiState.hoveredNodes.get(); + if (hoveredNodes[0] === selectedNode) { + onSelectNode(undefined); + } else { + onSelectNode(hoveredNodes[0]); + } + }}> + + {children} +
    + ); } +function useHoverStates(nodeId: Id) { + const instance = usePlugin(plugin); + const [isHovered, setIsHovered] = useState(false); + const [isLongHovered, setIsLongHovered] = useState(false); + useEffect(() => { + const listener = (newValue?: Id[], prevValue?: Id[]) => { + //only change state if the prev or next hover state affect us, this avoids rerendering the whole tree for a hover + //change + if (head(prevValue) === nodeId || head(newValue) === nodeId) { + const hovered = head(newValue) === nodeId; + setIsHovered(hovered); + + if (hovered === true) { + setTimeout(() => { + const isStillHovered = + head(instance.uiState.hoveredNodes.get()) === nodeId; + if (isStillHovered) { + setIsLongHovered(true); + } + }, longHoverDelay); + } else { + setIsLongHovered(false); + } + } + }; + instance.uiState.hoveredNodes.subscribe(listener); + return () => { + instance.uiState.hoveredNodes.unsubscribe(listener); + }; + }, [instance.uiState.hoveredNodes, nodeId]); + + return { + isHovered, + isLongHovered, + }; +} + const ContextMenu: React.FC<{nodes: Map}> = ({children}) => { const instance = usePlugin(plugin); @@ -307,6 +339,7 @@ const NodeBorder = styled.div<{tags: Tag[]; hovered: boolean}>((props) => ({ : 'black', })); +const longHoverDelay = 200; const outerBorderWidth = '10px'; const outerBorderOffset = `-${outerBorderWidth}`; From a93d571dc0dfc7f683942beaf96f74a0086984ea Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 28 Nov 2022 05:09:20 -0800 Subject: [PATCH 0347/1651] Unhover on mouse exit of tree Summary: This was causing the hover state to linger which is now quite noticable in the tree Reviewed By: lblasa Differential Revision: D41548249 fbshipit-source-id: cdf8ed434aa064dba05ebf31773bedaef18ba007 --- .../public/ui-debugger/components/Tree.tsx | 129 +++++++++--------- 1 file changed, 67 insertions(+), 62 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 18f042e62..0b89fcf51 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -58,70 +58,75 @@ export function Tree(props: { }, [props.selectedNode]); return ( - - item.data.name} - canRename={false} - canDragAndDrop={false} - viewState={{ - tree: { - focusedItem: head(hoveredNodes), - expandedItems, - selectedItems: props.selectedNode ? [props.selectedNode] : [], - }, - }} - onFocusItem={(item) => { - instance.uiState.hoveredNodes.set([item.index]); - }} - onExpandItem={(item) => { - instance.uiState.treeState.update((draft) => { - draft.expandedNodes.push(item.index); - }); - }} - onCollapseItem={(item) => - instance.uiState.treeState.update((draft) => { - draft.expandedNodes = draft.expandedNodes.filter( - (expandedItemIndex) => expandedItemIndex !== item.index, - ); - }) - } - renderItem={renderItem} - onSelectItems={(items) => props.onSelectNode(items[0])} - defaultInteractionMode={{ - mode: 'custom', - extends: InteractionMode.DoubleClickItemToExpand, - createInteractiveElementProps: ( - item, - treeId, - actions, - renderFlags, - ) => ({ - onClick: () => { - if (renderFlags.isSelected) { - actions.unselectItem(); - } else { - actions.selectItem(); - } +
    { + instance.uiState.hoveredNodes.set([]); + }}> + + item.data.name} + canRename={false} + canDragAndDrop={false} + viewState={{ + tree: { + focusedItem: head(hoveredNodes), + expandedItems, + selectedItems: props.selectedNode ? [props.selectedNode] : [], }, + }} + onFocusItem={(item) => { + instance.uiState.hoveredNodes.set([item.index]); + }} + onExpandItem={(item) => { + instance.uiState.treeState.update((draft) => { + draft.expandedNodes.push(item.index); + }); + }} + onCollapseItem={(item) => + instance.uiState.treeState.update((draft) => { + draft.expandedNodes = draft.expandedNodes.filter( + (expandedItemIndex) => expandedItemIndex !== item.index, + ); + }) + } + renderItem={renderItem} + onSelectItems={(items) => props.onSelectNode(items[0])} + defaultInteractionMode={{ + mode: 'custom', + extends: InteractionMode.DoubleClickItemToExpand, + createInteractiveElementProps: ( + item, + treeId, + actions, + renderFlags, + ) => ({ + onClick: () => { + if (renderFlags.isSelected) { + actions.unselectItem(); + } else { + actions.selectItem(); + } + }, - onMouseOver: () => { - if (!instance.uiState.isContextMenuOpen.get()) { - instance.uiState.hoveredNodes.set([item.index]); - } - }, - }), - }}> - - - + onMouseOver: () => { + if (!instance.uiState.isContextMenuOpen.get()) { + instance.uiState.hoveredNodes.set([item.index]); + } + }, + }), + }}> + + + +
    ); } From b21480632570c7c3387f01f553940a0bd2ad4eec Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 28 Nov 2022 05:09:20 -0800 Subject: [PATCH 0348/1651] Add padding and refactor our controls component Summary: also made the controls component full width to push down the visualiser Reviewed By: lblasa Differential Revision: D41548665 fbshipit-source-id: 2bca527e70c92bc0ded120e51a0880f76f7cca87 --- .../ui-debugger/components/Controls.tsx | 46 ++++++++++++ .../public/ui-debugger/components/main.tsx | 71 +++++++------------ desktop/plugins/public/ui-debugger/index.tsx | 11 ++- 3 files changed, 83 insertions(+), 45 deletions(-) create mode 100644 desktop/plugins/public/ui-debugger/components/Controls.tsx diff --git a/desktop/plugins/public/ui-debugger/components/Controls.tsx b/desktop/plugins/public/ui-debugger/components/Controls.tsx new file mode 100644 index 000000000..6a5d5fdd9 --- /dev/null +++ b/desktop/plugins/public/ui-debugger/components/Controls.tsx @@ -0,0 +1,46 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ +import React from 'react'; +import {plugin} from '../index'; +import {Button, Input, Tooltip} from 'antd'; +import {PauseCircleOutlined, PlayCircleOutlined} from '@ant-design/icons'; +import {usePlugin, useValue, Layout} from 'flipper-plugin'; + +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +export const Controls: React.FC = () => { + const instance = usePlugin(plugin); + const searchTerm = useValue(instance.uiState.searchTerm); + const isPaused = useValue(instance.uiState.isPaused); + return ( + + instance.uiState.searchTerm.set(e.target.value)} + /> + + + ); +}; diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 7d4fb19a9..0d24585b3 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -17,8 +17,8 @@ import {Tree} from './Tree'; import {Visualization2D} from './Visualization2D'; import {useKeyboardModifiers} from '../hooks/useKeyboardModifiers'; import {Inspector} from './sidebar/Inspector'; -import {Button, Input, Spin, Tooltip} from 'antd'; -import {PauseCircleOutlined, PlayCircleOutlined} from '@ant-design/icons'; +import {Spin} from 'antd'; +import {Controls} from './Controls'; export function Component() { const instance = usePlugin(plugin); @@ -31,10 +31,8 @@ export function Component() { useHotkeys('ctrl+i', () => setShowPerfStats((show) => !show)); - const searchTerm = useValue(instance.uiState.searchTerm); const {ctrlPressed} = useKeyboardModifiers(); - const isPaused = useValue(instance.uiState.isPaused); function renderSidebar( node: UINode | undefined, metadata: Map, @@ -53,46 +51,31 @@ export function Component() { if (rootId) { return ( - - - - instance.uiState.searchTerm.set(e.target.value)} - /> - - - - - - - - {selectedNode && renderSidebar(nodes.get(selectedNode), metadata)} - + + + + + + + + + + + + {selectedNode && renderSidebar(nodes.get(selectedNode), metadata)} + + ); } diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index 9e1f09d87..441a3c900 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -32,6 +32,15 @@ type LiveClientState = { nodes: Map; }; +type UIState = { + isPaused: Atom; + searchTerm: Atom; + isContextMenuOpen: Atom; + hoveredNodes: Atom; + focusedNode: Atom; + treeState: Atom; +}; + export function plugin(client: PluginClient) { const rootId = createState(undefined); const metadata = createState>(new Map()); @@ -63,7 +72,7 @@ export function plugin(client: PluginClient) { const nodes = createState>(new Map()); const snapshot = createState(null); - const uiState = { + const uiState: UIState = { //used to disabled hover effects which cause rerenders and mess up the existing context menu isContextMenuOpen: createState(false), From f34b6f52edfb1b45950447275a9a7db0beff9c8a Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 28 Nov 2022 05:09:20 -0800 Subject: [PATCH 0349/1651] The ui debugger grows up Reviewed By: lblasa Differential Revision: D41549291 fbshipit-source-id: d3c72c01f6b7bd2a3be8a35d5f54270b64191e21 --- desktop/plugins/public/ui-debugger/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/plugins/public/ui-debugger/package.json b/desktop/plugins/public/ui-debugger/package.json index beba5b62b..f49560a1c 100644 --- a/desktop/plugins/public/ui-debugger/package.json +++ b/desktop/plugins/public/ui-debugger/package.json @@ -7,7 +7,7 @@ "flipperBundlerEntry": "index.tsx", "main": "dist/bundle.js", "license": "MIT", - "title": "UI Debugger (alpha)", + "title": "UI Debugger (beta)", "icon": "nav-magnifying-glass", "keywords": [ "flipper-plugin" From c0cf7d62d60d5a6953e98342ed139c64b7e112c6 Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Mon, 28 Nov 2022 05:16:16 -0800 Subject: [PATCH 0350/1651] Exclude .circleci folder from docs cleanup (#4335) Summary: Without this, our boilplate config gets deleted on every run: https://github.com/JamesIves/github-pages-deploy-action#additional-build-files- Pull Request resolved: https://github.com/facebook/flipper/pull/4335 Reviewed By: lblasa Differential Revision: D41548935 Pulled By: passy fbshipit-source-id: aea68dbb28ed07f0102be05695aa6f6225ef6e11 --- .github/workflows/docs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index fab1b7535..6415a04bf 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -25,4 +25,6 @@ jobs: branch: gh-pages folder: website/build clean: true + clean-exclude: | + .circleci commit-message: "[ci skip] Deploying documentation update" From 1406e291ee9da2f8df959cdbfd44dca5b0770458 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Mon, 28 Nov 2022 09:45:53 -0800 Subject: [PATCH 0351/1651] Send with raw parameters Summary: On Android we already had an API to send raw arguments i.e. raw json as params. This just adds feature parity on iOS. Reviewed By: LukeDefeo Differential Revision: D41433777 fbshipit-source-id: abd47f987b9e2b451100e81acf6fea61cd876807 --- iOS/FlipperKit/CppBridge/FlipperCppBridgingConnection.mm | 4 ++++ iOS/FlipperKit/FlipperConnection.h | 5 +++++ iOS/FlipperKitTestUtils/FlipperConnectionMock.m | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/iOS/FlipperKit/CppBridge/FlipperCppBridgingConnection.mm b/iOS/FlipperKit/CppBridge/FlipperCppBridgingConnection.mm index 982063bde..75caebddc 100644 --- a/iOS/FlipperKit/CppBridge/FlipperCppBridgingConnection.mm +++ b/iOS/FlipperKit/CppBridge/FlipperCppBridgingConnection.mm @@ -35,6 +35,10 @@ [self sendInternal:method withParams:params]; } +- (void)send:(NSString*)method withRawParams:(NSString*)params { + conn_->sendRaw([method UTF8String], [params UTF8String]); +} + - (void)send:(NSString*)method withArrayParams:(NSArray*)params { [self sendInternal:method withParams:params]; } diff --git a/iOS/FlipperKit/FlipperConnection.h b/iOS/FlipperKit/FlipperConnection.h index 7532c5c8a..f2afb6a6c 100644 --- a/iOS/FlipperKit/FlipperConnection.h +++ b/iOS/FlipperKit/FlipperConnection.h @@ -23,6 +23,11 @@ Invoke a method on the Sonar desktop plugin with with a matching identifier. */ - (void)send:(NSString*)method withParams:(NSDictionary*)params; +/** +Invoke a method on the Sonar desktop plugin with with a matching identifier. +*/ +- (void)send:(NSString*)method withRawParams:(NSString*)params; + /** Invoke a method on the Sonar desktop plugin with with a matching identifier. */ diff --git a/iOS/FlipperKitTestUtils/FlipperConnectionMock.m b/iOS/FlipperKitTestUtils/FlipperConnectionMock.m index f9437ae0e..fccabdcc0 100644 --- a/iOS/FlipperKitTestUtils/FlipperConnectionMock.m +++ b/iOS/FlipperKitTestUtils/FlipperConnectionMock.m @@ -38,6 +38,10 @@ [self sendInternal:method withParams:params loggedTo:&_sent]; } +- (void)send:(NSString*)method withRawParams:(NSString*)params { + [self sendInternal:method withParams:params loggedTo:&_sent]; +} + - (void)send:(NSString*)method withArrayParams:(NSArray*)params { [self sendInternal:method withParams:params loggedTo:&_sentWithArray]; } From 76b1673d1585ce34ea27578e25cfbaaf09933648 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Mon, 28 Nov 2022 10:19:20 -0800 Subject: [PATCH 0352/1651] Basic array support Summary: Attributes Inspector didn't have support for inspectable arrays. This change addresses an issue with the inspectable itself and adds basic support to it in the visualiser. Reviewed By: LukeDefeo Differential Revision: D41522879 fbshipit-source-id: f9cad42470541039c8157477b0fe9bc58f18f1ba --- .../props/ComponentPropExtractor.kt | 2 +- .../plugins/uidebugger/model/Inspectable.kt | 2 +- .../sidebar/inspector/AttributesInspector.tsx | 35 +++++++++++++++++++ desktop/plugins/public/ui-debugger/types.tsx | 6 ++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt index 5cb18b9c3..cc4abd47c 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt @@ -134,7 +134,7 @@ object ComponentPropExtractor { override fun isArray(array: EditorArray?): Inspectable { val values = array?.value?.map { value -> toInspectable(name, value) } - return InspectableArray(0, values ?: listOf()) + return InspectableArray(values ?: listOf()) } override fun isPick(pick: EditorPick): Inspectable = InspectableValue.Enum(pick.selected) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Inspectable.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Inspectable.kt index efcabee79..e95a5cf47 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Inspectable.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Inspectable.kt @@ -22,7 +22,7 @@ import kotlinx.serialization.encoding.Encoder // for native android this should probably be false. @SerialName("array") @Serializable -data class InspectableArray(val id: Int, val items: List) : Inspectable() +data class InspectableArray(val items: List) : Inspectable() // In this context, mutable means you can add / remove keys, // for native android this should probably be false. diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx index 13e948887..3aff0a231 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx @@ -90,6 +90,32 @@ const ObjectAttributeInspector: React.FC<{ ); }; +const ArrayAttributeInspector: React.FC<{ + metadata: Map; + name: string; + items: Inspectable[]; + level: number; +}> = ({metadata, name, items, level}) => { + return ( +
    + {name} + {items.map(function (item, idx) { + const inspectableValue = item; + const attributeName = idx.toString(); + return ( + + {create(metadata, attributeName, inspectableValue, level + 2)} + + ); + })} +
    + ); +}; + function create( metadata: Map, name: string, @@ -164,6 +190,15 @@ function create( {inspectable.value} ); + case 'array': + return ( + + ); case 'object': return ( ; }; +export type InspectableArray = { + type: 'array'; + items: Inspectable[]; +}; + export type InspectableUnknown = { type: 'unknown'; value: string; From a8f8e081c5d1edc7b81904b4350f02882e8ac1e4 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Mon, 28 Nov 2022 11:21:24 -0800 Subject: [PATCH 0353/1651] Feedback request banner Summary: This change adds a small feedback alert banner. It will have a link to our workplace feedback group. Additionally, it asks engineers to record their sessions. Reviewed By: LukeDefeo Differential Revision: D41531851 fbshipit-source-id: 7ec8ca79350e7a84ab0532065bc57187ef0055ba --- .../ui-debugger/components/fb-stubs/feedback.tsx | 16 ++++++++++++++++ .../public/ui-debugger/components/main.tsx | 4 +++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 desktop/plugins/public/ui-debugger/components/fb-stubs/feedback.tsx diff --git a/desktop/plugins/public/ui-debugger/components/fb-stubs/feedback.tsx b/desktop/plugins/public/ui-debugger/components/fb-stubs/feedback.tsx new file mode 100644 index 000000000..2662c3dfb --- /dev/null +++ b/desktop/plugins/public/ui-debugger/components/fb-stubs/feedback.tsx @@ -0,0 +1,16 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import React from 'react'; + +const FeedbackRequest: React.FC<{}> = () => { + return <>; +}; + +export default FeedbackRequest; diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 0d24585b3..82f38372a 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -17,8 +17,9 @@ import {Tree} from './Tree'; import {Visualization2D} from './Visualization2D'; import {useKeyboardModifiers} from '../hooks/useKeyboardModifiers'; import {Inspector} from './sidebar/Inspector'; -import {Spin} from 'antd'; import {Controls} from './Controls'; +import {Input, Spin} from 'antd'; +import FeedbackRequest from './fb-stubs/feedback'; export function Component() { const instance = usePlugin(plugin); @@ -52,6 +53,7 @@ export function Component() { if (rootId) { return ( + From a89f6960dcecd5d2c4828b17a7c68e646696719b Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Tue, 29 Nov 2022 01:43:49 -0800 Subject: [PATCH 0354/1651] Added tool tips to sidebar tabs and removed documentation tab Reviewed By: lblasa Differential Revision: D41554191 fbshipit-source-id: d14c042f3def75e33e7a2b9d5ad0a27b3303e0d4 --- .../components/sidebar/Inspector.tsx | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx index 135ab7ed3..4ef652951 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx @@ -15,6 +15,7 @@ import {Metadata, MetadataId, UINode} from '../../types'; import {IdentityInspector} from './inspector/IdentityInspector'; import {AttributesInspector} from './inspector/AttributesInspector'; import {DocumentationInspector} from './inspector/DocumentationInspector'; +import {Tooltip} from 'antd'; type Props = { node: UINode; @@ -27,17 +28,22 @@ export const Inspector: React.FC = ({node, metadata}) => { - - + + + + + }> + - -
    + + + + + }> = ({node, metadata}) => { - - + + + + + }> - - - - }> - -
    ); From feb206d069e4fb39898e9e676de444e71187df44 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 29 Nov 2022 06:02:11 -0800 Subject: [PATCH 0355/1651] Tree styles improvement Summary: ^ Reviewed By: antonk52 Differential Revision: D41579010 fbshipit-source-id: efb7d4300093173d85a3c5c269d79b78fe79908a --- .../public/ui-debugger/components/Tree.tsx | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 0b89fcf51..0aed68602 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -27,6 +27,7 @@ import { HighlightProvider, useHighlighter, theme, + styled, } from 'flipper-plugin'; import {head} from 'lodash'; @@ -61,7 +62,19 @@ export function Tree(props: {
    { instance.uiState.hoveredNodes.set([]); - }}> + }} + style={ + { + '--rct-color-tree-bg': theme.white, + '--rct-color-tree-focus-outline': theme.dividerColor, + '--rct-color-focustree-item-focused-border': + theme.selectionBackgroundColor, + '--rct-color-focustree-item-selected-bg': + theme.selectionBackgroundColor, + '--rct-color-nonfocustree-item-selected-bg': + theme.selectionBackgroundColor, + } as React.CSSProperties + }> @@ -135,6 +148,17 @@ const cx = (...classNames: Array) => classNames.filter((cn) => !!cn).join(' '); const renderDepthOffset = 5; +const DecorationImage = styled.img({ + height: 12, + marginRight: 5, + width: 12, +}); +function defaultIcon(node: UINode) { + if (node.tags.includes('Litho')) { + return ; + } +} + function renderItem({ item, depth, @@ -191,6 +215,7 @@ function renderItem({ context.isDraggingOver && 'rct-tree-item-button-dragging-over', context.isSearchMatching && 'rct-tree-item-button-search-match', )}> + {defaultIcon(item.data)}
    From b701d76668feccdad67dbad96879dcb9b510e698 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 29 Nov 2022 08:10:12 -0800 Subject: [PATCH 0356/1651] Fixes overflow text Summary: ^ Reviewed By: antonk52 Differential Revision: D41580381 fbshipit-source-id: d2e2d53f28ebf68a0f6c5a4cb882e905fd4bdd66 --- .../sidebar/inspector/IdentityInspector.tsx | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/IdentityInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/IdentityInspector.tsx index 006785a65..2e08de7fe 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/IdentityInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/IdentityInspector.tsx @@ -18,6 +18,15 @@ type Props = { node: UINode; }; +const IdentityKey = styled.div({ + padding: '0 16px', +}); + +const IdentityValue = styled.span({ + fontSize: theme.fontSize.small, + wordBreak: 'break-all', +}); + const IdentityContainer = styled.div(TopSpacedContainerStyle); export const IdentityInspector: React.FC = ({node}) => { @@ -25,26 +34,28 @@ export const IdentityInspector: React.FC = ({node}) => { -
    Name:
    + Name: - - {node.name} + + {node.name}
    -
    Qualified name:
    + Qualified name: - - {node.qualifiedName} + + + {node.qualifiedName} +
    -
    Id:
    + Id: - - {node.id} + + {node.id}
    From cffe42a93aa3aa5e35ff5b6a0cc5fa39b12c2f4e Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Tue, 29 Nov 2022 08:54:58 -0800 Subject: [PATCH 0357/1651] Litho state support Reviewed By: lblasa Differential Revision: D41581347 fbshipit-source-id: 262670053c586676be4f9465854ec79f95699d33 --- .../descriptors/DebugComponentDescriptor.kt | 14 +++++++++-- ...Extractor.kt => ComponentDataExtractor.kt} | 25 ++++++++++++++++--- 2 files changed, 34 insertions(+), 5 deletions(-) rename android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/{ComponentPropExtractor.kt => ComponentDataExtractor.kt} (86%) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt index 035bcc698..127ae86f8 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt @@ -10,7 +10,7 @@ package com.facebook.flipper.plugins.uidebugger.litho.descriptors import android.graphics.Bitmap import com.facebook.flipper.plugins.uidebugger.descriptors.* import com.facebook.flipper.plugins.uidebugger.litho.LithoTag -import com.facebook.flipper.plugins.uidebugger.litho.descriptors.props.ComponentPropExtractor +import com.facebook.flipper.plugins.uidebugger.litho.descriptors.props.ComponentDataExtractor import com.facebook.flipper.plugins.uidebugger.litho.descriptors.props.LayoutPropExtractor import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.model.InspectableObject @@ -69,6 +69,9 @@ class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescripto private val UserPropsId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "Litho Props") + private val StateId = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "Litho State") + override fun getData(node: DebugComponent): MaybeDeferred> { return Deferred { val attributeSections = mutableMapOf() @@ -77,7 +80,14 @@ class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescripto attributeSections[LayoutId] = InspectableObject(layoutProps.toMap()) if (!node.canResolve()) { - val props = ComponentPropExtractor.getProps(node.component) + val stateContainer = node.stateContainer + if (stateContainer != null) { + attributeSections[StateId] = + ComponentDataExtractor.getState(stateContainer, node.component.simpleName) + } + + val props = ComponentDataExtractor.getProps(node.component) + attributeSections[UserPropsId] = InspectableObject(props.toMap()) } diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentDataExtractor.kt similarity index 86% rename from android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt rename to android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentDataExtractor.kt index cc4abd47c..1920f3d58 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentDataExtractor.kt @@ -13,8 +13,10 @@ import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister import com.facebook.flipper.plugins.uidebugger.model.* import com.facebook.litho.Component import com.facebook.litho.SpecGeneratedComponent +import com.facebook.litho.StateContainer import com.facebook.litho.annotations.Prop import com.facebook.litho.annotations.ResType +import com.facebook.litho.annotations.State import com.facebook.litho.editor.EditorRegistry import com.facebook.litho.editor.model.EditorArray import com.facebook.litho.editor.model.EditorBool @@ -25,10 +27,8 @@ import com.facebook.litho.editor.model.EditorShape import com.facebook.litho.editor.model.EditorString import com.facebook.litho.editor.model.EditorValue import com.facebook.litho.editor.model.EditorValue.EditorVisitor -import com.facebook.yoga.* -object ComponentPropExtractor { - private const val NAMESPACE = "ComponentPropExtractor" +object ComponentDataExtractor { fun getProps(component: Component): Map { val props = mutableMapOf() @@ -79,6 +79,25 @@ object ComponentPropExtractor { return props } + fun getState(stateContainer: StateContainer, componentName: String): InspectableObject { + + val stateFields = mutableMapOf() + for (field in stateContainer.javaClass.declaredFields) { + field.isAccessible = true + val stateAnnotation = field.getAnnotation(State::class.java) + val isKStateField = field.name == "mStates" + if (stateAnnotation != null || isKStateField) { + val id = getMetadataId(componentName, field.name) + val editorValue: EditorValue? = EditorRegistry.read(field.type, field, stateContainer) + if (editorValue != null) { + stateFields[id] = toInspectable(field.name, editorValue) + } + } + } + + return InspectableObject(stateFields) + } + private fun getMetadataId( namespace: String, key: String, From d0a05ad1a96241a5f35ce989c720ef010702f0df Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Tue, 29 Nov 2022 08:54:58 -0800 Subject: [PATCH 0358/1651] Use global id for debugcomponent id Summary: Global Id is stable as the component is rerendered. It is not stable if the whole component tree updates so we might want to deal with this in the future Reviewed By: lblasa Differential Revision: D41581346 fbshipit-source-id: 0c2834ba452ddcfc3e0a7392672825fc040901d9 --- .../uidebugger/litho/descriptors/DebugComponentDescriptor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt index 127ae86f8..34dfeb592 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt @@ -26,7 +26,7 @@ class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescripto * Debug component is generated on the fly so use the underlying component instance which is * immutable */ - override fun getId(node: DebugComponent): Id = System.identityHashCode(node.component) + override fun getId(node: DebugComponent): Id = node.globalKey.hashCode() override fun getName(node: DebugComponent): String = node.component.simpleName From 26a7ad795293f3e314ce0bc4324eeadeaafd4743 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Tue, 29 Nov 2022 08:54:58 -0800 Subject: [PATCH 0359/1651] Summary: In an earlier diff we moved the retreival of litho props to back ground thread. Fetching the props also creates dynamic metadata, and the computation was deferred after the metadata was sent meaning we were sending data down without associated metadata. Reviewed By: lblasa Differential Revision: D41581345 fbshipit-source-id: c17a57d811025c3716bc3bd26d119b273f1603aa --- .../plugins/uidebugger/observers/TreeObserverManager.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index 3e974358a..7c5502e92 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -102,11 +102,14 @@ class TreeObserverManager(val context: Context) { val onWorkerThread = System.currentTimeMillis() val txId = txId.getAndIncrement().toLong() - sendMetadata() - val serialized: String? val nodes = treeUpdate.deferredNodes.map { it.value() } val deferredComptationComplete = System.currentTimeMillis() + + // send metadata needs to occur after the deferred metadata extraction since inside the deferred + // computation we may create some fresh metadata + sendMetadata() + if (treeUpdate.snapshot == null) { serialized = Json.encodeToString( From 4bd5314b0c7732c33905b029faf328e2c4987c8e Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 29 Nov 2022 10:26:24 -0800 Subject: [PATCH 0360/1651] Better Open In IDE design Summary: ^ Reviewed By: LukeDefeo Differential Revision: D41584984 fbshipit-source-id: db8bd28854ed963d3370cf061a56aa63bfbf4f54 --- desktop/static/icons/ide_as.png | Bin 0 -> 29011 bytes desktop/static/icons/ide_diffusion.png | Bin 0 -> 27123 bytes desktop/static/icons/ide_vscode.png | Bin 0 -> 25419 bytes desktop/static/icons/ide_xcode.png | Bin 0 -> 48975 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 desktop/static/icons/ide_as.png create mode 100644 desktop/static/icons/ide_diffusion.png create mode 100644 desktop/static/icons/ide_vscode.png create mode 100644 desktop/static/icons/ide_xcode.png diff --git a/desktop/static/icons/ide_as.png b/desktop/static/icons/ide_as.png new file mode 100644 index 0000000000000000000000000000000000000000..180fb2312269de405d649ba46375a0b616ec2547 GIT binary patch literal 29011 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 I@|NNM1HPXJcmMzZ literal 0 HcmV?d00001 diff --git a/desktop/static/icons/ide_diffusion.png b/desktop/static/icons/ide_diffusion.png new file mode 100644 index 0000000000000000000000000000000000000000..4949d7e1eb1052ef0c1ad6577b741517f7635870 GIT binary patch literal 27123 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 literal 0 HcmV?d00001 diff --git a/desktop/static/icons/ide_vscode.png b/desktop/static/icons/ide_vscode.png new file mode 100644 index 0000000000000000000000000000000000000000..2dbc780e078042b734be5b13ab0884d6e965fd18 GIT binary patch literal 25419 zcmY)U1yo)=&^8M1TX2`+?v&zC+}&N<;_hCY8`t9Q4#ivCp-`LxMT@(Z;%2-^+AZauAGIE z67cqwMg-tM*Z|~}0{y22L+5B`6pK|ns_|I+_S17GV5{_7}`ldPUA0HEOfmq9>gHo+^Jp0%c~o34@~ zzp0}=i?Nxbi8+g>z0-fK06|awSJK|x&6vW|-p;|5-&2U{eHpZQR22Us;$|yE zrK_Y$A>rs^PVt_FjfIU$7@2~CLeRy`f?r)y`hT0h)`Y06+}xb_Sy?}S{><{3lf}`+ zl9ip0kB^m&gO!7W`Bj41)yu)n*pu18mHPjH{J%Jo=B}nL)=qBLjt&(6;ToGby1NNc zQT?ar|EB-bPd96e|4);H>;IbdY9Q->PgvPm*jWEB_G?qY|G4}rF4pF+n*YNWW*7V) z$^Spz|LPHB{ZIM-PiOv*rT@cyHB}f{koEr#n=mq=!3F{VhyrqwVw#?y<4*{_BtK^Z zet-Quoa&Rb?DKN~*1K@&;EiNNL0J$2P=@+4(iCeXih@ISC&hb=yiW+~dP%o}e46d9 z3{-BOUg`zPW)Eg+ZTI|LIR)AUcE)`iS3A5oiD{cq7!g}O)-Y%?ELJ6>6fnJg8)b|V zZb>Rj0$s!CV)YHUH8}Mfi$7Dm#l7XaHS_H1Yhi(??GT+Aq8nO)n9?T%wY``XSZ@(@t))#k zA!xYd;kl%nTYr5FJm`ME&l;uva&ft}p%R*hqJp({DEoKOT0E}5Yr{>36Rt@Ir^Vqx zS~9h_8@U^IEMIqRa;!%q==aTWoh@dBB+U^KP1_k>yvBHB^-yGkrkNM`k?@qpH|l;d z0r7I#u(Q(fvTkw&Q*fh4E9~>eFsd-TT`N^V_AqKDyPn?!x&Q(w3*?4w@UJW|B!o0! z?n?w6b-q;q)}!_5YJ@>|_)^ma3?KvxZOGTIh)EhaT3LAt)6wlput9zbDoOWP{$&gb z)1;Sp#lSYA+Yo?-%(yXyb46Y5^#vgKSIKid^ZwT8xOxB5C}<(mDcZyI7qESco;P?g zLG`HJ9q#rPBS*Ggnf=mUzzz=l9%2Q@mOCuU#{Jg%2M<q*~y!)=LnKB5M| zJ!1VskYd1!m%}W5|B)GXW}F-Y%k8%}hqomrCMJ)KjeTal|C+q>CkCc!we}}s5jmy< z^BGgH4f9|gJPe;%Ykk~F_o(espY#NP#t|d>^bJLSZg8I76vPoU6M_OK!|DlP2u`Bw z$OZ4Hg~uHn!@5y(-(R_TH_S&^7B9Z^2Ei=)z4a29;9tVJ*M1;+PE^;SX-i2|f6M}< z3z=YdeP|80#eQZ!#l6BA8;r1;!x~g<3dRfs%HZb?K!m-0r`nOQm>vUe0CV3C9-x3N zn6jxeRQv1c>7C5X%q%7NQu~q!lAd5W+j(LU6`TmBgsl<;wogcO^F3D@$4OgZcKL9L zW^W2bKFgdga?R8EzHAs!xLlh-8{T!GJf9fd&hERGv`{q|yy$Q2HIBO_Q67{N&q#Q+Zk#lg>)(h{^@3qs?5?DZ@a3B!!q(IrGT zFmrctUGN{ddnz%ouxoi+F!QK>NX5(%llJWh%{nho-7{VOLO7-I7n+YtZ<2=YhI&v( zFkK4X`w~1N^whpcFwppK5^W`{Q;CDwBD+DxhPN;INy_X3;n|CGr!wGD_*yh=5^v(! z7UbI$1i@%2S$M2DmMTJkKk!OMq`dLTD?$V$f@lzTZ@ePh(C1MA0v*ZsI%poquP@X0 zh|p?bzlaxQ=G2DTi0&DpJQD-LdnPtM^qccV(ztirXBv|Aks`M%xQyHsELdf{b*P~) znA2m#vbUH0QpKSqC<;`do)kV-agMrxABL9VYj0~p&BGT`(7g~_oKed#pK!`BSHN^V z2W3nBg4-XAz8WpC187zu2UZC4)^XvMW$}a|pL|p;mqN**ytMfXCjgm0D!db&Z|K0d zlZ~>j5{L_i6$>A))01?|nEIz5gJOZj2yn&$|;M6nNc`2Luayt=Ro4Q$;SXKs>A>~m}YMpy!h!jO0esEPzO zM~aZtRa(xdF(G*AUzYVuMfXCjn0gMxhA`?V#{os)ciRL~kHMA`Zz?c!cA9;$L@n|< zxA8E*If0iDg~Sif(}&v`Z+@!a7gRhIln#TC6xD5Rc7R}hGkq3Ov{&=A6q*v#iKL|3Cq@K~;<7{@EI8eiY75EAGRG+7PP>6&t# zB@NMw^n0S{kTc!rkP0OF1E|Ai%t0H*wdG+XL6Je9Y#ZM9k#HAyp*=qbZ=+G0!Z zX}nE5qb8d7)0fBRL_tCVfC5tPwEG%q0lUo;6U)WgP#WlRBH#wXfDG1B)Zpw%6f}vY z0g9UlABmJ9u*=V@D<3&=VP^BaVK5Ae^#N;HaG4mkr@~ej#`!-NJTY^C2yl0I*Dy6T z6_H}P^@4oq{ z>3J2XJ_$lw0}E3iWP|d1NuEBbhCCu|WVDpZ;-WYT5QBw~!2MqG;5``Lv&nnG^-BWP zSO|JqtWwaxi@@ZqNT{@J{Sa)f586b!fQk4X8u4;DWdvU99qHlBlm=^kgJF>om7@94 z6*-S?;H?!!UKcnDO-fNB3T7HQTG}Vaqq%D9;y06uqE^%t*Z^^`G`IMe7re(*TH!Z+ z6rze8lljpw(N~Ah3QQdS9DQ(Ro@w#;38~wakSpZEAN$3f?ks8P4^cqCO;t`nix`Y+ zgXRlN+cOWFK;u&_5{vzkC^ z{f$xkqkU$R?;mhpkd6-K!-HkU!^4)UUNi63Xw;HdC<3%D_2)RbdT_$?&)VxD5pB}M z>J;uoQhe&CX%3pkdEjfD5{zpd7oq&Acva0sUb#x~5TA*?)ORtMFfhwwWOOu6NkQR5 zh4q+D=Lsh~EK2RtGPKBe>=bVEF^v2tL2imeI~gKK>Ct@l%4ILH(dDL8f`j!BCA(;n zv`&$z*gN(!xkNtS@BMToQI+4+klA-rV4EsIG)~$MF^UJ|5a~%8tn#no6G0_~l#}!L zs-@(?rPPO|jSdn&(ojY1FMIa`aHL-X@-5_j4?NJ0QGZ~AGjCBwY`2>g=7u!{qPEK$ zc)3qLx6WMRp{%kYf2{?bmC4QR6JqZ~^jdAGQ%hsjmG#I;V=|*i_YZITn?d0jl7C>P zA8~G@`5`jV!K|;Cd8PJGjDV;)Up4!@9?UoDrCq!$mWawXdeKqlHt%<$PStCa0N zoA}!?y%-}4SQVYI7FS@R=0%idW1^ME6P01}k*zBJNjSkM-P4?DfTFSAsAn&wk^Y`J z$mPj~4ai%7cOy1yqtepSk}>IYAvltfn7Gq2LBA^0fvd%<_dh+^Xdzoy-CqgeB zOS1gmB!dj1RcEMAWi`Llq4A1wx>Tc?EsQ{NDY@pv zCv5CHUPrJE?Auu#ZMpmK${PR9qKeISz>#fnKC(BwnZ$%3H|OaXy<)ALeO&;t#B6$=K@Ca?Ll31(?1&wm-SnKAJ{zZj3 zhyZj$9CM5VAq`SS@9aS%|}y9!3M?xze0vW zpzG%a(EJgOmxz6?wI+*I5TU_(=0LClOqO+2fH@@pyM!_7R`2%~MEf zxKc4@M@qWiZanzD(WH$0tcO3z2;Vc6XAc{H`Dp}w>_O1;E<0a;XhI=J%%7O`SZ%EP zC-4xN^1ZrPJB+TshiZaC=lS!{7Uk8)`goKeSsB8S&s?<*!ZLKg1!%bEyBG^W@5?pc zPHKtP_p<)4+K3EDA(7O_XEYmXGGt!c;QC)Vg@ejMcCpV>m`{#uC@AErp>lCy^4wa3 zn;3p9hW0}5=!NUG6AOlpNHN;|QIkjsCbM`#3B66CuNH|MpG((jhWc9UGO{pfy=GbN z#?xli)lFr=#{E!SU(qBTPLtnO;l^{u@cA+?QBhGi6fPu@*bC-LC{?5^zx~-}D0`-K zv3Q?X^*d!OgzA;U`t(^rrJW5&mJ>;${5w-tR59nCQ>2ze7r!aDK-aVBGZv=$b>GKm zS?w#Nlzzxl$`ZLv@niZxmCaYUt2tJ4kJuoh(toLQ)vh6&8X85W27kmPMMbf?zoG{` zUmUwEUJ#ori*qR-MQWFJ=8)Yj1tWjW`L#z#{KsQEPs(&XEuoIw(_bZ+WLFx(`-$5f zYcZhW$K)t8SEV($@k#!31PEZ9@qhXL{X6?QSJWuQ5qjs6|C_(`;&5QiYqf3qYr&^s z?biJ(W*1-Wcfw{TLEtZsxzwL^{0H`XeTR)=CS^^R-ZWK+jJjI1dA}ERu0h=G9dK|h z=mm6}*_`FE!&%n<{`m33d0)cKe6WjoL5)g#!uYbAB;yFf2R^|vT&_7pjk~e58;|~K z^=6mH<*t3n%%RkHecErFcPPE@E1CM6Zx@RcoMV@$R*L`L@3IvXa4<0ed68(y1o#Dy`mRJ>EB&l*lz!7^m6f)?$F<*w!a_q zvam2XLV_DTn2g`4NA?&gs0_@3m`t{M$NQDUki1m5cN0uRP}; z^dD&8`@da&p(!paoRvH71h*tyjY>0D>uQp$WwXU4yfgRKU49LvoiRjf#W{n$YVz6n+=8xJiPd>$(!3m|D$&HoN%>Yd>OCEuJ~y!;{av%g#u8sQN(hg!>P<>-)erQB-l3iFh?3pW5Hsl)qajG1l+=8L9NGT|8NyuC|O9iW0yO%s{dImoizn^T{s z&nzM4pW)1Qd^{N|Ob*1RobFZ)&$TpLK4s78zj^vt#age!^~FEeV}G(>7*TAb8e`f1 z0KomW!HZXU%?tO{mz+C8b(f2RlAHTVvVXppN&h-Epb{G((=LRJp|m%Q4t+58 z&|jw%O~|4aarT}<$l57Pdq2v)FmfcR4>^JBl3!Iobu7GCEnP2p+cq$gQ@WyE1~Q-p zn4cv=(xJ*6vvx8=>ro;b6{nLZ9ElM>#t*pt{{;t}R-?I0%e0#*vx-!mea2-AsU+If z>h~R;L4rwnfqZ0KuZLaV<(W7@c|)spTeF%R*MyZJbJm&Hb{}l9VIu%lKawXO7V8z_ zv50dL8vQpPZ)}Y^teN_Y#Wro*M=NOc!#}?(+tve9%mD2U{$6^kaI@d3yQN1C zvpE=;wO#IMVOcENAsMVw}>0A$v4zkg=%+bJYIi$bX zZi?vY(_=7?C#~6kg{kqb|J0^VPbOpf{A(<6y7W?etzv#6+@zlSY%fJ~m=&)!MM@xQ zCtVRcfNk%Ag4sn`WzekjOl43g59yTqtK=+W&(3`TuT(ujf85jG`U!YgDTdWzQ|fFG zXr0c`EtX8^o}eQ+l6M1Z)0E6+L27Uc;V9=jW37DG&7#3wM~iZ-a$p#V?Uo%cMq(9= z!0)=<>-@qm#pS326c4`%n`nu?5l3RHV6OYOl&eFhBiyPk%vzmLWW5+Y&Rn3WGOLw2 z;x>d#_3w*{+c#T*7otN<58}Wj2U?knv9qngi65q{y-bTuU4<BLt;~RZO#2(y_Cdaac%~h<8!`@`xrj}h=OD-+^K4nd-_9yDS5S;Ui`PW2DQFB`iy->BUX;6D zb}nU5@_4sj;BumuR6MEK4y{~$#}kwcb65;zo+uW1K8u4a2&?Q312gX3{!bQx|5_hq zmLmz^^AQK^#z!kJc4l}mhQ|7>rWs0~!p^n)iZAUH-~3yEwO+q?3=Kfuq%w*bEdWSz z^}9UU{}Q%xKT;P>`3$r3w&1wfm3t5sB*pYejpmzuf-gDR!dFbp`@|t5eW{ehEE_FW z1cr!d_V;~tk$B@o=6<|R`$0lT6#O3HjKZ+Zf@|$Bm`Cfvxhfv-Wt?5DlVC0&dnv)l z3io2@ckp*WzB6MO-TfVx&fpLU|6vAxNg#C+$@lLq1_LjSX&tRKqP^kZr0y~({26h` zdB4os2;s|vzC|I+?Z^5VXAKOZLYl;QWVA~;NU(lv^&n&#+w2M>E~QdA9Y)M1H;`z{ zFMwEwRzW{dkDjoFixyn^6|q=@%R!QP89;FiTB+sx~*Lepx1N=}m8*FcxLS%s8h;**F@Df$VMvc}Os3IXRLi3DUJf2haf1mI-$ z-jdrYc7IAPgHjN`w_Cq|@w^DcySa+qz{b8C8nh8(4*$3fl`Yx{RPkg0EfHP^@NLFEXTuK=%?f zj_2<7?W@|W@LuR7d!q4FFtGgtK;O_BKXffo`HyEr=^laHYPKK{kkvNh)Da*um0rq zXN()h555u|<~5&O7u#y{JGA}JXXNjW+5|Juj=I!|Zuh-IWM$W}N`WLo(Zc3Dc{-rYFUPq~KHPLU`_%Q`}Agk+LY6^nQ zc5@kOvTLM_ad|#gDdH+_A77ugb(`UvP@FH3QO& zVWjm)TLrw=V?%<=!Lk}Q#&~z`j|Odg+YeRF!Y5uU`edX^H)9hQZAEt>!>$!x1j}XV zSF};zE0-0({j|!FrW9{ucE8BFu-K%PAL_jO^}kOI(XB zGB0EjtL&$l{!Px~B!`zktvFTy+~V&U+}+vS`4X?xqdT&^Y3qB^oYLAWKii>ZPv%7Q zO+%!FHKY$ACG(0&mAi2Vm}kU%6c{}NL!+4iu+0jjLlvI)h2r}kr1Ql{F6EApLzAIB zUK|c>V@i;xac!QB^bE|JKnQgJ`MV^(uZ+Pcn)nwG&S@hq&2SeLZ};wH*E;#GfMq~# zfc>NWmoRv;%)FgdJqitHk2NFTjL+&OF^f}!u~Thmv-ut`Rm@ETLWT{i^#ga=d+yWi zG`halAF$cT^|W=F)=1|+_`Ck2A)FETS!J25lhDnGKn>5yy&V#xs(Do6)wR=Zo0dy_ z&oZhyEH}jgf0ONgG=~OXeFA-^5baLq*2LJ}-M#LW2(Gd&_#IR;BN4sWd76@C3r|0+ zpMFnkVnD>OO{F?p)&Sa})-c^3WQyLo-}^jt{b=L*H9lmy!@OgF(Lr9|`Og4^<7&g4 z1G~)9BG{TMXL0E<$H?H@eF$UPg|_JE%gMC#ke|-DdVg)>V;lKmWf}WdB=oZnN4rzB zb00Q{bS}T7z@FI<4{hK7FhZWg>os#CXaS3G?c-rp-Sn~lN=QX(^YnJ)KH6}jfGYk5k^W1PWWMirm$m&hrv>!tZH_zW zlcVmn&{fqt=MSo9hY9RmJ#pZ=9=_X$Z`n!fCuA73ANWRbco2!+y1NC|YpvDy_t+FA zTx1d>yb!#;=D&MpA~q+gu~n0CccQ&Y{J_Z3<+A(|M>_RCA)c zO{L9;7Ew&hMxuR+Nv=VBy7ha{FEv#5mY|<5bwOo_KHAFIqCzDs~)oRFRY3TzEGf%$%_`w|M+HuS-Sz&^uo(PPuOO9S1BJOvD#%4l`Uu= zQ4xfF$6cnycx}ia4sbcRr4QS_f%J6bjq#ur64Q;enA#vpd;@)|PAbHD#8RWjP)@K< z+a3Cmc0FWC@UwL5GVdJV0Ih_XI0Z32zQrJz%HF&A5dkzI`x&ikAZ%?~xuLa7VF|tc zr6f#pHjIe-b4#Bc!h~~5PM4mZ>GzR$ z>_k?BF5CfVZhxLxCd8*3&XwTC)2L&jcG2*<+zx)P>Vi~-Ms@;a-6b_`%EE8tlJ{7L z6F47ehAM3SN(OTP^scFoAE0;76SooM*zR~$CJBm%s6)5$^cdhtjE9i0dJ2)0P8TXsxk zVp+D?>Y4#D^KHDIF4*q)JQ5W%U`*{EFx- zJ&R7HFtVK?C@(hnW+(gtVdTY#t%1nZAlIm`A%6oJnW+F{Cy1L(HlnEM#Z8yCs1ct- zcXl7goLAgzJl}OE78)5m;4sGjMznWH`bR+SeNWxqyNJhfkPLcv#AAi(D0vxBahS>_ zaHxS;Cjdv+yGWvYjH*s+gq;5dBFxPGk%PKA!GplSO_E$L#INU1Eh&tf?EMAB7y1{5 zeYiHUHj{TeXyW=LGhCtVF;CoGY+5qZ+s9(?;%wtkcYS z(x2*{y-9!fF^bl^s>s9?k`uBkMq&8HZw5^l7*Nq8LW^HYme0XV#dl>br^B;Kwmn_- zbT_H>UAAvDfTP6YYzq zzKGXOSkara`c7XiU1||q*}=u7UjdjvwFX$Vp;iY}7%xlw8ZhRp3VVsdh|7NCqiNEu zFmS1o`X;T{&2yMcFABn1y6%MKa5B5hX~kS9x=p|Yl-6vQwHL12BiUwppWSg_t2e@j?Pl@pzi-o5_0wd( z1cRK~YT;k3e7TcPcX26%)rtQ`dstWYqW;}_d1&q1E=&4tuB8`D6PnmlTnf#g@~e}_ z%qqXe?y-}Vw>>hq7i$#sUG=;hvDUM!2r!VByFY{Zt2?x_M5m^4_VDQqhVK?kq;R#A3_`W~N z@yEMdp7Gw(D2?bqyy1gvK<_yvGIqDN0uv~ZDT?W~vCe5CyO48lTo;sFCVVTc{B*++ z=>SEHzLqsT^XFo9qnn|j%4FS>Y~Su;-r+bLCOtnZrP7l6_3#I8i91|WB@odK_!ri0 zO7N%UZrr0oUO7;~g1J14 zAdQ5&PxN$9q*>sZwS~D&0wASm_@0N^B;p{uU z_iH$zs~>+c8HReUTQDXkCpllQcYoF#iI-Y3`_rVZWv?w{Rthb*tfRm?D98Arg9y^E z73)vQ$syfI1>#kE+tat;QJ&uk7iSaQ6`V3v_0ZRlKZ*bQ6notJ=S;mv!o}5lJ&G`snn%^K2gh0nWPzZV*O!8ZIId*@yV(y=h zG#aOoCy($%6HbburscSAceztnHHnVTj@ZUW*50aP=yD2KZDm$`eTb9K8c< zsKpOBdFne)`YEstc))${%oJ-itfR(40I>n+*EUm`x1xJNCZck{fceDpytd1c$D5J< zZojwDpHqfzFLn7s{4Qwxqn>SMbf{Cwo-*J?)!(jj8i8x>iJVCnscQ6Pp={mga5*p{ zW3>r>$tXVBoXg12{e%((Ukq-Dj~~N!3VGzqcSp;2k!Nn??|ED zzKTc#CZA0`ax``YI~8*8AM=Tb7K-DiP(r}@RORRde*NZ74p0t7PvE0zLoq>q}aN<$S^GK4Dd9r;|{lAWG)*mPB{Y? zLAY>1_<`8eNWh9O=`3cJ8$ni zbZ@GYr&MG4PSsHT`O<6Li@74R`>O?WrToLldS-AKN<}*X!3@YTRQ^JduD9dPwlbz? zWh-7aqT88~{haR?Vs?jByI}ic{N!`s+(ckDHWY>K?+KzuR8wHlUE3Ek0C{xuH3m=V zOvFudt}WFcdDfR4svoZQ9LO_2dZ$vI#NN4CLe&2eQhY){->*SJb#NDkOh{|BG28p7 zD3i?uFE|lr`H0`gG`OdUpFZDJZ=@PVz&HYT#{PZ{4HT z=wx6>w?09GFOoij^vl5cxl8ql#we@nAe1ex^UL1R}5M6SC({hW`3?QR45$1Lj`F-)I;a}L?Bd%P! zIh$_j`0sUPz!^*e-W{O51#N@U3>H##5-c(4NDBtjc7?EnREUk z`isIO!~wc8Kny|VQ_YaSb>{teia#2??OTOy$FKS|9jI7%VhnVs8W|f>q5p~*AbdcM zrm|}}w?xzy_{&=|ep+4V^-_a|@=ZoY#$RnyWYtgA=nXE~T3W}E`R{pbk@+Ylu3oQ^ z-r@(}8ZM~?@rgv_**=cvUj7UXV&*Wh8vY~)$NLq**zg^@Ls+SwsCmXSiHdC66&=p0l#*`>!iP-*+McjN42=1amcgcBg-Wzgj;viKYZ%m8;6*gQv^0!s zH9ae5%V{zII5^cdDXH#J`i?@rVC00siteB9&5v6 zYH4aVkTZcA*^oD}HuitS_ws3$*eY+WZ>lsIJ#|WlS<;vDi6o?>p@x|9`I(S@FTj;y zf!+DKUA)T>u&#TXNnQHPfH41On87pl$!>|J6_FgBk*gHd?1+uKZQ7? zE$8wtS?j~Gkb2;_6uiU{NwL6<+midy;fiXxgwE0Gh);!F{_)d<;05Zu^9rZoPoSLA z_hOufwEKRx_S%@%C@n*-zo!61KEUv{YG9qX8vW7^PF7f{6ii9c)Y-jR79CzZp zfAM*~iLCQN^-3P=TSaDIyJ!a$nYW}|{V4jqq=E9yxoXT?Z^=_%&P9**@%rXu6aWsl zeN|!2@Hc@G(+~zP+z453Q|hN!yto?tFga&BI`MyDvED!bd2G{Drq`eWe9>GA#WM?Q}qqFOX3K2eYMv!RVT9#GG- za;$^z|3ZzltV+O-CLbu~2(wRgbuk7Yv5=JkCnm&=8BdODhw{jR^J{B{s&q8eX)f8u=%H>@?DZ#h^T2g-5t zUDi`SI1Kk4i1Kzxx7M9tP!Y*wuYNr{e{`1_Mru9y-dZPp&xnS;pyK?fi_M{1{KK?eADF!>4BNnCC`ClaT7_#fR&^ zRZW0uuzO?~P#&0Lz0INpucyd-v!Qijd+}mzIeK^hsQpX}9q5vvvGax!RAd4NaLoPHU`BD$k zPItHRSi`tN)=jl(0Bu|h%-;y*$AxDE^P%r&xUfEvQjh2HqAN1i@<_ zaA2%T@e2NJHa)R7a=__|tI8X7r@rlo^1F?hi}v}zT4K9*`kpbkz-?xNjlkyUczuOh z{CJQo25UhzS$iwl>qVb6T4aUpC-3P($PuYhN6^a@jE5WOdm0#n0_ z*8(Mfoll$@4Us5#!`)J>`tf|5hD@iLC*d11{(SUON5>7}+n6^#=W;6(K zd##LUsT1~jy@Pt+cQ?*9s%UC&BG|7jyx)K9?+hFwP`HfpP;duE>Y$>JDJt7{c?yJoD*?*Vsy;k)@LzTd<36FYxMk%%Fx zqrtvI0TyK;BOUBi;6hpf{(2|x4pWny7ts|gT=ppx&-F`=Oo=2&jR${bDB1Ynyg!B0 zOkLSAB{G#p@H_f#i3Rv?zJ@XPt*{-bvZqBFjVa3{${99h>c4)NPE8Itr=0jr2w{AU zRdz*&oJQB<5=n(hiw<*bc-a3>02LzY-GHeFh<@OK2fo2_ z;J#*0N7#kI1kfk|>5Q4fWX0{r%IrRg@(s4O(vE!(zL)py!D`tITmE03FihULb*>_Q z5LD#RO0tcKH19S@Pv~hf5_)kN4CzN^cNX&}{_>uvQ%5iEooM6B1f^)K2a= z1QftQ!+Zby=Rbdq*P=|?Zk9s}2>?XlTC`}9>#D1+I{eRn{&Q*X-n}mYQZ<^AK(m)4 z;X)A(g&QE@jFElijh~z#D>m(yjeAR^03!bwd+=!2k%5nKNhd<*MT1;xDY3A@TqKAizmP zK~%{A@S+utd?ccrYMejbqz0MU9>-$Ypf)8QZD>%Xt< zs#fO;?8CgqYp1uCnJ?3cet@BSs7JI(?1xlkDa#ty$<{P$+}r)O()2yg&|99K&xFgh zrdcuo)VT`Nd9O6wVhX?pE?&Ht5@XD(ufF<)`K_=g(-jI<`MxQa zt%%0*U*U7lJ@*;nF%=aRUT1+`832|F8sX)(+iu%|7nhrL3Jry_ZvfP4E|hhwYxyMl za2WNyHAqPUU|zjoHF!U)2Ctu(CL0UE1fUbZY`_?d10ABGE)4s|&!{!AwS^CKz0C65 z9LXC%!zWGAD!u@;>X*O#{?|2rpOSz zWXX~*Xi0>(xujrslUFc?cA{ni$#K#0XPi3x&r|!!W-x)iuoK{sWgITpu>tWY#O3|~ z2rqaYpt9R(qwYmiCv2TbqYh~Qi{5+hJxcFUt%?6^WUCASB17X{cikmF``OR7;k4jY zd>GhIs?!v9kxr7U%?$fbB^p6Nt1n_r&&S8pVdb6*t~^;}+0x z6lu9NShUIj@Pcdn`0-R6RPWup_jNM^N{zM)QwWd=Xc_Km960*gcZSM7*yHo-$f=l@ zH{d3PJpXueq;E0WTeSgU3fK^=_Wu3*-$1o$u!_g2e5*oDTMR(7=m2|wPq3Zv05an9 zt#T9Gvt5WofJ#n<4fs1_N^kk}id-qdIfFPYO?qQW;8j)ZlQyx`R`Jj$CD@rL+H`lTSV=I7xIjHx!r|*}d2nM8n`7#W;P|;G8j;^2Jrd zr4ZZj_JR@cm@$npnq++w8hb3%c(0@k)Bzc*yct^4)U|m(z;V@mtXOzDRdLYjr;k7W z_-@i}TjD>P*d_zu0|^NU#D|9U>(}dPK)dhoJ==vg1jq!q#7V-NJu*Yqe1D|$$9EHU zS3A`SLz)Try%nKGYoS)34t4^5`L}A`ym_mxzWVAY(r$b0X_o=eCwb6<(YP4cPlTKL^yRVAtaz3b%BWSkLU9Pp; zN)Rqfas!t0+3b1x*d*#^oLmUDQo*jTL z9hea(Pc9rKH&4%yt;O{+9Hzt8VMG(EPePREUIQ>QBvvU8c=@CZ&wQ-;GtT?`gHsmZ zU;vq^9U=?kr4aZxX)zkgzkJXrjenvJ9z56~-pys;f9=) zl$5FFdSiG&s@<0M><83z0Mx+a%;${FkcRSFd1XtbjKWUB5|c=}3?cQtnTgr~#K8#% zfS|laXM@BiCQD+5an3@Q%jo8dB!)crKg~##j6?&qxoQ&XPSYa3>9P2nbIy7GFMs)q z6DGj;5^ejgLj+8bAGQF@(7AN!(k1+YFyd;jO#4OHPlOW$w82m^4ifp@dAai2x!JOb zro+G#)#2S`1O$f81EG#K!H6k3)iZ2*%82Rvp6Tsf>-UV1QV0kAwfK<1Z*yW~Se7v^ zh6C}VrEG))*1EMg_kS_s_0R*5K6N7zZQXT<0hq5h;9!9$=mS>Zyg-T>5S?sgVC$d_ z-#gl1C>}b1U!Ofp7A+VkTT7hM52GPZNb1r?BH*JE?SYo=&;$`NRZj+txW4ubo1QXa z`o3p+d)N9s8nr;;0TooRQE?)dO^#Q!GB<>VLno?vJ~sY*h$Fw&aN`f0b=KBq8#>GY zkg*GUipg1OHf`Fpgt)i_JlczPtd8+9}@W|#~*+Evg@w9E*d9!bx8Tgm+3mg0EAM&*s)_-K*=}Xe6vX9fIRF4 z0TU7t7`T}LsF9y3|LWS26#XO*MgsjnDIJzI71;+DK-~FA!p9fNWEGD8PKLDq>{0RZ z;#ny&bwI2lezrGE9QmW7Js9adi+F`8p)01)(Kd9YxsGeDxhDOw#~#ao$>B3;X=z8I zFiHW2=A@$~+s}m+1c+^<5Uv!g*T~Wn>1> z{4*^IzM-y0(zCK9Yv?HRzVAT8dhR02#50lcO62`Xfng-} zE8tN7#wj=?@s;>~$0Z9FE-ZkdUO7(l>Xby@DG9*rmPQ;fP=k0eq=3iGG+PQV0THPI zM+y=@Z3U(dO_MFxkC9Qm<7IbcgXCED5475TgM%2iTf|#^t6Min_!+?Pt>87QG2)++ z5hbt9O_28&q{`*f5*6{2@HqtuBe9<_aiK5RC4$laF$6`!h7GF&@po$U=ld!XMmp&n zm~W&#_~3(D3Yd-eZ7HCWKn&N%X*x{n!90A-0nrUP^T_vX)^ z|IY2V-|qVAtFJgE?~?P{PaVmL9LLl;mcdl`epm-`zko6p>&W}|GvN;b#RNdTJaF{R z3x>;|=V!~7!}T%}Ist?1%r=t3mDkq@4O&&9j&>FzNxg;#VU+GA7|St5atS3ytRqD)qUqWy_X5hImzce0+6R=Ki`lU6laT``C9} z3l5Zc-g)OOJ9OyKt9|tJ&P97L5F{WG}K_k8uYHIYy zMxSR-JMFa3xhxOgVY6RrMmpYQ34j@p^VHPTR3TdbFSxq8xt=Nf)I9{d_#ZruRo-mgbE zWbK*8h(CQ$oFaY_K3#;2_(o%lf3}RL{T4&{{xIToScb1g*rmC@k)=ns=)_Kj(SQ2W zpVA=-#BJZc{ije!+-g?JmI68n$Z&t0qqkP9y}Bk}&VF*2^u;=RBdiAV8=R0`Ie>wb z8?ge=2)tF(0w-1h>LjCgU&$Ig5=pQPFabe~=MuGc zChG$degw?#+d=`QU)#KS^Sv;}yBjoD1DY$t3*BM>-I@aEe){y&Ppc+Om=HI7`0yui zkm#v6h;XbnRA{S3_Pxl00Eu5Q0gUHoP0g0Kv7_*mr*?qm8wL6}IS9H3J1_~~XuHxD z;HB93B!hw>+jBZVVupn-J{^vAd@A=6MDCj$CufX}mmG7q9&^xyAIZe8r`0g@*$m=; z0(9nFy?S*en%^zrC;YlK1z-knuD9NLtN!%UPp2mG(5h9d{=q~VDxl(w+O7vdKrsRQ zvF}fw*h^O3fVF*C3m(K-gE?RbP2)Rd0W2pvAsNKQOG0`U%mW&sMUGONjiSLP*1>ou z5sc%p8L_hW+*JAD(MbmJ1Ffv0euRV9ZS?cymtWqCw&tCG{`s|-euJHM-+{;a%*Eos zkj%U9zB>U*ihKL@>vtYx#ps`}4sZ+YT3kP3F0J;thSevZCMct#1KKcL^f{2s&!OLye(;z?^)hh&} z`z6cn8z;!MGyBNavM4!R6(!X`jkwfI>6YfC}BtFY4PYOvl%-1@xx#U2#VG=p>g-T^I* zxc>U<`ys>zX5S9lz8;yuhw*3}s=&hw-2i^LwbM?}--N>gyowJn+B+cj0C=>}{y^=k_LoG2~qgrUJcC%KNIsj8~l0bBpO zNjp1s?5NnaYnR_de}6FmHm~v3S6{8hheWEu4EA9A@UO9BP#t50dtot;VIyp3Lm)s9 zAWd+eeQ6zVN~eB>;v`to_;os=pZk4L~T`aL+P#E=A)Ikvp)dAvY;0X#}oS z!x7rfhCok+fT97+`?q0W{4Ib`jj3`OzVb_&@%vQSpE>|*hdQ5m=9wxO2ys4h;Q8mD z{{?IXxR=>h3R?59D`;Hv58HWvYn`a{0YCZ4PiWCJ z^z+X@|1swWrc>*l`oa!v2t+yrsO-~i#78}EAx&83{Smt|%7!K0dh4x&5$1gR?YH-v zK(Lj98XN2|;vrztzQTFXz`sZfCQT%w@c||NKurPAM&;BQX79Z7PVuFeUfMW%^yq&= zDflw(*hWGofb5`0K!Ef9=>7ZmKMxwX@0x3_X(UY`t=80;1q=v*W&i@S#zq__T8()R zwVbs$H{kd9z`>U^fWWoSwmAk2f_6bR1Udl$jPPpp3pl@g(4awo#jCaW=xzyV0`Y*) z`vcAZOjyxWxbliCuArr05x#D6GmaA5fOrf5WHSL1NOll$5NO~)S6*Je0XWaIGm921 zSWpflIV$}q6$IP`^WaVw&J1Yy!4H1mz=k23IM&`xF#-^KGGFZ$h;GJL>82Jz| zaXJRO`VRf^kAJ*j>C&aUfcuqCKmBw_@9+0_&rsnJZ=N5J`_MxVosT^O`2d!Eh5&(J zyNG}Qlz!?w4B+xO05=>+z+mUoCD;dDV)nd! zkVr(3K+kQ2CjQ#m+CokICax!#xbJhC3cCzVKqTSR6D|+tzVgZ|SAq$Y*-W745>AA) zTn%8r2^4rAkjpDteU2wq# zT$xBQnZO7#0nDF@i4b}|73RocS3iOwpmCI9ze)VLCN3wNxa|e&?IceKC?>FQ;lg3K zF=El8MHlPU0pL!31mln0wD5+2!cA)XpM3JkONqO%@}tN1V%pc$RihF z%j6;Ahvu^3jVpHTBMAZ;CxN2}u$+Ana9tCBGUCCsx9KF=h1TPW37Cq(5%@aF+4wTb zCL#_24j)N4WVa^ZsA#!~ zE8J0KbAd1=oCv5kaZl~)15SPc+?)eH%EVQh_yG)`IL!pGcYwx1qu^&BIB;Nz1%d4C z#1>%K(SSg}jdQ?7?r5C}Kib4meCym6`vC*rIg<$_o_p@OJYbYeVEoptTOYP`wQV(M z0frs*D+JuQwt4gB2Z4(d;YUN!$HQ*I%EB+8hYtWa-F0g3z^SL6nu<+BSvWG;fzwn@ z$0njXV`5_B(dG6*quqtD{eGJe&^U(e>{ZK_E&JVZ#~t_TS!bQqi0!>a*x zz_<0bS?M-zhNE`U$&ZeJ;2Tap`Q$j9q_S=3(4osmjT$vIK0cnGBh$bSH|EwxH`%vB z00K&+;C5adYP%C>T>c2s=*L*9cH(%uf^WY0hFjZ7{H_qFYmcZxELxe4lZA2-j-Eb! z`tdkjNPUgi6#m>|nt5#pHUzo^0ciQ%^L^mhyR&D{o==>+`s%BRd+ESE;-Wp^00;qf zbLYh5#U-afmpzapT6n0mr5g*G!yC zK|CC#XjD6L95)dq;#+F{&OGx>GJ(<0J@?%AAg1j$F__H2&B1M~wjt0F2!Qb2OMDdh zae~!%fm>rR-ycm}BhHzMX+&)oYzQdjU}|b=FU-kkD=_B76HlCvFRZ?)J6m&deQk#} z1X_cD6<2^muR+&z0&r?H%z8)Q9KS5Y<89&(Hp#avKgyhor9m%1`|Gjrlc1^nB{pUh znw@P+1Fd1bolXe2@dF#sN|!HR{%hdS1mcp3Q)%{mAJ7PK$2nON^aK6QJMTO-CBRC- zX;uXxIlLj^*;sEwKtTZLU>w`UtHXy6e@wG;;L#Z35OIk(1#i#y0fdlurg+Bl)-p{^ z?Ks3Ief8B>lm-ek(xcOD-GBy04-HKmQ0C+q^@~=mTJ?M2%2fEV7hQDGaN-cWE%E~h z;pV6pP^$#c2MmCf7MZ{pe432Xz}pslr!-*iC$IpdheX-u?xkXy^WJvbZKnfA#!{Jl z#u;bO>^#L>X|k920F1D7lm>0W#ECOpVTx$iQ#c#j$@yCXG`gu7a9Ap2$7aE9;KJP8 z+$-YZ;xd>3=Y+TCdI}T~_vh|gnDUly-@bj(*s)_@Kr0I_x#SX8K|w*;d+)thhEcx; zCgyzBw(5%{6reOPV#Elg8#w2jbB2u@H*P%IHx?giI2Ye(dkLQ`*QX6}R$%J~B194} z`%+EwV9(RYzP|nT+s{JZkH@F!#=)p(7~=L^A3*34&ODwe3CtiH+c&whP)!S9-+c}C zb$@2Td&LOwXGyZ7;Q|4Z@ZF3&KR^F{^zlOU_ayc?mi9&tA3nSf;z{t-7xfg07)`aE zwi`&Lk`NkS+6|BqOn>vuH*e$t4;DmM^G2HySRfL*QN^@TJvY}bDJfZlKK&v3mS(); zxU`2IqyrF7<+{FY)B{NLRL9OAKYn~1+MfaK?~v0^KV36|8Lcq_D{_S{9rU=GDJE@g zH57bnu|@Z1=-VUV$DV!m+2i23ZzRK<3P!w=4{dGJ*&>et9>RgE1+mZrB+ZyHBMm3J zCPO>SyNO@~N5Wm2nVC7;cpTaxAQru$rm(tSGWnX{&^~+G^ zeTwwbS+izE4IDVI@`DdPD8oH|hFkC1x0QSVhV3j6FxP#P1`HU`8xlbdBm$a(Qd!8U z!4GLs2qsZw8EKs6T+@V9m74Pa?rla=4a9uGb5%I5 zs~nyqK0iNiFY5saw(A@O$Oxz%rj|GhBgl{i3l>mEK#5>H%#2TksQDKh2epRCX>nu( zwuPYuAYF}8qeoc6yOnx8?g5Iu)oa(T{gb&8#g3sYHISaJMUc({r?fRfU(la5a!&hlarIv7fd&eT77dl&t|fIz-YddSDno*y9&9c_msjA zQ-c_+JI9S2IWn32s zo0`>`_V{oGn9py5UyTh}n_-=|1P)45=iAC1jf4Un8_A^ulmbgzb@wH~n23O&M0 zi4h2G=OYMs?JytZZD#`rkT5U2@WSXFJ9b2a=*bLXvEMunD+!4R<9F}g9S1!DMPe=f zCt;480^e`WoH@e>4<0-mGlfAZDJjFi90o#C;F4rpP7{d^)w33&ZR=hAtVz?&9@V&_ z!)7=21w{FBoT9rAguWkZ^n3R1-Mb4P&e;0!!w(<8r`)KeuYzYD4z$mS_SNJ0niVTn zRO6jGw6T8QzI_eQu{hxslhJwGq3G83 z=|Vh^Kj!`S-`8_w5&%cOL}#mwM9weeXku4W8?4hiAq6$SZlVTX z(y7H%pbiSZdRXvL?AM~bP4s^2y_Ol<44@@U0+~YiM}r|mfgw;jP__n`0>nZTj)Q(6 z4g?bif{A|VrI*yRmdcS(m_|)_685(zLjjq9vrdx1P3my%N zw`k0jqcK%*zyKy1jKBdYfkVC{IXT&Z$-4t1cr-?O?nyx4hz6gC!oVH{DL{?-`dZfm z$s|g_2(Ln3Qxc#9+1kI1bA-31F(;kQxOPes&=+Rt hEzRQ*`!d`h@c$~iaCZnE2u^TH~s7pY9HbQ*62AjyLDFOiAbO1nLC;;&IW(xcV0Jw1g0EdPE0DlGmK;-zXT~+X{ zBGgP%&RkIu!1Si001)AD0SIpz+<#u+NCE$`{pU{}j_m*HYH$qyi-89KBCG(w|HWv( z$^VM%+xcIc|05Cd;r>6yeE9zt4F||a_`mvpXh3K4? z*tD!ZX}W4Ee&jcCuwyeabucz#^R#pPuN6ShlmAV%GjlZpd)nFByYPDoLH`HA|EB+E zW`~0R2jXfY1l3ej0ZTYIn}K=QIM_I#!f0SHSkT$joL@~+`hT0hT?s)gU0ogd+1Wij zJlH(A*c_ZK*x&K-@v(DovU75>z9Cp$yzE_#JX!5ssQ(Yi|H~t3=3?S(<>+eVU=RL} z*T~qx%~c2r{m;?=E&r#Vu2$y%pC@~l{~gxb0NMYmVSmTQ!Tx`_-X)pruGFf|T&_@fm!hsU2{lVlL3nS?|N{k$hcnne-!S z2EJ@FpEDJC`XZ@%Y(L*_$s{|b)-qpEgwkJ>;;t)s0t3hcVs9DG)OBZwZe;ZBpAQ~! z?e_!N-vhT|+NLJQMc9J?vQWv`GqDji$!}XDv$Eo3{v`gGFsLt?KVLVJLAdfZdokV& z_J-7ZtPPKiyUjbA1%ZPxt1b1_rE3rQpyxraFwvi0RYC?2>fpqFg0TCoNOe%|(@in@ zFZO|w-I)X=C+ z27hYU@O{-i#q}38$$47fPb0CdS$Tma_=gd`Fi~>y{l*zzGj&KJxC^N*2p~RFxt%+3 z>vm6eQPbN(o4dhynhDa)WS@JA4HcV=y^saZAt`cA>|iCelD$$tW1p`CMMO%@!zJJo zRWOU_jfn3)OR>!b@&yQG6mW}B%%oI%-6K8!I2ZREu=vG?Ef`qQrosd|0JDi7vV?&p+5m8rAnMi>-2D z^3OKsA2w;X_W2<`t~k^CTOHG`^tgyOAE2JcPdrfUjh>($BI79%2T5ZNz2NA(tIeyB zUR`q2No-v9eEg8v{eiZSlt!isUv8M2C!|~QGaHOJI;%64>$C{af+$m;{u9w z2hgdKZB>Z;i4P?^+wI>+3KE3#v_Bu+GY6r$lQu2|Wq{zLZhHa)SYaP!sm7cH&c2I@ z0>$(l(-KaJlN{pX;$D21(%R9DHwL&Mz|oXEsHCjWFo!ZAm%0~sfZZ4*KYJ4YKI+>m{>pR>O>-;x302x-Y6l1_MEX-g_$nD6>OB~D~*fEAZR~j@;0t#T%3dp>^;}{{N9W1;RhQem& z(v^j=L6M=NCcKB}#k|i@7+xp!;8m!os3+1_dcbTTLhw`I=;l3V#|r>PbWvaaHD*;9 zt1~g{)vpc=LUq#Bn2Y|ozA2I^f#S;kqt>sElz%oin;!6sOb#USV|80Q@>Q%;@@0l5 z8%djOST6bMCq_`f4gDr0$5eaCmop{a)kq=NIhc z08E3}ud_m!-vm2>ahYe|nK36NQR>fp_dNEWn;iAAEkPnSH-30BV86=W@GlNP-(BOH8ixD#b@*JQJSY%vD~5R|%_n$h)#VMH<9g8o z0h0asvs(A=uHAo+a-0mlcg(GL&nyA228lc%@D;ODClLpY&}#r0<*HZl%bvCNIel!L z{m@WnGSVI*+(^msfLT3rbq^ECKT-_u1FsLSU~m*WDgH0}jRi2g0THqDaBTH{MfNN( z@N34{jgD7TKvaOsCFjj$*u4uWlAOWS&shn>$Ht8-(-%N!e#`~een}9Yz`YA2uM^3| zGh#Q1h~6_bdS$kiSY2>^Tun^*X!9|V>l%fHuw8|vVIqji2~u>5?uaa7jEC2 z(&_MnGXB_W-~sf5mnVJBn_jY`0w{ZksoG$br&KQ^9hq=Jt7*Xq?+r&Z@zf_KL3{-}X9Z5a+{G%$Z{nj{fuk7T3ZWzT($Rdu7NiJXaitQiT6?R#bq z)4OR;{6NtB1B>|q z-=RBjX;4EvKvEQMehRy4wi~zRE7X|d=usm3%KlbNR2@F*MJl%62MlQ0c-mV0rnr{* zSv?TNu&)X5fYX_1V5~*?04M%ej{_xgTK1R<;lcsx>+0!wpUi;jC}gu*xtRg(s_DVi zM{spRs}%NQ-O1xp;Jl_iGp7P>5!;p?Bm*g9P26}~&4v^JfCeypDz?Nkx#$a=aKdwg zk?VK@kMwT7QVa}Ya?J{YTSBw+=GZ1Vj->;j0?gLF!quL!F)=+diL(8)naJCJ20+ft zfx!2K+;p?C(*Z`S-3lh@M}3(}Kywy2SpYIQx~9{wXQsfHkCzpQi&`DW$=497-$E#s zAFXXi{nFn({S8Ht4bG`c?v14Zp!Tj-Q;GUVmJqVu{A%0dmb~imLix>$5{c5P3NpEM zAnDMC&fUbO0nN$HMmL{1Ywtn5Po9@q6p30EPTg7D ztym|nXuyu6KclKEUC-_Lm>C=?+yC(X_h^nk(!q0Cp@EHe&_ohnKSb>(1q>xz_#))N z!S}J^z?tx$6MaN>9Zkdw3!N5{m`3-o8G759(pF#fWS`1}8Kg(+^Cs@(rAG9=y>ZD2 z54Fl~nl=#l5Hz-E1E=yl;gfDX0R-=^B)*Xbin@QKM(re&+gNcr&I@VJ^B`bnf{O$Y zlaRDQbCg~a_5WSzKDfd5U-+*OEqH-ji>G816kP?at)3UEE+Lh@>xiK0 z?@mtYgPF^j%3~6SY+~T}n>g1)@1a-GfhhE~U+C4q;vy)&J%-q`0q)Mik~Nn&qjQ0Q zD9q~$7oPNp^yy z$Lp4b>v0SenM_aZbMoK4t;czKq-`n`6C(83K_o~)kq99#FE0xk8XES|tdvrR)2YU8L-x5^QFlV@mm|X)k%y7 z;1;eFN4@8Z)A6rmdZ`RCr<|R3y;=~+_8v%1zsP${`+c~F*lExA!&av{34ftiPvWZ| z>SfIGE;nrdX?*V}&kh7qG7Y8Ph{nR3uITj|PPt-&n}W-`<7#OutgJj1=Km~Bzx~ak zxhvn-=L*ET4oVbPp+~_C;rjCV^Jlv#Ue|6)-@gnPn8@qsoF40b9%wtSuEEb+Fn;d0 zN&OD!*|IdhKhzMVjAw-Lv5o7+dvyH43j#0;R6rdSJt6f)bncj=?SX3`3tQdI|8D@+rcc2SQYvg_4V+Dq#M!Kk-!|IIvwBMBnRc&bCOilxG-Q)9 z@YVU)_b%6PJ($1sl7*=pGhu|2zqpJ;md+iiZL;rZ(uBX_I4dnD)$D|ciH=ZqSu?S) zaNq>j)x}=e+Zh^;ghxo*dYXnFy_=DtsOwj!zy71a%p|YnZAXuM0D zIe%h+?Y#m%)G2Bc{b;a~C1)_LprGIjRBRp3=}`A>@0&85CBs=2*yZ)*?(0SJwo$Iv z^s8=9+m$ZWDzYinf)x*}_~%cEfM5IA@`}L8TshX!=|K}@Mp{~W&0<6V>A4ugvRx zs1s8j{F1sAikRH8yn=jHVdrma>x#LF{JA612gt4z#eRiRJLZIUvQVDBD25&wY< z3JZC8d0|vGJxmNFyj6Lyk3GO?f;LdLd;=7KbT=6T+usw?o6?4E#jKz&-JOY;`rJ{} znhYyxI~deBIit&xBzAz<^fdv=rD_w?1XK|KAdNY`1t)|J{^t~CWmPY#1l)iau%Nwt z^bm|RK91RJDAw?2VS!iGFy=nhe^NqxW7eF-LIjJ&pLuH@Kfkj##zh`rjIgvGpjhA2 zlW`m70fQ&YV)utZK#A^sQht!9mhLORj;GwG<9`=;8fv=0dcvoLFI?NkN;pwCS7JL` zuAs9Y%s))0#bL(uXiz#R{IsGdIU0HlJe=XRlwV<_qN>qoDGDYgW^--Rk~UGZrh-C> z0(zFTWRnD(q_h&yD87T`^!oPpuZo_YpTj_%%bznBBr(#VCr3py2>Xlw)?>JV{*Ya);Rt>sN3h|sUz*+4HZ1abU zWDR9wW^UdalC~-P(ZDbHJd>OZMs!r41kst0?4hu91%tFl$h#tAF4NLexunYKcE`Rh z*PF#akmBBUgPQ{q8<7tL6Gr>IK*3WBem9{PnykSlqSX@@BtFtz?SR%-hu)Xh==9wt z82kN=?jo9Jgm8q+j;r|8%8G@K*kc5x_Z*M?swFZOWn&P`U*g@ayeJNO)RVZmlba&K zj1}X9yw(_#b0HY0Khq8{Ryi6KQ5quh-yXR5MZFVIpbUXm`qV1JR-%xksj6y)o=I7$ z-_*C9&Th1X;D~Sk8wy7i3|xxxvL0!(U-%WPn@Af6(^=g>=}v3(KsZ6& zfWk`YyT0Yx!zB?Ge08sc>6ccIb^oV*cE6?W`1c1S zuB@pMkzI8<4RgQvh6~^w-uKk%5ih!2eGTi*Br5Qw0c;&7h;;v=^tyfr^7-A~-d=^b zzP{j)vnDjZGV35Di|prz07CcVE3$OOPz&TW2(J#DrBorj)%5t%0U^}Z^NS%!`wYRs z7XxNhmb5L=B0+qz4v-j*fW4)NsH&hXnQ8rKDL$OwKIjP6BnvBRQ7)lQk9}2@{+c;v zT$2)@4}%&MqzRJ(>^^uFZ{wfsQ6)D1MTFy}Z-!&f01Sj`$UWQ0oW`dP(_Cmgp7fT> zrhAVl3J-F|#vU6%4z;K<$O@1{^48b9qNf6yIG+T-cLa(Z@va$_D&^L*D%;lS2{f-< z;8DzHGd9i&t!ey@aALB~A_gPQFKe2_f#CKUs|7$aNEaevr@#kpio{tVxFl10G_5WP zZQRh}FsLgK{h0QPzV#8C{)s{ilvIfq40IXbv%jD`6+`nhV}l8;za0fzlSOdV_a?QS zX+#gSxcjV^=-5FK{>c(pf`j2)c=t|Zh@3)2c=KF5_Ae+d62%GN(fGP&sZ?jg&@5Gv zKS{JxF{M5_b)Y*vngDBp$>ctllxAjp98kSYm%+RrniT%0wgDd;1bTd3=p$hi?36aZgAG zO(8F$3cYVuBAADWjjvemq0FqWmb}gSk9@~*z1#Oc2wIfV(0oTM-UZ}*2Oso(Tt3OGlt*O9j|J=MR8w}fQ23$(%Cdp zk-R6qmvS@-DelwDpKmX}8tl%9mU*bvBq9W9kw`7Ukh6L09_cs^l^x%C{hF*2uppJQ z_>6$TP<_F9vrLFwKt(ZexWUy;o09vunq}T?uQzQOr;? zPt~=u1*|?s1OX`P-Kv#2ZRnt)k*@c+oS(nC$i*M}gINcQs~kpL93Gr~1V~^*$iHu^ zq~eJI;_fhU&k})miISr2cp+faGFzI+WOL~YQv7YOmv`-O7SFm}xt>V#PgKUMj3?z- zZAHZIKhypw0i$CSSWftZ^06J^HzdKLsMl_W40q#*`J)tLj>60v* z>c%gfTh{bg+TUZ{ynik|^~coWw`UkgUBa>>Vt zFA~(MxRGC4F_=s3o~Nhy)NEFMY^yGjuXcr*!^N_4l&OUXW|smfw51sHnmXjY5Rptq!rAA(JTkRpL9Ly;)n5tDWy*h9u=}ygS8<`J z)5(jbvM?0nN$g7>VHs~oH%hRD{NeCF3tJR9fZ4_uTw!w~$Ct(~poZEzFF-~v7}bc41yK_Of%9~}GmNo;_r(T3clM2sc~u~O~01)1va z2&WOnkYtIVgd_G}Dt>_g^4EXESx40!rxdQ64(GYIx*b>FPyv9wHpEOJpWC@}=-+HX z4v%Z01)ks0&!n2#P&_IsDPZ^2V%bZL-?qC*p+9r617;%r71dnp9c7pSoOB`c*aGYV zK~KS7!n0Y`5iw{vpMpo!y+E5mh~irTTTjk7Ud^XN+pA$;z8lo1KgOT8R}GA|v{vp~ zivvBetFz;VeZgt!vBg+e4bGDIkaGf%9I_yN+=$4KtD*11?!50-tpYwG%QhyKC{ww3 z^ssAI)u72o#6)6K<6~SvL834VfjB-G_|ubt1(Q(T0({E;EAV>^Aya~`l~vu#KbgA* z@hRgkdTvo^Uy+3Zi&1cbwT?S4*gv6pP5=Rcd?i}-roUDI8%)*vf_ENCd1B*J4On|= zdFuk!RKmPQagNV1>WK4W8>a-gmiM$K^0GBuwxr3_G*pf>P_cN*s6i;fi5{!_SHC**j-ZEB$nj88=VZ~LT3P%8Ubn*xzq1J+FkP5C ztt0?3t7ZQnDv%~r*K>S?mwikb+gnVn*M$zS1ryA;OUWWyT~EsUS+ZLb68W6>m&-c9 z{kN@9;t@g&|4($(6AV5o+T=zB+T{>WpU`V(m0*K1)_P{9n97pMsZj;A%K8k@uL58t zd)mI6yi;}ijCYg8HXW4@PupY$a;mH8#jYTShHP1DB1g!KazQ$L6Y9vU>-Z*B`@TY$ zqn!a=C}6tAJ6}at;dpmT-ni5vNo>(aa@7%`fZTLMJ`qFL zPe4&040woaN;-~M;(IV-AP3@R2B1#Luu&Y0!c@&DXAqEwX*8KQ5`5{D{UcGnI>j=IxxZwm8=r%55ljsl;?H}Zv==~LC zqB&YCO&NiadKY)3r_^Eqb~o|vNn9pKFV$FxYIV=ua48z$mzpo?MGkJx=H*$n@)EO- zT62MLoTofxKKJh~Y6KD+s;pZ3)uj)Kp?-+=(h@RDA2GOEVS5TDA9E0mi8 zdO%VWKlt=)tEc!aZX*SfM0wVBDn_sqBP3dw%Lj==g26ffoapu}QhG`~O~%oAal(je z{6WJMJ^!T=_uVuyUylL}jL?5j!Tv=?3@ogtO`4`-JpczR-hvn6h)RCc>tRT79~N0; zArP3G0tA4sYsDoS3=}EB8543uNqIQ7!;dn@DIH?4TX-Gxf%ZQ~i&r$2)K(pIcdhH% zpKKj8HEd%x@9B|-PU`TAZnxj=oHur~1SlZcIZ+EG!>w?*J>KYchy*%HeTT7Yl74Wr zOL)=hf3Ad)FN_B9H5ANkMM)O#dU0aNEFE+$xd1DFiB$fMm}@YglAL&`?&TGUN^J8( z!KPBu7<+_|hjV1ROh*lVrT*iazXpP-bpLOTOl$Lq>$uX!L?Exo(D`^%NH{t%w$4;S^Tny)85 zf5l+_zl~n)@5=lxB@3#=`q?L_atgEd8`j60xu#zq+M!QH3S(6Tg;V|*Gp{cbkSATD z5IuRokP==Y3~k6$)G>^gH~oD4=fSoDv~oQoS&=cg6{%o(pZ6rnNX7aPrxX-lV+zWZ zZ(EGNYbi;*{4K1zud=mE@?1P-DmEV#^_Vw`R+Z~ZFsGgfZl!@#*^ExCH^IPJk&+o# zF`B?%q6M*`bexWQ;-+4%sGoSGSKRa%tRhOd}4T zib5Ora|LNZ@0o$^c^afZaY@Lrl4)GPC+`?1G7`$hZvA)`6I#)+=&Zi?+#i;<24m_3 zE9_-Xe%dGna9GHh~UKlnph~)Pz#eQgnpF zi&coM9cR517$)xO8#K>X zjCO+@p7@-_hVgmsopVZxe`@%beoN?k>I`ayVj}pbM$u&WQ1Q{OcMEv3Vv(N$t3`1` zE^q1?%Zs*C9SoBf4YV~5Lj&8GeMrNrz7ryv8ZEm4K7Zy;O=FXg$b?Y}?+%CprOpEG zPS=`!7T%(hgewX)-K#wL0#g-z7_Qz|febfeq3c8Fi59yP(SY+{Eq7Mpvx9>+6ww~K z@+Ge&Eg>^Pvl+wmFayZdA6AN@TLok~ThtI_ABC@>Veq7-;{L@x0*LtC{&H=4OUccX z{TBh-a-NJRp6^H+X&8#nrtgzyZB!Ab5473j@Q6H!t_D@2227@V4>nileh^%X)%H;4 z^xH6_R|V6C;&-FgY<0c8^NOe23BR6Mv|3X2mDz7hsnlKu8YlDncI9-^f?{{CH`P+V zir?Piq$8ThzLmLt?kI%X2bTwJNr5QW^8ouEj1aMBv5IjHw|_?cs{04->%BC61wz2L z_^d3jUzp(EKS8@cACZ^St3;m-enU!2eJ5)ArICIue3&{i8&c^5>cQI$pR7Fui>W)Yb&5%?@llR!o%BLRG+L660nOm~kFFMl1`3?#0)Cu(`L6D`1 z@|V13yOrj9w&BZ5c^f;sn=ACWX2)y30gMCX$uC0Ick)WmiXSPuwEF;z>CB5CNDs(T zi{R^+fdHZajW}P8w{)G}hu}J7D&Jbt-fq5wGp*0LJ2~7zJ+>fO(qm+?y&lQ!o-8L8 zQ}qaLP)2uFXs^V*gRYu+mE#(=19`1OQ^JyWVzES~;Ol$PAeys8y}4en>qXar8g|+z z@Tx|g1h~O{x+}G0fEMgWF~aUau3C(4>Pws?AzSk&5)Gsz9mUjZ^y&=S6rVfh#`2uYeq#8^cbNl8s*(QI7qPv%nvL}{var`+oAtf9pj%#zhTtg{#1Qh=pV>rNeGe( zHr(0c4)hW@e!U_awPVFQ!WKfhQ2LLo8~@55=krB|u3 zMGi(+X89g_J7Ggq0EVS-gY^iIxO8)k886;NPC!6c_#-rhbCQ%f8AVSp;tKUOl0yPE z#1Bm(!ZX`d#6!)hlz&LeKcbd(P-@C5-=pXT0F7sX(^`@E^@W0FUq28o65v^_AP=_w zKpvz38bYF*p^36+(r1~58yrZPKWE56?wgFMX}Y~b4e5I^X!IM z{`mFj-AI7-Z#MX+_7QqZ`pl@Zd~BbD@as?%noRL7CUKUaiYYug=BOnsvsCsH0Ctq-D7&GzjkN^!)E-gqCc?YvYpId5W1e#5o5+wK`h}bCq8awQp2bmHL3sd1 zsr)(L&72v6-WH)b>+pIMZtS8R&q9|~LicRFXuj>Nc0}Qk8 z`#qGSg%myj?$}MeKleQV@Y0$z0Q8f!{_KeBDCFM1(|j17WWQo>wSuVFDG=h0j!v4h z+NFJNe(0Mhd~H?@2uF}p()oZZCubJ*8Gm*^Sza3xawZ%+#}RBgb#&8^6{h7FMj_-r z(4nXIIS#+KT;WGK8kc%SZdK_>dV`?2py>~{R5$erG} zSr=Wi>JQ@e2`n~LX?8yy1wBdnS50p{n{0tC zBo`TLVc0IF1IjKrer9`ucE@~j#5*dq`Jr~}A2|=35bvlmiA;+^{h`>908b$%M)!L< z^G1h20C9L~sB~jg+z=;F^>vQefLu)%O)v}!FN=V?ZpO7XyJlrK_GLx6XU}3|Lg5?7 zzkl_k(Kt2${qijw<{%J$@A$A+QW5BD;f3%5!M{f8E{7aL*XKpCR{u=A6!~V_FXAW_ zKWxBQuEDH>Za3)n(qcjjjq~fJJq&PGbo|4L#evz_6#R{(t7~Z+j>NncmKR*OfJ+~T z2epHv^2#imxF!o`m+;}=$247wwdpx^MV75S&dZf>D$!3@^AC)*XyCdORajdSEkpEg zd!vR|HBIi=1g~;`XfkNHJoQ_&G8W08Xx|RqJ6K6{BzPmO%-u1+d%hoFWh6(+< z_7C~v28W}aM($)-hRU^Woy$l`45JmpRp!LOy`#Ny`iqPMcNf(~JRI)slysEDkM;!^CHve!j2xZ)Q1 z+Hz*}N*U7m?FQsz6H%KeiW8v;NT{X=a6P!Ab6_G&qUx*@rd!yWYcUk=Ox!0oi+^=X zG^oY|rjIJjeL;KIBr_Wt=($;-&!tL_1d~AG4!;$^2`up_Vpqxj1YIbns58rAE2CI0 zXRs3D#qCm|;V7=KhF_ogwiA7#CHa6K-6^xtdq+jlk|*x%FK1HM1ceh6&kKLw6Y=Ri zhU>kIg!G@hfm{RRSj(#Q1XQwcm0AH6^Pf^uvS>w&0@H5`5W7{w!rG;DEa?niXEl~)qs<8 z%V9=kXt=Z~5eLFQQGKb8vMj^ySIP2A{!?`IZ>Q<+DLmS|7>jgjf(;I3*4BVD-yhgN zK_z1v;)}n$k`ajfHqy~5%M=W<=}@|^Mmn<(EvbupDI_R%9Zj*h&8}7@CBqRTRTHBX zpd;Zi^>x$R2Dh-= zG(5+EM;3u7nP?_kw--)B)MBsUVXv71!xl`}yyApKAC(&XIPX_AQTYpx<3%H%6&+YZ zljDe`f&#Y{i^YucyJ)RI_(X%h>S8|?l)k;Cd~JS@9J}b+4OdnGe2U;KMD!y_vwSg` zh<;ULu{w7vSX&p$*N=E;s+F5c-P2j5G09uAd{z#6AgY_E8#ExlW}+>voZN9WFxwe? zz=r#iUGa{~ygMM#J0K9gKG-MbX9N&A?-7G3Nj3NQAD3}Q)NJS4y09Gm!Aw4>67d?d zmY62OO(MVOWc&=O>Ld~+Z{Ip|?APbXo-ZRV>8f=op%wV5iL-WEi)Ll&l5$FJzff;N zW>n;R;mLYG-r3O0oP^h-b`*CnR$#kn@A9q_FwAUH@e7CjLO2t%{@6k$8XRfd(m+Al z;r4`giznh0!_BU1oj_^ba&}c64tmlle`T-}j*mBWqLm=^i&|!sE2k_u)&H1`UZG>h zI2NQPS>HZJxZ}@UZQFREy4*V_KDut~iYN{nWA7Pd>%QlVXRE0@WXkLUBSvRh zuL|lP@%6G3k-c@7yh5}+eZZaf7e~vZ8t$eKG5AVKjZ^o`vyeQ}pw${L>m8~37&FfJ z!)zje-5q($6gTfiS4d=`T=3T^zOj!<214u2UqGt(%;>u$OCgM7{mIRcS2MXNy+4sJ zf)DW+@hb?RuYRCR+}s~+9lYAEu?}R?XpClEXD3kE#SbHPW+$)fSP9EroIamkQp@QZ zY%v?-+Cp(c>qSaKn9_Lp3q__GY`?4MXRRej{lNtV_zmk%z*jb&!o=1aYSKqyYJXj- zL+g2f@dts%c1tLv{;KPv-o%jAu(qNLFIseWEy- zrK!mB=s-p-DyaUGrOJRsghEHlGq-X;kNZo*(AN|oWq|s9Am?^8`!%JBO?#kjmp~T0 zZ1k^6MZrAg>TAS%>eUyKd#fU=dNK^~Ngk#m)%Hqm!&(o$dOR z3O$+4gkYSh(O+8dSH5~+FCn)SeJbiql)z4AWDifcg_&7BZ48z)2dcZY|NGJU__$~6 zvoB?Kdm=%7i`hvNAIBi+4i>gKXQ4~jNDY+Z<`={_Hxg$7kz=YZMnI z=ND${kaM=qEhPT7euD;63s#*#p(5h*x{T~P+*??QDiD97lRB&;|MbKW;KEoO>rrpf zI;Af*ng02^9hVQWr0CX+8RNHCQKRy%%DSa=<1s!JorJBL=|?l$X=+Bx6spX9~lrG}gGQ4zs`=wseUd=>aG7;vMi zt0J&6q^Wa?PbMXt{?I;@7q}4!*6m-u^-r`S)AdHYGh4-#<|kQ`O4D~ffa}*kCNDL3 zOR6@_|7f~&ObD_eo_I+ZmiDc#r0`zm**-QvG;Wex%21K@6Hikj9m!~30MEYy2}Pr+ zhD7(#sso(m>el=W7wv_3jn^d(+;L`O#ws?Bs|IiFZ&}L@u}_G%bP-TUF4mqq(*_^0 zP39|UZzpT>HW{Ew$daNzs9wvt?P??+${R3*`)BqQWmy-lp0Ny_=z&heA1e{yq*%5; z_4=@YFWKQC^h*2#&VL{A1gZ+iV+76U5@64B5b>X=zi*tgo??hyJ>2RdUP;GN7gkPe z{mW)%av!mslYb__&sGl>f#&VMla5(u*5yi1%LrXmr6#^IoH$H>4gV2+BI}cf`6W$D zM6#@==4be$&&fsC)A3r*CD-B;yW45azOs@;rL;|;!Xb^sRtLoZ}DYO;94(t^GwwEG&?JV9rDrZ96s4a z!v2uGn3-?@1}EtdRkFZCphFLR=&3c+loqT|zOrPc4>#ja>s1t{(doG*{v$cMUv&_S$l zNz9-a(L(RHaBcVRyAQtRXSEdKzUhp0?mJN&FE=opCpLHN58}XzvMUD&i(YRFTK)C>l_^sngj95!l zPix6y(cI1fZCalRjSMwzR{t_%k0C$y@6Z^G*A1WlWHgH+Mx zvQv-*l$0Hw)oB3yXqyZfp4ZbdL~8es#eqGu2VwhtZi#?vBh=JDwtx_P)P;0hxiQ}# z8Ma5AZPd%s!-;0(eBw%HJ%`Tm>{HCjTklK5v>u1DY_iqtJ6`p8_i+JM*mMiQGt1yTRq#qsCocYAw3dS`I{PQ7ZTHp}mw8^9Z}2W^`qq1W|B zmQlHECcV>9(=rUGcUcsUd4HuJ*?WSGd2ii6yij7t7%s3b5KBO*TOag@HNC(IQkkqS z#q`K;>v6)FO)s%}qMMIg@w(MO8Ts7%J?^%Xyd*HyF`>u=K&x26g`*}zE{+3W)H%Yo zGtpA23QjL{BZ6}#!>Fd-igD?1#<42s_%T~?M6?VSkF&0!Y3>H*B4uk8mX^()sr%_+J-kJUYJLa<`|?6$iAI2WK|fEa)p2 z@Nap45oSZ(|85d!T^pU^?eH+2K>%*V4?sZUUgJlBqT<$9-C@Yx0?32p*itbs&Y6RM z^41?^%`ToNtlWwDGd}e;o%8xjP(XUN=C-UjLHuHfc8)7Ik(VVSOHX3mir{R|Tznfm z$HT7L4I4iH%EZnVw}h3k*0z+cUc1H@PL|8=0Mg+8RTz!&%NGyq6@jIZ>u$vUTPtDH z%c0LDzJn;m=Kg9?p-{P!1T6NT#m4@Fu<9;ds)BAh9I8V`IzPzdx}reyROt-^=a<=T zb1eSV(F2)|jQB=TQN2$@cgU*4N>oivG9R@5Y>}ea^NO?N(&y(Ao!iRr48n<1<>8H; zD>hwZA%X*F+ljD=hUy$ei^ zky5JyP}?I951E9y{~DJH`0#O^14&=`F=7rmaAzLiS)`(;${-C3QP~Ss20bv+_H*ve z@Wxin`J5=gy&}W#Sc)#wdE-Mp_jsS|4h(HDr&h-)7XOlK4?!&$gBAQ0?4gT3R{V$$ ziRq--{6w?xP`fE3aEYaU%o=&*m)e6MId>{pk)tNP`u83>h7P7`bG2DldwMeK5h9QN?tq`>S#B)`{b(TjWtsjK(WBxz;Tk zzW*04yE19(dnEOce#bL!l<{qH^ZIm)VD5Qjr}BJ#)&{GI>T#j^=)+R%;3!w1cC#-o zG~Yr`@r8Xb*9ZqF6F(;1g^WJWe$RlT^a1tnnlOT9H1SJeffUE@alyWX77MxY^TSDC4c^O<&_b<*o zKvs~ZqdR3pqihtf7iK|61m_t&EAYEr zQW8X(I`d%T7ShP*RiC*pDjCUMY5-9M1Hd>=8_hEz0l$kbok!Ux zdm^Iqj~e<7AKBj%@U_7BjjvsI7IdN~vL#4_5a>>`9$T!iu+xP`IX7D%l;1{AhNFIT zsV#byp@Ha61)vh?@IG7}={!FR#(L4^P=~?f%fhQlloW9f+J{f0`l*5B8jt8UW5>c6 z38xlu`ppl+V!Gzo`tH;N(l6;yObI<5jJvbB_mS--=Xf|psDF|ErO4@2mXC-0<2eM= zIGFq}BoMW-urLg7d!0eRc7DGgPV`{rOTFR`DL7}ouf3*+PN80wK15GBevYwYudJ0% z)aQ8#UjyKWZV&J&1YQAaX$n&Y2+~uRL@Q!n0K2~NIwT__45Z%0sGpu zK&?%Imx|h#1!q$`yEv*R+O2%$R4WC?Pk@;!tpn)kOoGk&_4f~HV!sztc3Ge+d0f!D zx8QiXD1e87D9m}-vU%fMGzSVdC}IOFZZy;+pfz_O-h7Q4#4if25w|Qg5<753hq}z zTpdB;7Y;H_X+(6BE_KpF^7g^l*-DE#V&?B&d;F41aL-j5AZH&63hNX(4f*4)FLt-7 z-O-Gl5SWq3JoU}b%yok3>SGZ^L!UWEl8DI7;^^&}L)FX1`PYsQnQIJ8pQ5cZ_d>3> z?j8TZW5HnxgBv3QyIH|I>_|(7z001fj}v`k>x`j_+<1YW(cs- z9j6{IaV=;Wt5QAe4_4cf;4}59_-`KH>mn+<8!W{qx$sXse`<(WG#xR+q^54{Z{qjD zOa#3X{9F>S9sOlz^*xh*z8Hqbzqpryq>JNZ$!8HI9b>NU(N?QpDR~QdTM`9uvD3zH zn0_4e$#EQ*IUX^q5ZcS&zao7LphY|)N#G9~$&>58X9*Lgg~+M(S~O!WOO3#KhSWB; z!7as63ZRIvshswh&&~7)=-8-k0Z~jMXao^Ap;i9M)0jcl!6YZ%&13P>oSY-7tEgVW$Qj7GVKoAXRRtwE19T7@fdjK?eN;%I>YOi}z%u|=8k9~7!aX{6Fm_Eya1 z{nM>Nq2d?I{D=E(;|v%jmV&4d(TF``7|&>@i_|-5mF?TVcE>@Yx7e!zxL8Xi3QfwQ z#r{?HveRv3j2l0nPFtGQSWY%zP60hU&m+Hv4Ct@FLjW^y*9~|z2}NDHOh~);%QNuC(_6%~Hwgm%pp8s4uZVQR2h0Uz&u;zlaC*a2XUO z0Z4lxLb@rvO~n!VOxnZ6tyHR>)LAZetnNEs{L|FUvZ5J-7dVYRe0#;^eTD9kDRbQU z!|yytg+n`t=hxBqs5Y0e*D=BnaMXlOEm_@SL`VF*S3u!BQnyYZ4{yJ|`w$?w3|z)Yh$DKM%lYN>{|@ z`?tpRr@m`OTy6()j>JHNMW=!Eldc7ALe~9X47hH~*!ouiaqKdp13nbe6}!C?vlPBe z6^~)SHMaPRf)GZPN{`5= zN&L$OkFd5|TJW)2s;v&rQ%jLz0CzaQ_>kY?*(-6K-Yv{pS(KA0tq6X!|xmG z)|Un4*tS+!MKi9!qrm8=e58X7fSaYs#L<`Z#eUz_YrKqGp2Sy>_DdCrSdRCu2thMC zwH97+V;dA}Fog?I>pLr;*Btr;D$zsrN{ zS>QBYo#-p^-?=}akez)oVz_f)BmwRA(;*$jwXL=(Th7Tm3$W847Lvp1 z#qA3<4M==J5or(vY4J}(C`#e}r6K^_SH4Ivq!SqDel83n!smub59dnYI1Em&-n@Bp z^Yl*TBDjV)M<3O%fLgGz(owvKClW!81b)w{1*{c z!}Wj2^x%4)Cn@D&p2wj`Ugjh04OmS2ty|c3$E06GP{b^@AuGj@q%^_E)K8M=002M$ zNkl8aDVQL<7y7BPk!l8P)!Xq_b)B0vhK1b zJ6>FY?u9zw*zF@lwy>tuKO!kRr{$Fw7@-b|Wopg}v${9xJL-_7Ge9 zHX)u1nWg0OdQ_M;iQ5YkBT>@5fPA43m0)TIQ;)A>?|%bQ!26e^nd^_+f5lSpGPL=( zaiGa&u4Uf5m$Um?;p~lY{oSN#8iGKAsju0)`O4A55Q=}qZeT6cM5_&Yb{5gSQQkG$ zqyDLVB9A!E*e}`m9b4Ogbz*fbh|kepY`YzEr*lx)fw=x1wg)k51- z(r8uO8)xaS3q=taaY)D!?|z&%J#LUK*WwJi8V7@PnojCmz7C_ew3 z-i%f|UNXJwPayzkLt`c{G`+ywybc60ayLgP4R%4m2Yo^?iR;?2n0v|>fuwnHE6Cb_ zB5em;w2m99&-27G6!jGbh1`=k{SxN+r#MSbCbU;G1<UAO_iI zQ;)Zk(C<@cKM&R^#lOdr-5#bC@7aJBocnLTsDuqq6SjqCT?V4N$PdzQKqW z!@^0wLHu{kKiofv{}4>1g7$W}KVJ&!C~L8HlzBQ)NM8+-uLj}w4W`iSmspFA^_I>6 zBzGeq?iYvvkl!r=A;tc&P-*bpiztv+ghJ8)aly_zLoiRAdd%ub`Q=G}vv?mP8sQ@R z?3pNBn`D|-fd+*uw-U?>gT&z$28=_4Yb7OtBQt|P&f{03z|*?=0gwzv9+ZShegRnd zb*b-WbTd7;lBt5W?B0#(?8OicapWPy^<5ySPVn)jICA;JLt#Z#iCl6oX|gB9GU)zX z9Qd2Z2doaH{@P6yi1R7t{v+1UR@r9K(lq>)5FptIJOa_WisyHsC%B1rUAL^n?$|Zt z^Z$ApuW3VkZXh^nAphSm7t^>L5=S|Ka|UzBT8M-}6&5dpO2> zl)Va>$`(6PT#Ma>OnxJR>*JrreBUs|DQqcLNJ?#h#Z4Feh4?~pA-_+ysGPW_7k;RS zr$LpOO1Pz<6BNqCj_Bd@$T9UKVTg6_>mF&+0~`?7{*9{w{OHc zxw#X4gUpIov&x{4eQ4@Yi=yxWh|hm#pFj^1!MisN+Dg(8P^ex%YQNecmkbY23-^2+ ziTfYjX)DH#^2MDc4YzI4YZOa_+|0AS%6R;*ajOs2&NY&>o5!)dacaqoUWGSW5JLB`2JuWR8!f&~P+ z*9!$$21o5jY(EMI)k2fwu<|LZbI%Z0k_PBfmf5u4u5^BFGiy%z6561?d;k4;x|y`it*Fo+aIi-G&L7&ch0PK<-Re)4efkKe z`t8Oyi1C{Hs~C$7(Wb%6B!9M`^x&yx*;$olr5 zc)ugJ;3B7X@tj0W%C!(bkq8LA?l9av`#kw^;II;~5QCtWq|crf34o^|nziwgH2$(8 z!rTXtMoe(d<&ptCWsqkx#6iaJas<%FF7*98KCB6+JPfOJ^T~)DNggjwTxIly-Q{ed z6%OygNM;4dsFxsO(9Rs(Ux>4O+3xRQBhNLQ1oX1D zQoD_H{71Dphv#Wi(QydF3g-U%(E;fDem!`dhx$SE1qabVEJT_4QFI1607XVYdS>Wz zeEwv+{4BqOP>%0=+*S_n!{)yQyc72y({kH-B-N~ z?JzZ`10JY`*N2R2f6n-J3c~0_XE;}YXOVl??7X^ zZ!K_daqc5X08Hh<$s`B&6boLv2w8T+ke~`AJOsOi@!DmaHK=2@9^+c824bY)DJmBU zjp|g(_)+Ly2&jj}Yvos~l)(N4f?<&Sf4!v4?Hm3Bj9*T6DgGWu(zuFwelLyRiq7H^ zmLR`_4&WVF3$-DQy#EJ%_813%yqVL3)FEvT7FUqdGu0nGM#e`@D7Eena*g$!wwCSR zw-s$|Zdx1W{=>e+r!xMzEf816KPs<}d3t{<*&tNcU{x#$j!R6R!u^o~bd6_+8s{D| zZD4az6Y~~*=RgSVgvndwEmP~feutp9SLumYnR)CmdtRN}{YU^j4GXF%H*+)2-FVJ` z5bi`TNkD^!>uipA&qIFrmqtb0znxQbwEHh0YN*Eviz5kjaKW_Nwd_NP)=$D&Uk;ar zN&B9A84Tr?)rBKhZo0Qg4-d{ImUuzv&*L^|Yda9(Kd`dcF6R`Vud*7zu2;JVF&}i| zR3eBy`T?z0Ncq^uy8k8UB;L5L-0s;kVs{-GvyVM7zB1{s59=ue zKvRHu1&uRxR)YpF=(t@w@i>k=A|zzMi|e4&cJW`;binIrp)^lV$aJ;`&3%TiIh0JVnqCieSp zN745QzGEQ6q*_c@vb{<#mY4p^OU;5&oGKVnf(gkrS%U6I&gWA zR3^XugF}e@jdp~OcjzoX?ZT^(f=^O_=Kl%j_tSrPhD7*cd^ZFOje<3@e4&*aAIWNy zV3CX93H(BH1F=Zt7iFB64jf;abX;HwQ%>gn8Zy;zoJJ)QI!qOxSI$RD=y4q1j%X1G z4l*v1e2hb@1)))LbAnEe)nBY9C%*_lBgi%gXNJkz8boj@`W{dA3OJ(Yip4_$ST*tmBz=aQZE*FdRn=(Rqa0BymB_7ekLH7rAMkY5x7>;Iv*)6*#XER8Sai+4y8mvpjD=P71|3ygp48P!>V}P9;-?G#t8{ zX}}0vR}up6!OQyqj>zq0bJBCK)iya#3!x;ClOX>ZrWQW~0ocN_-#3r|ID^!e^-e%| z7PHpB2PD@PU{)<{3smg=DE>OM{I_%1+K@~(qZeppN>D)G9^!z}YdC21eVhfj7h<43 z>zUqOU;uP%?D!sAdiXwDv0{~P#F1IA2*4Pce`)GP0D|X4A0&p;?DZcUKsQjfz)o?} zZwiDj#CMOeBw4~1T?}?|xxbe0#Qnvu#GAA`vkTajNTMRy7a-Iohnw1jQy?E<8Sf>x zm1RD;9GtGb_;CS9VdCRR(X||b#y$+z_r7;I z0SMWB&?Uq`Sw%dCL2@0;p<}gAkary-b{AUrjcoa?XE28|21C7}Jcamws*mXkV_f;d zbs3?~?)#$+rI^qb*f$Pv2npAvh|1g1_Fu$vM`_C`kY_n_=U(Nj`-fLAr-`_jUH~9)mYpk=lp2JMx^uR!8@byoK)2FbHD7KNP3{;qC z@FfMvyA%N7((z<^2XraGKmb!bx+uu1z0>c-Jo6`XoEDQ`wrp8L(rrOBxZ2v7<1=P3G5qzR*K^pQJ56i$&6P%S-JcPWaWdWHrdF zwSEKxYXVzNuvDodzrl0oj_+cXU=w*iy?eyg(4Qi>YCXi^ZuTPVgg_lbV)@MD7zD8; z_%9#=dyo!v%vWe9rzIcSVyikg*_t&M`5t^({EaXr(4n7&)TL#=c*w>$#6#S_e_+&x zN}BC>83%B(=C3WfZmJ70805QvV;oI||=l*4W{*Kdan zuVTZG4j&DKNZ+2`y2WP3!Ol`WpUqYJ%Foyz;imz3HieEsL^9Q!TB zpU(7qfSr62nHRI-FwFI0^bjy$TZrZ28!s&b0nL_cB27K&hx7>2Q^-tNUC~kCH!yYh z+bu(`&Huz&ODmQv_B{S*6ZXr{N;WESdxR6u@D@6d)=F<|%CG zwy-K**h1?%!nH#nsI56Y)Ml ze%JaV0Z1ws(lO!?lrl7tOq8fxkV<@l*t!zZ3l2rR0KwW}5`Myk5~rnmz5sdh%uffd zb4HUp_E#njs!$!{^EULsqCt~0aAI6QiGzty$`d|XlMK3eQ=x`taQdQ7{F3l-kaQ*U zX;pUwtUoRcp8^t;CGG|STo}NYnjhKfcdTt5m^Ft>gRb{_IoJ@ z5}rhi=c{1st1qwzdG^Pzudw4RrvEqe1QJmm;JB~XuPd|9VxZ8D4xkQ+Q4&aV-K{AA(t%8W`NXIHWnm#|8;Jn08%6=6 z)c{|a5U`Sa4!8Jz1jED!Vy=t%>mUGGTn}%JSAmOEVg5o!qa<=&hFu&q+2JB&TWM4rjF1eREz0Uc25aj;Q$`aQTd=*JSdxjT+?0<|B zP<9Ewv!3I_NJ~*>Da1;!=;QhrMB_fF3F-yA{q7&xj~{%v(VJ9rUL&0Q4b{p6*Uec=;Xx++UNT!0~~C>;UkQ07&aEA~1+n-?t14iRGh~ zUp;Y{kV;frol&bKz*LBr^H6!iWdL@(RGstJ@t!0BIPOORz=u}d20$-vo10~q*AmzCLW4)^%zj$ykFJQ{*<-OfinKt<;8!BlxMTKq@(%<-qt6X@%~A9` zU?f`L_ou<#^DD1h4l(!l<-iTM=F@M)?F82Y0r>KlzbyD6)$(C=MfCFKrAtPOf;eyl zhwQZm-Q=|+u{ie>?j17-pdqgiU-MM|FbMG>IF^uC1J{3I9jZJj!=1^v(xOZ5BkM*>3^Ie0`O}KkLEfa>V(A82zk7@z;-i!bY|LbK1C{4s;#o0^H2^0KU6p&>rI) z@>L)=ihgf`lYB1znd8G&@+q(Xc~PN=MJBkPhpG`Wq6|n4{Oz036SDYM8Wgq`pr16%?ch`&dGuAG zPcbdf^x#dG2eaQ%lzgQqJ4Sj>TNm6vl|gdAC44*}J~TigzXVDr2wDE2kAUzcW2|+w z`Y^(t|4bFf(u3440Wkj$V!y^BP!jTcNJS7938I0(=!w}%b&+))0-))Bp_qRmUkw#lGzHLZ&w1_uMI0y$s;P*W3_|Y9R!Y-cm9r|k%v)-!Ky;JWnx*S>qd^~s!I_cozA0!M?Qua7Ic=ZSuJoWuL0iN`t=lw+T#t=i-!I%Y^?nDgLnTlYS3c5T31iDZqLF+`hm* z_P~JEpgjE4Ri*YMZPosQ@*|I1`tT#*tCs!37k$L288rB)_@e@)5vbw}SSgd>At;`V zdop!PZ6aL`?8qe1Ut+&|5dv}k$o;wRwIq6rTnRvJb{MJA@&XZ44g3^ktePMv_$j}< z9GC9>V*dW*;<{6T1QY_#{B{~_K4<_%GQcL0P-%b%?-Bs{bm`91`NqnAt zmVXljpdG}O5|7Uc+AtP}@4L3bcCa(>BaaT+8g8%{5T5I8B#zT|Qu-2{UrXx{kXM@jF!yImFx-E%w86&e7AHua z!}+xupeaCt{2~snBM<=)IAS~1e{ZWIitB!o#|c0n8G2=&Pk9uNUe^)6Nfk<($4*et zoAfuP&@U93_wJbn2>1LpgHIx=I8PuH@kRo@kjXEU#|I`?t}qL!$>0owI4MP-g462K zO|Jt^tT-I~k8h~7)6CKT0pzcTpd9U)unrLY4QTM;t+tD0zgD>T{SboRxunF_EGV{5 z{IJjKfd);sJNJ1Y7A+l zaa|-G^|?RWfrrp5__U{aE!ux{2jp|bpRE2I`5^#~{FB^25|J<@sZ-ADb)aUS5t^RB ziu<0^v*;)0_0ri(uP13^a%Wx!5NLtRK_-%&cM$>_96o-4O~PR!j(8Thh-~oVcyvWy zE|>E1DogIf$Gp0pBp8$TW4>(ol={d^nvj17Mmz82pw12K&;QEiAv*BE%!;FJN{{1nI1RL06 z_QP+XjjMuFXuiY0BfbzGjvocgLWg8GR|5AQt%A0Jgb}V@qKbT?Nu z3L)?WPxis2+YB~A%7?rU!f<;slkVU&M)3|+rvxE+@;5#(rcf?RF_JpCrC3@B09L;j zaemjyQTr1R`g$~9Lm=61EcITB7Vr>6;0Y`Nug3=90VIOYUR%zoKt=YpA9PuPi~dRd z@v;7hefE9d7zSUGQAY@^a*3Ec5us2Z{g^y&_Yc6i@!a(3qUfOM=JwNs4J;iW^VX zHyNjzY`Vu|Ar)7Ghba6h|0MhHKZ+4gGuwCngKvJXLCL1oGnx4=0lB3FlB7;bb2=p+Emm zIR2#7U#QOK{+Th30^>}842r*WCER}rWrXN>iT*%NV!ulR$=p96K55<_onY}o;q&CmTD#8o-%{L>PZ;?wizUgySh^9pse;RusG`)N#dA4Hu0DkuG1j^b|^ zh2Uc_Q3T3<|1lJR@4>Y1%C-`_lihyC z^Z-?Wi^!q9JXgpPkzVadeE1qs#?ps2TI%?tFzQnJz=j{^_#mS~{sQvHYw7|EHTRd< zuZ{y7W`oi=`%T6hS0Lf*bKG&xA2@$j3J|ez3L+Gir}hMXSQZCUYc($yxg9ooAlYfR z#DA5X0#9AbsbAUmqXJ3`!F>FUxDBpr)pvpeT-^>pun<^K6Z=b@zaUBw!3U0j5nY5x z3>m0WxXH|yAxN%pBg?J4oRFTmDO^ma*7yP!S&8~GVi@w`w;@g61Jtx4_<#=DK8&<) zuU(X~SF!AO7Z!itJdt6J&YAw$6dXkP*UC;n7`&~*+*gR6fwsT@6_vL4#HjuLV=ViT zjzHi@5*FE#w)k^FX71^kg_^6tkyD+At$62uu+6_V;r`;rJOD3)pDg#Md`wsOo%>_! zKZwwfextCz{k*|Pr>a9xz@RW zvhdSc{lV)V<;kOVeDL~8x6}WFjYGDMbWI7ipzssz+0Od@4i5Kh#OC+G-U<8Im8DjL zB=E`mc%77&X1~y%#j}ZrXNR_EMMKwxWRf}U_y`Al?!L!Ty$7HLaAzJa+;^lG4WPe5 z`Z)J@OFcD_Hi-a;`^y@!ti0OZ@X|JGsVcDnhFBUz7qW*x-{+Uafdw#dmMuwqH1-VX_(fi6*a-ExJ9>#fBV)j4}_$B?HKr!GF zKyp1l0}U|1!f(#NVFbl-<%20)qZf1Adu0_B1qUc6ED;$%JSWuo|N2;HwT|Uxp!&(2 zUb#xisX`^lE1u(2DXja~E-ST_Eou8VOn6tZjJLEtZTnI3y$qZER*wJH$3FOW2S;$3 z-PFW!;8&E}-P;H4YkOhCCCm(?E!eTw^!!R7fb;N`2Dt)Z{X{%RB7A#^1m4NMe)kRJ-tL7f6D zul@@`T_?aLN)y=+oJvHO6|ngsf1aMnlauC)IO!B)9kxnE{_n#&xy%;vV!BTO^>>~- zmT7wez$OWRBmgDOW0#C7K|o_g14Uyccf2HV<seKDki-X3Y6yn)@s4`G3b%GNpx%Abn_# zEDo$K$%?C{G|!hpurgh0+m?r;xRQr?pgh^9a^c8}_DrYu?%a3Ge)o^=V86hy6=GYU ze1YQ=>Y=zvU4U8~Y7(4+;msFQ720l1aUQupkW#v{P&k^X@!y%=p44l6XeZnAn3m&`gA?rW5nIpL|I35@Gcd&%9KwRxsqKBad zuSs?26yQN7{=zcR@)Yi(*AACYL(`L(4}26$qC935rwU? z-)GQg_X#Kqujew5wvFSwcY(Mv)75pD>!%j0oMJ+ z9ficoCyC^0rUy?lT{uEUvf(B;f;(f^aDq^3;F#U z3bs~qAA_NX_;5)T&!|MADnS|0229f1hU~3tOYGNgs^$o@F1w9gk4phEY6kCL6$C+g z01;yy3gWXJ?zvN#8&_g(nrE7KKMoPz8RR&)r~{A~<`MwOK0IQE`4s}6I7l2+(|RA% zTvwpMucN^PE{Vh-nzAzr-*;`L^{_7ghP(RgN|0U$b;NnAxV!%JZ9A=9>mwX|6xTYL z$Eqsrk`?la)9VwA*q+@X4;q4FF#f7_gcm;$HX@v*H`Mx9!Q4$ybsmw2_R`q8R z?mtAGLm3dZy1_EFt#+axLiGQ)cOC$KRaO2!^P8F9^pf8Dq(cZ0dKD0jh=>X(xJuEr z7hKfE@)y@#MMZaY6%|n|pewSprI%0wgpd#jgisRFdzqO`rq}=Hd)~Xh{ANfHNCM1n zes|{m-hJ)9d(S)P+;h%7_uK*bcI~Pzd-n{pBPW#D0!AfjItls-8|$PH#S&E&>KV2i z*^kwOU?2)tt{z*`P#JU5~ zU90_y2J^YF3}T%x!!=eeJ5R*7Uyi|nHFHKi9M|# zemi+d0jhwMYK?T9T||`zqV;_zjHPkzd3w(O<;xDu=*C{n{x{OMo|H z?`R{CXa3+S8{Ds)^$$=ha34NlV1Yfnl9`Dt^l{E1r5;qY0IKc4;73ug0^oqN(slxr zA{=--6h%mijLz4i_8bMl|L>CxHfC_r-itIL7|Wa}BrOH@4YW&0%p*uI`ab$V(Xr=s zsPoxT06`*`-oJC_&Yi*D=TU)mA&0-Bm5MIa zdve5%UOXaxiJ!6s$cJ`vSq_V85U-D@I|D(wogl1?bTR^HYOHWkM6O{sfmnvVdJ(Oj zC#h_0NWw@B80Qf4^|;RIeg*HC)B)ndMApNAG+d@?!VY{QPb)VqsU{w=H-InBGmH}2 zAv~w|F2#wcf^jxUFHIdR;4%L$8`@Hf;ZF=8vOPExkQl(TQC`F!9ZS}68HRfm`M0Gd zw)~e3w4H^+Es1r1Tm@8%ajyhV!mF0G+liA=H71wZ@k3ke$`^?-0313rCP}msHM;^{ zIe^(tYpEMm^meNH#e^VFLgWkAx7p`$il|a(W1f`@v;u)90c?vFAXSYhh)3cdWk@>V zC!;!x3G`hB*C8U6Z71t91Zm&ZN?l3Jn>VlKgcDBKDF(nt7ubMyA4&mPgn9gn7x(L8(fdenf3_S7r$FjrMJb9`8DP@Z%uovOy=N+lSF-9UGGJGefQca_Mt4W@c@ z?s({-hxh_6M0J9nIb91EE=+`~1BuHd@5!2dxoAq!#cfbqke_ z-i6)LR^YStwIh-~_4)QKorFG%jDYf6Xv7erw#gQt20MS;RfL~Q!9nNQqL%3XzLf$^ zv)_5yWtVOL&2N6g=gwiu7OAL6PN%4F1R1V=2%y3}6#YukY8d zpQDsBfTkuNUF~4~wl#%?vLpAsBxtxOsip@+3i|*KFv)QZq!m)>83o{IXBz+yU0%~k zM4cSF@cw$6J1l9}oz>5N`%sXn6%vUIByqySfV)oly$V`SCU)caK-y-3&6 zldxXrTwzYTpvtK?)LtpM_Hd*=V2Z+1R^jul}xmCTtG9vmQ3AhBHYpNp` z)h~3yxnx9a)|6kY`a8Nx?4ORVvd1?S+OmcOs|w{=6NKN45wKrzzO6+HsFVngYw_O} zHQU$UQ*56;vcx`c%?{g^0~b`;D!ykM83Fk6A^1`-1h|m^B^LlwTnZGcgf$BjykF`T zOoR4%GgXE%>0500^X79&unZv4VP8zF;Jk)*ca9%F-ka|X;Lt-4b+9!wG_363Kc2qX z2chGdb3h=qUwI*>V+}vbgH#d*qzeaPsmBsMk_Gk3P*^1u3+oT6|4b=eT&*$D;XAo&ON0-x1M6V0(x~g;S z&Q|;JZ|<}|u2^D|hcRQXtqFY}J45K{#Q-!9z>ifO2tR(WEcDTc0&)H^L~g9pWwb+IKS7(EPsk|u_<+u`WtM$x<5UhDTZe-kS6&8}`b%PS; z_2Igmi>~yg-`d*RWwf^gns>lB1BjqwoiKox`w}pEw$*XN@khuas0d-Y-{pia3Ba*6 zaa`bmFL~A0;rzxvFf5S^zJra=tJUv(hB-j+P2PN_VlVwJ9t8= zor?YAp3S*7k|l;a@&9ka9?-u$A2C1IHq^2-dS0&mc7Br`$qK^_s0)ug)rc_=V`&VF zt~80J7Q@LyYufC8@F*OM)xRIqz5|1wRyUTwv>l16fcm-S6ab(D&Up&w*i-FY=R6-y z#OM3Q&H=-)tr&p1GFQ0L89+{Tb@h5Ud<#xN@@Wy2VrY`f;N*g#kX^E(uthBoTY9^7 zNuYD6h_E6l9K5u3$fl$Fv3wSKst{R#oxpw9BK}{C{_Em;C`)DFFW?CexqJV0fZa{x zo-?k-1{)-WaBtY_JU#9Y&MLKotFSBlm3vnr4~H-1_r;$pV7#}73tnmVt&F!lbgPXn z*v1f@tb$@T5zUBhqD^p66C-AzVqNrC?++7cX57CC9lr%bM%mzzHn*)T2h0LaHL=J8~V(T zTAqNm8yN!Js63lPBb@={&Y3f3Goryp7{J*02LB}F`$iH-e52Wch{9eFaFA&qWx}Cc zYd2z$8jTt-0c2i@Kfgk96PC}$aFJECu`dYbQBrTJ*@B(i^zo0B*;IVqKlkSvqyn=k z^oDW@l7E0Fc9Qgk@MSo{oXh-z`&q}&U^KHv<$9!_T@};k(sSYal2=`0i6v*l^OhL+ z6fye>APW5bxig6Vk=`$NUon7aQ&D0DDndrec6|O@G~=(69zL(w+RH|vmlxUw^!?iw zx7nxP-QUihLO{`#2^+%@WfRuN9fY1Jg^+V`_uY=y-!$^yeyG9j7++}jeYAoRfqJXJ z;b+I7$oAlE=7;9G-@h-TP90dG%%;koq2|LW`YffPi{x zZK?C!^Fp|QbQ+f1jIaH0n1F8gBFG@ov)ncGikMIxZ)gcvuvx_i72wPxaFb_Q+97UludlJXW%pT2b2D|uNtCP0d|5SyY8W#zPb;S=G>c5b@IA)dxuWyd~{K}oDHn*vwb0B z{)FfXtNT#C8{zqhbboqS;4Qa%JT2QKD&|(VB(dN2FjHHPfG08J@I{^Llr5Z^Tf-`RK;J^9yY+rL|2lt$V{$3;^B0 zKLPv2F-X$TAk%>qH`S4bpFmM*NaWb0O9Dl_4|zZ40Ik|qfYc*!eyPN8B_|d4C`<#N zbgq@?!^g0!_sKJh?GF6h=js`}_oOE`f$T%^h|?q)t>s5pPN*PZUpTqcHf?XS?>yLO z6B!GS9S?UAdFmZh#J?mza3&e!Z080`zH|d~^@;EAqJPx;N8|kvJ?{u&zxF{Lh}sp+ zNzjyE_5QN{=amn)M9E+-Ly3g@l96vL-hU6RF?$l5#_5Mw*bzeuY!kMELJWV*1BO}g z9L!Af55!}oA6;{Qoz27+@UKS~*^9JSQ>jC8rp18_kD5<03Ycyn1X{$@^ar@lez zF&$|0L?#>y9!fD2j}H3OuY+jQrcF!K>X_CY04WA=;)y3Z=(zYCKvq6=&F}0BKMsMY zp*|g07{q^yhy@ni6Q7HODBZ7~h4=vA`f_^qo!A4ah||9l5jKdb4pE-dT6@^h?9x-p zm@(LCAAh9DPNqw1fw0z~8;nDG(0urf5X4Y=%IC2seCNnQ8$(o}KRtqiz*m6|Q}s|* zDZMvz(ui#cU2Tn)yX+3jZ`~MwP&@%KDyWxF>HFU6$LCxm2vUIBC9gm9eu@7~`030m zw6=Z|G4iSRr!p{@9Grg|VFH6$Py8#7Hshhk`US_9VV^(^fanxDO%s6fd8s1!Y{$Ys zowofaF2WBpY3ifIFjUlIkAo0k9Jfi+pl7hofnpXsk8V^>-PN?vqiY|Sf`1$R@V_h3 z1`ZtlQEu0zzLRrW-mzncBmj>E7@D3=V#ixw@~*xK5UFnIzl!|?q%7T!Ey zOo9FNu?EY*09FPu)I$^+DJ)@j&nCoN>G(+9oJiRFu@gMHw8?(`REr1yln(5;>=mW< z5Sh~rKTa5`EP2&2vF#-**fbY^{|c@#?8l?t%Zuo>aqNsh`&j?iIS~~)qt7aAbKPGn z8&hV*I6{37REu~3=|US!Kns8t zuYYt-rv#H|Zim;J1GTWvB&T79|5g$FXFaVJXj62p15Yvv$T)EE#TRcv+*=->26UO9 zgg8P8a1<`@tC2_n#V`aBvIANL!5GfP zn74}g@s~f-Vl$ziT6+6ZkbHuq2Bd;&RDl851D0&>v};Z+anbqmhw2IS1yShJ@t$41 zp6U{9s*9X;w7Iz3T5q}QAHxl}8A${`0JRh37r{r(QBNOlVg}0l1t%qE0Gc-Jy+1mA zCjmb?%SL#QFR^~tI)72V87W{4zRN$u7O)K__K~A;R>t_(fm)+?HZdBis%gT~P7IXe zXybhh|2@Par>ElEaO|jjTR~5sq#+swQLvRU1Mwk1^w(5sEi0m?rrNKM@r`ZCoaLk4iL^|@LotC z2!duhxE#m8p9s5zjGpDTD0aTU!L?YYj34n*)cKYm_rD0zHe&FaF*J`r7#Q_mYDc zt*B0M-m60;MdXh7>~pp*wd9uhcnsp+Etg;F;2X6UK}I$JS|5mC7xlbKfl?LcA88QX zA0r^d-B~;o9j0Gg2;?aH0*pWsfJT-yHK`NBA3t`@qm4EmcjzCoJefu?G~0xcLAPtj z0k8~%iKKuj%#-*f2EkU^|3wx()!ul5@NYK;z@#7vmkDA6EQrC=?Rv(746G0m zK?jcifxrTRYxbT9dmxs1I<82hgiwW49QrfL2+`zpqI>1rvY3$Firse<5qy`^%je=P zIQx)ddvaN`UHx>65jN0j=Knw#(0cwcEe-HQ}pMP}! zjvPXsRE&X&8LoiXqt$)2kJtJ`70|gB7{w&0^>5F#*%Qw<+xw0vwNjQdZ-H4#6=1Ny z8G(ic#mty4;33ZEJkw~0Pb#$2F^(z(npQq4MICx-Lz~g`sNLEDCvSUCSa7T%*K))- zU6R`7E#^S&4)Ah>_7ghUClajFY~{+8^Vub08c#L68-Zg86xebWELiXyqMw2W2vmY+ z#wOvrH<64y%TmbYXE}yKG~q`;7)}qZIXx+$=wy#g0l+;!!iPGiqBPg#*>!C;5eCp7 z2blBl{u_ohd)|v!0UreN(5)M zVS;U_UTrw^bQbovuF|2jT}033y}u-YuxXJGZ8^3MQGXC)_ID7-vl1Qts*_4QE@CN8 z0I~(N0Z)Y`Q$!z)_2VgRkFIESv41AhsO3d9Wmvu~UW2m|FjT$OG;bq2PdZjgJ1+(q zjlM9NBFBLkR=P**qiJxqbGtpWV#7fM?>nx;>D3GNUr|ieQC$Cr1{6jZL&9Y^j4V)uRleH?Q-P zapU9r0uly-)LysAsHdnsi&wSU8IuZp!4BC2cE<6oTOkA?qmWw*YG_)l7Q@g>FFB*q zo?6~yU&CwezwY=3>{t2C<*?tNnqMlyF zANl#Ky^+_Ss{)+&o}c%M0Vv={JH#*XzZI{)jvU7R%g51mqtm{YelVuZr*~Ay@OMruut^mO+W@nW%D|((`AbD5s)OSCuYbgn&70iu zCdVm^`*=~r1fqOU1H1yNhlpQ))WrjS__#kIy5#l82trrs5N?&UK;1?BNC8^%D*=;{ zeP9#T{?SYVI;E=E2GR{b4)G6RgyT#1HQM@ZZT8s{OKiFHd)}o$s%o<8uSi9!aTgv( zq~m_T7qHl>ZSD2~DiDH`O9g(j&{j=U8wIYgd7~pns&AtptFoh1%UT-Vqj&lJFcjh; z2^a=*BZXMPpK=;y1FFht?AgRN7#e=$#NlCci3_y*d z-9il~Oj^GlA`~o!X&ee9)3pdRj#WDHzW^l%R(wfbaO2SRm$10S9nZJg7F=0pvwDy0 z3tbq&`q2xr1Sdf}w5l&ii@y9J#?T*H++cSvZMEry0N#q7;Lhc(wh@=vaZIZ{V?xpf zVO874^BOx>un+a3uKU+4x8$Zr7&*|wo-+Ii;Uh*9F@Z?rSI99XX9~*1jdI-|v%P!$ zx$chyP&PX5{So~k_-L&^X8C~{wcJyQEAYE$I6^T507qc5K8%+FFu;vI zK*SWNJgxF?GX#gK4kRUgGcj+naZ)DoLlCo9iheztaX*1}wO_Vu**qGUh-tf9TVKHd zVmmKGTVg(rlfD;@ z`4%$L*(1?j(R&sX*Z%i&>TJSrf`yz{ZZ9KYJioQmR^mLgbQ{J%bl-cZSr>^tq z;pZV4RpI1w>$#OSh&dEj-cx4_7#1uC?t+0}E=VegC5P{lc9JXl1{xydPE@K9%q`$C zyO+pJ!(giVhE5FeCn;r!L9plp$w3DVuf6>8%caie#I)V5=@NRoC4kd)%{A9_U2wq# zTYmA2U(6jiaNtJ(AfenP`(;)Nh@icC#7dc)0b4*15qPoUZ_zVpm})2nJSA5FxDnin zlJfaUWOE!cDVI<=alP4o1PaT$LRRfU{>hL6dX)(sX2Q9a-6k{URf8MRC zxZY1ig1)cv6dRxmigFlGf0Z9u{?YxV|D(%yV)<_`8D$;$6n}%pvH{61`|53V_Dj0_4;)!)r{Eyeft;?P zy1}e{Eqm_fu3EGTC25=4Ds{k_NvMC;J~`w`KzKR*AO|1VofR7-Z`0hNa? zuYrmF3z2;eqsO0(QF8?D&t3G;i&nJQe*urjFqDo5wm!#!XF9~3_(SPHjHe)#OZ6SL zYKBsLE&;>QH_3gFL=<>f3uknfF8c97(rM@0$^HNJL0XF zr3b)_TlgZwd52Favg7bfn~Rt`3ZtAlnr;aQ2}mL769@qV_T|5oR0`XL^Gi&Y*Pq;e)%$DG&w!C*Y}nWV#PlmboKNDj z!2Eth_ZOJ4l%%&WW!mCUhEBS8k5>B$e^E7c6ea25Qe*Nk3NB$t@{desHYAs`rzGum zjD-zQ{diy!h~J;$8MzF5rxmxmCmh0k^6q2Mz)l#P>o$^m7g0Vh2Q;44UX2WBF7iMa zKxF@jY8TT{$-25G2ti*gJq<5d@H;EHee!{(|F*?AVdHwjLtUGu=K+dilyzxDzbTE6~W0 z<_$Jx``wl-ERO(+bI&u3y@y0H+qKO*GRO5*AxL4rSyVA4UWa9DX@Rhw-<4LJS)xCHW%Pt)y&nK5M2 z5Yx}-Q}jFsW%%NvKz|*Gdp*6sdeF%ul2*kK;W~_bVib^6)ZKeQp&TxVL&SsQUG3=l z8y~ma`qeJQ$oQuedNyYOw9V}SFbl4vuIauIFf=vekKi4$L*$f?w(72O>=StZ;_OpQ zn6H6JR{MdnSjdYfRTi5}Ly|Nge&;kj+Uksyb86E>to_pvTlC0nOIqv+jH{IllgceZ z?R7Xg>XKIq=d=%S^b2X%$Z8t4ntkGdMYd^c8|qa%aRjA0=t2ZXW>OPVfOQsSp%e^U z9rDW=`vdLXMdKP`THb9t^%ZxU==r4vByPO%#>eDIM4r(m@$}3~PAnjC8M9BS27_tB z<+!D4u}c9o`|hWjY&gSkr%zAX3v?+O(@r6-?oZ!zpyRMlU5m~O4KcK9Zjk%<-}-!u zEu%*~Xl&9>uPX3JKwIc7bzS$S%JMvAzy!RvtzAw$vIku+Pjs=m4>t?9BZB8y)iFL$ zUd%2q1+N+njCy}Wf4rUC@}I{FKN$b=2p*D8K#wlQ`?YmKxgPD1eWYGQ48<8is*YY; zud{mQ8l)x+@-~}x&BVyLk&s1qENRAIn4=NT*q^}xr4mRHe6*8v(k+E^X{R-m_yVy7 zK0G67V;No1H&T}my+@BzM#O{&N;2d#|MToS2q( z+rm9E07Qn)AOHBr_VurSeL0>)PwHt9M|?P=k`sdn1Ek2uf<1K@P0Ys*0D)n}MFk~Ev;q+tJIV!MkEMN}A1B_sF;IuFHrCEVKX~$tiaS^cCseN%9{j_d~q#}Qp zA4X~r!~VoT>$LN6G^#_7xPosq0r+WNfIq{pei%O;|`GARWbWkTPA z&wu{&FG0gOqUAlcagPju2fC(DpDrn&Y3VFa5|3I2lr|C$Z0Hj8ookIg8wX;{qHVt3fcJ?evV5&!+^>ZO)nz0jS05;*;+ zDiQH(AH6#;0-aY#EJ`NQNcYDEz*?~i^wC*51|mnW4untd@4o-+{T#LM5d>E$ zB9~(BKrvuA5@xlAHcUp`KNpwYSvW1N$4L1<^!i(911|oqo7ck}~4Z9#Yw96NjSOA<+b*Xk1!G z?$)nge>)9pW)x34VGOZXHucpQfCbS3e}IRWPPl=`V|0IILA~|NF5;JHm~VqX+*7MC zgdsypw~P>pHTCGxrr?+h<*&V)h&#Cc z`mmpzekeyo&RPaL z5)+6f0g;CZh@of`95j7-Ju1uLxb%LKfG5XHE+7DDr(I7Q?p%#$A4SNoKeSZ_)pj<8 z`${=fIa~w@mC3H>rmE{4Ni`7crThQzyneP~ZHxWj_C}kAtF*qAe>is77p;~Ng4q*r zO~y$`o{WrY(GI;Q|MyM+vK#8GOci|b5cJ>fVr9%e-rBp{AEF-ZL4dy8T6(X%q+Bb zj?A+>*7eJ;TSA=`JW`)s4B1kdPh}h*O-4?Mb7c>Lw~{NUkiP*638Y7Chjz z)?hx*+ypUQGr!(ev*dPh&Spz)yob6*3w!FxsMn7OK0!SDXz%_UWJ^~w9omh@jM`I9u|C9pz05J{* zGkIwhjzQNgY_c1f1}q24kpNEwEn}y*E3{h`CaLG|fXSxA#Bb4$Z}9{1v0x<_%U<#V zi=_PMgJpK~fhG2%>#OZC+>j^oK7@`aaj(9ezTu~N&s;uk}IE% z=bn4+e*r>!OuI1j@f!%%04sG(>-a{Q6ouOjwZKD~bFIEbT&_hLkY*c({i&zCYr8W@PT zUkOe>ll#FS2NziaNl7CF)#%`lW4L@82O-?|j8)ET1VyRZPWWCSe$v~gypl7bC>tH8 z<$GjB*YI8@PT^00)b#_1|Ev?r?K<@SpU-V#mSi+J_f%U$$ z7-BEN!?4hbiwc;eLxf&<&~_q}Jj>vEJw#suw;3k)TKI(sKS(dBru1xo`myr6X?I** zzoyIm@fTQ&`*S^`d{=#}!cJoCfg2yLvv1y6Z&mnj;A0et{@ko0HA3?;_x{VQW&*Gx zvEaU(-uvsDXHp97fktnpUE7a1;)sqB9%J3d{-)ZNu57pAs1eMY@gSZWM(im7q$s{8F+|13zg&d))oY8)6YY(b zzwu$qZQTx0O8k#z`%!Hq0B!o=U)?`Rhf)WWQC=*`E&uZRbD#fKANteS{?v(MZP18* z5K2BgpwL=!3VF7G6?yY%1IwLlV)?G-HV=rhovuBXnL2~8;3=Asy8^2n>22{Er2TZe zrh}-CX?MKhdG+`*9M*$<&okkua%{fM`$|6>O{~G6-&|uqytmP+==n8yDD`gg8Zy-i zNe2vSv(pY~#l^dnZ<_DSJrhR&Vp>dK{M!nR-X-8}+_(|b=RZ!n`3kRmNVJYoq4c7Q zF3MwZfuAt3-~#S~1Y9M13ut)Vl8YT zpap!!=xi@x1NhK^N&Am~>ThLC>An4tI{W0E_@i$GM7Ru85g<_FzIsPV3@mTK$f5e~ zT?K{mx`Pe|E(SooL}ZEWPg~&&|Apv{9&0%LP>SeVzU`3_Gt&7J^v3G-Mf`r=Z2>Aq zV!y2ZZHB1G2t#ueq_c8@C5Io6D{+PE$?XvT&aOh+)JYUz_Lg5@#mNH3(B&8egT#`q z`fGE}f&|emsWAaa+V3IxB^AMSl_34z+vD7dV4$LGEwD(a-(SD0#LhUr+{gOAbzQan zods7X_e1O#7N#YYgSKR=5JRpxz1~hZFdylq0&6(47YhoU35ZcQ{Y9Z@DO> z5Wysw{pQ|r?IkvAVw?TfJL>Jr_m|mNhU{8tvY0@Wx*P$e4%|TSjvM}Ell}Ie%I)2R z!(MennLYMQgWZNv>@Qj!Si+brV?exsUb8>>0k4-1_0ynVLyrfa{OV@4*dGN$|n)ZtJpeO zvmgg&s62XiP4*c_pbtp|7#o6vtoP-It9J#@zF!(L3W zg?eoRg?&b!Mh0Bo%(0K*Yw>PI7LJ`+;%&PHk^j?wB}x)76wIZHQ4_C*3Kbk>BUlNz zzk6Jx9WfbcAX&naYX$yIgYhq_`>s0m@|?h#i#@01!3Q7wJNY)4yJ%JC|6zJf3?MG0 zoxlP)7z7t=+qUhl0Rsk{fn*?Kpcr>XBq4@2F#(B;MXY?=0TVc3TAh7kXT5#@QJ4Vw zeZ&N4vhD}WI}kU=p>&GAKY7g#D`DB|D^4l4<7O1wq0>w3%RAfcxm7LpESR~PpdKrU zdb>zHo2L9pP;;aw&%g6>i3##wbt-`}5Hm*BJ!5%0o^m5y4v~IyxGv<^pX>a}#r2Q& z`XnMiZ6wqMNdOA=85#egfFY|}hBIpf?QRX z9s5i4la_Q}NP3pMJ58{M3HlU4$?JIT9ST8@!L4r$F%AwKS6~O=1f}7JCC9ktH=L*t)rQhLn{fPxh$#HSQK|NQee9((MuXMkw0#{Q!>^s?V{1^|O|NuUy< zIpffJ#NnNG`GQg#0|E-+!W;n!^NsYTLifpoSq7Ui`_Etyw2FHBJU;42PARlugOYaW zlw!k}?n{Dc9e_3nUtzpu-}Chbcpf^XG@VE6XOlR;aPiCby`RsqaTw=PVZOLm(DzQ6 z7YDsRb*yvRoU6#$NbiZK{L=gDo$^3D_w)m8JT7v%c}XiQC_*AAf@ri+S48F{20)FB z$T%u#Kr;X(35ZFm^k`$}NffDbPMKtt@1DXb)z^z)pAR$8BB^Bzc`5?)X4X`Ak@>yz zUZ}Gxm%t%8)->Kpz!qK##=G)C!O^<{FHz6`g+m(b!$-Daz%21LsP|XhRbPGE3`+vE z&(T@Dc<~>}H?r_&>jf8FAg1t|(rab_l-9L+_3BpQ0~8*2+;MXiXrR2j{3y=5{_&dL z)(dV5NFsz0;xLv96X>*o5YLAWt0!z&oqhWeto|TVDP4Y(hMF9&A~Cxb$CCnNq6rLE zxA5FASo`l6_hU96kgyX6C2TBHe@EftKbR0$mDmQ#@g>$WVp=~yM4^>|HOL|YRZvn7 zleuG|wXS)|@+OoL_6r`&bswwOtEq=?R3fT-*sEH)LG_B9jXE&=$?dldJ3t37D6Sl0 z6@$iLB*Q?4+EZAVL{Da87_<SK9Et*ZNt-fW-9Jx$U6= z2}n$+79*-wQd&opqZQ}^4@n;&M4IIJkr-MFkPfu2zz%U-!CGh^!(4{KW|+cy3cd8m zop$;m?Z6hXzo^6|I7xCDD*6lTBJ|wa+S-TS@s4-Q`^;xPlYsaoQ@-Z(dKiFRh7^ET zpk7eBWXY0ijz0QmF#zVw2qFE8yyh3boo`fI!~ldivInSrp;vqFA@xL+skJK}Ew$yf z`8Jl(0dYV&^f=MWl9&BT((YJ>sPfBU%^0N~T*vofTCsmNeL8KS=(Oiu3=juU7r%Wu z1K+pUDs4j)Y?e_EIcG_{%SZA@c6r*3M6&EAT@a^;s zGr0G6+QUijufV4sbqa?)5u@i6-8abfGZkS(Ue|P~W0nUwq5ePShwBZZL@4bmf7>;(8K`yZg z+|xwF!gJQW9*iZkxlXWlg*2*YshBur2rT(b4g-7LO2;Q1C=e}Puo;l%#>9t zkMl3%A1=Rg{E<44TRgxT3&&c29D0()s1}O$OHZG}rcmG7=V18rJYqi?-XVDCJ*s`r zq?V}u+AEPyor=#nBaM`j=pNge~A-+u=t1Ge^+6dk)u=6Fnj{tf8hxyoG|D7^Uv?Z15ga$b*0zK091G< z0S20X_q*TKAO-v$Dd0%XWtB3g*0n{8d*XSQ(Z~UyFB;L1+pib^c7;Sc>-gT5VV|mjci?3XlTs3$_4=L_9m{GGEiHd&f;8{$LN#-Z#!QVIPoh`Ek=4 zZR&^}_TF{5_QeoB^m3vFb@ED17oH~vK}70?z9XtbYmMc# zyvRKR;0qB0K+=Z|M8vPz2c1~u6&6fIh;ev6Mkg%_fX$0i1yr>S6FF{#bc?z zjAJtDfd*{R>_7GNR2T-Ny*BwE2o6!6B9v5d-V^v){7S#Xt$sb;Mfvz%uc+S@Kd(Gx z=^3#sJrf2BIv{wd05S(4xFD%?*g5$1A4ji0eN;Q^38>evaHC~05sKC82c17tdwzk7 zBm~JNXzybf=MT8I?%WJR+ zQF&;7v-K-$vI9of*{NF+_R_|rJ-s1mi?<~S=m9Zlh)q4I=n9I_`XU(9hS5jH5`#7=pd?kh&1b3Q;Mey&Q3!SDj-TI`)nqdIdCp<|$WPIpV; z*q@E0gQ$8U_vlgg1>is&XM!Z04{Qn>?)5CJ@x4lJ&(3l6dzO z6j~8Iz6d`Me_+!3P8pg6HlOtK)KgDgL%w$W`0=g3`qi(}m8RF+^f$@?y6(I0zLr=D zxWBr(`r&^4`W??(Gg1l=G=)$?u7Fs|OUzV{)7pxUd~+eaQH%92Z=rW;vr`&dm?&ec zcB5gzT&rowwaxWRo@q{44f<;x(`Xf_LfZ~euk-^k0vQe%c65$_8GKR#F&*oDb35J# z=ByBH~9xpOpOqaldD;AHI=ZpMgm% zGPka-?%tD6KKbrTFTJ$ui6@@GTKmS*8)X2-g@Um_c1$N&t%fOi@Mr?nHcVWz9Y6Um`WQX2h#neI;`4QZ=d?aX?E=KN5Q;^BcPM9s2@?KdV5hUBLF!*R6t&zGJH<$ zQxr`;PU)x9^SYdVOkRhoyE~2nrx_5pbAX zq zQiqJ=GU};!bkzhxk;k5#Zxrir?dt9JrHkKh6RRe;hn#v)F%H-5_XKy!^c2ub#~~kI z@?HA*^n84e6L$Lj6)V?P{>$yPKp^Wry(n9F@z;-)r_9-@U#4x+{_Iqvd(iPUf{~#-` z>~A$S+pMN~3(TU?z5T=tx)|&4V9h>BA%iO`Y{l{y?BD+Va+@@%3PUB9^CC@+efven zNrz#2KENfM3&(wBAJbAU;rU;H`2Pr_0RT>_yxax!T|2P^UgNrA2;I|wE4*= zpZwYJ#~=S|J{F@|k$Bu!K2&IDI-)Ay6ArIN{3=6)FD4K~-cau0vu4_eVMFYZ#~0Xb z_sq5G>L%;oZ>SS>_4ZBZ`>p<*?$`K!DQ>YVmT$55f9Ruj%1I|!DUw6f`$v{@)h)fQ z;XQBFzGq!}9=}!fdW+wiQm5z7pZ`CA2SolB!nHTps?}@lnI+HL{3oBW zg-e!Mb7OZ`B(+Sk7320@Nxx!k3o?sb(j zzW@D*F&!(|b@z^n=?a0Fqv6ZV<+jGw^GvYMFqYMnA@yt|+{^%nQ zvr(f)VjR>=zsOUrr#_we5bd=sbgMrBJ~n>$yWdss-yGA}KI#1hm3=7zsJvVZ6O|Y! zlFU!OV8)CY|G~K|0}y21U`m$+G@h?vJsJMoK-kjEaTMZ9=X6c?2WAoJ`*NBoO!fS- z{`XWZ-eA?TkL`a5IPEbHMTSY~MZ z14!@rRbDo|ts&sfbfO)I{>Rj`35icu|9wjQ`x63rr~(6c!SIC(7hVcCQ|gFz+26f| z0LDS41$1;F0d#>RT_8sndSVww!Y+o2e6PID>pBb>2SjEOuw_%PfPjA}eEk0v8XAGv zKal;twAZC*e}8oaIaO6v$#=i|-2;#U3JF*IqhZ5_$xS$`3Zy{4cNt*m1!y0(^b*y} zhn~LYKK;II{_O>UKqFZFZ^G*TRYLGJ-hA`THLF$;RdyeW{-M?TS_KH@b}e7Nylu^z zHN={-R{R2fLJzeHMASrvtSS(ov={q8;6XKzdXT;aJ3!F)0~6SbS7smG{}AvF66tLP zzW!J6y4DpdR@6iM`%U!UUkpH?>b&*VTbn-jxz9Dh4AwAx`2Qic2JgVA``Z5i?K5u( z3?Y5rXBwXw4HZpjo_{Bvwf~0Ye>Jqz2n}hjO|R`VrD7xzV}`LGLpbp(kN}jj_J9Zu z+21S#0tB2Upb;7U#>6y3G}ir__KRU5t;%X#8_N~#V9|p9_%Z*EX~PFHtdSiWOaoFj z+vg$R-hLYLgGR3Y@P|L#dBY7i)B=@#;_dfp(B0n*K!zxZHXb;HeS*-%mtm*`nx)=yY9M19E7CL zY+$+ZZ!k0^r}eB+Fda(Se4l~<(y?@V&GB!d$G?>PI?)JmHZ0pWUL{rdISLjym*=%R}{MH8HBiEUNC$gb0N zVon){b=d~J^$>`0I*$ojo4^14?|*LY+_|g3{f29=y>_3@?|`a{ea*b1;TbFE$bY|28Qw?iP{GPu2kI2mUP*JGU5veR#>(U14Ny%IJ7_4I{s z!x8Mq|KSgR_y|*2YvYfeWdgk&`}=tP1Mw5raeE;C7}pD9+<$u!N4cx-1juFiuiB3>8A6A)6DK0!@eZj^8Ing70_UH9{#Y(lU31Mf9}c4fAW&PTBT=?}y%qwFo3i%*=}&(;SGbFppTz#s zEb#+{*O}5Kfr-EU?QhRv%H(FDM&Po&7EQ7h&o~GKoCHTVFr0l3xE_eVg#26SZ}U3I z?(KEEGlAGJSjFlnXRtEL^THkhoGs%JDchjl2Z2ER;O3Gqe({U%frKW-IGYvw_m-c8 zA;JqTxIjaM6WNZhuC9JOMib4b%5s6;M>CmHW8t39>H{Yq12>Ojn-t?}miPh2K1qQI zFn2)CLX+5zBGmYeX;_q3vSnALed?^&U>Y#8+5HNE6t2DS!VA9w7Y}5cjG<4#ZhDo6UvKk9Qhf_% z&z@bzq@n(VOwJ{m%4tj@`W{PW74XTk3y%PxY}$Vi2sp-c_QrYh=Kb3VC!BEW``-7y zPNw%(Gr^~hH!G0mn?9}gjkdTqiYXmhbOeHLf7iR-l_ZkN@-bt^JU(gCq=Q-hTFa3I z;P*D>_C~*9_PI9)0xnW$Ixj(OR}$m$OGu*+GF06`c)M*&mMqcKb`gKqn^T?aTk-)x z1(Aiuv!8tEp@+VM=t6g=34SRtE$v)3n}xvZh5%Onl)ev+-E-7YN1ZI3yYRvbg?km? zo^UbS;Q)j;HJy0ki3)38N*r~K5KLh^n1vO7Mp$M4U}1RXb${{f16c^f5C}LVoLahc z>3@P_Glgq0&XtnyjZ!q#&YYx4L`AHnHuUt&xN)$otZV=}nS2GNyz`y!Jed_% z?+70|aPn}R-De@NCkUkD3OMwC*qTlOrzYdpTSXkd{^Sd?#Q#>4{43v|6YFB-*ahT& zJ(X<+mfCMIF=KoDv9r>^p0GZ9UJyv(2NTeCJpTCO{|_8GK)4j+RC!k42O4klB%Q1n z`@ql-e(-~?5-?Kmo^%7DID91GWwAaB0fzwSuqy=JmMvQzl-oIYG(|WhToO*PW%Yf4 z@U~B}c&2!3{bEb)H1ac^c;X331KR@9^U<@mfdGs?x{qn#nzBQD0HaqXNdsfYjxD6}13v!okBg&=5gd5eU3Yzn z`0OtQWQPZ2)q((w%-(k+e9bOpRh}<`69=(*uP(=}D#^>|BXXu+Vv^R0Wgb9Pm z7qiJ;)K?^8nwm|)Z=g&@LM*=W8xSKn^o~33_`CuNEx14Yzdv zwqwVRdCxra%*`0{9_IXxBaS#CXT*pR4fo%Fe;wDf40o8bpEdFUjBHASKs@eSJbd`@ zfk*`7kO<@oDr2EkgD=RV5GK)>*3)#vx@Ov`Y<7P`AclELzvr8@XsYfFH{9?^zSS(Y zX%M~}_@+#mqG7$F*!GiU*Z?D>EHDBjy64;k<2F_3yaz&O7gB z-Mtq$)r^>L+}B9BuAOY^@wNPXc32M}WYg<|fEa8Mj(k`I&Q|Z z5jB5EIH;$DoM}mnAnRe629P(Jl|@gmWJ?+K6z&1T-lC_Ue)i%YGv}j=mMM z_KMi;mku0Ipn1N z{rewXR8%xFJTAnI^AZfQ@D6}^^}UE)y}0g58S1dhY|t<*hP}IS+*!&s#o)_Uwycg15VC1MKp@STsQiEf4j3Z$;)4!4$Rz?^Hyvbr=fe*_d?{nj_iBkK z5IL2kx2EZ?sU9tLL*LB^7U{4_L87_2c`LK??t$pPDcAyIx5)_RnyfQ!+_)hy-Evv= zxf?SOhQkb` zCP-Zn0rVw?K(jrG=u;DN1QR6~Cm`E;FR>iH!Q`#?0#o_vJ6r{0!I~hj0|k4w>^MF^ zc%v!HE#D~Qc0K0?LsWx2#+{QBCr&IHJa}+1#=#=OND02$@>n5uBwmLHpqm~xaNxk1 zgf$;cWMioi=}CqvB^P_4g-p>JMAvGUt3x!Z+guAQ_#JHP@x@=ba^=d$Z@&5F=YRUs zpRVP8H{6|f-g#ZXwh2j~asK@IO{ik6Z0%WpeSviEQkDVi9sGJeoxrm!mpSE<43Ze3 z3I_}rP@G643SkB!Y7v00mH+jxf1NaQ=FEd&1_xDCR7}my%^kpfDSelFltegzXaX~N zyMHrLy6P?Nr8cNd-RdlVe9|`b`RCadF(K;(yz^e-z8bc6HpAd538{Je_U(-r`?*o7oAv?%-9F4-l#_k5I|KyR96Sv3o_p>&_43XP1`Qfigep+L-1B@8 zSxBt=3J*N+z{>A^?|YN6DNHUdE}o3T(R5}f4uT)ZLveShCz0hu^yZ&)e}7ZawhVNk z4$6CbspxLs4I#G?Y-0n&yp;C83{0N?_P4+N(zDM#Tgx*Vrt88dKf&azb|j}3#Q!FG z_a+RjZNMrR^aL*#BiLutK7zn*KiEDhJ6jA85MiEu_SuOQD^?^RdNG51=9?!ONho4p zuzL0CBz6Lc#6kQoM#n8>8+zPv$4wYDYSaWYg^{JDrDI_ZBajp{B>8G75J}kky=g@I zYR`syW18-EYrvJT?{+a9AjLpdbnI1 ziSigS%!jCx^nOwo3PAq6`|i6h=*S`f^?XHGy(<{{Djha#*pPAK#tp-kFdEfi7=%3l zdqO4K09HmSM{3Y?=lz!A-n<&(u7%iZdH)u~^NpKG%&%XK4!;S)6_IPDoIvcZ+AvPv zffUq^-$XMj>9n8%oxBMnUFgm0DN89G zm%8xA>w-av*xS(aTN)c1+msi+5n8uz`U?{J4UDs0g;f2?Qp56s< zw~N4G812-f4fpAG^!;{5M%s~7I$#7HNH`rBLiKFe_Vk|Y`8N>)0Xg2pS7u-JIw2sR z1K+TMC-8VnperX(6>@QaNx%qlkrLG9=a!U|dAe>8K+YOPkp+w#2%oV z-De@Ne;^>{oq#!rsAV(I@S+btvR6RMB6{ay>kpPU|n6e+PH-5F(Ugz}htGs&n^m8gHoL4?1 omjuE=yx-lq9=Bu literal 0 HcmV?d00001 From df960aee803f53b85af362475bad44ed06b57c88 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 29 Nov 2022 10:39:14 -0800 Subject: [PATCH 0361/1651] Show empty sidebar when no node is selected Summary: ^ Reviewed By: LukeDefeo Differential Revision: D41549165 fbshipit-source-id: 7f6324c8e04b8c7db3afe1e4cc5e1cbe0c023b7c --- .../public/ui-debugger/components/main.tsx | 22 +++++------------ .../components/sidebar/Inspector.tsx | 7 ++++-- .../sidebar/inspector/AttributesInspector.tsx | 9 ++----- .../components/sidebar/inspector/NoData.tsx | 24 +++++++++++++++++++ 4 files changed, 37 insertions(+), 25 deletions(-) create mode 100644 desktop/plugins/public/ui-debugger/components/sidebar/inspector/NoData.tsx diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 82f38372a..6166fe97d 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -34,20 +34,6 @@ export function Component() { const {ctrlPressed} = useKeyboardModifiers(); - function renderSidebar( - node: UINode | undefined, - metadata: Map, - ) { - if (!node) { - return; - } - return ( - - - - ); - } - if (showPerfStats) return ; if (rootId) { @@ -74,8 +60,12 @@ export function Component() { onSelectNode={setSelectedNode} modifierPressed={ctrlPressed} /> - - {selectedNode && renderSidebar(nodes.get(selectedNode), metadata)} + + + ); diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx index 4ef652951..f92aea5fa 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx @@ -14,15 +14,18 @@ import {Layout, Tab, Tabs} from 'flipper-plugin'; import {Metadata, MetadataId, UINode} from '../../types'; import {IdentityInspector} from './inspector/IdentityInspector'; import {AttributesInspector} from './inspector/AttributesInspector'; -import {DocumentationInspector} from './inspector/DocumentationInspector'; import {Tooltip} from 'antd'; +import {NoData} from './inspector/NoData'; type Props = { - node: UINode; + node?: UINode; metadata: Map; }; export const Inspector: React.FC = ({node, metadata}) => { + if (!node) { + return ; + } return ( diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx index 3aff0a231..aecaf97d4 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx @@ -33,8 +33,8 @@ import { RowStyle, TextAttributeValueStyle, } from './Styles'; -import {Glyph} from 'flipper'; import {transform} from '../../../dataTransform'; +import {NoData} from './NoData'; const NumberValue = styled.span(NumberAttributeValueStyle); const BooleanValue = styled.span(BooleanAttributeValueStyle); @@ -274,12 +274,7 @@ export const AttributesInspector: React.FC = ({ .filter((section) => section !== undefined); if (sections.length === 0) { - return ( -

    - -

    No data is available

    -
    - ); + return ; } return ( diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/NoData.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/NoData.tsx new file mode 100644 index 000000000..fccb091f0 --- /dev/null +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/NoData.tsx @@ -0,0 +1,24 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import React from 'react'; +// eslint-disable-next-line rulesdir/no-restricted-imports-clone +import {Glyph} from 'flipper'; + +type NoDataProps = { + message: string; +}; +export const NoData: React.FC = ({message}) => { + return ( +
    + +

    {message}

    +
    + ); +}; From 77c65c8592d214c92c8f145abb70df251ec7385d Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Wed, 30 Nov 2022 04:29:45 -0800 Subject: [PATCH 0362/1651] Flipper Release: v0.175.0 Summary: Releasing version 0.175.0 Reviewed By: lblasa Differential Revision: D41611793 fbshipit-source-id: 0dfecfd85e68c3878384283f084e5f5914d36aec --- desktop/package.json | 2 +- desktop/plugins/public/layout/docs/setup.mdx | 2 +- desktop/plugins/public/leak_canary/docs/setup.mdx | 2 +- desktop/plugins/public/network/docs/setup.mdx | 2 +- docs/getting-started/android-native.mdx | 4 ++-- docs/getting-started/react-native-ios.mdx | 2 +- docs/getting-started/react-native.mdx | 4 ++-- gradle.properties | 2 +- js/js-flipper/package.json | 2 +- react-native/react-native-flipper/package.json | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index c88fd7fa4..c5f40de4a 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -169,7 +169,7 @@ "npm": "use yarn instead", "yarn": "^1.16" }, - "version": "0.174.0", + "version": "0.175.0", "workspaces": { "packages": [ "scripts", diff --git a/desktop/plugins/public/layout/docs/setup.mdx b/desktop/plugins/public/layout/docs/setup.mdx index 31248a35d..4ab5d5336 100644 --- a/desktop/plugins/public/layout/docs/setup.mdx +++ b/desktop/plugins/public/layout/docs/setup.mdx @@ -27,7 +27,7 @@ You also need to compile in the `litho-annotations` package, as Flipper reflects ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.174.0' + debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.175.0' debugImplementation 'com.facebook.litho:litho-annotations:0.19.0' // ... } diff --git a/desktop/plugins/public/leak_canary/docs/setup.mdx b/desktop/plugins/public/leak_canary/docs/setup.mdx index a9fa9fb8a..7aa6dcded 100644 --- a/desktop/plugins/public/leak_canary/docs/setup.mdx +++ b/desktop/plugins/public/leak_canary/docs/setup.mdx @@ -8,7 +8,7 @@ To setup the LeakCan ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.174.0' + debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.175.0' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1' } ``` diff --git a/desktop/plugins/public/network/docs/setup.mdx b/desktop/plugins/public/network/docs/setup.mdx index 3b18f6635..8902e387c 100644 --- a/desktop/plugins/public/network/docs/setup.mdx +++ b/desktop/plugins/public/network/docs/setup.mdx @@ -12,7 +12,7 @@ The network plugin is shipped as a separate Maven artifact, as follows: ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.174.0' + debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.175.0' } ``` diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index 03c4b2a4b..4068cc049 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -24,10 +24,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.174.0' + debugImplementation 'com.facebook.flipper:flipper:0.175.0' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.174.0' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.175.0' } ``` diff --git a/docs/getting-started/react-native-ios.mdx b/docs/getting-started/react-native-ios.mdx index aae1555c8..454d5783c 100644 --- a/docs/getting-started/react-native-ios.mdx +++ b/docs/getting-started/react-native-ios.mdx @@ -51,7 +51,7 @@ Add all of the code below to your `ios/Podfile`: platform :ios, '9.0' def flipper_pods() - flipperkit_version = '0.174.0' # should match the version of your Flipper client app + flipperkit_version = '0.175.0' # should match the version of your Flipper client app pod 'FlipperKit', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/FlipperKitLayoutPlugin', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/SKIOSNetworkPlugin', '~>' + flipperkit_version, :configuration => 'Debug' diff --git a/docs/getting-started/react-native.mdx b/docs/getting-started/react-native.mdx index 8eca6b4fe..7864b4bb6 100644 --- a/docs/getting-started/react-native.mdx +++ b/docs/getting-started/react-native.mdx @@ -34,7 +34,7 @@ Latest version of Flipper requires react-native 0.69+! If you use react-native < Android: -1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.174.0`. +1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.175.0`. 2. Run `./gradlew clean` in the `android` directory. iOS: @@ -44,7 +44,7 @@ react-native version => 0.69.0 2. Run `pod install --repo-update` in the `ios` directory. react-native version < 0.69.0 -1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.174.0' })`. +1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.175.0' })`. 2. Run `pod install --repo-update` in the `ios` directory. ## Manual Setup diff --git a/gradle.properties b/gradle.properties index 5f9e7d460..8f45fbe15 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.174.1-SNAPSHOT +VERSION_NAME=0.175.0 GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper diff --git a/js/js-flipper/package.json b/js/js-flipper/package.json index 283e6e3f7..b06e0d578 100644 --- a/js/js-flipper/package.json +++ b/js/js-flipper/package.json @@ -1,7 +1,7 @@ { "name": "js-flipper", "title": "JS Flipper Bindings for Web-Socket based clients", - "version": "0.174.0", + "version": "0.175.0", "main": "lib/index.js", "browser": { "os": false diff --git a/react-native/react-native-flipper/package.json b/react-native/react-native-flipper/package.json index ac99b49bc..02e883e5c 100644 --- a/react-native/react-native-flipper/package.json +++ b/react-native/react-native-flipper/package.json @@ -1,7 +1,7 @@ { "name": "react-native-flipper", "title": "React Native Flipper Bindings", - "version": "0.174.0", + "version": "0.175.0", "description": "Flipper bindings for React Native", "main": "index.js", "types": "index.d.ts", From 4b83135c6c2f87102c8044e99ab7fca8bb10ccb5 Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Wed, 30 Nov 2022 04:29:45 -0800 Subject: [PATCH 0363/1651] Flipper Snapshot Bump: v0.175.1-SNAPSHOT Summary: Releasing snapshot version 0.175.1-SNAPSHOT Reviewed By: lblasa Differential Revision: D41611792 fbshipit-source-id: 7c6f7d035fc9509ee8ecc763b92838a1b4ce93b9 --- docs/getting-started/android-native.mdx | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index 4068cc049..bac859e72 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -124,10 +124,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.174.1-SNAPSHOT' + debugImplementation 'com.facebook.flipper:flipper:0.175.1-SNAPSHOT' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.174.1-SNAPSHOT' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.175.1-SNAPSHOT' } ``` diff --git a/gradle.properties b/gradle.properties index 8f45fbe15..ce5045c98 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.175.0 +VERSION_NAME=0.175.1-SNAPSHOT GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper From d954828bbcc950a4e57db1814d2adda1451343aa Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Wed, 30 Nov 2022 07:23:29 -0800 Subject: [PATCH 0364/1651] Remove concept of dynamic metadata Summary: Although conceptually it made sense, it creates an issue with registration. ### Let me explain Effectively, as an engineer, what constitutes static and dynamic metadata and how can I ensure that is treated as such? It may be trivial to answer those questions but there was a fundamental assumption for static metadata that no longer holds true. Static metadata was registered when descriptors were first referenced, which most of the times happens when added to the descriptors registry. This used worked fine until we introduced the concept of deferred attributes. Deferred attributes, even though static, may register its metadata only when requested to. The issue is even more fundamental as not all the objects that declare static metadata will be loaded into memory by the time the plugin is connected and sends this. ### Solution To simplify, as the concept was never really used, there's only metadata. There's only pending metadata which is metadata that is yet to be sent to Flipper Desktop. Reviewed By: LukeDefeo Differential Revision: D41614186 fbshipit-source-id: 85d62eeff81ff22ae6e969d7b5aed8628b336258 --- .../props/ComponentDataExtractor.kt | 2 +- .../uidebugger/UIDebuggerFlipperPlugin.kt | 4 +- .../uidebugger/core/NativeScanScheduler.kt | 2 +- .../FragmentFrameworkDescriptor.kt | 3 +- .../descriptors/FragmentSupportDescriptor.kt | 2 +- .../descriptors/MetadataRegister.kt | 80 +++++++------------ .../descriptors/WindowDescriptor.kt | 3 +- .../observers/TreeObserverManager.kt | 2 +- 8 files changed, 37 insertions(+), 61 deletions(-) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentDataExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentDataExtractor.kt index 1920f3d58..8808b17ae 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentDataExtractor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentDataExtractor.kt @@ -107,7 +107,7 @@ object ComponentDataExtractor { val metadata = MetadataRegister.get(namespace, key) val identifier = metadata?.id - ?: MetadataRegister.registerDynamic( + ?: MetadataRegister.register( MetadataRegister.TYPE_ATTRIBUTE, namespace, key, mutable, possibleValues) return identifier } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt index b5bf9ae54..f725c80f7 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt @@ -59,7 +59,7 @@ class UIDebuggerFlipperPlugin( MetadataUpdateEvent.name, Json.encodeToString( MetadataUpdateEvent.serializer(), - MetadataUpdateEvent(MetadataRegister.staticMetadata()))) + MetadataUpdateEvent(MetadataRegister.getPendingMetadata()))) context.treeObserverManager.start() } @@ -69,7 +69,7 @@ class UIDebuggerFlipperPlugin( this.context.connectionRef.connection = null Log.i(LogTag, "Disconnected") - MetadataRegister.clear() + MetadataRegister.reset() context.treeObserverManager.stop() context.bitmapPool.recycleAll() diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt index 53eb74d07..6223aa511 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt @@ -54,7 +54,7 @@ class NativeScanScheduler(val context: Context) : Scheduler.Task { } private fun sendMetadata() { - val metadata = MetadataRegister.dynamicMetadata() + val metadata = MetadataRegister.getPendingMetadata() if (metadata.size > 0) { context.connectionRef.connection?.send( MetadataUpdateEvent.name, diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt index 88570b9f8..136317ef7 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt @@ -42,8 +42,7 @@ class FragmentFrameworkDescriptor(val register: DescriptorRegister) : for (key in args.keySet()) { val metadata = MetadataRegister.get(NAMESPACE, key) val identifier = - metadata?.id - ?: MetadataRegister.registerDynamic(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, key) + metadata?.id ?: MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, key) when (val value = args[key]) { is Number -> props[identifier] = InspectableValue.Number(value) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt index 593f51461..a45f9409e 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt @@ -42,7 +42,7 @@ class FragmentSupportDescriptor(val register: DescriptorRegister) : val metadata = MetadataRegister.get(NAMESPACE, key) val identifier = metadata?.id - ?: MetadataRegister.registerDynamic(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, key) + ?: MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, key) when (val value = bundle[key]) { is Number -> props[identifier] = InspectableValue.Number(value) is Boolean -> props[identifier] = InspectableValue.Boolean(value) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt index 5282d28c4..55a780b07 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt @@ -24,29 +24,10 @@ object MetadataRegister { const val TYPE_DOCUMENTATION = "documentation" private var generator: MetadataId = 0 - private val staticMetadata: MutableMap = mutableMapOf() - private val dynamicMetadata: MutableMap = mutableMapOf() - private val queried: MutableSet = mutableSetOf() + private val register: MutableMap = mutableMapOf() + private val pending: MutableSet = mutableSetOf() - fun key(namespace: String, name: String): String = "${namespace}_$name" - - private fun register( - metadata: MutableMap, - type: String, - namespace: String, - name: String, - mutable: Boolean, - possibleValues: Set? - ): MetadataId { - val key = key(namespace, name) - metadata[key]?.let { m -> - return m.id - } - - val identifier = ++generator - metadata[key] = Metadata(identifier, type, namespace, name, mutable, possibleValues) - return identifier - } + private fun key(namespace: String, name: String): String = "${namespace}_$name" fun register( type: String, @@ -55,46 +36,43 @@ object MetadataRegister { mutable: Boolean = false, possibleValues: Set? = emptySet() ): MetadataId { - return register(staticMetadata, type, namespace, name, mutable, possibleValues) - } + val key = key(namespace, name) + register[key]?.let { m -> + return m.id + } - fun registerDynamic( - type: String, - namespace: String, - name: String, - mutable: Boolean = false, - possibleValues: Set? = emptySet() - ): MetadataId { - return register(dynamicMetadata, type, namespace, name, mutable, possibleValues) + val identifier = ++generator + val metadata = Metadata(identifier, type, namespace, name, mutable, possibleValues) + + register[key] = metadata + pending.add(key) + + return identifier } fun get(namespace: String, name: String): Metadata? { val key = key(namespace, name) - staticMetadata[key]?.let { - return it - } - return dynamicMetadata[key] + return register[key] } - fun staticMetadata(): Map { + fun getMetadata(): Map { val metadata: MutableMap = mutableMapOf() - staticMetadata.forEach { entry -> metadata[entry.value.id] = entry.value } - return metadata - } - - fun dynamicMetadata(): Map { - val metadata: MutableMap = mutableMapOf() - dynamicMetadata.forEach { entry -> - if (!queried.contains(entry.value.id)) { - metadata[entry.value.id] = entry.value - queried.add(entry.value.id) - } - } + register.forEach { entry -> metadata[entry.value.id] = entry.value } return metadata } - fun clear() { - queried.clear() + fun getPendingMetadata(): Map { + val pendingMetadata: MutableMap = mutableMapOf() + pending.forEach { key -> + register[key]?.let { metadata -> pendingMetadata[metadata.id] = metadata } + } + + return pendingMetadata + } + + fun reset() { + pending.clear() + register.forEach { entry -> pending.add(entry.key) } } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt index 60913a292..91a942274 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt @@ -79,8 +79,7 @@ object WindowDescriptor : ChainedDescriptor() { val metadata = MetadataRegister.get(NAMESPACE, name) val identifier = metadata?.id - ?: MetadataRegister.registerDynamic( - MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, name) + ?: MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, name) when (typedValue.type) { TypedValue.TYPE_STRING -> diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index 7c5502e92..2c088011a 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -90,7 +90,7 @@ class TreeObserverManager(val context: Context) { } private fun sendMetadata() { - val metadata = MetadataRegister.dynamicMetadata() + val metadata = MetadataRegister.getPendingMetadata() if (metadata.size > 0) { context.connectionRef.connection?.send( MetadataUpdateEvent.name, From c7e67a5de0f2e8a902a5fd958887934133575966 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0365/1651] Bump protobuf-java from 3.21.8 to 3.21.9 (#4285) Summary: Bumps [protobuf-java](https://github.com/protocolbuffers/protobuf) from 3.21.8 to 3.21.9.
    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.google.protobuf:protobuf-java&package-manager=gradle&previous-version=3.21.8&new-version=3.21.9)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4285 Reviewed By: antonk52 Differential Revision: D41578633 Pulled By: mweststrate fbshipit-source-id: e908148ff6d686655f56f2912cac8c044da0dbf2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a36b9bda1..52b3ada76 100644 --- a/build.gradle +++ b/build.gradle @@ -104,7 +104,7 @@ ext.deps = [ okhttp3 : 'com.squareup.okhttp3:okhttp:4.9.3', leakcanary : 'com.squareup.leakcanary:leakcanary-android:1.6.3', leakcanary2 : 'com.squareup.leakcanary:leakcanary-android:2.8.1', - protobuf : 'com.google.protobuf:protobuf-java:3.21.8', + protobuf : 'com.google.protobuf:protobuf-java:3.21.9', testCore : 'androidx.test:core:1.4.0', testRules : 'androidx.test:rules:1.5.0', // Plugin dependencies From 6a9f2de29a37bd0546754c989567822de22b2a7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0366/1651] Bump ws from 8.9.0 to 8.11.0 in /js/js-flipper (#4295) Summary: Bumps [ws](https://github.com/websockets/ws) from 8.9.0 to 8.11.0.
    Release notes

    Sourced from ws's releases.

    8.11.0

    Features

    • WebSocket.prototype.addEventListener() now supports an event listener specified as an object with a handleEvent() method. (9ab743aa).

    Bug fixes

    • WebSocket.prototype.addEventListener() now adds an event listener only if it is not already in the list of the event listeners for the specified event type (1cec17da).

    8.10.0

    Features

    • Added an export for package.json (211d5d38).
    Commits
    • afd8c62 [dist] 8.11.0
    • 1cec17d [fix] Add the same event listener only once
    • 9ab743a [feature] Add support for objets with a handleEvent() method
    • 38f7879 [ci] Test on node 19
    • cdca711 [dist] 8.10.0
    • 211d5d3 [pkg] Add package.json export
    • c4d6eb3 [ci] Do not use the set-output command
    • See full diff in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ws&package-manager=npm_and_yarn&previous-version=8.9.0&new-version=8.11.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4295 Reviewed By: antonk52 Differential Revision: D41578630 Pulled By: mweststrate fbshipit-source-id: 3db16f5a08f717736a38969cb7a93d613a4af727 --- js/js-flipper/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/js-flipper/yarn.lock b/js/js-flipper/yarn.lock index 50ea264d6..5e262bd36 100644 --- a/js/js-flipper/yarn.lock +++ b/js/js-flipper/yarn.lock @@ -3806,9 +3806,9 @@ write-file-atomic@^4.0.1: signal-exit "^3.0.7" ws@^8.5.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e" - integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg== + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== y18n@^5.0.5: version "5.0.8" From c8a22f598e7779efb09e67ff739ccf9f1337400c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0367/1651] Bump @oclif/config from 1.18.3 to 1.18.6 in /desktop (#4301) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [oclif/config](https://github.com/oclif/config) from 1.18.3 to 1.18.6.
    Release notes

    Sourced from @​oclif/config's releases.

    1.18.6

    Bug Fixes

    • deps: bump @​oclif/parser from 3.8.8 to 3.8.9 (6c30537)

    1.18.5

    Bug Fixes

    • deps: bump @​oclif/parser from 3.8.7 to 3.8.8 (b03591e)

    1.18.4

    Bug Fixes

    • deps: bump @​oclif/errors from 1.3.5 to 1.3.6 (8fbab15)
    Changelog

    Sourced from @​oclif/config's changelog.

    Changelog

    All notable changes to this project will be documented in this file. See standard-version for commit guidelines.

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@oclif/config&package-manager=npm_and_yarn&previous-version=1.18.3&new-version=1.18.6)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4301 Reviewed By: antonk52 Differential Revision: D41578628 Pulled By: mweststrate fbshipit-source-id: 100b203984df2589dc088a2e2acea67aef934b8b --- desktop/yarn.lock | 70 ++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/desktop/yarn.lock b/desktop/yarn.lock index 71b3f6d09..b984235db 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -2865,14 +2865,14 @@ tslib "^2.0.0" "@oclif/config@^1", "@oclif/config@^1.18.2": - version "1.18.3" - resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.3.tgz#ddfc144fdab66b1658c2f1b3478fa7fbfd317e79" - integrity sha512-sBpko86IrTscc39EvHUhL+c++81BVTsIZ3ETu/vG+cCdi0N6vb2DoahR67A9FI2CGnxRRHjnTfa3m6LulwNATA== + version "1.18.6" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.6.tgz#37367026b3110a2f04875509b1920a8ee4489f21" + integrity sha512-OWhCpdu4QqggOPX1YPZ4XVmLLRX+lhGjXV6RNA7sogOwLqlEmSslnN/lhR5dkhcWZbKWBQH29YCrB3LDPRu/IA== dependencies: - "@oclif/errors" "^1.3.5" - "@oclif/parser" "^3.8.0" - debug "^4.1.1" - globby "^11.0.1" + "@oclif/errors" "^1.3.6" + "@oclif/parser" "^3.8.9" + debug "^4.3.4" + globby "^11.1.0" is-wsl "^2.1.1" tslib "^2.3.1" @@ -2988,7 +2988,7 @@ qqjs "^0.3.10" tslib "^2.0.3" -"@oclif/errors@1.3.5", "@oclif/errors@^1.3.3", "@oclif/errors@^1.3.5": +"@oclif/errors@1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.3.5.tgz#a1e9694dbeccab10fe2fe15acb7113991bed636c" integrity sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ== @@ -2999,6 +2999,17 @@ strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +"@oclif/errors@^1.3.3", "@oclif/errors@^1.3.5", "@oclif/errors@^1.3.6": + version "1.3.6" + resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.3.6.tgz#e8fe1fc12346cb77c4f274e26891964f5175f75d" + integrity sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ== + dependencies: + clean-stack "^3.0.0" + fs-extra "^8.1" + indent-string "^4.0.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + "@oclif/help@^1.0.0", "@oclif/help@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@oclif/help/-/help-1.0.1.tgz#fd96a3dd9fb2314479e6c8584c91b63754a7dff5" @@ -3019,15 +3030,15 @@ resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91" integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw== -"@oclif/parser@^3.8.0", "@oclif/parser@^3.8.5", "@oclif/parser@^3.8.6": - version "3.8.7" - resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.7.tgz#236d48db05d0b00157d3b42d31f9dac7550d2a7c" - integrity sha512-b11xBmIUK+LuuwVGJpFs4LwQN2xj2cBWj2c4z1FtiXGrJ85h9xV6q+k136Hw0tGg1jQoRXuvuBnqQ7es7vO9/Q== +"@oclif/parser@^3.8.0", "@oclif/parser@^3.8.5", "@oclif/parser@^3.8.6", "@oclif/parser@^3.8.9": + version "3.8.9" + resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.9.tgz#9399041ada7e465043f34b24f4d82a8beb68a023" + integrity sha512-1j/kThdse7yHQz6+c3v8RA1I3gD6+SGt2O7IAb/MAMoxqyBrFQDabQHH2UU4eVFGMLN7U91AiYJp11zJ9LcQAg== dependencies: - "@oclif/errors" "^1.3.5" + "@oclif/errors" "^1.3.6" "@oclif/linewrap" "^1.0.0" chalk "^4.1.0" - tslib "^2.3.1" + tslib "^2.4.1" "@oclif/plugin-help@3.2.18": version "3.2.18" @@ -7373,7 +7384,7 @@ fast-glob@^3.0.3: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.1.1, fast-glob@^3.2.9: +fast-glob@^3.2.9: version "3.2.10" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.10.tgz#2734f83baa7f43b7fd41e13bc34438f4ffe284ee" integrity sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A== @@ -7918,19 +7929,7 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.0.1: - version "11.0.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" - integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -globby@^11.0.4, globby@^11.1.0: +globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -14046,20 +14045,15 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1: +tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^1.9.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.0.tgz#d624983f3e2c5e0b55307c3dd6c86acd737622c6" - integrity sha512-+Zw5lu0D9tvBMjGP8LpvMb0u2WW2QV3y+D8mO6J+cNzCYIN4sVy43Bf9vl92nqFahutN0I8zHa7cc4vihIshnw== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== tsutils@^3.21.0: version "3.21.0" From fa2cadb3f0818bac69688cc1def6231718330d7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0368/1651] Bump react-native-flipper from 0.171.1 to 0.174.0 in /react-native/ReactNativeFlipperExample (#4307) Summary: Bumps [react-native-flipper](https://github.com/facebook/flipper) from 0.171.1 to 0.174.0.
    Release notes

    Sourced from react-native-flipper's releases.

    v0.174.0

    See https://github.com/facebook/flipper/blob/main/desktop/static/CHANGELOG.md for full notes.

    v0.173.0

    See https://github.com/facebook/flipper/blob/main/desktop/static/CHANGELOG.md for full notes.

    v0.172.0

    See https://github.com/facebook/flipper/blob/main/desktop/static/CHANGELOG.md for full notes.

    Commits
    • 019bcae Flipper Release: v0.174.0
    • c8cbdff Upgrade docusaurus plugin
    • a39ffb1 Update link to FlipperLib
    • 7e91661 Add verbose logging for Android cert exchange
    • 2c767e1 Make the universal export work on the older Android devices
    • 26241cf Skip logging data for the 'upload-scibe-logs-event''
    • 2a10885 Make flipper-server-client gracefully handle malformed messages
    • 60a439e Remove window refernce from flipper-server-client
    • 82e5cfd Expose isLoggedIn to plugin creators
    • 2736cfe Dont gitignore website/yarn.lock
    • Additional commits viewable in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=react-native-flipper&package-manager=npm_and_yarn&previous-version=0.171.1&new-version=0.174.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4307 Reviewed By: antonk52 Differential Revision: D41578626 Pulled By: mweststrate fbshipit-source-id: e25c256af3077e344bc31c1ca4bea89a6eeb3f03 --- react-native/ReactNativeFlipperExample/package.json | 2 +- react-native/ReactNativeFlipperExample/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/react-native/ReactNativeFlipperExample/package.json b/react-native/ReactNativeFlipperExample/package.json index 652df65f1..6efddbd09 100644 --- a/react-native/ReactNativeFlipperExample/package.json +++ b/react-native/ReactNativeFlipperExample/package.json @@ -13,7 +13,7 @@ "dependencies": { "react": "^18.0.0", "react-native": "^0.69.0", - "react-native-flipper": "^0.171.1", + "react-native-flipper": "^0.174.0", "react-native-windows": "^0.69.0" }, "devDependencies": { diff --git a/react-native/ReactNativeFlipperExample/yarn.lock b/react-native/ReactNativeFlipperExample/yarn.lock index 76a933734..5ea0cbc2b 100644 --- a/react-native/ReactNativeFlipperExample/yarn.lock +++ b/react-native/ReactNativeFlipperExample/yarn.lock @@ -6110,10 +6110,10 @@ react-native-codegen@^0.69.1, react-native-codegen@^0.69.2: jscodeshift "^0.13.1" nullthrows "^1.1.1" -react-native-flipper@^0.171.1: - version "0.171.1" - resolved "https://registry.yarnpkg.com/react-native-flipper/-/react-native-flipper-0.171.1.tgz#78db3179a7ece62a2af622834867891f658e4b4c" - integrity sha512-L1gYtgjLQDeF4JQTbR6XCEjSKy0ffpZckK0k8/qcjqzwwB/oSgvXZ7UVbotVW0BTIWMUETyR6FX0/ChAurBI9w== +react-native-flipper@^0.174.0: + version "0.174.0" + resolved "https://registry.yarnpkg.com/react-native-flipper/-/react-native-flipper-0.174.0.tgz#acb57d4cea68551edff73c0f17999e519b39614c" + integrity sha512-9WAUxqHLU57dYxD/Z5EkcU/MdP1KFWCxdZfeHJ6Ogq/GbJVawzibjVfGPVwc2GoLIMvE6rZ0Fvvw4AUIdykc/g== react-native-gradle-plugin@^0.0.7: version "0.0.7" From c1d178828202df9adb5eab18d6632aed0cc66248 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0369/1651] Bump eslint from 8.25.0 to 8.28.0 in /js/js-flipper (#4325) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [eslint](https://github.com/eslint/eslint) from 8.25.0 to 8.28.0.
    Release notes

    Sourced from eslint's releases.

    v8.28.0

    Features

    • 63bce44 feat: add ignoreClassFieldInitialValues option to no-magic-numbers (#16539) (Milos Djermanovic)
    • 8385ecd feat: multiline properties in rule key-spacing with option align (#16532) (Francesco Trotta)
    • a4e89db feat: no-obj-calls support Intl (#16543) (Sosuke Suzuki)

    Bug Fixes

    • c50ae4f fix: Ensure that dot files are found with globs. (#16550) (Nicholas C. Zakas)
    • 9432b67 fix: throw error for first unmatched pattern (#16533) (Milos Djermanovic)
    • e76c382 fix: allow * 1 when followed by / in no-implicit-coercion (#16522) (Milos Djermanovic)

    Documentation

    • 34c05a7 docs: Language Options page intro and tweaks (#16511) (Ben Perlmutter)
    • 3e66387 docs: add intro and edit ignoring files page (#16510) (Ben Perlmutter)
    • 436f712 docs: fix Header UI inconsistency (#16464) (Tanuj Kanti)
    • f743816 docs: switch to wrench emoji for auto-fixable rules (#16545) (Bryan Mishkin)
    • bc0547e docs: improve styles for versions and languages page (#16553) (Nitin Kumar)
    • 6070f58 docs: clarify esquery issue workaround (#16556) (Milos Djermanovic)
    • b48e4f8 docs: Command Line Interface intro and tweaks (#16535) (Ben Perlmutter)
    • b92b30f docs: Add Rules page intro and content tweaks (#16523) (Ben Perlmutter)
    • 1769b42 docs: Integrations page introduction (#16548) (Ben Perlmutter)
    • a8d0a57 docs: make table of contents sticky on desktop (#16506) (Sam Chen)
    • a01315a docs: fix route of japanese translation site (#16542) (Tanuj Kanti)
    • 0515628 docs: use emoji instead of svg for deprecated rule (#16536) (Bryan Mishkin)
    • 68f1288 docs: set default layouts (#16484) (Percy Ma)
    • 776827a docs: init config about specifying shared configs (#16483) (Percy Ma)
    • 5c39425 docs: fix broken link to plugins (#16520) (Ádám T. Nagy)
    • c97c789 docs: Add missing no-new-native-nonconstructor docs code fence (#16503) (Brandon Mills)

    Chores

    • e94a4a9 chore: Add tests to verify #16038 is fixed (#16538) (Nicholas C. Zakas)
    • e13f194 chore: stricter validation of meta.docs.description in core rules (#16529) (Milos Djermanovic)
    • 72dbfbc chore: use pkg parameter in getNpmPackageVersion (#16525) (webxmsj)

    v8.27.0

    Features

    • f14587c feat: new no-new-native-nonconstructor rule (#16368) (Sosuke Suzuki)
    • 978799b feat: add new rule no-empty-static-block (#16325) (Sosuke Suzuki)
    • 69216ee feat: no-empty suggest to add comment in empty BlockStatement (#16470) (Nitin Kumar)
    • 319f0a5 feat: use context.languageOptions.ecmaVersion in core rules (#16458) (Milos Djermanovic)

    Bug Fixes

    • c3ce521 fix: Ensure unmatched glob patterns throw an error (#16462) (Nicholas C. Zakas)
    • 886a038 fix: handle files with unspecified path in getRulesMetaForResults (#16437) (Francesco Trotta)

    Documentation

    • ce93b42 docs: Stylelint property-no-unknown (#16497) (Nick Schonning)
    • d2cecb4 docs: Stylelint declaration-block-no-shorthand-property-overrides (#16498) (Nick Schonning)
    • 0a92805 docs: stylelint color-hex-case (#16496) (Nick Schonning)
    • 74a5af4 docs: fix stylelint error (#16491) (Milos Djermanovic)

    ... (truncated)

    Changelog

    Sourced from eslint's changelog.

    v8.28.0 - November 18, 2022

    • 34c05a7 docs: Language Options page intro and tweaks (#16511) (Ben Perlmutter)
    • 3e66387 docs: add intro and edit ignoring files page (#16510) (Ben Perlmutter)
    • 436f712 docs: fix Header UI inconsistency (#16464) (Tanuj Kanti)
    • f743816 docs: switch to wrench emoji for auto-fixable rules (#16545) (Bryan Mishkin)
    • bc0547e docs: improve styles for versions and languages page (#16553) (Nitin Kumar)
    • 6070f58 docs: clarify esquery issue workaround (#16556) (Milos Djermanovic)
    • b48e4f8 docs: Command Line Interface intro and tweaks (#16535) (Ben Perlmutter)
    • b92b30f docs: Add Rules page intro and content tweaks (#16523) (Ben Perlmutter)
    • 1769b42 docs: Integrations page introduction (#16548) (Ben Perlmutter)
    • 63bce44 feat: add ignoreClassFieldInitialValues option to no-magic-numbers (#16539) (Milos Djermanovic)
    • c50ae4f fix: Ensure that dot files are found with globs. (#16550) (Nicholas C. Zakas)
    • a8d0a57 docs: make table of contents sticky on desktop (#16506) (Sam Chen)
    • 9432b67 fix: throw error for first unmatched pattern (#16533) (Milos Djermanovic)
    • 8385ecd feat: multiline properties in rule key-spacing with option align (#16532) (Francesco Trotta)
    • a4e89db feat: no-obj-calls support Intl (#16543) (Sosuke Suzuki)
    • a01315a docs: fix route of japanese translation site (#16542) (Tanuj Kanti)
    • e94a4a9 chore: Add tests to verify #16038 is fixed (#16538) (Nicholas C. Zakas)
    • 0515628 docs: use emoji instead of svg for deprecated rule (#16536) (Bryan Mishkin)
    • e76c382 fix: allow * 1 when followed by / in no-implicit-coercion (#16522) (Milos Djermanovic)
    • 68f1288 docs: set default layouts (#16484) (Percy Ma)
    • e13f194 chore: stricter validation of meta.docs.description in core rules (#16529) (Milos Djermanovic)
    • 776827a docs: init config about specifying shared configs (#16483) (Percy Ma)
    • 72dbfbc chore: use pkg parameter in getNpmPackageVersion (#16525) (webxmsj)
    • 5c39425 docs: fix broken link to plugins (#16520) (Ádám T. Nagy)
    • c97c789 docs: Add missing no-new-native-nonconstructor docs code fence (#16503) (Brandon Mills)

    v8.27.0 - November 6, 2022

    • f14587c feat: new no-new-native-nonconstructor rule (#16368) (Sosuke Suzuki)
    • 978799b feat: add new rule no-empty-static-block (#16325) (Sosuke Suzuki)
    • ce93b42 docs: Stylelint property-no-unknown (#16497) (Nick Schonning)
    • d2cecb4 docs: Stylelint declaration-block-no-shorthand-property-overrides (#16498) (Nick Schonning)
    • 0a92805 docs: stylelint color-hex-case (#16496) (Nick Schonning)
    • c3ce521 fix: Ensure unmatched glob patterns throw an error (#16462) (Nicholas C. Zakas)
    • 74a5af4 docs: fix stylelint error (#16491) (Milos Djermanovic)
    • 69216ee feat: no-empty suggest to add comment in empty BlockStatement (#16470) (Nitin Kumar)
    • 324db1a docs: explicit stylelint color related rules (#16465) (Nick Schonning)
    • 94dc4f1 docs: use Stylelint for HTML files (#16468) (Nick Schonning)
    • cc6128d docs: enable stylelint declaration-block-no-duplicate-properties (#16466) (Nick Schonning)
    • d03a8bf docs: Add heading to justification explanation (#16430) (Maritaria)
    • 886a038 fix: handle files with unspecified path in getRulesMetaForResults (#16437) (Francesco Trotta)
    • 319f0a5 feat: use context.languageOptions.ecmaVersion in core rules (#16458) (Milos Djermanovic)
    • 8a15968 docs: add Stylelint configuration and cleanup (#16379) (Nick Schonning)
    • 9b0a469 docs: note commit messages don't support scope (#16435) (Andy Edwards)
    • 1581405 docs: improve context.getScope() docs (#16417) (Ben Perlmutter)
    • b797149 docs: update formatters template (#16454) (Milos Djermanovic)
    • 5ac4de9 docs: fix link to formatters on the Core Concepts page (#16455) (Vladislav)
    • 33313ef docs: core-concepts: fix link to semi rule (#16453) (coderaiser)

    ... (truncated)

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=eslint&package-manager=npm_and_yarn&previous-version=8.25.0&new-version=8.28.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4325 Reviewed By: antonk52 Differential Revision: D41578623 Pulled By: mweststrate fbshipit-source-id: 7d5ee653760203fdea484093bd61e15e705a25a9 --- js/js-flipper/yarn.lock | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/js/js-flipper/yarn.lock b/js/js-flipper/yarn.lock index 5e262bd36..c39a1b7c1 100644 --- a/js/js-flipper/yarn.lock +++ b/js/js-flipper/yarn.lock @@ -329,14 +329,14 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@humanwhocodes/config-array@^0.10.5": - version "0.10.5" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.5.tgz#bb679745224745fff1e9a41961c1d45a49f81c04" - integrity sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug== +"@humanwhocodes/config-array@^0.11.6": + version "0.11.7" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f" + integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" - minimatch "^3.0.4" + minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" @@ -625,7 +625,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1739,13 +1739,14 @@ eslint-visitor-keys@^3.3.0: integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== eslint@^8.17.0: - version "8.25.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.25.0.tgz#00eb962f50962165d0c4ee3327708315eaa8058b" - integrity sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A== + version "8.28.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" + integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== dependencies: "@eslint/eslintrc" "^1.3.3" - "@humanwhocodes/config-array" "^0.10.5" + "@humanwhocodes/config-array" "^0.11.6" "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -1761,14 +1762,14 @@ eslint@^8.17.0: fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" - glob-parent "^6.0.1" + glob-parent "^6.0.2" globals "^13.15.0" - globby "^11.1.0" grapheme-splitter "^1.0.4" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" + is-path-inside "^3.0.3" js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" @@ -2025,7 +2026,7 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -2274,6 +2275,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -2953,7 +2959,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== From eba5dbd860bd423df70c6d92c460fc4a5cd98eb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0370/1651] Bump @babel/core from 7.19.3 to 7.20.5 in /react-native/ReactNativeFlipperExample (#4336) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.19.3 to 7.20.5.
    Release notes

    Sourced from @​babel/core's releases.

    v7.20.5 (2022-11-28)

    Thanks @​davydof and @​SuperSodaSea for your first PRs!

    :eyeglasses: Spec Compliance

    • babel-helpers, babel-plugin-transform-destructuring, babel-plugin-transform-modules-commonjs, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime, babel-traverse
    • babel-cli, babel-helpers, babel-plugin-proposal-class-properties, babel-plugin-proposal-class-static-block, babel-plugin-transform-classes, babel-plugin-transform-runtime, babel-preset-env
    • babel-helper-create-class-features-plugin, babel-helpers, babel-plugin-proposal-decorators, babel-plugin-proposal-private-property-in-object, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime

    :bug: Bug Fix

    • babel-parser
    • babel-helper-wrap-function, babel-preset-env, babel-traverse
    • babel-plugin-transform-arrow-functions, babel-plugin-transform-parameters, babel-traverse
      • #15163 fix: Throw error when compiling super() in arrow functions with default / rest parameters (@​SuperSodaSea)
    • babel-helpers, babel-node, babel-plugin-proposal-async-generator-functions, babel-plugin-transform-regenerator, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
    • babel-helper-create-regexp-features-plugin
    • babel-parser, babel-types
    • babel-generator
    • babel-plugin-transform-block-scoping, babel-traverse

    :nail_care: Polish

    :house: Internal

    Committers: 6

    ... (truncated)

    Changelog

    Sourced from @​babel/core's changelog.

    v7.20.5 (2022-11-28)

    :eyeglasses: Spec Compliance

    • babel-helpers, babel-plugin-transform-destructuring, babel-plugin-transform-modules-commonjs, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime, babel-traverse
    • babel-cli, babel-helpers, babel-plugin-proposal-class-properties, babel-plugin-proposal-class-static-block, babel-plugin-transform-classes, babel-plugin-transform-runtime, babel-preset-env
    • babel-helper-create-class-features-plugin, babel-helpers, babel-plugin-proposal-decorators, babel-plugin-proposal-private-property-in-object, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime

    :bug: Bug Fix

    • babel-parser
    • babel-helper-wrap-function, babel-preset-env, babel-traverse
    • babel-plugin-transform-arrow-functions, babel-plugin-transform-parameters, babel-traverse
      • #15163 fix: Throw error when compiling super() in arrow functions with default / rest parameters (@​SuperSodaSea)
    • babel-helpers, babel-node, babel-plugin-proposal-async-generator-functions, babel-plugin-transform-regenerator, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
    • babel-helper-create-regexp-features-plugin
    • babel-parser, babel-types
    • babel-generator
    • babel-plugin-transform-block-scoping, babel-traverse

    :nail_care: Polish

    :house: Internal

    v7.20.4 (2022-11-08)

    :bug: Bug Fix

    v7.20.3 (2022-11-07)

    :bug: Bug Fix

    • babel-generator

    ... (truncated)

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@babel/core&package-manager=npm_and_yarn&previous-version=7.19.3&new-version=7.20.5)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4336 Reviewed By: antonk52 Differential Revision: D41578620 Pulled By: mweststrate fbshipit-source-id: 55fb4d5357482140a4a536703cc144c0427fc12d --- .../ReactNativeFlipperExample/package.json | 2 +- .../ReactNativeFlipperExample/yarn.lock | 146 ++++++++---------- 2 files changed, 67 insertions(+), 81 deletions(-) diff --git a/react-native/ReactNativeFlipperExample/package.json b/react-native/ReactNativeFlipperExample/package.json index 6efddbd09..7b2afbf34 100644 --- a/react-native/ReactNativeFlipperExample/package.json +++ b/react-native/ReactNativeFlipperExample/package.json @@ -17,7 +17,7 @@ "react-native-windows": "^0.69.0" }, "devDependencies": { - "@babel/core": "^7.19.3", + "@babel/core": "^7.20.5", "@babel/runtime": "^7.19.4", "babel-jest": "^29.1.2", "jest": "^28.1.3", diff --git a/react-native/ReactNativeFlipperExample/yarn.lock b/react-native/ReactNativeFlipperExample/yarn.lock index 5ea0cbc2b..6b71e5490 100644 --- a/react-native/ReactNativeFlipperExample/yarn.lock +++ b/react-native/ReactNativeFlipperExample/yarn.lock @@ -71,38 +71,38 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== -"@babel/compat-data@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151" - integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== +"@babel/compat-data@^7.20.0": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" + integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" + integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" + "@babel/generator" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.5" + "@babel/parser" "^7.20.5" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.14.0", "@babel/generator@^7.19.3", "@babel/generator@^7.7.2": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59" - integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ== +"@babel/generator@^7.14.0", "@babel/generator@^7.20.5", "@babel/generator@^7.7.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" + integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== dependencies: - "@babel/types" "^7.19.3" + "@babel/types" "^7.20.5" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -128,12 +128,12 @@ "@babel/helper-explode-assignable-expression" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4", "@babel/helper-compilation-targets@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" - integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4", "@babel/helper-compilation-targets@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== dependencies: - "@babel/compat-data" "^7.19.3" + "@babel/compat-data" "^7.20.0" "@babel/helper-validator-option" "^7.18.6" browserslist "^4.21.3" semver "^6.3.0" @@ -273,19 +273,19 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.18.0", "@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== +"@babel/helper-module-transforms@^7.18.0", "@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" "@babel/helper-optimise-call-expression@^7.15.4": version "7.15.4" @@ -362,12 +362,12 @@ dependencies: "@babel/types" "^7.18.2" -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": version "7.15.4" @@ -397,10 +397,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-validator-identifier@^7.18.6": version "7.18.6" @@ -442,14 +442,14 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helpers@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" - integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== +"@babel/helpers@^7.20.5": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" + integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== dependencies: "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" "@babel/highlight@^7.18.6": version "7.18.6" @@ -460,10 +460,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.3.tgz#8dd36d17c53ff347f9e55c328710321b49479a9a" - integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" + integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== "@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.16.8" @@ -953,28 +953,28 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.2", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3", "@babel/traverse@^7.7.2": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4" - integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== +"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.2", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.7.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" + integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" + "@babel/generator" "^7.20.5" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/parser" "^7.20.5" + "@babel/types" "^7.20.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.18.10", "@babel/types@^7.18.2", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624" - integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw== +"@babel/types@^7.0.0", "@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.18.10", "@babel/types@^7.18.2", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" + integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== dependencies: - "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" @@ -2824,14 +2824,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^4.1.0, debug@^4.1.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -6608,14 +6601,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2, semver@^7.3.5: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.7: +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== From f488ada3ca7405f94f90516254d81d7efe506f42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0371/1651] Bump serde from 1.0.147 to 1.0.148 in /packer (#4337) Summary: Bumps [serde](https://github.com/serde-rs/serde) from 1.0.147 to 1.0.148.
    Release notes

    Sourced from serde's releases.

    v1.0.148

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.147&new-version=1.0.148)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4337 Reviewed By: antonk52 Differential Revision: D41578618 Pulled By: mweststrate fbshipit-source-id: 770095ae88e03f7389251b967fa53013607950e4 --- packer/Cargo.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packer/Cargo.lock b/packer/Cargo.lock index d2f6e503d..9e84c9610 100644 --- a/packer/Cargo.lock +++ b/packer/Cargo.lock @@ -486,11 +486,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -631,18 +631,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.147" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" +checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.147" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" +checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c" dependencies = [ "proc-macro2", "quote", @@ -701,13 +701,13 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.91" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +checksum = "4ae548ec36cf198c0ef7710d3c230987c2d6d7bd98ad6edc0274462724c585ce" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -792,10 +792,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-ident" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" [[package]] name = "unsafe-libyaml" From 546e0446127569bab71c3efe4e8c43eef67a8b1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0372/1651] Bump mockito-core from 4.8.1 to 4.9.0 (#4338) Summary: Bumps [mockito-core](https://github.com/mockito/mockito) from 4.8.1 to 4.9.0.
    Release notes

    Sourced from mockito-core's releases.

    v4.9.0

    Changelog generated by Shipkit Changelog Gradle Plugin

    4.9.0

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.mockito:mockito-core&package-manager=gradle&previous-version=4.8.1&new-version=4.9.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4338 Reviewed By: antonk52 Differential Revision: D41578613 Pulled By: mweststrate fbshipit-source-id: d22c242734f078f80c393524b50e2b9e5c54fb0c --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 52b3ada76..490779d7c 100644 --- a/build.gradle +++ b/build.gradle @@ -100,7 +100,7 @@ ext.deps = [ robolectric : 'org.robolectric:robolectric:4.9', junit : 'junit:junit:4.13.2', hamcrest : 'org.hamcrest:hamcrest-library:2.2', - mockito : 'org.mockito:mockito-core:4.8.1', + mockito : 'org.mockito:mockito-core:4.9.0', okhttp3 : 'com.squareup.okhttp3:okhttp:4.9.3', leakcanary : 'com.squareup.leakcanary:leakcanary-android:1.6.3', leakcanary2 : 'com.squareup.leakcanary:leakcanary-android:2.8.1', From 659405411d6ade30baf605cdd3ba4551cdedcdac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0373/1651] Bump runner from 1.4.0 to 1.5.1 (#4339) Summary: Bumps runner from 1.4.0 to 1.5.1. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=androidx.test:runner&package-manager=gradle&previous-version=1.4.0&new-version=1.5.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4339 Reviewed By: antonk52 Differential Revision: D41578611 Pulled By: mweststrate fbshipit-source-id: 4622332d9332e8858345538c077a0177a184bfdc --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 490779d7c..12ec252b7 100644 --- a/build.gradle +++ b/build.gradle @@ -65,7 +65,7 @@ ext.deps = [ supportSqlite : "androidx.sqlite:sqlite-framework:2.2.0", supportEspresso : 'androidx.test.espresso:espresso-core:3.4.0', supportEspressoIntents : 'androidx.test.espresso:espresso-intents:3.5.0', - supportTestRunner : 'androidx.test:runner:1.4.0', + supportTestRunner : 'androidx.test:runner:1.5.1', // Arch archPaging : 'android.arch.paging:runtime:1.0.1', // First-party From e5d75506c4a68020d6fe55dbe66a715440edc0a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0374/1651] Bump espresso-core from 3.4.0 to 3.5.0 (#4340) Summary: Bumps espresso-core from 3.4.0 to 3.5.0. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=androidx.test.espresso:espresso-core&package-manager=gradle&previous-version=3.4.0&new-version=3.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4340 Reviewed By: antonk52 Differential Revision: D41578610 Pulled By: mweststrate fbshipit-source-id: 4326d9d752fd8dec2f7b284be7c006289add212c --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 12ec252b7..e1f178e86 100644 --- a/build.gradle +++ b/build.gradle @@ -63,7 +63,7 @@ ext.deps = [ supportRecyclerView: "androidx.recyclerview:recyclerview:$ANDROIDX_VERSION", supportConstraintLayout: "androidx.constraintlayout:constraintlayout:2.1.4", supportSqlite : "androidx.sqlite:sqlite-framework:2.2.0", - supportEspresso : 'androidx.test.espresso:espresso-core:3.4.0', + supportEspresso : 'androidx.test.espresso:espresso-core:3.5.0', supportEspressoIntents : 'androidx.test.espresso:espresso-intents:3.5.0', supportTestRunner : 'androidx.test:runner:1.5.1', // Arch From 69b737381c7eb3fd05530f30955e7fc4410c170b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0375/1651] Bump @oclif/plugin-warn-if-update-available from 2.0.4 to 2.0.14 in /desktop (#4341) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [oclif/plugin-warn-if-update-available](https://github.com/oclif/plugin-warn-if-update-available) from 2.0.4 to 2.0.14.
    Release notes

    Sourced from @​oclif/plugin-warn-if-update-available's releases.

    2.0.14

    Bug Fixes

    • deps: bump @​oclif/core from 1.20.3 to 1.20.4 (10fff9a)

    2.0.13

    Bug Fixes

    • deps: bump @​oclif/core from 1.20.0 to 1.20.3 (56c514e)

    2.0.12

    Bug Fixes

    • deps: bump async from 2.6.3 to 2.6.4 (3536f48)

    2.0.11

    Bug Fixes

    • deps: bump @​oclif/core from 1.19.1 to 1.20.0 (f1a4173)

    2.0.10

    Bug Fixes

    • deps: bump @​oclif/core from 1.18.0 to 1.19.1 (388b410)

    2.0.9

    Bug Fixes

    • deps: bump @​oclif/core from 1.16.5 to 1.18.0 (0e252b2)

    2.0.8

    Bug Fixes

    • deps: bump semver from 7.3.7 to 7.3.8 (02ec356)

    2.0.7

    Bug Fixes

    • deps: bump @​oclif/core from 1.16.4 to 1.16.5 (1a81356)

    2.0.6

    Bug Fixes

    • deps: bump moment from 2.29.2 to 2.29.4 (51c59d5)

    2.0.5

    Bug Fixes

    • deps: bump @​oclif/core from 1.1.1 to 1.16.4 (b8808ca)
    Changelog

    Sourced from @​oclif/plugin-warn-if-update-available's changelog.

    Changelog

    All notable changes to this project will be documented in this file. See standard-version for commit guidelines.

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@oclif/plugin-warn-if-update-available&package-manager=npm_and_yarn&previous-version=2.0.4&new-version=2.0.14)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4341 Reviewed By: antonk52 Differential Revision: D41578608 Pulled By: mweststrate fbshipit-source-id: 71066c6c1b62bcd23f4943ea7d028d939c29cd61 --- desktop/pkg/package.json | 2 +- desktop/yarn.lock | 144 +++++++-------------------------------- 2 files changed, 24 insertions(+), 122 deletions(-) diff --git a/desktop/pkg/package.json b/desktop/pkg/package.json index cec3efc68..d2eea5e21 100644 --- a/desktop/pkg/package.json +++ b/desktop/pkg/package.json @@ -16,7 +16,7 @@ "@oclif/config": "^1", "@oclif/parser": "^3.8.5", "@oclif/plugin-help": "^5.1.12", - "@oclif/plugin-warn-if-update-available": "^2.0.3", + "@oclif/plugin-warn-if-update-available": "^2.0.14", "ajv": "^6.12.2", "ajv-errors": "^1.0.1", "cli-ux": "^6.0.9", diff --git a/desktop/yarn.lock b/desktop/yarn.lock index b984235db..ef5eb5e50 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -2876,78 +2876,20 @@ is-wsl "^2.1.1" tslib "^2.3.1" -"@oclif/core@^1.0.8": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@oclif/core/-/core-1.0.11.tgz#5ad1258c0c756073744ac8b9403e9314757d949f" - integrity sha512-CQw9dbzh+BTF73cp53mnDZnTJF4hth7oab761Si4pEW18PDYDLyOv7TnEtJkvPu4rlTaGBh2jge9BDXgwye4vQ== +"@oclif/core@^1.1.1", "@oclif/core@^1.20.4", "@oclif/core@^1.3.6": + version "1.20.4" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-1.20.4.tgz#7378b52e1f1b502e383ffb07f95dffc9fd8588ff" + integrity sha512-giug32M4YhSYNYKQwE1L57/+k5gp1+Bq3/0vKNQmzAY1tizFGhvBJc6GIRZasHjU+xtZLutQvrVrJo7chX3hxg== dependencies: "@oclif/linewrap" "^1.0.0" - chalk "^4.1.2" - clean-stack "^3.0.1" - cli-ux "6.0.5" - debug "^4.3.3" - fs-extra "^9.1.0" - get-package-type "^0.1.0" - globby "^11.0.4" - indent-string "^4.0.0" - is-wsl "^2.2.0" - lodash "^4.17.21" - semver "^7.3.5" - string-width "^4.2.3" - strip-ansi "^6.0.1" - tslib "^2.3.1" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - -"@oclif/core@^1.1.1": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@oclif/core/-/core-1.3.4.tgz#80c8c24f2f5fc82b913703b7226200cdd941416d" - integrity sha512-IqwfP1qHJ7V6LXxyCBBX12T0vNvrcK9Mlxv0xyt+snhslwThBXJY09umWcQJhWe+vxA8Y/mihB1bUkfURd2P2A== - dependencies: - "@oclif/linewrap" "^1.0.0" - "@oclif/screen" "^3.0.2" - ansi-escapes "^4.3.0" - ansi-styles "^4.2.0" - cardinal "^2.1.1" - chalk "^4.1.2" - clean-stack "^3.0.1" - cli-progress "^3.10.0" - debug "^4.3.3" - ejs "^3.1.6" - fs-extra "^9.1.0" - get-package-type "^0.1.0" - globby "^11.0.4" - hyperlinker "^1.0.0" - indent-string "^4.0.0" - is-wsl "^2.2.0" - js-yaml "^3.13.1" - lodash "^4.17.21" - natural-orderby "^2.0.3" - object-treeify "^1.1.4" - password-prompt "^1.1.2" - semver "^7.3.5" - string-width "^4.2.3" - strip-ansi "^6.0.1" - supports-color "^8.1.1" - supports-hyperlinks "^2.2.0" - tslib "^2.3.1" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - -"@oclif/core@^1.3.6": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@oclif/core/-/core-1.6.0.tgz#a91333275cd43a49097158f4ae8e15ccf718bd48" - integrity sha512-JHerjgRd29EtUVpDIrzohq2XdxJfgmZVGHAFlf75QVhLGFaleopZAQNBXkHkxG//kGib0LhyVGW7azcFKzr1eQ== - dependencies: - "@oclif/linewrap" "^1.0.0" - "@oclif/screen" "^3.0.2" + "@oclif/screen" "^3.0.3" ansi-escapes "^4.3.2" ansi-styles "^4.3.0" cardinal "^2.1.1" chalk "^4.1.2" clean-stack "^3.0.1" cli-progress "^3.10.0" - debug "^4.3.3" + debug "^4.3.4" ejs "^3.1.6" fs-extra "^9.1.0" get-package-type "^0.1.0" @@ -2956,16 +2898,15 @@ indent-string "^4.0.0" is-wsl "^2.2.0" js-yaml "^3.14.1" - lodash "^4.17.21" natural-orderby "^2.0.3" object-treeify "^1.1.33" password-prompt "^1.1.2" - semver "^7.3.5" + semver "^7.3.7" string-width "^4.2.3" strip-ansi "^6.0.1" supports-color "^8.1.1" supports-hyperlinks "^2.2.0" - tslib "^2.3.1" + tslib "^2.4.1" widest-line "^3.1.0" wrap-ansi "^7.0.0" @@ -3064,28 +3005,28 @@ dependencies: "@oclif/core" "^1.3.6" -"@oclif/plugin-warn-if-update-available@^2.0.3": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-2.0.4.tgz#3d509ca2394cccf65e6622be812d7be4065a60aa" - integrity sha512-9dprC1CWPjesg0Vf/rDSQH2tzJXhP1ow84cb2My1kj6e6ESulPKpctiCFSZ1WaCQFfq+crKhzlNoP/vRaXNUAg== +"@oclif/plugin-warn-if-update-available@^2.0.14": + version "2.0.14" + resolved "https://registry.yarnpkg.com/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-2.0.14.tgz#f9142095f13c5e8300705533165ae039daa0c5f8" + integrity sha512-gEgFZuNtFx3yPfSuxhAm9F8nLZ4+UnBJhbjTywY0Cvrqvd+OvKvo6PfwRm0lWmH4EgWwQEq39pfaks1fg+y1gw== dependencies: - "@oclif/core" "^1.0.8" + "@oclif/core" "^1.20.4" chalk "^4.1.0" debug "^4.1.0" fs-extra "^9.0.1" http-call "^5.2.2" lodash "^4.17.21" - semver "^7.3.2" + semver "^7.3.8" "@oclif/screen@^1.0.4", "@oclif/screen@^1.0.4 ": version "1.0.4" resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-1.0.4.tgz#b740f68609dfae8aa71c3a6cab15d816407ba493" integrity sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw== -"@oclif/screen@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-3.0.2.tgz#969054308fe98d130c02844a45cc792199b75670" - integrity sha512-S/SF/XYJeevwIgHFmVDAFRUvM3m+OjhvCAYMk78ZJQCYCQ5wS7j+LTt1ZEv2jpEEGg2tx/F6TYYWxddNAYHrFQ== +"@oclif/screen@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-3.0.3.tgz#e679ad10535e31d333f809f7a71335cc9aef1e55" + integrity sha512-KX8gMYA9ujBPOd1HFsV9e0iEx7Uoj8AG/3YsW4TtWQTg4lJvr82qNm7o/cFQfYRIt+jw7Ew/4oL4A22zOT+IRA== "@reach/observe-rect@^1.1.0", "@reach/observe-rect@^1.2.0": version "1.2.0" @@ -5384,14 +5325,6 @@ cli-progress@^3.4.0: colors "^1.1.2" string-width "^2.1.1" -cli-progress@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.9.1.tgz#a22eba6a20f53289fdd05d5ee8cb2cc8c28f866e" - integrity sha512-AXxiCe2a0Lm0VN+9L0jzmfQSkcZm5EYspfqXKaSIQKqIk+0hnkZ3/v1E9B39mkD6vYhKih3c/RPsJBSwq9O99Q== - dependencies: - colors "^1.1.2" - string-width "^4.2.0" - cli-spinners@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" @@ -5437,37 +5370,6 @@ cli-ux@5.6.7: supports-hyperlinks "^2.1.0" tslib "^2.0.0" -cli-ux@6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-6.0.5.tgz#5461dffb6c29e4a727e071f8b74bbebcc6b7be08" - integrity sha512-q2pvzDiXMNISMqCBh0P2dkofQ/8OiWlEAjl6MDNk5oUZ6p54Fnk1rOaXxohYm+YkLX5YNUonGOrwkvuiwVreIg== - dependencies: - "@oclif/core" "^1.0.8" - "@oclif/linewrap" "^1.0.0" - "@oclif/screen" "^1.0.4 " - ansi-escapes "^4.3.0" - ansi-styles "^4.2.0" - cardinal "^2.1.1" - chalk "^4.1.0" - clean-stack "^3.0.0" - cli-progress "^3.9.1" - extract-stack "^2.0.0" - fs-extra "^8.1" - hyperlinker "^1.0.0" - indent-string "^4.0.0" - is-wsl "^2.2.0" - js-yaml "^3.13.1" - lodash "^4.17.21" - natural-orderby "^2.0.1" - object-treeify "^1.1.4" - password-prompt "^1.1.2" - semver "^7.3.2" - string-width "^4.2.0" - strip-ansi "^6.0.0" - supports-color "^8.1.0" - supports-hyperlinks "^2.1.0" - tslib "^2.0.0" - cli-ux@^6.0.9: version "6.0.9" resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-6.0.9.tgz#b5ab690314348b45b2c7458dad7621ae1be7c61d" @@ -5995,7 +5897,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6. dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -13077,10 +12979,10 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" From c4962216b5e70a2c9a09cb9d3322870dba0ca0a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0376/1651] Bump @babel/core from 7.19.3 to 7.20.5 in /js/js-flipper (#4343) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.19.3 to 7.20.5.
    Release notes

    Sourced from @​babel/core's releases.

    v7.20.5 (2022-11-28)

    Thanks @​davydof and @​SuperSodaSea for your first PRs!

    :eyeglasses: Spec Compliance

    • babel-helpers, babel-plugin-transform-destructuring, babel-plugin-transform-modules-commonjs, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime, babel-traverse
    • babel-cli, babel-helpers, babel-plugin-proposal-class-properties, babel-plugin-proposal-class-static-block, babel-plugin-transform-classes, babel-plugin-transform-runtime, babel-preset-env
    • babel-helper-create-class-features-plugin, babel-helpers, babel-plugin-proposal-decorators, babel-plugin-proposal-private-property-in-object, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime

    :bug: Bug Fix

    • babel-parser
    • babel-helper-wrap-function, babel-preset-env, babel-traverse
    • babel-plugin-transform-arrow-functions, babel-plugin-transform-parameters, babel-traverse
      • #15163 fix: Throw error when compiling super() in arrow functions with default / rest parameters (@​SuperSodaSea)
    • babel-helpers, babel-node, babel-plugin-proposal-async-generator-functions, babel-plugin-transform-regenerator, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
    • babel-helper-create-regexp-features-plugin
    • babel-parser, babel-types
    • babel-generator
    • babel-plugin-transform-block-scoping, babel-traverse

    :nail_care: Polish

    :house: Internal

    Committers: 6

    ... (truncated)

    Changelog

    Sourced from @​babel/core's changelog.

    v7.20.5 (2022-11-28)

    :eyeglasses: Spec Compliance

    • babel-helpers, babel-plugin-transform-destructuring, babel-plugin-transform-modules-commonjs, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime, babel-traverse
    • babel-cli, babel-helpers, babel-plugin-proposal-class-properties, babel-plugin-proposal-class-static-block, babel-plugin-transform-classes, babel-plugin-transform-runtime, babel-preset-env
    • babel-helper-create-class-features-plugin, babel-helpers, babel-plugin-proposal-decorators, babel-plugin-proposal-private-property-in-object, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime

    :bug: Bug Fix

    • babel-parser
    • babel-helper-wrap-function, babel-preset-env, babel-traverse
    • babel-plugin-transform-arrow-functions, babel-plugin-transform-parameters, babel-traverse
      • #15163 fix: Throw error when compiling super() in arrow functions with default / rest parameters (@​SuperSodaSea)
    • babel-helpers, babel-node, babel-plugin-proposal-async-generator-functions, babel-plugin-transform-regenerator, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
    • babel-helper-create-regexp-features-plugin
    • babel-parser, babel-types
    • babel-generator
    • babel-plugin-transform-block-scoping, babel-traverse

    :nail_care: Polish

    :house: Internal

    v7.20.4 (2022-11-08)

    :bug: Bug Fix

    v7.20.3 (2022-11-07)

    :bug: Bug Fix

    • babel-generator

    ... (truncated)

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@babel/core&package-manager=npm_and_yarn&previous-version=7.19.3&new-version=7.20.5)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4343 Reviewed By: antonk52 Differential Revision: D41578603 Pulled By: mweststrate fbshipit-source-id: ec699ef855a70161ede191aa4733361235ceb9a5 --- js/js-flipper/yarn.lock | 126 ++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/js/js-flipper/yarn.lock b/js/js-flipper/yarn.lock index c39a1b7c1..fc04c757b 100644 --- a/js/js-flipper/yarn.lock +++ b/js/js-flipper/yarn.lock @@ -17,26 +17,26 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151" - integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== +"@babel/compat-data@^7.20.0": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" + integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.2": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" + integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" + "@babel/generator" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.5" + "@babel/parser" "^7.20.5" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -52,21 +52,21 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.19.3", "@babel/generator@^7.7.2": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59" - integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ== +"@babel/generator@^7.20.5", "@babel/generator@^7.7.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" + integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== dependencies: - "@babel/types" "^7.19.3" + "@babel/types" "^7.20.5" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" - integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== +"@babel/helper-compilation-targets@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== dependencies: - "@babel/compat-data" "^7.19.3" + "@babel/compat-data" "^7.20.0" "@babel/helper-validator-option" "^7.18.6" browserslist "^4.21.3" semver "^6.3.0" @@ -98,31 +98,31 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== +"@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.20.2" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" @@ -131,10 +131,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" @@ -146,14 +146,14 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helpers@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" - integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== +"@babel/helpers@^7.20.5": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" + integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== dependencies: "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" "@babel/highlight@^7.18.6": version "7.18.6" @@ -164,10 +164,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.3.tgz#8dd36d17c53ff347f9e55c328710321b49479a9a" - integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" + integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -284,28 +284,28 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3", "@babel/traverse@^7.7.2": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4" - integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== +"@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.7.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" + integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" + "@babel/generator" "^7.20.5" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/parser" "^7.20.5" + "@babel/types" "^7.20.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624" - integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw== +"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" + integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== dependencies: - "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" From a77a694d71377d8efba882488fe69976fe4f3564 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0377/1651] Bump @typescript-eslint/parser from 5.43.0 to 5.44.0 in /js/js-flipper (#4344) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.43.0 to 5.44.0.
    Release notes

    Sourced from @​typescript-eslint/parser's releases.

    v5.44.0

    5.44.0 (2022-11-21)

    Bug Fixes

    • eslint-plugin: [no-empty-interface] disable autofix for declaration merging with class (#5920) (a4f85b8)
    • eslint-plugin: [no-unnecessary-condition] handle index signature type (#5912) (5baad08)
    • eslint-plugin: [prefer-optional-chain] handle binary expressions in negated or (#5992) (2778ff0)
    • typescript-estree: don't consider a cached program unless it's specified in the current parserOptions.project config (#5999) (530e0e6)

    Features

    • eslint-plugin: [adjacent-overload-signatures] check BlockStatement nodes (#5998) (97d3e56)
    • eslint-plugin: [keyword-spacing] Support spacing in import-type syntax (#5977) (6a735e1)
    • support parsing satisfies operators (#5717) (20d7cae)
    • update to TypeScript 4.9 (#5716) (4d744ea)
    Changelog

    Sourced from @​typescript-eslint/parser's changelog.

    5.44.0 (2022-11-21)

    Note: Version bump only for package @​typescript-eslint/parser

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@typescript-eslint/parser&package-manager=npm_and_yarn&previous-version=5.43.0&new-version=5.44.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4344 Reviewed By: antonk52 Differential Revision: D41578602 Pulled By: mweststrate fbshipit-source-id: 48faee2c57a782d1c6f70f4196dd58d34145944d --- js/js-flipper/yarn.lock | 46 ++++++----------------------------------- 1 file changed, 6 insertions(+), 40 deletions(-) diff --git a/js/js-flipper/yarn.lock b/js/js-flipper/yarn.lock index fc04c757b..32eb99752 100644 --- a/js/js-flipper/yarn.lock +++ b/js/js-flipper/yarn.lock @@ -829,23 +829,15 @@ tsutils "^3.21.0" "@typescript-eslint/parser@^5.27.1": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.43.0.tgz#9c86581234b88f2ba406f0b99a274a91c11630fd" - integrity sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug== + version "5.44.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.44.0.tgz#99e2c710a2252191e7a79113264f438338b846ad" + integrity sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA== dependencies: - "@typescript-eslint/scope-manager" "5.43.0" - "@typescript-eslint/types" "5.43.0" - "@typescript-eslint/typescript-estree" "5.43.0" + "@typescript-eslint/scope-manager" "5.44.0" + "@typescript-eslint/types" "5.44.0" + "@typescript-eslint/typescript-estree" "5.44.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.43.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz#566e46303392014d5d163704724872e1f2dd3c15" - integrity sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw== - dependencies: - "@typescript-eslint/types" "5.43.0" - "@typescript-eslint/visitor-keys" "5.43.0" - "@typescript-eslint/scope-manager@5.44.0": version "5.44.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz#988c3f34b45b3474eb9ff0674c18309dedfc3e04" @@ -864,29 +856,11 @@ debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.43.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.43.0.tgz#e4ddd7846fcbc074325293515fa98e844d8d2578" - integrity sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg== - "@typescript-eslint/types@5.44.0": version "5.44.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.44.0.tgz#f3f0b89aaff78f097a2927fe5688c07e786a0241" integrity sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ== -"@typescript-eslint/typescript-estree@5.43.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz#b6883e58ba236a602c334be116bfc00b58b3b9f2" - integrity sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg== - dependencies: - "@typescript-eslint/types" "5.43.0" - "@typescript-eslint/visitor-keys" "5.43.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - "@typescript-eslint/typescript-estree@5.44.0": version "5.44.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz#0461b386203e8d383bb1268b1ed1da9bc905b045" @@ -914,14 +888,6 @@ eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.43.0": - version "5.43.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz#cbbdadfdfea385310a20a962afda728ea106befa" - integrity sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg== - dependencies: - "@typescript-eslint/types" "5.43.0" - eslint-visitor-keys "^3.3.0" - "@typescript-eslint/visitor-keys@5.44.0": version "5.44.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz#10740dc28902bb903d12ee3a005cc3a70207d433" From ee9b32d4e8b0da516883fd0db965b32f1b850da9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:03 -0800 Subject: [PATCH 0378/1651] Bump prettier from 2.7.1 to 2.8.0 in /js/js-flipper (#4345) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [prettier](https://github.com/prettier/prettier) from 2.7.1 to 2.8.0.
    Release notes

    Sourced from prettier's releases.

    2.8.0

    diff

    🔗 Release note

    Changelog

    Sourced from prettier's changelog.

    2.8.0

    diff

    🔗 Release Notes

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=prettier&package-manager=npm_and_yarn&previous-version=2.7.1&new-version=2.8.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4345 Reviewed By: antonk52 Differential Revision: D41578594 Pulled By: mweststrate fbshipit-source-id: 9810cecba0cdbf68ddef5a5c16a97aaf66f7d3ce --- js/js-flipper/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/js-flipper/yarn.lock b/js/js-flipper/yarn.lock index 32eb99752..5722e1213 100644 --- a/js/js-flipper/yarn.lock +++ b/js/js-flipper/yarn.lock @@ -3227,9 +3227,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + version "2.8.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" + integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== pretty-format@^27.0.0, pretty-format@^27.5.1: version "27.5.1" From 8c6a3a6ab5fdf1a372c8c91bfc6a222e67fb76f5 Mon Sep 17 00:00:00 2001 From: Kevin Strider Date: Thu, 1 Dec 2022 05:16:02 -0800 Subject: [PATCH 0379/1651] Under the Hood - index.md Summary: This diff includes minor changes to the pages within the Under the Hood section of Flipper Docs. Reviewed By: mweststrate Differential Revision: D41582203 fbshipit-source-id: 7e5ebd3c1e37f0544efc9c979ca9092ac947f35c --- docs/internals/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/internals/index.mdx b/docs/internals/index.mdx index c4f4e30f3..2a59429bb 100644 --- a/docs/internals/index.mdx +++ b/docs/internals/index.mdx @@ -9,7 +9,6 @@ This part of the site is for those interested in **how** Flipper works 'under th 'Under the Hood' contains the following topics: * [Contributing to the Codebase](contributing.mdx) - contains information that helps you make contributions to the Flipper codebase. -* [Contributing to the Documentation](documentation-writing-guide.mdx) - contains tips and guidelines on how to create effective documentation that will be valued by your target reader. * [Device Identifiers](device-identifiers.mdx) - details availabe methods for obtaining device identifiers. * [Linters](linters.mdx) - a list of Linters that are used to enforce sustainable coding practices within Flipper. * [Public Flipper Releases](../extending/public-releases.mdx) - the mechanism behind Flipper releases on GitHub. @@ -19,6 +18,7 @@ This part of the site is for those interested in **how** Flipper works 'under th In addition, 'Under the Hood' contains a wide range of internal-only topics (see the NavBar's 'Internal'), such as: +* [Contributing to the Documentation](documentation-writing-guide.mdx) - contains tips and guidelines on how to create effective documentation that will be valued by your target reader. * [Data Pipelines](../fb/data-pipelines.mdx) - information on Deep Dive, Flipper Analytics, Scribe, Error Logging, plus a series of links relating to architecture, Static Docs, and code Pointers. * [Launcher](../fb/hackin-on-launcher.mdx) - details of hacking on Launcher and the LauncherConfig. * [Releases](../fb/Flipper-Release-Cycle.mdx) - information on the Flipper release cycle, the release infrastructure @ Meta, and Flipper fbsource pinning. From b55a35dd0feefb98cf2a09b666d1893b39622e8a Mon Sep 17 00:00:00 2001 From: Kfir Schindelhaim Date: Thu, 1 Dec 2022 13:20:37 -0800 Subject: [PATCH 0380/1651] Rename CKMountable -> RCMountable Summary: ^^ Reviewed By: adamjernst Differential Revision: D41496622 fbshipit-source-id: aa4ce00ef5f05f58935e30d1570fbaa8b57c55d7 --- .../SKComponentLayoutWrapper.mm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.mm index 02b69e012..cb3f1652a 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.mm @@ -23,8 +23,8 @@ static char const kLayoutWrapperKey = ' '; static CK::Optional findFlexboxLayoutParams( - id parent, - id child) { + id parent, + id child) { if ([parent isKindOfClass:[CKFlexboxComponent class]]) { static Ivar ivar = class_getInstanceVariable([CKFlexboxComponent class], "_children"); @@ -59,7 +59,7 @@ static CK::Optional findFlexboxLayoutParams( return cachedWrapper; } } - // TODO: Add support for `CKMountable` components. + // TODO: Add support for `RCMountable` components. CKComponent* component = (CKComponent*)layout.component; CKComponentReuseWrapper* reuseWrapper = CKAnalyticsListenerHelpers::GetReusedNodes(component); From da69299561ab11672c1f0d8e4f8c83caa46be947 Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Thu, 1 Dec 2022 13:57:12 -0800 Subject: [PATCH 0381/1651] Flipper Release: v0.176.0 Summary: Releasing version 0.176.0 Reviewed By: lblasa Differential Revision: D41663132 fbshipit-source-id: e977228577c94c5efd6ad922776dc5c8a88427fc --- desktop/package.json | 2 +- desktop/plugins/public/layout/docs/setup.mdx | 2 +- desktop/plugins/public/leak_canary/docs/setup.mdx | 2 +- desktop/plugins/public/network/docs/setup.mdx | 2 +- docs/getting-started/android-native.mdx | 4 ++-- docs/getting-started/react-native-ios.mdx | 2 +- docs/getting-started/react-native.mdx | 4 ++-- gradle.properties | 2 +- js/js-flipper/package.json | 2 +- react-native/react-native-flipper/package.json | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index c5f40de4a..31d6f3372 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -169,7 +169,7 @@ "npm": "use yarn instead", "yarn": "^1.16" }, - "version": "0.175.0", + "version": "0.176.0", "workspaces": { "packages": [ "scripts", diff --git a/desktop/plugins/public/layout/docs/setup.mdx b/desktop/plugins/public/layout/docs/setup.mdx index 4ab5d5336..67bca96d2 100644 --- a/desktop/plugins/public/layout/docs/setup.mdx +++ b/desktop/plugins/public/layout/docs/setup.mdx @@ -27,7 +27,7 @@ You also need to compile in the `litho-annotations` package, as Flipper reflects ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.175.0' + debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.176.0' debugImplementation 'com.facebook.litho:litho-annotations:0.19.0' // ... } diff --git a/desktop/plugins/public/leak_canary/docs/setup.mdx b/desktop/plugins/public/leak_canary/docs/setup.mdx index 7aa6dcded..c5aa9f5f8 100644 --- a/desktop/plugins/public/leak_canary/docs/setup.mdx +++ b/desktop/plugins/public/leak_canary/docs/setup.mdx @@ -8,7 +8,7 @@ To setup the LeakCan ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.175.0' + debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.176.0' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1' } ``` diff --git a/desktop/plugins/public/network/docs/setup.mdx b/desktop/plugins/public/network/docs/setup.mdx index 8902e387c..93fd3cfd5 100644 --- a/desktop/plugins/public/network/docs/setup.mdx +++ b/desktop/plugins/public/network/docs/setup.mdx @@ -12,7 +12,7 @@ The network plugin is shipped as a separate Maven artifact, as follows: ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.175.0' + debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.176.0' } ``` diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index bac859e72..c4eb7bd27 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -24,10 +24,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.175.0' + debugImplementation 'com.facebook.flipper:flipper:0.176.0' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.175.0' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.176.0' } ``` diff --git a/docs/getting-started/react-native-ios.mdx b/docs/getting-started/react-native-ios.mdx index 454d5783c..b6522fe14 100644 --- a/docs/getting-started/react-native-ios.mdx +++ b/docs/getting-started/react-native-ios.mdx @@ -51,7 +51,7 @@ Add all of the code below to your `ios/Podfile`: platform :ios, '9.0' def flipper_pods() - flipperkit_version = '0.175.0' # should match the version of your Flipper client app + flipperkit_version = '0.176.0' # should match the version of your Flipper client app pod 'FlipperKit', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/FlipperKitLayoutPlugin', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/SKIOSNetworkPlugin', '~>' + flipperkit_version, :configuration => 'Debug' diff --git a/docs/getting-started/react-native.mdx b/docs/getting-started/react-native.mdx index 7864b4bb6..f0bb76204 100644 --- a/docs/getting-started/react-native.mdx +++ b/docs/getting-started/react-native.mdx @@ -34,7 +34,7 @@ Latest version of Flipper requires react-native 0.69+! If you use react-native < Android: -1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.175.0`. +1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.176.0`. 2. Run `./gradlew clean` in the `android` directory. iOS: @@ -44,7 +44,7 @@ react-native version => 0.69.0 2. Run `pod install --repo-update` in the `ios` directory. react-native version < 0.69.0 -1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.175.0' })`. +1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.176.0' })`. 2. Run `pod install --repo-update` in the `ios` directory. ## Manual Setup diff --git a/gradle.properties b/gradle.properties index ce5045c98..88afbd46e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.175.1-SNAPSHOT +VERSION_NAME=0.176.0 GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper diff --git a/js/js-flipper/package.json b/js/js-flipper/package.json index b06e0d578..a79f31e71 100644 --- a/js/js-flipper/package.json +++ b/js/js-flipper/package.json @@ -1,7 +1,7 @@ { "name": "js-flipper", "title": "JS Flipper Bindings for Web-Socket based clients", - "version": "0.175.0", + "version": "0.176.0", "main": "lib/index.js", "browser": { "os": false diff --git a/react-native/react-native-flipper/package.json b/react-native/react-native-flipper/package.json index 02e883e5c..340a3153e 100644 --- a/react-native/react-native-flipper/package.json +++ b/react-native/react-native-flipper/package.json @@ -1,7 +1,7 @@ { "name": "react-native-flipper", "title": "React Native Flipper Bindings", - "version": "0.175.0", + "version": "0.176.0", "description": "Flipper bindings for React Native", "main": "index.js", "types": "index.d.ts", From 904e530f745bf3d9c4f4468ac102577e44c27355 Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Thu, 1 Dec 2022 13:57:12 -0800 Subject: [PATCH 0382/1651] Flipper Snapshot Bump: v0.176.1-SNAPSHOT Summary: Releasing snapshot version 0.176.1-SNAPSHOT Reviewed By: lblasa Differential Revision: D41663133 fbshipit-source-id: c8b496c2b019a887784caf5162b7cf438d508d53 --- docs/getting-started/android-native.mdx | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index c4eb7bd27..5dc2394eb 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -124,10 +124,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.175.1-SNAPSHOT' + debugImplementation 'com.facebook.flipper:flipper:0.176.1-SNAPSHOT' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.175.1-SNAPSHOT' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.176.1-SNAPSHOT' } ``` diff --git a/gradle.properties b/gradle.properties index 88afbd46e..1c243f487 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.176.0 +VERSION_NAME=0.176.1-SNAPSHOT GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper From 73e729852536f207ced1934a05a2efba80c919ec Mon Sep 17 00:00:00 2001 From: Andrey Goncharov Date: Mon, 5 Dec 2022 04:14:34 -0800 Subject: [PATCH 0383/1651] Ignore parameters with pre-filled JSON values Summary: https://fb.workplace.com/groups/flippersupport/permalink/1513232162490770/ Apparently, some apps use JSONs as values for their params Reviewed By: lblasa Differential Revision: D41684474 fbshipit-source-id: 4ab19313ede06b226715a5c398728f0be7feddaf --- .../public/navigation/__tests__/testURI.node.tsx | 8 ++++++++ desktop/plugins/public/navigation/util/uri.tsx | 12 ++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/desktop/plugins/public/navigation/__tests__/testURI.node.tsx b/desktop/plugins/public/navigation/__tests__/testURI.node.tsx index 8bac54e30..78eb83048 100644 --- a/desktop/plugins/public/navigation/__tests__/testURI.node.tsx +++ b/desktop/plugins/public/navigation/__tests__/testURI.node.tsx @@ -28,6 +28,14 @@ test('parse required numeric parameters from uri', () => { expect(getRequiredParameters(testURI)).toEqual(expectedResult); }); +// https://fb.workplace.com/groups/flippersupport/permalink/1513232162490770/ +test('ignore params with JSON values', () => { + const testURI = + 'fb://test_uri/?parameter1={"test":"value"}¶meter2="{\\"test\\":\\"value\\"}"'; + const expectedResult: string[] = []; + expect(getRequiredParameters(testURI)).toEqual(expectedResult); +}); + test('replace required parameters with values', () => { const testURI = 'fb://test_uri/?parameter1={parameter1}¶meter2={parameter2}'; diff --git a/desktop/plugins/public/navigation/util/uri.tsx b/desktop/plugins/public/navigation/util/uri.tsx index 69b9996bd..fae2610f3 100644 --- a/desktop/plugins/public/navigation/util/uri.tsx +++ b/desktop/plugins/public/navigation/util/uri.tsx @@ -60,12 +60,20 @@ export const replaceRequiredParametersWithValues = ( }; export const getRequiredParameters = (uri: string) => { - const parameterRegExp = /{[^?]*?}/g; + // Add = to the matching group to filter out stringified JSON parameters + const parameterRegExp = /={[^?]*?}/g; const matches: Array = []; let match = parameterRegExp.exec(uri); while (match != null) { if (match[0]) { - matches.push(match[0]); + // Remove = from the match + const target = match[0].substring(1); + try { + // If the value could be parsed asa valid JSON, ignore it + JSON.parse(target); + } catch { + matches.push(target); + } } match = parameterRegExp.exec(uri); } From 29e0794ff4880f5aafdeb24831b18d3684aa8b3c Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Mon, 5 Dec 2022 06:17:52 -0800 Subject: [PATCH 0384/1651] Fix advertisement bug Summary: Falsely advertising UIDebugger for iOS devices. Reviewed By: LukeDefeo Differential Revision: D41732451 fbshipit-source-id: 0377da0090c4c7f4d56d8a31a2af35b403b69b8f --- desktop/plugins/public/layout/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/plugins/public/layout/index.tsx b/desktop/plugins/public/layout/index.tsx index bda5d01d5..eb1cd45e2 100644 --- a/desktop/plugins/public/layout/index.tsx +++ b/desktop/plugins/public/layout/index.tsx @@ -331,7 +331,7 @@ export default class LayoutPlugin extends FlipperPlugin< onSuggestUIDebugger = () => { if ( - !getFlipperLib().GK('flipper_ui_debugger') && + !getFlipperLib().GK('flipper_ui_debugger') || this.device.os !== 'Android' ) { return; From 00334acb2bd4c01a0ae65fe48fa904484e150e2e Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 5 Dec 2022 07:07:44 -0800 Subject: [PATCH 0385/1651] Fixing issue where certain activities not tracked Summary: The root view resolver will always find all root views but there was a bug in the listrootviews method. The code was very complex and most of the code seemed to be unneeded. Its now working. The listrootviews method now just returns teh contents of the observable array. The reason we needed this is that Certain activities dont seem to tracked by the listener we add to `registerActivityLifecycleCallbacks` Its as if there is a floating decor with no activity. One example in FB4a is clicking on a notification in the notifications panel Reviewed By: lblasa Differential Revision: D41522791 fbshipit-source-id: b49b0104ddf758f097e1fd3f9ac6588de2d3646e --- .../plugins/uidebugger/core/ApplicationRef.kt | 19 +- .../uidebugger/core/RootViewResolver.kt | 192 ++++++------------ .../descriptors/ApplicationRefDescriptor.kt | 5 +- .../observers/ApplicationTreeObserver.kt | 4 +- .../components/Visualization2D.tsx | 2 +- 5 files changed, 77 insertions(+), 145 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/ApplicationRef.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/ApplicationRef.kt index 06dcacfd1..1886cec59 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/ApplicationRef.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/ApplicationRef.kt @@ -9,31 +9,20 @@ package com.facebook.flipper.plugins.uidebugger.core import android.app.Activity import android.app.Application -import android.view.View class ApplicationRef(val application: Application) { init { ActivityTracker.start(application) } + // the root view resolver will contain all root views 100% It is needed for 2 cases: + // 1. In some cases an activity will not be picked up by the activity tracker, + // the root view resolver will at least find the decor view + // 2. Dialog fragments val rootsResolver: RootViewResolver = RootViewResolver() val activitiesStack: List get() { return ActivityTracker.activitiesStack } - - val rootViews: List - get() { - val activeRootViews = rootsResolver.listActiveRootViews() - activeRootViews?.let { roots -> - val viewRoots: MutableList = ArrayList(roots.size) - for (root in roots) { - viewRoots.add(root.view) - } - return viewRoots - } - - return emptyList() - } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/RootViewResolver.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/RootViewResolver.kt index 07af33820..34961cde6 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/RootViewResolver.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/RootViewResolver.kt @@ -10,7 +10,6 @@ package com.facebook.flipper.plugins.uidebugger.core import android.annotation.SuppressLint import android.os.Build import android.view.View -import android.view.WindowManager import java.lang.reflect.Field import java.lang.reflect.InvocationTargetException import java.lang.reflect.Modifier @@ -31,17 +30,80 @@ import java.lang.reflect.Modifier class RootViewResolver { private var initialized = false private var windowManagerObj: Any? = null - private var viewsField: Field? = null - private var paramsField: Field? = null + private val observableViews: ObservableViewArrayList = ObservableViewArrayList() - class RootView(val view: View, val param: WindowManager.LayoutParams?) interface Listener { fun onRootViewAdded(rootView: View) fun onRootViewRemoved(rootView: View) fun onRootViewsChanged(rootViews: List) } - class ObservableArrayList : ArrayList() { + fun attachListener(listener: Listener?) { + if (Build.VERSION.SDK_INT < 19 || listener == null) { + // We don't have a use for this on older APIs. If you do then modify accordingly :) + return + } + if (!initialized) { + initialize() + } + observableViews?.setListener(listener) + } + + /** + * Lists the active root views in an application at this moment. + * + * @return a list of all the active root views in the application. + * @throws IllegalStateException if invoked from a thread besides the main thread. + */ + fun rootViews(): List { + if (!initialized) { + initialize() + } + return observableViews.toList() + } + + private fun initialize() { + + initialized = true + val accessClass = + if (Build.VERSION.SDK_INT > 16) WINDOW_MANAGER_GLOBAL_CLAZZ else WINDOW_MANAGER_IMPL_CLAZZ + val instanceMethod = if (Build.VERSION.SDK_INT > 16) GET_GLOBAL_INSTANCE else GET_DEFAULT_IMPL + try { + val clazz = Class.forName(accessClass) + val getMethod = clazz.getMethod(instanceMethod) + windowManagerObj = getMethod.invoke(null) + + val viewsField: Field = clazz.getDeclaredField(VIEWS_FIELD) + + viewsField.let { vf -> + vf.isAccessible = true + // Forgive me father for I have sinned... + @SuppressLint("DiscouragedPrivateApi") + val modifiers = Field::class.java.getDeclaredField("accessFlags") + modifiers.isAccessible = true + modifiers.setInt(vf, vf.modifiers and Modifier.FINAL.inv()) + + @Suppress("unchecked_cast") + val currentWindowManagerViews = vf[windowManagerObj] as List + observableViews.addAll(currentWindowManagerViews) + vf[windowManagerObj] = observableViews + } + } catch (ite: InvocationTargetException) {} catch (cnfe: ClassNotFoundException) {} catch ( + nsfe: NoSuchFieldException) {} catch (nsme: NoSuchMethodException) {} catch ( + re: RuntimeException) {} catch (iae: IllegalAccessException) {} + + try {} catch (e: Throwable) {} + } + + companion object { + private const val WINDOW_MANAGER_IMPL_CLAZZ = "android.view.WindowManagerImpl" + private const val WINDOW_MANAGER_GLOBAL_CLAZZ = "android.view.WindowManagerGlobal" + private const val VIEWS_FIELD = "mViews" + private const val GET_DEFAULT_IMPL = "getDefault" + private const val GET_GLOBAL_INSTANCE = "getInstance" + } + + class ObservableViewArrayList : ArrayList() { private var listener: Listener? = null fun setListener(listener: Listener?) { this.listener = listener @@ -75,124 +137,4 @@ class RootViewResolver { return view } } - - fun attachListener(listener: Listener?) { - if (Build.VERSION.SDK_INT < 19 || listener == null) { - // We don't have a use for this on older APIs. If you do then modify accordingly :) - return - } - if (!initialized) { - initialize() - } - try { - viewsField?.let { vf -> - // Forgive me father for I have sinned... - @SuppressLint("DiscouragedPrivateApi") - val modifiers = Field::class.java.getDeclaredField("accessFlags") - modifiers.isAccessible = true - modifiers.setInt(vf, vf.modifiers and Modifier.FINAL.inv()) - - @Suppress("unchecked_cast") val views = vf[windowManagerObj] as List - - val observableViews = ObservableArrayList() - observableViews.setListener(listener) - observableViews.addAll(views) - - vf[windowManagerObj] = observableViews - } - } catch (e: Throwable) {} - } - - /** - * Lists the active root views in an application at this moment. - * - * @return a list of all the active root views in the application. - * @throws IllegalStateException if invoked from a thread besides the main thread. - */ - fun listActiveRootViews(): List? { - if (!initialized) { - initialize() - } - if (null == windowManagerObj) { - return null - } - if (null == viewsField) { - return null - } - if (null == paramsField) { - return null - } - var maybeViews: List? = null - var maybeParams: List? = null - try { - viewsField?.let { field -> - maybeViews = - if (Build.VERSION.SDK_INT < 19) { - @Suppress("unchecked_cast") val arr = field[windowManagerObj] as Array - arr.toList() - } else { - @Suppress("unchecked_cast") - field[windowManagerObj] as List - } - } - - paramsField?.let { field -> - maybeParams = - if (Build.VERSION.SDK_INT < 19) { - @Suppress("unchecked_cast") - val arr = field[windowManagerObj] as Array - arr.toList() - } else { - @Suppress("unchecked_cast") - field[windowManagerObj] as List - } - } - } catch (re: RuntimeException) { - return null - } catch (iae: IllegalAccessException) { - return null - } - - val roots = mutableListOf() - maybeViews?.let { views -> - maybeParams?.let { params -> - if (views.size == params.size) { - for (i in views.indices) { - val view = views[i] - val param = params[i] - roots.add(RootView(view, param)) - } - } - } - } - - return roots - } - - private fun initialize() { - initialized = true - val accessClass = - if (Build.VERSION.SDK_INT > 16) WINDOW_MANAGER_GLOBAL_CLAZZ else WINDOW_MANAGER_IMPL_CLAZZ - val instanceMethod = if (Build.VERSION.SDK_INT > 16) GET_GLOBAL_INSTANCE else GET_DEFAULT_IMPL - try { - val clazz = Class.forName(accessClass) - val getMethod = clazz.getMethod(instanceMethod) - windowManagerObj = getMethod.invoke(null) - viewsField = clazz.getDeclaredField(VIEWS_FIELD) - viewsField?.let { vf -> vf.isAccessible = true } - paramsField = clazz.getDeclaredField(WINDOW_PARAMS_FIELD) - paramsField?.let { pf -> pf.isAccessible = true } - } catch (ite: InvocationTargetException) {} catch (cnfe: ClassNotFoundException) {} catch ( - nsfe: NoSuchFieldException) {} catch (nsme: NoSuchMethodException) {} catch ( - re: RuntimeException) {} catch (iae: IllegalAccessException) {} - } - - companion object { - private const val WINDOW_MANAGER_IMPL_CLAZZ = "android.view.WindowManagerImpl" - private const val WINDOW_MANAGER_GLOBAL_CLAZZ = "android.view.WindowManagerGlobal" - private const val VIEWS_FIELD = "mViews" - private const val WINDOW_PARAMS_FIELD = "mParams" - private const val GET_DEFAULT_IMPL = "getDefault" - private const val GET_GLOBAL_INSTANCE = "getInstance" - } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt index aadf19c8f..7bf0f27af 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt @@ -16,7 +16,8 @@ import com.facebook.flipper.plugins.uidebugger.util.DisplayMetrics object ApplicationRefDescriptor : ChainedDescriptor() { override fun onGetActiveChild(node: ApplicationRef): Any? { - return if (node.activitiesStack.isNotEmpty()) node.activitiesStack.last() else null + val children = onGetChildren(node) + return if (children.isNotEmpty()) children.last() else null } override fun onGetBounds(node: ApplicationRef): Bounds = DisplayMetrics.getDisplayBounds() @@ -31,7 +32,7 @@ object ApplicationRefDescriptor : ChainedDescriptor() { override fun onGetChildren(node: ApplicationRef): List { val children = mutableListOf() - val activeRoots = node.rootViews + val activeRoots = node.rootsResolver.rootViews() val added = mutableSetOf() for (activity: Activity in node.activitiesStack) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/ApplicationTreeObserver.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/ApplicationTreeObserver.kt index 2a719f5f9..dd298da8d 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/ApplicationTreeObserver.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/ApplicationTreeObserver.kt @@ -40,9 +40,9 @@ class ApplicationTreeObserver(val context: Context) : TreeObserver Date: Mon, 5 Dec 2022 07:07:44 -0800 Subject: [PATCH 0386/1651] Android activity tracking uses root view resolver as sole source of truth Summary: The previous approach was to append any 'extra/floating' root view to the end of the childrens for the application descriptor. But the active child was always the last view so if there was a 'floating' decor view with no activity it would always be the active child, even if you opened a real activity from it. This was possible to do in FB4a and you could get into a situation where you couldn't see the top most activity. New approach is to only iterate the root views from the resolver since it contains everything and map to activity if possible. Reviewed By: lblasa Differential Revision: D41731951 fbshipit-source-id: 9ef3fcfdaa41e9b07606ca6781cf22482b54e072 --- .../descriptors/ApplicationRefDescriptor.kt | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt index 7bf0f27af..4a3beadc7 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt @@ -9,6 +9,7 @@ package com.facebook.flipper.plugins.uidebugger.descriptors import android.app.Activity import android.view.View +import android.view.ViewGroup import com.facebook.flipper.plugins.uidebugger.core.ApplicationRef import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.util.DisplayMetrics @@ -34,17 +35,21 @@ object ApplicationRefDescriptor : ChainedDescriptor() { val activeRoots = node.rootsResolver.rootViews() - val added = mutableSetOf() - for (activity: Activity in node.activitiesStack) { - children.add(activity) - added.add(activity.window.decorView) - } + val decorViewToActivity: Map = + node.activitiesStack.toList().map { it.window.decorView to it }.toMap() - // Picks up root views not tied to an activity (dialogs) for (root in activeRoots) { - if (!added.contains(root)) { - children.add(root) - added.add(root) + // if there is an activity for this root view use that, + // if not just return the mystery floating decor view + val activity = decorViewToActivity[root] + if (activity != null) { + children.add(activity) + } else { + if (root is ViewGroup && root.childCount > 0) { + // sometimes there is a root view on top that has no children and we dont want to add + // these as they will become active + children.add(root) + } } } From fdcd3fca1173569b913196785acffc4db921f0b9 Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Mon, 5 Dec 2022 07:57:16 -0800 Subject: [PATCH 0387/1651] Update README (#4350) Summary: Stack created with [Sapling] * __->__ https://github.com/facebook/flipper/issues/4350 Update README Mainly to test out Sapling, but also to get rid of some "recently"s that are not longer all that recent. Pull Request resolved: https://github.com/facebook/flipper/pull/4350 Test Plan: _eyes Reviewed By: antonk52 Differential Revision: D41653401 Pulled By: passy fbshipit-source-id: 39aac6dcd3bb427f93bd725fbb587c8aac7ffba4 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f88415fe..727eed423 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@

    - Flipper (formerly Sonar) is a platform for debugging mobile apps on iOS and Android and, recently, even JS apps in your browser or in Node.js. Visualize, inspect, and control your apps from a simple desktop interface. Use Flipper as is or extend it using the plugin API. + Flipper (formerly Sonar) is a platform for debugging mobile apps on iOS and Android and JS apps in your browser or in Node.js. Visualize, inspect, and control your apps from a simple desktop interface. Use Flipper as is or extend it using the plugin API.

    ![Flipper](website/static/img/inspector.png) From 95a3a3d92291c3964927aad897fdf70f6d8105c6 Mon Sep 17 00:00:00 2001 From: John Knox Date: Tue, 6 Dec 2022 09:38:11 -0800 Subject: [PATCH 0388/1651] Fix style guide internally Summary: The site loads the style guide in an iframe so that it's css is isolated from the main sites styles. But it doesn't know how big to render the iframe, because it doesn't know the size of its contents. Previously, the js running inside the iframe measured itself and then accessed itself using the parents frame and modified it's own size to match. That doesn't work anymore because the iframe isn't allowed to interact directly with its parent. So instead, i'm using message passing. Also changing MutationObserver to ResizeObserver because the former does not always fire when new css gets loaded and applied. Reviewed By: aigoncharov Differential Revision: D41735809 fbshipit-source-id: 9e84a9b20741f5470012e25f240fb6a2b494f7e3 --- website/src/components/StyleGuide.js | 42 +++++++++++++++++----------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/website/src/components/StyleGuide.js b/website/src/components/StyleGuide.js index e805b21ba..46d787a96 100644 --- a/website/src/components/StyleGuide.js +++ b/website/src/components/StyleGuide.js @@ -7,7 +7,7 @@ * @format */ -import React, {useState, useLayoutEffect} from 'react'; +import React, {useLayoutEffect, useEffect, useRef} from 'react'; import { Typography, Button, @@ -33,6 +33,7 @@ import { import {css} from '@emotion/css'; import reactElementToJSXString from 'react-element-to-jsx-string'; import {IFrame} from './IFrame'; +import useBaseUrl from '@docusaurus/useBaseUrl'; const {Title, Text, Link} = Typography; @@ -550,29 +551,25 @@ const DesignComponentDemos = () => ( ); function SandyDesignSystem() { - const [root, setRoot] = useState(null); + const root = useRef(null); + // Whenever layout happens, or if the size of root changes, measure it and send a message to the parent frame. useLayoutEffect(() => { - if (root) { - const iframe = window.parent.document.getElementById('styleguide'); - iframe.style.height = `${root.scrollHeight}px`; + if (root.current) { + const sendUpdate = () => window.postMessage({name: 'setStyleGuideHeight', value: `${root.current.scrollHeight}px`}, '*'); + const observer = new ResizeObserver(() => { + sendUpdate(); + }); + observer.observe(root.current); - const observer = new MutationObserver(() => { - iframe.style.height = `${root.scrollHeight}px`; - }); - observer.observe(root, { - subtree: true, - childList: true, - attributes: true, - characterData: true, - }); + sendUpdate(); return () => observer.disconnect(); } - }, [root]); + }, [root.current]); return ( - +

    Welcome to the Flipper Design System. The Flipper design system is @@ -694,9 +691,20 @@ function SandyDesignSystem() { } export default function DesignSystemFramed() { + // We're displaying the style guide in an iframe to isolate it's styles. + // But we don't know how big it is, so don't know how high to make the iframe to avoid a double scroll bar. + // So lets get the js inside the frame measure itself and post a message to this frame, where we'll then + // adjust the size of the iframe to match. + useEffect(() => { + window.addEventListener("message", (event) => { + if (event.data.name === 'setStyleGuideHeight') { + document.getElementById('styleguide').style.height = event.data.value; + } + }) + }, []) return ( From 999e7d203a87ed3a862deffcd9ad6db0d8ffa9cf Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Tue, 6 Dec 2022 10:00:26 -0800 Subject: [PATCH 0389/1651] Update ui debugger docs Reviewed By: antonk52 Differential Revision: D41768712 fbshipit-source-id: a61c07859cd419b30025f3a07e51d97a90215b7a --- .../public/ui-debugger/docs/overview.mdx | 11 ++++++++++- website/static/img/uidebugger.png | Bin 0 -> 430670 bytes 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 website/static/img/uidebugger.png diff --git a/desktop/plugins/public/ui-debugger/docs/overview.mdx b/desktop/plugins/public/ui-debugger/docs/overview.mdx index 49f24b50c..83ca58456 100644 --- a/desktop/plugins/public/ui-debugger/docs/overview.mdx +++ b/desktop/plugins/public/ui-debugger/docs/overview.mdx @@ -1 +1,10 @@ -This is an experimental plugin in development. Everything will change and comes with no warranty / support guarantees \ No newline at end of file +import useBaseUrl from '@docusaurus/useBaseUrl'; + +The UIDebugger is a replacement for the Layout inspector. It streams the full hierarchy of the running app to flipper desktop in near real time. We display a 2D visualization with all of your view and component bounds overlayed on top. +You can focus on a particular view or component from the context menu. Additionally, you can pause incoming updates to focus on a particular frame. + +You can inspect what views the hierarchy is made up of as well as what properties each view has; this is useful when debugging issues with your product. + +We currently support Native android and [Litho](https://fblitho.com) components, it integrates with these frameworks to present components in the hierarchy just as if they were native views, exposing all the layout properties, props, and state of the components. + +UIDebugger diff --git a/website/static/img/uidebugger.png b/website/static/img/uidebugger.png new file mode 100644 index 0000000000000000000000000000000000000000..190b6ce2b79c182c43c3016be675bd52873fa8a4 GIT binary patch literal 430670 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

    @igB3UK}28+}dU9Adz4cdxm9R%SA;sS*~g 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%0AI$0C84b^9~CVOT6ad7hWsnU+=3 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 z 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

    n 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 OKY7_pGCAi>0{ Date: Wed, 7 Dec 2022 04:27:25 -0800 Subject: [PATCH 0390/1651] Dont show non visible fragments Summary: On messenger they use fragments heavily and for navigation. The hide some views via the fragment but we were using that so we saw a lot of overlapping boxes. Ive added a check for if the fragment isVisible as well as exported some more fragment state Reviewed By: lblasa Differential Revision: D41800223 fbshipit-source-id: fde33c7542f5fa98d8b98e0722d4292f2d1b67d0 --- .../descriptors/FragmentSupportDescriptor.kt | 55 ++++++++++++++++--- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt index a45f9409e..73b50b69a 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt @@ -22,34 +22,75 @@ class FragmentSupportDescriptor(val register: DescriptorRegister) : private var SectionId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) + private var IsInLayout = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "isInLayout") + + private var IsAdded = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "isAdded") + private var IsDetatched = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "isDetached") + private var IsHidden = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "isHidden") + private var IsVisible = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "isVisible") + + private var IsResumed = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "isResumed") + + private var IsMenuVisible = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "isMenuVisible") + + private var Arguements = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "arguements") + override fun onGetName(node: androidx.fragment.app.Fragment): String { return node.javaClass.simpleName } override fun onGetBounds(node: Fragment): Bounds = Bounds(0, 0, 0, 0) - override fun onGetChildren(node: androidx.fragment.app.Fragment): List = - node.view?.let { view -> listOf(view) } ?: listOf() + override fun onGetChildren(node: androidx.fragment.app.Fragment): List { + val view = node.view + return if (view != null && node.isVisible) { + listOf(view) + } else { + listOf() + } + } override fun onGetData( node: androidx.fragment.app.Fragment, attributeSections: MutableMap ) { + + val props = mutableMapOf() + + props[IsInLayout] = InspectableValue.Boolean(node.isInLayout) + props[IsAdded] = InspectableValue.Boolean(node.isAdded) + props[IsDetatched] = InspectableValue.Boolean(node.isDetached) + props[IsHidden] = InspectableValue.Boolean(node.isHidden) + props[IsVisible] = InspectableValue.Boolean(node.isVisible) + props[IsResumed] = InspectableValue.Boolean(node.isResumed) + props[IsMenuVisible] = InspectableValue.Boolean(node.isMenuVisible) + + val arguements = mutableMapOf() val args = node.arguments args?.let { bundle -> - val props = mutableMapOf() for (key in bundle.keySet()) { val metadata = MetadataRegister.get(NAMESPACE, key) val identifier = metadata?.id ?: MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, key) when (val value = bundle[key]) { - is Number -> props[identifier] = InspectableValue.Number(value) - is Boolean -> props[identifier] = InspectableValue.Boolean(value) - is String -> props[identifier] = InspectableValue.Text(value) + is Number -> arguements[identifier] = InspectableValue.Number(value) + is Boolean -> arguements[identifier] = InspectableValue.Boolean(value) + is String -> arguements[identifier] = InspectableValue.Text(value) } } - attributeSections[SectionId] = InspectableObject(props.toMap()) } + if (arguements.size > 0) { + props[Arguements] = InspectableObject(arguements) + } + attributeSections[SectionId] = InspectableObject(props) } } From c238740af1f3f670b6a209a691f0299871bb3ed6 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 7 Dec 2022 04:31:56 -0800 Subject: [PATCH 0391/1651] Add support for non support libarry scroll views Summary: we had special handling previously for nested scrollview and we previously used the indirect approach of asking for the local visible rect. New approach is to get the scroll x from the parent and apply it, will work for all scrolling view and it is a lot clearer what the intention is. Reviewed By: lblasa Differential Revision: D41772106 fbshipit-source-id: 04b5e68ecabd70548e788ed18423a360ce6c3fa7 --- .../uidebugger/descriptors/ViewDescriptor.kt | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt index 4d9fb81c6..50a2823bc 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt @@ -20,7 +20,6 @@ import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.LinearLayout -import androidx.core.widget.NestedScrollView import androidx.viewpager.widget.ViewPager import com.facebook.flipper.plugins.uidebugger.common.* import com.facebook.flipper.plugins.uidebugger.model.* @@ -156,6 +155,8 @@ object ViewDescriptor : ChainedDescriptor() { MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "scale") private val PivotAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "pivot") + private val ScrollAttributeId = + MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "scroll") private val LayoutParamsAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutParams") private val LayoutDirectionAttributeId = @@ -247,28 +248,25 @@ object ViewDescriptor : ChainedDescriptor() { override fun onGetBounds(node: View): Bounds { - if (node.parent is ViewPager) { + val parent = node.parent + if (parent is ViewPager) { // override return Bounds(0, 0, node.width, node.height) } - var offsetX = 0 - var offsetY = 0 - if (node.parent is NestedScrollView) { - /** - * when a node is a child of nested scroll view android does not adjust the left/ top as the - * view scrolls. This seems to be unique to nested scroll view so we have this trick to find - * its actual position. - */ - val localVisible = Rect() - node.getLocalVisibleRect(localVisible) - offsetX = localVisible.left - offsetY = localVisible.top + var xScrollOffset = 0 + var yScrollOffset = 0 + + if (parent is View) { + // NestedScrollView, HorizontalScrollView and ScrollView all set scroll x and y + // we need to account for this in the childs bounds + xScrollOffset = parent.scrollX + yScrollOffset = parent.scrollY } return Bounds( - node.left + node.translationX.toInt() - offsetX, - node.top + node.translationY.toInt() - offsetY, + node.left + node.translationX.toInt() - xScrollOffset, + node.top + node.translationY.toInt() - yScrollOffset, node.width, node.height) } @@ -317,6 +315,8 @@ object ViewDescriptor : ChainedDescriptor() { props[ScaleAttributeId] = InspectableValue.Coordinate(Coordinate(node.scaleX, node.scaleY)) props[PivotAttributeId] = InspectableValue.Coordinate(Coordinate(node.pivotX, node.pivotY)) + props[ScrollAttributeId] = InspectableValue.Coordinate(Coordinate(node.scrollX, node.scrollY)) + props[LayoutParamsAttributeId] = getLayoutParams(node) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { props[LayoutDirectionAttributeId] = LayoutDirectionMapping.toInspectable(node.layoutDirection) From 2b7ceb9407a2a99a51c6a6551b685dbc1945f829 Mon Sep 17 00:00:00 2001 From: Anton Kastritskiy Date: Wed, 7 Dec 2022 05:26:39 -0800 Subject: [PATCH 0392/1651] bump Static Docs Reviewed By: jknoxville Differential Revision: D41800524 fbshipit-source-id: 4dbe0599bb56c857d6b5c064a43cc28ba0f58b04 --- website/package.json | 2 +- website/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/website/package.json b/website/package.json index 494c59e82..de578dcd1 100644 --- a/website/package.json +++ b/website/package.json @@ -19,7 +19,7 @@ "@emotion/styled": "^11.6.0", "@types/fs-extra": "^9.0.13", "antd": "^4.23.4", - "docusaurus-plugin-internaldocs-fb": "1.2.0", + "docusaurus-plugin-internaldocs-fb": "1.2.1", "file-cli": "^1.2.0", "flipper-plugin": "^0.131.1", "fs-extra": "^10.0.0", diff --git a/website/yarn.lock b/website/yarn.lock index 64b571f3b..9911cdc01 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -6040,10 +6040,10 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" -docusaurus-plugin-internaldocs-fb@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/docusaurus-plugin-internaldocs-fb/-/docusaurus-plugin-internaldocs-fb-1.2.0.tgz#343ea373c5c8967312a3df089788bd75331cf67a" - integrity sha512-rycv7z74kkcNdy6FlLytZfwRayIqQYr35nu5nhFoa4G8o0RnrmCeb7SaKAxnvvKx7abjSmX0vibUUf6ziq82VQ== +docusaurus-plugin-internaldocs-fb@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-internaldocs-fb/-/docusaurus-plugin-internaldocs-fb-1.2.1.tgz#8a53abf436e5ca402f1ec47044524600969e4e8a" + integrity sha512-zNEMsHivOvCGnEE0DG51+6fmtvrrR4hpXgi9BDGLQVKGKTjARkQsJQyvaAdGJmYmXT285SItGbOwwW13Gibilg== dependencies: "@mdx-js/mdx" "^2.1.1" "@mdx-js/react" "^1.6.22" From 91effaea44fdb532068e05d27d26a173c9019e56 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Fri, 9 Dec 2022 02:22:28 -0800 Subject: [PATCH 0393/1651] Update SampleSwift as to remove CK dependencies Summary: ^ Reviewed By: LukeDefeo Differential Revision: D41868295 fbshipit-source-id: 52f594fe1817459e99dab25bf9c87eebdef2168e --- iOS/SampleSwift/Podfile | 2 +- iOS/SampleSwift/Podfile.lock | 22 +--- iOS/SampleSwift/SampleSwift/AppDelegate.swift | 13 +- .../SampleSwift/MainStoryBoard.storyboard | 116 ++++++++---------- 4 files changed, 58 insertions(+), 95 deletions(-) diff --git a/iOS/SampleSwift/Podfile b/iOS/SampleSwift/Podfile index 351702af9..d16c3ec13 100644 --- a/iOS/SampleSwift/Podfile +++ b/iOS/SampleSwift/Podfile @@ -7,7 +7,7 @@ target 'SampleSwift' do # See docs/getting-started/ios-native.mdx pod 'FlipperKit', :path => '../../FlipperKit.podspec', :configuration => 'Debug' - pod 'FlipperKit/FlipperKitLayoutComponentKitSupport', :path => '../../FlipperKit.podspec', :configuration => 'Debug' + pod 'FlipperKit/FlipperKitLayoutPlugin', :path => '../../FlipperKit.podspec', :configuration => 'Debug' pod 'FlipperKit/SKIOSNetworkPlugin', :path => '../../FlipperKit.podspec', :configuration => 'Debug' pod 'FlipperKit/FlipperKitUserDefaultsPlugin', :path => '../../FlipperKit.podspec', :configuration => 'Debug' pod 'FlipperKit/FlipperKitExamplePlugin', :path => '../../FlipperKit.podspec', :configuration => 'Debug' diff --git a/iOS/SampleSwift/Podfile.lock b/iOS/SampleSwift/Podfile.lock index 989ee0fdf..fef511755 100644 --- a/iOS/SampleSwift/Podfile.lock +++ b/iOS/SampleSwift/Podfile.lock @@ -1,9 +1,6 @@ PODS: - boost-for-react-native (1.63.0) - CocoaAsyncSocket (7.6.5) - - ComponentKit (0.31): - - RenderCore (= 0.31) - - Yoga (~> 1.14) - Flipper (0.172.0): - Flipper-Folly (~> 2.6) - Flipper-Boost-iOSX (1.76.0.1.11) @@ -38,14 +35,6 @@ PODS: - FlipperKit/FlipperKitExamplePlugin (0.172.0): - FlipperKit/Core - FlipperKit/FlipperKitHighlightOverlay (0.172.0) - - FlipperKit/FlipperKitLayoutComponentKitSupport (0.172.0): - - ComponentKit (= 0.31) - - FlipperKit/Core - - FlipperKit/FlipperKitHighlightOverlay - - FlipperKit/FlipperKitLayoutHelpers - - FlipperKit/FlipperKitLayoutPlugin - - FlipperKit/FlipperKitLayoutTextSearchable - - RenderCore (= 0.31) - FlipperKit/FlipperKitLayoutHelpers (0.172.0): - FlipperKit/Core - FlipperKit/FlipperKitHighlightOverlay @@ -72,7 +61,6 @@ PODS: - FlipperKit/FlipperKitNetworkPlugin - libevent (2.1.12) - OpenSSL-Universal (1.1.1100) - - RenderCore (0.31) - SocketRocket (0.6.0) - Yoga (1.14.0) - YogaKit (1.18.1): @@ -88,7 +76,7 @@ DEPENDENCIES: - Flipper-PeerTalk - FlipperKit (from `../../FlipperKit.podspec`) - FlipperKit/FlipperKitExamplePlugin (from `../../FlipperKit.podspec`) - - FlipperKit/FlipperKitLayoutComponentKitSupport (from `../../FlipperKit.podspec`) + - FlipperKit/FlipperKitLayoutPlugin (from `../../FlipperKit.podspec`) - FlipperKit/FlipperKitUserDefaultsPlugin (from `../../FlipperKit.podspec`) - FlipperKit/SKIOSNetworkPlugin (from `../../FlipperKit.podspec`) - libevent @@ -98,7 +86,6 @@ SPEC REPOS: https://github.com/CocoaPods/Specs: - boost-for-react-native - CocoaAsyncSocket - - ComponentKit - Flipper-Boost-iOSX - Flipper-DoubleConversion - Flipper-Fmt @@ -107,7 +94,6 @@ SPEC REPOS: - Flipper-PeerTalk - libevent - OpenSSL-Universal - - RenderCore - SocketRocket - Yoga - YogaKit @@ -121,7 +107,6 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - ComponentKit: 7bf7048b9814afc6b6641645a14177f95fd9b9ae Flipper: e57750a29313c49b9783a310150053d32b2b2b6f Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30 @@ -132,11 +117,10 @@ SPEC CHECKSUMS: FlipperKit: 02fd59af13a1465d04268cbffe3f93505f0a1dc2 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c - RenderCore: 090beb17b5bff80b86929a7ceb49df789923d23a SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 Yoga: cff67a400f6b74dc38eb0bad4f156673d9aa980c YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: d2f6b1f5f7b3ca7994bb97a2c78943c23570db33 +PODFILE CHECKSUM: d4e5b460eb545e577a9a2a6843c68eb15ea4f4d9 -COCOAPODS: 1.11.3 +COCOAPODS: 1.11.2 diff --git a/iOS/SampleSwift/SampleSwift/AppDelegate.swift b/iOS/SampleSwift/SampleSwift/AppDelegate.swift index 304445eb1..775e8150c 100644 --- a/iOS/SampleSwift/SampleSwift/AppDelegate.swift +++ b/iOS/SampleSwift/SampleSwift/AppDelegate.swift @@ -5,27 +5,24 @@ * LICENSE file in the root directory of this source tree. */ -import UIKit import FlipperKit +import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window = UIWindow() let client = FlipperClient.shared() let layoutDescriptorMapper = SKDescriptorMapper(defaults: ()) - // If you want to debug componentkit view in swift, otherwise you can ignore the next line - FlipperKitLayoutComponentKitSupport.setUpWith(layoutDescriptorMapper) - client?.add(FlipperKitLayoutPlugin(rootNode: application, with: layoutDescriptorMapper!)) + client?.add(FlipperKitLayoutPlugin(rootNode: application, with: layoutDescriptorMapper)) client?.add(FlipperKitNetworkPlugin(networkAdapter: SKIOSNetworkAdapter())) - client?.add(FlipperKitExamplePlugin.sharedInstance()); - client?.add(FKUserDefaultsPlugin.init(suiteName: nil)) + client?.add(FlipperKitExamplePlugin.sharedInstance()) + client?.add(FKUserDefaultsPlugin(suiteName: nil)) client?.start() let storyboard = UIStoryboard(name: "MainStoryBoard", bundle: nil) @@ -65,6 +62,4 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } - - } diff --git a/iOS/SampleSwift/SampleSwift/MainStoryBoard.storyboard b/iOS/SampleSwift/SampleSwift/MainStoryBoard.storyboard index 461ded24e..964d913c6 100644 --- a/iOS/SampleSwift/SampleSwift/MainStoryBoard.storyboard +++ b/iOS/SampleSwift/SampleSwift/MainStoryBoard.storyboard @@ -1,11 +1,9 @@ - - - - + + - + @@ -19,10 +17,10 @@ - + - - - - + - - - - + - - + + - @@ -105,16 +89,16 @@ - + - + - + - - - - + - - + - + @@ -249,7 +232,6 @@ - @@ -258,40 +240,40 @@ - + - + - + - - + @@ -299,22 +281,21 @@ - + - - - + - + @@ -353,6 +334,7 @@ + @@ -384,7 +366,6 @@ - @@ -394,10 +375,13 @@ - + - + + + + From 10e415655c8be8533f3e0146bb9a48d726e601a5 Mon Sep 17 00:00:00 2001 From: Andrey Goncharov Date: Fri, 9 Dec 2022 04:06:58 -0800 Subject: [PATCH 0394/1651] Fix table flickering without hiding content Summary: Followup of D39772453 (https://github.com/facebook/flipper/commit/2437aeb3e9b38210bcbdb59c82f0dc97be70e456) Fixes https://fb.workplace.com/groups/flippersupport/permalink/1518236858656967/ 1. Stop using clientWidth and offsetWidth because they have rounding errors 2. Since step 1 did not resolve the issue entirely (for some weird reason I do not really have the capacity now to investigate - my bet it is a rounding error when you sum up doubles) set offset of the table to "scroll" instead of "auto". As a result, it starts rendering space for the scrollbars all the time, but since Flipper is a dev tool it should be fine Reviewed By: antonk52 Differential Revision: D41839402 fbshipit-source-id: cf50eb1600b692d3970003fd1b45b953ee45e3df --- .../__snapshots__/PluginInstaller.node.tsx.snap | 6 ++---- .../src/ui/components/table/ManagedTable.tsx | 5 ++--- .../src/ui/components/table/TableHead.tsx | 14 ++++++++------ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/desktop/flipper-ui-core/src/chrome/plugin-manager/__tests__/__snapshots__/PluginInstaller.node.tsx.snap b/desktop/flipper-ui-core/src/chrome/plugin-manager/__tests__/__snapshots__/PluginInstaller.node.tsx.snap index 601aff55a..890169d2f 100644 --- a/desktop/flipper-ui-core/src/chrome/plugin-manager/__tests__/__snapshots__/PluginInstaller.node.tsx.snap +++ b/desktop/flipper-ui-core/src/chrome/plugin-manager/__tests__/__snapshots__/PluginInstaller.node.tsx.snap @@ -53,7 +53,7 @@ exports[`load PluginInstaller list 1`] = `

    ((props) => ({ - overflow: props.canOverflow ? 'auto' : 'visible', + overflow: props.canOverflow ? 'scroll' : 'visible', flexGrow: 1, height: '100%', })); @@ -715,8 +715,7 @@ export class ManagedTable extends React.Component< horizontallyScrollable={horizontallyScrollable} /> )} - + {this.props.autoHeight ? ( Date: Mon, 12 Dec 2022 05:46:01 -0800 Subject: [PATCH 0395/1651] Fix rebuilding plugins with intern references in dev mode when started as flipper-server Summary: require.resolve conflicts with require monkey patch in flipper-server Reviewed By: mweststrate Differential Revision: D41917678 fbshipit-source-id: 3bcd35ec4090cda85c372f23d6f8d0bcd9e7c74d --- desktop/pkg-lib/src/runBuild.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/desktop/pkg-lib/src/runBuild.tsx b/desktop/pkg-lib/src/runBuild.tsx index f6efab600..77de5cc35 100644 --- a/desktop/pkg-lib/src/runBuild.tsx +++ b/desktop/pkg-lib/src/runBuild.tsx @@ -17,10 +17,12 @@ const resolveFbStubsToFbPlugin: Plugin = { name: 'resolve-fb-stubs-to-fb', setup({onResolve}) { onResolve({filter: /fb-stubs/}, (args) => { + let moduleName = args.path.replace('fb-stubs', 'fb'); + if (!moduleName.endsWith('.tsx')) { + moduleName = `${moduleName}.tsx`; + } return { - path: require.resolve(args.path.replace('fb-stubs', 'fb'), { - paths: [args.resolveDir], - }), + path: path.resolve(args.resolveDir, moduleName), }; }); }, From a6544489f3afa640c252cfdb2ada8fd2962ae709 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0396/1651] Basic new tree implemenation Summary: The old implementation would always rerender on every operation (select, hover etc) and was quite slow for large hierachies Reviewed By: lblasa Differential Revision: D41838166 fbshipit-source-id: 1270841027926440a9c1f1a846d3aedc75ffe8bf --- .../public/ui-debugger/components/Tree.tsx | 14 +- .../public/ui-debugger/components/Tree2.tsx | 152 ++++++++++++++++++ .../public/ui-debugger/components/main.tsx | 3 +- desktop/plugins/public/ui-debugger/index.tsx | 39 ++--- 4 files changed, 174 insertions(+), 34 deletions(-) create mode 100644 desktop/plugins/public/ui-debugger/components/Tree2.tsx diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 0aed68602..009ff10dc 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -41,7 +41,7 @@ export function Tree(props: { onSelectNode: (id: Id) => void; }) { const instance = usePlugin(plugin); - const expandedItems = useValue(instance.uiState.treeState).expandedNodes; + const expandedItems = useValue(instance.uiState.expandedNodes); const focused = useValue(instance.uiState.focusedNode); const items = useMemo( @@ -87,7 +87,7 @@ export function Tree(props: { viewState={{ tree: { focusedItem: head(hoveredNodes), - expandedItems, + expandedItems: [...expandedItems], selectedItems: props.selectedNode ? [props.selectedNode] : [], }, }} @@ -95,15 +95,13 @@ export function Tree(props: { instance.uiState.hoveredNodes.set([item.index]); }} onExpandItem={(item) => { - instance.uiState.treeState.update((draft) => { - draft.expandedNodes.push(item.index); + instance.uiState.expandedNodes.update((draft) => { + draft.add(item.index); }); }} onCollapseItem={(item) => - instance.uiState.treeState.update((draft) => { - draft.expandedNodes = draft.expandedNodes.filter( - (expandedItemIndex) => expandedItemIndex !== item.index, - ); + instance.uiState.expandedNodes.update((draft) => { + draft.delete(item.index); }) } renderItem={renderItem} diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx new file mode 100644 index 000000000..3f97873bc --- /dev/null +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -0,0 +1,152 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ +import {Id, UINode} from '../types'; +import React from 'react'; +import { + HighlightManager, + HighlightProvider, + styled, + theme, + useHighlighter, + usePlugin, + useValue, +} from 'flipper-plugin'; +import {plugin} from '../index'; + +export function Tree2({ + nodes, + rootId, + selectedNode, + onSelectNode, +}: { + nodes: Map; + rootId: Id; + selectedNode?: Id; + onSelectNode: (node?: Id) => void; +}) { + const instance = usePlugin(plugin); + const expandedNodes = useValue(instance.uiState.expandedNodes); + const searchTerm = useValue(instance.uiState.searchTerm); + + const items = toTreeList(nodes, rootId, expandedNodes); + + return ( + +
    + {items.map((treeNode) => ( + + ))} +
    +
    + ); +} + +export type TreeNode = UINode & { + depth: number; +}; + +function TreeItemContainer({ + treeNode, + selectedNode, + hoveredNode, + onSelectNode, +}: { + treeNode: TreeNode; + selectedNode?: Id; + hoveredNode?: Id; + onSelectNode: (node?: Id) => void; +}) { + return ( + { + onSelectNode(treeNode.id); + }} + item={treeNode}> + {/*{arrow}*/} + {defaultIcon(treeNode)} + + + ); +} + +const TreeItem = styled.li<{ + item: TreeNode; + isHovered: boolean; + isSelected: boolean; +}>(({item, isHovered, isSelected}) => ({ + display: 'flex', + alignItems: 'center', + height: '26px', + paddingLeft: `${(item.depth + 1) * renderDepthOffset}px`, + borderWidth: '1px', + borderRadius: '3px', + borderColor: isHovered ? theme.selectionBackgroundColor : 'transparent', + borderStyle: 'solid', + backgroundColor: isSelected ? theme.selectionBackgroundColor : theme.white, +})); + +function HighlightedText(props: {text: string}) { + const highlightManager: HighlightManager = useHighlighter(); + return {highlightManager.render(props.text)}; +} + +function defaultIcon(node: UINode) { + if (node.tags.includes('Litho')) { + return ; + } +} + +const DecorationImage = styled.img({ + height: 12, + marginRight: 5, + width: 12, +}); + +const renderDepthOffset = 4; + +function toTreeList( + nodes: Map, + rootId: Id, + expanded: Set, +): TreeNode[] { + const stack = [[nodes.get(rootId), 0]] as [UINode, number][]; + + const res = [] as TreeNode[]; + + while (stack.length > 0) { + const [cur, depth] = stack.pop()!!; + + res.push({ + ...cur, + depth, + }); + + if (expanded.has(cur.id)) { + for (const childId of cur.children) { + const child = nodes.get(childId); + if (child != null) { + stack.push([child, depth + 1]); + } else { + console.log('null', childId); + } + } + } + } + + return res; +} diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 6166fe97d..05c8512e6 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -20,6 +20,7 @@ import {Inspector} from './sidebar/Inspector'; import {Controls} from './Controls'; import {Input, Spin} from 'antd'; import FeedbackRequest from './fb-stubs/feedback'; +import {Tree2} from './Tree2'; export function Component() { const instance = usePlugin(plugin); @@ -44,7 +45,7 @@ export function Component() { - ; hoveredNodes: Atom; focusedNode: Atom; - treeState: Atom; + expandedNodes: Atom>; }; export function plugin(client: PluginClient) { @@ -84,7 +85,7 @@ export function plugin(client: PluginClient) { searchTerm: createState(''), focusedNode: createState(undefined), - treeState: createState({expandedNodes: []}), + expandedNodes: createState>(new Set()), }; client.onMessage('coordinateUpdate', (event) => { @@ -110,7 +111,7 @@ export function plugin(client: PluginClient) { if (!isPaused) { //When going back to play mode then set the atoms to the live state to rerender the latest //Also need to fixed expanded state for any change in active child state - uiState.treeState.update((draft) => { + uiState.expandedNodes.update((draft) => { liveClientData.nodes.forEach((node) => { collapseinActiveChildren(node, draft); }); @@ -144,10 +145,10 @@ export function plugin(client: PluginClient) { setParentPointers(rootId.get()!!, undefined, draft.nodes); }); - uiState.treeState.update((draft) => { + uiState.expandedNodes.update((draft) => { for (const node of event.nodes) { if (!seenNodes.has(node.id)) { - draft.expandedNodes.push(node.id); + draft.add(node.id); } seenNodes.add(node.id); @@ -193,17 +194,7 @@ function setParentPointers( }); } -function checkFocusedNodeStillActive( - uiState: { - isPaused: Atom; - searchTerm: Atom; - isContextMenuOpen: Atom; - hoveredNodes: Atom; - focusedNode: Atom; - treeState: Atom; - }, - nodes: Map, -) { +function checkFocusedNodeStillActive(uiState: UIState, nodes: Map) { const focusedNodeId = uiState.focusedNode.get(); const focusedNode = focusedNodeId && nodes.get(focusedNodeId); if (focusedNode && !isFocusedNodeAncestryAllActive(focusedNode, nodes)) { @@ -239,16 +230,14 @@ function isFocusedNodeAncestryAllActive( return false; } -function collapseinActiveChildren(node: UINode, draft: TreeState) { +function collapseinActiveChildren(node: UINode, expandedNodes: Draft>) { if (node.activeChild) { - const inactiveChildren = node.children.filter( - (child) => child !== node.activeChild, - ); - - draft.expandedNodes = draft.expandedNodes.filter( - (nodeId) => !inactiveChildren.includes(nodeId), - ); - draft.expandedNodes.push(node.activeChild); + expandedNodes.add(node.activeChild); + for (const child of node.children) { + if (child !== node.activeChild) { + expandedNodes.delete(child); + } + } } } From 2bdb0685317066d17d6ac737e9ab1b0ad5bfd6e7 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0397/1651] Added chevon icon when expanding / collapsing Reviewed By: lblasa Differential Revision: D41838170 fbshipit-source-id: f04438d77445736e45e29e2c46e9e8f8dd0906a8 --- .../public/ui-debugger/components/Tree2.tsx | 51 ++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index 3f97873bc..056ef56ff 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -6,6 +6,7 @@ * * @format */ + import {Id, UINode} from '../types'; import React from 'react'; import { @@ -18,6 +19,7 @@ import { useValue, } from 'flipper-plugin'; import {plugin} from '../index'; +import {Glyph} from 'flipper'; export function Tree2({ nodes, @@ -56,6 +58,7 @@ export function Tree2({ export type TreeNode = UINode & { depth: number; + isExpanded: boolean; }; function TreeItemContainer({ @@ -69,6 +72,7 @@ function TreeItemContainer({ hoveredNode?: Id; onSelectNode: (node?: Id) => void; }) { + const instance = usePlugin(plugin); return ( - {/*{arrow}*/} - {defaultIcon(treeNode)} + { + instance.uiState.expandedNodes.update((draft) => { + if (draft.has(treeNode.id)) { + draft.delete(treeNode.id); + } else { + draft.add(treeNode.id); + } + }); + }} + /> + + {nodeIcon(treeNode)} ); @@ -100,12 +116,29 @@ const TreeItem = styled.li<{ backgroundColor: isSelected ? theme.selectionBackgroundColor : theme.white, })); +function Arrow(props: {onClick: () => void; expanded: boolean}) { + return ( +
    + +
    + ); +} + function HighlightedText(props: {text: string}) { const highlightManager: HighlightManager = useHighlighter(); return {highlightManager.render(props.text)}; } -function defaultIcon(node: UINode) { +function nodeIcon(node: UINode) { if (node.tags.includes('Litho')) { return ; } @@ -122,21 +155,27 @@ const renderDepthOffset = 4; function toTreeList( nodes: Map, rootId: Id, - expanded: Set, + expandedNodes: Set, ): TreeNode[] { - const stack = [[nodes.get(rootId), 0]] as [UINode, number][]; + const root = nodes.get(rootId); + if (root == null) { + return []; + } + const stack = [[root, 0]] as [UINode, number][]; const res = [] as TreeNode[]; while (stack.length > 0) { const [cur, depth] = stack.pop()!!; + const isExpanded = expandedNodes.has(cur.id); res.push({ ...cur, depth, + isExpanded, }); - if (expanded.has(cur.id)) { + if (isExpanded) { for (const childId of cur.children) { const child = nodes.get(childId); if (child != null) { From a2ce6d5aacc8bcfcd2a8f3ea4bcd708a4c8dc743 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0398/1651] Added fast hover to tree Summary: While moving mouse and changing hover state react render is under 1ms due to subscribing to state rather than passing hover as prop to all components Reviewed By: lblasa Differential Revision: D41838168 fbshipit-source-id: c9b3334adc44df5018e0a785684a2883aeb3bab1 --- .../public/ui-debugger/components/Tree2.tsx | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index 056ef56ff..f3064ed04 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -8,7 +8,7 @@ */ import {Id, UINode} from '../types'; -import React from 'react'; +import React, {useEffect, useState} from 'react'; import { HighlightManager, HighlightProvider, @@ -20,6 +20,7 @@ import { } from 'flipper-plugin'; import {plugin} from '../index'; import {Glyph} from 'flipper'; +import {head} from 'lodash'; export function Tree2({ nodes, @@ -42,7 +43,10 @@ export function Tree2({ -
    +
    { + instance.uiState.hoveredNodes.set([]); + }}> {items.map((treeNode) => ( void; }) { const instance = usePlugin(plugin); + const isHovered = useIsHovered(treeNode.id); return ( { + instance.uiState.hoveredNodes.set([treeNode.id]); + }} onClick={() => { onSelectNode(treeNode.id); }} @@ -100,6 +107,27 @@ function TreeItemContainer({ ); } +function useIsHovered(nodeId: Id) { + const instance = usePlugin(plugin); + const [isHovered, setIsHovered] = useState(false); + useEffect(() => { + const listener = (newValue?: Id[], prevValue?: Id[]) => { + //only change state if the prev or next hover state affect us, this avoids rerendering the whole tree for a hover + //change + if (head(prevValue) === nodeId || head(newValue) === nodeId) { + const hovered = head(newValue) === nodeId; + setIsHovered(hovered); + } + }; + instance.uiState.hoveredNodes.subscribe(listener); + return () => { + instance.uiState.hoveredNodes.unsubscribe(listener); + }; + }, [instance.uiState.hoveredNodes, nodeId]); + + return isHovered; +} + const TreeItem = styled.li<{ item: TreeNode; isHovered: boolean; From d61f36a0d21e92b32067293e572a8b2e36205665 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0399/1651] Added basic kb controls to tree Reviewed By: lawrencelomax Differential Revision: D41838171 fbshipit-source-id: 1e89c689b2c371f870b1a3f1c7dd8c611426195a --- .../public/ui-debugger/components/Tree2.tsx | 83 ++++++++++++++++++- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index f3064ed04..a1d057296 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -37,7 +37,9 @@ export function Tree2({ const expandedNodes = useValue(instance.uiState.expandedNodes); const searchTerm = useValue(instance.uiState.searchTerm); - const items = toTreeList(nodes, rootId, expandedNodes); + const treeNodes = toTreeList(nodes, rootId, expandedNodes); + + useKeyboardShortcuts(treeNodes, selectedNode, onSelectNode); return ( { instance.uiState.hoveredNodes.set([]); }}> - {items.map((treeNode) => ( + {treeNodes.map((treeNode) => ( void, +) { + const instance = usePlugin(plugin); + + useEffect(() => { + const listener = (event: KeyboardEvent) => { + switch (event.key) { + case 'ArrowRight': { + event.preventDefault(); + + instance.uiState.expandedNodes.update((draft) => { + if (selectedNode) { + draft.add(selectedNode); + } + }); + + break; + } + case 'ArrowLeft': { + event.preventDefault(); + instance.uiState.expandedNodes.update((draft) => { + if (selectedNode) { + draft.delete(selectedNode); + } + }); + break; + } + + case 'ArrowDown': { + event.preventDefault(); + + const curIdx = treeNodes.findIndex( + (item) => item.id === head(instance.uiState.hoveredNodes.get()), + ); + if (curIdx != -1) { + const nextIdx = curIdx + 1; + if (nextIdx < treeNodes.length) { + const nextNode = treeNodes[nextIdx]; + instance.uiState.hoveredNodes.set([nextNode.id]); + } + } + break; + } + + case 'ArrowUp': { + event.preventDefault(); + + const curIdx = treeNodes.findIndex( + (item) => item.id === head(instance.uiState.hoveredNodes.get()), + ); + if (curIdx != -1) { + const prevIdx = curIdx - 1; + if (prevIdx >= 0) { + const prevNode = treeNodes[prevIdx]; + instance.uiState.hoveredNodes.set([prevNode.id]); + } + } + break; + } + } + }; + window.addEventListener('keydown', listener); + return () => { + window.removeEventListener('keydown', listener); + }; + }, [ + instance.uiState.expandedNodes, + treeNodes, + onSelectNode, + selectedNode, + instance.uiState.hoveredNodes, + ]); +} From 2692476647de0088c2823c9d97878e464d03cb29 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0400/1651] Added scroll into view when when node selected Reviewed By: lblasa Differential Revision: D41838165 fbshipit-source-id: 4b135f9bfaf3ac0dd536ab7250a22dc4e739aed6 --- .../public/ui-debugger/components/Tree2.tsx | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index a1d057296..6ab821aa3 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -8,7 +8,7 @@ */ import {Id, UINode} from '../types'; -import React, {useEffect, useState} from 'react'; +import React, {Ref, useEffect, useState} from 'react'; import { HighlightManager, HighlightProvider, @@ -39,8 +39,20 @@ export function Tree2({ const treeNodes = toTreeList(nodes, rootId, expandedNodes); + const refs = treeNodes.map(() => React.createRef()); + useKeyboardShortcuts(treeNodes, selectedNode, onSelectNode); + useEffect(() => { + if (selectedNode) { + const idx = treeNodes.findIndex((node) => node.id === selectedNode); + if (idx !== -1) { + refs[idx].current?.scrollIntoView({ + block: 'nearest', + }); + } + } + }, [refs, selectedNode, treeNodes]); return ( { instance.uiState.hoveredNodes.set([]); }}> - {treeNodes.map((treeNode) => ( + {treeNodes.map((treeNode, index) => ( ; treeNode: TreeNode; selectedNode?: Id; hoveredNode?: Id; @@ -81,6 +96,7 @@ function TreeItemContainer({ const isHovered = useIsHovered(treeNode.id); return ( { From 0e51914e9e4ff2687c89b7eace3c67463285d259 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0401/1651] Made kb controls scroll friendly Reviewed By: antonk52 Differential Revision: D41838167 fbshipit-source-id: fb32941ed750fa22797586bab8da39880131eac9 --- .../public/ui-debugger/components/Tree2.tsx | 120 +++++++++++++----- 1 file changed, 88 insertions(+), 32 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index 6ab821aa3..fcb9c8bc4 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -8,8 +8,16 @@ */ import {Id, UINode} from '../types'; -import React, {Ref, useEffect, useState} from 'react'; +import React, { + Ref, + RefObject, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; import { + Atom, HighlightManager, HighlightProvider, styled, @@ -37,11 +45,25 @@ export function Tree2({ const expandedNodes = useValue(instance.uiState.expandedNodes); const searchTerm = useValue(instance.uiState.searchTerm); - const treeNodes = toTreeList(nodes, rootId, expandedNodes); + const {treeNodes, refs} = useMemo(() => { + const treeNodes = toTreeList(nodes, rootId, expandedNodes); - const refs = treeNodes.map(() => React.createRef()); + const refs: React.RefObject[] = treeNodes.map(() => + React.createRef(), + ); - useKeyboardShortcuts(treeNodes, selectedNode, onSelectNode); + return {treeNodes, refs}; + }, [expandedNodes, nodes, rootId]); + + const isUsingKBToScroll = useRef(false); + + useKeyboardShortcuts( + treeNodes, + refs, + selectedNode, + onSelectNode, + isUsingKBToScroll, + ); useEffect(() => { if (selectedNode) { @@ -64,6 +86,7 @@ export function Tree2({ {treeNodes.map((treeNode, index) => ( ; + isUsingKBToScroll: RefObject; treeNode: TreeNode; selectedNode?: Id; hoveredNode?: Id; @@ -100,7 +125,9 @@ function TreeItemContainer({ isSelected={treeNode.id === selectedNode} isHovered={isHovered} onMouseEnter={() => { - instance.uiState.hoveredNodes.set([treeNode.id]); + if (isUsingKBToScroll.current === false) { + instance.uiState.hoveredNodes.set([treeNode.id]); + } }} onClick={() => { onSelectNode(treeNode.id); @@ -238,14 +265,24 @@ function toTreeList( function useKeyboardShortcuts( treeNodes: TreeNode[], + refs: React.RefObject[], selectedNode: Id | undefined, onSelectNode: (id?: Id) => void, + isUsingKBToScroll: React.MutableRefObject, ) { const instance = usePlugin(plugin); useEffect(() => { const listener = (event: KeyboardEvent) => { switch (event.key) { + case 'Enter': { + const hoveredNode = head(instance.uiState.hoveredNodes.get()); + if (hoveredNode != null) { + onSelectNode(hoveredNode); + } + + break; + } case 'ArrowRight': { event.preventDefault(); @@ -267,37 +304,18 @@ function useKeyboardShortcuts( break; } - case 'ArrowDown': { + case 'ArrowDown': + case 'ArrowUp': event.preventDefault(); - - const curIdx = treeNodes.findIndex( - (item) => item.id === head(instance.uiState.hoveredNodes.get()), + moveHoveredNodeUpOrDown( + event.key, + treeNodes, + refs, + instance.uiState.hoveredNodes, + isUsingKBToScroll, ); - if (curIdx != -1) { - const nextIdx = curIdx + 1; - if (nextIdx < treeNodes.length) { - const nextNode = treeNodes[nextIdx]; - instance.uiState.hoveredNodes.set([nextNode.id]); - } - } - break; - } - case 'ArrowUp': { - event.preventDefault(); - - const curIdx = treeNodes.findIndex( - (item) => item.id === head(instance.uiState.hoveredNodes.get()), - ); - if (curIdx != -1) { - const prevIdx = curIdx - 1; - if (prevIdx >= 0) { - const prevNode = treeNodes[prevIdx]; - instance.uiState.hoveredNodes.set([prevNode.id]); - } - } break; - } } }; window.addEventListener('keydown', listener); @@ -305,10 +323,48 @@ function useKeyboardShortcuts( window.removeEventListener('keydown', listener); }; }, [ + refs, instance.uiState.expandedNodes, treeNodes, onSelectNode, selectedNode, instance.uiState.hoveredNodes, + isUsingKBToScroll, ]); } + +export type UpOrDown = 'ArrowDown' | 'ArrowUp'; + +function moveHoveredNodeUpOrDown( + direction: UpOrDown, + treeNodes: TreeNode[], + refs: React.RefObject[], + hoveredNodes: Atom, + isUsingKBToScroll: React.MutableRefObject, +) { + const curIdx = treeNodes.findIndex( + (item) => item.id === head(hoveredNodes.get()), + ); + if (curIdx != -1) { + const increment = direction === 'ArrowDown' ? 1 : -1; + const newIdx = curIdx + increment; + if (newIdx >= 0 && newIdx < treeNodes.length) { + const newNode = treeNodes[newIdx]; + hoveredNodes.set([newNode.id]); + + const newNodeDomRef = refs[newIdx].current; + /** + * The reason for this grossness is that when scrolling to an element via keyboard, it will move a new dom node + * under the cursor which will trigger the onmouseenter event for that node even if the mouse never actually was moved. + * This will in turn cause that event handler to hover that node rather than the one the user is trying to get to via keyboard. + * This is a dubious way to work around this. Effectively set this flag for a few hundred milliseconds after using keyboard movement + * to disable the onmouseenter -> hover behaviour temporarily + */ + isUsingKBToScroll.current = true; + newNodeDomRef?.scrollIntoView({block: 'nearest'}); + setTimeout(() => { + isUsingKBToScroll.current = false; + }, 250); + } + } +} From 8784691e6296680b9f48e6acbcc74e9513785fcc Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0402/1651] If no children dont show chevron Reviewed By: lawrencelomax Differential Revision: D41809088 fbshipit-source-id: 7f4bef5390561671cc53a12be8aa99ea5efe228c --- .../public/ui-debugger/components/Tree2.tsx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index fcb9c8bc4..8d80f49ad 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -133,8 +133,9 @@ function TreeItemContainer({ onSelectNode(treeNode.id); }} item={treeNode}> - { instance.uiState.expandedNodes.update((draft) => { if (draft.has(treeNode.id)) { @@ -145,7 +146,6 @@ function TreeItemContainer({ }); }} /> - {nodeIcon(treeNode)} @@ -189,8 +189,12 @@ const TreeItem = styled.li<{ backgroundColor: isSelected ? theme.selectionBackgroundColor : theme.white, })); -function Arrow(props: {onClick: () => void; expanded: boolean}) { - return ( +function ExpandedIconOrSpace(props: { + onClick: () => void; + expanded: boolean; + children: Id[]; +}) { + return props.children.length > 0 ? (
    void; expanded: boolean}) { color="grey" />
    + ) : ( +
    ); } From 88e2bb7607fd493631cff87f416172f351c579d1 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0403/1651] Fix order of items Reviewed By: lawrencelomax Differential Revision: D41838169 fbshipit-source-id: 2cc82eb1d50552de5f7970b61f6375d6ff8985fd --- desktop/plugins/public/ui-debugger/components/Tree2.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index 8d80f49ad..0d89f74b8 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -29,6 +29,7 @@ import { import {plugin} from '../index'; import {Glyph} from 'flipper'; import {head} from 'lodash'; +import {reverse} from 'lodash/fp'; export function Tree2({ nodes, @@ -255,12 +256,11 @@ function toTreeList( }); if (isExpanded) { - for (const childId of cur.children) { + //since we do dfs and use a stack we have to reverse children to get the order correct + for (const childId of reverse(cur.children)) { const child = nodes.get(childId); if (child != null) { stack.push([child, depth + 1]); - } else { - console.log('null', childId); } } } From 65d6089ed278c932d21b6de7c4c8f164c1c8fc5f Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0404/1651] Added context menu and focus mode Reviewed By: antonk52 Differential Revision: D41838172 fbshipit-source-id: 7c5fad5a7520cea5f0dbabb9f99ef436ad87ec60 --- .../public/ui-debugger/components/Tree2.tsx | 106 +++++++++++++----- 1 file changed, 76 insertions(+), 30 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index 0d89f74b8..80e72a392 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -30,6 +30,8 @@ import {plugin} from '../index'; import {Glyph} from 'flipper'; import {head} from 'lodash'; import {reverse} from 'lodash/fp'; +import {Dropdown, Menu} from 'antd'; +import {UIDebuggerMenuItem} from './util/UIDebuggerMenuItem'; export function Tree2({ nodes, @@ -43,18 +45,19 @@ export function Tree2({ onSelectNode: (node?: Id) => void; }) { const instance = usePlugin(plugin); + const focusedNode = useValue(instance.uiState.focusedNode); const expandedNodes = useValue(instance.uiState.expandedNodes); const searchTerm = useValue(instance.uiState.searchTerm); const {treeNodes, refs} = useMemo(() => { - const treeNodes = toTreeList(nodes, rootId, expandedNodes); + const treeNodes = toTreeList(nodes, focusedNode || rootId, expandedNodes); const refs: React.RefObject[] = treeNodes.map(() => React.createRef(), ); return {treeNodes, refs}; - }, [expandedNodes, nodes, rootId]); + }, [expandedNodes, focusedNode, nodes, rootId]); const isUsingKBToScroll = useRef(false); @@ -121,35 +124,40 @@ function TreeItemContainer({ const instance = usePlugin(plugin); const isHovered = useIsHovered(treeNode.id); return ( - { - if (isUsingKBToScroll.current === false) { - instance.uiState.hoveredNodes.set([treeNode.id]); - } - }} - onClick={() => { - onSelectNode(treeNode.id); - }} - item={treeNode}> - { - instance.uiState.expandedNodes.update((draft) => { - if (draft.has(treeNode.id)) { - draft.delete(treeNode.id); - } else { - draft.add(treeNode.id); - } - }); + + { + if ( + isUsingKBToScroll.current === false && + instance.uiState.isContextMenuOpen.get() == false + ) { + instance.uiState.hoveredNodes.set([treeNode.id]); + } }} - /> - {nodeIcon(treeNode)} - - + onClick={() => { + onSelectNode(treeNode.id); + }} + item={treeNode}> + { + instance.uiState.expandedNodes.update((draft) => { + if (draft.has(treeNode.id)) { + draft.delete(treeNode.id); + } else { + draft.add(treeNode.id); + } + }); + }} + /> + {nodeIcon(treeNode)} + + + ); } @@ -232,6 +240,44 @@ const DecorationImage = styled.img({ const renderDepthOffset = 4; +const ContextMenu: React.FC<{node: TreeNode}> = ({node, children}) => { + const instance = usePlugin(plugin); + const focusedNode = instance.uiState.focusedNode.get(); + + return ( + { + instance.uiState.isContextMenuOpen.set(visible); + }} + overlay={() => ( + + {focusedNode !== head(instance.uiState.hoveredNodes.get()) && ( + { + instance.uiState.focusedNode.set(node.id); + }} + /> + )} + + {focusedNode && ( + { + instance.uiState.focusedNode.set(undefined); + }} + /> + )} + + )} + trigger={['contextMenu']}> +
    {children}
    +
    + ); +}; + function toTreeList( nodes: Map, rootId: Id, From 0db0afec21743afd29d414c2ddfc5a54401473bc Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0405/1651] Fix 'focus undefined' in viz context menu Reviewed By: antonk52 Differential Revision: D41838173 fbshipit-source-id: 01019614362a1c5154e920faa1a4b6aee83f88c3 --- .../plugins/public/ui-debugger/components/Visualization2D.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index db3903d16..da9fdd891 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -292,7 +292,7 @@ const ContextMenu: React.FC<{nodes: Map}> = ({children}) => { overlay={() => { return ( - {hoveredNode?.id !== focusedNodeId && ( + {hoveredNode != null && hoveredNode?.id !== focusedNodeId && ( Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0406/1651] Memoize tree nodes Reviewed By: antonk52 Differential Revision: D41838164 fbshipit-source-id: 3184f4ee607f0dd47604265fc259480403c083f0 --- .../public/ui-debugger/components/Tree2.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index 80e72a392..50ca804b3 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -88,7 +88,7 @@ export function Tree2({ instance.uiState.hoveredNodes.set([]); }}> {treeNodes.map((treeNode, index) => ( - { + const id = prevProps.treeNode.id; + return ( + prevProps.treeNode === nextProps.treeNode && + id !== prevProps.selectedNode && + id !== nextProps.selectedNode + ); + }, +); + function TreeItemContainer({ innerRef, isUsingKBToScroll, From 97cca4282202d8119750af8816f3cf8ad8e4b4ed Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0407/1651] Remove native scan Summary: This is obsolete and maintaining it as the protocol changes no longer makes sense Reviewed By: lblasa Differential Revision: D41845247 fbshipit-source-id: c4ead597ca66223ccfa091ac79a6a80784a3c8e4 --- .../uidebugger/core/NativeScanScheduler.kt | 106 ----------------- .../plugins/uidebugger/scheduler/Scheduler.kt | 110 ------------------ 2 files changed, 216 deletions(-) delete mode 100644 android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt delete mode 100644 android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/Scheduler.kt diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt deleted file mode 100644 index 6223aa511..000000000 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.core - -import android.os.Looper -import android.util.Log -import com.facebook.flipper.plugins.uidebugger.LogTag -import com.facebook.flipper.plugins.uidebugger.descriptors.ApplicationRefDescriptor -import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister -import com.facebook.flipper.plugins.uidebugger.model.MetadataUpdateEvent -import com.facebook.flipper.plugins.uidebugger.model.Node -import com.facebook.flipper.plugins.uidebugger.model.PerfStatsEvent -import com.facebook.flipper.plugins.uidebugger.model.SubtreeUpdateEvent -import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory -import com.facebook.flipper.plugins.uidebugger.scheduler.Scheduler -import com.facebook.flipper.plugins.uidebugger.traversal.PartialLayoutTraversal -import com.facebook.flipper.plugins.uidebugger.util.MaybeDeferred -import kotlinx.serialization.json.Json - -data class ScanResult( - val txId: Long, - val scanStart: Long, - val scanEnd: Long, - val nodes: List> -) - -const val observerType = "FullScan" - -/** This is used to stress test the ui debugger, should not be used in production */ -class NativeScanScheduler(val context: Context) : Scheduler.Task { - /** - * when you supply no observers the traversal will never halt and will effectively scan the entire - * hierarchy - */ - private val emptyObserverFactory = TreeObserverFactory() - private val traversal = PartialLayoutTraversal(context.descriptorRegister, emptyObserverFactory) - private var txId = 100000L - - override fun execute(): ScanResult { - val start = System.currentTimeMillis() - val (nodes) = traversal.traverse(context.applicationRef) - val scanEnd = System.currentTimeMillis() - - Log.d( - LogTag, - "${Thread.currentThread().name}${Looper.myLooper()} produced: ${nodes.count()} nodes") - - return ScanResult(txId++, start, scanEnd, nodes) - } - - private fun sendMetadata() { - val metadata = MetadataRegister.getPendingMetadata() - if (metadata.size > 0) { - context.connectionRef.connection?.send( - MetadataUpdateEvent.name, - Json.encodeToString(MetadataUpdateEvent.serializer(), MetadataUpdateEvent(metadata))) - } - } - - private fun sendSubtreeUpdate(input: ScanResult) { - val nodes = input.nodes.map { it.value() } - val deferredComputationComplete = System.currentTimeMillis() - - val serialized = - Json.encodeToString( - SubtreeUpdateEvent.serializer(), - SubtreeUpdateEvent( - input.txId, - observerType, - ApplicationRefDescriptor.getId(context.applicationRef), - nodes)) - val serializationEnd = System.currentTimeMillis() - - context.connectionRef.connection?.send( - SubtreeUpdateEvent.name, - serialized, - ) - val socketEnd = System.currentTimeMillis() - - context.connectionRef.connection?.send( - PerfStatsEvent.name, - Json.encodeToString( - PerfStatsEvent.serializer(), - PerfStatsEvent( - input.txId, - observerType, - input.scanStart, - input.scanStart, - input.scanEnd, - input.scanEnd, - deferredComputationComplete, - serializationEnd, - socketEnd, - input.nodes.size))) - } - - override fun process(input: ScanResult) { - sendMetadata() - sendSubtreeUpdate(input) - } -} diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/Scheduler.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/Scheduler.kt deleted file mode 100644 index 030cc9055..000000000 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/Scheduler.kt +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.scheduler - -import android.os.Handler -import android.os.HandlerThread -import android.os.Looper -import java.util.concurrent.locks.ReentrantLock -import kotlin.concurrent.withLock - -class Scheduler(val task: Task, val rate: Long = 500L) { - interface Task { - fun execute(): T? - fun process(input: T) - } - - private val mainLooper: Handler = Handler(Looper.getMainLooper()) - - private val mainRunnable = MainThreadRunnable() - private val backgroundRunnable = BackgroundThreadRunnable() - - private var backgroundHandler: HandlerThread? = null - private var backgroundLooper: Handler? = null - - private var isRunning = false - - private val lock = ReentrantLock() - private val condition = lock.newCondition() - private val queue = mutableListOf() - - fun start() { - backgroundHandler = HandlerThread("INSPECTOR_WORKER") - backgroundHandler?.let { handlerThread -> - handlerThread.start() - backgroundLooper = Handler(handlerThread.looper) - } - - isRunning = true - mainLooper.postDelayed(mainRunnable, rate) - } - - fun stop() { - backgroundLooper?.post(CancellationRunnable()) - } - - fun execute() { - if (Looper.myLooper() == Looper.getMainLooper()) { - mainRunnable.run() - } else { - mainLooper.post(mainRunnable) - } - } - - inner class MainThreadRunnable : Runnable { - override fun run() { - if (!isRunning) { - return - } - - try { - val output = task.execute() - output?.let { output -> - lock.withLock { - queue.add(output) - condition.signal() - } - } - } catch (e: Exception) {} - - mainLooper.postDelayed(mainRunnable, rate) - backgroundLooper?.post(backgroundRunnable) - } - } - - inner class BackgroundThreadRunnable : Runnable { - override fun run() { - if (!isRunning) { - return - } - try { - var input: T? - lock.withLock { - while (queue.isEmpty()) { - condition.await() - } - input = queue.removeFirst() - } - input?.let { input -> task.process(input) } - } catch (e: Exception) {} - } - } - - inner class CancellationRunnable : Runnable { - override fun run() { - backgroundHandler?.interrupt() - - mainLooper.removeCallbacks(mainRunnable) - backgroundLooper?.removeCallbacks(backgroundRunnable) - - backgroundHandler = null - - isRunning = false - } - } -} From 1a9724d790e6f3f8787afb604c9567761e4b2ab1 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0408/1651] Added inline tree attributes Summary: This is temporary solution to get to parity with the old plugin. In future would like to make this more flexible on the desktop side Additionally getData was renamed to getAttributes for consistency Reviewed By: lblasa Differential Revision: D41845248 fbshipit-source-id: 50e94a7712f5d42938229134e212cef5d379475d --- .../descriptors/DebugComponentDescriptor.kt | 17 ++++++++++- .../litho/descriptors/LithoViewDescriptor.kt | 2 +- .../descriptors/TextDrawableDescriptor.kt | 2 +- .../descriptors/ChainedDescriptor.kt | 25 +++++++++++++--- .../descriptors/ColorDrawableDescriptor.kt | 2 +- .../descriptors/DrawableDescriptor.kt | 2 +- .../FragmentFrameworkDescriptor.kt | 2 +- .../descriptors/FragmentSupportDescriptor.kt | 2 +- .../descriptors/ImageViewDescriptor.kt | 2 +- .../uidebugger/descriptors/NodeDescriptor.kt | 12 ++++++-- .../descriptors/ObjectDescriptor.kt | 2 +- .../descriptors/OffsetChildDescriptor.kt | 4 +-- .../descriptors/TextViewDescriptor.kt | 2 +- .../uidebugger/descriptors/ViewDescriptor.kt | 15 +++++++++- .../descriptors/ViewGroupDescriptor.kt | 2 +- .../descriptors/ViewPagerDescriptor.kt | 2 +- .../descriptors/WindowDescriptor.kt | 2 +- .../flipper/plugins/uidebugger/model/Node.kt | 1 + .../traversal/PartialLayoutTraversal.kt | 4 ++- .../public/ui-debugger/components/Tree.tsx | 1 + .../public/ui-debugger/components/Tree2.tsx | 29 +++++++++++++++++-- desktop/plugins/public/ui-debugger/types.tsx | 1 + 22 files changed, 107 insertions(+), 26 deletions(-) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt index 34dfeb592..ffaeedd65 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt @@ -72,7 +72,9 @@ class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescripto private val StateId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "Litho State") - override fun getData(node: DebugComponent): MaybeDeferred> { + override fun getAttributes( + node: DebugComponent + ): MaybeDeferred> { return Deferred { val attributeSections = mutableMapOf() @@ -101,4 +103,17 @@ class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescripto override fun getTags(node: DebugComponent): Set = setOf(BaseTags.Declarative, LithoTag) override fun getSnapshot(node: DebugComponent, bitmap: Bitmap?): Bitmap? = null + + override fun getInlineAttributes(node: DebugComponent): Map { + val attributes = mutableMapOf() + val key = node.key + val testKey = node.testKey + if (key != null && key.trim { it <= ' ' }.length > 0) { + attributes["key"] = key + } + if (testKey != null && testKey.trim { it <= ' ' }.length > 0) { + attributes["testKey"] = testKey + } + return attributes + } } diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/LithoViewDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/LithoViewDescriptor.kt index 264e62c6f..48ae601e0 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/LithoViewDescriptor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/LithoViewDescriptor.kt @@ -36,7 +36,7 @@ object LithoViewDescriptor : ChainedDescriptor() { MetadataRegister.register( MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "isIncrementalMountEnabled") - override fun onGetData( + override fun onGetAttributes( node: LithoView, attributeSections: MutableMap ) { diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/TextDrawableDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/TextDrawableDescriptor.kt index 91262cc50..842603704 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/TextDrawableDescriptor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/TextDrawableDescriptor.kt @@ -25,7 +25,7 @@ object TextDrawableDescriptor : ChainedDescriptor() { private val TextAttributeId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "text") - override fun onGetData( + override fun onGetAttributes( node: TextDrawable, attributeSections: MutableMap ) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt index 42667e259..194778089 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt @@ -83,14 +83,14 @@ abstract class ChainedDescriptor : NodeDescriptor { open fun onGetChildren(node: T): List? = null - final override fun getData(node: T): MaybeDeferred> { + final override fun getAttributes(node: T): MaybeDeferred> { val builder = mutableMapOf() - onGetData(node, builder) + onGetAttributes(node, builder) var curDescriptor: ChainedDescriptor? = mSuper while (curDescriptor != null) { - curDescriptor.onGetData(node, builder) + curDescriptor.onGetAttributes(node, builder) curDescriptor = curDescriptor.mSuper } @@ -101,7 +101,7 @@ abstract class ChainedDescriptor : NodeDescriptor { * Get the data to show for this node in the sidebar of the inspector. Each key will be a have its * own section */ - open fun onGetData(node: T, attributeSections: MutableMap) {} + open fun onGetAttributes(node: T, attributeSections: MutableMap) {} /** Get a snapshot of the node. */ final override fun getSnapshot(node: T, bitmap: Bitmap?): Bitmap? { @@ -111,4 +111,21 @@ abstract class ChainedDescriptor : NodeDescriptor { open fun onGetSnapshot(node: T, bitmap: Bitmap?): Bitmap? { return null } + + final override fun getInlineAttributes(node: T): Map { + + val builder = mutableMapOf() + onGetInlineAttributes(node, builder) + + var curDescriptor: ChainedDescriptor? = mSuper + + while (curDescriptor != null) { + curDescriptor.onGetInlineAttributes(node, builder) + curDescriptor = curDescriptor.mSuper + } + + return builder + } + + open fun onGetInlineAttributes(node: T, attributes: MutableMap) {} } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ColorDrawableDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ColorDrawableDescriptor.kt index a485e1ff3..0297ab923 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ColorDrawableDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ColorDrawableDescriptor.kt @@ -20,7 +20,7 @@ object ColorDrawableDescriptor : ChainedDescriptor() { override fun onGetName(node: ColorDrawable): String = node.javaClass.simpleName - override fun onGetData( + override fun onGetAttributes( node: ColorDrawable, attributeSections: MutableMap ) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/DrawableDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/DrawableDescriptor.kt index a8f21fd9c..520c82a7a 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/DrawableDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/DrawableDescriptor.kt @@ -26,7 +26,7 @@ object DrawableDescriptor : ChainedDescriptor() { override fun onGetBounds(node: Drawable): Bounds = Bounds(node.bounds.left, node.bounds.top, node.bounds.width(), node.bounds.height()) - override fun onGetData( + override fun onGetAttributes( node: Drawable, attributeSections: MutableMap ) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt index 136317ef7..5b30654a8 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentFrameworkDescriptor.kt @@ -32,7 +32,7 @@ class FragmentFrameworkDescriptor(val register: DescriptorRegister) : override fun onGetChildren(node: android.app.Fragment): List = node.view?.let { view -> listOf(view) } ?: listOf() - override fun onGetData( + override fun onGetAttributes( node: android.app.Fragment, attributeSections: MutableMap ) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt index 73b50b69a..e9116b4aa 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/FragmentSupportDescriptor.kt @@ -58,7 +58,7 @@ class FragmentSupportDescriptor(val register: DescriptorRegister) : } } - override fun onGetData( + override fun onGetAttributes( node: androidx.fragment.app.Fragment, attributeSections: MutableMap ) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt index 475041910..a6b37146e 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt @@ -32,7 +32,7 @@ object ImageViewDescriptor : ChainedDescriptor() { override fun onGetName(node: ImageView): String = node.javaClass.simpleName - override fun onGetData( + override fun onGetAttributes( node: ImageView, attributeSections: MutableMap ) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt index af52ebf63..1f1f5dd43 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/NodeDescriptor.kt @@ -71,14 +71,20 @@ interface NodeDescriptor { fun getActiveChild(node: T): Any? /** - * Get the data to show for this node in the sidebar of the inspector. The object will be shown in - * order and with a header matching the given name. + * Get the attribute to show for this node in the sidebar of the inspector. The object first level + * is a section and subsequent objects within are the first level of that section. Nested objects + * will nest in the sidebar */ - fun getData(node: T): MaybeDeferred> + fun getAttributes(node: T): MaybeDeferred> /** * Set of tags to describe this node in an abstract way for the UI Unfortunately this can't be an * enum as we have to plugin 3rd party frameworks dynamically */ fun getTags(node: T): Set + + /** + * These are shown inline in the tree view on the desktop, will likely be removed in the future + */ + fun getInlineAttributes(node: T): Map = mutableMapOf() } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt index 910a2b2e7..78d4ea80f 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ObjectDescriptor.kt @@ -27,7 +27,7 @@ object ObjectDescriptor : NodeDescriptor { override fun getChildren(node: Any) = listOf() - override fun getData(node: Any) = Immediate(mapOf()) + override fun getAttributes(node: Any) = Immediate(mapOf()) override fun getBounds(node: Any): Bounds = Bounds(0, 0, 0, 0) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt index 4278ca8e8..59c1a4511 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/OffsetChildDescriptor.kt @@ -38,8 +38,8 @@ object OffsetChildDescriptor : NodeDescriptor { override fun getActiveChild(node: OffsetChild): Any? = node.descriptor.getActiveChild(node.child) - override fun getData(node: OffsetChild): MaybeDeferred> = - node.descriptor.getData(node.child) + override fun getAttributes(node: OffsetChild): MaybeDeferred> = + node.descriptor.getAttributes(node.child) override fun getTags(node: OffsetChild): Set = node.descriptor.getTags(node.child) override fun getSnapshot(node: OffsetChild, bitmap: Bitmap?): Bitmap? = diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/TextViewDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/TextViewDescriptor.kt index c0d2ff273..5e8bca7c1 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/TextViewDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/TextViewDescriptor.kt @@ -46,7 +46,7 @@ object TextViewDescriptor : ChainedDescriptor() { override fun onGetName(node: TextView): String = node.javaClass.simpleName - override fun onGetData( + override fun onGetAttributes( node: TextView, attributeSections: MutableMap ) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt index 50a2823bc..d8573087f 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt @@ -273,7 +273,10 @@ object ViewDescriptor : ChainedDescriptor() { override fun onGetTags(node: View): Set = BaseTags.NativeAndroid - override fun onGetData(node: View, attributeSections: MutableMap) { + override fun onGetAttributes( + node: View, + attributeSections: MutableMap + ) { val props = mutableMapOf() @@ -365,6 +368,16 @@ object ViewDescriptor : ChainedDescriptor() { attributeSections[SectionId] = InspectableObject(props.toMap()) } + override fun onGetInlineAttributes(node: View, attributes: MutableMap) { + val id = node.id + if (id == View.NO_ID) { + return + } + + val value = ResourcesUtil.getIdStringQuietly(node.getContext(), node.getResources(), id) + attributes["id"] = value + } + override fun onGetSnapshot(node: View, bitmap: Bitmap?): Bitmap? { if (node.width <= 0 || node.height <= 0) { return null diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt index 7e6bee089..05a19ce49 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt @@ -60,7 +60,7 @@ object ViewGroupDescriptor : ChainedDescriptor() { private val ClipToPaddingAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "clipToPadding") - override fun onGetData( + override fun onGetAttributes( node: ViewGroup, attributeSections: MutableMap ) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewPagerDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewPagerDescriptor.kt index 2b6a8b618..cdd10c885 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewPagerDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewPagerDescriptor.kt @@ -31,7 +31,7 @@ object ViewPagerDescriptor : ChainedDescriptor() { private val CurrentItemIndexAttributeId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "currentItemIndex") - override fun onGetData( + override fun onGetAttributes( node: ViewPager, attributeSections: MutableMap ) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt index 91a942274..de8e62440 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt @@ -38,7 +38,7 @@ object WindowDescriptor : ChainedDescriptor() { override fun onGetChildren(node: Window): List = listOf(node.decorView) @SuppressLint("PrivateApi") - override fun onGetData( + override fun onGetAttributes( node: Window, attributeSections: MutableMap ) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Node.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Node.kt index ed44d3936..b6083ea15 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Node.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Node.kt @@ -15,6 +15,7 @@ data class Node( val qualifiedName: String, val name: String, val attributes: Map, + val inlineAttributes: Map, val bounds: Bounds, val tags: Set, val children: List, diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt index 1dde63542..b86e21cab 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt @@ -61,6 +61,7 @@ class PartialLayoutTraversal( descriptor.getQualifiedName(node), descriptor.getName(node), emptyMap(), + emptyMap(), descriptor.getBounds(node), emptySet(), emptyList(), @@ -92,7 +93,7 @@ class PartialLayoutTraversal( } } - val attributes = descriptor.getData(node) + val attributes = descriptor.getAttributes(node) val bounds = descriptor.getBounds(node) val tags = descriptor.getTags(node) visited.add( @@ -102,6 +103,7 @@ class PartialLayoutTraversal( descriptor.getQualifiedName(node), descriptor.getName(node), attrs, + descriptor.getInlineAttributes(node), bounds, tags, childrenIds, diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 009ff10dc..c02292cb6 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -273,6 +273,7 @@ const FakeNode: UINode = { id: 'Fakeroot', qualifiedName: 'Fakeroot', name: 'Fakeroot', + inlineAttributes: {}, children: [], attributes: {}, bounds: {x: 0, y: 0, height: 0, width: 0}, diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index 50ca804b3..afec50794 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -30,9 +30,11 @@ import {plugin} from '../index'; import {Glyph} from 'flipper'; import {head} from 'lodash'; import {reverse} from 'lodash/fp'; -import {Dropdown, Menu} from 'antd'; +import {Dropdown, Menu, Typography} from 'antd'; import {UIDebuggerMenuItem} from './util/UIDebuggerMenuItem'; +const {Text} = Typography; + export function Tree2({ nodes, rootId, @@ -168,11 +170,34 @@ function TreeItemContainer({ /> {nodeIcon(treeNode)} + ); } +const TreeAttributeContainer = styled(Text)({ + color: theme.textColorSecondary, + fontWeight: 300, + marginLeft: 5, + fontSize: 12, +}); + +function InlineAttributes({attributes}: {attributes: Record}) { + return ( + <> + {Object.entries(attributes ?? {}).map(([key, value]) => ( + <> + + {key} + ={value} + + + ))} + + ); +} + function useIsHovered(nodeId: Id) { const instance = usePlugin(plugin); const [isHovered, setIsHovered] = useState(false); @@ -200,7 +225,7 @@ const TreeItem = styled.li<{ isSelected: boolean; }>(({item, isHovered, isSelected}) => ({ display: 'flex', - alignItems: 'center', + alignItems: 'baseline', height: '26px', paddingLeft: `${(item.depth + 1) * renderDepthOffset}px`, borderWidth: '1px', diff --git a/desktop/plugins/public/ui-debugger/types.tsx b/desktop/plugins/public/ui-debugger/types.tsx index cc8371803..37f916fbf 100644 --- a/desktop/plugins/public/ui-debugger/types.tsx +++ b/desktop/plugins/public/ui-debugger/types.tsx @@ -67,6 +67,7 @@ export type UINode = { qualifiedName: string; name: string; attributes: Record; + inlineAttributes: Record; children: Id[]; bounds: Bounds; tags: Tag[]; From 040240ec342216be3a83d6126c6d647152c16235 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0409/1651] Tree2 feedback Summary: 1. only useValue from tree root 2. Pass down props for ui state instead subscribing ad hoc 3. Pass down callbacks, instead of updating atoms ad hoc. 4. Create ui actions object holding api, will use this later on in the vizualizer as some of the same In general its more verbose but with memoizing perf should be fine should hopefully be easier to reason about components and what they can do as things are more explicit Hopefully this serves as a general template for how to organise the react code going forward Reviewed By: lblasa Differential Revision: D41872490 fbshipit-source-id: 94a33b0e951c04df367ba102fa0a097d4a0389cd --- .../public/ui-debugger/components/Tree2.tsx | 205 ++++++++++-------- desktop/plugins/public/ui-debugger/index.tsx | 44 +++- 2 files changed, 156 insertions(+), 93 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index afec50794..f9f49da13 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -8,14 +8,7 @@ */ import {Id, UINode} from '../types'; -import React, { - Ref, - RefObject, - useEffect, - useMemo, - useRef, - useState, -} from 'react'; +import React, {Ref, RefObject, useEffect, useMemo, useRef} from 'react'; import { Atom, HighlightManager, @@ -50,6 +43,8 @@ export function Tree2({ const focusedNode = useValue(instance.uiState.focusedNode); const expandedNodes = useValue(instance.uiState.expandedNodes); const searchTerm = useValue(instance.uiState.searchTerm); + const isContextMenuOpen = useValue(instance.uiState.isContextMenuOpen); + const hoveredNode = head(useValue(instance.uiState.hoveredNodes)); const {treeNodes, refs} = useMemo(() => { const treeNodes = toTreeList(nodes, focusedNode || rootId, expandedNodes); @@ -67,7 +62,10 @@ export function Tree2({ treeNodes, refs, selectedNode, + hoveredNode, onSelectNode, + instance.uiActions.onExpandNode, + instance.uiActions.onCollapseNode, isUsingKBToScroll, ); @@ -87,16 +85,26 @@ export function Tree2({ highlightColor={theme.searchHighlightBackground.yellow}>
    { - instance.uiState.hoveredNodes.set([]); + if (isContextMenuOpen === false) { + instance.uiState.hoveredNodes.set([]); + } }}> {treeNodes.map((treeNode, index) => ( ))}
    @@ -112,43 +120,65 @@ export type TreeNode = UINode & { const MemoTreeItemContainer = React.memo( TreeItemContainer, (prevProps, nextProps) => { - const id = prevProps.treeNode.id; + const id = nextProps.treeNode.id; return ( prevProps.treeNode === nextProps.treeNode && - id !== prevProps.selectedNode && - id !== nextProps.selectedNode + prevProps.isContextMenuOpen === nextProps.isContextMenuOpen && + //make sure that prev or next hover/selected node doesnt concern this tree node + prevProps.hoveredNode !== id && + nextProps.hoveredNode !== id && + prevProps.selectedNode !== id && + nextProps.selectedNode !== id ); }, ); function TreeItemContainer({ innerRef, - isUsingKBToScroll, treeNode, selectedNode, + hoveredNode, + focusedNode, + isUsingKBToScroll, + isContextMenuOpen, + onFocusNode, + onContextMenuOpen, onSelectNode, + onExpandNode, + onCollapseNode, + onHoverNode, }: { innerRef: Ref; - isUsingKBToScroll: RefObject; treeNode: TreeNode; selectedNode?: Id; hoveredNode?: Id; + focusedNode?: Id; + isUsingKBToScroll: RefObject; + isContextMenuOpen: boolean; + onFocusNode: (id?: Id) => void; + onContextMenuOpen: (open: boolean) => void; onSelectNode: (node?: Id) => void; + onExpandNode: (node: Id) => void; + onCollapseNode: (node: Id) => void; + onHoverNode: (node: Id) => void; }) { - const instance = usePlugin(plugin); - const isHovered = useIsHovered(treeNode.id); return ( - + { if ( isUsingKBToScroll.current === false && - instance.uiState.isContextMenuOpen.get() == false + isContextMenuOpen == false ) { - instance.uiState.hoveredNodes.set([treeNode.id]); + onHoverNode(treeNode.id); } }} onClick={() => { @@ -157,15 +187,13 @@ function TreeItemContainer({ item={treeNode}> 0} onClick={() => { - instance.uiState.expandedNodes.update((draft) => { - if (draft.has(treeNode.id)) { - draft.delete(treeNode.id); - } else { - draft.add(treeNode.id); - } - }); + if (treeNode.isExpanded) { + onCollapseNode(treeNode.id); + } else { + onExpandNode(treeNode.id); + } }} /> {nodeIcon(treeNode)} @@ -198,27 +226,6 @@ function InlineAttributes({attributes}: {attributes: Record}) { ); } -function useIsHovered(nodeId: Id) { - const instance = usePlugin(plugin); - const [isHovered, setIsHovered] = useState(false); - useEffect(() => { - const listener = (newValue?: Id[], prevValue?: Id[]) => { - //only change state if the prev or next hover state affect us, this avoids rerendering the whole tree for a hover - //change - if (head(prevValue) === nodeId || head(newValue) === nodeId) { - const hovered = head(newValue) === nodeId; - setIsHovered(hovered); - } - }; - instance.uiState.hoveredNodes.subscribe(listener); - return () => { - instance.uiState.hoveredNodes.unsubscribe(listener); - }; - }, [instance.uiState.hoveredNodes, nodeId]); - - return isHovered; -} - const TreeItem = styled.li<{ item: TreeNode; isHovered: boolean; @@ -238,24 +245,30 @@ const TreeItem = styled.li<{ function ExpandedIconOrSpace(props: { onClick: () => void; expanded: boolean; - children: Id[]; + showIcon: boolean; }) { - return props.children.length > 0 ? ( -
    - -
    - ) : ( -
    - ); + if (props.showIcon) { + return ( +
    + +
    + ); + } else { + return
    ; + } } function HighlightedText(props: {text: string}) { @@ -277,23 +290,33 @@ const DecorationImage = styled.img({ const renderDepthOffset = 4; -const ContextMenu: React.FC<{node: TreeNode}> = ({node, children}) => { - const instance = usePlugin(plugin); - const focusedNode = instance.uiState.focusedNode.get(); - +const ContextMenu: React.FC<{ + node: TreeNode; + hoveredNode?: Id; + focusedNode?: Id; + onFocusNode: (id?: Id) => void; + onContextMenuOpen: (open: boolean) => void; +}> = ({ + node, + hoveredNode, + children, + focusedNode, + onFocusNode, + onContextMenuOpen, +}) => { return ( { - instance.uiState.isContextMenuOpen.set(visible); + onContextMenuOpen(visible); }} overlay={() => ( - {focusedNode !== head(instance.uiState.hoveredNodes.get()) && ( + {focusedNode !== hoveredNode && ( { - instance.uiState.focusedNode.set(node.id); + onFocusNode(node.id); }} /> )} @@ -303,7 +326,7 @@ const ContextMenu: React.FC<{node: TreeNode}> = ({node, children}) => { key="remove-focus" text="Remove focus" onClick={() => { - instance.uiState.focusedNode.set(undefined); + onFocusNode(undefined); }} /> )} @@ -356,7 +379,10 @@ function useKeyboardShortcuts( treeNodes: TreeNode[], refs: React.RefObject[], selectedNode: Id | undefined, + hoveredNode: Id | undefined, onSelectNode: (id?: Id) => void, + onExpandNode: (id: Id) => void, + onCollapseNode: (id: Id) => void, isUsingKBToScroll: React.MutableRefObject, ) { const instance = usePlugin(plugin); @@ -365,31 +391,24 @@ function useKeyboardShortcuts( const listener = (event: KeyboardEvent) => { switch (event.key) { case 'Enter': { - const hoveredNode = head(instance.uiState.hoveredNodes.get()); if (hoveredNode != null) { onSelectNode(hoveredNode); } break; } - case 'ArrowRight': { + + case 'ArrowRight': event.preventDefault(); - - instance.uiState.expandedNodes.update((draft) => { - if (selectedNode) { - draft.add(selectedNode); - } - }); - + if (hoveredNode) { + onExpandNode(hoveredNode); + } break; - } case 'ArrowLeft': { event.preventDefault(); - instance.uiState.expandedNodes.update((draft) => { - if (selectedNode) { - draft.delete(selectedNode); - } - }); + if (hoveredNode) { + onCollapseNode(hoveredNode); + } break; } @@ -413,12 +432,14 @@ function useKeyboardShortcuts( }; }, [ refs, - instance.uiState.expandedNodes, treeNodes, onSelectNode, selectedNode, - instance.uiState.hoveredNodes, isUsingKBToScroll, + onExpandNode, + onCollapseNode, + instance.uiState.hoveredNodes, + hoveredNode, ]); } diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index 1f4a4f2d7..fc7be0d32 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -21,7 +21,6 @@ import { MetadataId, PerfStatsEvent, Snapshot, - TreeState, UINode, } from './types'; import './node_modules/react-complex-tree/lib/style.css'; @@ -171,6 +170,7 @@ export function plugin(client: PluginClient) { return { rootId, uiState, + uiActions: uiActions(uiState), nodes, snapshot, metadata, @@ -194,6 +194,48 @@ function setParentPointers( }); } +type UIActions = { + onHoverNode: (node: Id) => void; + onFocusNode: (focused?: Id) => void; + onContextMenuOpen: (open: boolean) => void; + onExpandNode: (node: Id) => void; + onCollapseNode: (node: Id) => void; +}; + +function uiActions(uiState: UIState): UIActions { + const onExpandNode = (node: Id) => { + uiState.expandedNodes.update((draft) => { + draft.add(node); + }); + }; + + const onCollapseNode = (node: Id) => { + uiState.expandedNodes.update((draft) => { + draft.delete(node); + }); + }; + + const onHoverNode = (node: Id) => { + uiState.hoveredNodes.set([node]); + }; + + const onContextMenuOpen = (open: boolean) => { + uiState.isContextMenuOpen.set(open); + }; + + const onFocusNode = (focused?: Id) => { + uiState.focusedNode.set(focused); + }; + + return { + onExpandNode, + onCollapseNode, + onHoverNode, + onContextMenuOpen, + onFocusNode, + }; +} + function checkFocusedNodeStillActive(uiState: UIState, nodes: Map) { const focusedNodeId = uiState.focusedNode.get(); const focusedNode = focusedNodeId && nodes.get(focusedNodeId); From ed35623bef10e7af4200439166d3f47bc2fbfe07 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0410/1651] Only render a single context menu for the entire tree Summary: There is no reason to have a context menu rendered by react for each item in the tree, its pretty wastefull. It also means less props drilled to the tree node Reviewed By: lblasa Differential Revision: D41872778 fbshipit-source-id: b13491a310c03334d7f3056207f5de23d20c3e61 --- .../public/ui-debugger/components/Tree2.tsx | 132 ++++++++---------- 1 file changed, 60 insertions(+), 72 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree2.tsx index f9f49da13..33b8d7b33 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree2.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree2.tsx @@ -83,31 +83,35 @@ export function Tree2({ -
    { - if (isContextMenuOpen === false) { - instance.uiState.hoveredNodes.set([]); - } - }}> - {treeNodes.map((treeNode, index) => ( - - ))} -
    + +
    { + if (isContextMenuOpen === false) { + instance.uiState.hoveredNodes.set([]); + } + }}> + {treeNodes.map((treeNode, index) => ( + + ))} +
    +
    ); } @@ -138,11 +142,8 @@ function TreeItemContainer({ treeNode, selectedNode, hoveredNode, - focusedNode, isUsingKBToScroll, isContextMenuOpen, - onFocusNode, - onContextMenuOpen, onSelectNode, onExpandNode, onCollapseNode, @@ -152,55 +153,42 @@ function TreeItemContainer({ treeNode: TreeNode; selectedNode?: Id; hoveredNode?: Id; - focusedNode?: Id; isUsingKBToScroll: RefObject; isContextMenuOpen: boolean; - onFocusNode: (id?: Id) => void; - onContextMenuOpen: (open: boolean) => void; onSelectNode: (node?: Id) => void; onExpandNode: (node: Id) => void; onCollapseNode: (node: Id) => void; onHoverNode: (node: Id) => void; }) { return ( - - { - if ( - isUsingKBToScroll.current === false && - isContextMenuOpen == false - ) { - onHoverNode(treeNode.id); + { + if (isUsingKBToScroll.current === false && isContextMenuOpen == false) { + onHoverNode(treeNode.id); + } + }} + onClick={() => { + onSelectNode(treeNode.id); + }} + item={treeNode}> + 0} + onClick={() => { + if (treeNode.isExpanded) { + onCollapseNode(treeNode.id); + } else { + onExpandNode(treeNode.id); } }} - onClick={() => { - onSelectNode(treeNode.id); - }} - item={treeNode}> - 0} - onClick={() => { - if (treeNode.isExpanded) { - onCollapseNode(treeNode.id); - } else { - onExpandNode(treeNode.id); - } - }} - /> - {nodeIcon(treeNode)} - - - - + /> + {nodeIcon(treeNode)} + + + ); } @@ -291,13 +279,13 @@ const DecorationImage = styled.img({ const renderDepthOffset = 4; const ContextMenu: React.FC<{ - node: TreeNode; + nodes: Map; hoveredNode?: Id; focusedNode?: Id; onFocusNode: (id?: Id) => void; onContextMenuOpen: (open: boolean) => void; }> = ({ - node, + nodes, hoveredNode, children, focusedNode, @@ -311,12 +299,12 @@ const ContextMenu: React.FC<{ }} overlay={() => ( - {focusedNode !== hoveredNode && ( + {hoveredNode != null && focusedNode !== hoveredNode && ( { - onFocusNode(node.id); + onFocusNode(hoveredNode); }} /> )} From 74247ee721b3eed2a38ede17fc023dab898b5d73 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0411/1651] Remove react complex tree Reviewed By: lblasa Differential Revision: D41875029 fbshipit-source-id: 2af58610fe0d0f644aa8450a4210fd52f8ed4db6 --- .../public/ui-debugger/components/Tree.tsx | 306 ------------------ .../public/ui-debugger/components/main.tsx | 3 +- desktop/plugins/public/ui-debugger/index.tsx | 1 - .../plugins/public/ui-debugger/package.json | 1 - desktop/plugins/public/ui-debugger/types.tsx | 4 +- desktop/plugins/public/yarn.lock | 5 - 6 files changed, 2 insertions(+), 318 deletions(-) delete mode 100644 desktop/plugins/public/ui-debugger/components/Tree.tsx diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx deleted file mode 100644 index c02292cb6..000000000 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ /dev/null @@ -1,306 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import {Id, UINode} from '../types'; -import React, {useEffect, useMemo, useRef} from 'react'; -import { - Tree as ComplexTree, - ControlledTreeEnvironment, - TreeItem, - TreeInformation, - TreeItemRenderContext, - InteractionMode, - TreeEnvironmentRef, -} from 'react-complex-tree'; - -import {plugin} from '../index'; -import { - usePlugin, - useValue, - HighlightManager, - HighlightProvider, - useHighlighter, - theme, - styled, -} from 'flipper-plugin'; - -import {head} from 'lodash'; -import {Dropdown, Menu} from 'antd'; -import {UIDebuggerMenuItem} from './util/UIDebuggerMenuItem'; - -export function Tree(props: { - rootId: Id; - nodes: Map; - selectedNode?: Id; - onSelectNode: (id: Id) => void; -}) { - const instance = usePlugin(plugin); - const expandedItems = useValue(instance.uiState.expandedNodes); - const focused = useValue(instance.uiState.focusedNode); - - const items = useMemo( - () => toComplexTree(focused || props.rootId, props.nodes), - [focused, props.nodes, props.rootId], - ); - const hoveredNodes = useValue(instance.uiState.hoveredNodes); - const treeEnvRef = useRef(); - - const searchTerm = useValue(instance.uiState.searchTerm); - - useEffect(() => { - //this makes the keyboard arrow controls work always, even when using the visualiser - treeEnvRef.current?.focusTree('tree', true); - }, [props.selectedNode]); - - return ( -
    { - instance.uiState.hoveredNodes.set([]); - }} - style={ - { - '--rct-color-tree-bg': theme.white, - '--rct-color-tree-focus-outline': theme.dividerColor, - '--rct-color-focustree-item-focused-border': - theme.selectionBackgroundColor, - '--rct-color-focustree-item-selected-bg': - theme.selectionBackgroundColor, - '--rct-color-nonfocustree-item-selected-bg': - theme.selectionBackgroundColor, - } as React.CSSProperties - }> - - item.data.name} - canRename={false} - canDragAndDrop={false} - viewState={{ - tree: { - focusedItem: head(hoveredNodes), - expandedItems: [...expandedItems], - selectedItems: props.selectedNode ? [props.selectedNode] : [], - }, - }} - onFocusItem={(item) => { - instance.uiState.hoveredNodes.set([item.index]); - }} - onExpandItem={(item) => { - instance.uiState.expandedNodes.update((draft) => { - draft.add(item.index); - }); - }} - onCollapseItem={(item) => - instance.uiState.expandedNodes.update((draft) => { - draft.delete(item.index); - }) - } - renderItem={renderItem} - onSelectItems={(items) => props.onSelectNode(items[0])} - defaultInteractionMode={{ - mode: 'custom', - extends: InteractionMode.DoubleClickItemToExpand, - createInteractiveElementProps: ( - item, - treeId, - actions, - renderFlags, - ) => ({ - onClick: () => { - if (renderFlags.isSelected) { - actions.unselectItem(); - } else { - actions.selectItem(); - } - }, - - onMouseOver: () => { - if (!instance.uiState.isContextMenuOpen.get()) { - instance.uiState.hoveredNodes.set([item.index]); - } - }, - }), - }}> - - - -
    - ); -} - -//copied from https://github.com/lukasbach/react-complex-tree/blob/e3dcc435933284376a0fc6e3cc651e67ead678b5/packages/core/src/renderers/createDefaultRenderers.tsx -const cx = (...classNames: Array) => - classNames.filter((cn) => !!cn).join(' '); -const renderDepthOffset = 5; - -const DecorationImage = styled.img({ - height: 12, - marginRight: 5, - width: 12, -}); -function defaultIcon(node: UINode) { - if (node.tags.includes('Litho')) { - return ; - } -} - -function renderItem({ - item, - depth, - children, - arrow, - context, -}: { - item: TreeItem; - depth: number; - children: React.ReactNode | null; - title: React.ReactNode; - arrow: React.ReactNode; - context: TreeItemRenderContext; - info: TreeInformation; -}) { - return ( -
  • - -
    - {arrow} -
    - {defaultIcon(item.data)} - -
    -
    -
    - - {children} -
  • - ); -} - -type ContextMenuProps = {node: UINode; id: Id; title: string}; - -const ContextMenu: React.FC = ({id, title, children}) => { - const instance = usePlugin(plugin); - const focusedNode = instance.uiState.focusedNode.get(); - - return ( - { - instance.uiState.isContextMenuOpen.set(visible); - }} - overlay={() => ( - - {focusedNode !== head(instance.uiState.hoveredNodes.get()) && ( - { - instance.uiState.focusedNode.set(id); - }} - /> - )} - - {focusedNode && ( - { - instance.uiState.focusedNode.set(undefined); - }} - /> - )} - - )} - trigger={['contextMenu']}> -
    {children}
    -
    - ); -}; - -function HighlightedText(props: {text: string}) { - const highlightManager: HighlightManager = useHighlighter(); - return {highlightManager.render(props.text)}; -} - -const FakeNode: UINode = { - id: 'Fakeroot', - qualifiedName: 'Fakeroot', - name: 'Fakeroot', - inlineAttributes: {}, - children: [], - attributes: {}, - bounds: {x: 0, y: 0, height: 0, width: 0}, - tags: [], -}; - -function toComplexTree( - root: Id, - nodes: Map, -): Record> { - const res: Record> = {}; - for (const node of nodes.values()) { - res[node.id] = { - index: node.id, - children: node.children, - data: node, - hasChildren: node.children.length > 0, - }; - } - - //the library doesnt render the root node so we insert a fake one which will never be rendered - //https://github.com/lukasbach/react-complex-tree/issues/42 - res[FakeNode.id] = { - index: FakeNode.id, - children: [root], - hasChildren: true, - data: FakeNode, - }; - return res; -} diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 05c8512e6..d072746d0 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -13,12 +13,11 @@ import {DetailSidebar, Layout, usePlugin, useValue} from 'flipper-plugin'; import {useHotkeys} from 'react-hotkeys-hook'; import {Id, Metadata, MetadataId, UINode} from '../types'; import {PerfStats} from './PerfStats'; -import {Tree} from './Tree'; import {Visualization2D} from './Visualization2D'; import {useKeyboardModifiers} from '../hooks/useKeyboardModifiers'; import {Inspector} from './sidebar/Inspector'; import {Controls} from './Controls'; -import {Input, Spin} from 'antd'; +import {Spin} from 'antd'; import FeedbackRequest from './fb-stubs/feedback'; import {Tree2} from './Tree2'; diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index fc7be0d32..3598d1e08 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -23,7 +23,6 @@ import { Snapshot, UINode, } from './types'; -import './node_modules/react-complex-tree/lib/style.css'; import {Draft} from 'immer'; type SnapshotInfo = {nodeId: Id; base64Image: Snapshot}; diff --git a/desktop/plugins/public/ui-debugger/package.json b/desktop/plugins/public/ui-debugger/package.json index f49560a1c..42af7acea 100644 --- a/desktop/plugins/public/ui-debugger/package.json +++ b/desktop/plugins/public/ui-debugger/package.json @@ -15,7 +15,6 @@ "dependencies": { "lodash": "^4.17.21", "react-color": "^2.19.3", - "react-complex-tree" : "^1.1.11", "react-hotkeys-hook": "^3.4.7" }, "bugs": { diff --git a/desktop/plugins/public/ui-debugger/types.tsx b/desktop/plugins/public/ui-debugger/types.tsx index 37f916fbf..3dd076e5c 100644 --- a/desktop/plugins/public/ui-debugger/types.tsx +++ b/desktop/plugins/public/ui-debugger/types.tsx @@ -7,8 +7,6 @@ * @format */ -import {TreeItemIndex} from 'react-complex-tree'; - export type Events = { init: InitEvent; subtreeUpdate: SubtreeUpdateEvent; @@ -121,7 +119,7 @@ export type Color = { }; export type Snapshot = string; -export type Id = number | TreeItemIndex; +export type Id = number; export type MetadataId = number; export type TreeState = {expandedNodes: Id[]}; diff --git a/desktop/plugins/public/yarn.lock b/desktop/plugins/public/yarn.lock index 9d8cf2472..573cd4398 100644 --- a/desktop/plugins/public/yarn.lock +++ b/desktop/plugins/public/yarn.lock @@ -1644,11 +1644,6 @@ react-color@^2.19.3: reactcss "^1.2.0" tinycolor2 "^1.4.1" -react-complex-tree@^1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/react-complex-tree/-/react-complex-tree-1.1.11.tgz#430520d12908b033a4b278be0dfd8d0aa6654a85" - integrity sha512-hAkm2ZRH2lwZd7NEzZMQI8db/jI5T2fJsbwHX8oNPrG/WPdakc3eNpm2A4gLk2SBa88HeU6mnauVXg6Q6fJLow== - react-devtools-core@^4.26.1: version "4.26.1" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.26.1.tgz#2893fea58089be64c5356d5bd0eebda8d1bbf317" From 8242a94ca4ddf9804af910dcd4f18076d30254f0 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 07:28:37 -0800 Subject: [PATCH 0412/1651] Rename tree Reviewed By: lblasa Differential Revision: D41875028 fbshipit-source-id: a3afd0014798f03cbaefac3f9128b4e92bccb290 --- .../public/ui-debugger/components/{Tree2.tsx => Tree.tsx} | 0 desktop/plugins/public/ui-debugger/components/main.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename desktop/plugins/public/ui-debugger/components/{Tree2.tsx => Tree.tsx} (100%) diff --git a/desktop/plugins/public/ui-debugger/components/Tree2.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx similarity index 100% rename from desktop/plugins/public/ui-debugger/components/Tree2.tsx rename to desktop/plugins/public/ui-debugger/components/Tree.tsx diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index d072746d0..5e6a552c2 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -19,7 +19,7 @@ import {Inspector} from './sidebar/Inspector'; import {Controls} from './Controls'; import {Spin} from 'antd'; import FeedbackRequest from './fb-stubs/feedback'; -import {Tree2} from './Tree2'; +import {Tree2} from './Tree'; export function Component() { const instance = usePlugin(plugin); From ecae7708246bf1f4e5d5347e2365cecf5f37000b Mon Sep 17 00:00:00 2001 From: generatedunixname89002005325672 Date: Mon, 12 Dec 2022 07:51:03 -0800 Subject: [PATCH 0413/1651] Daily `arc lint --take KTFMT` Reviewed By: adamjernst Differential Revision: D41833756 fbshipit-source-id: 0ecc95aff3bdadadb0769dec55d27fb84fe50e95 --- .../facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt index 5700b4f9a..af048f84b 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt @@ -29,7 +29,8 @@ import kotlinx.coroutines.* /** * There are 2 ways a litho view can update: * 1. A view was added / updated / removed through a mount, This should be refelected in a change in - * props / state so we use the mount extension to capture these including the entire component tree + * props / state so we use the mount extension to capture these including the entire component + * tree * 2. The coordinate of the litho view changes externally and doesn't cause a mount, examples: * - Sibling changed size or position and shifted this view * - User scrolled From 69db826792ff64c5cb64fe95955b2d5851800e0a Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Mon, 12 Dec 2022 08:09:50 -0800 Subject: [PATCH 0414/1651] Flipper Release: v0.176.1 Summary: Releasing version 0.176.1 Reviewed By: aigoncharov Differential Revision: D41946576 fbshipit-source-id: 5b1930fed4157f30d77b850c499a427842d9ad23 --- desktop/package.json | 2 +- desktop/plugins/public/layout/docs/setup.mdx | 2 +- desktop/plugins/public/leak_canary/docs/setup.mdx | 2 +- desktop/plugins/public/network/docs/setup.mdx | 2 +- docs/getting-started/android-native.mdx | 4 ++-- docs/getting-started/react-native-ios.mdx | 2 +- docs/getting-started/react-native.mdx | 4 ++-- gradle.properties | 2 +- js/js-flipper/package.json | 2 +- react-native/react-native-flipper/package.json | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index 31d6f3372..0c07aaaab 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -169,7 +169,7 @@ "npm": "use yarn instead", "yarn": "^1.16" }, - "version": "0.176.0", + "version": "0.176.1", "workspaces": { "packages": [ "scripts", diff --git a/desktop/plugins/public/layout/docs/setup.mdx b/desktop/plugins/public/layout/docs/setup.mdx index 67bca96d2..5c59ae277 100644 --- a/desktop/plugins/public/layout/docs/setup.mdx +++ b/desktop/plugins/public/layout/docs/setup.mdx @@ -27,7 +27,7 @@ You also need to compile in the `litho-annotations` package, as Flipper reflects ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.176.0' + debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.176.1' debugImplementation 'com.facebook.litho:litho-annotations:0.19.0' // ... } diff --git a/desktop/plugins/public/leak_canary/docs/setup.mdx b/desktop/plugins/public/leak_canary/docs/setup.mdx index c5aa9f5f8..b858a2dfd 100644 --- a/desktop/plugins/public/leak_canary/docs/setup.mdx +++ b/desktop/plugins/public/leak_canary/docs/setup.mdx @@ -8,7 +8,7 @@ To setup the LeakCan ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.176.0' + debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.176.1' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1' } ``` diff --git a/desktop/plugins/public/network/docs/setup.mdx b/desktop/plugins/public/network/docs/setup.mdx index 93fd3cfd5..259a09c29 100644 --- a/desktop/plugins/public/network/docs/setup.mdx +++ b/desktop/plugins/public/network/docs/setup.mdx @@ -12,7 +12,7 @@ The network plugin is shipped as a separate Maven artifact, as follows: ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.176.0' + debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.176.1' } ``` diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index 5dc2394eb..b32e69a43 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -24,10 +24,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.176.0' + debugImplementation 'com.facebook.flipper:flipper:0.176.1' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.176.0' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.176.1' } ``` diff --git a/docs/getting-started/react-native-ios.mdx b/docs/getting-started/react-native-ios.mdx index b6522fe14..6eb990cb1 100644 --- a/docs/getting-started/react-native-ios.mdx +++ b/docs/getting-started/react-native-ios.mdx @@ -51,7 +51,7 @@ Add all of the code below to your `ios/Podfile`: platform :ios, '9.0' def flipper_pods() - flipperkit_version = '0.176.0' # should match the version of your Flipper client app + flipperkit_version = '0.176.1' # should match the version of your Flipper client app pod 'FlipperKit', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/FlipperKitLayoutPlugin', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/SKIOSNetworkPlugin', '~>' + flipperkit_version, :configuration => 'Debug' diff --git a/docs/getting-started/react-native.mdx b/docs/getting-started/react-native.mdx index f0bb76204..ccf903790 100644 --- a/docs/getting-started/react-native.mdx +++ b/docs/getting-started/react-native.mdx @@ -34,7 +34,7 @@ Latest version of Flipper requires react-native 0.69+! If you use react-native < Android: -1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.176.0`. +1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.176.1`. 2. Run `./gradlew clean` in the `android` directory. iOS: @@ -44,7 +44,7 @@ react-native version => 0.69.0 2. Run `pod install --repo-update` in the `ios` directory. react-native version < 0.69.0 -1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.176.0' })`. +1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.176.1' })`. 2. Run `pod install --repo-update` in the `ios` directory. ## Manual Setup diff --git a/gradle.properties b/gradle.properties index 1c243f487..d821206a9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.176.1-SNAPSHOT +VERSION_NAME=0.176.1 GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper diff --git a/js/js-flipper/package.json b/js/js-flipper/package.json index a79f31e71..3fc4e622d 100644 --- a/js/js-flipper/package.json +++ b/js/js-flipper/package.json @@ -1,7 +1,7 @@ { "name": "js-flipper", "title": "JS Flipper Bindings for Web-Socket based clients", - "version": "0.176.0", + "version": "0.176.1", "main": "lib/index.js", "browser": { "os": false diff --git a/react-native/react-native-flipper/package.json b/react-native/react-native-flipper/package.json index 340a3153e..b8dc5872d 100644 --- a/react-native/react-native-flipper/package.json +++ b/react-native/react-native-flipper/package.json @@ -1,7 +1,7 @@ { "name": "react-native-flipper", "title": "React Native Flipper Bindings", - "version": "0.176.0", + "version": "0.176.1", "description": "Flipper bindings for React Native", "main": "index.js", "types": "index.d.ts", From 6d192bc0204a6ed54ccfa707b4e2ef85aa14436c Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Mon, 12 Dec 2022 08:09:50 -0800 Subject: [PATCH 0415/1651] Flipper Snapshot Bump: v0.176.2-SNAPSHOT Summary: Releasing snapshot version 0.176.2-SNAPSHOT Reviewed By: aigoncharov Differential Revision: D41946575 fbshipit-source-id: d2c5d7d0fa4a6530d751585f926371791672f55f --- docs/getting-started/android-native.mdx | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index b32e69a43..f23d5bb2d 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -124,10 +124,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.176.1-SNAPSHOT' + debugImplementation 'com.facebook.flipper:flipper:0.176.2-SNAPSHOT' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.176.1-SNAPSHOT' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.176.2-SNAPSHOT' } ``` diff --git a/gradle.properties b/gradle.properties index d821206a9..a17417426 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.176.1 +VERSION_NAME=0.176.2-SNAPSHOT GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper From 5043e5292f82989d483dead70639167e110f39d8 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Dec 2022 09:17:03 -0800 Subject: [PATCH 0416/1651] Last minute tree changes Summary: 1. Greater spacing between levels 2. Align children when one has chevron and another doesnt 3. Allow searching of inline attribute values Reviewed By: lblasa Differential Revision: D41955235 fbshipit-source-id: aa6bce71810a32cd218db790287aaaf506df75b7 --- desktop/plugins/public/ui-debugger/components/Tree.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 33b8d7b33..bf26e669a 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -200,13 +200,15 @@ const TreeAttributeContainer = styled(Text)({ }); function InlineAttributes({attributes}: {attributes: Record}) { + const highlightManager: HighlightManager = useHighlighter(); + return ( <> {Object.entries(attributes ?? {}).map(([key, value]) => ( <> {key} - ={value} + ={highlightManager.render(value)} ))} @@ -255,7 +257,7 @@ function ExpandedIconOrSpace(props: {
    ); } else { - return
    ; + return
    ; } } @@ -276,7 +278,7 @@ const DecorationImage = styled.img({ width: 12, }); -const renderDepthOffset = 4; +const renderDepthOffset = 8; const ContextMenu: React.FC<{ nodes: Map; From b686567e2bc0c73881db2fa300cd4dda322ec543 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Tue, 13 Dec 2022 08:21:22 -0800 Subject: [PATCH 0417/1651] Added indent guides to parent and children for selected node Reviewed By: lblasa Differential Revision: D41995460 fbshipit-source-id: cd4574caa6aa164d2b3a026f656609585cae65c0 --- .../public/ui-debugger/components/Tree.tsx | 217 ++++++++++++++---- 1 file changed, 168 insertions(+), 49 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index bf26e669a..244442d97 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -21,13 +21,27 @@ import { } from 'flipper-plugin'; import {plugin} from '../index'; import {Glyph} from 'flipper'; -import {head} from 'lodash'; +import {head, last} from 'lodash'; import {reverse} from 'lodash/fp'; import {Dropdown, Menu, Typography} from 'antd'; import {UIDebuggerMenuItem} from './util/UIDebuggerMenuItem'; const {Text} = Typography; +type LineStyle = 'ToParent' | 'ToChildren'; + +type NodeIndentGuide = { + depth: number; + style: LineStyle; + addHorizontalMarker: boolean; + trimBottom: boolean; +}; +export type TreeNode = UINode & { + depth: number; + isExpanded: boolean; + indentGuide: NodeIndentGuide | null; +}; + export function Tree2({ nodes, rootId, @@ -47,14 +61,19 @@ export function Tree2({ const hoveredNode = head(useValue(instance.uiState.hoveredNodes)); const {treeNodes, refs} = useMemo(() => { - const treeNodes = toTreeList(nodes, focusedNode || rootId, expandedNodes); + const treeNodes = toTreeNodes( + nodes, + focusedNode || rootId, + expandedNodes, + selectedNode, + ); const refs: React.RefObject[] = treeNodes.map(() => React.createRef(), ); return {treeNodes, refs}; - }, [expandedNodes, focusedNode, nodes, rootId]); + }, [expandedNodes, focusedNode, nodes, rootId, selectedNode]); const isUsingKBToScroll = useRef(false); @@ -116,11 +135,6 @@ export function Tree2({ ); } -export type TreeNode = UINode & { - depth: number; - isExpanded: boolean; -}; - const MemoTreeItemContainer = React.memo( TreeItemContainer, (prevProps, nextProps) => { @@ -137,6 +151,41 @@ const MemoTreeItemContainer = React.memo( }, ); +function IndentGuide({indentGuide}: {indentGuide: NodeIndentGuide}) { + const verticalLinePadding = `${renderDepthOffset * indentGuide.depth + 8}px`; + + const verticalLineStyle = `${ + indentGuide.style === 'ToParent' ? 'dashed' : 'solid' + }`; + const horizontalLineStyle = `${ + indentGuide.style === 'ToParent' ? 'dotted' : 'solid' + }`; + + const color = indentGuide.style === 'ToParent' ? '#B0B0B0' : '#C0C0C0'; + + return ( +
    +
    + {indentGuide.addHorizontalMarker && ( +
    + )} +
    + ); +} + function TreeItemContainer({ innerRef, treeNode, @@ -161,34 +210,42 @@ function TreeItemContainer({ onHoverNode: (node: Id) => void; }) { return ( - { - if (isUsingKBToScroll.current === false && isContextMenuOpen == false) { - onHoverNode(treeNode.id); - } - }} - onClick={() => { - onSelectNode(treeNode.id); - }} - item={treeNode}> - 0} - onClick={() => { - if (treeNode.isExpanded) { - onCollapseNode(treeNode.id); - } else { - onExpandNode(treeNode.id); +
    + {treeNode.indentGuide != null && ( + + )} + { + if ( + isUsingKBToScroll.current === false && + isContextMenuOpen == false + ) { + onHoverNode(treeNode.id); } }} - /> - {nodeIcon(treeNode)} - - - + onClick={() => { + onSelectNode(treeNode.id); + }} + item={treeNode}> + 0} + onClick={() => { + if (treeNode.isExpanded) { + onCollapseNode(treeNode.id); + } else { + onExpandNode(treeNode.id); + } + }} + /> + {nodeIcon(treeNode)} + + + +
    ); } @@ -216,15 +273,18 @@ function InlineAttributes({attributes}: {attributes: Record}) { ); } -const TreeItem = styled.li<{ +const TreeItemHeight = '26px'; +const HalfTreeItemHeight = `calc(${TreeItemHeight} / 2)`; + +const TreeItemContent = styled.li<{ item: TreeNode; isHovered: boolean; isSelected: boolean; }>(({item, isHovered, isSelected}) => ({ display: 'flex', alignItems: 'baseline', - height: '26px', - paddingLeft: `${(item.depth + 1) * renderDepthOffset}px`, + height: TreeItemHeight, + paddingLeft: `${item.depth * renderDepthOffset}px`, borderWidth: '1px', borderRadius: '3px', borderColor: isHovered ? theme.selectionBackgroundColor : 'transparent', @@ -243,7 +303,10 @@ function ExpandedIconOrSpace(props: { role="button" tabIndex={0} style={{display: 'flex'}} - onClick={props.onClick}> + onClick={(e) => { + e.stopPropagation(); + props.onClick(); + }}> ; @@ -328,41 +391,97 @@ const ContextMenu: React.FC<{ ); }; -function toTreeList( +type TreeListStackItem = { + node: UINode; + depth: number; + isChildOfSelectedNode: boolean; + selectedNodeDepth: number; +}; + +function toTreeNodes( nodes: Map, rootId: Id, expandedNodes: Set, + selectedNode: Id | undefined, ): TreeNode[] { const root = nodes.get(rootId); if (root == null) { return []; } - const stack = [[root, 0]] as [UINode, number][]; + const stack = [ + {node: root, depth: 0, isChildOfSelectedNode: false, selectedNodeDepth: 0}, + ] as TreeListStackItem[]; - const res = [] as TreeNode[]; + const treeNodes = [] as TreeNode[]; while (stack.length > 0) { - const [cur, depth] = stack.pop()!!; + const stackItem = stack.pop()!!; - const isExpanded = expandedNodes.has(cur.id); - res.push({ - ...cur, + const {node, depth} = stackItem; + + //if the previous item has an indent guide but we don't then it was the last segment + //so we trim the bottom + const prevItemLine = last(treeNodes)?.indentGuide; + if (prevItemLine != null && stackItem.isChildOfSelectedNode === false) { + prevItemLine.trimBottom = true; + } + + const isExpanded = expandedNodes.has(node.id); + const isSelected = node.id === selectedNode; + + treeNodes.push({ + ...node, depth, isExpanded, + indentGuide: stackItem.isChildOfSelectedNode + ? { + depth: stackItem.selectedNodeDepth, + style: 'ToChildren', + //if first child of selected node add horizontal marker + addHorizontalMarker: depth === stackItem.selectedNodeDepth + 1, + trimBottom: false, + } + : null, }); + let isChildOfSelectedNode = stackItem.isChildOfSelectedNode; + let selectedNodeDepth = stackItem.selectedNodeDepth; + if (isSelected) { + isChildOfSelectedNode = true; + selectedNodeDepth = depth; + // walk back through tree nodes, while depth is greater or equal than current it is your + // parents child / your previous cousin so set dashed line + for (let i = treeNodes.length - 1; i >= 0; i--) { + const prevNode = treeNodes[i]; + if (prevNode.depth < depth) { + break; + } + prevNode.indentGuide = { + depth: selectedNodeDepth - 1, + style: 'ToParent', + addHorizontalMarker: prevNode.depth == depth, + trimBottom: prevNode.id === selectedNode, + }; + } + } + if (isExpanded) { //since we do dfs and use a stack we have to reverse children to get the order correct - for (const childId of reverse(cur.children)) { + for (const childId of reverse(node.children)) { const child = nodes.get(childId); if (child != null) { - stack.push([child, depth + 1]); + stack.push({ + node: child, + depth: depth + 1, + isChildOfSelectedNode: isChildOfSelectedNode, + selectedNodeDepth: selectedNodeDepth, + }); } } } } - return res; + return treeNodes; } function useKeyboardShortcuts( From 8dd5b57444b323626f1d1d7af65e0e76595bf9b0 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 13 Dec 2022 09:49:46 -0800 Subject: [PATCH 0418/1651] Diagnostic controller improvement Summary: The diagnostics controller is not the best crafted UIViewController. It has many things that should be improved. - This diff just sets the background of the root view to white. At least, that will ensure that its text content is always shown if the screen background happens to be black (same as font colour). - Correct offset calculation, used for scrolling. Effectively, only set it if the content to be displayed no longer fits in the scrollview viewport. Reviewed By: LukeDefeo Differential Revision: D41876904 fbshipit-source-id: e2a89d8f6001e5b626c8df1d0832e77783999b81 --- .../FlipperDiagnosticsViewController.m | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/iOS/FlipperKit/FlipperDiagnosticsViewController.m b/iOS/FlipperKit/FlipperDiagnosticsViewController.m index eb44a813a..4dc5394b3 100644 --- a/iOS/FlipperKit/FlipperDiagnosticsViewController.m +++ b/iOS/FlipperKit/FlipperDiagnosticsViewController.m @@ -37,6 +37,7 @@ static NSString* const kSKCellIdentifier = cell.textLabel.font = [UIFont fontWithName:@"Arial" size:10]; cell.textLabel.text = [self.elements[row][@"state"] stringByAppendingString:self.elements[row][@"name"]]; + return cell; } @@ -52,12 +53,19 @@ static NSString* const kSKCellIdentifier = - (void)viewDidLoad { [super viewDidLoad]; + self.view.backgroundColor = [UIColor whiteColor]; + + self.stateTable = [[UITableView alloc] + initWithFrame:CGRectMake( + 0, 0, self.view.bounds.size.width, STATE_VIEW_HEIGHT)]; + self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake( 0, STATE_VIEW_HEIGHT, self.view.frame.size.width, self.view.frame.size.height - 100 - STATE_VIEW_HEIGHT)]; + self.logLabel = [[UILabel alloc] initWithFrame:CGRectMake( 0, @@ -66,11 +74,9 @@ static NSString* const kSKCellIdentifier = self.scrollView.frame.size.height)]; self.logLabel.numberOfLines = 0; self.logLabel.font = [UIFont systemFontOfSize:10.0f]; + [self.scrollView addSubview:self.logLabel]; - self.stateTable = [[UITableView alloc] - initWithFrame:CGRectMake( - 0, 0, self.view.bounds.size.width, STATE_VIEW_HEIGHT)]; [self.stateTable registerClass:[UITableViewCell class] forCellReuseIdentifier:kSKCellIdentifier]; self.stateTable.rowHeight = 14; @@ -104,10 +110,11 @@ static NSString* const kSKCellIdentifier = [self.logLabel sizeToFit]; self.scrollView.contentSize = self.logLabel.frame.size; - // Scroll to bottom - CGPoint bottomOffset = CGPointMake( - 0, - self.scrollView.contentSize.height - self.scrollView.bounds.size.height); + CGFloat y = 0; + if (self.scrollView.contentSize.height > self.scrollView.bounds.size.height) { + y = self.scrollView.contentSize.height - self.scrollView.bounds.size.height; + } + CGPoint bottomOffset = CGPointMake(0, y); [self.scrollView setContentOffset:bottomOffset animated:YES]; } From d66b51329898b9c4c37f0342eaaf252895727ccf Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 13 Dec 2022 10:02:05 -0800 Subject: [PATCH 0419/1651] Add CK and iOS tags Summary: ^ Reviewed By: LukeDefeo Differential Revision: D41876581 fbshipit-source-id: 79b98a06abb503f4cd39a61a2ed90e7899b8fd68 --- .../public/ui-debugger/components/Tree.tsx | 5 +++++ desktop/plugins/public/ui-debugger/types.tsx | 2 +- desktop/static/icons/ck-logo.png | Bin 0 -> 5431 bytes desktop/static/icons/ck-mounted-logo.png | Bin 0 -> 5376 bytes 4 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 desktop/static/icons/ck-logo.png create mode 100644 desktop/static/icons/ck-mounted-logo.png diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 244442d97..b56fe3499 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -332,6 +332,11 @@ function HighlightedText(props: {text: string}) { function nodeIcon(node: UINode) { if (node.tags.includes('Litho')) { return ; + } else if (node.tags.includes('CK')) { + if (node.tags.includes('iOS')) { + return ; + } + return ; } } diff --git a/desktop/plugins/public/ui-debugger/types.tsx b/desktop/plugins/public/ui-debugger/types.tsx index 3dd076e5c..ca9128c1e 100644 --- a/desktop/plugins/public/ui-debugger/types.tsx +++ b/desktop/plugins/public/ui-debugger/types.tsx @@ -124,7 +124,7 @@ export type Id = number; export type MetadataId = number; export type TreeState = {expandedNodes: Id[]}; -export type Tag = 'Native' | 'Declarative' | 'Android' | 'Litho'; +export type Tag = 'Native' | 'Declarative' | 'Android' | 'Litho' | 'CK' | 'iOS'; export type Inspectable = | InspectableObject diff --git a/desktop/static/icons/ck-logo.png b/desktop/static/icons/ck-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7fda1080c69f073b8c061b456b20d51ab90153 GIT binary patch literal 5431 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 MNY6~SLdOO5KP4&Wv;Y7A literal 0 HcmV?d00001 diff --git a/desktop/static/icons/ck-mounted-logo.png b/desktop/static/icons/ck-mounted-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2409575f4e5f9a3cefa6da2711f8ab6225dbe1e5 GIT binary patch literal 5376 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 G Date: Tue, 13 Dec 2022 13:26:18 -0800 Subject: [PATCH 0420/1651] Snapshot to root of tree instead of root of subtree Summary: ^ Reviewed By: LukeDefeo Differential Revision: D42002750 fbshipit-source-id: 66639d9f55aa850d4be83adee440489cba78d321 --- desktop/plugins/public/ui-debugger/index.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index 3598d1e08..a418dd2c2 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -130,9 +130,12 @@ export function plugin(client: PluginClient) { const seenNodes = new Set(); client.onMessage('subtreeUpdate', (event) => { liveClientData = produce(liveClientData, (draft) => { - if (event.snapshot) { + // FIXME: remove node id from snapshot as is always + // for the entire screen. + const nodeId = rootId.get(); + if (event.snapshot && nodeId) { draft.snapshotInfo = { - nodeId: event.rootId, + nodeId, base64Image: event.snapshot, }; } From 12c1fdf95297cb8780f7984fc92dc857c6f53e5e Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 14 Dec 2022 08:38:58 -0800 Subject: [PATCH 0421/1651] Trim last indent guide Summary: Changelog: UIDebugger: Reimplemented Tree, inline attributes, faster performance and added indent guides Reviewed By: lblasa Differential Revision: D42031069 fbshipit-source-id: f1394ca528005e645760ea38cb5c4c805d122a4b --- desktop/plugins/public/ui-debugger/components/Tree.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index b56fe3499..821a7f44c 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -486,6 +486,12 @@ function toTreeNodes( } } + //always trim last indent guide + const prevItemLine = last(treeNodes)?.indentGuide; + if (prevItemLine != null) { + prevItemLine.trimBottom = true; + } + return treeNodes; } From a4525790a28b937d7e556e4c4f287c764dcab4d4 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 14 Dec 2022 08:41:23 -0800 Subject: [PATCH 0422/1651] Revert always root snapshot Summary: this assumption doesnt hold true for android as the snapshot is of the decor view and app bounds include the status bar / bottom bar Reviewed By: elboman Differential Revision: D42035810 fbshipit-source-id: 177b5d086487a940e0bdbe20c2a001c420a08d69 --- desktop/plugins/public/ui-debugger/index.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index a418dd2c2..3598d1e08 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -130,12 +130,9 @@ export function plugin(client: PluginClient) { const seenNodes = new Set(); client.onMessage('subtreeUpdate', (event) => { liveClientData = produce(liveClientData, (draft) => { - // FIXME: remove node id from snapshot as is always - // for the entire screen. - const nodeId = rootId.get(); - if (event.snapshot && nodeId) { + if (event.snapshot) { draft.snapshotInfo = { - nodeId, + nodeId: event.rootId, base64Image: event.snapshot, }; } From 10d7c288f57e85ca5e17f456b83f4e1409cbebd3 Mon Sep 17 00:00:00 2001 From: Dallas Gutauckis Date: Fri, 16 Dec 2022 02:39:49 -0800 Subject: [PATCH 0423/1651] Adding Brotli compression support (#4288) Summary: Closes https://github.com/facebook/flipper/issues/2578 Adds Brotli compression support for br-encoded endpoints ## Changelog - Brotli compression support Pull Request resolved: https://github.com/facebook/flipper/pull/4288 Test Plan: Confirmed `content-encoding` had `br` for Brotli and that the response text post-decompression was parsed properly: ![image](https://user-images.githubusercontent.com/117083/199068874-1577577f-2d2f-4687-a3d8-aa41a032ab32.png) ![image](https://user-images.githubusercontent.com/117083/199069109-8564ea03-99db-4c8a-9dbc-4d007fe38f5b.png) A note for reviewer(s) is that I am by no means a javascript/typescript/yarn/npm/electron/etc developer, so please please make sure I did things properly and let me know what to fix, how, why it's wrong. Thanks! Reviewed By: antonk52 Differential Revision: D41444623 Pulled By: mweststrate fbshipit-source-id: ac4e84b4501c67a4b89163c20c63de1be14d6cef --- desktop/plugins/public/network/package.json | 2 + desktop/plugins/public/network/utils.tsx | 46 +++++++++++++-------- desktop/plugins/public/yarn.lock | 19 +++++++++ 3 files changed, 50 insertions(+), 17 deletions(-) diff --git a/desktop/plugins/public/network/package.json b/desktop/plugins/public/network/package.json index 9807b1629..dc04dd17a 100644 --- a/desktop/plugins/public/network/package.json +++ b/desktop/plugins/public/network/package.json @@ -16,6 +16,7 @@ "url": "https://github.com/facebook/flipper/issues" }, "dependencies": { + "brotli": "^1.3.3", "lodash": "^4.17.21", "pako": "^2.0.3", "protobufjs": "^6.10.2", @@ -26,6 +27,7 @@ "flipper-plugin": "*" }, "devDependencies": { + "@types/brotli": "^1.3.1", "@types/pako": "^1.0.1", "js-base64": "^3.6.0" } diff --git a/desktop/plugins/public/network/utils.tsx b/desktop/plugins/public/network/utils.tsx index 8ddc9953b..c3638becc 100644 --- a/desktop/plugins/public/network/utils.tsx +++ b/desktop/plugins/public/network/utils.tsx @@ -7,6 +7,7 @@ * @format */ +import decompress from 'brotli/decompress'; import pako from 'pako'; import {Request, Header, ResponseInfo} from './types'; import {Base64} from 'js-base64'; @@ -99,26 +100,37 @@ export function decodeBody( } try { - const isGzip = getHeaderValue(headers, 'Content-Encoding') === 'gzip'; - if (isGzip) { - try { - // The request is gzipped, so convert the raw bytes back to base64 first. - const dataArr = Base64.toUint8Array(data); - // then inflate. - return isTextual(headers, dataArr) - ? // pako will detect the BOM headers and return a proper utf-8 string right away - pako.inflate(dataArr, {to: 'string'}) - : pako.inflate(dataArr); - } catch (e) { - // on iOS, the stream send to flipper is already inflated, so the content-encoding will not - // match the actual data anymore, and we should skip inflating. - // In that case, we intentionally fall-through - if (!('' + e).includes('incorrect header check')) { - throw e; + const contentEncoding = getHeaderValue(headers, 'Content-Encoding'); + switch (contentEncoding) { + // Gzip encoding + case 'gzip': { + try { + // The request is gzipped, so convert the raw bytes back to base64 first. + const dataArr = Base64.toUint8Array(data); + // then inflate. + return isTextual(headers, dataArr) + ? // pako will detect the BOM headers and return a proper utf-8 string right away + pako.inflate(dataArr, {to: 'string'}) + : pako.inflate(dataArr); + } catch (e) { + // on iOS, the stream send to flipper is already inflated, so the content-encoding will not + // match the actual data anymore, and we should skip inflating. + // In that case, we intentionally fall-through + if (!('' + e).includes('incorrect header check')) { + throw e; + } + break; } } + + // Brotli encoding (https://github.com/facebook/flipper/issues/2578) + case 'br': { + return new TextDecoder().decode( + decompress(Buffer.from(Base64.toUint8Array(data))), + ); + } } - // If this is not a gzipped request, assume we are interested in a proper utf-8 string. + // If this is not a gzipped or brotli-encoded request, assume we are interested in a proper utf-8 string. // - If the raw binary data in is needed, in base64 form, use data directly // - either directly use data (for example) const bytes = Base64.toUint8Array(data); diff --git a/desktop/plugins/public/yarn.lock b/desktop/plugins/public/yarn.lock index 573cd4398..0fb1f5e33 100644 --- a/desktop/plugins/public/yarn.lock +++ b/desktop/plugins/public/yarn.lock @@ -175,6 +175,13 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A== +"@types/brotli@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/brotli/-/brotli-1.3.1.tgz#65dc6c69bb9f4159677032f60e81ffc09faf1fce" + integrity sha512-mGwX0BBQqmpHoX8+b8Oez0X+ZEYnl2gbDL2n0HxYT4imqhTChhj1AAgAKVWNZSuPvXGZXqVoOtBS0071tN6Tkw== + dependencies: + "@types/node" "*" + "@types/d3-path@^1": version "1.0.9" resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.9.tgz#73526b150d14cd96e701597cbf346cfd1fd4a58c" @@ -385,6 +392,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-js@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -422,6 +434,13 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" +brotli@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.3.tgz#7365d8cc00f12cf765d2b2c898716bcf4b604d48" + integrity sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg== + dependencies: + base64-js "^1.1.2" + builtin-modules@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" From a498baf1c348200a119cc0e08e18eedcc65bcdd4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Dec 2022 02:39:49 -0800 Subject: [PATCH 0424/1651] Bump tslib from 2.3.1 to 2.4.1 in /desktop (#4346) Summary: Bumps [tslib](https://github.com/Microsoft/tslib) from 2.3.1 to 2.4.1.
    Release notes

    Sourced from tslib's releases.

    tslib 2.4.1

    This release contains fixes for early returns and throws invoked on generators.

    tslib 2.4.0

    This release includes the __classPrivateFieldIn helper as well as an update to __createBinding to reduce indirection between multiple re-exports.

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tslib&package-manager=npm_and_yarn&previous-version=2.3.1&new-version=2.4.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4346 Reviewed By: antonk52 Differential Revision: D41578593 Pulled By: mweststrate fbshipit-source-id: 82a3794ac67e58740e5a06135bacf7f013ff1338 --- desktop/babel-transformer/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/babel-transformer/package.json b/desktop/babel-transformer/package.json index 5d117ac84..da09cf94f 100644 --- a/desktop/babel-transformer/package.json +++ b/desktop/babel-transformer/package.json @@ -27,7 +27,7 @@ "@types/fs-extra": "^9.0.13", "@types/node": "^17.0.31", "fs-extra": "^10.1.0", - "tslib": "^2.3.1" + "tslib": "^2.4.1" }, "devDependencies": { "rimraf": "^3.0.2" From e65c190136725aa61aef2f9df59af17fb64ce378 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Dec 2022 02:39:49 -0800 Subject: [PATCH 0425/1651] Bump @babel/runtime from 7.19.4 to 7.20.6 in /react-native/ReactNativeFlipperExample (#4342) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.19.4 to 7.20.6.
    Release notes

    Sourced from @​babel/runtime's releases.

    v7.20.6 (2022-11-28)

    :bug: Bug Fix

    Committers: 1

    v7.20.5 (2022-11-28)

    Thanks @​davydof and @​SuperSodaSea for your first PRs!

    :eyeglasses: Spec Compliance

    • babel-helpers, babel-plugin-transform-destructuring, babel-plugin-transform-modules-commonjs, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime, babel-traverse
    • babel-cli, babel-helpers, babel-plugin-proposal-class-properties, babel-plugin-proposal-class-static-block, babel-plugin-transform-classes, babel-plugin-transform-runtime, babel-preset-env
    • babel-helper-create-class-features-plugin, babel-helpers, babel-plugin-proposal-decorators, babel-plugin-proposal-private-property-in-object, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime

    :bug: Bug Fix

    • babel-parser
    • babel-helper-wrap-function, babel-preset-env, babel-traverse
    • babel-plugin-transform-arrow-functions, babel-plugin-transform-parameters, babel-traverse
      • #15163 fix: Throw error when compiling super() in arrow functions with default / rest parameters (@​SuperSodaSea)
    • babel-helpers, babel-node, babel-plugin-proposal-async-generator-functions, babel-plugin-transform-regenerator, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
    • babel-helper-create-regexp-features-plugin
    • babel-parser, babel-types
    • babel-generator
    • babel-plugin-transform-block-scoping, babel-traverse

    :nail_care: Polish

    :house: Internal

    ... (truncated)

    Changelog

    Sourced from @​babel/runtime's changelog.

    v7.20.6 (2022-11-28)

    :bug: Bug Fix

    v7.20.5 (2022-11-28)

    :eyeglasses: Spec Compliance

    • babel-helpers, babel-plugin-transform-destructuring, babel-plugin-transform-modules-commonjs, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime, babel-traverse
    • babel-cli, babel-helpers, babel-plugin-proposal-class-properties, babel-plugin-proposal-class-static-block, babel-plugin-transform-classes, babel-plugin-transform-runtime, babel-preset-env
    • babel-helper-create-class-features-plugin, babel-helpers, babel-plugin-proposal-decorators, babel-plugin-proposal-private-property-in-object, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime

    :bug: Bug Fix

    • babel-parser
    • babel-helper-wrap-function, babel-preset-env, babel-traverse
    • babel-plugin-transform-arrow-functions, babel-plugin-transform-parameters, babel-traverse
      • #15163 fix: Throw error when compiling super() in arrow functions with default / rest parameters (@​SuperSodaSea)
    • babel-helpers, babel-node, babel-plugin-proposal-async-generator-functions, babel-plugin-transform-regenerator, babel-preset-env, babel-runtime-corejs2, babel-runtime-corejs3, babel-runtime
    • babel-helper-create-regexp-features-plugin
    • babel-parser, babel-types
    • babel-generator
    • babel-plugin-transform-block-scoping, babel-traverse

    :nail_care: Polish

    :house: Internal

    v7.20.4 (2022-11-08)

    :bug: Bug Fix

    • babel-generator
    • babel-generator, babel-plugin-transform-typescript

    ... (truncated)

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@babel/runtime&package-manager=npm_and_yarn&previous-version=7.19.4&new-version=7.20.6)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4342 Reviewed By: antonk52 Differential Revision: D41578605 Pulled By: mweststrate fbshipit-source-id: 012c0a9a631a26c93e4871d43af4b252fc32cd70 --- .../ReactNativeFlipperExample/package.json | 2 +- .../ReactNativeFlipperExample/yarn.lock | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/react-native/ReactNativeFlipperExample/package.json b/react-native/ReactNativeFlipperExample/package.json index 7b2afbf34..39b1f6661 100644 --- a/react-native/ReactNativeFlipperExample/package.json +++ b/react-native/ReactNativeFlipperExample/package.json @@ -18,7 +18,7 @@ }, "devDependencies": { "@babel/core": "^7.20.5", - "@babel/runtime": "^7.19.4", + "@babel/runtime": "^7.20.6", "babel-jest": "^29.1.2", "jest": "^28.1.3", "metro-react-native-babel-preset": "^0.73.1", diff --git a/react-native/ReactNativeFlipperExample/yarn.lock b/react-native/ReactNativeFlipperExample/yarn.lock index 6b71e5490..022546728 100644 --- a/react-native/ReactNativeFlipperExample/yarn.lock +++ b/react-native/ReactNativeFlipperExample/yarn.lock @@ -76,7 +76,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.20.5": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.20.6": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== @@ -937,12 +937,12 @@ pirates "^4.0.5" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.19.4", "@babel/runtime@^7.8.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.4.tgz#a42f814502ee467d55b38dd1c256f53a7b885c78" - integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.20.6", "@babel/runtime@^7.8.4": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" + integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.11" "@babel/template@^7.0.0", "@babel/template@^7.15.4", "@babel/template@^7.16.7", "@babel/template@^7.18.10", "@babel/template@^7.3.3": version "7.18.10" @@ -6315,10 +6315,10 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.2: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regenerator-transform@^0.14.2: version "0.14.5" From 989797a2253c583ef3f3c8c1b2aa4decd8f85d12 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Fri, 16 Dec 2022 03:47:58 -0800 Subject: [PATCH 0426/1651] Dynamic scaling of visualizer and resizable window Summary: Fixes https://fb.workplace.com/groups/443457641253219/permalink/480446154221034/ Reviewed By: mweststrate Differential Revision: D42095625 fbshipit-source-id: 364577141f2819dd22b0b499b11770d0bb88b1f5 --- .../components/Visualization2D.tsx | 41 +++++++++++++------ .../public/ui-debugger/components/main.tsx | 35 ++++++++++++---- 2 files changed, 56 insertions(+), 20 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx index da9fdd891..53d181579 100644 --- a/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx +++ b/desktop/plugins/public/ui-debugger/components/Visualization2D.tsx @@ -19,16 +19,18 @@ import {UIDebuggerMenuItem} from './util/UIDebuggerMenuItem'; export const Visualization2D: React.FC< { rootId: Id; + width: number; nodes: Map; selectedNode?: Id; onSelectNode: (id?: Id) => void; modifierPressed: boolean; } & React.HTMLAttributes -> = ({rootId, nodes, selectedNode, onSelectNode, modifierPressed}) => { +> = ({rootId, width, nodes, selectedNode, onSelectNode, modifierPressed}) => { const rootNodeRef = useRef(); const instance = usePlugin(plugin); const snapshot = useValue(instance.snapshot); + const snapshotNode = snapshot && nodes.get(snapshot.nodeId); const focusedNodeId = useValue(instance.uiState.focusedNode); const focusState = useMemo(() => { @@ -40,7 +42,12 @@ export const Visualization2D: React.FC< const mouseListener = throttle((ev: MouseEvent) => { const domRect = rootNodeRef.current?.getBoundingClientRect(); - if (!focusState || !domRect || instance.uiState.isContextMenuOpen.get()) { + if ( + !focusState || + !domRect || + instance.uiState.isContextMenuOpen.get() || + !snapshotNode + ) { return; } const rawMouse = {x: ev.clientX, y: ev.clientY}; @@ -51,6 +58,8 @@ export const Visualization2D: React.FC< //make the mouse coord relative to the dom rect of the visualizer + const pxScaleFactor = calcPxScaleFactor(snapshotNode.bounds, width); + const offsetMouse = offsetCoordinate(rawMouse, domRect); const scaledMouse = { x: offsetMouse.x * pxScaleFactor, @@ -78,22 +87,27 @@ export const Visualization2D: React.FC< focusState, nodes, instance.uiState.isContextMenuOpen, + width, + snapshotNode, ]); - if (!focusState) { + if (!focusState || !snapshotNode) { return null; } - const snapshotNode = snapshot && nodes.get(snapshot.nodeId); + const pxScaleFactor = calcPxScaleFactor(snapshotNode.bounds, width); return (
    + style={ + { + [pxScaleFactorCssVar]: pxScaleFactor, + width: toPx(focusState.actualRoot.bounds.width), + height: toPx(focusState.actualRoot.bounds.height), + } as React.CSSProperties + }>
    { @@ -342,6 +356,8 @@ const NodeBorder = styled.div<{tags: Tag[]; hovered: boolean}>((props) => ({ const longHoverDelay = 200; const outerBorderWidth = '10px'; const outerBorderOffset = `-${outerBorderWidth}`; +const pxScaleFactorCssVar = '--pxScaleFactor'; +const MouseThrottle = 32; //this is the thick black border around the whole vizualization, the border goes around the content //hence the top,left,right,botton being negative to increase its size @@ -358,11 +374,8 @@ const OuterBorder = styled.div({ borderRadius: '10px', }); -const pxScaleFactor = 2; -const MouseThrottle = 32; - function toPx(n: number) { - return `${n / pxScaleFactor}px`; + return `calc(${n}px / var(${pxScaleFactorCssVar})`; } function toNestedNode( @@ -506,3 +519,7 @@ function offsetCoordinate( y: coordinate.y - offset.y, }; } + +function calcPxScaleFactor(snapshotBounds: Bounds, availableWidth: number) { + return snapshotBounds.width / availableWidth; +} diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 5e6a552c2..c126843c1 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -9,7 +9,13 @@ import React, {useState} from 'react'; import {plugin} from '../index'; -import {DetailSidebar, Layout, usePlugin, useValue} from 'flipper-plugin'; +import { + DetailSidebar, + Layout, + usePlugin, + useValue, + _Sidebar as ResizablePanel, +} from 'flipper-plugin'; import {useHotkeys} from 'react-hotkeys-hook'; import {Id, Metadata, MetadataId, UINode} from '../types'; import {PerfStats} from './PerfStats'; @@ -30,6 +36,8 @@ export function Component() { const [showPerfStats, setShowPerfStats] = useState(false); const [selectedNode, setSelectedNode] = useState(undefined); + const [visualiserWidth, setVisualiserWidth] = useState(500); + useHotkeys('ctrl+i', () => setShowPerfStats((show) => !show)); const {ctrlPressed} = useKeyboardModifiers(); @@ -53,13 +61,24 @@ export function Component() { - + { + setVisualiserWidth(width); + }} + gutter> + + Date: Mon, 19 Dec 2022 09:20:27 -0800 Subject: [PATCH 0427/1651] Add entire node to raw data Reviewed By: lblasa Differential Revision: D41612115 fbshipit-source-id: a89dc1b3c994435afa9b85f6681df73f637c3f3f --- .../components/sidebar/inspector/AttributesInspector.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx index aecaf97d4..3554f9d72 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/AttributesInspector.tsx @@ -282,7 +282,12 @@ export const AttributesInspector: React.FC = ({ {...sections} {rawEnabled && ( - + )} From 0414e145a9feff359bd54850070441c9402eb659 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 19 Dec 2022 09:20:27 -0800 Subject: [PATCH 0428/1651] Port visibility and mount state for litho mountables Summary: Based off D41224546 Reviewed By: mihaelao Differential Revision: D41582451 fbshipit-source-id: 8792d40e47b2049e63a22a51363c093be310fe78 --- .../descriptors/DebugComponentDescriptor.kt | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt index ffaeedd65..960fe56b6 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt @@ -13,10 +13,13 @@ import com.facebook.flipper.plugins.uidebugger.litho.LithoTag import com.facebook.flipper.plugins.uidebugger.litho.descriptors.props.ComponentDataExtractor import com.facebook.flipper.plugins.uidebugger.litho.descriptors.props.LayoutPropExtractor import com.facebook.flipper.plugins.uidebugger.model.Bounds +import com.facebook.flipper.plugins.uidebugger.model.Inspectable import com.facebook.flipper.plugins.uidebugger.model.InspectableObject +import com.facebook.flipper.plugins.uidebugger.model.InspectableValue import com.facebook.flipper.plugins.uidebugger.model.MetadataId import com.facebook.flipper.plugins.uidebugger.util.Deferred import com.facebook.flipper.plugins.uidebugger.util.MaybeDeferred +import com.facebook.litho.Component import com.facebook.litho.DebugComponent class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescriptor { @@ -66,18 +69,31 @@ class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescripto private val LayoutId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "Litho Layout") + private val UserPropsId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "Litho Props") private val StateId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "Litho State") + private val MountingDataId = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "Mount State") + + private val isMountedAttributeId = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "mounted") + + private val isVisibleAttributeId = + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "visible") + override fun getAttributes( node: DebugComponent ): MaybeDeferred> { return Deferred { val attributeSections = mutableMapOf() + val mountingData = getMountingData(node) + attributeSections[MountingDataId] = InspectableObject(mountingData) + val layoutProps = LayoutPropExtractor.getProps(node) attributeSections[LayoutId] = InspectableObject(layoutProps.toMap()) @@ -116,4 +132,36 @@ class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescripto } return attributes } + + private fun getMountingData(node: DebugComponent): Map { + + val lithoView = node.lithoView + val mountingData = mutableMapOf() + + if (lithoView == null) { + return mountingData + } + + val mountState = lithoView.mountDelegateTarget ?: return mountingData + val componentTree = lithoView.componentTree ?: return mountingData + + val component = node.component + + if (component.mountType != Component.MountType.NONE) { + val renderUnit = DebugComponent.getRenderUnit(node, componentTree) + if (renderUnit != null) { + val renderUnitId = renderUnit.id + val isMounted = mountState.getContentById(renderUnitId) != null + mountingData[isMountedAttributeId] = InspectableValue.Boolean(isMounted) + } + } + + val visibilityOutput = DebugComponent.getVisibilityOutput(node, componentTree) + if (visibilityOutput != null) { + val isVisible = DebugComponent.isVisible(node, lithoView) + mountingData[isVisibleAttributeId] = InspectableValue.Boolean(isVisible) + } + + return mountingData + } } From 6deedabfb2034685e5d8afecaa89ecc4f8aeaf2e Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 19 Dec 2022 09:20:27 -0800 Subject: [PATCH 0429/1651] Remove UI Debugger litho components from open source build Summary: I created a separate folder under src called facedbook, which 1. isnt synced to github 2. isnt build by gradle I also needed to exclude the file with the duplicate symbol from buck. I seemed to have to move both the src/facebook and src/main under one buck file to get the exclude to work Reviewed By: lblasa Differential Revision: D41612114 fbshipit-source-id: a8386e1b1eabdeca2a800d98d8732b2ca694836b --- .../plugins/uidebugger/litho/LithoObserver.kt | 126 ------ .../litho/UIDebuggerLithoSupport.kt | 30 -- .../litho/UIDebuggerLithoSupportStub.kt | 19 + .../descriptors/DebugComponentDescriptor.kt | 167 ------- .../litho/descriptors/LithoViewDescriptor.kt | 49 -- .../descriptors/MatrixDrawableDescriptor.kt | 24 - .../descriptors/TextDrawableDescriptor.kt | 37 -- .../props/ComponentDataExtractor.kt | 179 -------- .../descriptors/props/LayoutPropExtractor.kt | 427 ------------------ 9 files changed, 19 insertions(+), 1039 deletions(-) delete mode 100644 android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt delete mode 100644 android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt create mode 100644 android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupportStub.kt delete mode 100644 android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt delete mode 100644 android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/LithoViewDescriptor.kt delete mode 100644 android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/MatrixDrawableDescriptor.kt delete mode 100644 android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/TextDrawableDescriptor.kt delete mode 100644 android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentDataExtractor.kt delete mode 100644 android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt deleted file mode 100644 index af048f84b..000000000 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoObserver.kt +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.litho - -import android.annotation.SuppressLint -import android.util.Log -import android.view.ViewTreeObserver -import com.facebook.flipper.plugins.uidebugger.LogTag -import com.facebook.flipper.plugins.uidebugger.core.Context -import com.facebook.flipper.plugins.uidebugger.descriptors.ViewDescriptor -import com.facebook.flipper.plugins.uidebugger.litho.descriptors.LithoViewDescriptor -import com.facebook.flipper.plugins.uidebugger.model.Bounds -import com.facebook.flipper.plugins.uidebugger.model.Coordinate -import com.facebook.flipper.plugins.uidebugger.observers.CoordinateUpdate -import com.facebook.flipper.plugins.uidebugger.observers.TreeObserver -import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverBuilder -import com.facebook.flipper.plugins.uidebugger.scheduler.throttleLatest -import com.facebook.flipper.plugins.uidebugger.util.objectIdentity -import com.facebook.litho.LithoView -import com.facebook.rendercore.extensions.ExtensionState -import com.facebook.rendercore.extensions.MountExtension -import kotlinx.coroutines.* - -/** - * There are 2 ways a litho view can update: - * 1. A view was added / updated / removed through a mount, This should be refelected in a change in - * props / state so we use the mount extension to capture these including the entire component - * tree - * 2. The coordinate of the litho view changes externally and doesn't cause a mount, examples: - * - Sibling changed size or position and shifted this view - * - User scrolled - * - * These are not interesting from UI debugger perspective, we don't want to send the whole subtree - * as only the Coordinate of the root litho view has changed. For this situation we send a - * lightweight coordinate update event to distinguish these 2 cases - * - * If an external event such as a scroll does does lead to a mount (new view in recycler view) this - * will be picked up by the mount extension - */ -class LithoViewTreeObserver(val context: Context) : TreeObserver() { - - override val type = "Litho" - private val throttleTimeMs = 100L - - private val waitScope = CoroutineScope(Dispatchers.IO) - private val mainScope = CoroutineScope(Dispatchers.Main) - - var lastBounds: Bounds? = null - - var nodeRef: LithoView? = null - private var preDrawListener: ViewTreeObserver.OnPreDrawListener? = null - @SuppressLint("PrivateApi") - override fun subscribe(node: Any) { - - nodeRef = node as LithoView - - Log.d(LogTag, "Subscribing to litho view ${nodeRef?.objectIdentity()}") - - val lithoDebuggerExtension = LithoDebuggerExtension(this) - node.registerUIDebugger(lithoDebuggerExtension) - - val throttledCordinateUpdate = - throttleLatest(throttleTimeMs, waitScope, mainScope) { node -> - // use the descriptor to get the bounds since we do some magic in there - val bounds = ViewDescriptor.onGetBounds(node) - if (bounds != lastBounds) { - context.treeObserverManager.enqueueUpdate( - CoordinateUpdate( - this.type, LithoViewDescriptor.getId(node), Coordinate(bounds.x, bounds.y))) - lastBounds = bounds - } - } - - preDrawListener = - ViewTreeObserver.OnPreDrawListener { - // this cases case 2 - throttledCordinateUpdate(node) - true - } - - node.viewTreeObserver.addOnPreDrawListener(preDrawListener) - - // we have already missed the first mount so we trigger it manually on subscribe - lastBounds = LithoViewDescriptor.onGetBounds(node) - processUpdate(context, node) - } - - override fun unsubscribe() { - Log.d(LogTag, "Unsubscribing from litho view ${nodeRef?.objectIdentity()}") - nodeRef?.viewTreeObserver?.removeOnPreDrawListener(preDrawListener) - nodeRef?.unregisterUIDebugger() - nodeRef = null - } -} - -class LithoDebuggerExtension(val observer: LithoViewTreeObserver) : MountExtension() { - - override fun createState(): Void? { - return null - } - - /** - * The call guaranteed to be called after new layout mounted completely on the main thread. - * mounting includes adding updating or removing views from the heriachy - */ - override fun afterMount(state: ExtensionState) { - Log.i(LogTag, "After mount called for litho view ${observer.nodeRef?.objectIdentity()}") - observer.lastBounds = ViewDescriptor.onGetBounds(state.rootHost) - observer.processUpdate(observer.context, state.rootHost as Any) - } -} - -object LithoViewTreeObserverBuilder : TreeObserverBuilder { - override fun canBuildFor(node: Any): Boolean { - return node is LithoView - } - - override fun build(context: Context): TreeObserver { - return LithoViewTreeObserver(context) - } -} diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt deleted file mode 100644 index d2bb0234a..000000000 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.litho - -import com.facebook.flipper.plugins.uidebugger.descriptors.DescriptorRegister -import com.facebook.flipper.plugins.uidebugger.litho.descriptors.* -import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory -import com.facebook.litho.DebugComponent -import com.facebook.litho.LithoView -import com.facebook.litho.MatrixDrawable -import com.facebook.litho.widget.TextDrawable - -const val LithoTag = "Litho" - -object UIDebuggerLithoSupport { - - fun addDescriptors(register: DescriptorRegister) { - register.register(LithoView::class.java, LithoViewDescriptor) - register.register(DebugComponent::class.java, DebugComponentDescriptor(register)) - register.register(TextDrawable::class.java, TextDrawableDescriptor) - register.register(MatrixDrawable::class.java, MatrixDrawableDescriptor) - } - - fun addObserver(observerFactory: TreeObserverFactory) {} -} diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupportStub.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupportStub.kt new file mode 100644 index 000000000..ba428ef3b --- /dev/null +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupportStub.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.flipper.plugins.uidebugger.litho + +import com.facebook.flipper.plugins.uidebugger.descriptors.DescriptorRegister +import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory + +// this is not used internally +object UIDebuggerLithoSupport { + + fun addDescriptors(register: DescriptorRegister) {} + + fun addObserver(observerFactory: TreeObserverFactory) {} +} diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt deleted file mode 100644 index 960fe56b6..000000000 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/DebugComponentDescriptor.kt +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.litho.descriptors - -import android.graphics.Bitmap -import com.facebook.flipper.plugins.uidebugger.descriptors.* -import com.facebook.flipper.plugins.uidebugger.litho.LithoTag -import com.facebook.flipper.plugins.uidebugger.litho.descriptors.props.ComponentDataExtractor -import com.facebook.flipper.plugins.uidebugger.litho.descriptors.props.LayoutPropExtractor -import com.facebook.flipper.plugins.uidebugger.model.Bounds -import com.facebook.flipper.plugins.uidebugger.model.Inspectable -import com.facebook.flipper.plugins.uidebugger.model.InspectableObject -import com.facebook.flipper.plugins.uidebugger.model.InspectableValue -import com.facebook.flipper.plugins.uidebugger.model.MetadataId -import com.facebook.flipper.plugins.uidebugger.util.Deferred -import com.facebook.flipper.plugins.uidebugger.util.MaybeDeferred -import com.facebook.litho.Component -import com.facebook.litho.DebugComponent - -class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescriptor { - private val NAMESPACE = "DebugComponent" - - /* - * Debug component is generated on the fly so use the underlying component instance which is - * immutable - */ - override fun getId(node: DebugComponent): Id = node.globalKey.hashCode() - - override fun getName(node: DebugComponent): String = node.component.simpleName - - override fun getQualifiedName(node: com.facebook.litho.DebugComponent): String = - node.component::class.qualifiedName ?: "" - - override fun getChildren(node: DebugComponent): List { - val result = mutableListOf() - - val mountedView = node.mountedView - val mountedDrawable = node.mountedDrawable - - if (mountedView != null) { - val descriptor: NodeDescriptor = register.descriptorForClassUnsafe(mountedView.javaClass) - /** - * When we ask android for the bounds the x,y offset is w.r.t to the nearest android parent - * view group. From UI debuggers perspective using the raw android offset will double the - * total offset of this native view as the offset is included by the litho components between - * the mounted view and its native parent - */ - result.add(OffsetChild.zero(mountedView, descriptor)) - } else if (mountedDrawable != null) { - /** - * don't emit mounted drawables since they are leaf nodes and its somewhat tricky to get the - * wireframe bounds to play nice. Something to address later if there is feedback - */ - } else { - for (child in node.childComponents) { - result.add(child) - } - } - - return result - } - - override fun getActiveChild(node: DebugComponent): Any? = null - - private val LayoutId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "Litho Layout") - - private val UserPropsId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "Litho Props") - - private val StateId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "Litho State") - - private val MountingDataId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "Mount State") - - private val isMountedAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "mounted") - - private val isVisibleAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "visible") - - override fun getAttributes( - node: DebugComponent - ): MaybeDeferred> { - return Deferred { - val attributeSections = mutableMapOf() - - val mountingData = getMountingData(node) - attributeSections[MountingDataId] = InspectableObject(mountingData) - - val layoutProps = LayoutPropExtractor.getProps(node) - attributeSections[LayoutId] = InspectableObject(layoutProps.toMap()) - - if (!node.canResolve()) { - val stateContainer = node.stateContainer - if (stateContainer != null) { - attributeSections[StateId] = - ComponentDataExtractor.getState(stateContainer, node.component.simpleName) - } - - val props = ComponentDataExtractor.getProps(node.component) - - attributeSections[UserPropsId] = InspectableObject(props.toMap()) - } - - attributeSections - } - } - - override fun getBounds(node: DebugComponent): Bounds = - Bounds.fromRect(node.boundsInParentDebugComponent) - - override fun getTags(node: DebugComponent): Set = setOf(BaseTags.Declarative, LithoTag) - - override fun getSnapshot(node: DebugComponent, bitmap: Bitmap?): Bitmap? = null - - override fun getInlineAttributes(node: DebugComponent): Map { - val attributes = mutableMapOf() - val key = node.key - val testKey = node.testKey - if (key != null && key.trim { it <= ' ' }.length > 0) { - attributes["key"] = key - } - if (testKey != null && testKey.trim { it <= ' ' }.length > 0) { - attributes["testKey"] = testKey - } - return attributes - } - - private fun getMountingData(node: DebugComponent): Map { - - val lithoView = node.lithoView - val mountingData = mutableMapOf() - - if (lithoView == null) { - return mountingData - } - - val mountState = lithoView.mountDelegateTarget ?: return mountingData - val componentTree = lithoView.componentTree ?: return mountingData - - val component = node.component - - if (component.mountType != Component.MountType.NONE) { - val renderUnit = DebugComponent.getRenderUnit(node, componentTree) - if (renderUnit != null) { - val renderUnitId = renderUnit.id - val isMounted = mountState.getContentById(renderUnitId) != null - mountingData[isMountedAttributeId] = InspectableValue.Boolean(isMounted) - } - } - - val visibilityOutput = DebugComponent.getVisibilityOutput(node, componentTree) - if (visibilityOutput != null) { - val isVisible = DebugComponent.isVisible(node, lithoView) - mountingData[isVisibleAttributeId] = InspectableValue.Boolean(isVisible) - } - - return mountingData - } -} diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/LithoViewDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/LithoViewDescriptor.kt deleted file mode 100644 index 48ae601e0..000000000 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/LithoViewDescriptor.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.litho.descriptors - -import com.facebook.flipper.plugins.uidebugger.descriptors.ChainedDescriptor -import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister -import com.facebook.flipper.plugins.uidebugger.model.InspectableObject -import com.facebook.flipper.plugins.uidebugger.model.InspectableValue -import com.facebook.flipper.plugins.uidebugger.model.MetadataId -import com.facebook.litho.DebugComponent -import com.facebook.litho.LithoView - -object LithoViewDescriptor : ChainedDescriptor() { - - private const val NAMESPACE = "LithoView" - private val SectionId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) - - override fun onGetName(node: LithoView): String = node.javaClass.simpleName - - override fun onGetChildren(node: LithoView): List { - val result = mutableListOf() - val debugComponent = DebugComponent.getRootInstance(node) - if (debugComponent != null) { - result.add(debugComponent) - } - return result - } - - private val IsIncrementalMountEnabledAttributeId = - MetadataRegister.register( - MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "isIncrementalMountEnabled") - - override fun onGetAttributes( - node: LithoView, - attributeSections: MutableMap - ) { - attributeSections[SectionId] = - InspectableObject( - mapOf( - IsIncrementalMountEnabledAttributeId to - InspectableValue.Boolean(node.isIncrementalMountEnabled))) - } -} diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/MatrixDrawableDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/MatrixDrawableDescriptor.kt deleted file mode 100644 index f6368c200..000000000 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/MatrixDrawableDescriptor.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.litho.descriptors - -import com.facebook.flipper.plugins.uidebugger.descriptors.ChainedDescriptor -import com.facebook.litho.MatrixDrawable - -object MatrixDrawableDescriptor : ChainedDescriptor>() { - - override fun onGetChildren(node: MatrixDrawable<*>): List? { - val mountedDrawable = node.mountedDrawable - return if (mountedDrawable != null) { - listOf(mountedDrawable) - } else { - listOf() - } - } - override fun onGetName(node: MatrixDrawable<*>): String = node.javaClass.simpleName -} diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/TextDrawableDescriptor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/TextDrawableDescriptor.kt deleted file mode 100644 index 842603704..000000000 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/TextDrawableDescriptor.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.litho.descriptors - -import com.facebook.flipper.plugins.uidebugger.descriptors.ChainedDescriptor -import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister -import com.facebook.flipper.plugins.uidebugger.model.Inspectable -import com.facebook.flipper.plugins.uidebugger.model.InspectableObject -import com.facebook.flipper.plugins.uidebugger.model.InspectableValue -import com.facebook.flipper.plugins.uidebugger.model.MetadataId -import com.facebook.litho.widget.TextDrawable - -object TextDrawableDescriptor : ChainedDescriptor() { - - private const val NAMESPACE = "TextDrawable" - private val SectionId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) - - override fun onGetName(node: TextDrawable): String = node.javaClass.simpleName - - private val TextAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "text") - override fun onGetAttributes( - node: TextDrawable, - attributeSections: MutableMap - ) { - val props = - mapOf(TextAttributeId to InspectableValue.Text(node.text.toString())) - - attributeSections[SectionId] = InspectableObject(props) - } -} diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentDataExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentDataExtractor.kt deleted file mode 100644 index 8808b17ae..000000000 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentDataExtractor.kt +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.litho.descriptors.props - -import android.graphics.drawable.ColorDrawable -import android.graphics.drawable.Drawable -import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister -import com.facebook.flipper.plugins.uidebugger.model.* -import com.facebook.litho.Component -import com.facebook.litho.SpecGeneratedComponent -import com.facebook.litho.StateContainer -import com.facebook.litho.annotations.Prop -import com.facebook.litho.annotations.ResType -import com.facebook.litho.annotations.State -import com.facebook.litho.editor.EditorRegistry -import com.facebook.litho.editor.model.EditorArray -import com.facebook.litho.editor.model.EditorBool -import com.facebook.litho.editor.model.EditorColor -import com.facebook.litho.editor.model.EditorNumber -import com.facebook.litho.editor.model.EditorPick -import com.facebook.litho.editor.model.EditorShape -import com.facebook.litho.editor.model.EditorString -import com.facebook.litho.editor.model.EditorValue -import com.facebook.litho.editor.model.EditorValue.EditorVisitor - -object ComponentDataExtractor { - - fun getProps(component: Component): Map { - val props = mutableMapOf() - - val isSpecComponent = component is SpecGeneratedComponent - - for (declaredField in component.javaClass.declaredFields) { - declaredField.isAccessible = true - - val name = declaredField.name - val declaredFieldAnnotation = declaredField.getAnnotation(Prop::class.java) - - // Only expose `@Prop` annotated fields for Spec components - if (isSpecComponent && declaredFieldAnnotation == null) { - continue - } - - val prop = - try { - declaredField[component] - } catch (e: IllegalAccessException) { - continue - } - - if (declaredFieldAnnotation != null) { - val resType = declaredFieldAnnotation.resType - if (resType == ResType.COLOR) { - if (prop != null) { - val identifier = getMetadataId(component.simpleName, name) - props[identifier] = InspectableValue.Color(Color.fromColor(prop as Int)) - } - continue - } else if (resType == ResType.DRAWABLE) { - val identifier = getMetadataId(component.simpleName, name) - props[identifier] = fromDrawable(prop as Drawable?) - continue - } - } - - val editorValue: EditorValue? = - EditorRegistry.read(declaredField.type, declaredField, component) - - if (editorValue != null) { - addProp(props, component.simpleName, name, editorValue) - } - } - - return props - } - - fun getState(stateContainer: StateContainer, componentName: String): InspectableObject { - - val stateFields = mutableMapOf() - for (field in stateContainer.javaClass.declaredFields) { - field.isAccessible = true - val stateAnnotation = field.getAnnotation(State::class.java) - val isKStateField = field.name == "mStates" - if (stateAnnotation != null || isKStateField) { - val id = getMetadataId(componentName, field.name) - val editorValue: EditorValue? = EditorRegistry.read(field.type, field, stateContainer) - if (editorValue != null) { - stateFields[id] = toInspectable(field.name, editorValue) - } - } - } - - return InspectableObject(stateFields) - } - - private fun getMetadataId( - namespace: String, - key: String, - mutable: Boolean = false, - possibleValues: Set? = emptySet() - ): MetadataId { - val metadata = MetadataRegister.get(namespace, key) - val identifier = - metadata?.id - ?: MetadataRegister.register( - MetadataRegister.TYPE_ATTRIBUTE, namespace, key, mutable, possibleValues) - return identifier - } - - private fun addProp( - props: MutableMap, - namespace: String, - name: String, - value: EditorValue - ) { - var possibleValues: MutableSet? = null - if (value is EditorPick) { - possibleValues = mutableSetOf() - value.values.forEach { possibleValues.add(InspectableValue.Text(it)) } - } - - val identifier = getMetadataId(namespace, name, false, possibleValues) - props[identifier] = toInspectable(name, value) - } - - private fun toInspectable(name: String, editorValue: EditorValue): Inspectable { - return editorValue.`when`( - object : EditorVisitor { - override fun isShape(shape: EditorShape): Inspectable { - - val fields = mutableMapOf() - shape.value.entries.forEach { entry -> - val value = toInspectable(entry.key, entry.value) - - val shapeEditorValue = entry.value - var possibleValues: MutableSet? = null - if (shapeEditorValue is EditorPick) { - possibleValues = mutableSetOf() - shapeEditorValue.values.forEach { possibleValues.add(InspectableValue.Text(it)) } - } - - val identifier = getMetadataId(name, entry.key, false, possibleValues) - fields[identifier] = value - } - - return InspectableObject(fields) - } - - override fun isArray(array: EditorArray?): Inspectable { - val values = array?.value?.map { value -> toInspectable(name, value) } - return InspectableArray(values ?: listOf()) - } - - override fun isPick(pick: EditorPick): Inspectable = InspectableValue.Enum(pick.selected) - - override fun isNumber(number: EditorNumber): Inspectable = - InspectableValue.Number(number.value) - - override fun isColor(number: EditorColor): Inspectable = - InspectableValue.Color(number.value.toInt().let { Color.fromColor(it) }) - - override fun isString(string: EditorString): Inspectable = - InspectableValue.Text(string.value ?: "") - - override fun isBool(bool: EditorBool): Inspectable = InspectableValue.Boolean(bool.value) - }) - } - - private fun fromDrawable(d: Drawable?): Inspectable = - when (d) { - is ColorDrawable -> InspectableValue.Color(Color.fromColor(d.color)) - else -> InspectableValue.Unknown(d.toString()) - } -} diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt deleted file mode 100644 index 602bbd019..000000000 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt +++ /dev/null @@ -1,427 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.litho.descriptors.props - -import android.graphics.drawable.ColorDrawable -import android.graphics.drawable.Drawable -import com.facebook.flipper.plugins.uidebugger.common.enumToInspectableSet -import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister -import com.facebook.flipper.plugins.uidebugger.model.* -import com.facebook.litho.DebugComponent -import com.facebook.yoga.* - -object LayoutPropExtractor { - private const val NAMESPACE = "LayoutPropExtractor" - - private var BackgroundId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "background") - private var ForegroundId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "foreground") - - private val DirectionId = - MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, - NAMESPACE, - "direction", - false, - enumToInspectableSet()) - private val FlexDirectionId = - MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, - NAMESPACE, - "flexDirection", - false, - enumToInspectableSet()) - private val JustifyContentId = - MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, - NAMESPACE, - "justifyContent", - false, - enumToInspectableSet()) - private val AlignItemsId = - MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, - NAMESPACE, - "alignItems", - false, - enumToInspectableSet()) - private val AlignSelfId = - MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, - NAMESPACE, - "alignSelf", - false, - enumToInspectableSet()) - private val AlignContentId = - MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, - NAMESPACE, - "alignContent", - false, - enumToInspectableSet()) - private val PositionTypeId = - MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, - NAMESPACE, - "positionType", - false, - enumToInspectableSet()) - - private val FlexGrowId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "flexGrow") - private val FlexShrinkId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "flexShrink") - private val FlexBasisId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "flexBasis") - private val WidthId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "width") - private val HeightId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "height") - private val MinWidthId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "minWidth") - private val MinHeightId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "minHeight") - private val MaxWidthId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "maxWidth") - private val MaxHeightId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "maxHeight") - private val AspectRatioId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "aspectRatio") - - private val MarginId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "margin") - private val PaddingId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "padding") - private val BorderId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "border") - private val PositionId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "position") - - private val LeftId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "left") - private val TopId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "top") - private val RightId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "right") - private val BottomId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "bottom") - private val StartId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "start") - private val EndId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "end") - private val HorizontalId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "horizontal") - private val VerticalId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "vertical") - private val AllId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "all") - - private val HasViewOutputId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "hasViewOutput") - private val AlphaId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alpha") - private val ScaleId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "scale") - private val RotationId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "rotation") - - private val EmptyId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "") - private val NoneId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "none") - private val SizeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "size") - private val ViewOutputId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "viewOutput") - - fun getInspectableBox( - left: YogaValue?, - top: YogaValue?, - right: YogaValue?, - bottom: YogaValue?, - horizontal: YogaValue?, - vertical: YogaValue?, - all: YogaValue?, - start: YogaValue?, - end: YogaValue? - ): InspectableObject { - val props = mutableMapOf() - - var actualLeft = 0 - var actualTop = 0 - var actualRight = 0 - var actualBottom = 0 - - all?.let { yogaValue -> - if (yogaValue.unit != YogaUnit.UNDEFINED) { - if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { - val intValue = yogaValue.value.toInt() - actualLeft = intValue - actualTop = intValue - actualRight = intValue - actualBottom = intValue - } - - props[AllId] = InspectableValue.Text(yogaValue.toString()) - } - } - - horizontal?.let { yogaValue -> - if (yogaValue.unit != YogaUnit.UNDEFINED) { - if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { - val intValue = yogaValue.value.toInt() - actualLeft = intValue - actualRight = intValue - } - - props[HorizontalId] = InspectableValue.Text(yogaValue.toString()) - } - } - - vertical?.let { yogaValue -> - if (yogaValue.unit != YogaUnit.UNDEFINED) { - if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { - val intValue = yogaValue.value.toInt() - actualTop = intValue - actualBottom = intValue - } - - props[VerticalId] = InspectableValue.Text(yogaValue.toString()) - } - } - - left?.let { yogaValue -> - if (yogaValue.unit != YogaUnit.UNDEFINED) { - if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { - val intValue = yogaValue.value.toInt() - actualLeft = intValue - } - - props[LeftId] = InspectableValue.Text(yogaValue.toString()) - } - } - - right?.let { yogaValue -> - if (yogaValue.unit != YogaUnit.UNDEFINED) { - if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { - val intValue = yogaValue.value.toInt() - actualRight = intValue - } - - props[RightId] = InspectableValue.Text(yogaValue.toString()) - } - } - - top?.let { yogaValue -> - if (yogaValue.unit != YogaUnit.UNDEFINED) { - if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { - val intValue = yogaValue.value.toInt() - actualTop = intValue - } - - props[TopId] = InspectableValue.Text(yogaValue.toString()) - } - } - - bottom?.let { yogaValue -> - if (yogaValue.unit != YogaUnit.UNDEFINED) { - if (yogaValue.unit == YogaUnit.POINT || yogaValue.unit == YogaUnit.PERCENT) { - val intValue = yogaValue.value.toInt() - actualBottom = intValue - } - - props[BottomId] = InspectableValue.Text(yogaValue.toString()) - } - } - - props[EmptyId] = - InspectableValue.SpaceBox(SpaceBox(actualTop, actualRight, actualBottom, actualLeft)) - - return InspectableObject(props) - } - - fun getInspectableBoxRaw( - left: Float?, - top: Float?, - right: Float?, - bottom: Float?, - horizontal: Float?, - vertical: Float?, - all: Float?, - start: Float?, - end: Float? - ): InspectableObject { - val props = mutableMapOf() - - var actualLeft = 0 - var actualTop = 0 - var actualRight = 0 - var actualBottom = 0 - - all?.let { value -> - if (!value.isNaN()) { - val intValue = value.toInt() - actualLeft = intValue - actualTop = intValue - actualRight = intValue - actualBottom = intValue - props[AllId] = InspectableValue.Number(value) - } - } - - horizontal?.let { value -> - if (!value.isNaN()) { - val intValue = value.toInt() - actualLeft = intValue - actualRight = intValue - props[HorizontalId] = InspectableValue.Number(value) - } - } - - vertical?.let { value -> - if (!value.isNaN()) { - val intValue = value.toInt() - actualTop = intValue - actualBottom = intValue - props[VerticalId] = InspectableValue.Number(value) - } - } - - left?.let { value -> - if (!value.isNaN()) { - val intValue = value.toInt() - actualLeft = intValue - props[LeftId] = InspectableValue.Number(value) - } - } - - right?.let { value -> - if (!value.isNaN()) { - val intValue = value.toInt() - actualRight = intValue - props[RightId] = InspectableValue.Number(value) - } - } - - top?.let { value -> - if (!value.isNaN()) { - val intValue = value.toInt() - actualTop = intValue - props[TopId] = InspectableValue.Number(value) - } - } - - bottom?.let { value -> - if (!value.isNaN()) { - val intValue = value.toInt() - actualBottom = intValue - props[BottomId] = InspectableValue.Number(value) - } - } - - props[EmptyId] = - InspectableValue.SpaceBox(SpaceBox(actualTop, actualRight, actualBottom, actualLeft)) - - return InspectableObject(props) - } - - fun getProps(component: DebugComponent): Map { - val props = mutableMapOf() - - val layout = component.layoutNode ?: return props - - props[AlignItemsId] = InspectableValue.Enum(layout.alignItems.name) - props[AlignSelfId] = InspectableValue.Enum(layout.alignSelf.name) - props[AlignContentId] = InspectableValue.Enum(layout.alignContent.name) - - props[AspectRatioId] = InspectableValue.Text(layout.aspectRatio.toString()) - - layout.background?.let { drawable -> props[BackgroundId] = fromDrawable(drawable) } - - props[DirectionId] = InspectableValue.Enum(layout.layoutDirection.name) - - props[FlexBasisId] = InspectableValue.Text(layout.flexBasis.toString()) - props[FlexDirectionId] = InspectableValue.Enum(layout.flexDirection.name) - props[FlexGrowId] = InspectableValue.Text(layout.flexGrow.toString()) - props[FlexShrinkId] = InspectableValue.Text(layout.flexShrink.toString()) - - layout.foreground?.let { drawable -> props[ForegroundId] = fromDrawable(drawable) } - - props[JustifyContentId] = InspectableValue.Enum(layout.justifyContent.name) - - props[PositionTypeId] = InspectableValue.Enum(layout.positionType.name) - - val size: MutableMap = mutableMapOf() - size[WidthId] = InspectableValue.Text(layout.width.toString()) - if (layout.minWidth.unit != YogaUnit.UNDEFINED) - size[MinWidthId] = InspectableValue.Text(layout.minWidth.toString()) - if (layout.maxWidth.unit != YogaUnit.UNDEFINED) - size[MaxWidthId] = InspectableValue.Text(layout.maxWidth.toString()) - size[HeightId] = InspectableValue.Text(layout.height.toString()) - if (layout.minHeight.unit != YogaUnit.UNDEFINED) - size[MinHeightId] = InspectableValue.Text(layout.minHeight.toString()) - if (layout.maxHeight.unit != YogaUnit.UNDEFINED) - size[MaxHeightId] = InspectableValue.Text(layout.maxHeight.toString()) - - props[SizeId] = InspectableObject(size) - - props[MarginId] = - getInspectableBox( - layout.getMargin(YogaEdge.LEFT), - layout.getMargin(YogaEdge.TOP), - layout.getMargin(YogaEdge.RIGHT), - layout.getMargin(YogaEdge.BOTTOM), - layout.getMargin(YogaEdge.HORIZONTAL), - layout.getMargin(YogaEdge.VERTICAL), - layout.getMargin(YogaEdge.ALL), - layout.getMargin(YogaEdge.START), - layout.getMargin(YogaEdge.END)) - - props[PaddingId] = - getInspectableBox( - layout.getPadding(YogaEdge.LEFT), - layout.getPadding(YogaEdge.TOP), - layout.getPadding(YogaEdge.RIGHT), - layout.getPadding(YogaEdge.BOTTOM), - layout.getPadding(YogaEdge.HORIZONTAL), - layout.getPadding(YogaEdge.VERTICAL), - layout.getPadding(YogaEdge.ALL), - layout.getPadding(YogaEdge.START), - layout.getPadding(YogaEdge.END)) - - props[BorderId] = - getInspectableBoxRaw( - layout.getBorderWidth(YogaEdge.LEFT), - layout.getBorderWidth(YogaEdge.TOP), - layout.getBorderWidth(YogaEdge.RIGHT), - layout.getBorderWidth(YogaEdge.BOTTOM), - layout.getBorderWidth(YogaEdge.HORIZONTAL), - layout.getBorderWidth(YogaEdge.VERTICAL), - layout.getBorderWidth(YogaEdge.ALL), - layout.getBorderWidth(YogaEdge.START), - layout.getBorderWidth(YogaEdge.END)) - - props[PositionId] = - getInspectableBox( - layout.getPosition(YogaEdge.LEFT), - layout.getPosition(YogaEdge.TOP), - layout.getPosition(YogaEdge.RIGHT), - layout.getPosition(YogaEdge.BOTTOM), - layout.getPosition(YogaEdge.HORIZONTAL), - layout.getPosition(YogaEdge.VERTICAL), - layout.getPosition(YogaEdge.ALL), - layout.getPosition(YogaEdge.START), - layout.getPosition(YogaEdge.END)) - - val viewOutput: MutableMap = mutableMapOf() - viewOutput[HasViewOutputId] = InspectableValue.Boolean(layout.hasViewOutput()) - if (layout.hasViewOutput()) { - viewOutput[AlphaId] = InspectableValue.Number(layout.alpha) - viewOutput[RotationId] = InspectableValue.Number(layout.rotation) - viewOutput[ScaleId] = InspectableValue.Number(layout.scale) - } - props[ViewOutputId] = InspectableObject(viewOutput) - - return props - } - - private fun fromDrawable(d: Drawable?): Inspectable = - when (d) { - is ColorDrawable -> InspectableValue.Color(Color.fromColor(d.color)) - else -> InspectableValue.Unknown(d.toString()) - } -} From ec8d34d556134705eaf93ebf06bb1d5aadee7407 Mon Sep 17 00:00:00 2001 From: Raahul Natarrajan Date: Mon, 19 Dec 2022 14:06:03 -0800 Subject: [PATCH 0430/1651] Create VR Call Hub Flipper plugin Summary: As part of BE, this diff creates the initial Flipper plugin for VR Call Hub using `scarf flipper-plugin` from the tutorial https://www.internalfb.com/intern/staticdocs/flipper/docs/tutorial/intro/ Differential Revision: D42146201 fbshipit-source-id: 8bc52184b21b2e47304f694068d11fd962b07b9d --- desktop/static/icons.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/desktop/static/icons.json b/desktop/static/icons.json index f43a07261..d36548c50 100644 --- a/desktop/static/icons.json +++ b/desktop/static/icons.json @@ -658,5 +658,8 @@ ], "square-ruler": [ 16 + ], + "phone": [ + 16 ] } From 2f4c88c8d1f6a17d76dd2ec8e0f115348ea197f4 Mon Sep 17 00:00:00 2001 From: Alvin Xu Date: Thu, 29 Dec 2022 19:45:03 -0800 Subject: [PATCH 0431/1651] Fix typo 'Isues and Questions' in documentation Summary: Someone https://github.com/facebook/flipper/pull/4413 already submitted a PR for D42282801 for T141305192 so i figured i'd give it to them. However, that only covered ios-native documentation. found/fixed the other instances of the typo in android-native and react-native-ios https://www.internalfb.com/intern/staticdocs/flipper/docs/getting-started/android-native/ https://www.internalfb.com/intern/staticdocs/flipper/docs/getting-started/react-native-ios/ Differential Revision: D42282609 fbshipit-source-id: 3e6b34a8e828334784ed42dc33c12df8a726f124 --- docs/getting-started/android-native.mdx | 2 +- docs/getting-started/react-native-ios.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index f23d5bb2d..56f567f5d 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -139,6 +139,6 @@ Above, the Layout Inspector plugin has been added to get you started. See the Date: Fri, 6 Jan 2023 06:15:44 -0800 Subject: [PATCH 0432/1651] Plugin RPC errors should not cause crash report Summary: This code path is when a send results in an error being returned from the client. We reject the promise but also raise an error on the message bus. There is a handler for this 'error' event that is raised that is over zelous and reports a crash to the crash reporter. This should not happen Reviewed By: lblasa Differential Revision: D42385292 fbshipit-source-id: f668a396b0d266ee9d1c7c1ca740e7bb5ae9608a --- desktop/flipper-frontend-core/src/AbstractClient.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/desktop/flipper-frontend-core/src/AbstractClient.tsx b/desktop/flipper-frontend-core/src/AbstractClient.tsx index dfaef0a4b..85e8cb72e 100644 --- a/desktop/flipper-frontend-core/src/AbstractClient.tsx +++ b/desktop/flipper-frontend-core/src/AbstractClient.tsx @@ -327,12 +327,6 @@ export default abstract class AbstractClient extends EventEmitter { resolve && resolve(data.success); } else if (data.error) { reject(data.error); - const {error} = data; - if (error) { - this.emit('error', error); - } - } else { - // ??? } } From 3deaa15273e35ac6ee50ac3f8615529c0f74da5a Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Fri, 6 Jan 2023 06:52:19 -0800 Subject: [PATCH 0433/1651] Add Logging @ FB page Reviewed By: passy Differential Revision: D42386021 fbshipit-source-id: cd89415a3845bffa9edd9b3a63d4d1a4d5b8d56c --- website/sidebars.js | 1 + 1 file changed, 1 insertion(+) diff --git a/website/sidebars.js b/website/sidebars.js index b80c8b401..86501d599 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -114,6 +114,7 @@ module.exports = { 'extending/debugging', ...fbInternalOnly([ 'fb/adding-analytics-0', + 'fb/logging', 'extending/fb/plugin-documentation', ]), 'extending/plugin-distribution', From 45770eeff4f14e4a4b64d356e755bb81e12ff6d9 Mon Sep 17 00:00:00 2001 From: Anton Nikolaev Date: Fri, 6 Jan 2023 09:29:44 -0800 Subject: [PATCH 0434/1651] Small wording fix regarding support of iOS for Navigation plugin Summary: There is no support of navigation plugin outside of Meta and it is not planned, so it's better to state directly in open-source docs instead of saying "Coming soon". Reviewed By: lblasa Differential Revision: D42370752 fbshipit-source-id: 23d6400ab7374877a0b13ae3b9c79fcb584763db --- desktop/plugins/public/navigation/docs/setup.mdx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/desktop/plugins/public/navigation/docs/setup.mdx b/desktop/plugins/public/navigation/docs/setup.mdx index 2abdf2db3..94e24217d 100644 --- a/desktop/plugins/public/navigation/docs/setup.mdx +++ b/desktop/plugins/public/navigation/docs/setup.mdx @@ -74,7 +74,3 @@ public class DeepLinkApplication extends Application { } } ``` - -## iOS - -iOS support is coming soon. From f8161d67a0972ce1122a4da669bb5baf51c5a964 Mon Sep 17 00:00:00 2001 From: Anton Nikolaev Date: Fri, 6 Jan 2023 09:29:44 -0800 Subject: [PATCH 0435/1651] Fix generating separate fb-internal docs for plugins Reviewed By: lblasa Differential Revision: D42370725 fbshipit-source-id: 0f0a1c9676aaa8a57ed8e4a6e973ef476ca757d3 --- website/generate-plugin-docs.ts | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/website/generate-plugin-docs.ts b/website/generate-plugin-docs.ts index 62a7f2358..bb1c02946 100644 --- a/website/generate-plugin-docs.ts +++ b/website/generate-plugin-docs.ts @@ -69,16 +69,16 @@ async function generatePluginDocs() { const id = name.replace('flipper-plugin-', ''); const generatedPluginResourcesPath = path.join(generatedPluginSymlinksDir, id); await fs.symlink(pluginSourceDocsDir, generatedPluginResourcesPath, 'junction'); - const setupDocPath = path.join(pluginSourceDocsDir, 'setup.mdx'); - const setupDocsExists = await fs.pathExists( - setupDocPath, - ); - const overviewDocPath = path.join(pluginSourceDocsDir, 'overview.mdx'); - const overviewDocsExists = await fs.pathExists( - overviewDocPath, - ); + const [setupDocRelativePath, overviewDocRelativePath] = await Promise.all([ + getInternalOrPublicDocRelativePathOrNull(pluginSourceDocsDir, 'setup.mdx'), + getInternalOrPublicDocRelativePathOrNull(pluginSourceDocsDir, 'overview.mdx'), + ]); + const setupDocsExists = setupDocRelativePath !== null; + const overviewDocsExists = overviewDocRelativePath !== null; if (setupDocsExists) { + const setupDocPath = path.join(pluginSourceDocsDir, setupDocRelativePath); const customEditUrl = `${repoUrl}/${path.relative(repoRoot, setupDocPath)}`; + const setupArticleImportPath = path.join(relativePluginSymlinksDir, id, setupDocRelativePath); await fs.writeFile( path.join(generatedPluginsSetupDocsDir, `${id}.mdx`), `--- @@ -87,7 +87,7 @@ title: ${title} Plugin Setup sidebar_label: ${title} custom_edit_url: ${customEditUrl} --- -import Article from '${relativePluginSymlinksDir}/${id}/setup.mdx'; +import Article from '${setupArticleImportPath}';
    `, @@ -95,7 +95,9 @@ import Article from '${relativePluginSymlinksDir}/${id}/setup.mdx'; } if (overviewDocsExists) { + const overviewDocPath = path.join(pluginSourceDocsDir, overviewDocRelativePath); const customEditUrl = `${repoUrl}/${path.relative(repoRoot, overviewDocPath)}`; + const overviewArticleImportPath = path.join(relativePluginSymlinksDir, id, overviewDocRelativePath); const linkToSetup = setupDocsExists ? ` → [See setup instructions for the ${title} plugin](../../setup/plugins/${id}.mdx) @@ -110,7 +112,7 @@ title: ${title} Plugin sidebar_label: ${title} custom_edit_url: ${customEditUrl} --- -import Article from '${relativePluginSymlinksDir}/${id}/overview.mdx'; +import Article from '${overviewArticleImportPath}'; ${linkToSetup}
    @@ -121,6 +123,16 @@ ${linkToSetup} } } +async function getInternalOrPublicDocRelativePathOrNull(docsDir: string, docName: string) { + if (process.env.FB_INTERNAL && await fs.pathExists(path.join(docsDir, 'fb', docName))) { + return path.join('fb', docName); + } + if (await fs.pathExists(path.join(docsDir, docName))) { + return docName; + } + return null +} + generatePluginDocs() .then(() => process.exit(0)) .catch(err => { From 882b969931f9febb6e85fbd03e86363786ce0662 Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Tue, 10 Jan 2023 06:14:43 -0800 Subject: [PATCH 0436/1651] Reroll CircleCI secrets (#4433) Summary: Rerolled the secrets used to publish to maven and the key to encrypt the additional gradle properties. Changing to pbkdf2-based key derivation, too, which should hopefully be supported by the CircleCI host. Ref: https://circleci.com/blog/january-4-2023-security-alert/ Ref: T141744585 Pull Request resolved: https://github.com/facebook/flipper/pull/4433 Reviewed By: antonk52 Differential Revision: D42431128 Pulled By: passy fbshipit-source-id: ec0ba2c7eecfd8cb206ccf2086604bf28dbea313 --- scripts/gradle-publish-keys.enc | Bin 128 -> 128 bytes scripts/publish-android-snapshot.sh | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/gradle-publish-keys.enc b/scripts/gradle-publish-keys.enc index fc7d1b95abea83dd811f6d472740e63b99a8dc86..632242340b74a37e2abf5256902f3d99ca50c577 100644 GIT binary patch literal 128 zcmV-`0Du2eVQh3|WM5zN27qTP$7uCW%0r&J#+PZ(r~?4<`=u*sA}e$gk;MNuk{S$p z0}jJ^S)1Ew;Fo3ZzM5HJMVUi5O{?&@Wzg%CDHsTd4KxW;nyyni^VHX>hZ~IHE`aU6 i&@u(0N1;?=ECW^}U>)+&1-9Qd3TQ8I%A4`rxA?I{Bt4q| literal 128 zcmV-`0Du2eVQh3|WM5zRPbTjZU;l(*Hs$-j8G@WD#CMNNY}(i6!WXDsH%|TO5E}Ih z*QhFb->!9>uAJc}F!o=X;1HN&MxZCv^qKrCB&>+EqeFo5%L>@^@&v0eV4qaZ)*?-` i)~sFFi@t5Fg5BQFpUKVGX+>24 diff --git a/scripts/publish-android-snapshot.sh b/scripts/publish-android-snapshot.sh index 840ff7429..898675c78 100755 --- a/scripts/publish-android-snapshot.sh +++ b/scripts/publish-android-snapshot.sh @@ -16,6 +16,6 @@ elif [ "$IS_SNAPSHOT" == "" ]; then echo "Skipping build. Given build doesn't appear to be a SNAPSHOT release." exit 1 else - openssl aes-256-cbc -d -in scripts/gradle-publish-keys.enc -k "$ANDROID_PUBLISH_KEY" >> "$BASEDIR/gradle.properties" + openssl aes-256-cbc -pbkdf2 -d -in scripts/gradle-publish-keys.enc -k "$ANDROID_PUBLISH_KEY" >> "$BASEDIR/gradle.properties" "$BASEDIR"/gradlew publish fi From a040fb8d4e294dd2c5cead6818089fc9512c6894 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 10 Jan 2023 06:48:53 -0800 Subject: [PATCH 0437/1651] Ensure logs don't indefinitely append past capacity Summary: ^ There could be cases, albeit unlikely, that logs could be appended for the current state indefintely that would ultimate fail due to not having enough memory. This change puts a cap on that. Reviewed By: mweststrate Differential Revision: D42313904 fbshipit-source-id: 7fd96be822c9427720bccb41c6c32a39213c7652 --- xplat/Flipper/FlipperState.cpp | 25 ++++++++++++++++++++----- xplat/Flipper/FlipperState.h | 4 +++- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/xplat/Flipper/FlipperState.cpp b/xplat/Flipper/FlipperState.cpp index d601d33f3..104b590e9 100644 --- a/xplat/Flipper/FlipperState.cpp +++ b/xplat/Flipper/FlipperState.cpp @@ -10,6 +10,8 @@ #include "FlipperStateUpdateListener.h" #include "FlipperStep.h" +#define FLIPPER_LOGS_CAPACITY 4096 + #if FLIPPER_DEBUG_LOG #include "Log.h" #endif @@ -19,7 +21,8 @@ using namespace facebook::flipper; /* Class responsible for collecting state updates and combining them into a * view of the current state of the flipper client. */ -FlipperState::FlipperState() : logs("") {} +FlipperState::FlipperState() {} + void FlipperState::setUpdateListener( std::shared_ptr listener) { std::lock_guard lock(mutex); @@ -46,14 +49,25 @@ void FlipperState::started(std::string step) { } } +void FlipperState::ensureLogsCapacity() { + if (logs.tellp() > FLIPPER_LOGS_CAPACITY) { + logs.str(""); + logs.clear(); + logs << "[Truncated]" << std::endl; + } +} + void FlipperState::success(std::string step) { std::shared_ptr localListener; { std::lock_guard lock(mutex); + std::string message = "[Success] " + step; #if FLIPPER_DEBUG_LOG - log("[finished] " + step); + log(message); #endif - logs = logs + "[Success] " + step + "\n"; + ensureLogsCapacity(); + logs << message << std::endl; + stateMap[step] = State::success; localListener = mListener; } @@ -72,7 +86,8 @@ void FlipperState::failed(std::string step, std::string errorMessage) { #if FLIPPER_DEBUG_LOG log(message); #endif - logs = logs + message + "\n"; + ensureLogsCapacity(); + logs << message << std::endl; stateMap[step] = State::failed; localListener = mListener; } @@ -88,7 +103,7 @@ void FlipperState::failed(std::string step, std::string errorMessage) { // way std::string FlipperState::getState() { std::lock_guard lock(mutex); - return logs; + return logs.str(); } std::vector FlipperState::getStateElements() { diff --git a/xplat/Flipper/FlipperState.h b/xplat/Flipper/FlipperState.h index daa5b4f88..aa0f0e710 100644 --- a/xplat/Flipper/FlipperState.h +++ b/xplat/Flipper/FlipperState.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -53,10 +54,11 @@ class FlipperState { void success(std::string); void failed(std::string, std::string); void started(std::string); + void ensureLogsCapacity(); std::mutex mutex; // Protects all our member variables. std::shared_ptr mListener = nullptr; - std::string logs; + std::stringstream logs; std::vector insertOrder; std::map stateMap; }; From f506bbde6b46b79c96d7c19934d7fd2d43bec976 Mon Sep 17 00:00:00 2001 From: Alvin Xu Date: Wed, 11 Jan 2023 10:52:56 -0800 Subject: [PATCH 0438/1651] Fix 'Isues or questions' in ios-native documentation Summary: Same issue as D42282609 (https://github.com/facebook/flipper/commit/2f4c88c8d1f6a17d76dd2ec8e0f115348ea197f4) but on different page. Missed this one in earlier diff. Fix typo in 'Isues or questions' on ios-native. zbgs search, should now be fixed on all pages. https://www.internalfb.com/intern/staticdocs/flipper/docs/getting-started/ios-native/ Differential Revision: D42444164 fbshipit-source-id: 91be4c41caea7549f278ca4621bb3b54f024b9b8 --- docs/getting-started/ios-native.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/ios-native.mdx b/docs/getting-started/ios-native.mdx index a31203131..b5f607f08 100644 --- a/docs/getting-started/ios-native.mdx +++ b/docs/getting-started/ios-native.mdx @@ -152,6 +152,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { Finally, you need to add plugins to your Flipper client. The Layout Inspector plugin is shown above to get you started. See [Network Plugin](../setup/plugins/network.mdx) and [Layout Inspector Plugin](../features/plugins/inspector.mdx) for information on how to add them and enable Litho or ComponentKit support. You can check the sample apps in the [GitHub repo](https://github.com/facebook/flipper) for examples of integrating other plugins. -## Isues or questions +## Issues or questions If you encounter any issues or have any questions, refer to the [Troubleshooting](troubleshooting/troubleshooting.mdx) section. From 8111513e95ee97bef7f155dbbeef29c40b509fba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Jan 2023 04:20:08 -0800 Subject: [PATCH 0439/1651] Bump eslint from 8.28.0 to 8.31.0 in /js/js-flipper (#4419) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [eslint](https://github.com/eslint/eslint) from 8.28.0 to 8.31.0.
    Release notes

    Sourced from eslint's releases.

    v8.31.0

    Features

    • 52c7c73 feat: check assignment patterns in no-underscore-dangle (#16693) (Milos Djermanovic)
    • b401cde feat: add options to check destructuring in no-underscore-dangle (#16006) (Morten Kaltoft)
    • 30d0daf feat: group properties with values in parentheses in key-spacing (#16677) (Francesco Trotta)

    Bug Fixes

    • 35439f1 fix: correct syntax error in prefer-arrow-callback autofix (#16722) (Francesco Trotta)
    • 87b2470 fix: new instance of FlatESLint should load latest config file version (#16608) (Milos Djermanovic)

    Documentation

    • 4339dc4 docs: Update README (GitHub Actions Bot)
    • 4e4049c docs: optimize code block structure (#16669) (Sam Chen)
    • 54a7ade docs: do not escape code blocks of formatters examples (#16719) (Sam Chen)
    • e5ecfef docs: Add function call example for no-undefined (#16712) (Elliot Huffman)
    • a3262f0 docs: Add mastodon link (#16638) (Amaresh S M)
    • a14ccf9 docs: clarify files property (#16709) (Sam Chen)
    • 3b29eb1 docs: fix npm link (#16710) (Abdullah Osama)
    • a638673 docs: fix search bar focus on Esc (#16700) (Shanmughapriyan S)
    • f62b722 docs: country flag missing in windows (#16698) (Shanmughapriyan S)
    • 4d27ec6 docs: display zh-hans in the docs language switcher (#16686) (Percy Ma)
    • 8bda20e docs: remove manually maintained anchors (#16685) (Percy Ma)
    • b68440f docs: User Guide Getting Started expansion (#16596) (Ben Perlmutter)

    Chores

    • 65d4e24 chore: Upgrade @​eslint/eslintrc@​1.4.1 (#16729) (Brandon Mills)
    • 8d93081 chore: fix CI failure (#16721) (Sam Chen)
    • 8f17247 chore: Set up automatic updating of README (#16717) (Nicholas C. Zakas)
    • 4cd87cb ci: bump actions/stale from 6 to 7 (#16713) (dependabot[bot])
    • fd20c75 chore: sort package.json scripts in alphabetical order (#16705) (Darius Dzien)
    • 10a5c78 chore: update ignore patterns in eslint.config.js (#16678) (Milos Djermanovic)

    v8.30.0

    Features

    • 075ef2c feat: add suggestion for no-return-await (#16637) (Daniel Bartholomae)
    • 7190d98 feat: update globals (#16654) (Sébastien Règne)

    Bug Fixes

    • 1a327aa fix: Ensure flat config unignores work consistently like eslintrc (#16579) (Nicholas C. Zakas)
    • 9b8bb72 fix: autofix recursive functions in no-var (#16611) (Milos Djermanovic)

    Documentation

    • 6a8cd94 docs: Clarify Discord info in issue template config (#16663) (Nicholas C. Zakas)
    • ad44344 docs: CLI documentation standardization (#16563) (Ben Perlmutter)
    • 293573e docs: fix broken line numbers (#16606) (Sam Chen)
    • fa2c64b docs: use relative links for internal links (#16631) (Percy Ma)
    • 75276c9 docs: reorder options in no-unused-vars (#16625) (Milos Djermanovic)
    • 7276fe5 docs: Fix anchor in URL (#16628) (Karl Horky)
    • 6bef135 docs: don't apply layouts to html formatter example (#16591) (Tanuj Kanti)
    • dfc7ec1 docs: Formatters page updates (#16566) (Ben Perlmutter)

    ... (truncated)

    Changelog

    Sourced from eslint's changelog.

    v8.31.0 - December 31, 2022

    • 65d4e24 chore: Upgrade @​eslint/eslintrc@​1.4.1 (#16729) (Brandon Mills)
    • 35439f1 fix: correct syntax error in prefer-arrow-callback autofix (#16722) (Francesco Trotta)
    • 87b2470 fix: new instance of FlatESLint should load latest config file version (#16608) (Milos Djermanovic)
    • 8d93081 chore: fix CI failure (#16721) (Sam Chen)
    • 4339dc4 docs: Update README (GitHub Actions Bot)
    • 8f17247 chore: Set up automatic updating of README (#16717) (Nicholas C. Zakas)
    • 4e4049c docs: optimize code block structure (#16669) (Sam Chen)
    • 54a7ade docs: do not escape code blocks of formatters examples (#16719) (Sam Chen)
    • 52c7c73 feat: check assignment patterns in no-underscore-dangle (#16693) (Milos Djermanovic)
    • e5ecfef docs: Add function call example for no-undefined (#16712) (Elliot Huffman)
    • a3262f0 docs: Add mastodon link (#16638) (Amaresh S M)
    • 4cd87cb ci: bump actions/stale from 6 to 7 (#16713) (dependabot[bot])
    • a14ccf9 docs: clarify files property (#16709) (Sam Chen)
    • 3b29eb1 docs: fix npm link (#16710) (Abdullah Osama)
    • fd20c75 chore: sort package.json scripts in alphabetical order (#16705) (Darius Dzien)
    • a638673 docs: fix search bar focus on Esc (#16700) (Shanmughapriyan S)
    • f62b722 docs: country flag missing in windows (#16698) (Shanmughapriyan S)
    • 4d27ec6 docs: display zh-hans in the docs language switcher (#16686) (Percy Ma)
    • 8bda20e docs: remove manually maintained anchors (#16685) (Percy Ma)
    • b401cde feat: add options to check destructuring in no-underscore-dangle (#16006) (Morten Kaltoft)
    • b68440f docs: User Guide Getting Started expansion (#16596) (Ben Perlmutter)
    • 30d0daf feat: group properties with values in parentheses in key-spacing (#16677) (Francesco Trotta)
    • 10a5c78 chore: update ignore patterns in eslint.config.js (#16678) (Milos Djermanovic)

    v8.30.0 - December 16, 2022

    • f2c4737 chore: upgrade @​eslint/eslintrc@​1.4.0 (#16675) (Milos Djermanovic)
    • 1a327aa fix: Ensure flat config unignores work consistently like eslintrc (#16579) (Nicholas C. Zakas)
    • 075ef2c feat: add suggestion for no-return-await (#16637) (Daniel Bartholomae)
    • ba74253 chore: standardize npm script names per #14827 (#16315) (Patrick McElhaney)
    • 6a8cd94 docs: Clarify Discord info in issue template config (#16663) (Nicholas C. Zakas)
    • 0d9af4c ci: fix npm v9 problem with file: (#16664) (Milos Djermanovic)
    • 7190d98 feat: update globals (#16654) (Sébastien Règne)
    • ad44344 docs: CLI documentation standardization (#16563) (Ben Perlmutter)
    • 90c9219 refactor: migrate off deprecated function-style rules in all tests (#16618) (Bryan Mishkin)
    • 9b8bb72 fix: autofix recursive functions in no-var (#16611) (Milos Djermanovic)
    • 293573e docs: fix broken line numbers (#16606) (Sam Chen)
    • fa2c64b docs: use relative links for internal links (#16631) (Percy Ma)
    • 75276c9 docs: reorder options in no-unused-vars (#16625) (Milos Djermanovic)
    • 7276fe5 docs: Fix anchor in URL (#16628) (Karl Horky)
    • 6bef135 docs: don't apply layouts to html formatter example (#16591) (Tanuj Kanti)
    • dfc7ec1 docs: Formatters page updates (#16566) (Ben Perlmutter)
    • 8ba124c docs: update the prefer-const example (#16607) (Pavel)
    • e6cb05a docs: fix css leaking (#16603) (Sam Chen)

    v8.29.0 - December 2, 2022

    • 0311d81 docs: Configuring Plugins page intro, page tweaks, and rename (#16534) (Ben Perlmutter)

    ... (truncated)

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=eslint&package-manager=npm_and_yarn&previous-version=8.28.0&new-version=8.31.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4419 Reviewed By: antonk52 Differential Revision: D42370532 Pulled By: passy fbshipit-source-id: 4ece5752034b32bce0d217ebc86141c045d1dbfd --- js/js-flipper/yarn.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/js/js-flipper/yarn.lock b/js/js-flipper/yarn.lock index 5722e1213..8cc8b9a9a 100644 --- a/js/js-flipper/yarn.lock +++ b/js/js-flipper/yarn.lock @@ -314,25 +314,25 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@eslint/eslintrc@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" - integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== +"@eslint/eslintrc@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" + integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== dependencies: ajv "^6.12.4" debug "^4.3.2" espree "^9.4.0" - globals "^13.15.0" + globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@humanwhocodes/config-array@^0.11.6": - version "0.11.7" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f" - integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1705,12 +1705,12 @@ eslint-visitor-keys@^3.3.0: integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== eslint@^8.17.0: - version "8.28.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" - integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== + version "8.31.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.31.0.tgz#75028e77cbcff102a9feae1d718135931532d524" + integrity sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA== dependencies: - "@eslint/eslintrc" "^1.3.3" - "@humanwhocodes/config-array" "^0.11.6" + "@eslint/eslintrc" "^1.4.1" + "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" @@ -1729,7 +1729,7 @@ eslint@^8.17.0: file-entry-cache "^6.0.1" find-up "^5.0.0" glob-parent "^6.0.2" - globals "^13.15.0" + globals "^13.19.0" grapheme-splitter "^1.0.4" ignore "^5.2.0" import-fresh "^3.0.0" @@ -2028,10 +2028,10 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.15.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== +globals@^13.19.0: + version "13.19.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" + integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== dependencies: type-fest "^0.20.2" From f007da93d387ab804b725cdf8c34777719ff97ce Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Fri, 13 Jan 2023 07:36:20 -0800 Subject: [PATCH 0440/1651] Show the banner only once per day Summary: ^ Reviewed By: jknoxville Differential Revision: D42499338 fbshipit-source-id: 85c1edc676d00a1e442c5490575f8a14465d5a4f --- desktop/plugins/public/layout/index.tsx | 33 ++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/desktop/plugins/public/layout/index.tsx b/desktop/plugins/public/layout/index.tsx index eb1cd45e2..a27c068bf 100644 --- a/desktop/plugins/public/layout/index.tsx +++ b/desktop/plugins/public/layout/index.tsx @@ -337,7 +337,38 @@ export default class LayoutPlugin extends FlipperPlugin< return; } - const key = `open-ui-debugger-${Date.now()}`; + const lastShownTimestampKey = + 'layout-plugin-UIDebuggerBannerLastShownTimestamp'; + let lastShownTimestampFromStorage = undefined; + try { + lastShownTimestampFromStorage = window.localStorage.getItem( + lastShownTimestampKey, + ); + } catch (e) {} + + if (lastShownTimestampFromStorage) { + const WithinOneDay = (timestamp: number) => { + const Day = 1 * 24 * 60 * 60 * 1000; + const DayAgo = Date.now() - Day; + + return timestamp > DayAgo; + }; + const lastShownTimestamp = Number(lastShownTimestampFromStorage); + if (WithinOneDay(lastShownTimestamp)) { + // The banner was shown less than 24-hours ago, don't show it again. + return; + } + } + + const lastShownTimestamp = Date.now(); + try { + window.localStorage.setItem( + lastShownTimestampKey, + String(lastShownTimestamp), + ); + } catch (e) {} + + const key = `open-ui-debugger-${lastShownTimestamp}`; const btn = ( -
    - )} -
    - this.setState({selected: ids[0]})} - maxGap={50} - selected={this.state.selected} - /> -
    -
    - value.key === this.state.selected, - )?.properties ?? {} - } - /> -
    - - ); - } -} From 764e94503e4901b3a592306fc42727d08600ff8d Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Mon, 23 Jan 2023 03:45:59 -0800 Subject: [PATCH 0450/1651] Clear handlers on disconnect Summary: A few changes that should make our connect/disconnect more robust: * Certificate provider handler should be set directly to and managed by the policy. * Instantiate the socket once, synchronously on the connect method. Explicit deallocation once, synchronously on the disconnect method. * Clear handlers on disconnect after clearing the delegate. * Wait for the operation queue to drain before returning. Reviewed By: passy Differential Revision: D42664724 fbshipit-source-id: bd482acbb64a9bc9e36fb3418d4c81afa2109305 --- iOS/FlipperKit/FlipperPlatformWebSocket.h | 10 +++--- iOS/FlipperKit/FlipperPlatformWebSocket.mm | 38 +++++++++++----------- iOS/FlipperKit/FlipperWebSocket.mm | 18 +++++----- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/iOS/FlipperKit/FlipperPlatformWebSocket.h b/iOS/FlipperKit/FlipperPlatformWebSocket.h index 0044b134f..07eb7d251 100644 --- a/iOS/FlipperKit/FlipperPlatformWebSocket.h +++ b/iOS/FlipperKit/FlipperPlatformWebSocket.h @@ -23,15 +23,15 @@ NS_ASSUME_NONNULL_BEGIN /// A message handler used to dispatch messages received from the server. @property(nonatomic) facebook::flipper::SocketMessageHandler messageHandler; -/// A certificate provider used to obtain the client certificate used for -/// authentication. -@property(nonatomic) - facebook::flipper::SocketCertificateProvider certificateProvider; - /// Initializes an instance of FliperWebSocketTransport with an endpoint URL. /// @param url Endpoint URL used to establish the connection. - (instancetype)initWithURL:(NSURL* _Nonnull)url; +/// A certificate provider used to obtain the client certificate used for +/// authentication. +- (void)setCertificateProvider: + (facebook::flipper::SocketCertificateProvider)certificateProvider; + /// Connect to the endpoint. - (void)connect; diff --git a/iOS/FlipperKit/FlipperPlatformWebSocket.mm b/iOS/FlipperKit/FlipperPlatformWebSocket.mm index a51c5ac27..8116579ea 100644 --- a/iOS/FlipperKit/FlipperPlatformWebSocket.mm +++ b/iOS/FlipperKit/FlipperPlatformWebSocket.mm @@ -144,6 +144,10 @@ static constexpr int connectionKeepaliveSeconds = 10; return; } + _socket = [[SRWebSocket alloc] initWithURL:self->_url + securityPolicy:self->_policy]; + _socket.delegate = self; + __weak auto weakSelf = self; [_dispatchQueue addOperationWithBlock:^{ __strong auto strongSelf = weakSelf; @@ -158,33 +162,32 @@ static constexpr int connectionKeepaliveSeconds = 10; return; } - strongSelf->_socket = [[SRWebSocket alloc] initWithURL:self->_url - securityPolicy:self->_policy]; - strongSelf->_socket.delegate = self; [strongSelf->_socket open]; }]; } - (void)disconnect { + _socket.delegate = nil; + + // Manually trigger a 'close' event as SocketRocket close method will + // not notify the delegate. SocketRocket only triggers the close event + // when the connection is closed from the server. Furthermore, + // we are clearing the delegate above. + _eventHandler(facebook::flipper::SocketEvent::CLOSE); + + _eventHandler = [](facebook::flipper::SocketEvent) {}; + _messageHandler = ^(const std::string&) { + }; + _policy.certificateProvider = [](char* _Nonnull, size_t) { return ""; }; + [_dispatchQueue cancelAllOperations]; + [_dispatchQueue waitUntilAllOperationsAreFinished]; if ([_keepAlive isValid]) { [_keepAlive invalidate]; } _keepAlive = nil; - - // Manually trigger a 'close' event as SocketRocket close method will - // not notify the delegate. SocketRocket only triggers the close event - // when the connection is closed from the server. - _eventHandler(facebook::flipper::SocketEvent::CLOSE); - - if (_socket) { - // Clear the socket delegate before close. Ensures that we won't get - // any messages after the disconnect takes place. - _socket.delegate = nil; - [_socket close]; - _socket = nil; - }; + _socket = nil; } - (void)send:(NSString*)message @@ -202,7 +205,6 @@ static constexpr int connectionKeepaliveSeconds = 10; - (void)setCertificateProvider: (facebook::flipper::SocketCertificateProvider)certificateProvider { - _certificateProvider = certificateProvider; _policy.certificateProvider = certificateProvider; } @@ -241,7 +243,6 @@ static constexpr int connectionKeepaliveSeconds = 10; } else { _eventHandler(facebook::flipper::SocketEvent::ERROR); } - _socket = nil; } - (void)_webSocketDidClose { @@ -251,7 +252,6 @@ static constexpr int connectionKeepaliveSeconds = 10; _keepAlive = nil; _eventHandler(facebook::flipper::SocketEvent::CLOSE); - _socket = nil; } - (void)_webSocketDidReceiveMessage:(id)message { diff --git a/iOS/FlipperKit/FlipperWebSocket.mm b/iOS/FlipperKit/FlipperWebSocket.mm index 3389d7791..24480c7b1 100644 --- a/iOS/FlipperKit/FlipperWebSocket.mm +++ b/iOS/FlipperKit/FlipperWebSocket.mm @@ -112,15 +112,15 @@ bool FlipperWebSocket::connect(FlipperConnectionManager* manager) { }; if (endpoint_.secure) { - socket_.certificateProvider = [this]( - char* _Nonnull password, size_t length) { - auto pkcs12 = connectionContextStore_->getCertificate(); - if (pkcs12.first.length() == 0) { - return std::string(""); - } - strncpy(password, pkcs12.second.c_str(), length); - return pkcs12.first; - }; + [socket_ + setCertificateProvider:[this](char* _Nonnull password, size_t length) { + auto pkcs12 = connectionContextStore_->getCertificate(); + if (pkcs12.first.length() == 0) { + return std::string(""); + } + strncpy(password, pkcs12.second.c_str(), length); + return pkcs12.first; + }]; } [socket_ connect]; From f44feb69e0932f4b18fd9c9d01eb6cb5d75543b6 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Mon, 23 Jan 2023 03:47:41 -0800 Subject: [PATCH 0451/1651] SKDescriptorMapper should be a weak reference Summary: ^ SKDescriptorMapper owns the SKNodeDescriptor instances. SKNodeDescriptor instances should only have a weak reference to the mapper as to avoid retain cycles. Reviewed By: passy Differential Revision: D42673698 fbshipit-source-id: 8c98709b28fc3c711dc56c179c7c362417fa1f9d --- .../FlipperKitLayoutHelpers/SKNodeDescriptor.mm | 2 +- .../FlipperKitLayoutIOSDescriptors/SKViewControllerDescriptor.h | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/iOS/Plugins/FlipperKitPluginUtils/FlipperKitLayoutHelpers/FlipperKitLayoutHelpers/SKNodeDescriptor.mm b/iOS/Plugins/FlipperKitPluginUtils/FlipperKitLayoutHelpers/FlipperKitLayoutHelpers/SKNodeDescriptor.mm index 6a2967502..697e650a5 100644 --- a/iOS/Plugins/FlipperKitPluginUtils/FlipperKitLayoutHelpers/FlipperKitLayoutHelpers/SKNodeDescriptor.mm +++ b/iOS/Plugins/FlipperKitPluginUtils/FlipperKitLayoutHelpers/FlipperKitLayoutHelpers/SKNodeDescriptor.mm @@ -11,7 +11,7 @@ #import @implementation SKNodeDescriptor { - id _mapper; + __weak id _mapper; } - (void)setUp { diff --git a/iOS/Plugins/FlipperKitPluginUtils/FlipperKitLayoutIOSDescriptors/FlipperKitLayoutIOSDescriptors/SKViewControllerDescriptor.h b/iOS/Plugins/FlipperKitPluginUtils/FlipperKitLayoutIOSDescriptors/FlipperKitLayoutIOSDescriptors/SKViewControllerDescriptor.h index a506769eb..eefa7942a 100644 --- a/iOS/Plugins/FlipperKitPluginUtils/FlipperKitLayoutIOSDescriptors/FlipperKitLayoutIOSDescriptors/SKViewControllerDescriptor.h +++ b/iOS/Plugins/FlipperKitPluginUtils/FlipperKitLayoutIOSDescriptors/FlipperKitLayoutIOSDescriptors/SKViewControllerDescriptor.h @@ -11,8 +11,6 @@ #import -@class SKDescriptorMapper; - @interface SKViewControllerDescriptor : SKNodeDescriptor @end From defefb0f787dc3c397a7bd7f0e2c9fc9e69940bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Jan 2023 08:41:47 -0800 Subject: [PATCH 0452/1651] Bump serde_yaml from 0.9.14 to 0.9.17 in /packer (#4459) Summary: Bumps [serde_yaml](https://github.com/dtolnay/serde-yaml) from 0.9.14 to 0.9.17.
    Release notes

    Sourced from serde_yaml's releases.

    0.9.17

    • Improve Debug representation of some error messages

    0.9.16

    • Opt out of -Zrustdoc-scrape-examples on docs.rs for now

    0.9.15

    • Documentation improvements
    Commits
    • 1cf6e8e Release 0.9.17
    • 0d9e6c7 Improve formatting of single quote in Debug
    • 3ff5506 Speed up cargo fuzz CI job
    • 8261d93 Lint derive_hash_xor_eq renamed to derived_hash_with_manual_eq
    • bb17d5e Preserve is_human_readable setting of wrapped de/serializer
    • ecdb5bf Prevent actions duplication on noop merge commits
    • aed75ed Sync license text with rust-lang repos
    • e8fbca6 Release 0.9.16
    • 80ad630 Opt out -Zrustdoc-scrape-examples on docs.rs
    • 2d0b7bd Release 0.9.15
    • Additional commits viewable in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_yaml&package-manager=cargo&previous-version=0.9.14&new-version=0.9.17)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4459 Reviewed By: antonk52 Differential Revision: D42678096 Pulled By: passy fbshipit-source-id: d525da955a9aa274f553a7a6477f99c6118045d4 --- packer/Cargo.lock | 4 ++-- packer/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packer/Cargo.lock b/packer/Cargo.lock index 9e84c9610..b17985c24 100644 --- a/packer/Cargo.lock +++ b/packer/Cargo.lock @@ -662,9 +662,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.14" +version = "0.9.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d232d893b10de3eb7258ff01974d6ee20663d8e833263c99409d4b13a0209da" +checksum = "8fb06d4b6cdaef0e0c51fa881acb721bed3c924cfaa71d9c94a3b771dfdf6567" dependencies = [ "indexmap", "itoa", diff --git a/packer/Cargo.toml b/packer/Cargo.toml index abc62df8d..6166942d2 100644 --- a/packer/Cargo.toml +++ b/packer/Cargo.toml @@ -14,7 +14,7 @@ clap = { version = "^3", features = ["derive", "cargo"] } shellexpand = "^2" tar = "0.4.38" serde = { version = "^1", features = ["derive"] } -serde_yaml = "0.9.14" +serde_yaml = "0.9.17" anyhow = "^1" sha2 = "0.10.6" data-encoding = "^2" From 3f3233cf2be8b23ef8256ef387f7365609a4d504 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Jan 2023 06:29:07 -0800 Subject: [PATCH 0453/1651] Bump anyhow from 1.0.66 to 1.0.68 in /packer (#4400) Summary: Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.66 to 1.0.68.
    Release notes

    Sourced from anyhow's releases.

    1.0.67

    Commits
    • 867763b Release 1.0.68
    • c0a87d0 Opt out -Zrustdoc-scrape-examples on docs.rs
    • 1cc707b Release 1.0.67
    • 613b261 Update build status badge
    • 0f922d7 Disable backtrace CI on Rust 1.50
    • acecd9b Update ui test suite to nightly-2022-12-15
    • 0bac51f Time out workflows after 45 minutes
    • 60e8800 Fix renamed let_underscore_drop lint
    • 8d1c734 Update ui test suite to nightly-2022-11-16
    • 451651b Update ui test suite to nightly-2022-11-11
    • Additional commits viewable in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anyhow&package-manager=cargo&previous-version=1.0.66&new-version=1.0.68)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4400 Reviewed By: antonk52 Differential Revision: D42639009 Pulled By: passy fbshipit-source-id: 2d512ef7b99d2ad51736cab2ae2395df82f9c078 --- packer/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packer/Cargo.lock b/packer/Cargo.lock index b17985c24..927121391 100644 --- a/packer/Cargo.lock +++ b/packer/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.66" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" +checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" [[package]] name = "atty" From 27e7cf28045b84f3981c8bcb8e83e2943a30a617 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Jan 2023 06:39:36 -0800 Subject: [PATCH 0454/1651] Bump mockito-core from 4.9.0 to 5.0.0 (#4444) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [mockito-core](https://github.com/mockito/mockito) from 4.9.0 to 5.0.0.
    Release notes

    Sourced from mockito-core's releases.

    v5.0.0

    Mockito 5: prepare for future JDK versions

    For a while now, we have seen an increase in problems/incompatibilities with recent versions of the JDK due to our usage of JVM-internal API. Most notably, JDK 17 made some changes which are incompatible with the current subclass mockmaker. Therefore, to prepare for the future of JDK, we are making some core changes to ensure Mockito keeps on working.

    Switch the default mockmaker to mockito-inline

    Back in Mockito 2.7.6, we published a new mockmaker based on the "inline bytecode" principle. This mockmaker creates mocks manipulating bytecode equivalent within the original class such that its method implementations hook into the normal Mockito machinery. As a comparison, the subclass mockmaker generates "real" subclasses for mocks, to mimic the same behavior. While the approaches are similar, the inline mockmaker avoids certain restrictions that the JDK imposes. For example, it does not violate module boundaries (introduced in JDK 9, but more heavily used in JDK 17) and avoids the leaking of the creation of the subclass.

    Massive thanks to community member @​reta who implemented this change.

    When should I still be using the subclass mockmaker?

    There are legitimate remaining use cases for the subclass mockmaker. For example, on the Graal VM's native image, the inline mockmaker will not work and the subclass mockmaker is the appropriate choice. Additionally, if you would like to avoid mocking final classes, using the subclass mockmaker is a possibibility. Note however that if you solely want to use the subclass mockmaker to avoid mocking final, you will run into the above mentioned issues on JDK 17+. We want to leave this choice up to our users, which is why we will keep on supporting the subclass mockmaker.

    If you want to use the subclass mockmaker instead, you can use the new mockito-subclass artifact (published on Maven Central along with all our other artifacts).

    Update the minimum supported Java version to 11

    Mockito 4 supports Java 8 and above. Similar to other open source projects, we are moving away from JDK 8 and to newer versions. The primary reason for moving away from JDK 8 is the increasing maintenance costs with keeping our own infrastructure working. Lately we have been running into more and more JDK 8 breakages. Additionally, while we want to support the newest JDK API's, our current solution to support both JDK 8 and newer versions causes issues with the SecurityManager. Since we want Mockito to work on the newest version and more and more businesses adopting JDK 11, we have decided to make the switch as well.

    Massive thanks to community member @​reta who implemented this change.

    What should I do if I still run JDK 8?

    For JDK 8 and below, you can keep on using Mockito 4. This is similar to if you are using JDK 6, for which you can keep on using Mockito 2. The changes in Mockito 5 (for now) are primarily focused on the latest JDK versions, which means the API differences between Mockito 4 and 5 are minimal. However, over time this will most likely widen, so we do recommend adopting JDK 11 in the future.

    New type() method on ArgumentMatcher

    One of our most used public API's for customizing Mockito is the ArgumentMatcher interface. The interface allows you to define a custom matcher, which you can pass into method arguments to provide more targeted matches. One major shortcoming of the ArgumentMatcher was the lack of varargs support.

    ... (truncated)

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.mockito:mockito-core&package-manager=gradle&previous-version=4.9.0&new-version=5.0.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4444 Reviewed By: antonk52 Differential Revision: D42678087 Pulled By: passy fbshipit-source-id: 7e1e38af900b985a26b42342297e15ab7eda9546 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e1f37eb3a..04926892b 100644 --- a/build.gradle +++ b/build.gradle @@ -100,7 +100,7 @@ ext.deps = [ robolectric : 'org.robolectric:robolectric:4.9', junit : 'junit:junit:4.13.2', hamcrest : 'org.hamcrest:hamcrest-library:2.2', - mockito : 'org.mockito:mockito-core:4.11.0', + mockito : 'org.mockito:mockito-core:5.0.0', okhttp3 : 'com.squareup.okhttp3:okhttp:4.9.3', leakcanary : 'com.squareup.leakcanary:leakcanary-android:1.6.3', leakcanary2 : 'com.squareup.leakcanary:leakcanary-android:2.8.1', From cceeec97c77db5f70ab6569ccea0bb03c02fa7ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Jan 2023 08:42:31 -0800 Subject: [PATCH 0455/1651] Bump ignore from 0.4.18 to 0.4.20 in /packer (#4441) Summary: Bumps [ignore](https://github.com/BurntSushi/ripgrep) from 0.4.18 to 0.4.20.
    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ignore&package-manager=cargo&previous-version=0.4.18&new-version=0.4.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4441 Reviewed By: antonk52 Differential Revision: D42678099 Pulled By: passy fbshipit-source-id: 63791511856586391cc19947e6e49a3684f936ab --- packer/Cargo.lock | 14 +++++++------- packer/Cargo.toml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packer/Cargo.lock b/packer/Cargo.lock index 927121391..11c11c205 100644 --- a/packer/Cargo.lock +++ b/packer/Cargo.lock @@ -51,11 +51,12 @@ dependencies = [ [[package]] name = "bstr" -version = "0.2.17" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +checksum = "b45ea9b00a7b3f2988e9a65ad3917e62123c38dba709b666506207be96d1790b" dependencies = [ "memchr", + "serde", ] [[package]] @@ -301,9 +302,9 @@ dependencies = [ [[package]] name = "globset" -version = "0.4.8" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" +checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" dependencies = [ "aho-corasick", "bstr", @@ -335,11 +336,10 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.18" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" +checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" dependencies = [ - "crossbeam-utils", "globset", "lazy_static", "log", diff --git a/packer/Cargo.toml b/packer/Cargo.toml index 6166942d2..380768a68 100644 --- a/packer/Cargo.toml +++ b/packer/Cargo.toml @@ -22,7 +22,7 @@ serde_json = "^1" rayon = "^1.6" indicatif = "^0.16" xz2 = "0.1.7" -ignore = "0.4.18" +ignore = "0.4.20" [dev-dependencies] tempdir = "0.3.7" From 3608efec367a6489d2985321312b4f3b030fa1d8 Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Wed, 25 Jan 2023 03:16:40 -0800 Subject: [PATCH 0456/1651] Fix podfile lock for react native example (#4467) Summary: This should fix the broken build: https://github.com/facebook/flipper/actions/runs/3997334273/jobs/6858705005 I followed the instructions from the error message and ran `cocoapods.dotslash update hermes-engine --no-repo-update` Pull Request resolved: https://github.com/facebook/flipper/pull/4467 Reviewed By: ivanmisuno Differential Revision: D42712018 Pulled By: passy fbshipit-source-id: 3e24cc27fcdf6b926d54ee2947836ae0805ffa97 --- .../ios/Podfile.lock | 462 +++++++++--------- 1 file changed, 231 insertions(+), 231 deletions(-) diff --git a/react-native/ReactNativeFlipperExample/ios/Podfile.lock b/react-native/ReactNativeFlipperExample/ios/Podfile.lock index bc78742f0..c62c5cf55 100644 --- a/react-native/ReactNativeFlipperExample/ios/Podfile.lock +++ b/react-native/ReactNativeFlipperExample/ios/Podfile.lock @@ -2,14 +2,14 @@ PODS: - boost (1.76.0) - CocoaAsyncSocket (7.6.5) - DoubleConversion (1.1.6) - - FBLazyVector (0.69.6) - - FBReactNativeSpec (0.69.6): + - FBLazyVector (0.69.7) + - FBReactNativeSpec (0.69.7): - RCT-Folly (= 2021.06.28.00-v2) - - RCTRequired (= 0.69.6) - - RCTTypeSafety (= 0.69.6) - - React-Core (= 0.69.6) - - React-jsi (= 0.69.6) - - ReactCommon/turbomodule/core (= 0.69.6) + - RCTRequired (= 0.69.7) + - RCTTypeSafety (= 0.69.7) + - React-Core (= 0.69.7) + - React-jsi (= 0.69.7) + - ReactCommon/turbomodule/core (= 0.69.7) - Flipper (0.172.0): - Flipper-Folly (~> 2.6) - Flipper-Boost-iOSX (1.76.0.1.11) @@ -72,7 +72,7 @@ PODS: - FlipperKit/FlipperKitNetworkPlugin - fmt (6.2.1) - glog (0.3.5) - - hermes-engine (0.69.6) + - hermes-engine (0.69.7) - libevent (2.1.12) - OpenSSL-Universal (1.1.1100) - RCT-Folly (2021.06.28.00-v2): @@ -92,283 +92,283 @@ PODS: - fmt (~> 6.2.1) - glog - libevent - - RCTRequired (0.69.6) - - RCTTypeSafety (0.69.6): - - FBLazyVector (= 0.69.6) - - RCTRequired (= 0.69.6) - - React-Core (= 0.69.6) - - React (0.69.6): - - React-Core (= 0.69.6) - - React-Core/DevSupport (= 0.69.6) - - React-Core/RCTWebSocket (= 0.69.6) - - React-RCTActionSheet (= 0.69.6) - - React-RCTAnimation (= 0.69.6) - - React-RCTBlob (= 0.69.6) - - React-RCTImage (= 0.69.6) - - React-RCTLinking (= 0.69.6) - - React-RCTNetwork (= 0.69.6) - - React-RCTSettings (= 0.69.6) - - React-RCTText (= 0.69.6) - - React-RCTVibration (= 0.69.6) - - React-bridging (0.69.6): + - RCTRequired (0.69.7) + - RCTTypeSafety (0.69.7): + - FBLazyVector (= 0.69.7) + - RCTRequired (= 0.69.7) + - React-Core (= 0.69.7) + - React (0.69.7): + - React-Core (= 0.69.7) + - React-Core/DevSupport (= 0.69.7) + - React-Core/RCTWebSocket (= 0.69.7) + - React-RCTActionSheet (= 0.69.7) + - React-RCTAnimation (= 0.69.7) + - React-RCTBlob (= 0.69.7) + - React-RCTImage (= 0.69.7) + - React-RCTLinking (= 0.69.7) + - React-RCTNetwork (= 0.69.7) + - React-RCTSettings (= 0.69.7) + - React-RCTText (= 0.69.7) + - React-RCTVibration (= 0.69.7) + - React-bridging (0.69.7): - RCT-Folly (= 2021.06.28.00-v2) - - React-jsi (= 0.69.6) - - React-callinvoker (0.69.6) - - React-Codegen (0.69.6): - - FBReactNativeSpec (= 0.69.6) + - React-jsi (= 0.69.7) + - React-callinvoker (0.69.7) + - React-Codegen (0.69.7): + - FBReactNativeSpec (= 0.69.7) - RCT-Folly (= 2021.06.28.00-v2) - - RCTRequired (= 0.69.6) - - RCTTypeSafety (= 0.69.6) - - React-Core (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - ReactCommon/turbomodule/core (= 0.69.6) - - React-Core (0.69.6): + - RCTRequired (= 0.69.7) + - RCTTypeSafety (= 0.69.7) + - React-Core (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - ReactCommon/turbomodule/core (= 0.69.7) + - React-Core (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - - React-Core/Default (= 0.69.6) - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-Core/Default (= 0.69.7) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/CoreModulesHeaders (0.69.6): + - React-Core/CoreModulesHeaders (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/Default (0.69.6): + - React-Core/Default (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/DevSupport (0.69.6): + - React-Core/DevSupport (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - - React-Core/Default (= 0.69.6) - - React-Core/RCTWebSocket (= 0.69.6) - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-jsinspector (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-Core/Default (= 0.69.7) + - React-Core/RCTWebSocket (= 0.69.7) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-jsinspector (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/RCTActionSheetHeaders (0.69.6): + - React-Core/RCTActionSheetHeaders (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/RCTAnimationHeaders (0.69.6): + - React-Core/RCTAnimationHeaders (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/RCTBlobHeaders (0.69.6): + - React-Core/RCTBlobHeaders (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/RCTImageHeaders (0.69.6): + - React-Core/RCTImageHeaders (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/RCTLinkingHeaders (0.69.6): + - React-Core/RCTLinkingHeaders (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/RCTNetworkHeaders (0.69.6): + - React-Core/RCTNetworkHeaders (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/RCTSettingsHeaders (0.69.6): + - React-Core/RCTSettingsHeaders (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/RCTTextHeaders (0.69.6): + - React-Core/RCTTextHeaders (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/RCTVibrationHeaders (0.69.6): + - React-Core/RCTVibrationHeaders (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-Core/RCTWebSocket (0.69.6): + - React-Core/RCTWebSocket (0.69.7): - glog - RCT-Folly (= 2021.06.28.00-v2) - - React-Core/Default (= 0.69.6) - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-Core/Default (= 0.69.7) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-perflogger (= 0.69.7) - Yoga - - React-CoreModules (0.69.6): + - React-CoreModules (0.69.7): - RCT-Folly (= 2021.06.28.00-v2) - - RCTTypeSafety (= 0.69.6) - - React-Codegen (= 0.69.6) - - React-Core/CoreModulesHeaders (= 0.69.6) - - React-jsi (= 0.69.6) - - React-RCTImage (= 0.69.6) - - ReactCommon/turbomodule/core (= 0.69.6) - - React-cxxreact (0.69.6): + - RCTTypeSafety (= 0.69.7) + - React-Codegen (= 0.69.7) + - React-Core/CoreModulesHeaders (= 0.69.7) + - React-jsi (= 0.69.7) + - React-RCTImage (= 0.69.7) + - ReactCommon/turbomodule/core (= 0.69.7) + - React-cxxreact (0.69.7): - boost (= 1.76.0) - DoubleConversion - glog - RCT-Folly (= 2021.06.28.00-v2) - - React-callinvoker (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsinspector (= 0.69.6) - - React-logger (= 0.69.6) - - React-perflogger (= 0.69.6) - - React-runtimeexecutor (= 0.69.6) - - React-hermes (0.69.6): + - React-callinvoker (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsinspector (= 0.69.7) + - React-logger (= 0.69.7) + - React-perflogger (= 0.69.7) + - React-runtimeexecutor (= 0.69.7) + - React-hermes (0.69.7): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.06.28.00-v2) - RCT-Folly/Futures (= 2021.06.28.00-v2) - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-jsiexecutor (= 0.69.6) - - React-jsinspector (= 0.69.6) - - React-perflogger (= 0.69.6) - - React-jsi (0.69.6): + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-jsiexecutor (= 0.69.7) + - React-jsinspector (= 0.69.7) + - React-perflogger (= 0.69.7) + - React-jsi (0.69.7): - boost (= 1.76.0) - DoubleConversion - glog - RCT-Folly (= 2021.06.28.00-v2) - - React-jsi/Default (= 0.69.6) - - React-jsi/Default (0.69.6): + - React-jsi/Default (= 0.69.7) + - React-jsi/Default (0.69.7): - boost (= 1.76.0) - DoubleConversion - glog - RCT-Folly (= 2021.06.28.00-v2) - - React-jsiexecutor (0.69.6): + - React-jsiexecutor (0.69.7): - DoubleConversion - glog - RCT-Folly (= 2021.06.28.00-v2) - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-perflogger (= 0.69.6) - - React-jsinspector (0.69.6) - - React-logger (0.69.6): + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-perflogger (= 0.69.7) + - React-jsinspector (0.69.7) + - React-logger (0.69.7): - glog - - react-native-flipper (0.171.1): + - react-native-flipper (0.174.0): - React-Core - - React-perflogger (0.69.6) - - React-RCTActionSheet (0.69.6): - - React-Core/RCTActionSheetHeaders (= 0.69.6) - - React-RCTAnimation (0.69.6): + - React-perflogger (0.69.7) + - React-RCTActionSheet (0.69.7): + - React-Core/RCTActionSheetHeaders (= 0.69.7) + - React-RCTAnimation (0.69.7): - RCT-Folly (= 2021.06.28.00-v2) - - RCTTypeSafety (= 0.69.6) - - React-Codegen (= 0.69.6) - - React-Core/RCTAnimationHeaders (= 0.69.6) - - React-jsi (= 0.69.6) - - ReactCommon/turbomodule/core (= 0.69.6) - - React-RCTBlob (0.69.6): + - RCTTypeSafety (= 0.69.7) + - React-Codegen (= 0.69.7) + - React-Core/RCTAnimationHeaders (= 0.69.7) + - React-jsi (= 0.69.7) + - ReactCommon/turbomodule/core (= 0.69.7) + - React-RCTBlob (0.69.7): - RCT-Folly (= 2021.06.28.00-v2) - - React-Codegen (= 0.69.6) - - React-Core/RCTBlobHeaders (= 0.69.6) - - React-Core/RCTWebSocket (= 0.69.6) - - React-jsi (= 0.69.6) - - React-RCTNetwork (= 0.69.6) - - ReactCommon/turbomodule/core (= 0.69.6) - - React-RCTImage (0.69.6): + - React-Codegen (= 0.69.7) + - React-Core/RCTBlobHeaders (= 0.69.7) + - React-Core/RCTWebSocket (= 0.69.7) + - React-jsi (= 0.69.7) + - React-RCTNetwork (= 0.69.7) + - ReactCommon/turbomodule/core (= 0.69.7) + - React-RCTImage (0.69.7): - RCT-Folly (= 2021.06.28.00-v2) - - RCTTypeSafety (= 0.69.6) - - React-Codegen (= 0.69.6) - - React-Core/RCTImageHeaders (= 0.69.6) - - React-jsi (= 0.69.6) - - React-RCTNetwork (= 0.69.6) - - ReactCommon/turbomodule/core (= 0.69.6) - - React-RCTLinking (0.69.6): - - React-Codegen (= 0.69.6) - - React-Core/RCTLinkingHeaders (= 0.69.6) - - React-jsi (= 0.69.6) - - ReactCommon/turbomodule/core (= 0.69.6) - - React-RCTNetwork (0.69.6): + - RCTTypeSafety (= 0.69.7) + - React-Codegen (= 0.69.7) + - React-Core/RCTImageHeaders (= 0.69.7) + - React-jsi (= 0.69.7) + - React-RCTNetwork (= 0.69.7) + - ReactCommon/turbomodule/core (= 0.69.7) + - React-RCTLinking (0.69.7): + - React-Codegen (= 0.69.7) + - React-Core/RCTLinkingHeaders (= 0.69.7) + - React-jsi (= 0.69.7) + - ReactCommon/turbomodule/core (= 0.69.7) + - React-RCTNetwork (0.69.7): - RCT-Folly (= 2021.06.28.00-v2) - - RCTTypeSafety (= 0.69.6) - - React-Codegen (= 0.69.6) - - React-Core/RCTNetworkHeaders (= 0.69.6) - - React-jsi (= 0.69.6) - - ReactCommon/turbomodule/core (= 0.69.6) - - React-RCTSettings (0.69.6): + - RCTTypeSafety (= 0.69.7) + - React-Codegen (= 0.69.7) + - React-Core/RCTNetworkHeaders (= 0.69.7) + - React-jsi (= 0.69.7) + - ReactCommon/turbomodule/core (= 0.69.7) + - React-RCTSettings (0.69.7): - RCT-Folly (= 2021.06.28.00-v2) - - RCTTypeSafety (= 0.69.6) - - React-Codegen (= 0.69.6) - - React-Core/RCTSettingsHeaders (= 0.69.6) - - React-jsi (= 0.69.6) - - ReactCommon/turbomodule/core (= 0.69.6) - - React-RCTText (0.69.6): - - React-Core/RCTTextHeaders (= 0.69.6) - - React-RCTVibration (0.69.6): + - RCTTypeSafety (= 0.69.7) + - React-Codegen (= 0.69.7) + - React-Core/RCTSettingsHeaders (= 0.69.7) + - React-jsi (= 0.69.7) + - ReactCommon/turbomodule/core (= 0.69.7) + - React-RCTText (0.69.7): + - React-Core/RCTTextHeaders (= 0.69.7) + - React-RCTVibration (0.69.7): - RCT-Folly (= 2021.06.28.00-v2) - - React-Codegen (= 0.69.6) - - React-Core/RCTVibrationHeaders (= 0.69.6) - - React-jsi (= 0.69.6) - - ReactCommon/turbomodule/core (= 0.69.6) - - React-runtimeexecutor (0.69.6): - - React-jsi (= 0.69.6) - - ReactCommon/turbomodule/core (0.69.6): + - React-Codegen (= 0.69.7) + - React-Core/RCTVibrationHeaders (= 0.69.7) + - React-jsi (= 0.69.7) + - ReactCommon/turbomodule/core (= 0.69.7) + - React-runtimeexecutor (0.69.7): + - React-jsi (= 0.69.7) + - ReactCommon/turbomodule/core (0.69.7): - DoubleConversion - glog - RCT-Folly (= 2021.06.28.00-v2) - - React-bridging (= 0.69.6) - - React-callinvoker (= 0.69.6) - - React-Core (= 0.69.6) - - React-cxxreact (= 0.69.6) - - React-jsi (= 0.69.6) - - React-logger (= 0.69.6) - - React-perflogger (= 0.69.6) + - React-bridging (= 0.69.7) + - React-callinvoker (= 0.69.7) + - React-Core (= 0.69.7) + - React-cxxreact (= 0.69.7) + - React-jsi (= 0.69.7) + - React-logger (= 0.69.7) + - React-perflogger (= 0.69.7) - SocketRocket (0.6.0) - Yoga (1.14.0) - YogaKit (1.18.1): @@ -530,8 +530,8 @@ SPEC CHECKSUMS: boost: a7c83b31436843459a1961bfd74b96033dc77234 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - FBLazyVector: 739d2f9719faecb463c7aa191591af31c8c94182 - FBReactNativeSpec: 957de82f66e31f2f14bbec34e37242282fdd26de + FBLazyVector: 6b7f5692909b4300d50e7359cdefbcd09dd30faa + FBReactNativeSpec: affcf71d996f6b0c01f68883482588297b9d5e6e Flipper: e57750a29313c49b9783a310150053d32b2b2b6f Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c Flipper-DoubleConversion: 3d3d04a078d4f3a1b6c6916587f159dc11f232c4 @@ -543,41 +543,41 @@ SPEC CHECKSUMS: FlipperKit: 02fd59af13a1465d04268cbffe3f93505f0a1dc2 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 3d02b25ca00c2d456734d0bcff864cbc62f6ae1a - hermes-engine: c2c873a670bc435451449f918c2b3ab3c39255fc + hermes-engine: 51aaceb1f6dc1aed44b8bbf866f52ec146c00a89 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c RCT-Folly: b9d9fe1fc70114b751c076104e52f3b1b5e5a95a - RCTRequired: c8c080849a3670601d5c7056023a2176067a69d8 - RCTTypeSafety: 710aef40f5ae246bc5fff7e873855b17ed11c180 - React: b6bb382534be4de9d367ef3d04f92108c1768160 - React-bridging: 0fca0337cef9305026814907dd29254a833a2db7 - React-callinvoker: 700e6eb96b5f7f2fdd96d7263cd4627d2fa080ed - React-Codegen: fd21633c4b9f47d0681bbb54b173a203963a5e4d - React-Core: 8ec15c9727c8c01b1e4f14cad5bd21f7c1d56d49 - React-CoreModules: 79486447bf901292a83df52d4f7acbecda296723 - React-cxxreact: 9022135650dd9960a60a1361e9add424c6c37ab9 - React-hermes: b5ce7fb460ff6d39e7bb9bbe1f523272c4b85c0b - React-jsi: 4ccb3599c422ad071e3895c5feab9b0afc40505d - React-jsiexecutor: c61b60de03b3474e5749b8a8fd8e6507630d62c4 - React-jsinspector: eaacb698c5af7a99131bc1933806372c20222dfd - React-logger: ebb4d31bbbe4f1a8a1a9b658d7429210b8f68160 - react-native-flipper: fccb8b9ca45d6392b22dff0e3555718c3b50b450 - React-perflogger: 1fb1ad5333b43a5137afd7608695f7a42c5efd27 - React-RCTActionSheet: a435bd67689433575a1e5d7614b021d2c17f0726 - React-RCTAnimation: d097c5ed2d00735958508617555abd85183b94e2 - React-RCTBlob: f43a0fceb328e1a40aa52701a4eba955635444ab - React-RCTImage: 08f4428e931efe0eefb94443c8ca08cfb250a556 - React-RCTLinking: 3a8851e818652582f87e5a7577302e6ad7e1de3e - React-RCTNetwork: 19f7c66b612e2336eefdfbc7ab3a9bd8ca4e21cf - React-RCTSettings: 9324e718a865ff01e4a96be4c65923581b2d5170 - React-RCTText: 9cadcd5d982c1d25f7439f47354b1c1b75e60105 - React-RCTVibration: 285f8538386c660e6b9497e204636acd93bf7fcc - React-runtimeexecutor: 0af71c94f968fa10015bf0119951bccd2e4d8865 - ReactCommon: fe7580b9d10f00249facf25659e0ec051320cc8a + RCTRequired: 54bff6aa61efd9598ab59d2a823c382b4fe13d27 + RCTTypeSafety: 47632bfa768df7befde08e339a9847e6cff6ff78 + React: 72a676de573cc5ee0e375e5535238af9a4bd435c + React-bridging: 12b6677a30fbd46555a35aa6096331737a9af598 + React-callinvoker: bb574a923c2281d01be23ed3b5d405caa583f56d + React-Codegen: a5e05592b65963a4a453808d2233a04edb7ac8cd + React-Core: 138385d05068622b2b1873eee7dc5be9762f5383 + React-CoreModules: 3a9be624998677db102b19090b1c33c7564ead6d + React-cxxreact: eb24a767b0b811259947f3d538e7c999467e7131 + React-hermes: 3a08a232d6783e21930b0f10f1c15d209ec9f7ad + React-jsi: 9c1cc1173fc8a24b094e01c54d8e3b567fed7edc + React-jsiexecutor: a73bec0218ba959fc92f811b581ad6c2270c6b6f + React-jsinspector: 8134ee22182b8dd98dc0973db6266c398103ce6c + React-logger: 1e7ac909607ee65fd5c4d8bea8c6e644f66b8843 + react-native-flipper: b269b4d4e1ec04f7f443f5edf15100a13e760bf0 + React-perflogger: 8e832d4e21fdfa613033c76d58d7e617341e804b + React-RCTActionSheet: 9ca778182a9523991bff6381045885b6e808bb73 + React-RCTAnimation: 9ced26ad20b96e532ac791a8ab92a7b1ce2266b8 + React-RCTBlob: 2ca3402386d6ab8e9a9a39117305c7601ba2a7f8 + React-RCTImage: 7be51899367082a49e7a7560247ab3961e4dd248 + React-RCTLinking: 262229106f181d8187a5a041fa0dffe6e9726347 + React-RCTNetwork: 428b6f17bf4684ede387422eb789ca89365e33d3 + React-RCTSettings: eaef83489b80045528f1fe1ea5daefaa586ed763 + React-RCTText: d197cff9d5d7f68bdb88468d94617bbf2aa6a48d + React-RCTVibration: 600a9f8b3537db360563d50fab3d040c262567d4 + React-runtimeexecutor: 65cd2782a57e1d59a68aa5d504edf94278578e41 + ReactCommon: 1e783348b9aa73ae68236271df972ba898560a95 SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 - Yoga: 75bf4b0131cfb46a659cd0c13309b79a6fcff66d + Yoga: 0b84a956f7393ef1f37f3bb213c516184e4a689d YogaKit: f782866e155069a2cca2517aafea43200b01fd5a PODFILE CHECKSUM: 4966f37d8cfbd2a5e09e261d78c6ccba4eee9ac5 -COCOAPODS: 1.11.3 +COCOAPODS: 1.11.2 From 227f53f6a06c71f6aed695ee30b9d8e61886bde2 Mon Sep 17 00:00:00 2001 From: John Knox Date: Wed, 25 Jan 2023 04:09:07 -0800 Subject: [PATCH 0457/1651] automatic update for docusaurus-plugin-internaldocs-fb@1.5.0 Reviewed By: antonk52 Differential Revision: D42709599 fbshipit-source-id: 0b0a3b66ceb8c00e2302eb08b7d52d682d429023 --- website/package.json | 2 +- website/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/website/package.json b/website/package.json index a788e8b08..a03644b60 100644 --- a/website/package.json +++ b/website/package.json @@ -19,7 +19,7 @@ "@emotion/styled": "^11.6.0", "@types/fs-extra": "^9.0.13", "antd": "^4.23.4", - "docusaurus-plugin-internaldocs-fb": "1.4.0", + "docusaurus-plugin-internaldocs-fb": "1.5.0", "file-cli": "^1.2.0", "flipper-plugin": "^0.131.1", "fs-extra": "^10.0.0", diff --git a/website/yarn.lock b/website/yarn.lock index e9e45075c..992943fc3 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -6040,10 +6040,10 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" -docusaurus-plugin-internaldocs-fb@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/docusaurus-plugin-internaldocs-fb/-/docusaurus-plugin-internaldocs-fb-1.4.0.tgz#d25b7d3629f797709a61441dc88d27d2e291ff7d" - integrity sha512-gnQzqprG9IJX/Awm4wWL0Tapv+iNHlTsaWlII1M41RVBlFsf3AXGGHwCbP1K5qBC48NJLFI2waOPbfPMjg384A== +docusaurus-plugin-internaldocs-fb@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-internaldocs-fb/-/docusaurus-plugin-internaldocs-fb-1.5.0.tgz#8fbe00ed7a7a67480fb148ddcd28135d79ae7040" + integrity sha512-OfL048Mly6iGLgG3qegXW68V4+YwtfWHZlKug0RPpH9mcvCHwV8hfRFmJM1AUCz9l51TnIjIM4JyE7AJMek2CA== dependencies: "@mdx-js/mdx" "^2.1.1" "@mdx-js/react" "^1.6.22" From 18b6ce6f2407388eacce6e058cdf654437ec1e91 Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Wed, 25 Jan 2023 04:35:09 -0800 Subject: [PATCH 0458/1651] Dep bump Summary: Combining a bunch of individual tasks for dep upgrades into one diff. Reviewed By: ivanmisuno Differential Revision: D42706074 fbshipit-source-id: 054b2545ad1295699f47f4c6eb5065b7b9a1d6a0 --- desktop/app/package.json | 4 +- desktop/babel-transformer/package.json | 30 +- desktop/doctor/package.json | 2 +- desktop/eslint-plugin-flipper/package.json | 2 +- desktop/flipper-dump/package.json | 2 +- desktop/flipper-frontend-core/package.json | 4 +- desktop/flipper-plugin-core/package.json | 4 +- desktop/flipper-plugin/package.json | 4 +- desktop/flipper-server-companion/package.json | 2 +- desktop/flipper-server-core/package.json | 4 +- desktop/flipper-server/package.json | 4 +- desktop/flipper-ui-core/package.json | 6 +- desktop/package.json | 2 +- desktop/pkg-lib/package.json | 2 +- desktop/pkg/package.json | 2 +- desktop/plugin-lib/package.json | 2 +- desktop/scripts/package.json | 2 +- desktop/static/package.json | 2 +- desktop/yarn.lock | 1357 ++++++++++++----- 19 files changed, 1035 insertions(+), 402 deletions(-) diff --git a/desktop/app/package.json b/desktop/app/package.json index fe5a83f2f..204352a09 100644 --- a/desktop/app/package.json +++ b/desktop/app/package.json @@ -15,12 +15,12 @@ }, "dependencies": { "flipper-common": "0.0.0", + "flipper-frontend-core": "0.0.0", "flipper-server-client": "0.0.0", "flipper-server-companion": "0.0.0", "flipper-server-core": "0.0.0", - "flipper-frontend-core": "0.0.0", "flipper-ui-core": "0.0.0", - "fs-extra": "^10.1.0", + "fs-extra": "^11.1.0", "invariant": "^2.2.2", "metro-runtime": "^0.70.2", "pretty-format": "^27.5.0", diff --git a/desktop/babel-transformer/package.json b/desktop/babel-transformer/package.json index da09cf94f..39384eb9c 100644 --- a/desktop/babel-transformer/package.json +++ b/desktop/babel-transformer/package.json @@ -9,24 +9,24 @@ "license": "MIT", "bugs": "https://github.com/facebook/flipper/issues", "dependencies": { - "@babel/core": "^7.17.10", - "@babel/generator": "^7.20.4", - "@babel/parser": "^7.17.10", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.17.3", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-transform-flow-strip-types": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.17.9", - "@babel/plugin-transform-typescript": "^7.16.8", - "@babel/preset-env": "^7.17.10", - "@babel/preset-react": "^7.16.7", - "@babel/traverse": "^7.17.10", - "@babel/types": "^7.17.10", + "@babel/core": "^7.20.12", + "@babel/generator": "^7.20.7", + "@babel/parser": "^7.20.13", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "@babel/plugin-proposal-optional-chaining": "^7.20.7", + "@babel/plugin-transform-flow-strip-types": "^7.19.0", + "@babel/plugin-transform-modules-commonjs": "^7.20.11", + "@babel/plugin-transform-typescript": "^7.20.13", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7", "@emotion/babel-plugin": "^11.7.2", "@types/fs-extra": "^9.0.13", "@types/node": "^17.0.31", - "fs-extra": "^10.1.0", + "fs-extra": "^11.1.0", "tslib": "^2.4.1" }, "devDependencies": { diff --git a/desktop/doctor/package.json b/desktop/doctor/package.json index 31f355b90..ca06988a1 100644 --- a/desktop/doctor/package.json +++ b/desktop/doctor/package.json @@ -28,6 +28,6 @@ "envinfo": "^7.8.1", "fb-watchman": "^2.0.1", "flipper-common": "0.0.0", - "fs-extra": "^10.1.0" + "fs-extra": "^11.1.0" } } diff --git a/desktop/eslint-plugin-flipper/package.json b/desktop/eslint-plugin-flipper/package.json index f2de0bbcb..3ac90d15c 100644 --- a/desktop/eslint-plugin-flipper/package.json +++ b/desktop/eslint-plugin-flipper/package.json @@ -12,7 +12,7 @@ "dependencies": { "@typescript-eslint/experimental-utils": "^5.22.0", "@typescript-eslint/parser": "^5.22.0", - "fs-extra": "^10.1.0" + "fs-extra": "^11.1.0" }, "devDependencies": {}, "scripts": { diff --git a/desktop/flipper-dump/package.json b/desktop/flipper-dump/package.json index f9f951a20..3d7930c42 100644 --- a/desktop/flipper-dump/package.json +++ b/desktop/flipper-dump/package.json @@ -12,7 +12,7 @@ "dependencies": { "flipper-common": "0.0.0", "flipper-server-core": "0.0.0", - "yargs": "^17.6.0" + "yargs": "^17.6.2" }, "devDependencies": { "@types/node": "^17.0.31" diff --git a/desktop/flipper-frontend-core/package.json b/desktop/flipper-frontend-core/package.json index 3370dcf4f..4dbf590d4 100644 --- a/desktop/flipper-frontend-core/package.json +++ b/desktop/flipper-frontend-core/package.json @@ -12,8 +12,8 @@ "eventemitter3": "^4.0.7", "flipper-common": "0.0.0", "flipper-plugin-core": "0.0.0", - "immer": "^9.0.12", - "js-base64": "^3.7.2", + "immer": "^9.0.18", + "js-base64": "^3.7.4", "p-map": "^4.0.0", "reconnecting-websocket": "^4.4.0", "semver": "^7.3.7" diff --git a/desktop/flipper-plugin-core/package.json b/desktop/flipper-plugin-core/package.json index d182dcdd9..e01319b75 100644 --- a/desktop/flipper-plugin-core/package.json +++ b/desktop/flipper-plugin-core/package.json @@ -11,8 +11,8 @@ "dependencies": { "eventemitter3": "^4.0.7", "flipper-common": "0.0.0", - "immer": "^9.0.12", - "js-base64": "^3.7.2", + "immer": "^9.0.18", + "js-base64": "^3.7.4", "lodash": "^4.17.21", "string-natural-compare": "^3.0.0" }, diff --git a/desktop/flipper-plugin/package.json b/desktop/flipper-plugin/package.json index 6624c2523..010238748 100644 --- a/desktop/flipper-plugin/package.json +++ b/desktop/flipper-plugin/package.json @@ -19,8 +19,8 @@ "eventemitter3": "^4.0.7", "flipper-common": "0.0.0", "flipper-plugin-core": "0.0.0", - "immer": "^9.0.12", - "js-base64": "^3.7.2", + "immer": "^9.0.18", + "js-base64": "^3.7.4", "lodash": "^4.17.21", "react-color": "^2.19.3", "react-element-to-jsx-string": "^14.3.4", diff --git a/desktop/flipper-server-companion/package.json b/desktop/flipper-server-companion/package.json index a7ce086b1..f0c4be040 100644 --- a/desktop/flipper-server-companion/package.json +++ b/desktop/flipper-server-companion/package.json @@ -12,7 +12,7 @@ "flipper-common": "0.0.0", "flipper-frontend-core": "0.0.0", "flipper-plugin-core": "0.0.0", - "immer": "^9.0.12" + "immer": "^9.0.18" }, "devDependencies": { "@types/node": "^17.0.29" diff --git a/desktop/flipper-server-core/package.json b/desktop/flipper-server-core/package.json index 3ebd0e7e5..1aabfefe3 100644 --- a/desktop/flipper-server-core/package.json +++ b/desktop/flipper-server-core/package.json @@ -24,10 +24,10 @@ "flipper-plugin-lib": "0.0.0", "flipper-server-companion": "0.0.0", "form-data": "^4.0.0", - "fs-extra": "^10.1.0", + "fs-extra": "^11.1.0", "http-proxy": "^1.18.1", "invariant": "^2.2.4", - "js-base64": "^3.7.2", + "js-base64": "^3.7.4", "lodash.memoize": "^4.1.2", "memorystream": "^0.3.1", "node-fetch": "2", diff --git a/desktop/flipper-server/package.json b/desktop/flipper-server/package.json index 72b763662..3b54ace5d 100644 --- a/desktop/flipper-server/package.json +++ b/desktop/flipper-server/package.json @@ -17,14 +17,14 @@ "flipper-pkg-lib": "0.0.0", "flipper-server-companion": "0.0.0", "flipper-server-core": "0.0.0", - "fs-extra": "^10.1.0", + "fs-extra": "^11.1.0", "http-proxy": "^1.18.1", "metro": "^0.70.2", "open": "^8.3.0", "p-filter": "^2.1.0", "ws": "^8.5.0", "xdg-basedir": "^4", - "yargs": "^17.6.0" + "yargs": "^17.6.2" }, "devDependencies": { "@types/express": "^4.17.13", diff --git a/desktop/flipper-ui-core/package.json b/desktop/flipper-ui-core/package.json index c9602bfc3..b3bf2b4b1 100644 --- a/desktop/flipper-ui-core/package.json +++ b/desktop/flipper-ui-core/package.json @@ -26,8 +26,8 @@ "flipper-plugin": "0.0.0", "flipper-ui-core": "0.0.0", "hotkeys-js": "^3.9.3", - "immer": "^9.0.12", - "js-base64": "^3.7.2", + "immer": "^9.0.18", + "js-base64": "^3.7.4", "jszip": "^3.10.1", "lodash": "^4.17.21", "lodash.memoize": "^4.1.2", @@ -51,7 +51,7 @@ "uuid": "^8.3.2" }, "devDependencies": { - "@testing-library/dom": "^8.17.1", + "@testing-library/dom": "^8.20.0", "@types/deep-equal": "^1.0.1", "@types/lodash.memoize": "^4.1.7", "@types/react": "^17.0.39", diff --git a/desktop/package.json b/desktop/package.json index 4e5ee4661..72bcf4de1 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -67,7 +67,7 @@ "category": "facebook-intern", "description": "Mobile development tool", "devDependencies": { - "@babel/eslint-parser": "^7.17.0", + "@babel/eslint-parser": "^7.19.1", "@jest-runner/electron": "^3.0.1", "@testing-library/react": "^12.1.4", "@types/jest": "^26.0.24", diff --git a/desktop/pkg-lib/package.json b/desktop/pkg-lib/package.json index 2ddce172b..870397141 100644 --- a/desktop/pkg-lib/package.json +++ b/desktop/pkg-lib/package.json @@ -14,7 +14,7 @@ "fb-watchman": "^2.0.1", "flipper-common": "0.0.0", "flipper-plugin-lib": "0.0.0", - "fs-extra": "^10.1.0", + "fs-extra": "^11.1.0", "metro": "^0.70.2", "metro-cache": "^0.70.2", "metro-minify-terser": "^0.70.2", diff --git a/desktop/pkg/package.json b/desktop/pkg/package.json index d2eea5e21..5017d7e0e 100644 --- a/desktop/pkg/package.json +++ b/desktop/pkg/package.json @@ -22,7 +22,7 @@ "cli-ux": "^6.0.9", "flipper-pkg-lib": "0.0.0", "flipper-plugin-lib": "0.0.0", - "fs-extra": "^10.1.0", + "fs-extra": "^11.1.0", "inquirer": "^8.2.4", "lodash": "^4.17.21", "recursive-readdir": "^2.2.2" diff --git a/desktop/plugin-lib/package.json b/desktop/plugin-lib/package.json index 17cecdc41..db09448df 100644 --- a/desktop/plugin-lib/package.json +++ b/desktop/plugin-lib/package.json @@ -14,7 +14,7 @@ "decompress-targz": "^4.1.1", "decompress-unzip": "^4.0.1", "flipper-common": "^0.0.0", - "fs-extra": "^10.1.0", + "fs-extra": "^11.1.0", "live-plugin-manager": "^0.17.1", "npm-api": "^1.0.1", "p-filter": "^2.1.0", diff --git a/desktop/scripts/package.json b/desktop/scripts/package.json index ecf661526..3370baa11 100644 --- a/desktop/scripts/package.json +++ b/desktop/scripts/package.json @@ -8,7 +8,7 @@ "bugs": "https://github.com/facebook/flipper/issues", "devDependencies": { "@adobe/node-fetch-retry": "^2.2.0", - "@babel/code-frame": "^7.16.7", + "@babel/code-frame": "^7.18.6", "@types/adobe__node-fetch-retry": "^1.0.4", "@types/babel__code-frame": "^7.0.3", "@types/detect-port": "^1.3.2", diff --git a/desktop/static/package.json b/desktop/static/package.json index 8055db720..e68c89825 100644 --- a/desktop/static/package.json +++ b/desktop/static/package.json @@ -11,7 +11,7 @@ "node-fetch": "^2.6.7", "ws": "^8.6.0", "xdg-basedir": "^4.0.0", - "yargs": "^17.6.0" + "yargs": "^17.6.2" }, "devDependencies": { "@types/mkdirp": "^1.0.2" diff --git a/desktop/yarn.lock b/desktop/yarn.lock index ef5eb5e50..460308a74 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -179,21 +179,28 @@ dependencies: "@babel/highlight" "^7.16.7" +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== -"@babel/compat-data@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" - integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== - "@babel/compat-data@^7.17.10": version "7.17.10" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": + version "7.20.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" + integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== + "@babel/core@^7.1.0", "@babel/core@^7.14.0", "@babel/core@^7.7.5": version "7.17.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225" @@ -236,37 +243,37 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/core@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05" - integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA== +"@babel/core@^7.20.12": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== dependencies: "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.10" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helpers" "^7.17.9" - "@babel/parser" "^7.17.10" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.10" - "@babel/types" "^7.17.10" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" + json5 "^2.2.2" semver "^6.3.0" -"@babel/eslint-parser@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz#eabb24ad9f0afa80e5849f8240d0e5facc2d90d6" - integrity sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA== +"@babel/eslint-parser@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" + integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== dependencies: - eslint-scope "^5.1.1" + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.14.0", "@babel/generator@^7.17.10", "@babel/generator@^7.17.3", "@babel/generator@^7.18.0", "@babel/generator@^7.20.4": +"@babel/generator@^7.14.0", "@babel/generator@^7.17.3", "@babel/generator@^7.18.0": version "7.20.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA== @@ -275,6 +282,15 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" + integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" @@ -296,6 +312,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" @@ -304,6 +327,14 @@ "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" @@ -324,6 +355,17 @@ browserslist "^4.20.2" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.14.6": version "7.14.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" @@ -336,19 +378,6 @@ "@babel/helper-replace-supers" "^7.14.5" "@babel/helper-split-export-declaration" "^7.14.5" -"@babel/helper-create-class-features-plugin@^7.16.10": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" - integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-create-class-features-plugin@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz#9c5b34b53a01f2097daf10678d65135c1b9f84ba" @@ -375,18 +404,19 @@ "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" -"@babel/helper-create-class-features-plugin@^7.17.6": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" - integrity sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.12", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" + integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-member-expression-to-functions" "^7.17.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-create-regexp-features-plugin@^7.16.7": version "7.16.7" @@ -412,6 +442,14 @@ "@babel/helper-annotate-as-pure" "^7.16.7" regexpu-core "^5.0.1" +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.2.1" + "@babel/helper-define-polyfill-provider@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" @@ -426,6 +464,18 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + "@babel/helper-environment-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" @@ -433,6 +483,11 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + "@babel/helper-explode-assignable-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" @@ -440,6 +495,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-function-name@^7.14.5": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" @@ -466,6 +528,14 @@ "@babel/template" "^7.16.7" "@babel/types" "^7.17.0" +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + "@babel/helper-get-function-arity@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" @@ -487,6 +557,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-member-expression-to-functions@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz#d5c70e4ad13b402c95156c7a53568f504e2fb7b8" @@ -508,6 +585,13 @@ dependencies: "@babel/types" "^7.17.0" +"@babel/helper-member-expression-to-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== + dependencies: + "@babel/types" "^7.20.7" + "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12", "@babel/helper-module-imports@^7.8.3": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" @@ -522,6 +606,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-module-transforms@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" @@ -564,6 +655,20 @@ "@babel/traverse" "^7.18.0" "@babel/types" "^7.18.0" +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.10" + "@babel/types" "^7.20.7" + "@babel/helper-optimise-call-expression@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" @@ -578,6 +683,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" @@ -593,6 +705,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== +"@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + "@babel/helper-remap-async-to-generator@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" @@ -602,6 +719,16 @@ "@babel/helper-wrap-function" "^7.16.8" "@babel/types" "^7.16.8" +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + "@babel/helper-replace-supers@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" @@ -623,6 +750,18 @@ "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + "@babel/helper-simple-access@^7.16.7", "@babel/helper-simple-access@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" @@ -630,6 +769,13 @@ dependencies: "@babel/types" "^7.17.0" +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" @@ -637,6 +783,13 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + "@babel/helper-split-export-declaration@^7.14.5": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" @@ -651,6 +804,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-string-parser@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" @@ -661,7 +821,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/helper-validator-identifier@^7.19.1": +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== @@ -671,6 +831,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + "@babel/helper-wrap-function@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" @@ -681,6 +846,16 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + "@babel/helpers@^7.17.2": version "7.17.8" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.8.tgz#288450be8c6ac7e4e44df37bcc53d345e07bc106" @@ -690,15 +865,6 @@ "@babel/traverse" "^7.17.3" "@babel/types" "^7.17.0" -"@babel/helpers@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" - integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.9" - "@babel/types" "^7.17.0" - "@babel/helpers@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.0.tgz#aff37c3590de42102b54842446146d0205946370" @@ -708,6 +874,15 @@ "@babel/traverse" "^7.18.0" "@babel/types" "^7.18.0" +"@babel/helpers@^7.20.7": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" + integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.13" + "@babel/types" "^7.20.7" + "@babel/highlight@^7.10.4": version "7.16.10" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" @@ -726,6 +901,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.0", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.7.0": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0" @@ -736,17 +920,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.0.tgz#10a8d4e656bc01128d299a787aa006ce1a91e112" integrity sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg== -"@babel/parser@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" - integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" - integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" +"@babel/parser@^7.20.13", "@babel/parser@^7.20.7": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.13.tgz#ddf1eb5a813588d2fb1692b70c6fce75b945c088" + integrity sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": version "7.17.12" @@ -755,14 +932,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" - integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12": version "7.17.12" @@ -773,7 +948,16 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-proposal-optional-chaining" "^7.17.12" -"@babel/plugin-proposal-async-generator-functions@^7.0.0", "@babel/plugin-proposal-async-generator-functions@^7.16.8": +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" + +"@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== @@ -791,7 +975,17 @@ "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.16.7": +"@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== @@ -807,14 +1001,13 @@ "@babel/helper-create-class-features-plugin" "^7.17.12" "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-class-static-block@^7.17.6": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" - integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.6" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-class-static-block@^7.18.0": version "7.18.0" @@ -825,6 +1018,15 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-class-static-block" "^7.14.5" +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" + integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-proposal-dynamic-import@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" @@ -833,6 +1035,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-export-default-from@^7.0.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.8.3.tgz#4cb7c2fdeaed490b60d9bfd3dc8a20f81f9c2e7c" @@ -841,14 +1051,6 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-export-default-from" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" - integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-proposal-export-namespace-from@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378" @@ -857,13 +1059,13 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" - integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-json-strings@^7.17.12": version "7.17.12" @@ -873,13 +1075,13 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" - integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-proposal-logical-assignment-operators@^7.17.12": version "7.17.12" @@ -889,7 +1091,15 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== @@ -905,6 +1115,14 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" @@ -913,6 +1131,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" @@ -924,17 +1150,6 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.16.7" -"@babel/plugin-proposal-object-rest-spread@^7.17.3": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" - integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== - dependencies: - "@babel/compat-data" "^7.17.0" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz#79f2390c892ba2a68ec112eb0d895cfbd11155e8" @@ -946,6 +1161,17 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.17.12" +"@babel/plugin-proposal-object-rest-spread@^7.20.2", "@babel/plugin-proposal-object-rest-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + "@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" @@ -954,7 +1180,15 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== @@ -972,13 +1206,14 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.16.11": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" - integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== +"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" + integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.10" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.17.12": version "7.17.12" @@ -988,15 +1223,13 @@ "@babel/helper-create-class-features-plugin" "^7.17.12" "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-private-property-in-object@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" - integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-private-property-in-object@^7.17.12": version "7.17.12" @@ -1008,13 +1241,15 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" - integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.17.12": version "7.17.12" @@ -1024,6 +1259,22 @@ "@babel/helper-create-regexp-features-plugin" "^7.17.12" "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-proposal-unicode-property-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -1087,6 +1338,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-syntax-flow@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-import-assertions@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz#58096a92b11b2e4e54b24c6a0cc0e5e607abcedd" @@ -1094,6 +1352,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -1115,14 +1380,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" - integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-jsx@^7.17.12": +"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== @@ -1192,13 +1450,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" - integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-typescript@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz#b54fc3be6de734a56b87508f99d6428b5b605a7b" @@ -1206,7 +1457,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.16.7": +"@babel/plugin-syntax-typescript@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== @@ -1220,7 +1478,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.16.8": +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-async-to-generator@^7.0.0": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== @@ -1238,6 +1503,15 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/helper-remap-async-to-generator" "^7.16.8" +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" @@ -1245,7 +1519,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.16.7": +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== @@ -1259,7 +1540,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.16.7": +"@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a" + integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-classes@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== @@ -1287,7 +1575,22 @@ "@babel/helper-split-export-declaration" "^7.16.7" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.16.7": +"@babel/plugin-transform-classes@^7.20.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" + integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== @@ -1301,6 +1604,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + "@babel/plugin-transform-destructuring@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" @@ -1308,13 +1619,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-destructuring@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" - integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-destructuring@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858" @@ -1322,6 +1626,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" + integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" @@ -1330,12 +1641,13 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-duplicate-keys@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" - integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== +"@babel/plugin-transform-dotall-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-duplicate-keys@^7.17.12": version "7.17.12" @@ -1344,6 +1656,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator@^7.0.0", "@babel/plugin-transform-exponentiation-operator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" @@ -1352,7 +1671,15 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.16.7": +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== @@ -1368,7 +1695,15 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-flow" "^7.17.12" -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.16.7": +"@babel/plugin-transform-flow-strip-types@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" + integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-flow" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== @@ -1382,6 +1717,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" @@ -1391,7 +1733,16 @@ "@babel/helper-function-name" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.16.7": +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== @@ -1405,6 +1756,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" @@ -1412,14 +1770,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-modules-amd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" - integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-amd@^7.18.0": version "7.18.0" @@ -1430,6 +1786,14 @@ "@babel/helper-plugin-utils" "^7.17.12" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-amd@^7.19.6": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-modules-commonjs@^7.0.0": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz#d86b217c8e45bb5f2dbc11eefc8eab62cf980d19" @@ -1440,16 +1804,6 @@ "@babel/helper-simple-access" "^7.17.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" - integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== - dependencies: - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-commonjs@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz#3be575e19fbd273d42adbc84566b1fad3582b3db" @@ -1460,16 +1814,14 @@ "@babel/helper-simple-access" "^7.17.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.17.8": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" - integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== +"@babel/plugin-transform-modules-commonjs@^7.19.6", "@babel/plugin-transform-modules-commonjs@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" + integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" "@babel/plugin-transform-modules-systemjs@^7.18.0": version "7.18.0" @@ -1482,13 +1834,15 @@ "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" - integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.18.0": version "7.18.0" @@ -1498,7 +1852,15 @@ "@babel/helper-module-transforms" "^7.18.0" "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.17.10": +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0": version "7.17.10" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz#715dbcfafdb54ce8bccd3d12e8917296a4ba66a4" integrity sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA== @@ -1513,12 +1875,13 @@ "@babel/helper-create-regexp-features-plugin" "^7.17.12" "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-transform-new-target@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" - integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-new-target@^7.17.12": version "7.17.12" @@ -1527,6 +1890,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" @@ -1535,6 +1905,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + "@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" @@ -1549,6 +1927,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" + integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" @@ -1556,6 +1941,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-react-display-name@^7.0.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" @@ -1563,19 +1955,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-display-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" - integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== +"@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx-self@^7.0.0": version "7.12.1" @@ -1602,31 +1994,24 @@ "@babel/plugin-syntax-jsx" "^7.12.13" "@babel/types" "^7.13.12" -"@babel/plugin-transform-react-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" - integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz#f950f0b0c36377503d29a712f16287cedf886cbb" + integrity sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.20.7" -"@babel/plugin-transform-react-pure-annotations@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" - integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-regenerator@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" - integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== - dependencies: - regenerator-transform "^0.15.0" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-regenerator@^7.18.0": version "7.18.0" @@ -1636,12 +2021,13 @@ "@babel/helper-plugin-utils" "^7.17.12" regenerator-transform "^0.15.0" -"@babel/plugin-transform-reserved-words@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" - integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.17.12": version "7.17.12" @@ -1650,6 +2036,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-runtime@^7.0.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz#c0153bc0a5375ebc1f1591cb7eea223adea9f169" @@ -1667,7 +2060,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.16.7": +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== @@ -1683,6 +2083,14 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" +"@babel/plugin-transform-spread@^7.19.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" @@ -1690,7 +2098,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.16.7": +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== @@ -1704,12 +2119,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-transform-typeof-symbol@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" - integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typeof-symbol@^7.17.12": version "7.17.12" @@ -1718,14 +2133,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-transform-typescript@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" - integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-typescript" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.17.12": version "7.18.1" @@ -1736,6 +2149,15 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-typescript" "^7.17.12" +"@babel/plugin-transform-typescript@^7.20.13": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz#e3581b356b8694f6ff450211fe6774eaff8d25ab" + integrity sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.12" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/plugin-transform-typescript@^7.5.0": version "7.14.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz#6e9c2d98da2507ebe0a883b100cde3c7279df36c" @@ -1752,6 +2174,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" @@ -1760,6 +2189,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/preset-env@^7.1.6": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.0.tgz#ec7e51f4c6e026816000b230ed7cf74a1530d91d" @@ -1841,37 +2278,38 @@ core-js-compat "^3.22.1" semver "^6.3.0" -"@babel/preset-env@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.17.10.tgz#a81b093669e3eb6541bb81a23173c5963c5de69c" - integrity sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g== +"@babel/preset-env@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.8" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.17.6" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.17.3" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.11" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -1881,44 +2319,44 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.17.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.17.9" - "@babel/plugin-transform-modules-systemjs" "^7.17.8" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.10" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.17.9" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.17.10" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.22.1" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" semver "^6.3.0" "@babel/preset-flow@^7.0.0": @@ -1941,17 +2379,17 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" - integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== +"@babel/preset-react@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-react-display-name" "^7.16.7" - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" "@babel/preset-typescript@^7.1.0": version "7.17.12" @@ -1997,6 +2435,15 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/template@^7.18.10", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.7.0": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" @@ -2013,22 +2460,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.17.10", "@babel/traverse@^7.17.9": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" - integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.10" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.10" - "@babel/types" "^7.17.10" - debug "^4.1.0" - globals "^11.1.0" - "@babel/traverse@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.0.tgz#0e5ec6db098660b2372dd63d096bf484e32d27ba" @@ -2045,7 +2476,23 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.5", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.10", "@babel/types@^7.18.0", "@babel/types@^7.20.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": +"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.13" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.5", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.20.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== @@ -2054,6 +2501,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" @@ -2819,6 +3275,13 @@ lodash "^4.17.15" tmp-promise "^3.0.2" +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -3069,7 +3532,7 @@ resolved "https://registry.yarnpkg.com/@tanishiking/aho-corasick/-/aho-corasick-0.0.1.tgz#013180c33d4d8432fbd83d7db51f5d5f79f944e1" integrity sha512-70Fy5dKDfoaKq9CaWVaSvheCmQ/M7BxNAlQJfL1qUqX5/cyUZpQvK8nGkGSAUtHs7yokOOlOR6+WlIr6GVJrjw== -"@testing-library/dom@^8.0.0", "@testing-library/dom@^8.17.1": +"@testing-library/dom@^8.0.0": version "8.17.1" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.17.1.tgz#2d7af4ff6dad8d837630fecd08835aee08320ad7" integrity sha512-KnH2MnJUzmFNPW6RIKfd+zf2Wue8mEKX0M3cpX6aKl5ZXrJM1/c/Pc8c2xDNYQCnJO48Sm5ITbMXgqTr3h4jxQ== @@ -3083,6 +3546,20 @@ lz-string "^1.4.4" pretty-format "^27.0.2" +"@testing-library/dom@^8.20.0": + version "8.20.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz#914aa862cef0f5e89b98cc48e3445c4c921010f6" + integrity sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "^5.0.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.4.4" + pretty-format "^27.0.2" + "@testing-library/react@^12.1.4": version "12.1.5" resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.5.tgz#bb248f72f02a5ac9d949dea07279095fa577963b" @@ -3121,6 +3598,11 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A== +"@types/aria-query@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" + integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== + "@types/babel__code-frame@^7.0.3": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/babel__code-frame/-/babel__code-frame-7.0.3.tgz#eda94e1b7c9326700a4b69c485ebbc9498a0b63f" @@ -4648,6 +5130,15 @@ babel-plugin-polyfill-corejs2@^0.3.0: "@babel/helper-define-polyfill-provider" "^0.3.0" semver "^6.1.1" +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + babel-plugin-polyfill-corejs3@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz#f81371be3fe499d39e074e272a1ef86533f3d268" @@ -4656,6 +5147,14 @@ babel-plugin-polyfill-corejs3@^0.5.0: "@babel/helper-define-polyfill-provider" "^0.3.0" core-js-compat "^3.20.0" +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + babel-plugin-polyfill-regenerator@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" @@ -4663,6 +5162,13 @@ babel-plugin-polyfill-regenerator@^0.3.0: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.0" +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" @@ -4954,6 +5460,16 @@ browserslist@^4.20.2, browserslist@^4.20.3: node-releases "^2.0.3" picocolors "^1.0.0" +browserslist@^4.21.3, browserslist@^4.21.4: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -5166,6 +5682,11 @@ caniuse-lite@^1.0.30001332: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz#899254a0b70579e5a957c32dced79f0727c61f2a" integrity sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w== +caniuse-lite@^1.0.30001400: + version "1.0.30001447" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001447.tgz#ef1f39ae38d839d7176713735a8e467a0a2523bd" + integrity sha512-bdKU1BQDPeEXe9A39xJnGtY0uRq/z5osrnXUw0TcK+EYno45Y+U7QU9HhHEyzvMDffpYadFXi3idnSNkcwLkTw== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -5697,6 +6218,13 @@ core-js-compat@^3.22.1: browserslist "^4.20.3" semver "7.0.0" +core-js-compat@^3.25.1: + version "3.27.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" + integrity sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg== + dependencies: + browserslist "^4.21.4" + core-js-pure@^3.0.0: version "3.6.5" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" @@ -6363,6 +6891,11 @@ electron-to-chromium@^1.4.17: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.40.tgz#f5dbced7bfbc7072e5e7ca5487f8f9a42c8bc768" integrity sha512-j+eVIyQGt2EU5xPWUblhpp5P5z5xyAdRgzogBgfe2F5JGV17gr9pfzWBua6DlPL00LavbOjxubWkWkbVQe9Wlw== +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + electron@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/electron/-/electron-18.2.0.tgz#a0cbf8d5d1a1e9d1c195d86cd6937e721ed60fec" @@ -6904,7 +7437,7 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@^5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -7591,6 +8124,15 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" @@ -8166,10 +8708,10 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= -immer@^9.0.12: - version "9.0.12" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.12.tgz#2d33ddf3ee1d247deab9d707ca472c8c942a0f20" - integrity sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA== +immer@^9.0.18: + version "9.0.18" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.18.tgz#d2faee58fd0e34f017f329b98cdab37826fa31b8" + integrity sha512-eAPNpsj7Ax1q6Y/3lm2PmlwRcFzpON7HSNQ3ru5WQH1/PSpnyed/HpNOELl2CxLKoj4r+bAHgdyKqW5gc2Se1A== import-fresh@^2.0.0: version "2.0.0" @@ -9567,10 +10109,10 @@ jest@^26.6.3: import-local "^3.0.2" jest-cli "^26.6.3" -js-base64@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.2.tgz#816d11d81a8aff241603d19ce5761e13e41d7745" - integrity sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ== +js-base64@^3.7.4: + version "3.7.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.4.tgz#af95b20f23efc8034afd2d1cc5b9d0adf7419037" + integrity sha512-wpM/wi20Tl+3ifTyi0RdDckS4YTD4Lf953mBRrpG8547T7hInHNPEj8+ck4gB8VDcGyeAWFK++Wb/fU1BeavKQ== js-flipper@^0.146.1: version "0.146.1" @@ -9779,6 +10321,11 @@ json5@^2.2.1: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -10158,6 +10705,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -10860,6 +11414,11 @@ node-releases@^2.0.3: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== +node-releases@^2.0.6: + version "2.0.8" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" + integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== + normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -12423,6 +12982,13 @@ regenerate-unicode-properties@^10.0.1: dependencies: regenerate "^1.4.2" +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -12452,6 +13018,13 @@ regenerator-transform@^0.15.0: dependencies: "@babel/runtime" "^7.8.4" +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -12497,6 +13070,18 @@ regexpu-core@^5.0.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" +regexpu-core@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" + integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsgen "^0.7.1" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + registry-auth-token@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" @@ -12521,6 +13106,11 @@ regjsgen@^0.6.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== +regjsgen@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" + integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== + regjsparser@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" @@ -12535,6 +13125,13 @@ regjsparser@^0.8.2: dependencies: jsesc "~0.5.0" +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + remark-parse@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" @@ -14122,6 +14719,11 @@ unicode-match-property-value-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + unicode-property-aliases-ecmascript@^1.0.4: version "1.1.0" resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" @@ -14237,6 +14839,14 @@ unzip-crx-3@^0.2.0: mkdirp "^0.5.1" yaku "^0.16.6" +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + update-notifier@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" @@ -14667,6 +15277,11 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -14700,6 +15315,11 @@ yargs-parser@^21.0.0: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@^15.3.1, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -14743,6 +15363,19 @@ yargs@^17.0.1, yargs@^17.6.0: y18n "^5.0.5" yargs-parser "^21.0.0" +yargs@^17.6.2: + version "17.6.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yauzl@^2.10.0, yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" From 412d10b280f9f2de8ffa71dcea8c34b99e33a87b Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 25 Jan 2023 04:47:11 -0800 Subject: [PATCH 0459/1651] Make sure pending metadata is reset and is thread safe Summary: We have gotton concurrent modification crashes from this Reviewed By: lblasa Differential Revision: D42343224 fbshipit-source-id: 9cf4046da63d40cbe6632c3ae24d95abd21081ba --- .../uidebugger/UIDebuggerFlipperPlugin.kt | 2 +- .../descriptors/MetadataRegister.kt | 42 ++++++++++--------- .../observers/TreeObserverManager.kt | 2 +- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt index f725c80f7..b5a5a1d66 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt @@ -59,7 +59,7 @@ class UIDebuggerFlipperPlugin( MetadataUpdateEvent.name, Json.encodeToString( MetadataUpdateEvent.serializer(), - MetadataUpdateEvent(MetadataRegister.getPendingMetadata()))) + MetadataUpdateEvent(MetadataRegister.extractPendingMetadata()))) context.treeObserverManager.start() } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt index 55a780b07..c8f772c51 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt @@ -23,9 +23,11 @@ object MetadataRegister { const val TYPE_LAYOUT = "layout" const val TYPE_DOCUMENTATION = "documentation" + private val lock = "lock" + private var generator: MetadataId = 0 private val register: MutableMap = mutableMapOf() - private val pending: MutableSet = mutableSetOf() + private val pendingKeys: MutableSet = mutableSetOf() private fun key(namespace: String, name: String): String = "${namespace}_$name" @@ -41,13 +43,15 @@ object MetadataRegister { return m.id } - val identifier = ++generator - val metadata = Metadata(identifier, type, namespace, name, mutable, possibleValues) + synchronized(lock) { + val identifier = ++generator + val metadata = Metadata(identifier, type, namespace, name, mutable, possibleValues) - register[key] = metadata - pending.add(key) + register[key] = metadata + pendingKeys.add(key) - return identifier + return identifier + } } fun get(namespace: String, name: String): Metadata? { @@ -55,24 +59,24 @@ object MetadataRegister { return register[key] } - fun getMetadata(): Map { - val metadata: MutableMap = mutableMapOf() - register.forEach { entry -> metadata[entry.value.id] = entry.value } + /** gets all pending metadata to be sent and resets the pending list */ + fun extractPendingMetadata(): Map { + synchronized(lock) { + val pendingMetadata: MutableMap = mutableMapOf() - return metadata - } + pendingKeys.forEach { key -> + register[key]?.let { metadata -> pendingMetadata[metadata.id] = metadata } + } + pendingKeys.clear() - fun getPendingMetadata(): Map { - val pendingMetadata: MutableMap = mutableMapOf() - pending.forEach { key -> - register[key]?.let { metadata -> pendingMetadata[metadata.id] = metadata } + return pendingMetadata } - - return pendingMetadata } fun reset() { - pending.clear() - register.forEach { entry -> pending.add(entry.key) } + synchronized(lock) { + pendingKeys.clear() + register.forEach { entry -> pendingKeys.add(entry.key) } + } } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index 2c088011a..5c188e450 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -90,7 +90,7 @@ class TreeObserverManager(val context: Context) { } private fun sendMetadata() { - val metadata = MetadataRegister.getPendingMetadata() + val metadata = MetadataRegister.extractPendingMetadata() if (metadata.size > 0) { context.connectionRef.connection?.send( MetadataUpdateEvent.name, From a6ab3f5649258c486c32eb5afe124462253f2eee Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 25 Jan 2023 04:47:11 -0800 Subject: [PATCH 0460/1651] Remove Coordinate update event Summary: This idea did not pan out Reviewed By: lblasa Differential Revision: D42453231 fbshipit-source-id: 1feac79b8655f4249e84b64cdce9fded6e5f5718 --- .../plugins/uidebugger/model/Events.kt | 11 ---------- .../observers/TreeObserverManager.kt | 22 +++++-------------- 2 files changed, 5 insertions(+), 28 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt index ae6df92e5..7d39bb1dc 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt @@ -38,17 +38,6 @@ data class SubtreeUpdateEvent( } } -@kotlinx.serialization.Serializable -data class CoordinateUpdateEvent( - val observerType: String, - val nodeId: Id, - val coordinate: Coordinate -) { - companion object { - const val name = "coordinateUpdate" - } -} - /** Separate optional performance statistics event */ @kotlinx.serialization.Serializable data class PerfStatsEvent( diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index 5c188e450..4d3ec7ac3 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -17,8 +17,6 @@ import com.facebook.flipper.plugins.uidebugger.common.BitmapPool import com.facebook.flipper.plugins.uidebugger.core.Context import com.facebook.flipper.plugins.uidebugger.descriptors.Id import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister -import com.facebook.flipper.plugins.uidebugger.model.Coordinate -import com.facebook.flipper.plugins.uidebugger.model.CoordinateUpdateEvent import com.facebook.flipper.plugins.uidebugger.model.MetadataUpdateEvent import com.facebook.flipper.plugins.uidebugger.model.Node import com.facebook.flipper.plugins.uidebugger.model.PerfStatsEvent @@ -32,9 +30,6 @@ import kotlinx.serialization.json.Json sealed interface Update -data class CoordinateUpdate(val observerType: String, val nodeId: Id, val coordinate: Coordinate) : - Update - data class SubtreeUpdate( val observerType: String, val rootId: Id, @@ -43,18 +38,18 @@ data class SubtreeUpdate( val traversalCompleteTime: Long, val snapshotComplete: Long, val snapshot: BitmapPool.ReusableBitmap? -) : Update +) /** Holds the root observer and manages sending updates to desktop */ class TreeObserverManager(val context: Context) { private val rootObserver = ApplicationTreeObserver(context) - private lateinit var updates: Channel + private lateinit var updates: Channel private var job: Job? = null private val workerScope = CoroutineScope(Dispatchers.IO) private val txId = AtomicInteger() - fun enqueueUpdate(update: Update) { + fun enqueueUpdate(update: SubtreeUpdate) { updates.trySend(update) } @@ -72,15 +67,8 @@ class TreeObserverManager(val context: Context) { workerScope.launch { while (isActive) { try { - when (val update = updates.receive()) { - is SubtreeUpdate -> sendSubtreeUpdate(update) - is CoordinateUpdate -> { - val event = - CoordinateUpdateEvent(update.observerType, update.nodeId, update.coordinate) - val serialized = Json.encodeToString(CoordinateUpdateEvent.serializer(), event) - context.connectionRef.connection?.send(CoordinateUpdateEvent.name, serialized) - } - } + val update = updates.receive() + sendSubtreeUpdate(update) } catch (e: CancellationException) {} catch (e: java.lang.Exception) { Log.e(LogTag, "Unexpected Error in channel ", e) } From 3b65994ca6efc056d69c242265572c90d8fb2a5b Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 25 Jan 2023 04:47:11 -0800 Subject: [PATCH 0461/1651] Interactions with TreeObserverManager moved to main thread Summary: Needed for next diff Reviewed By: lblasa Differential Revision: D42453228 fbshipit-source-id: 29e2655bf08376cd12a98ab61fe95b804b0c7ba1 --- .../plugins/uidebugger/UIDebuggerFlipperPlugin.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt index b5a5a1d66..d5a4c3909 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt @@ -18,6 +18,9 @@ import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister import com.facebook.flipper.plugins.uidebugger.model.InitEvent import com.facebook.flipper.plugins.uidebugger.model.MetadataUpdateEvent import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import kotlinx.serialization.json.Json const val LogTag = "ui-debugger" @@ -28,6 +31,7 @@ class UIDebuggerFlipperPlugin( observerFactory: TreeObserverFactory? ) : FlipperPlugin { + val mainScope = CoroutineScope(Dispatchers.Main) private val context: Context = Context( ApplicationRef(application), @@ -61,7 +65,7 @@ class UIDebuggerFlipperPlugin( MetadataUpdateEvent.serializer(), MetadataUpdateEvent(MetadataRegister.extractPendingMetadata()))) - context.treeObserverManager.start() + mainScope.launch { context.treeObserverManager.start() } } @Throws(Exception::class) @@ -71,8 +75,10 @@ class UIDebuggerFlipperPlugin( MetadataRegister.reset() - context.treeObserverManager.stop() - context.bitmapPool.recycleAll() + mainScope.launch { + context.treeObserverManager.stop() + context.bitmapPool.recycleAll() + } } override fun runInBackground(): Boolean { From b5392fb818bd41652cb08fbfb82283f2dff64a20 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 25 Jan 2023 04:47:11 -0800 Subject: [PATCH 0462/1651] Batch subtree updates sent on the same frame Summary: This is needed in preperation for the next diff where we will introduce an observer per litho view. Without batching we end up with really poor performance for a few reasons: 1. There are some operations on the desktop plugin that are o(nodes) so even sending small batches 2. Flipper isnt really a high performance message bus, it seems to prefer fewer larger messages 3. Queuing time on the client builds up as you spend more time waiting on the socket In a future diff will address: The name of subtree update event. It should probably be called something like FrameUpdate since they are always full frames The performance monitoring, will more to timing methods and summing the result rather than the current appraoch of time markers Reviewed By: lblasa Differential Revision: D42453229 fbshipit-source-id: eda9830b4420e82874717cc69b241e1689f20029 --- .../observers/TreeObserverManager.kt | 119 ++++++++++-------- 1 file changed, 70 insertions(+), 49 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index 4d3ec7ac3..c32edc374 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -12,6 +12,7 @@ import android.graphics.Bitmap import android.util.Base64 import android.util.Base64OutputStream import android.util.Log +import android.view.Choreographer import com.facebook.flipper.plugins.uidebugger.LogTag import com.facebook.flipper.plugins.uidebugger.common.BitmapPool import com.facebook.flipper.plugins.uidebugger.core.Context @@ -28,8 +29,6 @@ import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel import kotlinx.serialization.json.Json -sealed interface Update - data class SubtreeUpdate( val observerType: String, val rootId: Id, @@ -40,17 +39,26 @@ data class SubtreeUpdate( val snapshot: BitmapPool.ReusableBitmap? ) +data class BatchedUpdate(val updates: List, val frameTimeMs: Long) + /** Holds the root observer and manages sending updates to desktop */ class TreeObserverManager(val context: Context) { private val rootObserver = ApplicationTreeObserver(context) - private lateinit var updates: Channel + private lateinit var batchedUpdates: Channel + + private val subtreeUpdateBuffer = SubtreeUpdateBuffer(this::enqueueBatch) + private var job: Job? = null private val workerScope = CoroutineScope(Dispatchers.IO) private val txId = AtomicInteger() fun enqueueUpdate(update: SubtreeUpdate) { - updates.trySend(update) + subtreeUpdateBuffer.bufferUpdate(update) + } + + private fun enqueueBatch(batchedUpdate: BatchedUpdate) { + batchedUpdates.trySend(batchedUpdate) } /** @@ -60,15 +68,15 @@ class TreeObserverManager(val context: Context) { @SuppressLint("NewApi") fun start() { - updates = Channel(Channel.UNLIMITED) + batchedUpdates = Channel(Channel.UNLIMITED) rootObserver.subscribe(context.applicationRef) job = workerScope.launch { while (isActive) { try { - val update = updates.receive() - sendSubtreeUpdate(update) + val update = batchedUpdates.receive() + sendBatchedUpdate(update) } catch (e: CancellationException) {} catch (e: java.lang.Exception) { Log.e(LogTag, "Unexpected Error in channel ", e) } @@ -77,60 +85,51 @@ class TreeObserverManager(val context: Context) { } } - private fun sendMetadata() { - val metadata = MetadataRegister.extractPendingMetadata() - if (metadata.size > 0) { - context.connectionRef.connection?.send( - MetadataUpdateEvent.name, - Json.encodeToString(MetadataUpdateEvent.serializer(), MetadataUpdateEvent(metadata))) - } + fun stop() { + rootObserver.cleanUpRecursive() + job?.cancel() + batchedUpdates.cancel() } - private fun sendSubtreeUpdate(treeUpdate: SubtreeUpdate) { - val onWorkerThread = System.currentTimeMillis() - val txId = txId.getAndIncrement().toLong() + private fun sendBatchedUpdate(batchedUpdate: BatchedUpdate) { - val serialized: String? - val nodes = treeUpdate.deferredNodes.map { it.value() } + val onWorkerThread = System.currentTimeMillis() + + val nodes = batchedUpdate.updates.flatMap { it.deferredNodes.map { it.value() } } + val snapshotUpdate = batchedUpdate.updates.find { it.snapshot != null } val deferredComptationComplete = System.currentTimeMillis() - // send metadata needs to occur after the deferred metadata extraction since inside the deferred - // computation we may create some fresh metadata - sendMetadata() - - if (treeUpdate.snapshot == null) { - serialized = - Json.encodeToString( - SubtreeUpdateEvent.serializer(), - SubtreeUpdateEvent(txId, treeUpdate.observerType, treeUpdate.rootId, nodes)) - } else { + var snapshot: String? = null + if (snapshotUpdate?.snapshot != null) { val stream = ByteArrayOutputStream() val base64Stream = Base64OutputStream(stream, Base64.DEFAULT) - treeUpdate.snapshot.bitmap?.compress(Bitmap.CompressFormat.PNG, 100, base64Stream) - val snapshot = stream.toString() - serialized = - Json.encodeToString( - SubtreeUpdateEvent.serializer(), - SubtreeUpdateEvent(txId, treeUpdate.observerType, treeUpdate.rootId, nodes, snapshot)) - - treeUpdate.snapshot.readyForReuse() + snapshotUpdate.snapshot.bitmap?.compress(Bitmap.CompressFormat.PNG, 100, base64Stream) + snapshot = stream.toString() + snapshotUpdate.snapshot.readyForReuse() } + sendMetadata() + + val serialized = + Json.encodeToString( + SubtreeUpdateEvent.serializer(), + SubtreeUpdateEvent( + batchedUpdate.frameTimeMs, "batched", snapshotUpdate?.rootId ?: 1, nodes, snapshot)) + val serializationEnd = System.currentTimeMillis() context.connectionRef.connection?.send(SubtreeUpdateEvent.name, serialized) + val socketEnd = System.currentTimeMillis() - Log.i( - LogTag, - "Sent event for ${treeUpdate.observerType} root ID ${treeUpdate.rootId} nodes ${nodes.size}") + Log.i(LogTag, "Sent event for batched subtree update with nodes with ${nodes.size}") val perfStats = PerfStatsEvent( - txId = txId, - observerType = treeUpdate.observerType, - start = treeUpdate.startTime, - traversalComplete = treeUpdate.traversalCompleteTime, - snapshotComplete = treeUpdate.snapshotComplete, + txId = batchedUpdate.frameTimeMs, + observerType = "batched", + start = batchedUpdate.updates.minOf { it.startTime }, + traversalComplete = batchedUpdate.updates.maxOf { it.traversalCompleteTime }, + snapshotComplete = batchedUpdate.updates.maxOf { it.snapshotComplete }, queuingComplete = onWorkerThread, deferredComputationComplete = deferredComptationComplete, serializationComplete = serializationEnd, @@ -141,9 +140,31 @@ class TreeObserverManager(val context: Context) { PerfStatsEvent.name, Json.encodeToString(PerfStatsEvent.serializer(), perfStats)) } - fun stop() { - rootObserver.cleanUpRecursive() - job?.cancel() - updates.cancel() + private fun sendMetadata() { + val metadata = MetadataRegister.extractPendingMetadata() + if (metadata.isNotEmpty()) { + context.connectionRef.connection?.send( + MetadataUpdateEvent.name, + Json.encodeToString(MetadataUpdateEvent.serializer(), MetadataUpdateEvent(metadata))) + } + } +} + +/** Buffers up subtree updates untill the frame is complete, should only be called on main thread */ +private class SubtreeUpdateBuffer(private val onBatchReady: (BatchedUpdate) -> Unit) { + + private val bufferedSubtreeUpdates = mutableListOf() + + fun bufferUpdate(update: SubtreeUpdate) { + if (bufferedSubtreeUpdates.isEmpty()) { + + Choreographer.getInstance().postFrameCallback { frameTime -> + val updatesCopy = bufferedSubtreeUpdates.toList() + bufferedSubtreeUpdates.clear() + + onBatchReady(BatchedUpdate(updatesCopy, frameTime / 1000000)) + } + } + bufferedSubtreeUpdates.add(update) } } From 73afa391f8499c022c432407048b852d195c3238 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 25 Jan 2023 04:47:11 -0800 Subject: [PATCH 0463/1651] Introduce shared throttle Summary: Even with batching, updates can get split in half due to fact that each litho view has its own independant throttle. Eventually they will drift and and a traversal will get scheduled past the current frame for some of the views. It results in artifacts in the visualiser and will make time travelling wonky The Reviewed By: lblasa Differential Revision: D42606932 fbshipit-source-id: c4cdf729302a380928b4d8720a59d5f7f6ff645a --- .../plugins/uidebugger/core/Context.kt | 3 +- .../observers/ApplicationTreeObserver.kt | 9 ++- .../observers/DecorViewTreeObserver.kt | 47 ++++++------ .../uidebugger/observers/TreeObserver.kt | 2 +- .../observers/TreeObserverManager.kt | 3 + .../uidebugger/scheduler/CoroutineThrottle.kt | 46 ------------ .../uidebugger/scheduler/SharedThrottle.kt | 74 +++++++++++++++++++ 7 files changed, 111 insertions(+), 73 deletions(-) delete mode 100644 android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/CoroutineThrottle.kt create mode 100644 android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/SharedThrottle.kt diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/Context.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/Context.kt index e6d9b41f9..28a701bc8 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/Context.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/Context.kt @@ -12,6 +12,7 @@ import com.facebook.flipper.plugins.uidebugger.common.BitmapPool import com.facebook.flipper.plugins.uidebugger.descriptors.DescriptorRegister import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverManager +import com.facebook.flipper.plugins.uidebugger.scheduler.SharedThrottle import com.facebook.flipper.plugins.uidebugger.traversal.PartialLayoutTraversal data class Context( @@ -24,7 +25,7 @@ data class Context( PartialLayoutTraversal(descriptorRegister, observerFactory) val treeObserverManager = TreeObserverManager(this) - + val sharedThrottle: SharedThrottle = SharedThrottle() val bitmapPool = BitmapPool() } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/ApplicationTreeObserver.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/ApplicationTreeObserver.kt index dd298da8d..6c81b1f6b 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/ApplicationTreeObserver.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/ApplicationTreeObserver.kt @@ -13,6 +13,7 @@ import com.facebook.flipper.plugins.uidebugger.LogTag import com.facebook.flipper.plugins.uidebugger.core.ApplicationRef import com.facebook.flipper.plugins.uidebugger.core.Context import com.facebook.flipper.plugins.uidebugger.core.RootViewResolver +import com.facebook.flipper.plugins.uidebugger.util.objectIdentity /** * Responsible for observing the activity stack and managing the subscription to the top most @@ -35,9 +36,14 @@ class ApplicationTreeObserver(val context: Context) : TreeObserver) { Log.i(LogTag, "Root views updated, num ${rootViews.size}") - processUpdate(context, applicationRef) + context.sharedThrottle.trigger() } } + + context.sharedThrottle.registerCallback(this.objectIdentity()) { + traverseAndSend(context, applicationRef) + } + context.applicationRef.rootsResolver.attachListener(rootViewListener) // On subscribe, trigger a traversal on whatever roots we have rootViewListener.onRootViewsChanged(applicationRef.rootsResolver.rootViews()) @@ -48,5 +54,6 @@ class ApplicationTreeObserver(val context: Context) : TreeObserver() { - private val throttleTimeMs = 500L - private var nodeRef: WeakReference? = null - private var listener: ViewTreeObserver.OnPreDrawListener? = null + private var preDrawListener: ViewTreeObserver.OnPreDrawListener? = null override val type = "DecorView" - private val waitScope = CoroutineScope(Dispatchers.IO) - private val mainScope = CoroutineScope(Dispatchers.Main) - override fun subscribe(node: Any) { node as View nodeRef = WeakReference(node) Log.i(LogTag, "Subscribing to decor view changes") - val throttledUpdate = - throttleLatest?>(throttleTimeMs, waitScope, mainScope) { weakView -> - weakView?.get()?.let { view -> - var snapshotBitmap: BitmapPool.ReusableBitmap? = null - if (view.width > 0 && view.height > 0) { - snapshotBitmap = context.bitmapPool.getBitmap(node.width, node.height) - } - processUpdate(context, view, snapshotBitmap) - } - } + context.sharedThrottle.registerCallback(this.objectIdentity()) { + nodeRef?.get()?.let { traverseAndSendWithSnapshot() } + } - listener = + preDrawListener = ViewTreeObserver.OnPreDrawListener { - throttledUpdate(nodeRef) + context.sharedThrottle.trigger() true } - node.viewTreeObserver.addOnPreDrawListener(listener) + node.viewTreeObserver.addOnPreDrawListener(preDrawListener) // It can be the case that the DecorView the current observer owns has already // drawn. In this case, manually trigger an update. - throttledUpdate(nodeRef) + traverseAndSendWithSnapshot() + } + + private fun traverseAndSendWithSnapshot() { + nodeRef?.get()?.let { view -> + var snapshotBitmap: BitmapPool.ReusableBitmap? = null + if (view.width > 0 && view.height > 0) { + snapshotBitmap = context.bitmapPool.getBitmap(view.width, view.height) + } + traverseAndSend(context, view, snapshotBitmap) + } } override fun unsubscribe() { Log.i(LogTag, "Unsubscribing from decor view changes") - listener.let { + preDrawListener.let { nodeRef?.get()?.viewTreeObserver?.removeOnPreDrawListener(it) - listener = null + preDrawListener = null } + context.sharedThrottle.deregisterCallback(this.objectIdentity()) + nodeRef?.clear() nodeRef = null } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt index f8aad5695..b1ab98226 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt @@ -39,7 +39,7 @@ abstract class TreeObserver { abstract fun unsubscribe() /** Traverses the layout hierarchy while managing any encountered child observers. */ - fun processUpdate( + fun traverseAndSend( context: Context, root: Any, snapshotBitmap: BitmapPool.ReusableBitmap? = null diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index c32edc374..bf8048755 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -93,6 +93,9 @@ class TreeObserverManager(val context: Context) { private fun sendBatchedUpdate(batchedUpdate: BatchedUpdate) { + Log.i( + LogTag, + "Got update from ${batchedUpdate.updates.size} observers at time ${batchedUpdate.frameTimeMs}") val onWorkerThread = System.currentTimeMillis() val nodes = batchedUpdate.updates.flatMap { it.deferredNodes.map { it.value() } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/CoroutineThrottle.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/CoroutineThrottle.kt deleted file mode 100644 index 1c97ca96f..000000000 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/CoroutineThrottle.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.flipper.plugins.uidebugger.scheduler - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch - -/** - * Throttle the execution of an executable for the specified interval. - * - * How does it work? - * - * The function `throttleLatest` returns a proxy for the given executable. This proxy captures the - * latest argument/param that was used on the last invocation. If the throttle job does not exist or - * has already completed, then create a new one. - * - * The job will wait on the waiting scope for the given amount of specified ms. Once it finishes - * waiting, then it will execute the given executable on the main scope with the latest captured - * param. - */ -fun throttleLatest( - intervalMs: Long, - waitScope: CoroutineScope, - mainScope: CoroutineScope, - executable: (T) -> Unit -): (T) -> Unit { - var throttleJob: Job? = null - var latestParam: T - return { param: T -> - latestParam = param - if (throttleJob == null || throttleJob?.isCompleted == true) { - throttleJob = - waitScope.launch { - delay(intervalMs) - mainScope.launch { executable(latestParam) } - } - } - } -} diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/SharedThrottle.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/SharedThrottle.kt new file mode 100644 index 000000000..795f3b0d9 --- /dev/null +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/scheduler/SharedThrottle.kt @@ -0,0 +1,74 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.flipper.plugins.uidebugger.scheduler + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch + +/** + * The class makes the following guarantees + * 1. All registered callbacks will be called on the same frame at the same time + * 2. The callbacks will never be called more often than the min interval + * 3. If it has been > min interval since the callbacks was last called we will call the callbacks + * immediately + * 4. If an event comes in within the min interval of the last firing we will schedule another + * firing at the next possible moment + * + * The reason we need this is because with an independent throttle per observer you end up with + * updates occurring across different frames, + * + * WARNING: Not thread safe, should only be called on main thread. Also It is important to + * deregister to avoid leaks + */ +class SharedThrottle( + private val executionScope: CoroutineScope = CoroutineScope(Dispatchers.Main) +) { + + private var job: Job? = null + private val callbacks = mutableMapOf Unit>() + private var latestInvocationId: Long = 0 + + fun registerCallback(id: Int, callback: () -> Unit) { + callbacks[id] = callback + } + + fun deregisterCallback(id: Int) { + callbacks.remove(id) + } + + fun trigger() { + latestInvocationId += 1 + + if (job == null || job?.isCompleted == true) { + job = + executionScope.launch { + var i = 0 + do { + val thisInvocationId = latestInvocationId + + callbacks.values.toList().forEach { callback -> callback() } + + val delayTime = exponentialBackOff(base = 250, exp = 1.5, max = 1000, i = i).toLong() + delay(delayTime) + i++ + + // if we haven't received an call since we executed break out and let a new job be + // created which, otherwise we loop which executes again at the next appropriate time + // since we have already waited + } while (thisInvocationId != latestInvocationId) + } + } + } + + private fun exponentialBackOff(base: Long, exp: Double, max: Long, i: Int): Double { + return Math.min(base * Math.pow(exp, i.toDouble()), max.toDouble()) + } +} From f996f90cf4feac614503c0809d1a6d711be2c1aa Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 25 Jan 2023 04:47:11 -0800 Subject: [PATCH 0464/1651] Fix Interactions with TreeObserver Manager moved to main thread Reviewed By: lblasa Differential Revision: D42608384 fbshipit-source-id: 20c074eeac1372405f44edc8eb8ab41cb7dd2be9 --- .../plugins/uidebugger/UIDebuggerFlipperPlugin.kt | 12 +++--------- .../uidebugger/observers/TreeObserverManager.kt | 5 +++++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt index d5a4c3909..b5a5a1d66 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt @@ -18,9 +18,6 @@ import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister import com.facebook.flipper.plugins.uidebugger.model.InitEvent import com.facebook.flipper.plugins.uidebugger.model.MetadataUpdateEvent import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.serialization.json.Json const val LogTag = "ui-debugger" @@ -31,7 +28,6 @@ class UIDebuggerFlipperPlugin( observerFactory: TreeObserverFactory? ) : FlipperPlugin { - val mainScope = CoroutineScope(Dispatchers.Main) private val context: Context = Context( ApplicationRef(application), @@ -65,7 +61,7 @@ class UIDebuggerFlipperPlugin( MetadataUpdateEvent.serializer(), MetadataUpdateEvent(MetadataRegister.extractPendingMetadata()))) - mainScope.launch { context.treeObserverManager.start() } + context.treeObserverManager.start() } @Throws(Exception::class) @@ -75,10 +71,8 @@ class UIDebuggerFlipperPlugin( MetadataRegister.reset() - mainScope.launch { - context.treeObserverManager.stop() - context.bitmapPool.recycleAll() - } + context.treeObserverManager.stop() + context.bitmapPool.recycleAll() } override fun runInBackground(): Boolean { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index bf8048755..2e3649ab4 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -9,6 +9,7 @@ package com.facebook.flipper.plugins.uidebugger.observers import android.annotation.SuppressLint import android.graphics.Bitmap +import android.os.Looper import android.util.Base64 import android.util.Base64OutputStream import android.util.Log @@ -51,6 +52,7 @@ class TreeObserverManager(val context: Context) { private var job: Job? = null private val workerScope = CoroutineScope(Dispatchers.IO) + private val mainScope = CoroutineScope(Dispatchers.Main) private val txId = AtomicInteger() fun enqueueUpdate(update: SubtreeUpdate) { @@ -68,6 +70,9 @@ class TreeObserverManager(val context: Context) { @SuppressLint("NewApi") fun start() { + if (Looper.myLooper() != Looper.getMainLooper()) { + mainScope.launch { start() } + } batchedUpdates = Channel(Channel.UNLIMITED) rootObserver.subscribe(context.applicationRef) From c5ce7a2328355a7cda67aac356e6f1213ae5d2f7 Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Wed, 25 Jan 2023 06:14:28 -0800 Subject: [PATCH 0465/1651] Edit android.mdx using inpage editor Summary: This diff has been automatically generated by the inpage editor. NOTE: If you want to update this diff, go via the preview link inside the static docs section below. Ensure you are editing the same page that was used to create this diff. Reviewed By: ivanmisuno Differential Revision: D42740196 fbshipit-source-id: ae7add46f7901e123d7a670bc39675ebf7a08a78 --- docs/getting-started/troubleshooting/android.mdx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/getting-started/troubleshooting/android.mdx b/docs/getting-started/troubleshooting/android.mdx index cc75c42b1..771f9c15d 100644 --- a/docs/getting-started/troubleshooting/android.mdx +++ b/docs/getting-started/troubleshooting/android.mdx @@ -11,6 +11,15 @@ Flipper is a 'work in progress' and issues may occur. This page contains known i +## Stuck in "Currently Connecting..." + +There are sadly many non-deterministic reasons why Flipper may not be able to connect. It can often help to restart all pieces related to the connection: + +- Kill the app on the emulator and restart it. +- Restart the emulator. +- Restart adb with `adb kill-server && adb start-server`. +- The nuclear option: Restart your computer (especially when USB connectivity is involved) + ## In-app diagnostics From 2cc273ce96044ac5cbf4de5fdf3eb176d2a15a5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Jan 2023 03:07:43 -0800 Subject: [PATCH 0466/1651] Bump protobuf-java from 3.21.9 to 3.21.12 (#4385) Summary: Bumps [protobuf-java](https://github.com/protocolbuffers/protobuf) from 3.21.9 to 3.21.12.
    Commits
    • f0dc78d Updating version.json and repo version numbers to: 21.12
    • 7b0ca69 Updated release branch to latest upb. (#11258)
    • 7c123c4 Merge pull request #11201 from protocolbuffers/21.x-202212080033
    • 44eafb2 Update version.json to: 21.12-dev
    • aea4a27 Updating changelog
    • ffe65a5 Merge pull request #11197 from protocolbuffers/21.x-202212071935
    • a474c5b Updating version.json and repo version numbers to: 21.11
    • c0bc0cf Merge pull request #11196 from ericsalo/21.x
    • 9d17e97 sync with current 21.x upb
    • d024e3b Merge pull request #11118 from protocolbuffers/deannagarcia-patch-12
    • Additional commits viewable in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.google.protobuf:protobuf-java&package-manager=gradle&previous-version=3.21.9&new-version=3.21.12)](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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4385 Reviewed By: ivanmisuno Differential Revision: D42706116 Pulled By: passy fbshipit-source-id: d74a7a1984d7c49d1d95ce71fbcdff86715c7aa2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 04926892b..5bafc2f04 100644 --- a/build.gradle +++ b/build.gradle @@ -104,7 +104,7 @@ ext.deps = [ okhttp3 : 'com.squareup.okhttp3:okhttp:4.9.3', leakcanary : 'com.squareup.leakcanary:leakcanary-android:1.6.3', leakcanary2 : 'com.squareup.leakcanary:leakcanary-android:2.8.1', - protobuf : 'com.google.protobuf:protobuf-java:3.21.9', + protobuf : 'com.google.protobuf:protobuf-java:3.21.12', testCore : 'androidx.test:core:1.4.0', testRules : 'androidx.test:rules:1.5.0', // Plugin dependencies From 2ba167f899064fc623af006a59a4331308284d93 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Fri, 27 Jan 2023 04:07:37 -0800 Subject: [PATCH 0467/1651] Back out "Clear handlers on disconnect" Summary: ^ Revert as to validate this is not causing regressions: T143523262 Reviewed By: passy Differential Revision: D42800560 fbshipit-source-id: 8db61454eabfdb259637bb97c2bb4754984ecf6f --- iOS/FlipperKit/FlipperPlatformWebSocket.h | 10 +++--- iOS/FlipperKit/FlipperPlatformWebSocket.mm | 38 +++++++++++----------- iOS/FlipperKit/FlipperWebSocket.mm | 18 +++++----- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/iOS/FlipperKit/FlipperPlatformWebSocket.h b/iOS/FlipperKit/FlipperPlatformWebSocket.h index 07eb7d251..0044b134f 100644 --- a/iOS/FlipperKit/FlipperPlatformWebSocket.h +++ b/iOS/FlipperKit/FlipperPlatformWebSocket.h @@ -23,15 +23,15 @@ NS_ASSUME_NONNULL_BEGIN /// A message handler used to dispatch messages received from the server. @property(nonatomic) facebook::flipper::SocketMessageHandler messageHandler; +/// A certificate provider used to obtain the client certificate used for +/// authentication. +@property(nonatomic) + facebook::flipper::SocketCertificateProvider certificateProvider; + /// Initializes an instance of FliperWebSocketTransport with an endpoint URL. /// @param url Endpoint URL used to establish the connection. - (instancetype)initWithURL:(NSURL* _Nonnull)url; -/// A certificate provider used to obtain the client certificate used for -/// authentication. -- (void)setCertificateProvider: - (facebook::flipper::SocketCertificateProvider)certificateProvider; - /// Connect to the endpoint. - (void)connect; diff --git a/iOS/FlipperKit/FlipperPlatformWebSocket.mm b/iOS/FlipperKit/FlipperPlatformWebSocket.mm index 8116579ea..a51c5ac27 100644 --- a/iOS/FlipperKit/FlipperPlatformWebSocket.mm +++ b/iOS/FlipperKit/FlipperPlatformWebSocket.mm @@ -144,10 +144,6 @@ static constexpr int connectionKeepaliveSeconds = 10; return; } - _socket = [[SRWebSocket alloc] initWithURL:self->_url - securityPolicy:self->_policy]; - _socket.delegate = self; - __weak auto weakSelf = self; [_dispatchQueue addOperationWithBlock:^{ __strong auto strongSelf = weakSelf; @@ -162,32 +158,33 @@ static constexpr int connectionKeepaliveSeconds = 10; return; } + strongSelf->_socket = [[SRWebSocket alloc] initWithURL:self->_url + securityPolicy:self->_policy]; + strongSelf->_socket.delegate = self; [strongSelf->_socket open]; }]; } - (void)disconnect { - _socket.delegate = nil; - - // Manually trigger a 'close' event as SocketRocket close method will - // not notify the delegate. SocketRocket only triggers the close event - // when the connection is closed from the server. Furthermore, - // we are clearing the delegate above. - _eventHandler(facebook::flipper::SocketEvent::CLOSE); - - _eventHandler = [](facebook::flipper::SocketEvent) {}; - _messageHandler = ^(const std::string&) { - }; - _policy.certificateProvider = [](char* _Nonnull, size_t) { return ""; }; - [_dispatchQueue cancelAllOperations]; - [_dispatchQueue waitUntilAllOperationsAreFinished]; if ([_keepAlive isValid]) { [_keepAlive invalidate]; } _keepAlive = nil; - _socket = nil; + + // Manually trigger a 'close' event as SocketRocket close method will + // not notify the delegate. SocketRocket only triggers the close event + // when the connection is closed from the server. + _eventHandler(facebook::flipper::SocketEvent::CLOSE); + + if (_socket) { + // Clear the socket delegate before close. Ensures that we won't get + // any messages after the disconnect takes place. + _socket.delegate = nil; + [_socket close]; + _socket = nil; + }; } - (void)send:(NSString*)message @@ -205,6 +202,7 @@ static constexpr int connectionKeepaliveSeconds = 10; - (void)setCertificateProvider: (facebook::flipper::SocketCertificateProvider)certificateProvider { + _certificateProvider = certificateProvider; _policy.certificateProvider = certificateProvider; } @@ -243,6 +241,7 @@ static constexpr int connectionKeepaliveSeconds = 10; } else { _eventHandler(facebook::flipper::SocketEvent::ERROR); } + _socket = nil; } - (void)_webSocketDidClose { @@ -252,6 +251,7 @@ static constexpr int connectionKeepaliveSeconds = 10; _keepAlive = nil; _eventHandler(facebook::flipper::SocketEvent::CLOSE); + _socket = nil; } - (void)_webSocketDidReceiveMessage:(id)message { diff --git a/iOS/FlipperKit/FlipperWebSocket.mm b/iOS/FlipperKit/FlipperWebSocket.mm index 24480c7b1..3389d7791 100644 --- a/iOS/FlipperKit/FlipperWebSocket.mm +++ b/iOS/FlipperKit/FlipperWebSocket.mm @@ -112,15 +112,15 @@ bool FlipperWebSocket::connect(FlipperConnectionManager* manager) { }; if (endpoint_.secure) { - [socket_ - setCertificateProvider:[this](char* _Nonnull password, size_t length) { - auto pkcs12 = connectionContextStore_->getCertificate(); - if (pkcs12.first.length() == 0) { - return std::string(""); - } - strncpy(password, pkcs12.second.c_str(), length); - return pkcs12.first; - }]; + socket_.certificateProvider = [this]( + char* _Nonnull password, size_t length) { + auto pkcs12 = connectionContextStore_->getCertificate(); + if (pkcs12.first.length() == 0) { + return std::string(""); + } + strncpy(password, pkcs12.second.c_str(), length); + return pkcs12.first; + }; } [socket_ connect]; From 9540ea579cdc632bec9780770777092ba76824f6 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Fri, 27 Jan 2023 04:39:43 -0800 Subject: [PATCH 0468/1651] Remove attributes from layout panel Summary: The additional panel was confusing. We can add a search filter box later if needed Reviewed By: lblasa Differential Revision: D42801264 fbshipit-source-id: 4b2ecb44c5bc4751564a5cac3716f5af4a951f58 --- .../descriptors/MetadataRegister.kt | 2 - .../uidebugger/descriptors/ViewDescriptor.kt | 38 +++++++++---------- .../descriptors/ViewGroupDescriptor.kt | 6 +-- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt index c8f772c51..7e6913427 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt @@ -20,8 +20,6 @@ object MetadataRegister { const val TYPE_IDENTITY = "identity" const val TYPE_ATTRIBUTE = "attribute" - const val TYPE_LAYOUT = "layout" - const val TYPE_DOCUMENTATION = "documentation" private val lock = "lock" diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt index d8573087f..89efa367a 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt @@ -138,38 +138,38 @@ object ViewDescriptor : ChainedDescriptor() { private var SectionId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) private val PositionAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "position") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "position") private val GlobalPositionAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "globalPosition") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "globalPosition") private val SizeAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "size") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "size") private val BoundsAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "bounds") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "bounds") private val PaddingAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "padding") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "padding") private val LocalVisibleRectAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "localVisibleRect") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "localVisibleRect") private val RotationAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "rotation") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "rotation") private val ScaleAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "scale") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "scale") private val PivotAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "pivot") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "pivot") private val ScrollAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "scroll") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "scroll") private val LayoutParamsAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutParams") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "layoutParams") private val LayoutDirectionAttributeId = MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, + MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "layoutDirection", false, LayoutDirectionMapping.getInspectableValues()) private val TranslationAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "translation") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "translation") private val ElevationAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "elevation") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "elevation") private val VisibilityAttributeId = MetadataRegister.register( MetadataRegister.TYPE_ATTRIBUTE, @@ -219,26 +219,26 @@ object ViewDescriptor : ChainedDescriptor() { private val WidthAttributeId = MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, + MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "width", false, LayoutParamsMapping.getInspectableValues()) private val HeightAttributeId = MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, + MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "height", false, LayoutParamsMapping.getInspectableValues()) private val MarginAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "margin") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "margin") private val WeightAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "weight") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "weight") private val GravityAttributeId = MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, + MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "gravity", false, diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt index 05a19ce49..3c5e1f8a9 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt @@ -50,15 +50,15 @@ object ViewGroupDescriptor : ChainedDescriptor() { private val LayoutModeAttributeId = MetadataRegister.register( - MetadataRegister.TYPE_LAYOUT, + MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "layoutMode", false, LayoutModeMapping.getInspectableValues()) private val ClipChildrenAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "clipChildren") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "clipChildren") private val ClipToPaddingAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "clipToPadding") + MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "clipToPadding") override fun onGetAttributes( node: ViewGroup, From 7d58037ad65286313e523a2793e8858233adfebf Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Mon, 30 Jan 2023 03:18:19 -0800 Subject: [PATCH 0469/1651] Improve errors around screen capture Summary: Tasks like T143443148 pop up frequently and are inactionable. This is usually due to device flakiness, storage being full, incompatibility or configuration problems. Start and stop were also copy-pasted to make matters worse. Reviewed By: ivanmisuno Differential Revision: D42800489 fbshipit-source-id: 11caaa4133e4fa1d773364a6ba4e5f5bb0d2f2ce --- desktop/flipper-ui-core/src/chrome/ScreenCaptureButtons.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/desktop/flipper-ui-core/src/chrome/ScreenCaptureButtons.tsx b/desktop/flipper-ui-core/src/chrome/ScreenCaptureButtons.tsx index e42dc6732..b32028fee 100644 --- a/desktop/flipper-ui-core/src/chrome/ScreenCaptureButtons.tsx +++ b/desktop/flipper-ui-core/src/chrome/ScreenCaptureButtons.tsx @@ -45,7 +45,7 @@ export default function ScreenCaptureButtons() { setIsRecording(true); const videoPath = path.join(getCaptureLocation(), getFileName('mp4')); return selectedDevice.startScreenCapture(videoPath).catch((e) => { - console.error('Failed to start recording', e); + console.warn('Failed to start recording', e); message.error('Failed to start recording' + e); setIsRecording(false); }); @@ -58,8 +58,8 @@ export default function ScreenCaptureButtons() { } }) .catch((e) => { - console.error('Failed to start recording', e); - message.error('Failed to start recording' + e); + console.warn('Failed to stop recording', e); + message.error('Failed to stop recording' + e); }) .finally(() => { setIsRecording(false); From c97e840f20ff3c8255cf1436f780ec4458594c24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 03:32:47 -0800 Subject: [PATCH 0470/1651] Bump rayon from 1.6.0 to 1.6.1 in /packer (#4368) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Bumps [rayon](https://github.com/rayon-rs/rayon) from 1.6.0 to 1.6.1.
    Changelog

    Sourced from rayon's changelog.

    Release rayon 1.6.1 (2022-12-09)

    • Simplified par_bridge to only pull one item at a time from the iterator, without batching. Threads that are waiting for iterator items will now block appropriately rather than spinning CPU. (Thanks @​njaard!)
    • Added protection against recursion in par_bridge, so iterators that also invoke rayon will not cause mutex recursion deadlocks.

    Release rayon-core 1.10.1 (2022-11-18)

    • Fixed a race condition with threads going to sleep while a broadcast starts.
    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rayon&package-manager=cargo&previous-version=1.6.0&new-version=1.6.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) ---
    Dependabot commands and options
    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)
    Pull Request resolved: https://github.com/facebook/flipper/pull/4368 Reviewed By: ivanmisuno Differential Revision: D42706124 Pulled By: passy fbshipit-source-id: 4222388e2c580e8c8f5ec4a88626b947749fff35 --- packer/Cargo.lock | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packer/Cargo.lock b/packer/Cargo.lock index 11c11c205..6682125c4 100644 --- a/packer/Cargo.lock +++ b/packer/Cargo.lock @@ -532,11 +532,10 @@ checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" [[package]] name = "rayon" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e060280438193c554f654141c9ea9417886713b7acd75974c85b18a69a88e0b" +checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" dependencies = [ - "crossbeam-deque", "either", "rayon-core", ] From bc0bdcb32fd3f4a0177a53c37e305fbda2d811cf Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Mon, 30 Jan 2023 06:33:15 -0800 Subject: [PATCH 0471/1651] Remove client id from error Summary: Ideally, this wouldn't fire at all as it's a timeout but removing the ID will at least allow de-duplication. Reviewed By: ivanmisuno Differential Revision: D42800581 fbshipit-source-id: 605f2e81c326a3203c72b253362cb0b27139a134 --- desktop/flipper-frontend-core/src/AbstractClient.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/desktop/flipper-frontend-core/src/AbstractClient.tsx b/desktop/flipper-frontend-core/src/AbstractClient.tsx index 85e8cb72e..ab4bf729a 100644 --- a/desktop/flipper-frontend-core/src/AbstractClient.tsx +++ b/desktop/flipper-frontend-core/src/AbstractClient.tsx @@ -129,8 +129,11 @@ export default abstract class AbstractClient extends EventEmitter { const {plugins} = await timeout( 30 * 1000, this.rawCall<{plugins: Plugins}>('getPlugins', false), - 'Fetch plugin timeout for ' + this.id, - ); + 'Fetch plugin timeout', + ).catch((e) => { + console.warn('Fetch plugin timeout for ' + this.id); + throw e; + }); this.plugins = new Set(plugins); console.info('AbstractClient.loadPlugins', this.query, plugins); return plugins; From 1d2bc3373da2e03788f8d25e1c433ff578f10b33 Mon Sep 17 00:00:00 2001 From: Anton Kastritskiy Date: Thu, 2 Feb 2023 02:45:10 -0800 Subject: [PATCH 0472/1651] automatic update for docusaurus-plugin-internaldocs-fb@1.7.0 Differential Revision: D42919621 fbshipit-source-id: 92167e6b54a0b617e5ab64a92e96a85d2fd8e267 --- website/package.json | 2 +- website/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/website/package.json b/website/package.json index a03644b60..f0ecdb723 100644 --- a/website/package.json +++ b/website/package.json @@ -19,7 +19,7 @@ "@emotion/styled": "^11.6.0", "@types/fs-extra": "^9.0.13", "antd": "^4.23.4", - "docusaurus-plugin-internaldocs-fb": "1.5.0", + "docusaurus-plugin-internaldocs-fb": "1.7.0", "file-cli": "^1.2.0", "flipper-plugin": "^0.131.1", "fs-extra": "^10.0.0", diff --git a/website/yarn.lock b/website/yarn.lock index 992943fc3..ea10a71eb 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -6040,10 +6040,10 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" -docusaurus-plugin-internaldocs-fb@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/docusaurus-plugin-internaldocs-fb/-/docusaurus-plugin-internaldocs-fb-1.5.0.tgz#8fbe00ed7a7a67480fb148ddcd28135d79ae7040" - integrity sha512-OfL048Mly6iGLgG3qegXW68V4+YwtfWHZlKug0RPpH9mcvCHwV8hfRFmJM1AUCz9l51TnIjIM4JyE7AJMek2CA== +docusaurus-plugin-internaldocs-fb@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-internaldocs-fb/-/docusaurus-plugin-internaldocs-fb-1.7.0.tgz#35f4beb135e8f9463a56e67d9b984ee0a0f26626" + integrity sha512-y3GHEDzUinEaFJBd+cYzQvMILi0S3Hd11hL2kGNFXxH5S1TKOSstiyBEVq+DkwCVUlTSEzauiSB/x0sKW0+cMQ== dependencies: "@mdx-js/mdx" "^2.1.1" "@mdx-js/react" "^1.6.22" From 44451a37490cf0bdd741e4daecebd9d76ec2e339 Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Thu, 2 Feb 2023 04:46:35 -0800 Subject: [PATCH 0473/1651] Flipper Release: v0.178.0 Summary: Releasing version 0.178.0 Reviewed By: lblasa Differential Revision: D42918309 fbshipit-source-id: c1b7c9fa6088e71109cb998a460d472664d2c191 --- desktop/package.json | 2 +- desktop/plugins/public/layout/docs/setup.mdx | 2 +- desktop/plugins/public/leak_canary/docs/setup.mdx | 2 +- desktop/plugins/public/network/docs/setup.mdx | 2 +- desktop/static/CHANGELOG.md | 5 +++++ docs/getting-started/android-native.mdx | 4 ++-- docs/getting-started/react-native-ios.mdx | 2 +- docs/getting-started/react-native.mdx | 4 ++-- gradle.properties | 2 +- js/js-flipper/package.json | 2 +- react-native/react-native-flipper/package.json | 2 +- 11 files changed, 17 insertions(+), 12 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index 72bcf4de1..4d780d231 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -169,7 +169,7 @@ "npm": "use yarn instead", "yarn": "^1.16" }, - "version": "0.177.0", + "version": "0.178.0", "workspaces": { "packages": [ "scripts", diff --git a/desktop/plugins/public/layout/docs/setup.mdx b/desktop/plugins/public/layout/docs/setup.mdx index 429a2b3d2..b3ef50dd7 100644 --- a/desktop/plugins/public/layout/docs/setup.mdx +++ b/desktop/plugins/public/layout/docs/setup.mdx @@ -27,7 +27,7 @@ You also need to compile in the `litho-annotations` package, as Flipper reflects ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.177.0' + debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.178.0' debugImplementation 'com.facebook.litho:litho-annotations:0.19.0' // ... } diff --git a/desktop/plugins/public/leak_canary/docs/setup.mdx b/desktop/plugins/public/leak_canary/docs/setup.mdx index 93d2c1fc7..3e48790ef 100644 --- a/desktop/plugins/public/leak_canary/docs/setup.mdx +++ b/desktop/plugins/public/leak_canary/docs/setup.mdx @@ -8,7 +8,7 @@ To setup the LeakCan ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.177.0' + debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.178.0' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1' } ``` diff --git a/desktop/plugins/public/network/docs/setup.mdx b/desktop/plugins/public/network/docs/setup.mdx index aa4a39995..3c6d0136c 100644 --- a/desktop/plugins/public/network/docs/setup.mdx +++ b/desktop/plugins/public/network/docs/setup.mdx @@ -12,7 +12,7 @@ The network plugin is shipped as a separate Maven artifact, as follows: ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.177.0' + debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.178.0' } ``` diff --git a/desktop/static/CHANGELOG.md b/desktop/static/CHANGELOG.md index a4118a547..074cab830 100644 --- a/desktop/static/CHANGELOG.md +++ b/desktop/static/CHANGELOG.md @@ -1,3 +1,8 @@ +# 0.178.0 (1/2/2023) + + * [D42543280](https://github.com/facebook/flipper/search?q=D42543280&type=Commits) - Update RN to 0.69.7 + + # 0.172.0 (26/10/2022) * [D40394563](https://github.com/facebook/flipper/search?q=D40394563&type=Commits) diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index 97cef5b57..5d5528e0d 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -24,10 +24,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.177.0' + debugImplementation 'com.facebook.flipper:flipper:0.178.0' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.177.0' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.178.0' } ``` diff --git a/docs/getting-started/react-native-ios.mdx b/docs/getting-started/react-native-ios.mdx index 422ae5d37..10d3a5b20 100644 --- a/docs/getting-started/react-native-ios.mdx +++ b/docs/getting-started/react-native-ios.mdx @@ -51,7 +51,7 @@ Add all of the code below to your `ios/Podfile`: platform :ios, '9.0' def flipper_pods() - flipperkit_version = '0.177.0' # should match the version of your Flipper client app + flipperkit_version = '0.178.0' # should match the version of your Flipper client app pod 'FlipperKit', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/FlipperKitLayoutPlugin', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/SKIOSNetworkPlugin', '~>' + flipperkit_version, :configuration => 'Debug' diff --git a/docs/getting-started/react-native.mdx b/docs/getting-started/react-native.mdx index 9dfacde07..175b5adb1 100644 --- a/docs/getting-started/react-native.mdx +++ b/docs/getting-started/react-native.mdx @@ -34,7 +34,7 @@ Latest version of Flipper requires react-native 0.69+! If you use react-native < Android: -1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.177.0`. +1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.178.0`. 2. Run `./gradlew clean` in the `android` directory. iOS: @@ -44,7 +44,7 @@ react-native version => 0.69.0 2. Run `pod install --repo-update` in the `ios` directory. react-native version < 0.69.0 -1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.177.0' })`. +1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.178.0' })`. 2. Run `pod install --repo-update` in the `ios` directory. ## Manual Setup diff --git a/gradle.properties b/gradle.properties index 16060e341..87298ed1b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.177.1-SNAPSHOT +VERSION_NAME=0.178.0 GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper diff --git a/js/js-flipper/package.json b/js/js-flipper/package.json index e2f6e51c8..6a6846612 100644 --- a/js/js-flipper/package.json +++ b/js/js-flipper/package.json @@ -1,7 +1,7 @@ { "name": "js-flipper", "title": "JS Flipper Bindings for Web-Socket based clients", - "version": "0.177.0", + "version": "0.178.0", "main": "lib/index.js", "browser": { "os": false diff --git a/react-native/react-native-flipper/package.json b/react-native/react-native-flipper/package.json index 17c534ebc..4910361cd 100644 --- a/react-native/react-native-flipper/package.json +++ b/react-native/react-native-flipper/package.json @@ -1,7 +1,7 @@ { "name": "react-native-flipper", "title": "React Native Flipper Bindings", - "version": "0.177.0", + "version": "0.178.0", "description": "Flipper bindings for React Native", "main": "index.js", "types": "index.d.ts", From 65f0a81fd117d1153a1823160827a853ccc5a7e3 Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Thu, 2 Feb 2023 04:46:35 -0800 Subject: [PATCH 0474/1651] Flipper Snapshot Bump: v0.178.1-SNAPSHOT Summary: Releasing snapshot version 0.178.1-SNAPSHOT Reviewed By: lblasa Differential Revision: D42918308 fbshipit-source-id: afdcf5caa2c453b61f3e6e229256171995b733d1 --- docs/getting-started/android-native.mdx | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index 5d5528e0d..3bb0095d6 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -124,10 +124,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.177.1-SNAPSHOT' + debugImplementation 'com.facebook.flipper:flipper:0.178.1-SNAPSHOT' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.177.1-SNAPSHOT' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.178.1-SNAPSHOT' } ``` diff --git a/gradle.properties b/gradle.properties index 87298ed1b..d0f3b011b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.178.0 +VERSION_NAME=0.178.1-SNAPSHOT GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper From e2867a74a7b7d2f0abaf745447691c8492b0a4d0 Mon Sep 17 00:00:00 2001 From: kongxiaojun Date: Thu, 2 Feb 2023 08:17:33 -0800 Subject: [PATCH 0475/1651] Fixed a bug where the screenshot of some Android phones was unavailable (#4366) Summary: The 'screenrecord' command is not in some Android phones e.g OPPO. So 'screenrecord' command can't be used as a basis for determining whether or not you can take a screenshot. Replace it with 'screencap' command to determine whether you can take a screenshot. ## Changelog Fixed a bug where the screenshot of some Android phones was unavailable Pull Request resolved: https://github.com/facebook/flipper/pull/4366 Test Plan: It passed the test on my Mac and OPPO phone Reno2. Reviewed By: ivanmisuno Differential Revision: D42918902 Pulled By: passy fbshipit-source-id: c1f02f075817d90e0d447f466a1168b6ec932e4e --- .../src/devices/android/AndroidDevice.tsx | 11 +++++++++++ .../src/devices/android/androidDeviceManager.tsx | 6 ++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/desktop/flipper-server-core/src/devices/android/AndroidDevice.tsx b/desktop/flipper-server-core/src/devices/android/AndroidDevice.tsx index 508367913..92c20214f 100644 --- a/desktop/flipper-server-core/src/devices/android/AndroidDevice.tsx +++ b/desktop/flipper-server-core/src/devices/android/AndroidDevice.tsx @@ -167,6 +167,17 @@ export default class AndroidDevice } } + async screenShotAvailable(): Promise { + try { + await this.executeShellOrDie( + `[ ! -f /system/bin/screencap ] && echo "File does not exist"`, + ); + return true; + } catch (_e) { + return false; + } + } + async executeShell(command: string): Promise { return await this.adb .shell(this.serial, command) diff --git a/desktop/flipper-server-core/src/devices/android/androidDeviceManager.tsx b/desktop/flipper-server-core/src/devices/android/androidDeviceManager.tsx index 14789f4d9..1eefbe2f7 100644 --- a/desktop/flipper-server-core/src/devices/android/androidDeviceManager.tsx +++ b/desktop/flipper-server-core/src/devices/android/androidDeviceManager.tsx @@ -100,12 +100,10 @@ export class AndroidDeviceManager { // The default way of capturing screenshots through adb does not seem to work // There is a way of getting a screenshot through KaiOS dev tools though if (androidLikeDevice instanceof AndroidDevice) { - const screenRecordAvailable = - await androidLikeDevice.screenRecordAvailable(); androidLikeDevice.info.features.screenCaptureAvailable = - screenRecordAvailable; + await androidLikeDevice.screenRecordAvailable(); androidLikeDevice.info.features.screenshotAvailable = - screenRecordAvailable; + await androidLikeDevice.screenShotAvailable(); } resolve(androidLikeDevice); From 918ae58c2ad16006b6c5dda7e35de884aabe8a1e Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Fri, 3 Feb 2023 03:16:24 -0800 Subject: [PATCH 0476/1651] Upgrade dispatch-workflow action (#4495) Summary: It's currently failing and a few according to [the docs](https://github.com/benc-uk/workflow-dispatch) the token we supply shouldn't be necessary. Pull Request resolved: https://github.com/facebook/flipper/pull/4495 Test Plan: Sadly only one way: testinprod Reviewed By: lblasa Differential Revision: D42989714 Pulled By: passy fbshipit-source-id: e758340a583e351ff4e384514b70fecdf8bb3129 --- .github/workflows/release.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dddf1c759..5a8b79c7c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -242,23 +242,20 @@ jobs: steps: - name: Publish Workflow Dispatch if: ${{ needs.release.outputs.tag != '' }} - uses: benc-uk/workflow-dispatch@v1.1 + uses: benc-uk/workflow-dispatch@v1.2.2 with: workflow: Publish Pods - token: ${{ secrets.PERSONAL_TOKEN }} ref: ${{ needs.release.outputs.tag }} - name: Publish NPM if: ${{ needs.release.outputs.tag != '' }} - uses: benc-uk/workflow-dispatch@v1.1 + uses: benc-uk/workflow-dispatch@v1.2.2 with: workflow: Publish NPM - token: ${{ secrets.PERSONAL_TOKEN }} ref: ${{ needs.release.outputs.tag }} - name: Publish Android if: ${{ needs.release.outputs.tag != '' }} - uses: benc-uk/workflow-dispatch@v1.1 + uses: benc-uk/workflow-dispatch@v1.2.2 with: workflow: Publish Android - token: ${{ secrets.PERSONAL_TOKEN }} ref: ${{ needs.release.outputs.tag }} inputs: '{"tag": "${{ needs.release.outputs.tag }}"}' From d5dc73ecce0f22e92f382ce775b30a3f2a8db6eb Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Fri, 3 Feb 2023 03:23:33 -0800 Subject: [PATCH 0477/1651] Bump deps Summary: Combining a bunch of upgrade tasks from my queue into one. Reviewed By: antonk52 Differential Revision: D42884917 fbshipit-source-id: fecfdc0506d6081545b05d3de6ae18cd449917af --- .../ReactNativeFlipperExample/package.json | 14 +- .../ReactNativeFlipperExample/yarn.lock | 1721 +++++++---------- 2 files changed, 749 insertions(+), 986 deletions(-) diff --git a/react-native/ReactNativeFlipperExample/package.json b/react-native/ReactNativeFlipperExample/package.json index 96701b354..2f5fe716c 100644 --- a/react-native/ReactNativeFlipperExample/package.json +++ b/react-native/ReactNativeFlipperExample/package.json @@ -13,18 +13,18 @@ "dependencies": { "react": "^18.0.0", "react-native": "^0.69.7", - "react-native-flipper": "^0.174.0", + "react-native-flipper": "^0.177.0", "react-native-windows": "^0.69.0" }, "devDependencies": { "@babel/core": "^7.20.5", - "@babel/runtime": "^7.20.6", - "babel-jest": "^29.1.2", - "jest": "^28.1.3", - "metro-react-native-babel-preset": "^0.73.1", + "@babel/runtime": "^7.20.13", + "babel-jest": "^29.4.1", + "jest": "^29.4.1", + "metro-config": "^0.74.1", + "metro-react-native-babel-preset": "^0.74.1", "react-test-renderer": "18.2.0", - "relative-deps": "^1.0.7", - "metro-config": "^0.66.2" + "relative-deps": "^1.0.7" }, "jest": { "preset": "react-native" diff --git a/react-native/ReactNativeFlipperExample/yarn.lock b/react-native/ReactNativeFlipperExample/yarn.lock index d125e2b09..4adc887ba 100644 --- a/react-native/ReactNativeFlipperExample/yarn.lock +++ b/react-native/ReactNativeFlipperExample/yarn.lock @@ -102,7 +102,7 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/core@^7.20.5": +"@babel/core@^7.20.0", "@babel/core@^7.20.5": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== @@ -132,6 +132,15 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.20.0": + version "7.20.14" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/generator@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" @@ -376,6 +385,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== +"@babel/helper-plugin-utils@^7.18.6": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + "@babel/helper-remap-async-to-generator@^7.14.5": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" @@ -534,6 +548,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== +"@babel/parser@^7.20.0", "@babel/parser@^7.20.13": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.13.tgz#ddf1eb5a813588d2fb1692b70c6fce75b945c088" + integrity sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw== + "@babel/parser@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" @@ -572,6 +591,14 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-proposal-numeric-separator@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread@^7.0.0": version "7.15.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" @@ -642,6 +669,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-syntax-flow@^7.18.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -663,6 +697,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -677,7 +718,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -845,13 +886,6 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" -"@babel/plugin-transform-object-assign@^7.0.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.14.5.tgz#62537d54b6d85de04f4df48bfdba2eebff17b760" - integrity sha512-lvhjk4UN9xJJYB1mI5KC0/o1D5EcJXdbhVe+4fSk08D6ZN+iuAIs7LJC+71h8av9Ew4+uRq9452v9R93SFmQlQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-transform-object-super@^7.0.0": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" @@ -906,13 +940,6 @@ "@babel/plugin-syntax-jsx" "^7.14.5" "@babel/types" "^7.14.9" -"@babel/plugin-transform-regenerator@^7.0.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" - integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== - dependencies: - regenerator-transform "^0.14.2" - "@babel/plugin-transform-runtime@^7.0.0": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.8.tgz#9d15b1e94e1c7f6344f65a8d573597d93c6cd886" @@ -989,17 +1016,6 @@ "@babel/helper-validator-option" "^7.16.7" "@babel/plugin-transform-typescript" "^7.17.12" -"@babel/register@^7.0.0": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.15.3.tgz#6b40a549e06ec06c885b2ec42c3dd711f55fe752" - integrity sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw== - dependencies: - clone-deep "^4.0.1" - find-cache-dir "^2.0.0" - make-dir "^2.1.0" - pirates "^4.0.0" - source-map-support "^0.5.16" - "@babel/register@^7.13.16": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.17.7.tgz#5eef3e0f4afc07e25e847720e7b987ae33f08d0b" @@ -1011,13 +1027,20 @@ pirates "^4.0.5" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.20.6", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0": version "7.20.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.20.13": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + dependencies: + regenerator-runtime "^0.13.11" + "@babel/template@^7.0.0", "@babel/template@^7.15.4", "@babel/template@^7.16.7", "@babel/template@^7.18.10", "@babel/template@^7.3.3": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" @@ -1052,6 +1075,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.20.0": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.13" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.7": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" @@ -1077,7 +1116,7 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@babel/types@^7.20.7": +"@babel/types@^7.20.0", "@babel/types@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== @@ -1091,14 +1130,6 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - "@hapi/hoek@^9.0.0": version "9.2.1" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" @@ -1127,50 +1158,49 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== +"@jest/console@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.4.1.tgz#cbc31d73f6329f693b3d34b365124de797704fff" + integrity sha512-m+XpwKSi3PPM9znm5NGS8bBReeAJJpSkL1OuFCqaMaJL2YX9YXLkkI+MBchMPwu+ZuM2rynL51sgfkQteQ1CKQ== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + jest-message-util "^29.4.1" + jest-util "^29.4.1" slash "^3.0.0" -"@jest/core@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" - integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== +"@jest/core@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.4.1.tgz#91371179b5959951e211dfaeea4277a01dcca14f" + integrity sha512-RXFTohpBqpaTebNdg5l3I5yadnKo9zLBajMT0I38D0tDhreVBYv3fA8kywthI00sWxPztWLD3yjiUkewwu/wKA== dependencies: - "@jest/console" "^28.1.3" - "@jest/reporters" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.4.1" + "@jest/reporters" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^28.1.3" - jest-config "^28.1.3" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-resolve-dependencies "^28.1.3" - jest-runner "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - jest-watcher "^28.1.3" + jest-changed-files "^29.4.0" + jest-config "^29.4.1" + jest-haste-map "^29.4.1" + jest-message-util "^29.4.1" + jest-regex-util "^29.2.0" + jest-resolve "^29.4.1" + jest-resolve-dependencies "^29.4.1" + jest-runner "^29.4.1" + jest-runtime "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" + jest-watcher "^29.4.1" micromatch "^4.0.4" - pretty-format "^28.1.3" - rimraf "^3.0.0" + pretty-format "^29.4.1" slash "^3.0.0" strip-ansi "^6.0.0" @@ -1181,63 +1211,64 @@ dependencies: "@jest/types" "^27.2.4" -"@jest/environment@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" - integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== +"@jest/environment@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.1.tgz#52d232a85cdc995b407a940c89c86568f5a88ffe" + integrity sha512-pJ14dHGSQke7Q3mkL/UZR9ZtTOxqskZaC91NzamEH4dlKRt42W+maRBXiw/LWkdJe+P0f/zDR37+SPMplMRlPg== dependencies: - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/fake-timers" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" - jest-mock "^28.1.3" + jest-mock "^29.4.1" -"@jest/expect-utils@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" - integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== +"@jest/expect-utils@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.1.tgz#105b9f3e2c48101f09cae2f0a4d79a1b3a419cbb" + integrity sha512-w6YJMn5DlzmxjO00i9wu2YSozUYRBhIoJ6nQwpMYcBMtiqMGJm1QBzOf6DDgRao8dbtpDoaqLg6iiQTvv0UHhQ== dependencies: - jest-get-type "^28.0.2" + jest-get-type "^29.2.0" -"@jest/expect@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" - integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== +"@jest/expect@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.4.1.tgz#3338fa20f547bb6e550c4be37d6f82711cc13c38" + integrity sha512-ZxKJP5DTUNF2XkpJeZIzvnzF1KkfrhEF6Rz0HGG69fHl6Bgx5/GoU3XyaeFYEjuuKSOOsbqD/k72wFvFxc3iTw== dependencies: - expect "^28.1.3" - jest-snapshot "^28.1.3" + expect "^29.4.1" + jest-snapshot "^29.4.1" -"@jest/fake-timers@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" - integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== +"@jest/fake-timers@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.1.tgz#7b673131e8ea2a2045858f08241cace5d518b42b" + integrity sha512-/1joI6rfHFmmm39JxNfmNAO3Nwm6Y0VoL5fJDy7H1AtWrD1CgRtqJbN9Ld6rhAkGO76qqp4cwhhxJ9o9kYjQMw== dependencies: - "@jest/types" "^28.1.3" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.4.1" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-util "^28.1.3" + jest-message-util "^29.4.1" + jest-mock "^29.4.1" + jest-util "^29.4.1" -"@jest/globals@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" - integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== +"@jest/globals@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.4.1.tgz#3cd78c5567ab0249f09fbd81bf9f37a7328f4713" + integrity sha512-znoK2EuFytbHH0ZSf2mQK2K1xtIgmaw4Da21R2C/NE/+NnItm5mPEFQmn8gmF3f0rfOlmZ3Y3bIf7bFj7DHxAA== dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/environment" "^29.4.1" + "@jest/expect" "^29.4.1" + "@jest/types" "^29.4.1" + jest-mock "^29.4.1" -"@jest/reporters@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" - integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== +"@jest/reporters@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.4.1.tgz#50d509c08575c75e3cd2176d72ec3786419d5e04" + integrity sha512-AISY5xpt2Xpxj9R6y0RF1+O6GRy9JsGa8+vK23Lmzdy1AYcpQn5ItX79wJSsTmfzPKSAcsY1LNt/8Y5Xe5LOSg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" - "@jridgewell/trace-mapping" "^0.3.13" + "@jest/console" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" + "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" @@ -1249,99 +1280,70 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - jest-worker "^28.1.3" + jest-message-util "^29.4.1" + jest-util "^29.4.1" + jest-worker "^29.4.1" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" - terminal-link "^2.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== +"@jest/schemas@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.0.tgz#0d6ad358f295cc1deca0b643e6b4c86ebd539f17" + integrity sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.25.16" -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== +"@jest/source-map@^29.2.0": + version "29.2.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" + integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== dependencies: - "@sinclair/typebox" "^0.24.1" - -"@jest/source-map@^28.1.2": - version "28.1.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" - integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== - dependencies: - "@jridgewell/trace-mapping" "^0.3.13" + "@jridgewell/trace-mapping" "^0.3.15" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== +"@jest/test-result@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.4.1.tgz#997f19695e13b34779ceb3c288a416bd26c3238d" + integrity sha512-WRt29Lwt+hEgfN8QDrXqXGgCTidq1rLyFqmZ4lmJOpVArC8daXrZWkWjiaijQvgd3aOUj2fM8INclKHsQW9YyQ== dependencies: - "@jest/console" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.4.1" + "@jest/types" "^29.4.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" - integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== +"@jest/test-sequencer@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.4.1.tgz#f7a006ec7058b194a10cf833c88282ef86d578fd" + integrity sha512-v5qLBNSsM0eHzWLXsQ5fiB65xi49A3ILPSFQKPXzGL4Vyux0DPZAIN7NAFJa9b4BiTDP9MBF/Zqc/QA1vuiJ0w== dependencies: - "@jest/test-result" "^28.1.3" + "@jest/test-result" "^29.4.1" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" + jest-haste-map "^29.4.1" slash "^3.0.0" -"@jest/transform@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" - integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== +"@jest/transform@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.4.1.tgz#e4f517841bb795c7dcdee1ba896275e2c2d26d4a" + integrity sha512-5w6YJrVAtiAgr0phzKjYd83UPbCXsBRTeYI4BXokv9Er9CcrH9hfXL/crCvP2d2nGOcovPUnlYiLPFLZrkG5Hg== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^28.1.3" - "@jridgewell/trace-mapping" "^0.3.13" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.1" - -"@jest/transform@^29.1.2": - version "29.1.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.1.2.tgz#20f814696e04f090421f6d505c14bbfe0157062a" - integrity sha512-2uaUuVHTitmkx1tHF+eBjb4p7UuzBG7SXIaA/hNIkaMP6K+gXYGxP38ZcrofzqN0HeZ7A90oqsOa97WU7WZkSw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.1.2" + "@jest/types" "^29.4.1" "@jridgewell/trace-mapping" "^0.3.15" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" - convert-source-map "^1.4.0" + convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.1.2" - jest-regex-util "^29.0.0" - jest-util "^29.1.2" + jest-haste-map "^29.4.1" + jest-regex-util "^29.2.0" + jest-util "^29.4.1" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^4.0.1" + write-file-atomic "^5.0.0" "@jest/types@^26.6.2": version "26.6.2" @@ -1376,31 +1378,19 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== +"@jest/types@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.1.tgz#f9f83d0916f50696661da72766132729dcb82ecb" + integrity sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA== dependencies: - "@jest/schemas" "^28.1.3" + "@jest/schemas" "^29.4.0" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.1.2": - version "29.1.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.1.2.tgz#7442d32b16bcd7592d9614173078b8c334ec730a" - integrity sha512-DcXGtoTykQB5jiwCmVr8H4vdg2OJhQex3qPkG+ISyDO7xQXbt/4R6dowcRyPemRnkH7JoHvZuxPBdlq+9JxFCg== - dependencies: - "@jest/schemas" "^29.0.0" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.2": +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== @@ -1419,6 +1409,14 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.10" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.10.tgz#baf57b4e2a690d4f38560171f91783656b7f8186" @@ -1440,14 +1438,6 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.13": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping@^0.3.9": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" @@ -1808,24 +1798,24 @@ resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@sinclair/typebox@^0.24.1": - version "0.24.26" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.26.tgz#84f9e8c1d93154e734a7947609a1dc7c7a81cc22" - integrity sha512-1ZVIyyS1NXDRVT8GjWD5jULjhDyM3IsIHef2VGUMdnWOlX2tkPjyEX/7K0TGSH2S8EaPhp1ylFdjSjUGQ+gecg== +"@sinclair/typebox@^0.25.16": + version "0.25.21" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" + integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== dependencies: - "@sinonjs/commons" "^1.7.0" + "@sinonjs/commons" "^2.0.0" "@types/babel__core@^7.1.14": version "7.1.16" @@ -2077,6 +2067,11 @@ accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" +acorn@^8.5.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + anser@^1.4.9: version "1.4.10" resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" @@ -2127,14 +2122,6 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - anymatch@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -2249,13 +2236,6 @@ async-listener@^0.6.0: semver "^5.3.0" shimmer "^1.1.0" -async@^2.4.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - async@^3.2.2: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" @@ -2276,28 +2256,15 @@ babel-core@^7.0.0-bridge.0: resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== -babel-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" - integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== +babel-jest@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.4.1.tgz#01fa167e27470b35c2d4a1b841d9586b1764da19" + integrity sha512-xBZa/pLSsF/1sNpkgsiT3CmY7zV1kAsZ9OxxtrFqYucnOuRftXAfcJqcDVyOPeN4lttWTwhLdu0T9f8uvoPEUg== dependencies: - "@jest/transform" "^28.1.3" + "@jest/transform" "^29.4.1" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^28.1.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-jest@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.1.2.tgz#540d3241925c55240fb0c742e3ffc5f33a501978" - integrity sha512-IuG+F3HTHryJb7gacC7SQ59A9kO56BctUsT67uJHp1mMCHUOMXpDwOHWGifWqdWVknN2WNkCVQELPjXx0aLJ9Q== - dependencies: - "@jest/transform" "^29.1.2" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.0.2" + babel-preset-jest "^29.4.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -2320,20 +2287,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" - integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-jest-hoist@^29.0.2: - version "29.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.0.2.tgz#ae61483a829a021b146c016c6ad39b8bcc37c2c8" - integrity sha512-eBr2ynAEFjcebVvu8Ktx580BD1QKCrBG1XwEUTXJe285p9HA/4hOhfWCFRQhTKSyBV0VzjhG7H91Eifz9s29hg== +babel-plugin-jest-hoist@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.0.tgz#3fd3dfcedf645932df6d0c9fc3d9a704dd860248" + integrity sha512-a/sZRLQJEmsmejQ2rPEUe35nO1+C9dc9O1gplH1SXmJxveQSRUYdBk8yGZG/VOUuZs1u2aHZJusEGoRMbhhwCg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -2420,20 +2377,12 @@ babel-preset-fbjs@^3.4.0: "@babel/plugin-transform-template-literals" "^7.0.0" babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" -babel-preset-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" - integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== +babel-preset-jest@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.4.0.tgz#c2b03c548b02dea0a18ae21d5759c136f9251ee4" + integrity sha512-fUB9vZflUSM3dO/6M2TCAepTzvA4VkOvl67PjErcrQMGt9Eve7uazaeyCZ2th3UtI7ljpiBJES0F7A1vBRsLZA== dependencies: - babel-plugin-jest-hoist "^28.1.3" - babel-preset-current-node-syntax "^1.0.0" - -babel-preset-jest@^29.0.2: - version "29.0.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.0.2.tgz#e14a7124e22b161551818d89e5bdcfb3b2b0eac7" - integrity sha512-BeVXp7rH5TK96ofyEnHjznjLMQ2nAeDJ+QzxKnHAAMs0RgrQsCywjAN8m4mOm5Di0pxU//3AoEeJJrerMH5UeA== - dependencies: - babel-plugin-jest-hoist "^29.0.2" + babel-plugin-jest-hoist "^29.4.0" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -2617,13 +2566,6 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001407.tgz#92281a6ee67cb90bfd8a6a1201fcc2dc19b60a15" integrity sha512-4ydV+t4P7X3zH83fQWNDX/mQEzYomossfpViCOx9zHBSMV+rIe3LFqglHHtVyvNl1FhTNxPxs3jei82iqOW04w== -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2720,6 +2662,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -2802,7 +2753,7 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== -commander@^2.19.0: +commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2865,13 +2816,18 @@ continuation-local-storage@^3.2.1: async-listener "^0.6.0" emitter-listener "^1.1.1" -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -3037,10 +2993,10 @@ diagnostic-channel@1.1.0: dependencies: semver "^5.3.0" -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== +diff-sequences@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" + integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== dir-glob@^2.0.0, dir-glob@^2.2.2: version "2.2.2" @@ -3078,10 +3034,10 @@ emitter-listener@^1.0.1, emitter-listener@^1.1.1: dependencies: shimmer "^1.2.0" -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" @@ -3204,11 +3160,6 @@ event-target-shim@^5.0.0, event-target-shim@^5.0.1: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -3270,16 +3221,16 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" - integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== +expect@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.1.tgz#58cfeea9cbf479b64ed081fd1e074ac8beb5a1fe" + integrity sha512-OKrGESHOaMxK3b6zxIq9SOW8kEXztKff/Dvg88j4xIJxur1hspEbedVkR3GpHe5LO+WB2Qw7OWN0RMTdp6as5A== dependencies: - "@jest/expect-utils" "^28.1.3" - jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + "@jest/expect-utils" "^29.4.1" + jest-get-type "^29.2.0" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" extend-shallow@^2.0.1: version "2.0.1" @@ -3333,7 +3284,7 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -3489,7 +3440,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^2.1.2, fsevents@^2.3.2: +fsevents@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -3710,10 +3661,10 @@ hermes-estree@0.6.0: resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.6.0.tgz#e866fddae1b80aec65fe2ae450a5f2070ad54033" integrity sha512-2YTGzJCkhdmT6VuNprWjXnvTvw/3iPNw804oc7yknvQpNKo+vJGZmtvLLCghOZf0OwzKaNAzeIMp71zQbNl09w== -hermes-parser@0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.4.7.tgz#410f5129d57183784d205a0538e6fbdcf614c9ea" - integrity sha512-jc+zCtXbtwTiXoMAoXOHepxAaGVFIp89wwE9qcdwnMd/uGVEtPoY8FaFSsx0ThPvyKirdR2EsIIDVrpbSXz1Ag== +hermes-estree@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.8.0.tgz#530be27243ca49f008381c1f3e8b18fb26bf9ec0" + integrity sha512-W6JDAOLZ5pMPMjEiQGLCXSSV7pIBEgRR5zGkxgmzGSXHOxqV5dC/M1Zevqpbm9TZDE5tu358qZf8Vkzmsc+u7Q== hermes-parser@0.6.0: version "0.6.0" @@ -3722,6 +3673,13 @@ hermes-parser@0.6.0: dependencies: hermes-estree "0.6.0" +hermes-parser@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.8.0.tgz#116dceaba32e45b16d6aefb5c4c830eaeba2d257" + integrity sha512-yZKalg1fTYG5eOiToLUaw69rQfZq/fi+/NtEXRU7N87K/XobNRhRWorh80oSge2lWUiZfTgUvRJH+XgZWrhoqA== + dependencies: + hermes-estree "0.8.0" + hermes-profile-transformer@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" @@ -3865,13 +3823,6 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - is-core-module@^2.2.0: version "2.7.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" @@ -4087,155 +4038,134 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" - integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== +jest-changed-files@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.4.0.tgz#ac2498bcd394228f7eddcadcf928b3583bf2779d" + integrity sha512-rnI1oPxgFghoz32Y8eZsGJMjW54UlqT17ycQeCEktcxxwqqKdlj9afl8LNeO0Pbu+h2JQHThQP0BzS67eTRx4w== dependencies: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" - integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== +jest-circus@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.4.1.tgz#ff1b63eb04c3b111cefea9489e8dbadd23ce49bd" + integrity sha512-v02NuL5crMNY4CGPHBEflLzl4v91NFb85a+dH9a1pUNx6Xjggrd8l9pPy4LZ1VYNRXlb+f65+7O/MSIbLir6pA== dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/environment" "^29.4.1" + "@jest/expect" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" + jest-each "^29.4.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-runtime "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" p-limit "^3.1.0" - pretty-format "^28.1.3" + pretty-format "^29.4.1" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" - integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== +jest-cli@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.4.1.tgz#7abef96944f300feb9b76f68b1eb2d68774fe553" + integrity sha512-jz7GDIhtxQ37M+9dlbv5K+/FVcIo1O/b1sX3cJgzlQUf/3VG25nvuWzlDC4F1FLLzUThJeWLu8I7JF9eWpuURQ== dependencies: - "@jest/core" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/core" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-config "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" - integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== +jest-config@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.4.1.tgz#e62670c6c980ec21d75941806ec4d0c0c6402728" + integrity sha512-g7p3q4NuXiM4hrS4XFATTkd+2z0Ml2RhFmFPM8c3WyKwVDNszbl4E7cV7WIx1YZeqqCtqbtTtZhGZWJlJqngzg== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.3" - "@jest/types" "^28.1.3" - babel-jest "^28.1.3" + "@jest/test-sequencer" "^29.4.1" + "@jest/types" "^29.4.1" + babel-jest "^29.4.1" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^28.1.3" - jest-environment-node "^28.1.3" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-runner "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-circus "^29.4.1" + jest-environment-node "^29.4.1" + jest-get-type "^29.2.0" + jest-regex-util "^29.2.0" + jest-resolve "^29.4.1" + jest-runner "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^28.1.3" + pretty-format "^29.4.1" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" - integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== +jest-diff@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.1.tgz#9a6dc715037e1fa7a8a44554e7d272088c4029bd" + integrity sha512-uazdl2g331iY56CEyfbNA0Ut7Mn2ulAG5vUaEHXycf1L6IPyuImIxSz4F0VYBKi7LYIuxOwTZzK3wh5jHzASMw== dependencies: chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + diff-sequences "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.4.1" -jest-docblock@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" - integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== +jest-docblock@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.2.0.tgz#307203e20b637d97cee04809efc1d43afc641e82" + integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== dependencies: detect-newline "^3.0.0" -jest-each@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" - integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== +jest-each@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.4.1.tgz#05ce9979e7486dbd0f5d41895f49ccfdd0afce01" + integrity sha512-QlYFiX3llJMWUV0BtWht/esGEz9w+0i7BHwODKCze7YzZzizgExB9MOfiivF/vVT0GSQ8wXLhvHXh3x2fVD4QQ== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.4.1" chalk "^4.0.0" - jest-get-type "^28.0.2" - jest-util "^28.1.3" - pretty-format "^28.1.3" + jest-get-type "^29.2.0" + jest-util "^29.4.1" + pretty-format "^29.4.1" -jest-environment-node@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" - integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== +jest-environment-node@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.4.1.tgz#22550b7d0f8f0b16228639c9f88ca04bbf3c1974" + integrity sha512-x/H2kdVgxSkxWAIlIh9MfMuBa0hZySmfsC5lCsWmWr6tZySP44ediRKDUiNggX/eHLH7Cd5ZN10Rw+XF5tXsqg== dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/environment" "^29.4.1" + "@jest/fake-timers" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" + jest-mock "^29.4.1" + jest-util "^29.4.1" jest-get-type@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== - -jest-haste-map@^26.5.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== - dependencies: - "@jest/types" "^26.6.2" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.1.2" +jest-get-type@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" + integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== jest-haste-map@^27.3.1: version "27.5.1" @@ -4257,197 +4187,162 @@ jest-haste-map@^27.3.1: optionalDependencies: fsevents "^2.3.2" -jest-haste-map@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" - integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== +jest-haste-map@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.4.1.tgz#b0579dc82d94b40ed9041af56ad25c2f80bedaeb" + integrity sha512-imTjcgfVVTvg02khXL11NNLTx9ZaofbAWhilrMg/G8dIkp+HYCswhxf0xxJwBkfhWb3e8dwbjuWburvxmcr58w== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.4.1" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" - jest-worker "^28.1.3" + jest-regex-util "^29.2.0" + jest-util "^29.4.1" + jest-worker "^29.4.1" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-haste-map@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.1.2.tgz#93f3634aa921b6b654e7c94137b24e02e7ca6ac9" - integrity sha512-xSjbY8/BF11Jh3hGSPfYTa/qBFrm3TPM7WU8pU93m2gqzORVLkHFWvuZmFsTEBPRKndfewXhMOuzJNHyJIZGsw== +jest-leak-detector@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.4.1.tgz#632186c546e084da2b490b7496fee1a1c9929637" + integrity sha512-akpZv7TPyGMnH2RimOCgy+hPmWZf55EyFUvymQ4LMsQP8xSPlZumCPtXGoDhFNhUE2039RApZkTQDKU79p/FiQ== dependencies: - "@jest/types" "^29.1.2" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.0.0" - jest-util "^29.1.2" - jest-worker "^29.1.2" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" + jest-get-type "^29.2.0" + pretty-format "^29.4.1" -jest-leak-detector@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" - integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== - dependencies: - jest-get-type "^28.0.2" - pretty-format "^28.1.3" - -jest-matcher-utils@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" - integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== +jest-matcher-utils@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.1.tgz#73d834e305909c3b43285fbc76f78bf0ad7e1954" + integrity sha512-k5h0u8V4nAEy6lSACepxL/rw78FLDkBnXhZVgFneVpnJONhb2DhZj/Gv4eNe+1XqQ5IhgUcqj745UwH0HJmMnA== dependencies: chalk "^4.0.0" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + jest-diff "^29.4.1" + jest-get-type "^29.2.0" + pretty-format "^29.4.1" -jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== +jest-message-util@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.1.tgz#522623aa1df9a36ebfdffb06495c7d9d19e8a845" + integrity sha512-H4/I0cXUaLeCw6FM+i4AwCnOwHRgitdaUFOdm49022YD5nfyr8C/DrbXOBEyJaj+w/y0gGJ57klssOaUiLLQGQ== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.3" + "@jest/types" "^29.4.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^28.1.3" + pretty-format "^29.4.1" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" - integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== +jest-mock@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.1.tgz#a218a2abf45c99c501d4665207748a6b9e29afbd" + integrity sha512-MwA4hQ7zBOcgVCVnsM8TzaFLVUD/pFWTfbkY953Y81L5ret3GFRZtmPmRFAjKQSdCKoJvvqOu6Bvfpqlwwb0dQ== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.4.1" "@types/node" "*" + jest-util "^29.4.1" jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== - -jest-regex-util@^27.5.1: +jest-regex-util@^27.0.6, jest-regex-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== -jest-regex-util@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== +jest-regex-util@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" + integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== -jest-regex-util@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.0.0.tgz#b442987f688289df8eb6c16fa8df488b4cd007de" - integrity sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug== - -jest-resolve-dependencies@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" - integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== +jest-resolve-dependencies@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.1.tgz#02420a2e055da105e5fca8218c471d8b9553c904" + integrity sha512-Y3QG3M1ncAMxfjbYgtqNXC5B595zmB6e//p/qpA/58JkQXu/IpLDoLeOa8YoYfsSglBKQQzNUqtfGJJT/qLmJg== dependencies: - jest-regex-util "^28.0.2" - jest-snapshot "^28.1.3" + jest-regex-util "^29.2.0" + jest-snapshot "^29.4.1" -jest-resolve@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" - integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== +jest-resolve@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.4.1.tgz#4c6bf71a07b8f0b79c5fdf4f2a2cf47317694c5e" + integrity sha512-j/ZFNV2lm9IJ2wmlq1uYK0Y/1PiyDq9g4HEGsNTNr3viRbJdV+8Lf1SXIiLZXFvyiisu0qUyIXGBnw+OKWkJwQ== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" + jest-haste-map "^29.4.1" jest-pnp-resolver "^1.2.2" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-util "^29.4.1" + jest-validate "^29.4.1" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" - integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== +jest-runner@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.4.1.tgz#57460d9ebb0eea2e27eeddca1816cf8537469661" + integrity sha512-8d6XXXi7GtHmsHrnaqBKWxjKb166Eyj/ksSaUYdcBK09VbjPwIgWov1VwSmtupCIz8q1Xv4Qkzt/BTo3ZqiCeg== dependencies: - "@jest/console" "^28.1.3" - "@jest/environment" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.4.1" + "@jest/environment" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" - emittery "^0.10.2" + emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^28.1.1" - jest-environment-node "^28.1.3" - jest-haste-map "^28.1.3" - jest-leak-detector "^28.1.3" - jest-message-util "^28.1.3" - jest-resolve "^28.1.3" - jest-runtime "^28.1.3" - jest-util "^28.1.3" - jest-watcher "^28.1.3" - jest-worker "^28.1.3" + jest-docblock "^29.2.0" + jest-environment-node "^29.4.1" + jest-haste-map "^29.4.1" + jest-leak-detector "^29.4.1" + jest-message-util "^29.4.1" + jest-resolve "^29.4.1" + jest-runtime "^29.4.1" + jest-util "^29.4.1" + jest-watcher "^29.4.1" + jest-worker "^29.4.1" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" - integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== +jest-runtime@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.4.1.tgz#9a50f9c69d3a391690897c01b0bfa8dc5dd45808" + integrity sha512-UXTMU9uKu2GjYwTtoAw5rn4STxWw/nadOfW7v1sx6LaJYa3V/iymdCLQM6xy3+7C6mY8GfX22vKpgxY171UIoA== dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/globals" "^28.1.3" - "@jest/source-map" "^28.1.2" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/environment" "^29.4.1" + "@jest/fake-timers" "^29.4.1" + "@jest/globals" "^29.4.1" + "@jest/source-map" "^29.2.0" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" + "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - execa "^5.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" + jest-haste-map "^29.4.1" + jest-message-util "^29.4.1" + jest-mock "^29.4.1" + jest-regex-util "^29.2.0" + jest-resolve "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" + semver "^7.3.5" slash "^3.0.0" strip-bom "^4.0.0" -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-serializer@^27.5.1: +jest-serializer@^27.0.6, jest-serializer@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== @@ -4455,48 +4350,37 @@ jest-serializer@^27.5.1: "@types/node" "*" graceful-fs "^4.2.9" -jest-snapshot@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" - integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== +jest-snapshot@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.4.1.tgz#5692210b3690c94f19317913d4082b123bd83dd9" + integrity sha512-l4iV8EjGgQWVz3ee/LR9sULDk2pCkqb71bjvlqn+qp90lFwpnulHj4ZBT8nm1hA1C5wowXLc7MGnw321u0tsYA== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/expect-utils" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^28.1.3" + expect "^29.4.1" graceful-fs "^4.2.9" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - jest-haste-map "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + jest-diff "^29.4.1" + jest-get-type "^29.2.0" + jest-haste-map "^29.4.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" natural-compare "^1.4.0" - pretty-format "^28.1.3" + pretty-format "^29.4.1" semver "^7.3.5" -jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" - -jest-util@^27.5.1: +jest-util@^27.2.0, jest-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== @@ -4508,24 +4392,12 @@ jest-util@^27.5.1: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== +jest-util@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.1.tgz#2eeed98ff4563b441b5a656ed1a786e3abc3e4c4" + integrity sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ== dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.1.2.tgz#ac5798e93cb6a6703084e194cfa0898d66126df1" - integrity sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ== - dependencies: - "@jest/types" "^29.1.2" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -4544,41 +4416,32 @@ jest-validate@^26.5.2: leven "^3.1.0" pretty-format "^26.6.2" -jest-validate@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" - integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== +jest-validate@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.4.1.tgz#0d5174510415083ec329d4f981bf6779211f17e9" + integrity sha512-qNZXcZQdIQx4SfUB/atWnI4/I2HUvhz8ajOSYUu40CSmf9U5emil8EDHgE7M+3j9/pavtk3knlZBDsgFvv/SWw== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.4.1" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^28.0.2" + jest-get-type "^29.2.0" leven "^3.1.0" - pretty-format "^28.1.3" + pretty-format "^29.4.1" -jest-watcher@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== +jest-watcher@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.4.1.tgz#6e3e2486918bd778849d4d6e67fd77b814f3e6ed" + integrity sha512-vFOzflGFs27nU6h8dpnVRER3O2rFtL+VMEwnG0H3KLHcllLsU8y9DchSh0AL/Rg5nN1/wSiQ+P4ByMGpuybaVw== dependencies: - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" + emittery "^0.13.1" + jest-util "^29.4.1" string-length "^4.0.1" -jest-worker@^26.0.0, jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - jest-worker@^27.2.0, jest-worker@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -4588,34 +4451,25 @@ jest-worker@^27.2.0, jest-worker@^27.5.1: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== +jest-worker@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.1.tgz#7cb4a99a38975679600305650f86f4807460aab1" + integrity sha512-O9doU/S1EBe+yp/mstQ0VpPwpv0Clgn68TkNwGxL6/usX/KUW9Arnn4ag8C3jc6qHcXznhsT5Na1liYzAsuAbQ== dependencies: "@types/node" "*" + jest-util "^29.4.1" merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.1.2.tgz#a68302af61bce82b42a9a57285ca7499d29b2afc" - integrity sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA== +jest@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.1.tgz#bb34baca8e05901b49c02c62f1183a6182ea1785" + integrity sha512-cknimw7gAXPDOmj0QqztlxVtBVCw2lYY9CeIE5N6kD+kET1H4H79HSNISJmijb1HF+qk+G+ploJgiDi5k/fRlg== dependencies: - "@types/node" "*" - jest-util "^29.1.2" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" - integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== - dependencies: - "@jest/core" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/core" "^29.4.1" + "@jest/types" "^29.4.1" import-local "^3.0.2" - jest-cli "^28.1.3" + jest-cli "^29.4.1" jetifier@^1.6.2: version "1.6.8" @@ -4815,7 +4669,7 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: +lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4946,30 +4800,6 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -metro-babel-register@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.66.2.tgz#c6bbe36c7a77590687ccd74b425dc020d17d05af" - integrity sha512-3F+vsVubUPJYKfVMeol8/7pd8CC287Rw92QYzJD8LEmI980xcgwMUEVBZ0UIAUwlLgiJG/f4Mwhuji2EeBXrPg== - dependencies: - "@babel/core" "^7.14.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/register" "^7.0.0" - escape-string-regexp "^1.0.5" - -metro-babel-transformer@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.66.2.tgz#fce0a3e314d28a5e7141c135665e1cc9b8e7ce86" - integrity sha512-aJ/7fc/Xkofw8Fqa51OTDhBzBz26mmpIWrXAZcPdQ8MSTt883EWncxeCEjasc79NJ89BRi7sOkkaWZo2sXlKvw== - dependencies: - "@babel/core" "^7.14.0" - hermes-parser "0.4.7" - metro-source-map "0.66.2" - nullthrows "^1.1.1" - metro-babel-transformer@0.70.3: version "0.70.3" resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.70.3.tgz#dca61852be273824a4b641bd1ecafff07ff3ad1f" @@ -4980,24 +4810,25 @@ metro-babel-transformer@0.70.3: metro-source-map "0.70.3" nullthrows "^1.1.1" -metro-cache-key@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.66.2.tgz#d6463d2a53e887a38419d523962cc24ea0e780b4" - integrity sha512-WtkNmRt41qOpHh1MkNA4nLiQ/m7iGL90ysSKD+fcLqlUnOBKJptPQm0ZUv8Kfqk18ddWX2KmsSbq+Sf3I6XohQ== +metro-babel-transformer@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.74.1.tgz#3ea8f84807de7210347a271566da062977232501" + integrity sha512-uARzCffw7g7tobAlYqFP4DRf/N4pXf50/8ZbuKj/M4FbhwDGgKk2oqEVtkslXPayRd5pKBj8yzzlnYKUYpdhQA== + dependencies: + "@babel/core" "^7.20.0" + hermes-parser "0.8.0" + metro-source-map "0.74.1" + nullthrows "^1.1.1" metro-cache-key@0.70.3: version "0.70.3" resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.70.3.tgz#898803db04178a8f440598afba7d82a9cf35abf7" integrity sha512-0zpw+IcpM3hmGd5sKMdxNv3sbOIUYnMUvx1/yaM6vNRReSPmOLX0bP8fYf3CGgk8NEreZ1OHbVsuw7bdKt40Mw== -metro-cache@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.66.2.tgz#e0af4e0a319898f7d42a980f7ee5da153fcfd019" - integrity sha512-5QCYJtJOHoBSbL3H4/Fpl36oA697C3oYHqsce+Hk/dh2qtODUGpS3gOBhvP1B8iB+H8jJMyR75lZq129LJEsIQ== - dependencies: - metro-core "0.66.2" - mkdirp "^0.5.1" - rimraf "^2.5.4" +metro-cache-key@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.74.1.tgz#0879522e02a1a92b7433b41039b582abef79d5f0" + integrity sha512-+Q98e7du4+UtnqKe3b2Yr7ag2R0j9rsw9QdHbbpewsLTLy/VrEQ3ggRbqtBD8jAo4+qDBjmeLSqjQHcN99VJJw== metro-cache@0.70.3: version "0.70.3" @@ -5007,17 +4838,13 @@ metro-cache@0.70.3: metro-core "0.70.3" rimraf "^2.5.4" -metro-config@0.66.2, metro-config@^0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.66.2.tgz#e365acdb66ad0cda0182b9c9910760a97ee4293b" - integrity sha512-0C+PrKKIBNNzLZUKN/8ZDJS2U5FLMOTXDWbvBHIdqb6YXz8WplXR2+xlSlaSCCi5b+GR7cWFWUNeKA4GQS1/AQ== +metro-cache@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.74.1.tgz#86e536dd3c0b2659a34b072d10754a72eb9c81ce" + integrity sha512-H9HsFs69/Dt4efYPFjYB42/bDQdNZTd4HbA3x9Pdyg7eByHm3VSOT68C/VBHWIb6olRqg4IX/QCpS7i7xR8Yng== dependencies: - cosmiconfig "^5.0.5" - jest-validate "^26.5.2" - metro "0.66.2" - metro-cache "0.66.2" - metro-core "0.66.2" - metro-runtime "0.66.2" + metro-core "0.74.1" + rimraf "^3.0.2" metro-config@0.70.3, metro-config@^0.70.1: version "0.70.3" @@ -5031,14 +4858,17 @@ metro-config@0.70.3, metro-config@^0.70.1: metro-core "0.70.3" metro-runtime "0.70.3" -metro-core@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.66.2.tgz#ead776a17b3e5a307e6dc22259db30bf5c7e8490" - integrity sha512-JieLZkef/516yxXYvQxWnf3OWw5rcgWRy76K8JV/wr/i8LGVGulPAXlIi445/QZzXVydzRVASKAEVqyxM5F4mA== +metro-config@0.74.1, metro-config@^0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.74.1.tgz#1bf7abc2b32f29f0a7a7b3b0e1f7f28e9de2796a" + integrity sha512-UXVBM0rDSeyDJBKM2wblcYS+bPTx6bcRsFXcdWnHm2DBPlfnqx+qqOyFOw7O/R9FDFqN204i23GMkR7vCpQgiw== dependencies: - jest-haste-map "^26.5.2" - lodash.throttle "^4.1.1" - metro-resolver "0.66.2" + cosmiconfig "^5.0.5" + jest-validate "^26.5.2" + metro "0.74.1" + metro-cache "0.74.1" + metro-core "0.74.1" + metro-runtime "0.74.1" metro-core@0.70.3, metro-core@^0.70.1: version "0.70.3" @@ -5049,25 +4879,44 @@ metro-core@0.70.3, metro-core@^0.70.1: lodash.throttle "^4.1.1" metro-resolver "0.70.3" -metro-hermes-compiler@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.66.2.tgz#30290748f83805faa601aa487632444915795823" - integrity sha512-nCVL1g9uR6vrw5+X1wjwZruRyMkndnzGRMqjqoljf+nGEqBTD607CR7elXw4fMWn/EM+1y0Vdq5altUu9LdgCA== +metro-core@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.74.1.tgz#2c7dcd79edf6effeb88f5d422bdcac8b736d604a" + integrity sha512-YTLXjYnUJ50idsZoK25L2JuMW84ohpgQWKSmX77A0vkFLFjpFDKsPxeC9uHaV+bTwcC0/rjpkRellJ/zsES1Bg== + dependencies: + lodash.throttle "^4.1.1" + metro-resolver "0.74.1" + +metro-file-map@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.74.1.tgz#f1e977cf786ec4660e3e7cdf8e11b4eb3c0345bc" + integrity sha512-cYJDs6c9O8housctRsK5sTwqchmR8HMfpbCbBZhvcbcvF5vZturNHwiGxwAAoR/N9tTdJmZ1EQstvewTzChUJg== + dependencies: + abort-controller "^3.0.0" + anymatch "^3.0.3" + debug "^2.2.0" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + invariant "^2.2.4" + jest-regex-util "^27.0.6" + jest-serializer "^27.0.6" + jest-util "^27.2.0" + jest-worker "^27.2.0" + micromatch "^4.0.4" + nullthrows "^1.1.1" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" metro-hermes-compiler@0.70.3: version "0.70.3" resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.70.3.tgz#ac7ed656fbcf0a59adcd010d3639e4cfdbc76b4f" integrity sha512-W6WttLi4E72JL/NyteQ84uxYOFMibe0PUr9aBKuJxxfCq6QRnJKOVcNY0NLW0He2tneXGk+8ZsNz8c0flEvYqg== -metro-inspector-proxy@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.66.2.tgz#a83c76bd2f2fd7b9240be92acf9a8b1d1404547a" - integrity sha512-gnLc9121eznwP0iiA9tCBW8qZjwIsCgwHWMF1g1Qaki9le9tzeJv3dK4/lFNGxyfSaLO7vahQEhsEYsiRnTROg== - dependencies: - connect "^3.6.5" - debug "^2.2.0" - ws "^1.1.5" - yargs "^15.3.1" +metro-hermes-compiler@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.74.1.tgz#f62241ca6de19627da717712b151fa67705f810d" + integrity sha512-ky44JsFvKYOwop/TvhzAZV+pYH7J7t8njbmUVbPQWi15CwsTRsr5/0jC26yyYqriOjAoivLc5R140SwyguDEfg== metro-inspector-proxy@0.70.3: version "0.70.3" @@ -5079,12 +4928,22 @@ metro-inspector-proxy@0.70.3: ws "^7.5.1" yargs "^15.3.1" -metro-minify-uglify@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.66.2.tgz#6061dbee4f61e6d5bb3c100e4379ff6f2e16e42b" - integrity sha512-7TUK+L5CmB5x1PVnFbgmjzHW4CUadq9H5jgp0HfFoWT1skXAyEsx0DHkKDXwnot0khnNhBOEfl62ctQOnE110Q== +metro-inspector-proxy@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.74.1.tgz#d58ce8c6211652694734f090243d40eb76799960" + integrity sha512-+QcFpr6SBvlbcviT9nCZ1KtGuviRKUa5EfrNE0LhpnQX/i0MIA+9F2dwK9zO0KTXqkfWkNzvRGrVt3YGfjyYpA== dependencies: - uglify-es "^3.1.9" + connect "^3.6.5" + debug "^2.2.0" + ws "^7.5.1" + yargs "^17.5.1" + +metro-minify-terser@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.74.1.tgz#862d4c005b7ee07105c9fa56001132bbf622049a" + integrity sha512-R8l2KbYm1ct9benFSXBjeBDJ48BIyyQo3ECG0TSDX5efLSAS9z0scOCTUC9mcAJ9CO1tjc9ZrjHMNWAOoHO6XA== + dependencies: + terser "^5.15.0" metro-minify-uglify@0.70.3: version "0.70.3" @@ -5093,51 +4952,12 @@ metro-minify-uglify@0.70.3: dependencies: uglify-es "^3.1.9" -metro-react-native-babel-preset@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.66.2.tgz#fddebcf413ad4ea617d4f47f7c1da401052de734" - integrity sha512-H/nLBAz0MgfDloSe1FjyH4EnbokHFdncyERvLPXDACY3ROVRCeUyFNo70ywRGXW2NMbrV4H7KUyU4zkfWhC2HQ== +metro-minify-uglify@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.74.1.tgz#feadc98dc0db588ec98a9bc2bd0aee5292a33b70" + integrity sha512-C70Z4ur+YZAHprEQDZsi29noGzYrFoiDu4dOJqdk+NQlhiwmimzL5HRpcTsDcNo7tNsqGQoqMX1cGW3TiOSbgQ== dependencies: - "@babel/core" "^7.14.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-exponentiation-operator" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-assign" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - react-refresh "^0.4.0" + uglify-es "^3.1.9" metro-react-native-babel-preset@0.70.3: version "0.70.3" @@ -5184,22 +5004,23 @@ metro-react-native-babel-preset@0.70.3: "@babel/template" "^7.0.0" react-refresh "^0.4.0" -metro-react-native-babel-preset@^0.73.1: - version "0.73.1" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.1.tgz#a7183a572032b664a08bfa50de048549d110a031" - integrity sha512-yKWtM25PFoMGOumqfgqVbCwhfTm65yfTQLnesdvG6cjDn3MhaFF0wWkha2rWaT2HhJPYeO3qLER16C/CBAitcw== +metro-react-native-babel-preset@0.74.1, metro-react-native-babel-preset@^0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.74.1.tgz#81c1c30f13f543c5848049e46e1afbc81df87de6" + integrity sha512-DjsG9nqm5C7cjB2SlgbcNJOn9y5MBUd3bRlCfnoj8CxAeGTGkS+yXd183lHR3C1bhmQNjuUE0abzzpE1CFh6JQ== dependencies: - "@babel/core" "^7.14.0" + "@babel/core" "^7.20.0" "@babel/plugin-proposal-async-generator-functions" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.0.0" "@babel/plugin-proposal-export-default-from" "^7.0.0" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-numeric-separator" "^7.0.0" "@babel/plugin-proposal-object-rest-spread" "^7.0.0" "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" "@babel/plugin-proposal-optional-chaining" "^7.0.0" "@babel/plugin-syntax-dynamic-import" "^7.0.0" "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/plugin-syntax-flow" "^7.18.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.0.0" "@babel/plugin-transform-arrow-functions" "^7.0.0" @@ -5222,7 +5043,6 @@ metro-react-native-babel-preset@^0.73.1: "@babel/plugin-transform-shorthand-properties" "^7.0.0" "@babel/plugin-transform-spread" "^7.0.0" "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" "@babel/plugin-transform-typescript" "^7.5.0" "@babel/plugin-transform-unicode-regex" "^7.0.0" "@babel/template" "^7.0.0" @@ -5241,13 +5061,6 @@ metro-react-native-babel-transformer@0.70.3, metro-react-native-babel-transforme metro-source-map "0.70.3" nullthrows "^1.1.1" -metro-resolver@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.66.2.tgz#f743ddbe7a12dd137d1f7a555732cafcaea421f8" - integrity sha512-pXQAJR/xauRf4kWFj2/hN5a77B4jLl0Fom5I3PHp6Arw/KxSBp0cnguXpGLwNQ6zQC0nxKCoYGL9gQpzMnN7Hw== - dependencies: - absolute-path "^0.0.0" - metro-resolver@0.70.3, metro-resolver@^0.70.1: version "0.70.3" resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.70.3.tgz#c64fdd6d0a88fa62f3f99f87e539b5f603bd47bf" @@ -5255,10 +5068,12 @@ metro-resolver@0.70.3, metro-resolver@^0.70.1: dependencies: absolute-path "^0.0.0" -metro-runtime@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.66.2.tgz#3409ee957b949b6c7b72ef6ed2b9af9a4f4a910e" - integrity sha512-vFhKBk2ot9FS4b+2v0OTa/guCF/QDAOJubY0CNg7PzCS5+w4y3IvZIcPX4SSS1t8pYEZBLvtdtTDarlDl81xmg== +metro-resolver@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.74.1.tgz#62c1313bf8ff02b86d6cdd9294306d718970caac" + integrity sha512-1Ju7bvUnmy1lmsYwhujWsP4qxBVfVF7CkKiUCRolUbyZzGgymyVGXVN5yEnbXXNHgBAOlr4+2KKYjoXzhXBo4g== + dependencies: + absolute-path "^0.0.0" metro-runtime@0.70.3, metro-runtime@^0.70.1: version "0.70.3" @@ -5267,19 +5082,13 @@ metro-runtime@0.70.3, metro-runtime@^0.70.1: dependencies: "@babel/runtime" "^7.0.0" -metro-source-map@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.66.2.tgz#b5304a282a5d55fa67b599265e9cf3217175cdd7" - integrity sha512-038tFmB7vSh73VQcDWIbr5O1m+WXWyYafDaOy+1A/2K308YP0oj33gbEgDnZsLZDwcJ+xt1x6KUEBIzlX4YGeQ== +metro-runtime@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.74.1.tgz#218a085b60a2d9292bacfcac40b2ee6275c7a4e2" + integrity sha512-6nUj5gcsT/xmL1rbYt6IbXEJycf/jcMC397MAanLqhVP4q35ZQ0OQhB9hKwulwuoNQr0hmo001znGaalnimgWQ== dependencies: - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.0.0" - invariant "^2.2.4" - metro-symbolicate "0.66.2" - nullthrows "^1.1.1" - ob1 "0.66.2" - source-map "^0.5.6" - vlq "^1.0.0" + "@babel/runtime" "^7.0.0" + react-refresh "^0.4.0" metro-source-map@0.70.3: version "0.70.3" @@ -5295,16 +5104,18 @@ metro-source-map@0.70.3: source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.66.2.tgz#addd095ce5f77e73ca21ddb5dfb396ff5d4fa041" - integrity sha512-u+DeQHyAFXVD7mVP+GST/894WHJ3i/U8oEJFnT7U3P52ZuLgX8n4tMNxhqZU12RcLR6etF8143aP0Ktx1gFLEQ== +metro-source-map@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.74.1.tgz#966977e048f182b4b6618f69efdfd28a16fd1aab" + integrity sha512-mvC3Em5Fxj3Vggw/MSwzVtwHApClq1f2dqyC9D4G+yhbM1WrG02C31KGDCUupFGAUTRiXswy27XfTSBlNGcPCw== dependencies: + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" invariant "^2.2.4" - metro-source-map "0.66.2" + metro-symbolicate "0.74.1" nullthrows "^1.1.1" + ob1 "0.74.1" source-map "^0.5.6" - through2 "^2.0.1" vlq "^1.0.0" metro-symbolicate@0.70.3: @@ -5319,16 +5130,17 @@ metro-symbolicate@0.70.3: through2 "^2.0.1" vlq "^1.0.0" -metro-transform-plugins@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.66.2.tgz#39dd044a23b1343e4f2d2ec34d08128cdf255ed4" - integrity sha512-KTvqplh0ut7oDKovvDG6yzXM02R6X+9b2oVG+qYq8Zd3aCGTi51ASx4ThCNkAHyEvCuJdYg9fxXTL+j+wvhB5w== +metro-symbolicate@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.74.1.tgz#437c34f5acabf6b575632ed628374d22af3cddfd" + integrity sha512-9Xtqx+Qi8xOVb5o1+Cjx237MUIk/EPL9J759ESdsI0YrhQe8GJaFKO9EwiyWjLSSdk9Tz89L1NV2ykDt7CSuVQ== dependencies: - "@babel/core" "^7.14.0" - "@babel/generator" "^7.14.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.14.0" + invariant "^2.2.4" + metro-source-map "0.74.1" nullthrows "^1.1.1" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" metro-transform-plugins@0.70.3: version "0.70.3" @@ -5341,23 +5153,15 @@ metro-transform-plugins@0.70.3: "@babel/traverse" "^7.14.0" nullthrows "^1.1.1" -metro-transform-worker@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.66.2.tgz#0a8455992132c479721accd52c9bd47deb77769e" - integrity sha512-dO4PtYOMGB7Vzte8aIzX39xytODhmbJrBYPu+zYzlDjyefJZT7BkZ0LkPIThtyJi96xWcGqi9JBSo0CeRupAHw== +metro-transform-plugins@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.74.1.tgz#1c650093f18d30e189daa2f9e19567083abda26e" + integrity sha512-eBBQDd0fyI6g/tReJ3PPd4JxUQugMs2MkjypZrCAq8qqhKEtcAEczb/GzZbVL/GMeXBSDj6cObxwaXiFeRyMKg== dependencies: - "@babel/core" "^7.14.0" - "@babel/generator" "^7.14.0" - "@babel/parser" "^7.14.0" - "@babel/types" "^7.0.0" - babel-preset-fbjs "^3.4.0" - metro "0.66.2" - metro-babel-transformer "0.66.2" - metro-cache "0.66.2" - metro-cache-key "0.66.2" - metro-hermes-compiler "0.66.2" - metro-source-map "0.66.2" - metro-transform-plugins "0.66.2" + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.20.0" nullthrows "^1.1.1" metro-transform-worker@0.70.3: @@ -5379,63 +5183,24 @@ metro-transform-worker@0.70.3: metro-transform-plugins "0.70.3" nullthrows "^1.1.1" -metro@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.66.2.tgz#f21759bf00995470e7577b5b88a5277963f24492" - integrity sha512-uNsISfcQ3iKKSHoN5Q+LAh0l3jeeg7ZcNZ/4BAHGsk02erA0OP+l2m+b5qYVoPptHz9Oc3KyG5oGJoTu41pWjg== +metro-transform-worker@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.74.1.tgz#c3dc05fb94cd3e1e45f6013cc6cf11a2a83a9e46" + integrity sha512-ZTZM/nilKtiHW2cH73VCOe1oNZPWcJfGxIGZ4KV6QMDEPMUfDApvklW9we58r2ES2pZLID08BCekFHCTt8SBPA== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.14.0" - "@babel/generator" "^7.14.0" - "@babel/parser" "^7.14.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.0.0" - absolute-path "^0.0.0" - accepts "^1.3.7" - async "^2.4.0" - chalk "^4.0.0" - ci-info "^2.0.0" - connect "^3.6.5" - debug "^2.2.0" - denodeify "^1.2.1" - error-stack-parser "^2.0.6" - fs-extra "^1.0.0" - graceful-fs "^4.1.3" - hermes-parser "0.4.7" - image-size "^0.6.0" - invariant "^2.2.4" - jest-haste-map "^26.5.2" - jest-worker "^26.0.0" - lodash.throttle "^4.1.1" - metro-babel-register "0.66.2" - metro-babel-transformer "0.66.2" - metro-cache "0.66.2" - metro-cache-key "0.66.2" - metro-config "0.66.2" - metro-core "0.66.2" - metro-hermes-compiler "0.66.2" - metro-inspector-proxy "0.66.2" - metro-minify-uglify "0.66.2" - metro-react-native-babel-preset "0.66.2" - metro-resolver "0.66.2" - metro-runtime "0.66.2" - metro-source-map "0.66.2" - metro-symbolicate "0.66.2" - metro-transform-plugins "0.66.2" - metro-transform-worker "0.66.2" - mime-types "^2.1.27" - mkdirp "^0.5.1" - node-fetch "^2.2.0" + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" + "@babel/types" "^7.20.0" + babel-preset-fbjs "^3.4.0" + metro "0.74.1" + metro-babel-transformer "0.74.1" + metro-cache "0.74.1" + metro-cache-key "0.74.1" + metro-hermes-compiler "0.74.1" + metro-source-map "0.74.1" + metro-transform-plugins "0.74.1" nullthrows "^1.1.1" - rimraf "^2.5.4" - serialize-error "^2.1.0" - source-map "^0.5.6" - strip-ansi "^6.0.0" - temp "0.8.3" - throat "^5.0.0" - ws "^1.1.5" - yargs "^15.3.1" metro@0.70.3, metro@^0.70.1: version "0.70.3" @@ -5493,7 +5258,63 @@ metro@0.70.3, metro@^0.70.1: ws "^7.5.1" yargs "^15.3.1" -micromatch@^3.1.10, micromatch@^3.1.4: +metro@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.74.1.tgz#0ea98b822dbdcb3272ceed0cbdcc3eaf18946c6b" + integrity sha512-uzJ2Kci3tVvDJ7P+kR+RA0RKAGHE6FKI2XD/FuRaN1rRqWbhA+tn659umhCw50cHkhZPURQw6b3VgaUust7p+g== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + absolute-path "^0.0.0" + accepts "^1.3.7" + async "^3.2.2" + chalk "^4.0.0" + ci-info "^2.0.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + error-stack-parser "^2.0.6" + graceful-fs "^4.2.4" + hermes-parser "0.8.0" + image-size "^0.6.0" + invariant "^2.2.4" + jest-worker "^27.2.0" + lodash.throttle "^4.1.1" + metro-babel-transformer "0.74.1" + metro-cache "0.74.1" + metro-cache-key "0.74.1" + metro-config "0.74.1" + metro-core "0.74.1" + metro-file-map "0.74.1" + metro-hermes-compiler "0.74.1" + metro-inspector-proxy "0.74.1" + metro-minify-terser "0.74.1" + metro-minify-uglify "0.74.1" + metro-react-native-babel-preset "0.74.1" + metro-resolver "0.74.1" + metro-runtime "0.74.1" + metro-source-map "0.74.1" + metro-symbolicate "0.74.1" + metro-transform-plugins "0.74.1" + metro-transform-worker "0.74.1" + mime-types "^2.1.27" + node-fetch "^2.2.0" + nullthrows "^1.1.1" + rimraf "^3.0.2" + serialize-error "^2.1.0" + source-map "^0.5.6" + strip-ansi "^6.0.0" + temp "0.8.3" + throat "^5.0.0" + ws "^7.5.1" + yargs "^17.5.1" + +micromatch@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -5512,7 +5333,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== @@ -5578,7 +5399,7 @@ minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -5706,11 +5527,6 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - node-releases@^1.1.77: version "1.1.77" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" @@ -5736,13 +5552,6 @@ normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -5767,16 +5576,16 @@ nullthrows@^1.1.1: resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== -ob1@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.66.2.tgz#8caf548202cf2688944bae47db405a08bca17a61" - integrity sha512-RFewnL/RjE0qQBOuM+2bbY96zmJPIge/aDtsiDbLSb+MOiK8CReAhBHDgL+zrA3F1hQk00lMWpUwYcep750plA== - ob1@0.70.3: version "0.70.3" resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.70.3.tgz#f48cd5a5abf54b0c423b1b06b6d4ff4d049816cb" integrity sha512-Vy9GGhuXgDRY01QA6kdhToPd8AkLdLpX9GjH5kpqluVqTu70mgOm7tpGoJDZGaNbr9nJlJgnipqHJQRPORixIQ== +ob1@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.74.1.tgz#4ddf82ae8dcf77aa471cffbbe3872f01e5102360" + integrity sha512-7dJm08EG0bgcIOTqg2AxvmbgwGLeydnIpyFhAgIl2UTRR2sDTZQ0lj9zpvLKeh2CNM25l3rb+LQkmSLj1U/j/Q== + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -5867,11 +5676,6 @@ optimist@~0.3.5: dependencies: wordwrap "~0.0.2" -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= - ora@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" @@ -6068,13 +5872,6 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pirates@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - pirates@^4.0.4, pirates@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" @@ -6117,13 +5914,12 @@ pretty-format@^26.5.2, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== +pretty-format@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.1.tgz#0da99b532559097b8254298da7c75a0785b1751c" + integrity sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg== dependencies: - "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" + "@jest/schemas" "^29.4.0" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -6223,10 +6019,10 @@ react-native-codegen@^0.69.1, react-native-codegen@^0.69.2: jscodeshift "^0.13.1" nullthrows "^1.1.1" -react-native-flipper@^0.174.0: - version "0.174.0" - resolved "https://registry.yarnpkg.com/react-native-flipper/-/react-native-flipper-0.174.0.tgz#acb57d4cea68551edff73c0f17999e519b39614c" - integrity sha512-9WAUxqHLU57dYxD/Z5EkcU/MdP1KFWCxdZfeHJ6Ogq/GbJVawzibjVfGPVwc2GoLIMvE6rZ0Fvvw4AUIdykc/g== +react-native-flipper@^0.177.0: + version "0.177.0" + resolved "https://registry.yarnpkg.com/react-native-flipper/-/react-native-flipper-0.177.0.tgz#f2c7b265e87f2803e82b17121c4881a61f21e796" + integrity sha512-8fFJs1ekyJ/W5HqTCpkX7n8qcFNevPFD6OLJ/jMBPpyVU5q6j/yIGlrxoDCUgyZIn2GXm5e3heGQtruSTxD/xA== react-native-gradle-plugin@^0.0.7: version "0.0.7" @@ -6440,13 +6236,6 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -6522,11 +6311,6 @@ relative-deps@^1.0.7: yargs "^15.0.2" yarn-or-npm "^3.0.1" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - repeat-element@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" @@ -6569,10 +6353,10 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve.exports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" + integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== resolve@^1.1.6: version "1.22.0" @@ -6624,7 +6408,7 @@ rimraf@^2.5.4, rimraf@^2.6.3: dependencies: glob "^7.1.3" -rimraf@^3.0.0: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -6643,11 +6427,6 @@ rimraf@~2.6.2: dependencies: glob "^7.1.3" -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -6672,21 +6451,6 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - sax@>=0.6.0: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -6933,7 +6697,7 @@ source-map-support@^0.5.16: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.19: +source-map-support@^0.5.19, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -7118,7 +6882,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -7132,14 +6896,6 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -7172,13 +6928,15 @@ temp@^0.8.4: dependencies: rimraf "~2.6.2" -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== +terser@^5.15.0: + version "5.16.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.2.tgz#8f495819439e8b5c150e7530fc434a6e70ea18b2" + integrity sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg== dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" test-exclude@^6.0.0: version "6.0.0" @@ -7323,11 +7081,6 @@ uglify-es@^3.1.9: commander "~2.13.0" source-map "~0.6.1" -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= - unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -7457,7 +7210,7 @@ vlq@^1.0.0: resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== -walker@^1.0.7, walker@~1.0.5: +walker@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= @@ -7552,22 +7305,14 @@ write-file-atomic@^2.3.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" - integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== +write-file-atomic@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.0.tgz#54303f117e109bf3d540261125c8ea5a7320fab0" + integrity sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w== dependencies: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" - integrity sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w== - dependencies: - options ">=0.0.5" - ultron "1.0.x" - ws@^6.1.4: version "6.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" @@ -7665,6 +7410,11 @@ yargs-parser@^21.0.0: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@^15.0.2, yargs@^15.1.0, yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -7695,6 +7445,19 @@ yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.0.0" +yargs@^17.5.1: + version "17.6.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yarn-or-npm@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz#6336eea4dff7e23e226acc98c1a8ada17a1b8666" From 7cc8e3732c30e66609429ef80132662d2a2db70f Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Fri, 3 Feb 2023 04:01:23 -0800 Subject: [PATCH 0478/1651] Advertise UI Debugger for iOS Summary: ^ If the connected device was not an Android device, we were not showing the notification. This change removes that check to also advertise on iOS. Reviewed By: mweststrate Differential Revision: D42989975 fbshipit-source-id: eac8d588be789dcab281a746395a4fb7a88df790 --- desktop/plugins/public/layout/index.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/desktop/plugins/public/layout/index.tsx b/desktop/plugins/public/layout/index.tsx index a27c068bf..d6d550e56 100644 --- a/desktop/plugins/public/layout/index.tsx +++ b/desktop/plugins/public/layout/index.tsx @@ -330,10 +330,7 @@ export default class LayoutPlugin extends FlipperPlugin< }; onSuggestUIDebugger = () => { - if ( - !getFlipperLib().GK('flipper_ui_debugger') || - this.device.os !== 'Android' - ) { + if (!getFlipperLib().GK('flipper_ui_debugger')) { return; } From 64a6c651e78538e81c9eb48e70c2b98ba48f836a Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Fri, 3 Feb 2023 04:06:40 -0800 Subject: [PATCH 0479/1651] Quieten some error logging Reviewed By: mweststrate Differential Revision: D42603959 fbshipit-source-id: 52527e3799ed1bbb870466648de13c36cb1f6722 --- .../src/sandy-chrome/appinspect/LaunchEmulator.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/flipper-ui-core/src/sandy-chrome/appinspect/LaunchEmulator.tsx b/desktop/flipper-ui-core/src/sandy-chrome/appinspect/LaunchEmulator.tsx index 768f42b9e..f77efe681 100644 --- a/desktop/flipper-ui-core/src/sandy-chrome/appinspect/LaunchEmulator.tsx +++ b/desktop/flipper-ui-core/src/sandy-chrome/appinspect/LaunchEmulator.tsx @@ -177,7 +177,7 @@ export const LaunchEmulatorDialog = withTrackingScope( getRenderHostInstance() .flipperServer.exec('ios-launch-simulator', device.udid) .catch((e) => { - console.error('Failed to start simulator: ', e); + console.warn('Failed to start simulator: ', e); message.error('Failed to start simulator: ' + e); }) .then(onClose) From df9b0a6aa624f5c5183ca3b2e2cfa45a15dbe2c6 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Fri, 3 Feb 2023 04:38:51 -0800 Subject: [PATCH 0480/1651] Use react query to cache myles query Summary: The call to myles was a little slow and very cachable so use react query. Additionally it depends on VPN / light so added an error state to make that clear. Reviewed By: lblasa Differential Revision: D42990344 fbshipit-source-id: 8d6ad20aea79f1972a7cf1f61f8af729e5f3464f --- .../public/ui-debugger/components/main.tsx | 78 +++++++-------- desktop/plugins/public/ui-debugger/index.tsx | 17 ++++ .../plugins/public/ui-debugger/package.json | 3 +- desktop/plugins/public/yarn.lock | 95 +++++++++++++++++++ 4 files changed, 155 insertions(+), 38 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 029bf3b45..2e6604dbd 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -24,6 +24,8 @@ import {useKeyboardModifiers} from '../hooks/useKeyboardModifiers'; import {Inspector} from './sidebar/Inspector'; import {Controls} from './Controls'; import {Spin} from 'antd'; +import {QueryClientProvider} from 'react-query'; + import {Tree2} from './Tree'; export function Component() { @@ -45,46 +47,48 @@ export function Component() { if (rootId) { return ( - - - - - - + + + + + + + + + + { + setVisualiserWidth(width); + }} + gutter> + - - - - { - setVisualiserWidth(width); - }} - gutter> - - - - - - - + + + + + + + ); } diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index 3598d1e08..0c33a5d4e 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -24,6 +24,7 @@ import { UINode, } from './types'; import {Draft} from 'immer'; +import {QueryClient, setLogger} from 'react-query'; type SnapshotInfo = {nodeId: Id; base64Image: Snapshot}; type LiveClientState = { @@ -166,6 +167,8 @@ export function plugin(client: PluginClient) { } }); + const queryClient = new QueryClient({}); + return { rootId, uiState, @@ -175,6 +178,7 @@ export function plugin(client: PluginClient) { metadata, perfEvents, setPlayPause, + queryClient, }; } @@ -283,3 +287,16 @@ function collapseinActiveChildren(node: UINode, expandedNodes: Draft>) { } export {Component} from './components/main'; + +setLogger({ + log: (...args) => { + console.log(...args); + }, + warn: (...args) => { + console.warn(...args); + }, + error: (...args) => { + //downgrade react query network errors to warning so they dont get sent to scribe + console.warn(...args); + }, +}); diff --git a/desktop/plugins/public/ui-debugger/package.json b/desktop/plugins/public/ui-debugger/package.json index 42af7acea..055e25046 100644 --- a/desktop/plugins/public/ui-debugger/package.json +++ b/desktop/plugins/public/ui-debugger/package.json @@ -15,7 +15,8 @@ "dependencies": { "lodash": "^4.17.21", "react-color": "^2.19.3", - "react-hotkeys-hook": "^3.4.7" + "react-hotkeys-hook": "^3.4.7", + "react-query": "^3.39.1" }, "bugs": { "url": "https://github.com/facebook/flipper/issues" diff --git a/desktop/plugins/public/yarn.lock b/desktop/plugins/public/yarn.lock index 0fb1f5e33..bac990449 100644 --- a/desktop/plugins/public/yarn.lock +++ b/desktop/plugins/public/yarn.lock @@ -45,6 +45,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + dependencies: + regenerator-runtime "^0.13.11" + "@icons/material@^0.2.4": version "0.2.4" resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" @@ -410,6 +417,11 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +big-integer@^1.6.16: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -434,6 +446,20 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" +broadcast-channel@^3.4.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937" + integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== + dependencies: + "@babel/runtime" "^7.7.2" + detect-node "^2.1.0" + js-sha3 "0.8.0" + microseconds "0.2.0" + nano-time "1.0.0" + oblivious-set "1.0.0" + rimraf "3.0.2" + unload "2.2.0" + brotli@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.3.tgz#7365d8cc00f12cf765d2b2c898716bcf4b604d48" @@ -816,6 +842,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +detect-node@^2.0.4, detect-node@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + dom-accessibility-api@^0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz#b06d059cdd4a4ad9a79275f9d414a5c126241166" @@ -1278,6 +1309,11 @@ js-select@~0.6.0: JSONSelect "0.2.1" traverse "0.4.x" +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -1387,6 +1423,14 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +match-sorter@^6.0.2: + version "6.3.1" + resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" + integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw== + dependencies: + "@babel/runtime" "^7.12.5" + remove-accents "0.4.2" + material-colors@^1.2.1: version "1.2.6" resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46" @@ -1411,6 +1455,11 @@ micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +microseconds@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" + integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -1443,6 +1492,13 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +nano-time@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" + integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== + dependencies: + big-integer "^1.6.16" + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -1506,6 +1562,11 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +oblivious-set@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" + integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -1715,6 +1776,15 @@ react-motion@^0.5.2: prop-types "^15.5.8" raf "^3.1.0" +react-query@^3.39.1: + version "3.39.3" + resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35" + integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g== + dependencies: + "@babel/runtime" "^7.5.5" + broadcast-channel "^3.4.1" + match-sorter "^6.0.2" + react-redux@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.3.tgz#4c084618600bb199012687da9e42123cca3f0be9" @@ -1836,6 +1906,11 @@ redux@^4.0.0: loose-envify "^1.4.0" symbol-observable "^1.2.0" +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + regenerator-runtime@^0.13.4: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" @@ -1857,6 +1932,11 @@ regexp.prototype.flags@^1.2.0: call-bind "^1.0.2" define-properties "^1.1.3" +remove-accents@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" + integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== + repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" @@ -1891,6 +1971,13 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +rimraf@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -2118,6 +2205,14 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +unload@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" + integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== + dependencies: + "@babel/runtime" "^7.6.2" + detect-node "^2.0.4" + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" From dacc6ebb16e66266967d3d798af18cc10bdb8ee1 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Fri, 3 Feb 2023 07:43:00 -0800 Subject: [PATCH 0481/1651] Feedback request Summary: ^ Only for iOS this time. Note: passing the device OS freely to the main component as this is just temporary code that will be deleted soon. Reviewed By: antonk52 Differential Revision: D42990221 fbshipit-source-id: 41b4107caa6bf312191889af75afd28873f6eda5 --- desktop/plugins/public/ui-debugger/components/main.tsx | 3 ++- desktop/plugins/public/ui-debugger/index.tsx | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/desktop/plugins/public/ui-debugger/components/main.tsx b/desktop/plugins/public/ui-debugger/components/main.tsx index 2e6604dbd..07674a695 100644 --- a/desktop/plugins/public/ui-debugger/components/main.tsx +++ b/desktop/plugins/public/ui-debugger/components/main.tsx @@ -25,7 +25,7 @@ import {Inspector} from './sidebar/Inspector'; import {Controls} from './Controls'; import {Spin} from 'antd'; import {QueryClientProvider} from 'react-query'; - +import FeedbackRequest from './fb-stubs/feedback'; import {Tree2} from './Tree'; export function Component() { @@ -49,6 +49,7 @@ export function Component() { return ( + {instance.device === 'iOS' ? : null} diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index 0c33a5d4e..16a1f66ab 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -45,6 +45,8 @@ export function plugin(client: PluginClient) { const rootId = createState(undefined); const metadata = createState>(new Map()); + const device = client.device.os; + client.onMessage('init', (event) => { rootId.set(event.rootId); }); @@ -179,6 +181,7 @@ export function plugin(client: PluginClient) { perfEvents, setPlayPause, queryClient, + device, }; } From 4e21a679039e1559f12afb25377eda788f2ea93c Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Fri, 3 Feb 2023 08:37:33 -0800 Subject: [PATCH 0482/1651] Better offset Summary: For deep nested hierarchies, the current offset was too big making the hierarchy almost un-browsable. The current offset seems to work better. Reviewed By: LukeDefeo Differential Revision: D42996296 fbshipit-source-id: 808a2ecc32aff2d8d252bdb9f653344866e5653b --- desktop/plugins/public/ui-debugger/components/Tree.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index 821a7f44c..0cf9fd4af 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -176,7 +176,7 @@ function IndentGuide({indentGuide}: {indentGuide: NodeIndentGuide}) {
    ; From c3588417bd3cc7a37f82301f603426814b22375f Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Mon, 6 Feb 2023 02:49:30 -0800 Subject: [PATCH 0483/1651] Flipper Release: v0.178.1 Summary: Releasing version 0.178.1 Reviewed By: mweststrate Differential Revision: D42990168 fbshipit-source-id: 14306a45ef95facf37a4f3207cc3b8cc5a1a4da9 --- desktop/package.json | 2 +- desktop/plugins/public/layout/docs/setup.mdx | 2 +- desktop/plugins/public/leak_canary/docs/setup.mdx | 2 +- desktop/plugins/public/network/docs/setup.mdx | 2 +- docs/getting-started/android-native.mdx | 4 ++-- docs/getting-started/react-native-ios.mdx | 2 +- docs/getting-started/react-native.mdx | 4 ++-- gradle.properties | 2 +- js/js-flipper/package.json | 2 +- react-native/react-native-flipper/package.json | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index 4d780d231..581e841ec 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -169,7 +169,7 @@ "npm": "use yarn instead", "yarn": "^1.16" }, - "version": "0.178.0", + "version": "0.178.1", "workspaces": { "packages": [ "scripts", diff --git a/desktop/plugins/public/layout/docs/setup.mdx b/desktop/plugins/public/layout/docs/setup.mdx index b3ef50dd7..9b083d889 100644 --- a/desktop/plugins/public/layout/docs/setup.mdx +++ b/desktop/plugins/public/layout/docs/setup.mdx @@ -27,7 +27,7 @@ You also need to compile in the `litho-annotations` package, as Flipper reflects ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.178.0' + debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.178.1' debugImplementation 'com.facebook.litho:litho-annotations:0.19.0' // ... } diff --git a/desktop/plugins/public/leak_canary/docs/setup.mdx b/desktop/plugins/public/leak_canary/docs/setup.mdx index 3e48790ef..4bf972ae2 100644 --- a/desktop/plugins/public/leak_canary/docs/setup.mdx +++ b/desktop/plugins/public/leak_canary/docs/setup.mdx @@ -8,7 +8,7 @@ To setup the LeakCan ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.178.0' + debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.178.1' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1' } ``` diff --git a/desktop/plugins/public/network/docs/setup.mdx b/desktop/plugins/public/network/docs/setup.mdx index 3c6d0136c..5431ee38b 100644 --- a/desktop/plugins/public/network/docs/setup.mdx +++ b/desktop/plugins/public/network/docs/setup.mdx @@ -12,7 +12,7 @@ The network plugin is shipped as a separate Maven artifact, as follows: ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.178.0' + debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.178.1' } ``` diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index 3bb0095d6..a39e57ec8 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -24,10 +24,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.178.0' + debugImplementation 'com.facebook.flipper:flipper:0.178.1' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.178.0' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.178.1' } ``` diff --git a/docs/getting-started/react-native-ios.mdx b/docs/getting-started/react-native-ios.mdx index 10d3a5b20..797a903b6 100644 --- a/docs/getting-started/react-native-ios.mdx +++ b/docs/getting-started/react-native-ios.mdx @@ -51,7 +51,7 @@ Add all of the code below to your `ios/Podfile`: platform :ios, '9.0' def flipper_pods() - flipperkit_version = '0.178.0' # should match the version of your Flipper client app + flipperkit_version = '0.178.1' # should match the version of your Flipper client app pod 'FlipperKit', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/FlipperKitLayoutPlugin', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/SKIOSNetworkPlugin', '~>' + flipperkit_version, :configuration => 'Debug' diff --git a/docs/getting-started/react-native.mdx b/docs/getting-started/react-native.mdx index 175b5adb1..13c946c8b 100644 --- a/docs/getting-started/react-native.mdx +++ b/docs/getting-started/react-native.mdx @@ -34,7 +34,7 @@ Latest version of Flipper requires react-native 0.69+! If you use react-native < Android: -1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.178.0`. +1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.178.1`. 2. Run `./gradlew clean` in the `android` directory. iOS: @@ -44,7 +44,7 @@ react-native version => 0.69.0 2. Run `pod install --repo-update` in the `ios` directory. react-native version < 0.69.0 -1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.178.0' })`. +1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.178.1' })`. 2. Run `pod install --repo-update` in the `ios` directory. ## Manual Setup diff --git a/gradle.properties b/gradle.properties index d0f3b011b..2e23ff94a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.178.1-SNAPSHOT +VERSION_NAME=0.178.1 GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper diff --git a/js/js-flipper/package.json b/js/js-flipper/package.json index 6a6846612..29663ef1f 100644 --- a/js/js-flipper/package.json +++ b/js/js-flipper/package.json @@ -1,7 +1,7 @@ { "name": "js-flipper", "title": "JS Flipper Bindings for Web-Socket based clients", - "version": "0.178.0", + "version": "0.178.1", "main": "lib/index.js", "browser": { "os": false diff --git a/react-native/react-native-flipper/package.json b/react-native/react-native-flipper/package.json index 4910361cd..9ce591881 100644 --- a/react-native/react-native-flipper/package.json +++ b/react-native/react-native-flipper/package.json @@ -1,7 +1,7 @@ { "name": "react-native-flipper", "title": "React Native Flipper Bindings", - "version": "0.178.0", + "version": "0.178.1", "description": "Flipper bindings for React Native", "main": "index.js", "types": "index.d.ts", From 4f9701ca884731974547c0152c76cb8fb806fc4d Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Mon, 6 Feb 2023 02:49:30 -0800 Subject: [PATCH 0484/1651] Flipper Snapshot Bump: v0.178.2-SNAPSHOT Summary: Releasing snapshot version 0.178.2-SNAPSHOT Reviewed By: mweststrate Differential Revision: D42990167 fbshipit-source-id: c9e59372e8c781b7becd6ba57d2dafb1e82f011f --- docs/getting-started/android-native.mdx | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index a39e57ec8..6a5e9d843 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -124,10 +124,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.178.1-SNAPSHOT' + debugImplementation 'com.facebook.flipper:flipper:0.178.2-SNAPSHOT' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.178.1-SNAPSHOT' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.178.2-SNAPSHOT' } ``` diff --git a/gradle.properties b/gradle.properties index 2e23ff94a..c72767b8b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.178.1 +VERSION_NAME=0.178.2-SNAPSHOT GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper From d3df6bc00e5b0fc6ed603880936cde749e7eb44a Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 6 Feb 2023 04:33:11 -0800 Subject: [PATCH 0485/1651] Attempt to render txid as date if possible Summary: We are using frame time on android so make sense to present it Reviewed By: lblasa Differential Revision: D42996555 fbshipit-source-id: 595a08571ccd82de0761cfeea8a204e576981ee0 --- .../plugins/public/ui-debugger/components/PerfStats.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/desktop/plugins/public/ui-debugger/components/PerfStats.tsx b/desktop/plugins/public/ui-debugger/components/PerfStats.tsx index fbff575aa..ea3e1d657 100644 --- a/desktop/plugins/public/ui-debugger/components/PerfStats.tsx +++ b/desktop/plugins/public/ui-debugger/components/PerfStats.tsx @@ -26,6 +26,13 @@ const columns: DataTableColumn[] = [ { key: 'txId', title: 'TXID', + onRender: (row: PerfStatsEvent) => { + try { + return new Date(row.txId).toISOString(); + } catch { + return row.txId; + } + }, }, { key: 'observerType', From d93c9d45a9e5602fef19ede24b0af2c8ef66f95b Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 6 Feb 2023 04:33:11 -0800 Subject: [PATCH 0486/1651] Ability to highlight nodes that match monitored event Summary: Listen to framework events and store in a map based on node id Added UI to allow for monitoring framework event types. The event type is a string separated by : Each segment of this string represents a level in the dialog hierachy. For example Litho:Layout:StateUpdateSync would have levels, Litho Layout StateUpdateSync When event type monitored and event comes in for a node flash the visualiser node briefly Reviewed By: lblasa Differential Revision: D42074988 fbshipit-source-id: 52458ad87ab84bf7b1749e87be516ed73106a6c0 --- .../ui-debugger/components/Controls.tsx | 225 +++++++++++++++++- .../components/Visualization2D.tsx | 13 +- desktop/plugins/public/ui-debugger/index.tsx | 75 +++++- desktop/plugins/public/ui-debugger/types.tsx | 12 + 4 files changed, 309 insertions(+), 16 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Controls.tsx b/desktop/plugins/public/ui-debugger/components/Controls.tsx index 6a5d5fdd9..aff0b41d2 100644 --- a/desktop/plugins/public/ui-debugger/components/Controls.tsx +++ b/desktop/plugins/public/ui-debugger/components/Controls.tsx @@ -6,11 +6,26 @@ * * @format */ -import React from 'react'; +import React, {useState} from 'react'; import {plugin} from '../index'; -import {Button, Input, Tooltip} from 'antd'; -import {PauseCircleOutlined, PlayCircleOutlined} from '@ant-design/icons'; +import { + Button, + Input, + Modal, + Tooltip, + Dropdown, + Menu, + Typography, + TreeSelect, + Space, +} from 'antd'; +import { + MoreOutlined, + PauseCircleOutlined, + PlayCircleOutlined, +} from '@ant-design/icons'; import {usePlugin, useValue, Layout} from 'flipper-plugin'; +import {FrameworkEventType} from '../types'; /** * Copyright (c) Meta Platforms, Inc. and affiliates. @@ -25,6 +40,20 @@ export const Controls: React.FC = () => { const instance = usePlugin(plugin); const searchTerm = useValue(instance.uiState.searchTerm); const isPaused = useValue(instance.uiState.isPaused); + + const frameworkEventMonitoring: Map = useValue( + instance.uiState.frameworkEventMonitoring, + ); + + const onSetEventMonitored: ( + eventType: FrameworkEventType, + monitored: boolean, + ) => void = (eventType: FrameworkEventType, monitored: boolean) => { + instance.uiState.frameworkEventMonitoring.update((draft) => + draft.set(eventType, monitored), + ); + }; + return ( { {isPaused ? : } }> + ); }; + +function MoreOptionsMenu({ + onSetEventMonitored, + frameworkEventTypes, +}: { + onSetEventMonitored: ( + eventType: FrameworkEventType, + monitored: boolean, + ) => void; + frameworkEventTypes: [FrameworkEventType, boolean][]; +}) { + const [showFrameworkEventsModal, setShowFrameworkEventsModal] = + useState(false); + + const moreOptionsMenu = ( + + { + setShowFrameworkEventsModal(true); + }}> + Framework event monitoring + + + ); + + return ( + <> + +
    ); @@ -256,6 +274,35 @@ const TreeAttributeContainer = styled(Text)({ fontSize: 12, }); +function MonitoredEventSummary({ + node, + frameworkEvents, + frameworkEventsMonitoring, +}: { + node: UINode; + frameworkEvents: Map; + frameworkEventsMonitoring: Map; +}) { + const events = frameworkEvents.get(node.id); + if (events) { + return ( + <> + {Object.entries(groupBy(events, (e) => e.type)) + .filter(([type]) => frameworkEventsMonitoring.get(type)) + .map(([key, values]) => ( + + + {last(key.split(':'))} + + ={values.length} + + ))} + + ); + } + return null; +} + function InlineAttributes({attributes}: {attributes: Record}) { const highlightManager: HighlightManager = useHighlighter(); @@ -326,7 +373,7 @@ function ExpandedIconOrSpace(props: { function HighlightedText(props: {text: string}) { const highlightManager: HighlightManager = useHighlighter(); - return {highlightManager.render(props.text)}; + return {highlightManager.render(props.text)} ; } function nodeIcon(node: UINode) { From dc9c445f9ec98e014c643bce8682e70af65ed611 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 6 Feb 2023 04:33:11 -0800 Subject: [PATCH 0488/1651] Highlight tree nodes when monitored event matches Summary: Tree node flashes to highlight an event occured Reviewed By: lblasa Differential Revision: D42996554 fbshipit-source-id: fc51a76ce7e33d041d094fedc91f05338b907bec --- .../public/ui-debugger/components/Tree.tsx | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index b08905be6..ddb4e2997 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -64,6 +64,7 @@ export function Tree2({ const frameworkEventsMonitoring = useValue( instance.uiState.frameworkEventMonitoring, ); + const highlightedNodes = useValue(instance.uiState.highlightedNodes); const {treeNodes, refs} = useMemo(() => { const treeNodes = toTreeNodes( @@ -126,6 +127,7 @@ export function Tree2({ treeNode={treeNode} frameworkEvents={frameworkEvents} frameworkEventsMonitoring={frameworkEventsMonitoring} + highlightedNodes={highlightedNodes} selectedNode={selectedNode} hoveredNode={hoveredNode} isUsingKBToScroll={isUsingKBToScroll} @@ -150,6 +152,7 @@ const MemoTreeItemContainer = React.memo( prevProps.treeNode === nextProps.treeNode && prevProps.isContextMenuOpen === nextProps.isContextMenuOpen && prevProps.frameworkEvents === nextProps.frameworkEvents && + prevProps.highlightedNodes === nextProps.highlightedNodes && prevProps.frameworkEventsMonitoring === nextProps.frameworkEventsMonitoring && prevProps.hoveredNode !== id && //make sure that prev or next hover/selected node doesnt concern this tree node @@ -200,6 +203,7 @@ function TreeItemContainer({ treeNode, frameworkEvents, frameworkEventsMonitoring, + highlightedNodes, selectedNode, hoveredNode, isUsingKBToScroll, @@ -212,6 +216,7 @@ function TreeItemContainer({ innerRef: Ref; treeNode: TreeNode; frameworkEvents: Map; + highlightedNodes: Set; frameworkEventsMonitoring: Map; selectedNode?: Id; hoveredNode?: Id; @@ -227,8 +232,9 @@ function TreeItemContainer({ {treeNode.indentGuide != null && ( )} - { @@ -262,7 +268,7 @@ function TreeItemContainer({ frameworkEvents={frameworkEvents} frameworkEventsMonitoring={frameworkEventsMonitoring} /> - +
    ); } @@ -323,11 +329,12 @@ function InlineAttributes({attributes}: {attributes: Record}) { const TreeItemHeight = '26px'; const HalfTreeItemHeight = `calc(${TreeItemHeight} / 2)`; -const TreeItemContent = styled.li<{ +const TreeItemRow = styled.li<{ item: TreeNode; isHovered: boolean; isSelected: boolean; -}>(({item, isHovered, isSelected}) => ({ + isHighlighted: boolean; +}>(({item, isHovered, isSelected, isHighlighted}) => ({ display: 'flex', alignItems: 'baseline', height: TreeItemHeight, @@ -336,7 +343,12 @@ const TreeItemContent = styled.li<{ borderRadius: '3px', borderColor: isHovered ? theme.selectionBackgroundColor : 'transparent', borderStyle: 'solid', - backgroundColor: isSelected ? theme.selectionBackgroundColor : theme.white, + + backgroundColor: isHighlighted + ? 'rgba(255,0,0,.3)' + : isSelected + ? theme.selectionBackgroundColor + : theme.white, })); function ExpandedIconOrSpace(props: { From c19dc150e63de8eb60424e12457620b8fe2473dd Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 6 Feb 2023 04:33:11 -0800 Subject: [PATCH 0489/1651] Use event metadata in init event Summary: Previously we were checking the framework events stream for any new events and populating the map from that. Now we expect the init event to contain event types. This allows us to know if the app supports framework event and therefore we dont show the controls to monitor it. Additionally we can fully populate the event monitoring dialog Reviewed By: lblasa Differential Revision: D42996552 fbshipit-source-id: 7850ada53d0630ba102af6c0d74d9d904f75eada --- .../ui-debugger/components/Controls.tsx | 20 +++++++------------ desktop/plugins/public/ui-debugger/index.tsx | 12 +++++------ desktop/plugins/public/ui-debugger/types.tsx | 9 ++++++--- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Controls.tsx b/desktop/plugins/public/ui-debugger/components/Controls.tsx index aff0b41d2..6d9b0acc6 100644 --- a/desktop/plugins/public/ui-debugger/components/Controls.tsx +++ b/desktop/plugins/public/ui-debugger/components/Controls.tsx @@ -6,6 +6,7 @@ * * @format */ + import React, {useState} from 'react'; import {plugin} from '../index'; import { @@ -27,15 +28,6 @@ import { import {usePlugin, useValue, Layout} from 'flipper-plugin'; import {FrameworkEventType} from '../types'; -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - export const Controls: React.FC = () => { const instance = usePlugin(plugin); const searchTerm = useValue(instance.uiState.searchTerm); @@ -70,10 +62,12 @@ export const Controls: React.FC = () => { {isPaused ? : } }> - + {frameworkEventMonitoring.size > 0 && ( + + )} ); }; diff --git a/desktop/plugins/public/ui-debugger/index.tsx b/desktop/plugins/public/ui-debugger/index.tsx index 1d2345e07..5e82c7f63 100644 --- a/desktop/plugins/public/ui-debugger/index.tsx +++ b/desktop/plugins/public/ui-debugger/index.tsx @@ -53,6 +53,11 @@ export function plugin(client: PluginClient) { client.onMessage('init', (event) => { rootId.set(event.rootId); + uiState.frameworkEventMonitoring.update((draft) => { + event.frameworkEventMetadata.forEach((frameworkEventMeta) => { + draft.set(frameworkEventMeta.type, false); + }); + }); }); client.onMessage('metadataUpdate', (event) => { @@ -147,13 +152,6 @@ export function plugin(client: PluginClient) { const seenNodes = new Set(); client.onMessage('subtreeUpdate', (subtreeUpdate) => { - uiState.frameworkEventMonitoring.update((draft) => { - (subtreeUpdate.frameworkEvents ?? []).forEach((frameworkEvent) => { - if (!draft.has(frameworkEvent.type)) - draft.set(frameworkEvent.type, false); - }); - }); - frameworkEvents.update((draft) => { if (subtreeUpdate.frameworkEvents) { subtreeUpdate.frameworkEvents.forEach((frameworkEvent) => { diff --git a/desktop/plugins/public/ui-debugger/types.tsx b/desktop/plugins/public/ui-debugger/types.tsx index ac1e723ed..3e2740b74 100644 --- a/desktop/plugins/public/ui-debugger/types.tsx +++ b/desktop/plugins/public/ui-debugger/types.tsx @@ -29,19 +29,22 @@ export type SubtreeUpdateEvent = { frameworkEvents?: FrameworkEvent[]; }; -export type Thread = 'Main' | 'Background'; - export type FrameworkEventType = string; +export type FrameworkEventMetadata = { + type: FrameworkEventType; + documentation: string; +}; + export type FrameworkEvent = { nodeId: Id; type: FrameworkEventType; - thread: Thread; timestamp: number; }; export type InitEvent = { rootId: Id; + frameworkEventMetadata: FrameworkEventMetadata[]; }; export type PerfStatsEvent = { From d97dfae1a02ce028528f9a6e411cea52425fafd6 Mon Sep 17 00:00:00 2001 From: Lukas Kurucz Date: Mon, 6 Feb 2023 08:17:47 -0800 Subject: [PATCH 0490/1651] chore: add doc for martkeplace (#4395) Summary: Provide a documentation about marketplace feature of Flipper. This should cover: 1. Introduction of the feature (plugin discovery, auto update)2. 2. Marketplace server - to list available plugins 3. Flipper settings - describe the new settings and how to enable4. Closes https://github.com/facebook/flipper/issues/3545. ## Changelog Pull Request resolved: https://github.com/facebook/flipper/pull/4395 Reviewed By: antonk52 Differential Revision: D42918936 Pulled By: passy fbshipit-source-id: 50b10178b569ecc6ea65b736ea58db401cf686c6 --- docs/tutorial/js-publishing.mdx | 11 ++++++ docs/tutorial/marketplace.mdx | 38 ++++++++++++++++++++ website/sidebars.js | 1 + website/static/img/marketplace-discovery.png | 0 website/static/img/marketplace-settings.png | 0 5 files changed, 50 insertions(+) create mode 100644 docs/tutorial/marketplace.mdx create mode 100644 website/static/img/marketplace-discovery.png create mode 100644 website/static/img/marketplace-settings.png diff --git a/docs/tutorial/js-publishing.mdx b/docs/tutorial/js-publishing.mdx index 5ad0fc139..8ca30762f 100644 --- a/docs/tutorial/js-publishing.mdx +++ b/docs/tutorial/js-publishing.mdx @@ -65,4 +65,15 @@ This may be Maven Central, JCenter or GitHub Packages for Android, CocoaPods for Make sure to leave setup instructions in the README of your npm package. +## Marketplace + +When developing plugins intended only for internal use (within certaing organisation/group), we might not want to expose those plugins to public. +By default Flipper plugins will be published to [npmjs.com](https://www.npmjs.com). Thus anyone can try install&use this plugin. + +To keep plugin private, we can provide a `.tar.gz` archive with pluginc code and user can manually install the plugin. +This is quite troublesome for most users and also does not provide a way to automatically update when new version is released. + +Flipper provides a marketplace feature, which does help with discovery of plugins within organisation and also keeps the plugins private. +To read more details on how marketplace works and how it can be integrated, please read this document: [Marketplace](./marketplace.mdx). + diff --git a/docs/tutorial/marketplace.mdx b/docs/tutorial/marketplace.mdx new file mode 100644 index 000000000..18f992f08 --- /dev/null +++ b/docs/tutorial/marketplace.mdx @@ -0,0 +1,38 @@ +--- +id: marketplace +title: Marketplace +--- +import useBaseUrl from '@docusaurus/useBaseUrl'; + +Flipper provides this feature to allow distribution of `private` plugins, which are not published to [npmjs.com](https://npmjs.com). + +### Plugin discovery + +Plugins which are supported by currently connected app/device, will be listed under "Detected in app" section in sidebar. +This significantly help users to discover useful plugins for their app. + +Install plugins + +### Plugin auto-update +Once plugin is installed, it will also keep updating to latest version. + + +## Enable markektplace + +### Setup server + +Instead of hosting plugins on npm server, we need to provide custom server, which will provide a list of internal plugins. + +> It is recommended to connect this server with internal package registry (to allow providing latest version). + +Here is a example implementation of server using Verdaccio as package registry: [marketplace-server-example](https://github.com/usrbowe/flipper-marketplace-server). + + +### Enable marketplace + +Open Flipper settings and enter the URL to your Flipper marketplace server. It is also adviced to toggle ON the `Enable auto update`. + +Install plugins + + + diff --git a/website/sidebars.js b/website/sidebars.js index 86501d599..b84b345cf 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -144,6 +144,7 @@ module.exports = { 'extending/layout-inspector', ], }, + ], 'Under the Hood': [ 'internals/index', diff --git a/website/static/img/marketplace-discovery.png b/website/static/img/marketplace-discovery.png new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/img/marketplace-settings.png b/website/static/img/marketplace-settings.png new file mode 100644 index 000000000..e69de29bb From e9c0a459dd4349ab2ee56406536a5e568aac4b29 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 7 Feb 2023 05:55:11 -0800 Subject: [PATCH 0491/1651] Remove connection timeout Summary: This change mainly removes the connection timeout period as it may introduce a race condition in which slow server connections get terminated potentially creating connection loops. Also, suspend and wait for all operations to complete once a socket is disconnected. Reviewed By: ivanmisuno Differential Revision: D43048252 fbshipit-source-id: 64c28a3d3d2fd4e065084d5f55a17444385c07e0 --- iOS/FlipperKit/FlipperPlatformWebSocket.mm | 36 ++++++++++++---------- iOS/FlipperKit/FlipperWebSocket.mm | 8 +---- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/iOS/FlipperKit/FlipperPlatformWebSocket.mm b/iOS/FlipperKit/FlipperPlatformWebSocket.mm index a51c5ac27..76df258f2 100644 --- a/iOS/FlipperKit/FlipperPlatformWebSocket.mm +++ b/iOS/FlipperKit/FlipperPlatformWebSocket.mm @@ -166,25 +166,26 @@ static constexpr int connectionKeepaliveSeconds = 10; } - (void)disconnect { - [_dispatchQueue cancelAllOperations]; - if ([_keepAlive isValid]) { [_keepAlive invalidate]; } _keepAlive = nil; + if (_socket) { + // Clear the socket delegate before close. Ensures that we won't get + // any messages after the disconnect takes place. + [_socket setDelegate:nil]; + [_socket close]; + _socket = nil; + }; + + [_dispatchQueue cancelAllOperations]; + [_dispatchQueue waitUntilAllOperationsAreFinished]; + // Manually trigger a 'close' event as SocketRocket close method will // not notify the delegate. SocketRocket only triggers the close event // when the connection is closed from the server. _eventHandler(facebook::flipper::SocketEvent::CLOSE); - - if (_socket) { - // Clear the socket delegate before close. Ensures that we won't get - // any messages after the disconnect takes place. - _socket.delegate = nil; - [_socket close]; - _socket = nil; - }; } - (void)send:(NSString*)message @@ -192,10 +193,12 @@ static constexpr int connectionKeepaliveSeconds = 10; __weak auto weakSelf = self; [_dispatchQueue addOperationWithBlock:^{ __strong auto strongSelf = weakSelf; - NSError* error = nil; - [strongSelf->_socket sendString:message error:&error]; - if (completionHandler) { - completionHandler(error); + if (strongSelf) { + NSError* error = nil; + [strongSelf->_socket sendString:message error:&error]; + if (completionHandler) { + completionHandler(error); + } } }]; } @@ -210,7 +213,9 @@ static constexpr int connectionKeepaliveSeconds = 10; __weak auto weakSelf = self; [_dispatchQueue addOperationWithBlock:^{ __strong auto strongSelf = weakSelf; - [strongSelf->_socket sendPing:nil error:nil]; + if (strongSelf) { + [strongSelf->_socket sendPing:nil error:nil]; + } }]; } @@ -251,7 +256,6 @@ static constexpr int connectionKeepaliveSeconds = 10; _keepAlive = nil; _eventHandler(facebook::flipper::SocketEvent::CLOSE); - _socket = nil; } - (void)_webSocketDidReceiveMessage:(id)message { diff --git a/iOS/FlipperKit/FlipperWebSocket.mm b/iOS/FlipperKit/FlipperWebSocket.mm index 3389d7791..d5dd99917 100644 --- a/iOS/FlipperKit/FlipperWebSocket.mm +++ b/iOS/FlipperKit/FlipperWebSocket.mm @@ -125,13 +125,7 @@ bool FlipperWebSocket::connect(FlipperConnectionManager* manager) { [socket_ connect]; - auto state = connected.wait_for(std::chrono::seconds(10)); - if (state == std::future_status::ready) { - return connected.get(); - } - - disconnect(); - return false; + return connected.get(); } void FlipperWebSocket::disconnect() { From 9c9cd91832cd2b195570304cb287e66739170317 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 7 Feb 2023 07:16:20 -0800 Subject: [PATCH 0492/1651] Remove id from Inspector Summary: This is internal to ui-debugger so there's no need to surface this information to users. Reviewed By: ivanmisuno Differential Revision: D43081188 fbshipit-source-id: f6abdeb7828a1709d2590cf2a10407baec645420 --- .../components/sidebar/inspector/IdentityInspector.tsx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/IdentityInspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/IdentityInspector.tsx index 2e08de7fe..24100dfe8 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/inspector/IdentityInspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/inspector/IdentityInspector.tsx @@ -50,14 +50,6 @@ export const IdentityInspector: React.FC = ({node}) => { - - - Id: - - - {node.id} - - ); From 39a4cc22b10d1225e083e258ef3f14d778a6da98 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 7 Feb 2023 07:58:12 -0800 Subject: [PATCH 0493/1651] Dark mode support Summary: This change addresses some obvious issues which made the ui-debugger unusable with dark mode on. There may more things that need changing, but at the very least this should be a good place to start. Reviewed By: fabiomassimo Differential Revision: D43083218 fbshipit-source-id: 8e4338b79178d3a0f05f9bcaffa2fc6f35eb0e21 --- .../plugins/public/ui-debugger/components/Tree.tsx | 2 +- .../ui-debugger/components/sidebar/Inspector.tsx | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/desktop/plugins/public/ui-debugger/components/Tree.tsx b/desktop/plugins/public/ui-debugger/components/Tree.tsx index ddb4e2997..be083aff5 100644 --- a/desktop/plugins/public/ui-debugger/components/Tree.tsx +++ b/desktop/plugins/public/ui-debugger/components/Tree.tsx @@ -348,7 +348,7 @@ const TreeItemRow = styled.li<{ ? 'rgba(255,0,0,.3)' : isSelected ? theme.selectionBackgroundColor - : theme.white, + : theme.backgroundDefault, })); function ExpandedIconOrSpace(props: { diff --git a/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx b/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx index f92aea5fa..1df3e280b 100644 --- a/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx +++ b/desktop/plugins/public/ui-debugger/components/sidebar/Inspector.tsx @@ -10,7 +10,7 @@ import React from 'react'; // eslint-disable-next-line rulesdir/no-restricted-imports-clone import {Glyph} from 'flipper'; -import {Layout, Tab, Tabs} from 'flipper-plugin'; +import {Layout, Tab, Tabs, theme} from 'flipper-plugin'; import {Metadata, MetadataId, UINode} from '../../types'; import {IdentityInspector} from './inspector/IdentityInspector'; import {AttributesInspector} from './inspector/AttributesInspector'; @@ -33,7 +33,7 @@ export const Inspector: React.FC = ({node, metadata}) => { tab={ - + }> @@ -44,7 +44,7 @@ export const Inspector: React.FC = ({node, metadata}) => { tab={ - + }> @@ -58,7 +58,11 @@ export const Inspector: React.FC = ({node, metadata}) => { tab={ - + }> From 4f5c716c05d7532739e8ee01a912f556b4bb5e7d Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Tue, 7 Feb 2023 10:23:53 -0800 Subject: [PATCH 0494/1651] Flipper Release: v0.179.0 Summary: Releasing version 0.179.0 Reviewed By: lblasa Differential Revision: D43084743 fbshipit-source-id: 14a237cccd4b423ae617040ec6b6bc9320dd7109 --- desktop/package.json | 2 +- desktop/plugins/public/layout/docs/setup.mdx | 2 +- desktop/plugins/public/leak_canary/docs/setup.mdx | 2 +- desktop/plugins/public/network/docs/setup.mdx | 2 +- docs/getting-started/android-native.mdx | 4 ++-- docs/getting-started/react-native-ios.mdx | 2 +- docs/getting-started/react-native.mdx | 4 ++-- gradle.properties | 2 +- js/js-flipper/package.json | 2 +- react-native/react-native-flipper/package.json | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index 581e841ec..b116078c5 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -169,7 +169,7 @@ "npm": "use yarn instead", "yarn": "^1.16" }, - "version": "0.178.1", + "version": "0.179.0", "workspaces": { "packages": [ "scripts", diff --git a/desktop/plugins/public/layout/docs/setup.mdx b/desktop/plugins/public/layout/docs/setup.mdx index 9b083d889..01ec9852d 100644 --- a/desktop/plugins/public/layout/docs/setup.mdx +++ b/desktop/plugins/public/layout/docs/setup.mdx @@ -27,7 +27,7 @@ You also need to compile in the `litho-annotations` package, as Flipper reflects ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.178.1' + debugImplementation 'com.facebook.flipper:flipper-litho-plugin:0.179.0' debugImplementation 'com.facebook.litho:litho-annotations:0.19.0' // ... } diff --git a/desktop/plugins/public/leak_canary/docs/setup.mdx b/desktop/plugins/public/leak_canary/docs/setup.mdx index 4bf972ae2..85f2edf9f 100644 --- a/desktop/plugins/public/leak_canary/docs/setup.mdx +++ b/desktop/plugins/public/leak_canary/docs/setup.mdx @@ -8,7 +8,7 @@ To setup the LeakCan ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.178.1' + debugImplementation 'com.facebook.flipper:flipper-leakcanary2-plugin:0.179.0' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1' } ``` diff --git a/desktop/plugins/public/network/docs/setup.mdx b/desktop/plugins/public/network/docs/setup.mdx index 5431ee38b..f5da07b61 100644 --- a/desktop/plugins/public/network/docs/setup.mdx +++ b/desktop/plugins/public/network/docs/setup.mdx @@ -12,7 +12,7 @@ The network plugin is shipped as a separate Maven artifact, as follows: ```groovy dependencies { - debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.178.1' + debugImplementation 'com.facebook.flipper:flipper-network-plugin:0.179.0' } ``` diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index 6a5e9d843..ee1314653 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -24,10 +24,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.178.1' + debugImplementation 'com.facebook.flipper:flipper:0.179.0' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.178.1' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.179.0' } ``` diff --git a/docs/getting-started/react-native-ios.mdx b/docs/getting-started/react-native-ios.mdx index 797a903b6..addad865f 100644 --- a/docs/getting-started/react-native-ios.mdx +++ b/docs/getting-started/react-native-ios.mdx @@ -51,7 +51,7 @@ Add all of the code below to your `ios/Podfile`: platform :ios, '9.0' def flipper_pods() - flipperkit_version = '0.178.1' # should match the version of your Flipper client app + flipperkit_version = '0.179.0' # should match the version of your Flipper client app pod 'FlipperKit', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/FlipperKitLayoutPlugin', '~>' + flipperkit_version, :configuration => 'Debug' pod 'FlipperKit/SKIOSNetworkPlugin', '~>' + flipperkit_version, :configuration => 'Debug' diff --git a/docs/getting-started/react-native.mdx b/docs/getting-started/react-native.mdx index 13c946c8b..31ecb0d50 100644 --- a/docs/getting-started/react-native.mdx +++ b/docs/getting-started/react-native.mdx @@ -34,7 +34,7 @@ Latest version of Flipper requires react-native 0.69+! If you use react-native < Android: -1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.178.1`. +1. Bump the `FLIPPER_VERSION` variable in `android/gradle.properties`, for example: `FLIPPER_VERSION=0.179.0`. 2. Run `./gradlew clean` in the `android` directory. iOS: @@ -44,7 +44,7 @@ react-native version => 0.69.0 2. Run `pod install --repo-update` in the `ios` directory. react-native version < 0.69.0 -1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.178.1' })`. +1. Call `use_flipper` with a specific version in `ios/Podfile`, for example: `use_flipper!({ 'Flipper' => '0.179.0' })`. 2. Run `pod install --repo-update` in the `ios` directory. ## Manual Setup diff --git a/gradle.properties b/gradle.properties index c72767b8b..19e2f91b4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.178.2-SNAPSHOT +VERSION_NAME=0.179.0 GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper diff --git a/js/js-flipper/package.json b/js/js-flipper/package.json index 29663ef1f..a78534cf6 100644 --- a/js/js-flipper/package.json +++ b/js/js-flipper/package.json @@ -1,7 +1,7 @@ { "name": "js-flipper", "title": "JS Flipper Bindings for Web-Socket based clients", - "version": "0.178.1", + "version": "0.179.0", "main": "lib/index.js", "browser": { "os": false diff --git a/react-native/react-native-flipper/package.json b/react-native/react-native-flipper/package.json index 9ce591881..42a4de925 100644 --- a/react-native/react-native-flipper/package.json +++ b/react-native/react-native-flipper/package.json @@ -1,7 +1,7 @@ { "name": "react-native-flipper", "title": "React Native Flipper Bindings", - "version": "0.178.1", + "version": "0.179.0", "description": "Flipper bindings for React Native", "main": "index.js", "types": "index.d.ts", From 74a093dc519a3d1041985fdbf4c7d8225776a58b Mon Sep 17 00:00:00 2001 From: generatedunixname89002005306973 Date: Tue, 7 Feb 2023 10:23:53 -0800 Subject: [PATCH 0495/1651] Flipper Snapshot Bump: v0.179.1-SNAPSHOT Summary: Releasing snapshot version 0.179.1-SNAPSHOT Reviewed By: lblasa Differential Revision: D43084739 fbshipit-source-id: fb8fa7095c76e9d02b34c6e6b0bde8853888204f --- docs/getting-started/android-native.mdx | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started/android-native.mdx b/docs/getting-started/android-native.mdx index ee1314653..b3b18d280 100644 --- a/docs/getting-started/android-native.mdx +++ b/docs/getting-started/android-native.mdx @@ -124,10 +124,10 @@ repositories { } dependencies { - debugImplementation 'com.facebook.flipper:flipper:0.178.2-SNAPSHOT' + debugImplementation 'com.facebook.flipper:flipper:0.179.1-SNAPSHOT' debugImplementation 'com.facebook.soloader:soloader:0.10.4' - releaseImplementation 'com.facebook.flipper:flipper-noop:0.178.2-SNAPSHOT' + releaseImplementation 'com.facebook.flipper:flipper-noop:0.179.1-SNAPSHOT' } ``` diff --git a/gradle.properties b/gradle.properties index 19e2f91b4..2a754357f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. # POM publishing constants -VERSION_NAME=0.179.0 +VERSION_NAME=0.179.1-SNAPSHOT GROUP=com.facebook.flipper SONATYPE_STAGING_PROFILE=comfacebook POM_URL=https://github.com/facebook/flipper From d858459516794d8c606531ee8322bb19b3655a78 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Wed, 8 Feb 2023 07:09:08 -0800 Subject: [PATCH 0496/1651] Search placeholder and icon Summary: ^ Reviewed By: antonk52 Differential Revision: D43118750 fbshipit-source-id: 46c341772d05d6712ac2c0d76d94ee942609c1b3 --- desktop/plugins/public/ui-debugger/components/Controls.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/desktop/plugins/public/ui-debugger/components/Controls.tsx b/desktop/plugins/public/ui-debugger/components/Controls.tsx index 6d9b0acc6..4d415473b 100644 --- a/desktop/plugins/public/ui-debugger/components/Controls.tsx +++ b/desktop/plugins/public/ui-debugger/components/Controls.tsx @@ -24,6 +24,7 @@ import { MoreOutlined, PauseCircleOutlined, PlayCircleOutlined, + SearchOutlined, } from '@ant-design/icons'; import {usePlugin, useValue, Layout} from 'flipper-plugin'; import {FrameworkEventType} from '../types'; @@ -51,6 +52,8 @@ export const Controls: React.FC = () => { instance.uiState.searchTerm.set(e.target.value)} + prefix={} + placeholder="Search" />