1
1
mirror of https://github.com/jxnblk/mdx-deck.git synced 2024-11-29 13:58:02 +03:00

Merge branch 'master' into refactor-querystring

This commit is contained in:
Brent Jackson 2019-04-20 12:23:55 -04:00 committed by GitHub
commit 3b028183ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
44 changed files with 199 additions and 114 deletions

View File

@ -2,7 +2,16 @@
## Unreleased
- Refactor localStorage to use hooks #334
## v2.2.3 2019-04-20
- Refactor Head component #329
## v2.2.2 2019-04-20
- Fix typos #333
- Refactor themes for better bundle sizes #328
## v2.2.1 2019-04-15

View File

@ -0,0 +1,8 @@
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
.BundleAnalyzerPlugin
console.log('bundle analyzer')
module.exports = {
plugins: [new BundleAnalyzerPlugin()],
}

View File

@ -1,8 +1,9 @@
export { future as theme } from '@mdx-deck/themes'
import { Head, Image, Notes, Appear } from '@mdx-deck/components'
import { Invert, Split, SplitRight, FullScreenCode, Horizontal} from '@mdx-deck/layouts'
import Counter from './Counter'
export { default as theme } from '@mdx-deck/themes/future'
<Head>
<title>mdx-deck</title>
<meta name='twitter:card' content='summary_large_image' />

View File

@ -1,7 +1,7 @@
{
"private": true,
"name": "@mdx-deck/docs",
"version": "2.2.1",
"version": "2.2.3",
"main": "index.js",
"author": "Brent Jackson <jxnblk@gmail.com>",
"license": "MIT",
@ -13,11 +13,14 @@
"dependencies": {
"@emotion/core": "^10.0.7",
"@emotion/styled": "^10.0.7",
"@mdx-deck/components": "^2.2.1",
"@mdx-deck/layouts": "^2.2.1",
"@mdx-deck/themes": "^2.2.1",
"@mdx-deck/components": "^2.2.3",
"@mdx-deck/layouts": "^2.2.3",
"@mdx-deck/themes": "^2.2.3",
"@rebass/emotion": "^3.0.0",
"mdx-deck": "^2.2.1",
"mdx-deck": "^2.2.3",
"rebass": "^3.0.1"
},
"devDependencies": {
"webpack-bundle-analyzer": "^3.3.2"
}
}

View File

@ -2,5 +2,5 @@
"packages": ["packages/*"],
"npmClient": "yarn",
"useWorkspaces": true,
"version": "2.2.1"
"version": "2.2.3"
}

View File

@ -8,6 +8,7 @@
],
"scripts": {
"start": "yarn workspace @mdx-deck/docs start",
"analyze-bundle": "yarn workspace @mdx-deck/docs start --webpack bundle-analyzer.config.js",
"build": "yarn workspace @mdx-deck/docs build",
"test": "jest"
},

View File

