From 98d33b925af97a0b2db1ce1f36b2d5f7989e137b Mon Sep 17 00:00:00 2001 From: vzaidman Date: Sat, 15 Aug 2020 14:43:58 +0300 Subject: [PATCH] version 5 updates: * make logOwnerReasons true by default. * only trackHooks if they are supported. * removed building without .babel-plugin-transform-classes because babel fixed it in their newer versions. removed a mention to this from readme. this closes #5 closes #131. * removed babel-plugin-lodash - we don't really care about the bundle size and also the user of the library might use their own lodash optimizations instead. * we only build a "umd" version now. Since the package is only for development, we don't really care about different build types. * improved readme in general, including the installation tips. this closes #130. --- .eslintrc | 2 +- README.md | 157 +++++++++++------- babel.config.js | 6 +- demo/src/logOwnerReasons/index.js | 2 +- package.json | 8 +- rollup.config.js | 87 +++------- src/normalizeOptions.js | 2 +- src/whyDidYouRender.js | 3 +- tests/hooks/useContext.test.js | 14 +- tests/librariesTests/react-redux.test.js | 12 +- tests/librariesTests/react-router-dom.test.js | 3 +- .../librariesTests/styled-components.test.js | 22 ++- tests/logOwnerReasons.test.js | 3 +- tests/strictMode.test.js | 17 +- yarn.lock | 33 ++-- 15 files changed, 200 insertions(+), 171 deletions(-) diff --git a/.eslintrc b/.eslintrc index 4d12ca9..0cf3c37 100644 --- a/.eslintrc +++ b/.eslintrc @@ -50,6 +50,6 @@ "as": {"before": true, "after": true} }}], "space-before-blocks": ["error", "never"], - "comma-dangle": ["error", "never"], + "comma-dangle": ["error", "never"] } } diff --git a/README.md b/README.md index 0105572..44969fc 100644 --- a/README.md +++ b/README.md @@ -6,27 +6,25 @@ ![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/@welldone-software/why-did-you-render) [![Coverage Status](https://coveralls.io/repos/github/welldone-software/why-did-you-render/badge.svg?branch=add-e2e-tests-using-cypress)](https://coveralls.io/github/welldone-software/why-did-you-render?branch=add-e2e-tests-using-cypress) -`why-did-you-render` by [Welldone Software](https://welldone.software) monkey patches **`React`** to notify you about avoidable re-renders. (Works with **`React Native`** as well.) +`why-did-you-render` by [Welldone Software](https://welldone.software/) monkey patches **`React`** to notify you about avoidable re-renders. (Works with **`React Native`** as well.) -For example, when you pass `style={{width: '100%'}}` to a big pure component and make it always re-render: +For example, if you pass `style={{width: '100%'}}` to a big pure component it would always re-render on every element creation: +```jsx + +``` ![demo](images/demo.png) It can also help you to simply track when and why a certain component re-renders. ## Setup -The last version of the library has been tested with **`React@16.13.1`** but it is expected to work with all `React@16` versions. - -> For versions before 16.8 try turning off hooks support by using `trackHooks: false` in `whyDidYouRender`'s init options.* +The last version of the library has been tested [(unit tests and E2E)]((https://travis-ci.com/welldone-software/why-did-you-render.svg?branch=master)) with **`React@16.13.1`** but it is expected to work with all `React@16` versions. ``` npm install @welldone-software/why-did-you-render --save ``` -## Installation -Execute `whyDidYouRender` **as the first thing that happens in your application** (even before `react-hot-loader`). - -The best way of doing this would be to create a file (lets say `wdyr.js`) near the entrypoint of your application: +Create a `wdyr.js` file and import it as **the first import** in your application. `wdyr.js`: ```jsx @@ -39,11 +37,14 @@ if (process.env.NODE_ENV === 'development') { }); } ``` -And then import `wdyr.js` (even before `react-hot-loader`): + +> **Notice: The library should *NEVER* be used in production because it slows down React** + +Import `wdyr.js` as the first import (even before `react-hot-loader`): `index.js`: ```jsx -import './wdyr'; +import './wdyr'; // <--- first import import 'react-hot-loader'; import {hot} from 'react-hot-loader/root'; @@ -52,15 +53,26 @@ import React from 'react'; import ReactDOM from 'react-dom'; // ... import {App} from './app'; - // ... const HotApp = hot(App); // ... ReactDOM.render(, document.getElementById('root')); ``` -If you use the latest `react-redux` with hooks (or any other custom library), you can also patch it like this: -```js +If you use `trackAllPureComponents` like we suggest, all pure components ([React.PureComponent](https://reactjs.org/docs/react-api.html#reactpurecomponent) or [React.memo](https://reactjs.org/docs/react-api.html#reactmemo)) will be tracked. + +Otherwise, add `whyDidYouRender = true` to components you want to track. + +More information about what is tracked can be found in [Tracking Components](#tracking-components). + +Can't see any WDYR logs? Check out the troubleshoot or search the issues. + +## Custom Hooks + +Also, tracking custom hooks is possible by using `trackExtraHooks`. For example if you want to track `useSelector` from React Redux: + +`wdyr.js`: +```jsx import React from 'react'; if (process.env.NODE_ENV === 'development') { @@ -74,7 +86,8 @@ if (process.env.NODE_ENV === 'development') { }); } ``` -But there is currently a problem with rewriting exports of imported files in `webpack` and a small workaround should be applied to support this feature [#85 - trackExtraHooks cannot set property](https://github.com/welldone-software/why-did-you-render/issues/85) + +> Notice that there's currently a problem with rewriting exports of imported files in `webpack`. A quick workaround can help with it: [#85 - trackExtraHooks cannot set property](https://github.com/welldone-software/why-did-you-render/issues/85). ## Read More * [Why Did You Render Mr. Big Pure React Component???](http://bit.ly/wdyr1) @@ -92,7 +105,7 @@ You can test the library in [the official sandbox](http://bit.ly/wdyr-sb). And another [official sandbox with hooks tracking](https://codesandbox.io/s/why-did-you-render-sandbox-with-hooks-pyi14) ## Tracking Components -You can track all pure components (components that are extending [React.PureComponent](https://reactjs.org/docs/react-api.html#reactpurecomponent), or function components that are wrapped with [React.memo](https://reactjs.org/docs/react-api.html#reactmemo)) using the `trackAllPureComponents: true` option. +You can track all pure components ([React.PureComponent](https://reactjs.org/docs/react-api.html#reactpurecomponent) or [React.memo](https://reactjs.org/docs/react-api.html#reactmemo)) using the `trackAllPureComponents: true` option. You can also manually track any component you want by setting `whyDidYouRender` on them like this: ```js @@ -106,7 +119,7 @@ class BigList extends React.Component { } ``` -And for functional components: +Or for functional components: ```js const BigListPureComponent = props => ( @@ -141,20 +154,12 @@ EnhancedMenu.whyDidYouRender = { - `customName`: - Sometimes the name of the component can be very inconvenient. For example: - - ```js - const EnhancedMenu = withPropsOnChange(withPropsOnChange(withStateHandlers(withPropsOnChange(withState(withPropsOnChange(lifecycle(withPropsOnChange(withPropsOnChange(onlyUpdateForKeys(LoadNamespace(Connect(withState(withState(withPropsOnChange(lifecycle(withPropsOnChange(withHandlers(withHandlers(withHandlers(withHandlers(Connect(lifecycle(Menu))))))))))))))))))))))) - ``` - - will have the display name: + Sometimes the name of the component can be missing or very inconvenient. For example: ```js withPropsOnChange(withPropsOnChange(withStateHandlers(withPropsOnChange(withState(withPropsOnChange(lifecycle(withPropsOnChange(withPropsOnChange(onlyUpdateForKeys(LoadNamespace(Connect(withState(withState(withPropsOnChange(lifecycle(withPropsOnChange(withHandlers(withHandlers(withHandlers(withHandlers(Connect(lifecycle(Menu))))))))))))))))))))))) ``` - - To prevent polluting the console, and any other reason, you can change it using `customName`. - + ## Options Optionally you can pass in `options` as the second parameter. The following options are available: - `include: [RegExp, ...]` (`null` by default) @@ -162,8 +167,8 @@ Optionally you can pass in `options` as the second parameter. The following opti - `trackAllPureComponents: false` - `trackHooks: true` - `trackExtraHooks: []` +- `logOwnerReasons: true` - `logOnDifferentValues: false` -- `logOwnerReasons: false` - `hotReloadBufferMs: 500` - `onlyLogs: false` - `collapseGroups: false` @@ -173,28 +178,34 @@ Optionally you can pass in `options` as the second parameter. The following opti - `notifier: ({Component, displayName, prevProps, prevState, nextProps, nextState, reason, options}) => void` #### include / exclude -You can include or exclude tracking for re-renders for components -by their displayName with the `include` and `exclude` options. +##### (default: `null`) -*Notice: **exclude** takes priority over both `include` and `whyDidYouRender` statics on components.* +You can include or exclude tracking of components by their displayName using the `include` and `exclude` options. -For example, the following code is used to [track all redundant re-renders that are caused by React-Redux](http://bit.ly/wdyr04): +For example, the following code is used to [track all redundant re-renders that are caused by older React-Redux](http://bit.ly/wdyr04): ```js whyDidYouRender(React, { include: [/^ConnectFunction/] }); ``` +> *Notice: **exclude** takes priority over both `include` and manually set `whyDidYouRender = `* #### trackAllPureComponents +##### (default: `false`) + You can track all pure components (both `React.memo` and `React.PureComponent` components) -*Notice: You can exclude the tracking of any specific component with `whyDidYouRender = false`.* +> *Notice: You can exclude the tracking of any specific component with `whyDidYouRender = false`* #### trackHooks +##### (default: `true`) + You can turn off tracking of hooks changes. [Understand and fix hook issues](http://bit.ly/wdyr3). #### trackExtraHooks -Adding extra hooks to track for "redundant" results: +##### (default: `[]`) + +Track custom hooks: ```js whyDidYouRender(React, { @@ -204,60 +215,80 @@ whyDidYouRender(React, { }); ``` -> There is currently a problem with rewriting exports of imported files in webpack. +> There is currently a problem with rewriting exports of imported files in webpack. A workaround is available here: [#85 - trackExtraHooks cannot set property](https://github.com/welldone-software/why-did-you-render/issues/85) -> To see available workarounds check out the discussion at bug [#85 - trackExtraHooks cannot set property](https://github.com/welldone-software/why-did-you-render/issues/85) +#### logOwnerReasons +##### (default: `true`) + +One way of fixing re-render issues is preventing the component's owner from re-rendering. + +This option is `true` by default and it lets you view the reasons why an owner component re-renders. + +![demo](images/logOwnerReasons.png) #### logOnDifferentValues -Normally, you only want notifications about component re-renders when their props and state -are the same, because it means these re-renders could have been avoided. But you can also track -all re-renders, even on different state/props. +##### (default: `false`) + +Normally, you only want logs about component re-renders when they could have been avoided. +With this option, it is possible to track all re-renders. + +For example: ```js render() render() -// this will only cause whyDidYouRender notifications for {logOnDifferentValues: true} +// will only log if you use {logOnDifferentValues: true} ``` -#### logOwnerReasons -One way of fixing re-render issues is preventing the component's owner from re-rendering. -To make that easier, you can use `logOwnerReasons: true` to view the reasons why owner component re-renders. -![demo](images/logOwnerReasons.png) - #### hotReloadBufferMs +##### (default: `500`) + Time in milliseconds to ignore updates after a hot reload is detected. -We can't currently know exactly if a render was triggered by hot reload, -so instead, we ignore all updates for `hotReloadBufferMs` (default: 500) after a hot reload. +When a hot reload is detected, we ignore all updates for `hotReloadBufferMs` to not spam the console. #### onlyLogs -If you don't want to use `console.group` to group logs by component, you can print them as simple logs. +##### (default: `false`) + +If you don't want to use `console.group` to group logs you can print them as simple logs. #### collapseGroups -Grouped logs can start collapsed: +##### (default: `false`) + +Grouped logs can be collapsed. #### titleColor / diffNameColor / diffPathColor +##### (default titleColor: `'#058'`) +##### (default diffNameColor: `'blue'`) +##### (default diffPathColor: `'red'`) + Controls the colors used in the console notifications #### notifier +##### (default: defaultNotifier that is exposed from the library) + You can create a custom notifier if the default one does not suite your needs. ## Troubleshooting -### `Class constructors must be invoked with 'new'`. -If you are building for latest browsers (or using es6 classes without building) you don't transpile the "class" keyword. - -This causes an error because the library uses transpiled classes, and [transpiled classes currently can't extend native classes](https://github.com/welldone-software/why-did-you-render/issues/5). - -To fix this, use the "no-classes-transpile" dist: -```js -import React from 'react'; - -if (process.env.NODE_ENV === 'development') { - const whyDidYouRender = require('@welldone-software/why-did-you-render/dist/no-classes-transpile/umd/whyDidYouRender.min.js'); - whyDidYouRender(React); -} -``` +### No tracking +* If you are in production, WDYR is probably disabled. +* Maybe no component is tracked + * Check out [Tracking Components](#tracking-components) once again. + * If you track all pure components ([React.PureComponent](https://reactjs.org/docs/react-api.html#reactpurecomponent) or [React.memo](https://reactjs.org/docs/react-api.html#reactmemo)), maybe your none of your components are not pure. +* Maybe you have no issues + * Try causing an issue by temporary rendering the whole app twice in it's entry point: + + `index.js`: + ```jsx + const HotApp = hot(App); + HotApp.whyDidYouRender = true; + ReactDOM.render(, document.getElementById('root')); + ReactDOM.render(, document.getElementById('root')); + ``` + +### Custom Hooks tracking (like useSelector) +There's currently a problem with rewriting exports of imported files in `webpack`. A quick workaround can help with it: [#85 - trackExtraHooks cannot set property](https://github.com/welldone-software/why-did-you-render/issues/85). ### React-Redux `connect` HOC is spamming the console Since `connect` hoists statics, if you add WDYR to the inner component, it is also added to the HOC component where complex hooks are running. diff --git a/babel.config.js b/babel.config.js index e6b4708..2724fbb 100644 --- a/babel.config.js +++ b/babel.config.js @@ -8,17 +8,13 @@ module.exports = function(api){ const presets = [ ['@babel/preset-env', { - modules: isTest ? 'commonjs' : false, - exclude: compact([ - isProd && 'babel-plugin-transform-classes' - ]) + modules: isTest ? 'commonjs' : false }], '@babel/preset-react' ] const plugins = compact([ (!isProd && !isTest) && 'react-hot-loader/babel', - 'babel-plugin-lodash', !isProd && '@babel/plugin-proposal-class-properties' ]) diff --git a/demo/src/logOwnerReasons/index.js b/demo/src/logOwnerReasons/index.js index abf5931..c5f95ab 100644 --- a/demo/src/logOwnerReasons/index.js +++ b/demo/src/logOwnerReasons/index.js @@ -8,7 +8,7 @@ export default { fn({domElement, whyDidYouRender}){ const stepLogger = createStepLogger() - whyDidYouRender(React, {logOwnerReasons: true}) + whyDidYouRender(React) const Child = () => null Child.whyDidYouRender = true diff --git a/package.json b/package.json index 1b4a5c8..3af7046 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,7 @@ "version": "4.3.1", "description": "Monkey patches React to notify you about avoidable re-renders.", "types": "types.d.ts", - "main": "dist/cjs/whyDidYouRender.min.js", - "module": "dist/esm/whyDidYouRender.min.js", - "browser": "dist/umd/whyDidYouRender.min.js", - "main-no-classes-transpile": "dist/no-classes-transpile/cjs/whyDidYouRender.min.js", - "module-no-classes-transpile": "dist/no-classes-transpile/esm/whyDidYouRender.min.js", - "browser-no-classes-transpile": "dist/no-classes-transpile/umd/whyDidYouRender.min.js", + "main": "dist/whyDidYouRender.min.js", "files": [ "src", "dist", @@ -83,7 +78,6 @@ "astring": "^1.4.3", "babel-core": "^7.0.0-bridge.0", "babel-jest": "^26.2.2", - "babel-plugin-lodash": "^3.3.4", "concurrently": "^5.3.0", "coveralls": "^3.1.0", "create-react-class": "^15.6.3", diff --git a/rollup.config.js b/rollup.config.js index 0b8fd47..f005a17 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,4 +1,3 @@ -import {flatMap, compact} from 'lodash' import resolve from 'rollup-plugin-node-resolve' import commonjs from '@rollup/plugin-commonjs' import babel from '@rollup/plugin-babel' @@ -14,66 +13,32 @@ Generated by <%= pkg.authors[0] %> Generated at <%= moment().format('YYYY-MM-DD') %> ` -export default flatMap(['none', 'shouldMinify', 'noClassesTranspile', 'both'], buildMode => { - const shouldMinify = buildMode === 'shouldMinify' || buildMode === 'both' - const shouldTranspileClasses = buildMode === 'none' || buildMode === 'both' - - const babelPlugins = compact([ - shouldTranspileClasses && '@babel/plugin-transform-classes' - ]) - - return [ +export default { + input: 'src/index.js', + external: ['lodash'], + output: [ { - input: 'src/index.js', - external: importName => [/lodash/].some(libRegexp => libRegexp.test(importName)), - output: [ - { - name: 'whyDidYouRender', - file: (shouldTranspileClasses ? pkg.browser : pkg['browser-no-classes-transpile']) - .replace('.min', shouldMinify ? '.min' : ''), - format: 'umd', - sourcemap: shouldMinify, - sourcemapFile: pkg.browser.replace('.js', '.js.map'), - exports: 'default', - globals: importName => { - if(importName === 'lodash'){ - return 'lodash' - } - if(/lodash/.test(importName)){ - return `lodash.${importName.slice('lodash'.length + 1)}` - } - } - }, - { - file: (shouldTranspileClasses ? pkg.main : pkg['main-no-classes-transpile']) - .replace('.min', shouldMinify ? '.min' : ''), - format: 'cjs', - sourcemap: shouldMinify, - sourcemapFile: pkg.main.replace('.js', '.js.map'), - exports: 'default' - }, - { - file: (shouldTranspileClasses ? pkg.module : pkg['module-no-classes-transpile']) - .replace('.min', shouldMinify ? '.min' : ''), - format: 'esm', - sourcemap: shouldMinify, - sourcemapFile: pkg.module.replace('.js', '.js.map') - } - ], - plugins: [ - babel({ - exclude: 'node_modules/**', - plugins: babelPlugins, - babelHelpers: 'bundled' - }), - resolve(), - commonjs(), - shouldMinify && terser(), - license({ - sourcemap: true, - banner - }) - ] + name: 'whyDidYouRender', + file: pkg.main, + format: 'umd', + sourcemap: true, + exports: 'default', + globals: { + lodash: 'lodash' + } } + ], + plugins: [ + babel({ + exclude: 'node_modules/**', + babelHelpers: 'bundled' + }), + resolve(), + commonjs(), + terser(), + license({ + sourcemap: true, + banner + }) ] -}) +} diff --git a/src/normalizeOptions.js b/src/normalizeOptions.js index b7a7aa5..cc7f990 100644 --- a/src/normalizeOptions.js +++ b/src/normalizeOptions.js @@ -30,7 +30,7 @@ export default function normalizeOptions(userOptions = {}){ consoleGroup, consoleGroupEnd, logOnDifferentValues: false, - logOwnerReasons: false, + logOwnerReasons: true, trackHooks: true, titleColor: '#058', diffNameColor: 'blue', diff --git a/src/whyDidYouRender.js b/src/whyDidYouRender.js index 77d310e..ba724d2 100644 --- a/src/whyDidYouRender.js +++ b/src/whyDidYouRender.js @@ -221,7 +221,8 @@ export default function whyDidYouRender(React, userOptions){ Object.assign(React.cloneElement, origCloneElement) - if(options.trackHooks){ + const hooksSupported = !!React.useState + if(options.trackHooks && hooksSupported){ const nativeHooks = Object.entries(hooksConfig).map(([hookName, hookTrackingConfig]) => { return [React, hookName, hookTrackingConfig] }) diff --git a/tests/hooks/useContext.test.js b/tests/hooks/useContext.test.js index 3f536f3..85a0e96 100644 --- a/tests/hooks/useContext.test.js +++ b/tests/hooks/useContext.test.js @@ -135,7 +135,19 @@ describe('hooks - useContext', () => { hookDifferences: false, propsDifferences: [], stateDifferences: false, - ownerDifferences: false + ownerDifferences: { + hookDifferences: [{ + differences: [{ + diffType: diffTypes.deepEquals, + pathString: '', + nextValue: {c: 'c'}, + prevValue: {c: 'c'} + }], + hookName: 'useState' + }], + propsDifferences: false, + stateDifferences: false + } }) expect(updateInfos[1].reason).toEqual({ hookDifferences: [{ diff --git a/tests/librariesTests/react-redux.test.js b/tests/librariesTests/react-redux.test.js index 74b552d..89a33b8 100644 --- a/tests/librariesTests/react-redux.test.js +++ b/tests/librariesTests/react-redux.test.js @@ -103,7 +103,11 @@ describe('react-redux - simple', () => { ], stateDifferences: false, hookDifferences: false, - ownerDifferences: false + ownerDifferences: { + hookDifferences: false, + propsDifferences: false, + stateDifferences: false + } }) }) @@ -142,7 +146,11 @@ describe('react-redux - simple', () => { ], stateDifferences: false, hookDifferences: false, - ownerDifferences: false + ownerDifferences: { + hookDifferences: false, + propsDifferences: false, + stateDifferences: false + } }) }) }) diff --git a/tests/librariesTests/react-router-dom.test.js b/tests/librariesTests/react-router-dom.test.js index d29ed57..bb185f0 100644 --- a/tests/librariesTests/react-router-dom.test.js +++ b/tests/librariesTests/react-router-dom.test.js @@ -13,8 +13,7 @@ beforeEach(() => { updateInfos = [] whyDidYouRender(React, { notifier: updateInfo => updateInfos.push(updateInfo), - trackAllPureComponents: true, - logOwnerReasons: true + trackAllPureComponents: true }) }) diff --git a/tests/librariesTests/styled-components.test.js b/tests/librariesTests/styled-components.test.js index 827b570..d2100fb 100644 --- a/tests/librariesTests/styled-components.test.js +++ b/tests/librariesTests/styled-components.test.js @@ -102,7 +102,16 @@ test('styled-components with forward ref', () => { }], stateDifferences: false, hookDifferences: false, - ownerDifferences: false + ownerDifferences: { + hookDifferences: false, + propsDifferences: [{ + pathString: 'a', + diffType: diffTypes.deepEquals, + prevValue: [], + nextValue: [] + }], + stateDifferences: false + } }) }) @@ -139,6 +148,15 @@ test('styled-components with memoized forward ref', () => { }], stateDifferences: false, hookDifferences: false, - ownerDifferences: false + ownerDifferences: { + hookDifferences: false, + propsDifferences: [{ + pathString: 'a', + diffType: diffTypes.deepEquals, + prevValue: [], + nextValue: [] + }], + stateDifferences: false + } }) }) diff --git a/tests/logOwnerReasons.test.js b/tests/logOwnerReasons.test.js index 02e7bfd..ca5e1b7 100644 --- a/tests/logOwnerReasons.test.js +++ b/tests/logOwnerReasons.test.js @@ -8,8 +8,7 @@ let updateInfos = [] beforeEach(() => { updateInfos = [] whyDidYouRender(React, { - notifier: updateInfo => updateInfos.push(updateInfo), - logOwnerReasons: true + notifier: updateInfo => updateInfos.push(updateInfo) }) }) diff --git a/tests/strictMode.test.js b/tests/strictMode.test.js index b4d262c..4f36f86 100644 --- a/tests/strictMode.test.js +++ b/tests/strictMode.test.js @@ -188,7 +188,11 @@ test('Strict mode- functional component no props change', () => { propsDifferences: [], stateDifferences: false, hookDifferences: false, - ownerDifferences: false + ownerDifferences: { + hookDifferences: false, + propsDifferences: [], + stateDifferences: false + } }) }) @@ -220,7 +224,16 @@ test('Strict mode- functional component with props change', () => { }], stateDifferences: false, hookDifferences: false, - ownerDifferences: false + ownerDifferences: { + hookDifferences: false, + propsDifferences: [{ + pathString: 'a', + diffType: diffTypes.deepEquals, + prevValue: [], + nextValue: [] + }], + stateDifferences: false + } }) }) diff --git a/yarn.lock b/yarn.lock index 4ce0868..61fb9dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -185,7 +185,7 @@ dependencies: "@babel/types" "^7.11.0" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.7.4": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.7.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== @@ -955,7 +955,7 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== @@ -1900,17 +1900,6 @@ babel-plugin-jest-hoist@^26.2.0: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-lodash@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz#4f6844358a1340baed182adbeffa8df9967bc196" - integrity sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg== - dependencies: - "@babel/helper-module-imports" "^7.0.0-beta.49" - "@babel/types" "^7.0.0-beta.49" - glob "^7.1.1" - lodash "^4.17.10" - require-package-name "^2.0.1" - "babel-plugin-styled-components@>= 1": version "1.11.1" resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.11.1.tgz#5296a9e557d736c3186be079fff27c6665d63d76" @@ -4617,7 +4606,16 @@ jest-watcher@^26.2.0: jest-util "^26.2.0" string-length "^4.0.1" -jest-worker@^26.0.0, jest-worker@^26.2.1: +jest-worker@^26.0.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.3.0.tgz#7c8a97e4f4364b4f05ed8bca8ca0c24de091871f" + integrity sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^26.2.1: version "26.2.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.2.1.tgz#5d630ab93f666b53f911615bc13e662b382bd513" integrity sha512-+XcGMMJDTeEGncRb5M5Zq9P7K4sQ1sirhjdOxsN1462h6lFo9w59bl2LVQmdGEEeU3m+maZCkS2Tcc9SfCHO4A== @@ -4909,7 +4907,7 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@4.17.19, lodash@^4, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: +lodash@4.17.19, lodash@^4, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== @@ -6106,11 +6104,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -require-package-name@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" - integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"