From ba9a80545d206284f63c6b48cbb8878fbf050d76 Mon Sep 17 00:00:00 2001 From: Andrey Goncharov Date: Thu, 31 Mar 2022 04:01:33 -0700 Subject: [PATCH] Support globally installed React DevTools Summary: - Support loading globally installed DevTools Background: 1. Initially, I wanted to use react-devtools-core as before. react-devtools-core standalone contains quite a few imports of node.js APIs. After [a conversation with Brian](https://fb.workplace.com/groups/react.devtools/permalink/3131548550392044), I pivoted to react-devtools-inline 2. Technical design doc of react-devtools-inline integration: https://docs.google.com/document/d/1STUSUhXzrW_KkvqSu7Ge-rxjVFF7oU3_NbwzimkO_Z4 3. We support usage of globally installed devtools. Code of react-devtools-inline is not ready to be used by the browser as is. We need to bundle it and substitute React and ReactDOM imports with the globals. 4. As we can't pre-compile what users install globally, we need to bundle global devtools on demand, 5. I tried re-using our Metro bundling pipeline initially, but gave up after fighting it for 2 days. Included, `rollup` instead. 6. Size of a `tgz` archive with a plugin is 2.1MB allow-large-files Reviewed By: mweststrate Differential Revision: D34968770 fbshipit-source-id: 352299964ccc195b8677dbda47db84ffaf38737b --- .../plugin-flipper-requires.node.tsx | 8 + .../src/electron-requires.tsx | 3 + .../src/fsevents-dynamic-imports.tsx | 34 ++++ .../src/plugin-flipper-requires.tsx | 5 +- .../src/replace-flipper-requires.tsx | 2 + .../babel-transformer/src/transform-app.tsx | 1 + .../babel-transformer/src/transform-main.tsx | 6 +- .../src/transform-plugin.tsx | 1 + .../src/transform-server-add-on.tsx | 1 + .../src/transform-server-dev.tsx | 1 + .../src/transform-server-prod.tsx | 1 + desktop/flipper-common/src/ServerAddOn.tsx | 7 +- desktop/flipper-server-core/package.json | 3 +- desktop/flipper-server-core/tsconfig.json | 3 + desktop/flipper-ui-core/package.json | 2 + .../src/dispatcher/plugins.tsx | 4 + .../plugins/public/reactdevtools/index.tsx | 41 +++-- .../plugins/public/reactdevtools/package.json | 3 + .../public/reactdevtools/serverAddOn.tsx | 30 +++- desktop/plugins/public/yarn.lock | 150 ++++++++++++++++++ desktop/yarn.lock | 7 + 21 files changed, 285 insertions(+), 28 deletions(-) create mode 100644 desktop/babel-transformer/src/fsevents-dynamic-imports.tsx diff --git a/desktop/babel-transformer/src/__tests__/plugin-flipper-requires.node.tsx b/desktop/babel-transformer/src/__tests__/plugin-flipper-requires.node.tsx index 83f715b8c..12802ab02 100644 --- a/desktop/babel-transformer/src/__tests__/plugin-flipper-requires.node.tsx +++ b/desktop/babel-transformer/src/__tests__/plugin-flipper-requires.node.tsx @@ -34,6 +34,14 @@ test('transform react-dom requires to global object', () => { expect(code).toBe('global.ReactDOM;'); }); +test('transform react-dom/client requires to global object', () => { + const src = 'require("react-dom/client")'; + const ast = parse(src); + const transformed = transformFromAstSync(ast, src, babelOptions)!.ast; + const {code} = generate(transformed!); + expect(code).toBe('global.ReactDOMClient;'); +}); + test('transform flipper requires to global object', () => { const src = 'require("flipper")'; const ast = parse(src); diff --git a/desktop/babel-transformer/src/electron-requires.tsx b/desktop/babel-transformer/src/electron-requires.tsx index 04a21078b..4adca0f06 100644 --- a/desktop/babel-transformer/src/electron-requires.tsx +++ b/desktop/babel-transformer/src/electron-requires.tsx @@ -45,6 +45,9 @@ export const BUILTINS = [ 'v8', 'repl', 'timers', + 'perf_hooks', + 'fsevents', + './fsevents.node', // MWE node-fetch looks strange here, not sure what the effect of changing that would be 'node-fetch', // jest is referred to in source code, like in TestUtils, but we don't want to ever bundle it up! diff --git a/desktop/babel-transformer/src/fsevents-dynamic-imports.tsx b/desktop/babel-transformer/src/fsevents-dynamic-imports.tsx new file mode 100644 index 000000000..25b162568 --- /dev/null +++ b/desktop/babel-transformer/src/fsevents-dynamic-imports.tsx @@ -0,0 +1,34 @@ +/** + * 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 {CallExpression, identifier} from '@babel/types'; +import {NodePath} from '@babel/traverse'; +module.exports = () => ({ + name: 'skip-fsevents-dynamic-imports-on-win-and-linux', + visitor: { + CallExpression(path: NodePath) { + if (process.platform === 'darwin') { + return; + } + + const node = path.node; + if ( + node.type === 'CallExpression' && + node.callee.type === 'Import' && + node.arguments.length === 1 && + node.arguments[0].type === 'StringLiteral' + ) { + const source = node.arguments[0].value; + if (source === 'fsevents') { + path.replaceWith(identifier('triggerReferenceError')); + } + } + }, + }, +}); diff --git a/desktop/babel-transformer/src/plugin-flipper-requires.tsx b/desktop/babel-transformer/src/plugin-flipper-requires.tsx index 4735b5af7..a3eb664d7 100644 --- a/desktop/babel-transformer/src/plugin-flipper-requires.tsx +++ b/desktop/babel-transformer/src/plugin-flipper-requires.tsx @@ -17,10 +17,7 @@ import { } from './replace-flipper-requires'; // do not apply this transform for these paths -const EXCLUDE_PATHS = [ - '/node_modules/react-devtools-core/', - 'relay-devtools/DevtoolsUI', -]; +const EXCLUDE_PATHS = ['relay-devtools/DevtoolsUI']; function isExcludedPath(path: string) { for (const epath of EXCLUDE_PATHS) { if (path.indexOf(epath) > -1) { diff --git a/desktop/babel-transformer/src/replace-flipper-requires.tsx b/desktop/babel-transformer/src/replace-flipper-requires.tsx index c7885049b..6807b4461 100644 --- a/desktop/babel-transformer/src/replace-flipper-requires.tsx +++ b/desktop/babel-transformer/src/replace-flipper-requires.tsx @@ -21,6 +21,8 @@ const requireReplacements: any = { 'flipper-plugin': 'global.FlipperPlugin', react: 'global.React', 'react-dom': 'global.ReactDOM', + 'react-dom/client': 'global.ReactDOMClient', + 'react-is': 'global.ReactIs', antd: 'global.antd', immer: 'global.Immer', '@emotion/styled': 'global.emotion_styled', diff --git a/desktop/babel-transformer/src/transform-app.tsx b/desktop/babel-transformer/src/transform-app.tsx index 9486afe12..022d3ae11 100644 --- a/desktop/babel-transformer/src/transform-app.tsx +++ b/desktop/babel-transformer/src/transform-app.tsx @@ -12,6 +12,7 @@ import {default as getCacheKey} from './get-cache-key'; const presets = [require('@babel/preset-react')]; const plugins = [ + require('./fsevents-dynamic-imports'), require('./electron-requires'), require('./import-react'), require('./app-flipper-requires'), diff --git a/desktop/babel-transformer/src/transform-main.tsx b/desktop/babel-transformer/src/transform-main.tsx index 95f39bf09..3fa716ae4 100644 --- a/desktop/babel-transformer/src/transform-main.tsx +++ b/desktop/babel-transformer/src/transform-main.tsx @@ -17,7 +17,11 @@ const presets = [ {targets: {electron: flipperEnv.FLIPPER_ELECTRON_VERSION}}, ], ]; -const plugins = [require('./electron-requires-main'), require('./fb-stubs')]; +const plugins = [ + require('./fsevents-dynamic-imports'), + require('./electron-requires-main'), + require('./fb-stubs'), +]; module.exports = { transform, diff --git a/desktop/babel-transformer/src/transform-plugin.tsx b/desktop/babel-transformer/src/transform-plugin.tsx index a4a68a80d..d8ad39836 100644 --- a/desktop/babel-transformer/src/transform-plugin.tsx +++ b/desktop/babel-transformer/src/transform-plugin.tsx @@ -11,6 +11,7 @@ import {default as doTransform} from './transform'; const presets = [require('@babel/preset-react')]; const plugins = [ + require('./fsevents-dynamic-imports'), require('./electron-requires'), require('./plugin-flipper-requires'), require('./fb-stubs'), diff --git a/desktop/babel-transformer/src/transform-server-add-on.tsx b/desktop/babel-transformer/src/transform-server-add-on.tsx index 476b15586..071e68069 100644 --- a/desktop/babel-transformer/src/transform-server-add-on.tsx +++ b/desktop/babel-transformer/src/transform-server-add-on.tsx @@ -24,6 +24,7 @@ const presets = [ ]; const plugins = [ + require('./fsevents-dynamic-imports'), require('./electron-requires'), require('./plugin-flipper-requires'), require('./fb-stubs'), diff --git a/desktop/babel-transformer/src/transform-server-dev.tsx b/desktop/babel-transformer/src/transform-server-dev.tsx index 505238e3c..49c77e79b 100644 --- a/desktop/babel-transformer/src/transform-server-dev.tsx +++ b/desktop/babel-transformer/src/transform-server-dev.tsx @@ -23,6 +23,7 @@ const presets = [ // In DEV builds, we keep node_modules as is, as to not waste resources on trying to bundle them const plugins = [ + require('./fsevents-dynamic-imports'), require('./electron-requires-server'), require('./plugin-flipper-requires'), require('./fb-stubs'), diff --git a/desktop/babel-transformer/src/transform-server-prod.tsx b/desktop/babel-transformer/src/transform-server-prod.tsx index c84d8fe3c..ee05a96e6 100644 --- a/desktop/babel-transformer/src/transform-server-prod.tsx +++ b/desktop/babel-transformer/src/transform-server-prod.tsx @@ -27,6 +27,7 @@ const presets = [ // electron-requires makes sure that *only* requires of built in node_modules are using "electronRequire" // (which effectively makes them external, as electronRequire === require, but not rolled up with Metro) const plugins = [ + require('./fsevents-dynamic-imports'), require('./electron-requires'), require('./plugin-flipper-requires'), require('./fb-stubs'), diff --git a/desktop/flipper-common/src/ServerAddOn.tsx b/desktop/flipper-common/src/ServerAddOn.tsx index 2de78cef3..ee3649b73 100644 --- a/desktop/flipper-common/src/ServerAddOn.tsx +++ b/desktop/flipper-common/src/ServerAddOn.tsx @@ -77,10 +77,15 @@ export interface FlipperServerForServerAddOn extends FlipperServer { } export type ServerAddOnCleanup = () => Promise; + +export type ServerAddOnExtras = { + flipperServer: FlipperServerForServerAddOn; +}; + export type ServerAddOn< Events extends EventsContract, Methods extends MethodsContract, > = ( connection: ServerAddOnPluginConnection, - {flipperServer}: {flipperServer: FlipperServerForServerAddOn}, + extras: ServerAddOnExtras, ) => Promise; diff --git a/desktop/flipper-server-core/package.json b/desktop/flipper-server-core/package.json index b8241e4ba..e221d28c4 100644 --- a/desktop/flipper-server-core/package.json +++ b/desktop/flipper-server-core/package.json @@ -55,8 +55,7 @@ "@types/tmp": "^0.2.3", "@types/which": "^2.0.1", "@types/ws": "^8.5.2", - "memorystream": "^0.3.1", - "tmp": "^0.2.1" + "memorystream": "^0.3.1" }, "peerDependencies": {}, "scripts": { diff --git a/desktop/flipper-server-core/tsconfig.json b/desktop/flipper-server-core/tsconfig.json index 9d2a11e6b..c14e3fc45 100644 --- a/desktop/flipper-server-core/tsconfig.json +++ b/desktop/flipper-server-core/tsconfig.json @@ -23,6 +23,9 @@ }, { "path": "../plugin-lib" + }, + { + "path": "../pkg-lib" } ] } diff --git a/desktop/flipper-ui-core/package.json b/desktop/flipper-ui-core/package.json index 4604dc0db..7c52631b8 100644 --- a/desktop/flipper-ui-core/package.json +++ b/desktop/flipper-ui-core/package.json @@ -35,6 +35,7 @@ "react-debounce-render": "^7.0.1", "react-dom": "^0.0.0-experimental-14c2be8da-20220304", "react-element-to-jsx-string": "^14.3.4", + "react-is": "^17.0.2", "react-markdown": "^6.0.3", "react-player": "^2.10.0", "react-redux": "^7.2.6", @@ -54,6 +55,7 @@ "@types/lodash.memoize": "^4.1.6", "@types/react": "^17.0.39", "@types/react-dom": "^17.0.12", + "@types/react-is": "^17.0.3", "@types/react-test-renderer": "^17.0.1", "@types/react-virtualized-auto-sizer": "^1.0.1", "@types/react-window": "^1.8.5", diff --git a/desktop/flipper-ui-core/src/dispatcher/plugins.tsx b/desktop/flipper-ui-core/src/dispatcher/plugins.tsx index fae676fe0..8099c5fb3 100644 --- a/desktop/flipper-ui-core/src/dispatcher/plugins.tsx +++ b/desktop/flipper-ui-core/src/dispatcher/plugins.tsx @@ -16,6 +16,8 @@ import { import {PluginDefinition} from '../plugin'; import React from 'react'; import ReactDOM from 'react-dom'; +import ReactDOMClient from 'react-dom/client'; +import ReactIs from 'react-is'; import { registerPlugins, addGatekeepedPlugins, @@ -61,6 +63,8 @@ export default async (store: Store, _logger: Logger) => { // this list should match `replace-flipper-requires.tsx` and the `builtInModules` in `desktop/.eslintrc` globalObject.React = React; globalObject.ReactDOM = ReactDOM; + globalObject.ReactDOMClient = ReactDOMClient; + globalObject.ReactIs = ReactIs; globalObject.Flipper = deprecatedExports; globalObject.FlipperPlugin = FlipperPluginSDK; globalObject.Immer = Immer; diff --git a/desktop/plugins/public/reactdevtools/index.tsx b/desktop/plugins/public/reactdevtools/index.tsx index 1224e83af..5bff47ed5 100644 --- a/desktop/plugins/public/reactdevtools/index.tsx +++ b/desktop/plugins/public/reactdevtools/index.tsx @@ -7,7 +7,7 @@ * @format */ -import {createRoot} from 'react-dom/client'; +import {createRoot, Root} from 'react-dom/client'; import { Layout, usePlugin, @@ -50,13 +50,17 @@ export function devicePlugin(client: DevicePluginClient) { const globalDevToolsAvailable = createState(false); let globalDevToolsInstance: DevToolsInstance | undefined; - const useGlobalDevTools = createState(false, { - persist: 'useGlobalDevTools', - persistToLocalStorage: true, - }); let devToolsInstance: DevToolsInstance | undefined; - const selectedDevToolsInstanceType = createState('oss'); + const selectedDevToolsInstanceType = createState( + 'oss', + { + persist: 'selectedDevToolsInstanceType', + persistToLocalStorage: true, + }, + ); + + let root: Root | undefined; let pollHandle: NodeJS.Timeout | undefined = undefined; @@ -87,14 +91,17 @@ export function devicePlugin(client: DevicePluginClient) { ); } - if (useGlobalDevTools.get() && globalDevToolsInstance) { + if ( + selectedDevToolsInstanceType.get() === 'global' && + globalDevToolsInstance + ) { console.debug( 'flipper-plugin-react-devtools.maybeGetInitialGlobalDevTools -> using global devtools', ); return globalDevToolsInstance; } - useGlobalDevTools.set(false); // disable in case it was enabled + selectedDevToolsInstanceType.set('oss'); // disable in case it was enabled console.debug( 'flipper-plugin-react-devtools.maybeGetInitialGlobalDevTools -> using OSS devtools', ); @@ -133,7 +140,6 @@ export function devicePlugin(client: DevicePluginClient) { ); return devToolsInstance.type; }); - useGlobalDevTools.update((v) => !v); await rebootDevTools(); } @@ -145,6 +151,14 @@ export function devicePlugin(client: DevicePluginClient) { if (pollHandle) { clearTimeout(pollHandle); } + const devToolsNode = document.getElementById(DEV_TOOLS_NODE_ID); + if (!devToolsNode) { + setStatus(ConnectionStatus.Error, 'Failed to find target DOM Node'); + return; + } + if (root) { + root.unmount(); + } await bootDevTools(); } @@ -216,7 +230,7 @@ export function devicePlugin(client: DevicePluginClient) { store, }); - const root = createRoot(devToolsNode); + root = createRoot(devToolsNode); root.render(React.createElement(DevTools)); console.debug('flipper-plugin-react-devtools -> connected'); @@ -315,7 +329,6 @@ export function devicePlugin(client: DevicePluginClient) { rebootDevTools, metroDevice, globalDevToolsAvailable, - useGlobalDevTools, selectedDevToolsInstanceType, toggleUseGlobalDevTools, initialized, @@ -346,13 +359,15 @@ function DevToolsInstanceToolbar() { const globalDevToolsAvailable = useValue(instance.globalDevToolsAvailable); const connectionStatus = useValue(instance.connectionStatus); const statusMessage = useValue(instance.statusMessage); - const useGlobalDevTools = useValue(instance.useGlobalDevTools); + const selectedDevToolsInstanceType = useValue( + instance.selectedDevToolsInstanceType, + ); const initialized = useValue(instance.initialized); const selectionControl = globalDevToolsAvailable ? ( <> = async ( globalDevToolsPath, ); - // TODO: Transform ReactDevTools for browsers - /* - const globalDevToolsSource = globalDevToolsPath; - return globalDevToolsSource; - */ - return; + const bundle = await rollup({ + input: globalDevToolsPath, + plugins: [resolve(), commonjs()], + external: ['react', 'react-is', 'react-dom/client', 'react-dom'], + }); + + try { + const {output} = await bundle.generate({ + format: 'iife', + globals: { + react: 'global.React', + 'react-is': 'global.ReactIs', + 'react-dom/client': 'global.ReactDOMClient', + 'react-dom': 'global.ReactDOM', + }, + }); + return output[0].code; + } finally { + await bundle.close(); + } }); return async () => { diff --git a/desktop/plugins/public/yarn.lock b/desktop/plugins/public/yarn.lock index ad45cb1f5..d8cddd3b9 100644 --- a/desktop/plugins/public/yarn.lock +++ b/desktop/plugins/public/yarn.lock @@ -109,6 +109,40 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= +"@rollup/plugin-commonjs@^21.0.3": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.3.tgz#287896c64926ef3d7f0013708dcdcc1223576ef0" + integrity sha512-ThGfwyvcLc6cfP/MWxA5ACF+LZCvsuhUq7V5134Az1oQWsiC7lNpLT4mJI86WQunK7BYmpUiHmMk2Op6OAHs0g== + dependencies: + "@rollup/pluginutils" "^3.1.0" + commondir "^1.0.1" + estree-walker "^2.0.1" + glob "^7.1.6" + is-reference "^1.2.1" + magic-string "^0.25.7" + resolve "^1.17.0" + +"@rollup/plugin-node-resolve@^13.1.3": + version "13.1.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz#2ed277fb3ad98745424c1d2ba152484508a92d79" + integrity sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + "@testing-library/dom@^7.28.1": version "7.29.4" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.29.4.tgz#1647c2b478789621ead7a50614ad81ab5ae5b86c" @@ -165,6 +199,16 @@ resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-3.0.1.tgz#98d747a2e5e9a56070c6bf14e27bff56204e34cc" integrity sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g== +"@types/estree@*": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + "@types/hoist-non-react-statics@^3.3.0": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" @@ -240,6 +284,13 @@ resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.5.tgz#36d897708172ac2380cd486da7a3daf1161c1e23" integrity sha512-8k/67Z95Goa6Lznuykxkfhq9YU3l1Qe6LNZmwde1u7802a3x8v44oq0j91DICclxatTr0rNnhXx7+VTIetSrSQ== +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + "@types/sql-formatter@^2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@types/sql-formatter/-/sql-formatter-2.3.0.tgz#d2584c54f865fd57a7fe7e88ee8ed3623b23da33" @@ -366,6 +417,11 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" +builtin-modules@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" + integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -463,6 +519,11 @@ colors@0.5.x: resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" integrity sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q= +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -697,6 +758,11 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -748,6 +814,16 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + eventemitter3@^4.0.1: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -861,6 +937,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +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== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -892,6 +973,18 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global@^4.3.1: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -1024,6 +1117,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -1075,6 +1175,11 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -1089,6 +1194,13 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-reference@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + is-regex@^1.0.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -1222,6 +1334,13 @@ lz-string@^1.4.4: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -1398,6 +1517,11 @@ path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" @@ -1408,6 +1532,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picomatch@^2.2.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -1665,6 +1794,15 @@ 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@^1.17.0, resolve@^1.19.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -1677,6 +1815,13 @@ rimraf@^2.6.3: dependencies: glob "^7.1.3" +rollup@^2.70.1: + version "2.70.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.1.tgz#824b1f1f879ea396db30b0fc3ae8d2fead93523e" + integrity sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA== + optionalDependencies: + fsevents "~2.3.2" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -1813,6 +1958,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.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" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" diff --git a/desktop/yarn.lock b/desktop/yarn.lock index 18489ad73..8b428eedf 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -2735,6 +2735,13 @@ dependencies: "@types/react" "*" +"@types/react-is@^17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-17.0.3.tgz#2d855ba575f2fc8d17ef9861f084acc4b90a137a" + integrity sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw== + dependencies: + "@types/react" "*" + "@types/react-redux@^7.1.20": version "7.1.20" resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.20.tgz#42f0e61ababb621e12c66c96dda94c58423bd7df"