@ -1,6 +1,6 @@
{
"name": "@mdx-deck/components",
"version": "2.2.1",
"version": "2.2.3",
"main": "src/index.js",
"author": "Brent Jackson <jxnblk@gmail.com>",
"license": "MIT",

View File

@ -5,7 +5,7 @@ import { Head } from './Head'
const GoogleFonts = withTheme(({ theme }) => {
if (!theme.googleFont) return false
return (
<Head>
<Head portal>
<link rel="stylesheet" href={theme.googleFont} />
</Head>
)

View File

@ -1,6 +1,8 @@
import React from 'react'
import React, { useEffect, useContext } from 'react'
import { createPortal } from 'react-dom'
let didMount = false
export const HeadContext = React.createContext({
tags: [],
push: () => {
@ -16,54 +18,36 @@ export const HeadProvider = ({ tags = [], children }) => {
return <HeadContext.Provider value={context}>{children}</HeadContext.Provider>
}
export class Head extends React.Component {
state = {
didMount: false,
}
rehydrate = () => {
const children = React.Children.toArray(this.props.children)
const nodes = [...document.head.querySelectorAll('[data-head]')]
nodes.forEach(node => {
if (typeof node.remove !== 'function') return
node.remove()
})
children.forEach(child => {
if (child.type === 'title') {
const title = document.head.querySelector('title')
if (title) title.remove()
}
if (child.type === 'meta') {
const { name } = child.props
let meta
if (name) meta = document.head.querySelector(`meta[name="${name}"]`)
if (meta) meta.remove()
}
})
this.setState({ didMount: true })
}
// get head for all slides
export const UserHead = ({ mdx }) =>
React.createElement(mdx, {
components: {
wrapper: props => {
if (!didMount) return false
const heads = React.Children.toArray(props.children).filter(
child => child.props.originalType === Head
)
const head = React.Children.toArray(
heads.reduce((acc, head) => [...acc, ...head.props.children], [])
)
return createPortal(head, document.head)
},
},
})
componentDidMount() {
this.rehydrate()
}
export const Head = props => {
const { push } = useContext(HeadContext)
const children = React.Children.toArray(props.children)
render() {
const children = React.Children.toArray(this.props.children).map(child =>
React.cloneElement(child, {
'data-head': true,
})
)
if (!this.state.didMount) {
return (
<HeadContext.Consumer
children={({ push }) => {
push(children)
return false
}}
/>
)
}
return createPortal(children, document.head)
useEffect(() => {
didMount = true
}, [])
if (!didMount) {
push(children)
return false
}
if (!props.portal) return false
return createPortal(children, document.head)
}
export default Head

View File

@ -12,6 +12,7 @@ import Print from './Print'
import GoogleFonts from './GoogleFonts'
import Catch from './Catch'
import QueryString from './QueryString'
import Storage from './Storage'
const NORMAL = 'normal'
const PRESENTER = 'presenter'
@ -26,9 +27,6 @@ const modes = {
PRINT,
}
const STORAGE_INDEX = 'mdx-slide'
const STORAGE_STEP = 'mdx-step'
const keys = {
right: 39,
left: 37,
@ -174,37 +172,12 @@ export class MDXDeck extends React.Component {
this.setState({ slides })
}
handleStorageChange = e => {
const { key } = e
switch (key) {
case STORAGE_INDEX:
const index = parseInt(e.newValue, 10)
this.goto(index)
break
case STORAGE_STEP:
const step = parseInt(e.newValue, 10)
this.setState({ step })
break
default:
break
}
}
componentDidMount() {
document.body.addEventListener('keydown', this.handleKeyDown)
window.addEventListener('storage', this.handleStorageChange)
}
componentWillUnmount() {
document.body.removeEventListener('keydown', this.handleKeyDown)
window.removeEventListener('storage', this.handleStorageChange)
}
componentDidUpdate() {
const index = this.getIndex()
const { step } = this.state
localStorage.setItem(STORAGE_INDEX, index)
localStorage.setItem(STORAGE_STEP, step)
}
componentDidCatch(err) {
@ -257,6 +230,7 @@ export class MDXDeck extends React.Component {
{style}
<Catch>
<QueryString {...this.state} modes={modes} index={index} />
<Storage {...this.state} goto={this.goto} index={index} />
<GoogleFonts />
<Wrapper {...this.props} {...this.state} modes={modes} index={index}>
<Swipeable onSwipedRight={this.previous} onSwipedLeft={this.next}>

View File

@ -1,9 +1,9 @@
import React from 'react'
import { ThemeProvider } from 'emotion-theming'
import merge from 'lodash.merge'
import { HeadProvider } from './Head'
import { HeadProvider, UserHead } from './Head'
import { MDXProvider } from '@mdx-js/react'
import defaultTheme from '@mdx-deck/themes'
import defaultTheme from '@mdx-deck/themes/base'
import mdxComponents from './mdx-components'
const DefaultProvider = props => <>{props.children}</>
@ -16,7 +16,7 @@ const mergeThemes = themes =>
)
export const Provider = props => {
const { headTags, theme: baseTheme, themes = [] } = props
const { headTags, theme: baseTheme, themes = [], mdx } = props
const theme = mergeThemes([defaultTheme, baseTheme, ...themes])
const {
Provider: UserProvider = DefaultProvider,
@ -30,6 +30,7 @@ export const Provider = props => {
return (
<HeadProvider tags={headTags}>
<UserHead mdx={mdx} />
<ThemeProvider theme={theme}>
<MDXProvider components={allComponents}>
<UserProvider {...props} />

View File

@ -0,0 +1,44 @@
import { useEffect } from 'react'
const STORAGE_INDEX = 'mdx-slide'
const STORAGE_STEP = 'mdx-step'
export const useLocalStorage = (handler, args = []) => {
useEffect(() => {
window.addEventListener('storage', handler)
return () => {
window.removeEventListener('storage', handler)
}
}, [...args])
}
export const useSetStorage = (key, value) => {
useEffect(() => {
localStorage.setItem(key, value)
}, [key, value])
}
const handleStorageChange = ({ goto, update }) => e => {
const { key } = e
switch (key) {
case STORAGE_INDEX:
const index = parseInt(e.newValue, 10)
goto(index)
break
case STORAGE_STEP:
const step = parseInt(e.newValue, 10)
update({ step })
break
default:
break
}
}
export default ({ goto, update, index, step }) => {
const handler = handleStorageChange({ goto, update })
useLocalStorage(handler)
useSetStorage(STORAGE_INDEX, index)
useSetStorage(STORAGE_STEP, step)
return false
}

View File

@ -1,6 +1,6 @@
{
"name": "create-deck",
"version": "2.2.1",
"version": "2.2.3",
"description": "Create mdx-deck presentations",
"bin": {
"create-deck": "cli.js"

View File

@ -1,6 +1,6 @@
{
"name": "@mdx-deck/export",
"version": "2.2.1",
"version": "2.2.3",
"main": "index.js",
"author": "Brent Jackson <jxnblk@gmail.com>",
"license": "MIT",
@ -12,7 +12,7 @@
"png": "./cli.js png ../../docs/demo.mdx"
},
"dependencies": {
"mdx-deck": "^2.2.1",
"mdx-deck": "^2.2.3",
"meow": "^5.0.0",
"mkdirp": "^0.5.1",
"puppeteer": "^1.13.0"

View File

@ -1,6 +1,6 @@
{
"name": "@mdx-deck/gatsby-theme",
"version": "2.2.1",
"version": "2.2.3",
"main": "index.js",
"author": "Brent Jackson <jxnblk@gmail.com>",
"license": "MIT",
@ -19,8 +19,8 @@
"react-dom": "^16.8.6"
},
"dependencies": {
"@mdx-deck/components": "^2.2.1",
"@mdx-deck/themes": "^2.2.1",
"@mdx-deck/components": "^2.2.3",
"@mdx-deck/themes": "^2.2.3",
"@mdx-js/mdx": "^1.0.1",
"@mdx-js/react": "^1.0.1",
"debug": "^4.1.1",

View File

@ -1,6 +1,6 @@
{
"name": "@mdx-deck/webpack-html-plugin",
"version": "2.2.1",
"version": "2.2.3",
"author": "Brent Jackson <jxnblk@gmail.com>",
"license": "MIT",
"repository": "github:jxnblk/mdx-deck",

View File

@ -1,6 +1,6 @@
{
"name": "@mdx-deck/layouts",
"version": "2.2.1",
"version": "2.2.3",
"main": "src/index.js",
"author": "Brent Jackson <jxnblk@gmail.com>",
"license": "MIT",

View File

@ -1,11 +1,11 @@
{
"name": "@mdx-deck/loader",
"version": "2.2.1",
"version": "2.2.3",
"main": "index.js",
"author": "Brent Jackson <jxnblk@gmail.com>",
"license": "MIT",
"dependencies": {
"@mdx-deck/mdx-plugin": "^2.2.1",
"@mdx-deck/mdx-plugin": "^2.2.3",
"@mdx-js/mdx": "^1.0.1",
"loader-utils": "^1.2.3"
}

View File

@ -3,12 +3,18 @@ import { render } from 'react-dom'
import { MDXDeck } from '@mdx-deck/components'
const mod = require(FILENAME)
const { slides, theme, themes } = mod
const { default: mdx, slides, theme, themes } = mod
export default class App extends React.Component {
render() {
return (
<MDXDeck {...this.props} slides={slides} theme={theme} themes={themes} />
<MDXDeck
{...this.props}
slides={slides}
theme={theme}
themes={themes}
mdx={mdx}
/>
)
}
}

View File

@ -1,6 +1,6 @@
{
"name": "mdx-deck",
"version": "2.2.1",
"version": "2.2.3",
"description": "MDX-based presentation decks",
"bin": {
"mdx-deck": "./cli.js"
@ -26,11 +26,11 @@
"@emotion/babel-preset-css-prop": "^10.0.7",
"@emotion/core": "^10.0.7",
"@emotion/styled": "^10.0.7",
"@mdx-deck/components": "^2.2.1",
"@mdx-deck/layouts": "^2.2.1",
"@mdx-deck/loader": "^2.2.1",
"@mdx-deck/themes": "^2.2.1",
"@mdx-deck/webpack-html-plugin": "^2.2.1",
"@mdx-deck/components": "^2.2.3",
"@mdx-deck/layouts": "^2.2.3",
"@mdx-deck/loader": "^2.2.3",
"@mdx-deck/themes": "^2.2.3",
"@mdx-deck/webpack-html-plugin": "^2.2.3",
"@mdx-js/mdx": "^1.0.1",
"@mdx-js/react": "^1.0.1",
"babel-loader": "^8.0.5",

View File

@ -1,6 +1,6 @@
{
"name": "@mdx-deck/mdx-plugin",
"version": "2.2.1",
"version": "2.2.3",
"description": "",
"main": "index.js",
"keywords": [],

View File

@ -1,7 +1,7 @@
{
"name": "@mdx-deck/themes",
"version": "2.2.1",
"main": "src/index.js",
"version": "2.2.3",
"main": "index.js",
"author": "Brent Jackson <jxnblk@gmail.com>",
"license": "MIT",
"dependencies": {

View File

@ -1,13 +1,13 @@
{
"private": true,
"name": "@mdx-deck/basic-template",
"version": "2.2.1",
"version": "2.2.3",
"scripts": {
"start": "mdx-deck deck.mdx",
"build": "mdx-deck build deck.mdx",
"help": "mdx-deck"
},
"devDependencies": {
"mdx-deck": "^2.2.1"
"mdx-deck": "^2.2.3"
}
}

View File

@ -2350,7 +2350,7 @@ acorn-jsx@^5.0.0:
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e"
integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==
acorn-walk@^6.0.1:
acorn-walk@^6.0.1, acorn-walk@^6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
@ -3025,6 +3025,16 @@ better-queue@^3.8.6, better-queue@^3.8.7:
node-eta "^0.9.0"
uuid "^3.0.0"
bfj@^6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48"
integrity sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==
dependencies:
bluebird "^3.5.1"
check-types "^7.3.0"
hoopy "^0.1.2"
tryer "^1.0.0"
big.js@^5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
@ -3554,6 +3564,11 @@ charenc@~0.0.1:
resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=
check-types@^7.3.0:
version "7.4.0"
resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4"
integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==
cheerio@^0.22.0:
version "0.22.0"
resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
@ -3826,7 +3841,7 @@ command-exists@^1.2.2:
resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291"
integrity sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==
commander@^2.11.0, commander@^2.14.1, commander@^2.19.0, commander@^2.9.0, commander@~2.20.0:
commander@^2.11.0, commander@^2.14.1, commander@^2.18.0, commander@^2.19.0, commander@^2.9.0, commander@~2.20.0:
version "2.20.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
@ -5091,6 +5106,11 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
ejs@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.122, electron-to-chromium@^1.3.47:
version "1.3.124"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.124.tgz#861fc0148748a11b3e5ccebdf8b795ff513fa11f"
@ -5936,7 +5956,7 @@ filesize@3.5.11:
resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee"
integrity sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==
filesize@3.6.1:
filesize@3.6.1, filesize@^3.6.1:
version "3.6.1"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
@ -6916,7 +6936,7 @@ gzip-size@3.0.0:
dependencies:
duplexer "^0.1.1"
gzip-size@5.0.0:
gzip-size@5.0.0, gzip-size@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80"
integrity sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==
@ -7172,6 +7192,11 @@ homedir-polyfill@^1.0.1:
dependencies:
parse-passwd "^1.0.0"
hoopy@^0.1.2:
version "0.1.4"
resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
hosted-git-info@^2.1.4, hosted-git-info@^2.6.0:
version "2.7.1"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
@ -10374,6 +10399,11 @@ onetime@^2.0.0:
dependencies:
mimic-fn "^1.0.0"
opener@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
opentracing@^0.14.3:
version "0.14.3"
resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.3.tgz#23e3ad029fa66a653926adbe57e834469f8550aa"
@ -13881,6 +13911,11 @@ trough@^1.0.0:
dependencies:
glob "^7.1.2"
tryer@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
ts-invariant@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.2.1.tgz#3d587f9d6e3bded97bf9ec17951dd9814d5a9d3f"
@ -14444,6 +14479,25 @@ webidl-conversions@^4.0.2:
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
webpack-bundle-analyzer@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz#3da733a900f515914e729fcebcd4c40dde71fc6f"
integrity sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==
dependencies:
acorn "^6.0.7"
acorn-walk "^6.1.1"
bfj "^6.1.1"
chalk "^2.4.1"
commander "^2.18.0"
ejs "^2.6.1"
express "^4.16.3"
filesize "^3.6.1"
gzip-size "^5.0.0"
lodash "^4.17.10"
mkdirp "^0.5.1"
opener "^1.5.1"
ws "^6.0.0"
webpack-dev-middleware@^3.0.1, webpack-dev-middleware@^3.6.0, webpack-dev-middleware@^3.6.2:
version "3.6.2"
resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.6.2.tgz#f37a27ad7c09cd7dc67cd97655413abaa1f55942"
@ -14836,7 +14890,7 @@ ws@^5.2.0:
dependencies:
async-limiter "~1.0.0"
ws@^6.1.0:
ws@^6.0.0, ws@^6.1.0:
version "6.2.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==