From 73a73c7b13a77aeef2814910ac8921c1ecec8f9d Mon Sep 17 00:00:00 2001 From: Josh Black Date: Fri, 4 Dec 2020 10:06:40 -0600 Subject: [PATCH] chore(project): remove react-hooks package (#7396) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .yarn/offline-mirror/is-reference-1.1.4.tgz | Bin 2110 -> 0 bytes .../rollup-plugin-commonjs-10.1.0.tgz | Bin 55220 -> 0 bytes .../rollup-plugin-node-resolve-5.2.0.tgz | Bin 10591 -> 0 bytes packages/react-hooks/.npmignore | 4 - packages/react-hooks/.storybook/_styles.scss | 9 -- packages/react-hooks/.storybook/addons.js | 10 -- packages/react-hooks/.storybook/config.js | 17 -- .../react-hooks/.storybook/webpack.config.js | 48 ------ packages/react-hooks/package.json | 60 ------- packages/react-hooks/rollup.config.js | 55 ------- .../src/__tests__/useAnnouncer-test.js | 95 ----------- .../src/__tests__/useDebounce-test.js | 112 ------------- .../react-hooks/src/__tests__/useId-test.js | 70 -------- .../src/__tests__/usePortalNode-test.js | 89 ----------- packages/react-hooks/src/index.js | 10 -- packages/react-hooks/src/test-helpers.js | 33 ---- .../react-hooks/src/useAnnouncer-story.js | 127 --------------- packages/react-hooks/src/useAnnouncer.js | 100 ------------ packages/react-hooks/src/useDebounce-story.js | 86 ---------- packages/react-hooks/src/useDebounce.js | 149 ------------------ packages/react-hooks/src/useId-story.js | 46 ------ packages/react-hooks/src/useId.js | 38 ----- .../react-hooks/src/usePortalNode-story.js | 37 ----- packages/react-hooks/src/usePortalNode.js | 73 --------- packages/react-hooks/src/useThrottle.js | 28 ---- yarn.lock | 37 +---- 26 files changed, 4 insertions(+), 1329 deletions(-) delete mode 100644 .yarn/offline-mirror/is-reference-1.1.4.tgz delete mode 100644 .yarn/offline-mirror/rollup-plugin-commonjs-10.1.0.tgz delete mode 100644 .yarn/offline-mirror/rollup-plugin-node-resolve-5.2.0.tgz delete mode 100644 packages/react-hooks/.npmignore delete mode 100644 packages/react-hooks/.storybook/_styles.scss delete mode 100644 packages/react-hooks/.storybook/addons.js delete mode 100644 packages/react-hooks/.storybook/config.js delete mode 100644 packages/react-hooks/.storybook/webpack.config.js delete mode 100644 packages/react-hooks/package.json delete mode 100644 packages/react-hooks/rollup.config.js delete mode 100644 packages/react-hooks/src/__tests__/useAnnouncer-test.js delete mode 100644 packages/react-hooks/src/__tests__/useDebounce-test.js delete mode 100644 packages/react-hooks/src/__tests__/useId-test.js delete mode 100644 packages/react-hooks/src/__tests__/usePortalNode-test.js delete mode 100644 packages/react-hooks/src/index.js delete mode 100644 packages/react-hooks/src/test-helpers.js delete mode 100644 packages/react-hooks/src/useAnnouncer-story.js delete mode 100644 packages/react-hooks/src/useAnnouncer.js delete mode 100644 packages/react-hooks/src/useDebounce-story.js delete mode 100644 packages/react-hooks/src/useDebounce.js delete mode 100644 packages/react-hooks/src/useId-story.js delete mode 100644 packages/react-hooks/src/useId.js delete mode 100644 packages/react-hooks/src/usePortalNode-story.js delete mode 100644 packages/react-hooks/src/usePortalNode.js delete mode 100644 packages/react-hooks/src/useThrottle.js diff --git a/.yarn/offline-mirror/is-reference-1.1.4.tgz b/.yarn/offline-mirror/is-reference-1.1.4.tgz deleted file mode 100644 index 3f4c105f9d839da2fd0051ff5ffef51d0e2a9f07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2110 zcmV-E2*LLsiwFP!000006YW}CbKABO&a3$=Ht|d(xi%$PianLb=QOQ-8qXwcCrO_? z?g%0w2{vy9Kwrkye?PkbNs%%Y$%&79IwQPT1irn2!0xw_6Xsp932!I%uY0ND=*1I{ zPN#Fw??c@@j{WYzKD_9?Ip}n|2L~O*;fFW-O!e&y^=dqO+9~uDJ|F#NlSj^^{9s z5xo8M8KT(dAQUiIP#ZE~Bz>WDyKEKDUxtYNG~o3Zt_qmGOSmdf=BX_rpWnK^t24}4 z1O{`C50D{uat%-s-PyqvBZ*5FM%qS7^7j_5xzc1YjJ+w#b&OIG_%tiyAV?F~^WgPs z(8`0oJst{u!o7e=MmzRv6x`)viR8JuC<#HP5m-(0^@K_O#r1R)2sJfYGni3{fSCyZ zA+ZuVmUpEXFj_)Sgw9o^GRS7Wn`)h?LA#Bgr|HP`;;{Wuc+f-A zbRwcXw$dT!6{V@fpfIWy<)&Ul+q9$DRQ|Mc$dFF&8Y z|Mh1#^q<iu_|-?a#YzJqZr@t9g(FQUmB%-(gJ z;W&O)w(17ZC1n*)aoNqhEiB)X zU7E}-pGClez$)K``L0ATJVR2aO+p-+P25F7ugMwEH!)mc@1h{YGYKP{!30N%)@D_d z3+#I#bdpNUN0^J^F(@xiIBI9XokBBQdoDCTPbs^yFu~>ru!lfv(H_5@GE|O9%*9kk zS>!Cj^B)8z7nyAsF*S9lix76DdOl2eB=@_*tl>DP)&iu84$1jjBB-^Q7f(`jsoI9Y zw$N7}&MUNaWxB4QTa{x(?*Q8*e4R6Vb&~&?3dx($Fvc46s&W)bFMuj~OW;xluHeht zVcDvZUd<5+_FuVY};5j8DU!!7vFyGte&~dOe-1HhNM_&Jze9Q7AHdfaE z!^QgF+tmMO8bw(x=YVnwXk}kMP@-7KG9P$2;_|eh@QoZx!;)5bX=E^&Cn=S(*RLNK za#r=c9Utdwb_dH@%HP4dyId zz~r$m24*_wwGV|MtT$7EY^>?JE}m$>KekIYtlB&l?J~{OhVb6@wV(2~wl;Os09K9V_5X>A|BF@izt`D+ z^Pv8Bd!0@Fe~!^C2tacZ#3L5$;?45t*CNwhP;JBx(_S%UYp^X=4f6w+UA8~g!An|A zBcCb?_Z#r_f9~4&^hCQEm1Ci-Y39csF}? zt36y{8%f5jsiy*a^Lg}?FB_?%?-8ZI@UXAhT8kWQQBqo$9c|?q?W^h0md%9AtS%6w z!d`_T6|*HzY{D&8mT;ts0Y4#2TJFTR)1+FT*XBtpJo{RrRO8gQFr{_9Tuzl1 zHLSsvYGQaumTEwcWlQTGj<2IjH4fJBr5e-&!c>D<&6p}e^^~cA%qpp3K@ZZVt!%2o zmz)`8$G^KMZN{^W3jbUD|CuMUvEujNZvWx;Kl_LK8~*nkqsZ33P&%F2pKh}+#T!S9 oz131eG%)fxEwWFoLH>K?CZlY|W^Bf0{NIiL0vr7GLjW!S0IT>W!2kdN diff --git a/.yarn/offline-mirror/rollup-plugin-commonjs-10.1.0.tgz b/.yarn/offline-mirror/rollup-plugin-commonjs-10.1.0.tgz deleted file mode 100644 index ebda5ebdf23cd1c07471086835552787cf61f0df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55220 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 QGgzn=-~ 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 UfBpUSH}UWP10uO7?*MQE0Qj#GN&o-= diff --git a/.yarn/offline-mirror/rollup-plugin-node-resolve-5.2.0.tgz b/.yarn/offline-mirror/rollup-plugin-node-resolve-5.2.0.tgz deleted file mode 100644 index 8e78e0afa74bdb556215736ce270e974975c5142..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10591 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 diff --git a/packages/react-hooks/.npmignore b/packages/react-hooks/.npmignore deleted file mode 100644 index 81ba1598b971..000000000000 --- a/packages/react-hooks/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -**/__mocks__/** -**/__tests__/** -**/examples/** -**/tasks/** \ No newline at end of file diff --git a/packages/react-hooks/.storybook/_styles.scss b/packages/react-hooks/.storybook/_styles.scss deleted file mode 100644 index 6d4469d58f2c..000000000000 --- a/packages/react-hooks/.storybook/_styles.scss +++ /dev/null @@ -1,9 +0,0 @@ -// -// Copyright IBM Corp. 2016, 2018 -// -// This source code is licensed under the Apache-2.0 license found in the -// LICENSE file in the root directory of this source tree. -// - -$css--helpers: true; -@import '~carbon-components/scss/globals/scss/css--helpers'; diff --git a/packages/react-hooks/.storybook/addons.js b/packages/react-hooks/.storybook/addons.js deleted file mode 100644 index 0616c46d4457..000000000000 --- a/packages/react-hooks/.storybook/addons.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; -import '@storybook/addon-storysource/register'; diff --git a/packages/react-hooks/.storybook/config.js b/packages/react-hooks/.storybook/config.js deleted file mode 100644 index e2249c4e91ce..000000000000 --- a/packages/react-hooks/.storybook/config.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import './_styles.scss'; -import { configure } from '@storybook/react'; - -// automatically import all files ending in *.stories.js -const req = require.context('../src', true, /-story\.js$/); -function loadStories() { - req.keys().forEach((filename) => req(filename)); -} - -configure(loadStories, module); diff --git a/packages/react-hooks/.storybook/webpack.config.js b/packages/react-hooks/.storybook/webpack.config.js deleted file mode 100644 index bff4b7c52ab1..000000000000 --- a/packages/react-hooks/.storybook/webpack.config.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -const path = require('path'); - -module.exports = ({ config, mode }) => { - config.module.rules.push({ - test: /\.s?css$/, - sideEffects: true, - use: [ - { - loader: 'style-loader', - }, - { - loader: 'css-loader', - options: { - importLoaders: 2, - }, - }, - { - loader: 'postcss-loader', - options: { - plugins: [require('autoprefixer')], - }, - }, - { - loader: 'sass-loader', - options: { - sassOptions: { - includePaths: [path.resolve(__dirname, '..', 'node_modules')], - }, - }, - }, - ], - }); - - config.module.rules.push({ - test: /-story\.jsx?$/, - loaders: [require.resolve('@storybook/source-loader')], - enforce: 'pre', - }); - - return config; -}; diff --git a/packages/react-hooks/package.json b/packages/react-hooks/package.json deleted file mode 100644 index 256ab73b190c..000000000000 --- a/packages/react-hooks/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "@carbon/react-hooks", - "private": true, - "version": "10.19.0", - "license": "Apache-2.0", - "main": "lib/index.js", - "module": "es/index.js", - "repository": { - "type": "git", - "url": "https://github.com/carbon-design-system/carbon.git", - "directory": "packages/react-hooks" - }, - "bugs": "https://github.com/carbon-design-system/carbon/issues", - "keywords": [ - "ibm", - "carbon", - "carbon-design-system", - "components", - "react" - ], - "publishConfig": { - "access": "public" - }, - "scripts": { - "build": "yarn clean && rollup -c", - "clean": "rimraf es lib", - "develop": "start-storybook -p 3000", - "watch": "yarn clean && rollup -c -w" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.1" - }, - "devDependencies": { - "@babel/core": "^7.10.0", - "@babel/preset-env": "^7.10.0", - "@babel/preset-react": "^7.10.0", - "@carbon/test-utils": "^10.13.0", - "@storybook/addon-actions": "^5.3.19", - "@storybook/addon-links": "^5.3.19", - "@storybook/addon-storysource": "^5.3.19", - "@storybook/addons": "^5.3.19", - "@storybook/react": "^5.3.19", - "autoprefixer": "^9.7.4", - "babel-loader": "^8.1.0", - "browserslist-config-carbon": "^10.6.0", - "carbon-components": "^10.25.0", - "css-loader": "^3.4.2", - "node-sass": "^4.13.1", - "postcss-loader": "^3.0.0", - "react": "^16.9.0", - "react-dom": "^16.9.0", - "rimraf": "^3.0.0", - "rollup": "^1.20.3", - "rollup-plugin-babel": "^4.4.0", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-node-resolve": "^5.2.0", - "sass-loader": "^8.0.2", - "style-loader": "^1.0.3" - } -} diff --git a/packages/react-hooks/rollup.config.js b/packages/react-hooks/rollup.config.js deleted file mode 100644 index ca660df377c6..000000000000 --- a/packages/react-hooks/rollup.config.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -'use strict'; - -const resolve = require('rollup-plugin-node-resolve'); -const commonjs = require('rollup-plugin-commonjs'); -const babel = require('rollup-plugin-babel'); -const packageJson = require('./package.json'); - -const baseConfig = { - input: './src/index.js', - external: Object.keys(packageJson.peerDependencies), - plugins: [ - resolve(), - commonjs({ - include: /node_modules/, - }), - babel({ - babelrc: false, - presets: [ - [ - '@babel/preset-env', - { - targets: { - browsers: ['extends browserslist-config-carbon'], - }, - }, - ], - '@babel/preset-react', - ], - }), - ], -}; - -module.exports = [ - { - ...baseConfig, - output: { - format: 'esm', - file: 'es/index.js', - }, - }, - { - ...baseConfig, - output: { - format: 'cjs', - file: 'lib/index.js', - }, - }, -]; diff --git a/packages/react-hooks/src/__tests__/useAnnouncer-test.js b/packages/react-hooks/src/__tests__/useAnnouncer-test.js deleted file mode 100644 index e84a85870c6e..000000000000 --- a/packages/react-hooks/src/__tests__/useAnnouncer-test.js +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -jest.useFakeTimers(); - -describe('useAnnouncer', () => { - let React; - let act; - let render; - let cleanup; - let useAnnouncer; - - beforeEach(() => { - jest.resetModules(); - React = require('react'); - act = require('react-dom/test-utils').act; - render = require('../test-helpers').render; - cleanup = require('../test-helpers').cleanup; - useAnnouncer = require('../useAnnouncer').useAnnouncer; - }); - - afterEach(() => { - if (cleanup) { - cleanup(); - } - }); - - it('should create a live region region for each aria-live mode', () => { - function Component() { - useAnnouncer(); - return null; - } - - act(() => { - render(); - }); - - jest.runAllTimers(); - - expect(document.querySelector('[aria-live="polite"]')).toBeInstanceOf( - HTMLDivElement - ); - expect(document.querySelector('[aria-live="assertive"]')).toBeInstanceOf( - HTMLDivElement - ); - }); - - it('should update a live region for the given mode and announcement', () => { - const testMessage = 'test message'; - - function Component({ mode, message, testId }) { - const announce = useAnnouncer(); - return ( - - ); - } - - let testId = 'announce-id-1'; - act(() => { - render(); - }); - - let button = document.querySelector(`[data-test-id="${testId}"]`); - button.click(); - - jest.runAllTimers(); - - const politeRegion = document.querySelector('[aria-live="polite"]'); - expect(politeRegion.textContent).toEqual(testMessage); - - testId = 'announce-id-2'; - act(() => { - render( - - ); - }); - - button = document.querySelector(`[data-test-id="${testId}"]`); - button.click(); - - jest.runAllTimers(); - - const assertiveRegion = document.querySelector('[aria-live="assertive"]'); - expect(assertiveRegion.textContent).toEqual(testMessage); - }); -}); diff --git a/packages/react-hooks/src/__tests__/useDebounce-test.js b/packages/react-hooks/src/__tests__/useDebounce-test.js deleted file mode 100644 index 4f0f9ad27618..000000000000 --- a/packages/react-hooks/src/__tests__/useDebounce-test.js +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { render, cleanup } from '@carbon/test-utils/react'; -import React, { useState } from 'react'; -import { act } from 'react-dom/test-utils'; -import { useDebounce } from '../useDebounce'; - -jest.useFakeTimers(); - -describe('useDebounce', () => { - afterEach(cleanup); - - it('should debounce updating based on the received value', () => { - let count; - let updateCount; - let debouncedValue; - - function Component() { - [count, updateCount] = useState(0); - [debouncedValue] = useDebounce(count, 100); - - return ( - - ); - } - - const { container } = render(); - const button = container.querySelector('button'); - - expect(debouncedValue).toBe(count); - button.click(); - expect(debouncedValue).not.toBe(count); - - act(() => { - jest.runAllTimers(); - }); - - expect(debouncedValue).toBe(count); - }); - - it('should stop updates until some time after the value has settled', () => { - let count; - let updateCount; - let debouncedValue; - - function Component() { - [count, updateCount] = useState(0); - [debouncedValue] = useDebounce(count, 100); - - return ( - - ); - } - - const { container } = render(); - const intervalId = setInterval(() => { - act(() => { - const button = container.querySelector('button'); - button.click(); - }); - }, 100); - - expect(debouncedValue).toBe(count); - jest.advanceTimersByTime(100); - jest.advanceTimersByTime(100); - jest.advanceTimersByTime(100); - expect(debouncedValue).not.toBe(count); - clearInterval(intervalId); - - act(() => { - jest.runAllTimers(); - }); - expect(debouncedValue).toBe(count); - }); - - it('should update immediately if leading is set', () => { - let count; - let updateCount; - let debouncedValue; - - function Component() { - [count, updateCount] = useState(0); - [debouncedValue] = useDebounce(count, 100, { - leading: true, - }); - - return ( - - ); - } - - const { container } = render(); - expect(debouncedValue).toBe(count); - - const button = container.querySelector('button'); - act(() => { - button.click(); - }); - expect(debouncedValue).toBe(count); - }); -}); diff --git a/packages/react-hooks/src/__tests__/useId-test.js b/packages/react-hooks/src/__tests__/useId-test.js deleted file mode 100644 index 916caf95a660..000000000000 --- a/packages/react-hooks/src/__tests__/useId-test.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -describe('useId', () => { - let React; - let render; - let cleanup; - let useId; - - beforeEach(() => { - jest.resetModules(); - React = require('react'); - render = require('../test-helpers').render; - cleanup = require('../test-helpers').cleanup; - useId = require('../useId').useId; - }); - - afterEach(() => { - if (cleanup) { - cleanup(); - } - }); - - it('should generate a unique id for each component', () => { - function Component() { - const id = useId(); - return
; - } - - const { container } = render( - <> - - - - ); - - const ids = Array.from(container.childNodes).map((node) => node.id); - const uniqueIds = new Set(ids); - expect(uniqueIds.size).toBe(2); - }); - - it('should keep the same id for each call to render', () => { - function Component() { - const id = useId(); - return
; - } - - const { container } = render(); - const id = container.childNodes[0].id; - - render(); - expect(container.childNodes[0].id).toBe(id); - }); - - it('should include a prefix in the generated `id`', () => { - const prefix = 'prefix'; - function Component() { - const id = useId(prefix); - return
; - } - - const { container } = render(); - const id = container.childNodes[0].id; - expect(id).toEqual(expect.stringContaining(prefix)); - }); -}); diff --git a/packages/react-hooks/src/__tests__/usePortalNode-test.js b/packages/react-hooks/src/__tests__/usePortalNode-test.js deleted file mode 100644 index 5836fd3ee610..000000000000 --- a/packages/react-hooks/src/__tests__/usePortalNode-test.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -describe('usePortalNode', () => { - let React; - let ReactDOM; - let act; - let render; - let cleanup; - let usePortalNode; - - beforeEach(() => { - jest.resetModules(); - React = require('react'); - ReactDOM = require('react-dom'); - act = require('react-dom/test-utils').act; - render = require('../test-helpers').render; - cleanup = require('../test-helpers').cleanup; - usePortalNode = require('../usePortalNode').usePortalNode; - }); - - afterEach(() => { - if (cleanup) { - cleanup(); - } - }); - - it('should create a portal node', () => { - const testId = 'test-id'; - let portalNode; - function Component() { - portalNode = usePortalNode(); - return ( - <> - Component - {portalNode && - ReactDOM.createPortal(
, portalNode)} - - ); - } - - act(() => { - render(); - }); - - expect(portalNode).toBeDefined(); - // The portal node should exist in document.body - const children = Array.from(document.body.childNodes); - expect(children.indexOf(portalNode)).not.toBe(-1); - - // The portal node should have rendered a node with our `data-test-id` - expect( - document.body.querySelector(`[data-test-id="${testId}"]`) - ).toBeDefined(); - }); - - it('should create a new node when given an id', () => { - const id = 'test-id'; - function Component() { - usePortalNode(id); - return null; - } - - act(() => { - render(); - }); - - expect(document.body.querySelector(id)).toBeDefined(); - }); - - it('should reuse an existing node with a given id', () => { - const id = 'test-id'; - function Component() { - usePortalNode(id); - return null; - } - - act(() => { - const { rerender } = render(); - rerender(); - }); - - expect(document.body.querySelectorAll(`#${id}`).length).toBe(1); - }); -}); diff --git a/packages/react-hooks/src/index.js b/packages/react-hooks/src/index.js deleted file mode 100644 index 8debd14a43d1..000000000000 --- a/packages/react-hooks/src/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -export * from './useAnnouncer'; -export * from './useId'; -export * from './usePortalNode'; diff --git a/packages/react-hooks/src/test-helpers.js b/packages/react-hooks/src/test-helpers.js deleted file mode 100644 index f2c8565c8b14..000000000000 --- a/packages/react-hooks/src/test-helpers.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import ReactDOM from 'react-dom'; - -const containers = new Set(); - -export function render( - element, - { container = document.createElement('div') } = {} -) { - containers.add(container); - document.body.appendChild(container); - ReactDOM.render(element, container); - return { - container, - rerender() { - ReactDOM.render(element, container); - }, - }; -} - -export function cleanup() { - for (const node of containers) { - ReactDOM.unmountComponentAtNode(node); - node.parentNode.removeChild(node); - containers.delete(node); - } -} diff --git a/packages/react-hooks/src/useAnnouncer-story.js b/packages/react-hooks/src/useAnnouncer-story.js deleted file mode 100644 index 8ded6f30b395..000000000000 --- a/packages/react-hooks/src/useAnnouncer-story.js +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { storiesOf } from '@storybook/react'; -import React, { useState } from 'react'; -import { useAnnouncer, usePoliteAnnouncer, useAssertiveAnnouncer } from './'; - -storiesOf('useAnnouncer', module) - .add('default', () => { - function DemoComponent() { - const [mode, updateMode] = useState('polite'); - const [announcement, updateAnnouncement] = useState('test message'); - const announce = useAnnouncer(); - - function onModeChange(event) { - updateMode(event.target.value); - } - - function onAnnouncementChange(event) { - updateAnnouncement(event.target.value); - } - - return ( - <> -
- - -
-
- - -
- - - ); - } - return ; - }) - .add('polite announcer', () => { - function DemoComponent() { - const announce = usePoliteAnnouncer(); - const [count, setCount] = useState(1); - function onClick() { - setCount(count + 1); - announce(`Polite message ${count}`); - } - return ( - - ); - } - return ; - }) - .add('assertive announcer', () => { - function DemoComponent() { - const announce = useAssertiveAnnouncer(); - const [count, setCount] = useState(1); - function onClick() { - setCount(count + 1); - announce(`Assertive message ${count}`); - } - return ( - - ); - } - return ; - }) - .add('multiple announcers', () => { - function DemoComponent() { - return ( - <> - - - - ); - } - - function Assertive() { - const announce = useAnnouncer(); - const [count, setCount] = useState(1); - function onClick() { - setCount(count + 1); - announce('assertive', `Assertive message ${count}`); - } - return ( - - ); - } - - function Polite() { - const announce = useAnnouncer(); - const [count, setCount] = useState(1); - function onClick() { - setCount(count + 1); - announce('polite', `Polite message ${count}`); - } - return ( - - ); - } - - return ; - }); diff --git a/packages/react-hooks/src/useAnnouncer.js b/packages/react-hooks/src/useAnnouncer.js deleted file mode 100644 index e43ddbf88d65..000000000000 --- a/packages/react-hooks/src/useAnnouncer.js +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { useEffect, useState } from 'react'; -import { usePortalNode } from './usePortalNode'; - -/** - * Provides an `announce` method that allows a user to queue up an assertive or - * polite message to the user. This message is displayed in an `aria-live` - * region with the appropriate mode and the message is set as its text content. - * This `aria-live` region is the same for all components, so ordering of - * messages sent is important. - */ -export function useAnnouncer() { - const node = usePortalNode('carbon-announcer'); - const [mode, updateMode] = useState('polite'); - const [announcement, updateAnnouncement] = useState(''); - - function announce(mode, message) { - updateMode(mode); - updateAnnouncement(message); - } - - useEffect(() => { - if (!node) { - return; - } - - if (!node.classList.contains('bx--visually-hidden')) { - node.classList.add('bx--visually-hidden'); - } - - // In this effect, we'll need to setup the `#carbon-announcer` node with two - // corresponding announcement nodes if they do not exist already. If they - // already exist, then we can reuse them. - let assertiveNode = node.querySelector('#carbon-assertive-announcement'); - if (!assertiveNode) { - assertiveNode = document.createElement('div'); - assertiveNode.id = 'carbon-assertive-announcement'; - assertiveNode.setAttribute('aria-live', 'assertive'); - node.appendChild(assertiveNode); - } - - let politeNode = node.querySelector('#carbon-polite-announcement'); - if (!politeNode) { - politeNode = document.createElement('div'); - politeNode.id = 'carbon-polite-announcement'; - politeNode.setAttribute('aria-live', 'polite'); - node.appendChild(politeNode); - } - }, [node]); - - useEffect(() => { - if (!node) { - return; - } - - // Each time the mode or announcement changes, we'll want to update the - // message at that node. - const assertiveNode = node.querySelector('#carbon-assertive-announcement'); - const politeNode = node.querySelector('#carbon-polite-announcement'); - const timeoutId = setTimeout(() => { - if (mode === 'assertive' && assertiveNode.textContent !== announcement) { - assertiveNode.textContent = announcement; - } - - if (mode === 'polite' && politeNode.textContent !== announcement) { - politeNode.textContent = announcement; - } - }, 300); - - return () => { - window.clearTimeout(timeoutId); - }; - }, [node, mode, announcement]); - - return announce; -} - -/** - * Provides an announce method that will allow the user to queue up messages in - * an `aria-live="assertive"` region - */ -export function useAssertiveAnnouncer() { - const announce = useAnnouncer(); - return (message) => announce('assertive', message); -} - -/** - * Provides an announce method that will allow the user to queue up messages in - * an `aria-live="polite"` region - */ -export function usePoliteAnnouncer() { - const announce = useAnnouncer(); - return (message) => announce('polite', message); -} diff --git a/packages/react-hooks/src/useDebounce-story.js b/packages/react-hooks/src/useDebounce-story.js deleted file mode 100644 index 359b5944dbea..000000000000 --- a/packages/react-hooks/src/useDebounce-story.js +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { storiesOf } from '@storybook/react'; -import React, { useEffect, useState } from 'react'; -import { useDebounce } from './useDebounce'; - -function useTimedUpdate(interval, { maxValue = 10 } = {}) { - const [value, updateValue] = useState(0); - - useEffect(() => { - function handler() { - updateValue((value) => { - if (value + 1 > maxValue) { - window.clearInterval(timerId); - return value; - } - return value + 1; - }); - } - - const timerId = window.setInterval(handler, interval); - return () => { - window.clearInterval(timerId); - }; - }, [interval, maxValue]); - - return value; -} - -storiesOf('useDebounce', module) - .add('default', () => { - function DemoComponent() { - const value = useTimedUpdate(100); - const debouncedValue = useDebounce(value, 500); - return ( -
-
Value
-
{value}
-
Debounced value
-
{debouncedValue}
-
- ); - } - return ; - }) - .add('leading', () => { - function DemoComponent() { - const value = useTimedUpdate(1000, { maxValue: 10 }); - const debouncedValue = useDebounce(value, 1500, { - leading: true, - trailing: false, - }); - return ( -
-
Value
-
{value}
-
Debounced value
-
{debouncedValue}
-
- ); - } - return ; - }) - .add('maxWait', () => { - function DemoComponent() { - const value = useTimedUpdate(100); - const debouncedValue = useDebounce(value, 500, { - maxWait: 1000, - }); - return ( -
-
Value
-
{value}
-
Debounced value with max wait (1000ms)
-
{debouncedValue}
-
- ); - } - - return ; - }); diff --git a/packages/react-hooks/src/useDebounce.js b/packages/react-hooks/src/useDebounce.js deleted file mode 100644 index 160ca4bfcff5..000000000000 --- a/packages/react-hooks/src/useDebounce.js +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { useEffect, useRef, useState } from 'react'; - -/** - * Returns a debounced value that delays being updated until after `wait` - * milliseconds have elapsed since the last time the value was changed. The - * result of this hook comes with a `cancel` method to cancel delayed updates. - * It also supports options for when the value should be updated relative to - * the timer, on the leading and/or trailing edge. - * - * @param {any} value - * @param {number} wait - * @param {object} options - * @param {boolean} options.leading - * @param {number} options.maxWait - * @param {boolean} options.trailing - * @returns {[any, Function]} - */ -export function useDebounce(value, wait = 0, options = {}) { - const { leading = false, maxWait, trailing = true } = options; - const [debouncedValue, setDebouncedValue] = useState(value); - - // We keep track of several mutable values across renders given that we often - // want to know information about when the render itself has occurred in order - // to correctly debounce the value. - const savedValue = useRef(value); - const timerId = useRef(null); - // We keep track of `lastCallTime` so that we can determine if enough time has - // passed for us to update the debounced value - const lastCallTime = useRef(null); - // We keep track of `lastUpdate` so that we can determine if enough time has - // passed that our `maxWait` threshold has been hit - const lastUpdate = useRef(null); - - /** - * Cancel any currently running timers and reset any internal mutable values - * that we're tracking - */ - function cancel() { - if (timerId.current !== null) { - clearTimeout(timerId.current); - } - timerId.current = null; - lastCallTime.current = null; - } - - // We'll need to cancel any existing timers if any of the configuration - // options for the timer have changed, or if the hook itself has been - // un-mounted. We separate out this cancellation from the debounce effect - // below so that we're not cancelling timers we create every time the - // value has changed. - useEffect(cancel, [wait, leading, trailing]); - useEffect(() => cancel, []); - - // Each time our value changes, we're going to run our "debounce" effect that - // will try and create a new timer if one does not exist already. It's - // important that this hook runs after the cancellation hooks above so that - // any timers associated with a previous configuration value have been - // cancelled. - useEffect(() => { - // If our values are the same, there's no reason to kick-off a timer. This - // check is important so that the first value received does not schedule a - // timer. - if (value === debouncedValue) { - return; - } - - // For each call to our debounce effect we're going to keep track - // of the current value and the time when this effect was invoked. We keep - // track of both so that when our timers are invoked we have fresh values - // for both to determine either what value to update internal state with, or - // how long a new timer needs to be created for. - savedValue.current = value; - lastCallTime.current = Date.now(); - - // If we already have a timer, no need to create another one. - if (timerId.current !== null) { - return; - } - - /** - * Determine if we should update the `debouncedValue`. There are two signals - * where we should update, namely if we've waited enough time or if we've hit - * the `maxWait` threshold - * @param {number} time - */ - function shouldUpdate(time) { - const timeSinceLastCall = time - lastCallTime.current; - const timeSinceLastUpdate = time - lastUpdate.current; - return ( - timeSinceLastCall >= wait || (maxWait && timeSinceLastUpdate >= maxWait) - ); - } - - /** - * Used as the handler to our `setTimeout` calls. This function will determine - * if we are able to update the debouncedValue, or if we'll need to schedule a - * timer to run for the remaining time. - */ - function timerExpired() { - const time = Date.now(); - if (shouldUpdate(time)) { - if (trailing) { - lastUpdate.current = Date.now(); - setDebouncedValue(savedValue.current); - } - - timerId.current = null; - lastCallTime.current = null; - return; - } - timerId.current = setTimeout(timerExpired, getRemainingTime(time)); - } - - /** - * Get the remaining time for a `setTimeout` call based on the current `time`. - * If `maxWait` has been specified, we'll choose the minimum between how long - * we've been waiting and how much time we have left before hitting our - * `maxWait` threshold. Otherwise, we'll use the time since the last call to - * schedule the timer. - * @param {number} time - */ - function getRemainingTime(time) { - const timeSinceLastCall = time - lastCallTime.current; - const timeSinceLastUpdate = time - lastUpdate.current; - const timeWaiting = wait - timeSinceLastCall; - return maxWait - ? Math.min(timeWaiting, maxWait - timeSinceLastUpdate) - : timeSinceLastCall; - } - - timerId.current = setTimeout(timerExpired, wait); - - // If a user has specified the `leading` option, let's update the - // debounced value immediately - if (leading) { - lastUpdate.current = Date.now(); - setDebouncedValue(savedValue.current); - } - }, [value, debouncedValue, wait, leading, trailing, maxWait]); - - return [debouncedValue, cancel]; -} diff --git a/packages/react-hooks/src/useId-story.js b/packages/react-hooks/src/useId-story.js deleted file mode 100644 index 95a01b8eaa61..000000000000 --- a/packages/react-hooks/src/useId-story.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { storiesOf } from '@storybook/react'; -import React from 'react'; -import { useId } from './'; - -storiesOf('useId', module) - .add('default', () => { - function DemoComponent() { - const id = useId(); - return ( -
- This node has an id of {id} -
- ); - } - return ; - }) - .add('with prefix', () => { - function List({ children }) { - const id = useId('list'); - return
    {children}
; - } - - function ListItem() { - const id = useId('list-item'); - return ( -
  • - List item {id} -
  • - ); - } - - return ( - - - - - - ); - }); diff --git a/packages/react-hooks/src/useId.js b/packages/react-hooks/src/useId.js deleted file mode 100644 index 798225611440..000000000000 --- a/packages/react-hooks/src/useId.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { useRef } from 'react'; - -let id = 0; - -/** - * Provides a unique identifier with an optional prefix, useful for dynamically - * creating `id` values for controls, especially alongside `aria-labelledby` or - * `htmlFor`. This `id` value is guaranteed to be the same for the duration of - * the component. - * - * @example - * function TextInput() { - * const id = useId('text-input'); - * return ( - *
    - * - * - *
    - * ); - * } - * - * @param {string?} prefix - * @returns {string} - */ -export function useId(prefix) { - const ref = useRef(++id); - if (prefix) { - return `${prefix}-${ref.current}`; - } - return '' + ref.current; -} diff --git a/packages/react-hooks/src/usePortalNode-story.js b/packages/react-hooks/src/usePortalNode-story.js deleted file mode 100644 index 41efc7204dc5..000000000000 --- a/packages/react-hooks/src/usePortalNode-story.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { storiesOf } from '@storybook/react'; -import React from 'react'; -import { createPortal } from 'react-dom'; -import { usePortalNode } from './'; - -storiesOf('usePortalNode', module) - .add('default', () => { - function DemoComponent() { - const node = usePortalNode(); - return node && createPortal('Inside a portal!', node); - } - - return ; - }) - .add('with id', () => { - function DemoComponent() { - const node = usePortalNode('portal-root'); - return ( - node && - createPortal( - <> - Inside a portal with id #portal-root - , - node - ) - ); - } - - return ; - }); diff --git a/packages/react-hooks/src/usePortalNode.js b/packages/react-hooks/src/usePortalNode.js deleted file mode 100644 index 1570372f7382..000000000000 --- a/packages/react-hooks/src/usePortalNode.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { useEffect, useState } from 'react'; - -/** - * @param {string?} id - */ -export function usePortalNode(id) { - const [portalNode, setPortalNode] = useState(null); - - useEffect(() => { - const [node, cleanup] = findOrCreateRoot(id); - setPortalNode(node); - - return () => { - cleanup(); - setPortalNode(null); - }; - }, [id]); - - return portalNode; -} - -const activePortals = new Map(); - -function findOrCreateRoot(id) { - const node = findOrCreateNode(id); - if (!id) { - // eslint-disable-next-line no-inner-declarations - function cleanup() { - document.body.removeChild(node); - } - return [node, cleanup]; - } - - const currentPortalCount = activePortals.get(id) || 0; - activePortals.set(id, currentPortalCount + 1); - - function cleanup() { - const currentPortalCount = activePortals.get(id); - if (currentPortalCount === 1) { - document.body.removeChild(node); - activePortals.delete(id); - } else { - activePortals.set(id, currentPortalCount - 1); - } - } - - return [node, cleanup]; -} - -function findOrCreateNode(id) { - if (!id) { - const node = document.createElement('div'); - document.body.appendChild(node); - return node; - } - - const existingNode = document.getElementById(id); - if (existingNode) { - return existingNode; - } - - const node = document.createElement('div'); - node.id = id; - document.body.appendChild(node); - return node; -} diff --git a/packages/react-hooks/src/useThrottle.js b/packages/react-hooks/src/useThrottle.js deleted file mode 100644 index d95a6b49d285..000000000000 --- a/packages/react-hooks/src/useThrottle.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright IBM Corp. 2018, 2018 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { useDebounce } from './useDebounce'; - -/** - * Returns a throttle value that is updated at most once per every `wait` - * milliseconds. - * - * @param {any} value - * @param {number} wait - * @param {object} options - * @param {boolean} options.leading - * @param {boolean} options.trailing - * @returns {[any, Function]} - */ -export function useThrottle(value, wait = 0, options = {}) { - const { leading = true, trailing = true } = options; - return useDebounce(value, wait, { - leading, - trailing, - maxWait: wait, - }); -} diff --git a/yarn.lock b/yarn.lock index 4a78c2cbb939..7ed0b4572924 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14427,13 +14427,6 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-reference@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.4.tgz#3f95849886ddb70256a3e6d062b1a68c13c51427" - integrity sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw== - dependencies: - "@types/estree" "0.0.39" - is-regex@^1.0.3: version "1.1.0" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" @@ -20920,7 +20913,7 @@ react-transition-group@^2.2.1: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react@^16.6.0, react@^16.8.3, react@^16.8.6, react@^16.9.0, react@~16.9.0: +react@^16.6.0, react@^16.8.3, react@^16.8.6, react@~16.9.0: version "16.9.0" resolved "https://registry.yarnpkg.com/react/-/react-16.9.0.tgz#40ba2f9af13bc1a38d75dbf2f4359a5185c4f7aa" integrity sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w== @@ -21871,7 +21864,7 @@ resolve@1.1.x: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.4.0: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.4.0: version "1.15.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== @@ -22010,17 +22003,6 @@ rollup-plugin-babel@^4.4.0: "@babel/helper-module-imports" "^7.0.0" rollup-pluginutils "^2.8.1" -rollup-plugin-commonjs@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb" - integrity sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q== - dependencies: - estree-walker "^0.6.1" - is-reference "^1.1.2" - magic-string "^0.25.2" - resolve "^1.11.0" - rollup-pluginutils "^2.8.1" - rollup-plugin-commonjs@^9.0.0, rollup-plugin-commonjs@^9.2.0, rollup-plugin-commonjs@^9.3.4: version "9.3.4" resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz#2b3dddbbbded83d45c36ff101cdd29e924fd23bc" @@ -22063,17 +22045,6 @@ rollup-plugin-node-resolve@^4.0.0, rollup-plugin-node-resolve@^4.2.3: is-module "^1.0.0" resolve "^1.10.0" -rollup-plugin-node-resolve@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523" - integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw== - dependencies: - "@types/resolve" "0.0.8" - builtin-modules "^3.1.0" - is-module "^1.0.0" - resolve "^1.11.1" - rollup-pluginutils "^2.8.1" - rollup-plugin-replace@^2.0.0, rollup-plugin-replace@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz#f41ae5372e11e7a217cde349c8b5d5fd115e70e3" @@ -22155,7 +22126,7 @@ rollup@^0.67.1: "@types/estree" "0.0.39" "@types/node" "*" -rollup@^1.0.0, rollup@^1.10.0, rollup@^1.15.1, rollup@^1.20.3: +rollup@^1.0.0, rollup@^1.10.0, rollup@^1.15.1: version "1.29.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.29.1.tgz#8715d0a4ca439be3079f8095989ec8aa60f637bc" integrity sha512-dGQ+b9d1FOX/gluiggTAVnTvzQZUEkCi/TwZcax7ujugVRHs0nkYJlV9U4hsifGEMojnO+jvEML2CJQ6qXgbHA== @@ -24069,7 +24040,7 @@ structured-source@^3.0.2: dependencies: boundary "^1.0.1" -style-loader@^1.0.0, style-loader@^1.0.3, style-loader@^1.1.3: +style-loader@^1.0.0, style-loader@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.3.tgz#9e826e69c683c4d9bf9db924f85e9abb30d5e200" integrity sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==