From 6cf29e91f31ae94032c17d0be009ef1cad34e89d Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Fri, 14 Jun 2019 12:18:32 -0400 Subject: [PATCH 1/8] feat: usePopper --- package.json | 1 + src/Dropdown.js | 248 ++++---- src/DropdownMenu.js | 197 +++--- src/DropdownToggle.js | 4 +- src/Overlay.js | 141 +++-- src/index.js | 12 +- src/usePopper.js | 121 ++++ src/useRootClose.js | 11 +- test/helpers.js | 29 +- www/gatsby-browser.js | 2 +- www/gatsby-config.js | 7 +- www/gatsby-ssr.js | 8 +- www/package.json | 5 + www/src/_variables.scss | 3 + www/src/components/HookDocumentation.js | 23 +- www/src/components/Playground.js | 8 +- www/src/examples/.eslintrc | 2 + www/src/examples/Dropdown.js | 56 +- www/src/examples/Transition.js | 8 +- www/src/injectCss.js | 2 +- www/src/pages/index.js | 56 +- www/src/{styles.less => styles.scss} | 20 +- www/yarn.lock | 806 ++++++++++++++++++++++-- yarn.lock | 2 +- 24 files changed, 1302 insertions(+), 470 deletions(-) create mode 100644 src/usePopper.js create mode 100644 www/src/_variables.scss rename www/src/{styles.less => styles.scss} (89%) diff --git a/package.json b/package.json index 2108b384..70bececa 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "@restart/hooks": "^0.2.12", "classnames": "^2.2.6", "dom-helpers": "^3.4.0", + "popper.js": "^1.15.0", "prop-types": "^15.7.2", "prop-types-extra": "^1.1.0", "react-popper": "^1.3.3", diff --git a/src/Dropdown.js b/src/Dropdown.js index b018b341..e63f02f6 100644 --- a/src/Dropdown.js +++ b/src/Dropdown.js @@ -1,11 +1,12 @@ import matches from 'dom-helpers/query/matches'; import qsa from 'dom-helpers/query/querySelectorAll'; -import React from 'react'; -import ReactDOM from 'react-dom'; +import React, { useCallback, useRef, useEffect, useMemo } from 'react'; import PropTypes from 'prop-types'; -import uncontrollable from 'uncontrollable'; +import useUncontrolled from 'uncontrollable/hook'; +import useCallbackRef from '@restart/hooks/useCallbackRef'; +import usePrevious from '@restart/hooks/usePrevious'; +import useEventCallback from '@restart/hooks/useEventCallback'; -import * as Popper from 'react-popper'; import DropdownContext from './DropdownContext'; import DropdownMenu from './DropdownMenu'; import DropdownToggle from './DropdownToggle'; @@ -58,6 +59,11 @@ const propTypes = { */ show: PropTypes.bool, + /** + * Sets the initial show position of the Dropdown. + */ + defaultShow: PropTypes.bool, + /** * A callback fired when the Dropdown wishes to change visibility. Called with the requested * `show` value, the DOM event, and the source that fired it: `'click'`,`'keydown'`,`'rootClose'`, or `'select'`. @@ -88,82 +94,110 @@ const defaultProps = { * - `Dropdown.Toggle` generally a button that triggers the menu opening * - `Dropdown.Menu` The overlaid, menu, positioned to the toggle with PopperJs */ -class Dropdown extends React.Component { - static displayName = 'ReactOverlaysDropdown'; - - static getDerivedStateFromProps({ drop, alignEnd, show }, prevState) { - const lastShow = prevState.context.show; - return { - lastShow, - context: { - ...prevState.context, - drop, - show, - alignEnd, - }, - }; +function Dropdown({ + drop, + alignEnd, + defaultShow, + show: rawShow, + onToggle: rawOnToggle, + itemSelector, + focusFirstItemOnShow, + children, +}) { + const { show, onToggle } = useUncontrolled( + { defaultShow, show: rawShow, onToggle: rawOnToggle }, + { show: 'onToggle' }, + ); + const [toggleElement, attachToggle] = useCallbackRef(); + const [menuElement, attachMenu] = useCallbackRef(); + + const lastShow = usePrevious(show); + const lastSourceEvent = useRef(null); + const focusInDropdown = useRef(false); + + const toggle = useCallback( + event => { + onToggle(!show, event); + }, + [onToggle, show], + ); + + const context = useMemo( + () => ({ + toggle, + drop, + show, + alignEnd, + menuElement, + toggleElement, + setMenu: attachMenu, + setToggle: attachToggle, + }), + [ + alignEnd, + attachMenu, + attachToggle, + drop, + menuElement, + show, + toggle, + toggleElement, + ], + ); + + if (menuElement && lastShow && !show) { + focusInDropdown.current = menuElement.contains(document.activeElement); } - constructor(...args) { - super(...args); - - this._focusInDropdown = false; - - this.menu = null; - - this.state = { - context: { - close: this.handleClose, - toggle: this.handleClick, - menuRef: r => { - this.menu = r; - }, - toggleRef: r => { - const toggleNode = r && ReactDOM.findDOMNode(r); - this.setState(({ context }) => ({ - context: { ...context, toggleNode }, - })); - }, - }, - }; - } - - componentDidUpdate(prevProps) { - const { show } = this.props; - const prevOpen = prevProps.show; + const focus = useEventCallback(() => { + if (toggleElement && toggleElement.focus) { + toggleElement.focus(); + } + }); + + const maybeFocusFirst = useEventCallback(() => { + const type = lastSourceEvent.current; + let focusStype = focusFirstItemOnShow; + if (focusStype == null) { + focusStype = + menuElement && matches(menuElement, '[role=menu]') ? 'keyboard' : false; + } - if (show && !prevOpen) { - this.maybeFocusFirst(); + if ( + focusStype === false || + (focusStype === 'keyboard' && !/^key.+$/.test(type)) + ) { + return; } - this._lastSourceEvent = null; - - if (!show && prevOpen) { - // if focus hasn't already moved from the menu let's return it - // to the toggle - if (this._focusInDropdown) { - this._focusInDropdown = false; - this.focus(); - } + + let first = qsa(menuElement, itemSelector)[0]; + if (first && first.focus) first.focus(); + }); + + useEffect(() => { + if (show) maybeFocusFirst(); + else if (focusInDropdown.current) { + focusInDropdown.current = false; } - } + // only `show` should be changing + }, [show, focusInDropdown, focus, maybeFocusFirst]); + + useEffect(() => { + lastSourceEvent.current = null; + }); - getNextFocusedChild(current, offset) { - if (!this.menu) return null; + const getNextFocusedChild = (current, offset) => { + if (!menuElement) return null; - const { itemSelector } = this.props; - let items = qsa(this.menu, itemSelector); + let items = qsa(menuElement, itemSelector); let index = items.indexOf(current) + offset; index = Math.max(0, Math.min(index, items.length)); return items[index]; - } - - handleClick = event => { - this.toggleOpen(event); }; - handleKeyDown = event => { + const handleKeyDown = event => { const { key, target } = event; // Second only to https://github.com/twbs/bootstrap/blob/8cfbf6933b8a0146ac3fbc369f19e520bd1ebdac/js/src/dropdown.js#L400 @@ -172,16 +206,16 @@ class Dropdown extends React.Component { if ( isInput && (key === ' ' || - (key !== 'Escape' && this.menu && this.menu.contains(target))) + (key !== 'Escape' && menuElement && menuElement.contains(target))) ) { return; } - this._lastSourceEvent = event.type; + lastSourceEvent.current = event.type; switch (key) { case 'ArrowUp': { - let next = this.getNextFocusedChild(target, -1); + let next = getNextFocusedChild(target, -1); if (next && next.focus) next.focus(); event.preventDefault(); @@ -189,82 +223,34 @@ class Dropdown extends React.Component { } case 'ArrowDown': event.preventDefault(); - if (!this.props.show) { - this.toggleOpen(event); + if (!show) { + toggle(event); } else { - let next = this.getNextFocusedChild(target, 1); + let next = getNextFocusedChild(target, 1); if (next && next.focus) next.focus(); } return; case 'Escape': case 'Tab': - this.props.onToggle(false, event); + onToggle(false, event); break; default: } }; - hasMenuRole() { - return this.menu && matches(this.menu, '[role=menu]'); - } - - focus() { - const { toggleNode } = this.state.context; - if (toggleNode && toggleNode.focus) { - toggleNode.focus(); - } - } - - maybeFocusFirst() { - const type = this._lastSourceEvent; - let { focusFirstItemOnShow } = this.props; - if (focusFirstItemOnShow == null) { - focusFirstItemOnShow = this.hasMenuRole() ? 'keyboard' : false; - } - - if ( - focusFirstItemOnShow === false || - (focusFirstItemOnShow === 'keyboard' && !/^key.+$/.test(type)) - ) { - return; - } - - const { itemSelector } = this.props; - let first = qsa(this.menu, itemSelector)[0]; - if (first && first.focus) first.focus(); - } - - toggleOpen(event) { - let show = !this.props.show; - - this.props.onToggle(show, event); - } - - render() { - const { children, ...props } = this.props; - - delete props.onToggle; - - if (this.menu && this.state.lastShow && !this.props.show) { - this._focusInDropdown = this.menu.contains(document.activeElement); - } - - return ( - - - {children({ props: { onKeyDown: this.handleKeyDown } })} - - - ); - } + return ( + + {children({ props: { onKeyDown: handleKeyDown } })} + + ); } +Dropdown.displayName = 'ReactOverlaysDropdown'; + Dropdown.propTypes = propTypes; Dropdown.defaultProps = defaultProps; -const UncontrolledDropdown = uncontrollable(Dropdown, { show: 'onToggle' }); - -UncontrolledDropdown.Menu = DropdownMenu; -UncontrolledDropdown.Toggle = DropdownToggle; +Dropdown.Menu = DropdownMenu; +Dropdown.Toggle = DropdownToggle; -export default UncontrolledDropdown; +export default Dropdown; diff --git a/src/DropdownMenu.js b/src/DropdownMenu.js index d0683014..6c21bb44 100644 --- a/src/DropdownMenu.js +++ b/src/DropdownMenu.js @@ -1,12 +1,101 @@ import PropTypes from 'prop-types'; -import React, { useContext, useRef, useEffect } from 'react'; -import { Popper } from 'react-popper'; -import usePrevious from '@restart/hooks/usePrevious'; +import { useContext, useRef } from 'react'; +import useCallbackRef from '@restart/hooks/useCallbackRef'; +import usePopper from './usePopper'; import useRootClose from './useRootClose'; -import { useMergedRefs } from './utils/mergeRefs'; import DropdownContext from './DropdownContext'; +export function useDropdownMenu(options = {}) { + // const prevProps = usePrevious(props); + const context = useContext(DropdownContext); + + // const [ref, attachRef] = useCallbackRef(); + const [arrowRef, attachArrowRef] = useCallbackRef(); + + const hasShownRef = useRef(false); + + const { + flip, + rootCloseEvent, + popperConfig = {}, + usePopper: shouldUsePopper = true, + } = options; + + const show = context.show == null ? options.show : context.show; + const alignEnd = + context.alignEnd == null ? options.alignEnd : context.alignEnd; + + if (show && !hasShownRef.current) { + hasShownRef.current = true; + } + + const handleClose = e => { + if (!context.toggle) return; + + context.toggle(false, e); + }; + + const { drop, setMenu, menuElement, toggleElement } = context; + + let placement = alignEnd ? 'bottom-end' : 'bottom-start'; + if (drop === 'up') placement = alignEnd ? 'top-end' : 'top-start'; + if (drop === 'right') placement = alignEnd ? 'right-end' : 'right-start'; + if (drop === 'left') placement = alignEnd ? 'left-end' : 'left-start'; + + const popper = usePopper(toggleElement, menuElement, { + placement, + enabled: !!(shouldUsePopper && show), + eventsEnabled: !!show, + modifiers: { + flip: { enabled: !!flip }, + arrow: { + ...(popperConfig.modifiers && popperConfig.modifiers.arrow), + enabled: !!arrowRef, + element: arrowRef, + }, + ...popperConfig.modifiers, + }, + }); + + let menu = null; + + const menuProps = { + ref: setMenu, + 'aria-labelledby': toggleElement && toggleElement.id, + }; + const childArgs = { + show, + alignEnd, + hasShown: hasShownRef.current, + close: handleClose, + }; + + if (!shouldUsePopper) { + menu = { ...childArgs, props: menuProps }; + } else { + menu = { + ...popper, + ...childArgs, + props: { + ...menuProps, + style: popper.styles, + }, + arrowProps: { + ref: attachArrowRef, + style: popper.arrowStyles, + }, + }; + } + + useRootClose(menuElement, handleClose, { + clickTrigger: rootCloseEvent, + disabled: !(menu && show), + }); + + return menu; +} + const propTypes = { /** * A render prop that returns a Menu element. The `props` @@ -70,104 +159,10 @@ const defaultProps = { usePopper: true, }; -function DropdownMenu(props) { - const prevProps = usePrevious(props); - const context = useContext(DropdownContext); - - const ref = useRef(null); - const popperIsInitialized = useRef(false); - const scheduleUpdateRef = useRef(null); - - const { - flip, - usePopper, - rootCloseEvent, - children, - popperConfig = {}, - } = props; - - const show = context.show == null ? props.show : context.show; - const alignEnd = context.alignEnd == null ? props.alignEnd : context.alignEnd; - - // If, to the best we can tell, this update won't reinitialize popper, - // manually schedule an update - const shouldUpdatePopper = - popperIsInitialized.current && !prevProps.show && show; - - if (show && usePopper && !popperIsInitialized.current) { - popperIsInitialized.current = true; - } - - const handleClose = e => { - if (!context.toggle) return; +function DropdownMenu({ children, ...options }) { + const args = useDropdownMenu(options); - context.toggle(false, e); - }; - - useEffect(() => { - if (shouldUpdatePopper && scheduleUpdateRef.current) { - scheduleUpdateRef.current(); - } - }); - - const { drop, menuRef, toggleNode } = context; - const mergedRef = useMergedRefs(menuRef, ref); - - let placement = alignEnd ? 'bottom-end' : 'bottom-start'; - if (drop === 'up') placement = alignEnd ? 'top-end' : 'top-start'; - if (drop === 'right') placement = alignEnd ? 'right-end' : 'right-start'; - if (drop === 'left') placement = alignEnd ? 'left-end' : 'left-start'; - - let menu = null; - - const menuProps = { - ref: mergedRef, - 'aria-labelledby': toggleNode && toggleNode.id, - }; - const childArgs = { - show, - alignEnd, - close: handleClose, - }; - - if (!usePopper) { - menu = children({ ...childArgs, props: menuProps }); - } else if (popperIsInitialized.current || show) { - // Add it this way, so it doesn't override someones usage - // with react-poppers - if (toggleNode) popperConfig.referenceElement = toggleNode; - - menu = ( - - {/* eslint-disable-next-line no-shadow */} - {({ ref, style, ...popper }) => { - scheduleUpdateRef.current = popper.scheduleUpdate; - - return children({ - ...popper, - ...childArgs, - props: { ...menuProps, ref, style }, - }); - }} - - ); - } - - useRootClose(ref, handleClose, { - clickTrigger: rootCloseEvent, - disabled: !(menu && show), - }); - - return menu; + return args.hasShown ? children(args) : null; } DropdownMenu.displayName = 'ReactOverlaysDropdownMenu'; diff --git a/src/DropdownToggle.js b/src/DropdownToggle.js index d0130f53..5904a49b 100644 --- a/src/DropdownToggle.js +++ b/src/DropdownToggle.js @@ -4,10 +4,10 @@ import { useContext } from 'react'; import DropdownContext from './DropdownContext'; export function useDropdownToggle() { - const { show, toggle, toggleRef } = useContext(DropdownContext); + const { show, toggle, setToggle } = useContext(DropdownContext); return [ { - ref: toggleRef, + ref: setToggle, 'aria-haspopup': true, 'aria-expanded': !!show, }, diff --git a/src/Overlay.js b/src/Overlay.js index 48cecafc..ffafce02 100644 --- a/src/Overlay.js +++ b/src/Overlay.js @@ -1,9 +1,11 @@ import PropTypes from 'prop-types'; -import React, { useState, useRef } from 'react'; +import PopperJS from 'popper.js'; +import React, { useState } from 'react'; import ReactDOM from 'react-dom'; +import useCallbackRef from '@restart/hooks/useCallbackRef'; -import { Popper, placements } from 'react-popper'; import useRootClose from './useRootClose'; +import usePopper from './usePopper'; import useWaitForDOMRef from './utils/useWaitForDOMRef'; import { useMergedRefs } from './utils/mergeRefs'; @@ -12,12 +14,47 @@ import { useMergedRefs } from './utils/mergeRefs'; * great for custom tooltip overlays. */ const Overlay = React.forwardRef((props, outerRef) => { - const rootCloseRef = useRef(null); + const { + flip, + placement, + containerPadding, + popperConfig = {}, + transition: Transition, + } = props; + + const [ref, attachRef] = useCallbackRef(); + const [arrowRef, attachArrowRef] = useCallbackRef(); + const mergedRef = useMergedRefs(attachRef, outerRef); + const container = useWaitForDOMRef(props.container); const target = useWaitForDOMRef(props.target); const [exited, setExited] = useState(!props.show); + const { modifiers = {} } = popperConfig; + + const { styles, arrowStyles, ...popper } = usePopper(target, ref, { + ...popperConfig, + placement: placement || 'bottom', + enableEvents: props.show, + modifiers: { + ...modifiers, + preventOverflow: { + padding: containerPadding || 5, + ...modifiers.preventOverflow, + }, + arrow: { + ...modifiers.arrow, + enabled: !!arrowRef, + element: arrowRef, + }, + flip: { + enabled: !!flip, + ...modifiers.preventOverflow, + }, + }, + }); + if (props.show) { if (exited) setExited(false); } else if (!props.transition && !exited) { @@ -32,20 +69,10 @@ const Overlay = React.forwardRef((props, outerRef) => { } }; - const { - children, - flip, - placement, - containerPadding, - popperConfig = {}, - transition: Transition, - } = props; - // Don't un-render the overlay while it's transitioning out. const mountOverlay = props.show || (Transition && !exited); - const innerRef = useMergedRefs(rootCloseRef, outerRef); - useRootClose(rootCloseRef, props.onHide, { + useRootClose(ref, props.onHide, { disabled: !props.rootClose || props.rootCloseDisabled, clickTrigger: props.rootCloseEvent, }); @@ -55,63 +82,37 @@ const Overlay = React.forwardRef((props, outerRef) => { return null; } - let child = children; - - const { modifiers = {} } = popperConfig; - const popperProps = { - ...popperConfig, - innerRef, - placement, - referenceElement: target, - enableEvents: props.show, - modifiers: { - ...modifiers, - preventOverflow: { - padding: containerPadding || 5, - ...modifiers.preventOverflow, - }, - flip: { - enabled: !!flip, - ...modifiers.preventOverflow, - }, + let child = props.children({ + ...popper, + show: props.show, + props: { + style: styles, + ref: mergedRef, }, - }; + arrowProps: { + style: arrowStyles, + ref: attachArrowRef, + }, + }); - child = ( - - {({ arrowProps, style, ref, ...popper }) => { - let innerChild = props.children({ - ...popper, - // popper doesn't set the initial placement - placement: popper.placement || placement, - show: props.show, - - arrowProps, - props: { ref, style }, - }); - - if (Transition) { - let { onExit, onExiting, onEnter, onEntering, onEntered } = props; - - innerChild = ( - - {innerChild} - - ); - } - return innerChild; - }} - - ); + if (Transition) { + let { onExit, onExiting, onEnter, onEntering, onEntered } = props; + + child = ( + + {child} + + ); + } return container ? ReactDOM.createPortal(child, container) : null; }); @@ -125,7 +126,7 @@ Overlay.propTypes = { show: PropTypes.bool, /** Specify where the overlay element is positioned in relation to the target element */ - placement: PropTypes.oneOf(placements), + placement: PropTypes.oneOf(PopperJS.placements), /** * A DOM Element, Ref to an element, or function that returns either. The `target` element is where diff --git a/src/index.js b/src/index.js index fb2a39a4..55cbf2ab 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,17 @@ import Dropdown from './Dropdown'; +import { useDropdownMenu } from './DropdownMenu'; +import { useDropdownToggle } from './DropdownToggle'; import Modal from './Modal'; import Overlay from './Overlay'; import Portal from './Portal'; import useRootClose from './useRootClose'; -export { Dropdown, Modal, Overlay, Portal, useRootClose }; +export { + Dropdown, + useDropdownMenu, + useDropdownToggle, + Modal, + Overlay, + Portal, + useRootClose, +}; diff --git a/src/usePopper.js b/src/usePopper.js new file mode 100644 index 00000000..6de266b7 --- /dev/null +++ b/src/usePopper.js @@ -0,0 +1,121 @@ +import PopperJS from 'popper.js'; + +import { useCallback, useEffect, useState, useRef } from 'react'; + +const initialPopperStyles = { + position: 'absolute', + top: '0', + left: '0', + opacity: '0', + pointerEvents: 'none', +}; + +const initialArrowStyles = {}; + +const getRefValue = refOrValue => + refOrValue !== null && 'current' in refOrValue + ? refOrValue.current + : refOrValue; + +export default function usePopper( + referenceElement, + popperElement, + { + enabled = true, + placement = 'bottom', + positionFixed = false, + eventsEnabled = true, + modifiers = {}, + } = {}, +) { + const popperInstanceRef = useRef(); + + const hasArrow = !!(modifiers.arrow && modifiers.arrow.element); + + const scheduleUpdate = useCallback(() => { + if (popperInstanceRef.current) { + popperInstanceRef.current.scheduleUpdate(); + } + }, [popperInstanceRef]); + + const [state, setState] = useState({ + placement, + scheduleUpdate, + outOfBoundaries: false, + styles: initialPopperStyles, + arrowStyles: initialArrowStyles, + }); + + // A placement difference in state means popper determined a new placement + // apart from the props value. By the time the popper element is rendered with + // the new position Popper has already measured it, if the place change triggers + // a size change it will result in a misaligned popper. So we schedule an update to be sure. + useEffect(() => { + scheduleUpdate(); + }, [state.placement, scheduleUpdate]); + + /** Toggle Events */ + useEffect(() => { + if (popperInstanceRef.current) { + // eslint-disable-next-line no-unused-expressions + eventsEnabled + ? popperInstanceRef.current.enableEventListeners() + : popperInstanceRef.current.disableEventListeners(); + } + }, [eventsEnabled, popperInstanceRef]); + + useEffect(() => { + if (!enabled || referenceElement === null || popperElement === null) { + return undefined; + } + + const arrow = modifiers.arrow && { + ...modifiers.arrow, + element: getRefValue(modifiers.arrow.element), + }; + + popperInstanceRef.current = new PopperJS(referenceElement, popperElement, { + placement, + positionFixed, + modifiers: { + ...modifiers, + arrow, + applyStyle: { enabled: false }, + updateStateModifier: { + enabled: true, + order: 900, + fn(data) { + setState({ + scheduleUpdate, + styles: { + position: data.offsets.popper.position, + ...data.styles, + }, + arrowStyles: data.arrowStyles, + outOfBoundaries: data.hide, + placement: data.placement, + }); + }, + }, + }, + }); + + return () => { + if (popperInstanceRef.current !== null) { + popperInstanceRef.current.destroy(); + popperInstanceRef.current = null; + } + }; + // intentionally NOT re-running on new modifiers + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + enabled, + placement, + positionFixed, + referenceElement, + popperElement, + hasArrow, + ]); + + return state; +} diff --git a/src/useRootClose.js b/src/useRootClose.js index 6de08a52..55b90fe6 100644 --- a/src/useRootClose.js +++ b/src/useRootClose.js @@ -67,7 +67,7 @@ function useRootClose( }); useEffect(() => { - if (disabled) return undefined; + if (disabled || ref == null) return undefined; // Use capture for this listener so it fires before React's listener, to // avoid false positives in the contains() check below if the target DOM @@ -95,7 +95,14 @@ function useRootClose( removeKeyupListener(); mobileSafariHackListeners.forEach(remove => remove()); }; - }, [disabled, clickTrigger, handleMouseCapture, handleMouse, handleKeyUp]); + }, [ + ref, + disabled, + clickTrigger, + handleMouseCapture, + handleMouse, + handleKeyUp, + ]); } export default useRootClose; diff --git a/test/helpers.js b/test/helpers.js index 5d9e1be8..345bac2a 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -1,32 +1,7 @@ -import { cloneElement } from 'react'; -import ReactDOM from 'react-dom'; - export function shouldWarn(about) { console.error.expected.push(about); } -/** - * Helper for rendering and updating props for plain class Components - * since `setProps` is deprecated. - * @param {ReactElement} element Root element to render - * @param {HTMLElement?} mountPoint Optional mount node, when empty it uses an unattached div like `renderIntoDocument()` - * @return {ComponentInstance} The instance, with a new method `renderWithProps` which will return a new instance with updated props - */ -export function render(element, mountPoint) { - let mount = mountPoint || document.createElement('div'); - - // eslint-disable-next-line react/no-render-return-value - let instance = ReactDOM.render(element, mount); - - if (!instance.renderWithProps) { - instance.renderWithProps = function(newProps) { - return render(cloneElement(element, newProps), mount); - }; - } - - return instance; -} - let style; let seen = []; @@ -37,7 +12,7 @@ export function injectCss(rules) { style = style || - (function() { + (function iife() { let _style = document.createElement('style'); _style.appendChild(document.createTextNode('')); document.head.appendChild(_style); @@ -48,7 +23,7 @@ export function injectCss(rules) { style.innerHTML += `\n${rules}`; } -injectCss.reset = function() { +injectCss.reset = () => { if (style) { document.head.removeChild(style); } diff --git a/www/gatsby-browser.js b/www/gatsby-browser.js index d5cffa19..11bb8456 100644 --- a/www/gatsby-browser.js +++ b/www/gatsby-browser.js @@ -1,3 +1,3 @@ -import './src/styles.less'; +import './src/styles.scss'; export const onClientEntry = () => {}; diff --git a/www/gatsby-config.js b/www/gatsby-config.js index b17c8b08..6f1e3ae7 100644 --- a/www/gatsby-config.js +++ b/www/gatsby-config.js @@ -30,8 +30,11 @@ module.exports = { name: 'source', }, }, - // 'gatsby-plugin-emotion', - 'gatsby-plugin-less', + 'gatsby-plugin-sass', + { + resolve: 'gatsby-plugin-astroturf', + options: { extension: '.module.scss' }, + }, { resolve: 'gatsby-transformer-react-docgen', options: { diff --git a/www/gatsby-ssr.js b/www/gatsby-ssr.js index 717eb7a3..502b7ba9 100644 --- a/www/gatsby-ssr.js +++ b/www/gatsby-ssr.js @@ -1,15 +1,9 @@ const React = require('react'); -require('./src/styles.less'); +require('./src/styles.scss'); exports.onRenderBody = ({ setHeadComponents }) => { setHeadComponents( <> - - p.block && - css` - display: block; - margin-top: 20px; - `} - - :before, - :after { + &.block { + display: block; + margin-top: 20px; + } + + &:before, + &:after { color: #969584; } - :before { + &:before { content: '{ '; } - :after { + &:after { content: ' }'; } `; diff --git a/www/src/components/Playground.js b/www/src/components/Playground.js index f42c6c6d..433dd943 100644 --- a/www/src/components/Playground.js +++ b/www/src/components/Playground.js @@ -14,8 +14,8 @@ import * as ReactOverlays from 'react-overlays'; import getOffset from 'dom-helpers/query/offset'; -import { css } from '@emotion/core'; -import styled from '@emotion/styled'; +import { css as emotionCss } from '@emotion/core'; +import emotionStyled from '@emotion/styled'; import injectCss from '../injectCss'; Babel.registerPreset('env', require('@babel/preset-env')); @@ -38,8 +38,8 @@ const scope = { Transition, ENTERED, ENTERING, - css, - styled, + css: emotionCss, + styled: emotionStyled, }; export default class Playground extends React.Component { diff --git a/www/src/examples/.eslintrc b/www/src/examples/.eslintrc index 2398b2b9..810db6ef 100644 --- a/www/src/examples/.eslintrc +++ b/www/src/examples/.eslintrc @@ -22,6 +22,8 @@ "Modal": false, "Overlay": false, "Dropdown": false, + "useDropdownMenu": false, + "useDropdownToggle": false, "Portal": false, "useRootClose": false, "css": false, diff --git a/www/src/examples/Dropdown.js b/www/src/examples/Dropdown.js index 2fd7d2ea..04f2bee0 100644 --- a/www/src/examples/Dropdown.js +++ b/www/src/examples/Dropdown.js @@ -9,36 +9,34 @@ const MenuContainer = styled('div')` padding: 20px; `; -const Menu = ({ role }) => ( - - {({ show, onClose, props }) => ( - - - - - )} - -); - -const Toggle = ({ id, children }) => ( - - {({ toggle, show, props }) => ( - - )} - -); + + + ); +}; + +const Toggle = ({ id, children }) => { + const [props, { show, toggle }] = useDropdownToggle(); + return ( + + ); +}; const DropdownButton = ({ show, onToggle, drop, alignEnd, title, role }) => ( ( @@ -97,7 +97,7 @@ class TransitionExample extends React.Component { modifiers={{ offset: { enabled: true, offset: '0 5px' } }} target={() => this.tooltipRef.current} > - {({ ref, style }) => ( + {({ props: { ref, style } }) => (
Hello there
diff --git a/www/src/injectCss.js b/www/src/injectCss.js index 0da5671e..3f256e0f 100644 --- a/www/src/injectCss.js +++ b/www/src/injectCss.js @@ -8,7 +8,7 @@ export default function injectCss(rules) { style = style || - (function() { + (() => { let _style = document.createElement('style'); _style.appendChild(document.createTextNode('')); document.head.appendChild(_style); diff --git a/www/src/pages/index.js b/www/src/pages/index.js index 9c493389..67e66bac 100644 --- a/www/src/pages/index.js +++ b/www/src/pages/index.js @@ -2,6 +2,8 @@ import PropTypes from 'prop-types'; import React from 'react'; import { graphql } from 'gatsby'; + +import styled from 'astroturf'; import PropTable from '../components/PropTable'; import Playground from '../components/Playground'; import HookDocumentation from '../components/HookDocumentation'; @@ -13,6 +15,13 @@ import PortalSource from '../examples/Portal'; import useRootCloseSource from '../examples/useRootClose'; import TransitionSource from '../examples/Transition'; +const NavList = styled('ul')` + composes: nav d-flex flex-column from global; + + position: sticky; + top: 40px; +`; + class Anchor extends React.Component { static propTypes = { id: PropTypes.string, @@ -49,32 +58,41 @@ class Example extends React.Component { return (
- -
+

Portals diff --git a/www/src/styles.less b/www/src/styles.scss similarity index 89% rename from www/src/styles.less rename to www/src/styles.scss index 611483c0..1d9bb148 100644 --- a/www/src/styles.less +++ b/www/src/styles.scss @@ -1,6 +1,5 @@ -// .panel-default { -// border-radius: 0; -// } +@import './variables.scss'; +@import '~bootstrap/scss/bootstrap.scss'; button { padding: 0; @@ -17,17 +16,6 @@ button { padding-top: 0; } -.side-panel { - ul { - position: sticky; - top: 40px; - } - - ul > li { - padding: 5px; - } -} - pre { border-radius: 0; border: none; @@ -36,10 +24,10 @@ pre { } code { - color: #555; + color: $primary; margin: -0.05rem -0.15em; padding: 0.05rem 0.35em; - background-color: rgba(0, 0, 0, 0.04); + background-color: transparentize($primary, 0.9); } .playground-editor, diff --git a/www/yarn.lock b/www/yarn.lock index b58d3b22..e36333a7 100644 --- a/www/yarn.lock +++ b/www/yarn.lock @@ -27,7 +27,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.2": +"@babel/core@^7.1.2", "@babel/core@^7.3.4": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== @@ -57,7 +57,7 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.1.3", "@babel/generator@^7.4.4": +"@babel/generator@^7.1.3", "@babel/generator@^7.3.4", "@babel/generator@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== @@ -1527,7 +1527,7 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@babel/types@^7.1.3", "@babel/types@^7.4.4": +"@babel/types@^7.1.3", "@babel/types@^7.3.4", "@babel/types@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== @@ -2057,7 +2057,7 @@ ajv@^6.1.0: json-schema-traverse "^0.4.1" uri-js "^4.2.1" -ajv@^6.9.1: +ajv@^6.5.5, ajv@^6.9.1: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== @@ -2071,6 +2071,11 @@ alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -2250,6 +2255,18 @@ asn1.js@^4.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" @@ -2274,10 +2291,33 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astroturf@^0.9.5: + version "0.9.5" + resolved "https://registry.yarnpkg.com/astroturf/-/astroturf-0.9.5.tgz#bb0531fd5e21d9142ff46e8f1bcd04f33a595132" + integrity sha512-+NoPljRuzAY9Co2lFy392ko6XDVd1L6tSifaUmAm/smQjfkXIkQUAJn2tIv4o+eu4SigUIiypEsJSIgdRCHRnA== + dependencies: + "@babel/core" "^7.3.4" + "@babel/generator" "^7.3.4" + "@babel/template" "^7.2.2" + "@babel/types" "^7.3.4" + common-tags "^1.8.0" + errno "^0.1.7" + fs-extra "^8.0.0" + loader-utils "^1.2.3" + lodash "^4.17.11" + memory-fs "^0.4.1" + postcss-loader "^3.0.0" + postcss-nested "^4.1.1" + async-each@^1.0.0, async-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" @@ -2292,6 +2332,11 @@ async@^2.1.4: dependencies: lodash "^4.17.10" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + atob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" @@ -2315,6 +2360,16 @@ autoprefixer@^9.4.3: postcss "^7.0.14" postcss-value-parser "^3.3.1" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + axobject-query@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.1.tgz#05dfa705ada8ad9db993fa6896f22d395b0b0a07" @@ -2510,6 +2565,13 @@ batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" @@ -2539,6 +2601,11 @@ big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" @@ -2547,6 +2614,13 @@ blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + bluebird@^3.5.0: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -2600,6 +2674,11 @@ boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" +bootstrap@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.3.1.tgz#280ca8f610504d99d7b6b4bfc4b68cec601704ac" + integrity sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag== + boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" @@ -2932,6 +3011,24 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -2978,11 +3075,16 @@ capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + ccount@^1.0.0, ccount@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.3.tgz#f1cec43f332e2ea5a569fd46f9f5bde4e6102aff" -chalk@1.1.3, chalk@^1.1.3: +chalk@1.1.3, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -3228,6 +3330,16 @@ clone-buffer@^1.0.0: resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= +clone-deep@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" + integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ== + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.4" + kind-of "^6.0.0" + shallow-clone "^1.0.0" + clone-response@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -3311,6 +3423,13 @@ colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + comma-separated-tokens@^1.0.0, comma-separated-tokens@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.5.tgz#b13793131d9ea2d2431cf5b507ddec258f0ce0db" @@ -3558,7 +3677,7 @@ core-js@^2.4.1: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -3671,6 +3790,14 @@ cross-spawn@5.1.0, cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -3929,6 +4056,13 @@ damerau-levenshtein@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -3964,7 +4098,7 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.2.0: +decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -4055,6 +4189,11 @@ del@^3.0.0: pify "^3.0.0" rimraf "^2.2.8" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + delegate@^3.1.2: version "3.2.0" resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" @@ -4394,6 +4533,14 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -4534,7 +4681,7 @@ eol@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/eol/-/eol-0.8.1.tgz#defc3224990c7eca73bb34461a56cf9dc24761d0" -errno@^0.1.3, errno@~0.1.7: +errno@^0.1.3, errno@^0.1.7, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" dependencies: @@ -4975,7 +5122,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0: +extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -5009,6 +5156,16 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -5223,14 +5380,40 @@ follow-redirects@^1.0.0: dependencies: debug "^3.1.0" -for-in@^1.0.2: +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= + +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -5290,6 +5473,15 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.0.1.tgz#90294081f978b1f182f347a440a209154344285b" + integrity sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -5332,6 +5524,16 @@ fsevents@^1.2.7: nan "^2.9.2" node-pre-gyp "^0.10.0" +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -5392,6 +5594,11 @@ gatsby-link@^2.1.1: "@types/reach__router" "^1.0.0" prop-types "^15.6.1" +gatsby-plugin-astroturf@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/gatsby-plugin-astroturf/-/gatsby-plugin-astroturf-0.2.1.tgz#b5ed009f5bb682dc78840a0adf25823c6d539aef" + integrity sha512-BjlGgfMVQVJjAeIKfCy+b+MyWWGAbAQKn20CGBsWcvGl/Yj+dYNUgptLqdpV1mBKA8JKmL5QDx60vnW9ouR7EA== + gatsby-plugin-catch-links@^2.0.15: version "2.0.15" resolved "https://registry.yarnpkg.com/gatsby-plugin-catch-links/-/gatsby-plugin-catch-links-2.0.15.tgz#f7ebef483280f6c4fcc19f8fa317c18b49944a97" @@ -5436,6 +5643,14 @@ gatsby-plugin-page-creator@^2.0.13: micromatch "^3.1.10" slash "^1.0.0" +gatsby-plugin-sass@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/gatsby-plugin-sass/-/gatsby-plugin-sass-2.0.11.tgz#25ef6a206107e24ac49d50866f0595c2aa489649" + integrity sha512-EopQgb7FoC8XmkM691NppbAwPi2JaC6yv7SWrSdCDEJkLxr9V98KCfr7tMk0KW64LF8pj+XjtwKVtEwCPEQ0gg== + dependencies: + "@babel/runtime" "^7.0.0" + sass-loader "^7.0.1" + gatsby-plugin-sorted-assets@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/gatsby-plugin-sorted-assets/-/gatsby-plugin-sorted-assets-1.0.2.tgz#09a3b66850fc9c12b0fd2658626bb7322b706c8a" @@ -5696,6 +5911,13 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -5709,6 +5931,11 @@ get-port@^4.0.0: resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -5724,6 +5951,13 @@ get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + git-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/git-up/-/git-up-2.1.0.tgz#2f14cfe78327e7c4a2b92fcac7bfc674fdfad40c" @@ -5779,6 +6013,18 @@ glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" +glob@^7.0.0, glob@~7.1.1: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -5857,6 +6103,15 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" @@ -6017,6 +6272,19 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -6364,6 +6632,15 @@ http-proxy@^1.17.0: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -6454,6 +6731,18 @@ imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -6469,7 +6758,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -6766,6 +7055,13 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -6928,13 +7224,18 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + is-unc-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" dependencies: unc-path-regex "^0.1.2" -is-utf8@^0.2.1: +is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= @@ -7006,6 +7307,11 @@ isomorphic-fetch@^2.1.1: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + isurl@^1.0.0-alpha5: version "1.0.0" resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" @@ -7032,6 +7338,11 @@ joi@^14.0.0: isemail "3.x.x" topo "3.x.x" +js-base64@^2.1.8: + version "2.5.1" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" + integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== + js-levenshtein@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5" @@ -7066,6 +7377,11 @@ js-yaml@~3.10.0: argparse "^1.0.7" esprima "^4.0.0" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" @@ -7091,11 +7407,16 @@ json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" -json-stringify-safe@^5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -7107,6 +7428,13 @@ json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + json5@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" @@ -7129,6 +7457,16 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + jsx-ast-utils@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" @@ -7242,6 +7580,17 @@ livereload-js@^2.3.0: resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -7272,6 +7621,15 @@ loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" +loader-utils@^1.0.1, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" @@ -7338,6 +7696,11 @@ lodash.mergewith@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" +lodash.tail@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ= + lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" @@ -7351,15 +7714,15 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@^4.11.1, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - -lodash@^4.17.11: +lodash@^4.0.0, lodash@^4.17.11, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +lodash@^4.11.1, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -7396,7 +7759,7 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4 dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.2.0, loud-rejection@^1.6.0: +loud-rejection@^1.0.0, loud-rejection@^1.2.0, loud-rejection@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" dependencies: @@ -7470,6 +7833,11 @@ map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -7616,6 +7984,22 @@ memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -7669,19 +8053,19 @@ mime-db@1.40.0: version "1.35.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" -mime-types@~2.1.17, mime-types@~2.1.18: - version "2.1.19" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" - dependencies: - mime-db "~1.35.0" - -mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.24" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== dependencies: mime-db "1.40.0" +mime-types@~2.1.17, mime-types@~2.1.18: + version "2.1.19" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" + dependencies: + mime-db "~1.35.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -7731,7 +8115,7 @@ minimatch@3.0.3: dependencies: brace-expansion "^1.0.0" -minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -7741,7 +8125,7 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.0, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -7789,7 +8173,15 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -7865,6 +8257,11 @@ name-all-modules-plugin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/name-all-modules-plugin/-/name-all-modules-plugin-1.0.1.tgz#0abfb6ad835718b9fb4def0674e06657a954375c" +nan@^2.13.2: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" @@ -7960,6 +8357,24 @@ node-forge@0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -8034,6 +8449,29 @@ node-releases@^1.1.8: dependencies: semver "^5.3.0" +node-sass@^4.12.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" + integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.11" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + noms@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" @@ -8041,6 +8479,13 @@ noms@0.0.0: inherits "^2.0.1" readable-stream "~1.0.31" +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -8057,6 +8502,16 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -8119,7 +8574,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -8151,6 +8606,11 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -8331,6 +8791,13 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" @@ -8352,7 +8819,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" -osenv@^0.1.4: +osenv@0, osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" dependencies: @@ -8630,6 +9097,15 @@ path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -8653,6 +9129,11 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + physical-cpu-count@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660" @@ -8791,6 +9272,16 @@ postcss-loader@^2.1.3: postcss-load-config "^2.0.0" schema-utils "^0.4.0" +postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + postcss-merge-longhand@^4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" @@ -8880,6 +9371,14 @@ postcss-modules-values@^1.3.0: icss-replace-symbols "^1.1.0" postcss "^6.0.1" +postcss-nested@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-4.1.2.tgz#8e0570f736bfb4be5136e31901bf2380b819a561" + integrity sha512-9bQFr2TezohU3KRSu9f6sfecXmf/x6RXDedl8CHF6fyuyVW7UqgNMRdWMHZQWuFY6Xqs2NYk+Fj4Z4vSOf7PQg== + dependencies: + postcss "^7.0.14" + postcss-selector-parser "^5.0.0" + postcss-normalize-charset@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" @@ -8998,7 +9497,7 @@ postcss-selector-parser@^3.0.0: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^5.0.0-rc.4: +postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.4: version "5.0.0" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== @@ -9181,6 +9680,11 @@ pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +psl@^1.1.24: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + public-encrypt@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" @@ -9222,7 +9726,7 @@ punycode@2.x.x, punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" -punycode@^1.2.4: +punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -9239,6 +9743,11 @@ qs@^6.4.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" @@ -9481,6 +9990,14 @@ read-chunk@^3.0.0: pify "^4.0.1" with-open-file "^0.1.5" +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -9496,6 +10013,15 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -9608,6 +10134,14 @@ recursive-readdir@2.2.1: dependencies: minimatch "3.0.3" +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + redux-thunk@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" @@ -9904,10 +10438,43 @@ repeat-string@^1.5.0, repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@ version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + replace-ext@1.0.0, replace-ext@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" +request@^2.87.0, request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -9962,7 +10529,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.3: +resolve@^1.1.3, resolve@^1.10.0: version "1.11.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== @@ -10008,7 +10575,7 @@ rgba-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" -rimraf@2.6.3: +rimraf@2, rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -10076,7 +10643,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -10095,6 +10662,28 @@ sanitize-html@^1.18.2: srcset "^1.0.0" xtend "^4.0.0" +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" + integrity sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w== + dependencies: + clone-deep "^2.0.1" + loader-utils "^1.0.1" + lodash.tail "^4.1.1" + neo-async "^2.5.0" + pify "^3.0.0" + semver "^5.5.0" + sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -10130,6 +10719,14 @@ scroll-behavior@^0.9.9: dom-helpers "^3.2.1" invariant "^2.2.2" +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" @@ -10172,6 +10769,11 @@ semver@^6.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.0.tgz#e95dc415d45ecf03f2f9f83b264a6b11f49c0cca" integrity sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ== +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -10265,6 +10867,15 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" + integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA== + dependencies: + is-extendable "^0.1.1" + kind-of "^5.0.0" + mixin-object "^2.0.1" + shallow-compare@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/shallow-compare/-/shallow-compare-1.2.2.tgz#fa4794627bf455a47c4f56881d8a6132d581ffdb" @@ -10478,6 +11089,13 @@ source-map@0.5.7, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, sourc version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -10564,6 +11182,21 @@ srcset@^1.0.0: array-uniq "^1.0.2" number-is-nan "^1.0.0" +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -10607,6 +11240,13 @@ statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + dependencies: + readable-stream "^2.0.1" + stream-array@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/stream-array/-/stream-array-1.1.2.tgz#9e5f7345f2137c30ee3b498b9114e80b52bb7eb5" @@ -10674,7 +11314,7 @@ string-template@~0.2.1: resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= -string-width@^1.0.1: +string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" dependencies: @@ -10754,6 +11394,13 @@ strip-bom-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -10762,6 +11409,13 @@ strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -10855,6 +11509,15 @@ tapable@^1.1.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + tar@^4: version "4.4.4" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" @@ -11047,10 +11710,23 @@ toposort@^2.0.2: resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + trim-lines@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.1.tgz#da738ff58fa74817588455e30b11b85289f2a396" +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -11067,7 +11743,7 @@ trough@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.2.tgz#7f1663ec55c480139e2de5e486c6aef6cc24a535" -"true-case-path@^1.0.3": +"true-case-path@^1.0.2", "true-case-path@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== @@ -11087,6 +11763,18 @@ tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -11468,6 +12156,15 @@ vendors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + vfile-location@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.3.tgz#083ba80e50968e8d420be49dd1ea9a992131df77" @@ -11763,11 +12460,16 @@ whatwg-fetch@>=0.10.0: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" -which@^1.2.14, which@^1.2.9: +which@1, which@^1.2.14, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" dependencies: @@ -11920,6 +12622,13 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" @@ -11962,6 +12671,25 @@ yargs@^12.0.2, yargs@^12.0.5: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + yargs@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" diff --git a/yarn.lock b/yarn.lock index 513f6bbc..3234c5e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7045,7 +7045,7 @@ please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1: dependencies: semver-compare "^1.0.0" -popper.js@^1.14.4: +popper.js@^1.14.4, popper.js@^1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2" integrity sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA== From fa4d3aa0ff46990f368d5580f7e6c6c130598512 Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Fri, 14 Jun 2019 12:18:32 -0400 Subject: [PATCH 2/8] feat: usePopper --- package.json | 1 + src/Dropdown.js | 248 ++++--- src/DropdownMenu.js | 197 +++--- src/DropdownToggle.js | 4 +- src/Overlay.js | 141 ++-- src/index.js | 12 +- src/usePopper.js | 121 ++++ src/useRootClose.js | 11 +- test/helpers.js | 29 +- www/gatsby-browser.js | 2 +- www/gatsby-config.js | 7 +- www/gatsby-ssr.js | 8 +- www/package.json | 5 + www/src/_variables.scss | 3 + www/src/components/HookDocumentation.js | 23 +- www/src/components/Playground.js | 8 +- www/src/examples/.eslintrc | 2 + www/src/examples/Dropdown.js | 56 +- www/src/examples/Transition.js | 8 +- www/src/injectCss.js | 2 +- www/src/pages/index.js | 56 +- www/src/{styles.less => styles.scss} | 20 +- www/yarn.lock | 818 ++++++++++++++++++++++-- yarn.lock | 2 +- 24 files changed, 1302 insertions(+), 482 deletions(-) create mode 100644 src/usePopper.js create mode 100644 www/src/_variables.scss rename www/src/{styles.less => styles.scss} (89%) diff --git a/package.json b/package.json index 758ac8de..03881f31 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "@babel/runtime": "^7.4.5", "@restart/hooks": "^0.3.2", "dom-helpers": "^3.4.0", + "popper.js": "^1.15.0", "prop-types": "^15.7.2", "react-popper": "^1.3.3", "uncontrollable": "^7.0.0", diff --git a/src/Dropdown.js b/src/Dropdown.js index 44951530..763151d4 100644 --- a/src/Dropdown.js +++ b/src/Dropdown.js @@ -1,11 +1,12 @@ import matches from 'dom-helpers/query/matches'; import qsa from 'dom-helpers/query/querySelectorAll'; -import React from 'react'; -import ReactDOM from 'react-dom'; +import React, { useCallback, useRef, useEffect, useMemo } from 'react'; import PropTypes from 'prop-types'; -import { uncontrollable } from 'uncontrollable'; +import { useUncontrolled } from 'uncontrollable'; +import useCallbackRef from '@restart/hooks/useCallbackRef'; +import usePrevious from '@restart/hooks/usePrevious'; +import useEventCallback from '@restart/hooks/useEventCallback'; -import * as Popper from 'react-popper'; import DropdownContext from './DropdownContext'; import DropdownMenu from './DropdownMenu'; import DropdownToggle from './DropdownToggle'; @@ -58,6 +59,11 @@ const propTypes = { */ show: PropTypes.bool, + /** + * Sets the initial show position of the Dropdown. + */ + defaultShow: PropTypes.bool, + /** * A callback fired when the Dropdown wishes to change visibility. Called with the requested * `show` value, the DOM event, and the source that fired it: `'click'`,`'keydown'`,`'rootClose'`, or `'select'`. @@ -88,82 +94,110 @@ const defaultProps = { * - `Dropdown.Toggle` generally a button that triggers the menu opening * - `Dropdown.Menu` The overlaid, menu, positioned to the toggle with PopperJs */ -class Dropdown extends React.Component { - static displayName = 'ReactOverlaysDropdown'; - - static getDerivedStateFromProps({ drop, alignEnd, show }, prevState) { - const lastShow = prevState.context.show; - return { - lastShow, - context: { - ...prevState.context, - drop, - show, - alignEnd, - }, - }; +function Dropdown({ + drop, + alignEnd, + defaultShow, + show: rawShow, + onToggle: rawOnToggle, + itemSelector, + focusFirstItemOnShow, + children, +}) { + const { show, onToggle } = useUncontrolled( + { defaultShow, show: rawShow, onToggle: rawOnToggle }, + { show: 'onToggle' }, + ); + const [toggleElement, attachToggle] = useCallbackRef(); + const [menuElement, attachMenu] = useCallbackRef(); + + const lastShow = usePrevious(show); + const lastSourceEvent = useRef(null); + const focusInDropdown = useRef(false); + + const toggle = useCallback( + event => { + onToggle(!show, event); + }, + [onToggle, show], + ); + + const context = useMemo( + () => ({ + toggle, + drop, + show, + alignEnd, + menuElement, + toggleElement, + setMenu: attachMenu, + setToggle: attachToggle, + }), + [ + alignEnd, + attachMenu, + attachToggle, + drop, + menuElement, + show, + toggle, + toggleElement, + ], + ); + + if (menuElement && lastShow && !show) { + focusInDropdown.current = menuElement.contains(document.activeElement); } - constructor(...args) { - super(...args); - - this._focusInDropdown = false; - - this.menu = null; - - this.state = { - context: { - close: this.handleClose, - toggle: this.handleClick, - menuRef: r => { - this.menu = r; - }, - toggleRef: r => { - const toggleNode = r && ReactDOM.findDOMNode(r); - this.setState(({ context }) => ({ - context: { ...context, toggleNode }, - })); - }, - }, - }; - } - - componentDidUpdate(prevProps) { - const { show } = this.props; - const prevOpen = prevProps.show; + const focus = useEventCallback(() => { + if (toggleElement && toggleElement.focus) { + toggleElement.focus(); + } + }); + + const maybeFocusFirst = useEventCallback(() => { + const type = lastSourceEvent.current; + let focusStype = focusFirstItemOnShow; + if (focusStype == null) { + focusStype = + menuElement && matches(menuElement, '[role=menu]') ? 'keyboard' : false; + } - if (show && !prevOpen) { - this.maybeFocusFirst(); + if ( + focusStype === false || + (focusStype === 'keyboard' && !/^key.+$/.test(type)) + ) { + return; } - this._lastSourceEvent = null; - - if (!show && prevOpen) { - // if focus hasn't already moved from the menu let's return it - // to the toggle - if (this._focusInDropdown) { - this._focusInDropdown = false; - this.focus(); - } + + let first = qsa(menuElement, itemSelector)[0]; + if (first && first.focus) first.focus(); + }); + + useEffect(() => { + if (show) maybeFocusFirst(); + else if (focusInDropdown.current) { + focusInDropdown.current = false; } - } + // only `show` should be changing + }, [show, focusInDropdown, focus, maybeFocusFirst]); + + useEffect(() => { + lastSourceEvent.current = null; + }); - getNextFocusedChild(current, offset) { - if (!this.menu) return null; + const getNextFocusedChild = (current, offset) => { + if (!menuElement) return null; - const { itemSelector } = this.props; - let items = qsa(this.menu, itemSelector); + let items = qsa(menuElement, itemSelector); let index = items.indexOf(current) + offset; index = Math.max(0, Math.min(index, items.length)); return items[index]; - } - - handleClick = event => { - this.toggleOpen(event); }; - handleKeyDown = event => { + const handleKeyDown = event => { const { key, target } = event; // Second only to https://github.com/twbs/bootstrap/blob/8cfbf6933b8a0146ac3fbc369f19e520bd1ebdac/js/src/dropdown.js#L400 @@ -172,16 +206,16 @@ class Dropdown extends React.Component { if ( isInput && (key === ' ' || - (key !== 'Escape' && this.menu && this.menu.contains(target))) + (key !== 'Escape' && menuElement && menuElement.contains(target))) ) { return; } - this._lastSourceEvent = event.type; + lastSourceEvent.current = event.type; switch (key) { case 'ArrowUp': { - let next = this.getNextFocusedChild(target, -1); + let next = getNextFocusedChild(target, -1); if (next && next.focus) next.focus(); event.preventDefault(); @@ -189,82 +223,34 @@ class Dropdown extends React.Component { } case 'ArrowDown': event.preventDefault(); - if (!this.props.show) { - this.toggleOpen(event); + if (!show) { + toggle(event); } else { - let next = this.getNextFocusedChild(target, 1); + let next = getNextFocusedChild(target, 1); if (next && next.focus) next.focus(); } return; case 'Escape': case 'Tab': - this.props.onToggle(false, event); + onToggle(false, event); break; default: } }; - hasMenuRole() { - return this.menu && matches(this.menu, '[role=menu]'); - } - - focus() { - const { toggleNode } = this.state.context; - if (toggleNode && toggleNode.focus) { - toggleNode.focus(); - } - } - - maybeFocusFirst() { - const type = this._lastSourceEvent; - let { focusFirstItemOnShow } = this.props; - if (focusFirstItemOnShow == null) { - focusFirstItemOnShow = this.hasMenuRole() ? 'keyboard' : false; - } - - if ( - focusFirstItemOnShow === false || - (focusFirstItemOnShow === 'keyboard' && !/^key.+$/.test(type)) - ) { - return; - } - - const { itemSelector } = this.props; - let first = qsa(this.menu, itemSelector)[0]; - if (first && first.focus) first.focus(); - } - - toggleOpen(event) { - let show = !this.props.show; - - this.props.onToggle(show, event); - } - - render() { - const { children, ...props } = this.props; - - delete props.onToggle; - - if (this.menu && this.state.lastShow && !this.props.show) { - this._focusInDropdown = this.menu.contains(document.activeElement); - } - - return ( - - - {children({ props: { onKeyDown: this.handleKeyDown } })} - - - ); - } + return ( + + {children({ props: { onKeyDown: handleKeyDown } })} + + ); } +Dropdown.displayName = 'ReactOverlaysDropdown'; + Dropdown.propTypes = propTypes; Dropdown.defaultProps = defaultProps; -const UncontrolledDropdown = uncontrollable(Dropdown, { show: 'onToggle' }); - -UncontrolledDropdown.Menu = DropdownMenu; -UncontrolledDropdown.Toggle = DropdownToggle; +Dropdown.Menu = DropdownMenu; +Dropdown.Toggle = DropdownToggle; -export default UncontrolledDropdown; +export default Dropdown; diff --git a/src/DropdownMenu.js b/src/DropdownMenu.js index d0683014..6c21bb44 100644 --- a/src/DropdownMenu.js +++ b/src/DropdownMenu.js @@ -1,12 +1,101 @@ import PropTypes from 'prop-types'; -import React, { useContext, useRef, useEffect } from 'react'; -import { Popper } from 'react-popper'; -import usePrevious from '@restart/hooks/usePrevious'; +import { useContext, useRef } from 'react'; +import useCallbackRef from '@restart/hooks/useCallbackRef'; +import usePopper from './usePopper'; import useRootClose from './useRootClose'; -import { useMergedRefs } from './utils/mergeRefs'; import DropdownContext from './DropdownContext'; +export function useDropdownMenu(options = {}) { + // const prevProps = usePrevious(props); + const context = useContext(DropdownContext); + + // const [ref, attachRef] = useCallbackRef(); + const [arrowRef, attachArrowRef] = useCallbackRef(); + + const hasShownRef = useRef(false); + + const { + flip, + rootCloseEvent, + popperConfig = {}, + usePopper: shouldUsePopper = true, + } = options; + + const show = context.show == null ? options.show : context.show; + const alignEnd = + context.alignEnd == null ? options.alignEnd : context.alignEnd; + + if (show && !hasShownRef.current) { + hasShownRef.current = true; + } + + const handleClose = e => { + if (!context.toggle) return; + + context.toggle(false, e); + }; + + const { drop, setMenu, menuElement, toggleElement } = context; + + let placement = alignEnd ? 'bottom-end' : 'bottom-start'; + if (drop === 'up') placement = alignEnd ? 'top-end' : 'top-start'; + if (drop === 'right') placement = alignEnd ? 'right-end' : 'right-start'; + if (drop === 'left') placement = alignEnd ? 'left-end' : 'left-start'; + + const popper = usePopper(toggleElement, menuElement, { + placement, + enabled: !!(shouldUsePopper && show), + eventsEnabled: !!show, + modifiers: { + flip: { enabled: !!flip }, + arrow: { + ...(popperConfig.modifiers && popperConfig.modifiers.arrow), + enabled: !!arrowRef, + element: arrowRef, + }, + ...popperConfig.modifiers, + }, + }); + + let menu = null; + + const menuProps = { + ref: setMenu, + 'aria-labelledby': toggleElement && toggleElement.id, + }; + const childArgs = { + show, + alignEnd, + hasShown: hasShownRef.current, + close: handleClose, + }; + + if (!shouldUsePopper) { + menu = { ...childArgs, props: menuProps }; + } else { + menu = { + ...popper, + ...childArgs, + props: { + ...menuProps, + style: popper.styles, + }, + arrowProps: { + ref: attachArrowRef, + style: popper.arrowStyles, + }, + }; + } + + useRootClose(menuElement, handleClose, { + clickTrigger: rootCloseEvent, + disabled: !(menu && show), + }); + + return menu; +} + const propTypes = { /** * A render prop that returns a Menu element. The `props` @@ -70,104 +159,10 @@ const defaultProps = { usePopper: true, }; -function DropdownMenu(props) { - const prevProps = usePrevious(props); - const context = useContext(DropdownContext); - - const ref = useRef(null); - const popperIsInitialized = useRef(false); - const scheduleUpdateRef = useRef(null); - - const { - flip, - usePopper, - rootCloseEvent, - children, - popperConfig = {}, - } = props; - - const show = context.show == null ? props.show : context.show; - const alignEnd = context.alignEnd == null ? props.alignEnd : context.alignEnd; - - // If, to the best we can tell, this update won't reinitialize popper, - // manually schedule an update - const shouldUpdatePopper = - popperIsInitialized.current && !prevProps.show && show; - - if (show && usePopper && !popperIsInitialized.current) { - popperIsInitialized.current = true; - } - - const handleClose = e => { - if (!context.toggle) return; +function DropdownMenu({ children, ...options }) { + const args = useDropdownMenu(options); - context.toggle(false, e); - }; - - useEffect(() => { - if (shouldUpdatePopper && scheduleUpdateRef.current) { - scheduleUpdateRef.current(); - } - }); - - const { drop, menuRef, toggleNode } = context; - const mergedRef = useMergedRefs(menuRef, ref); - - let placement = alignEnd ? 'bottom-end' : 'bottom-start'; - if (drop === 'up') placement = alignEnd ? 'top-end' : 'top-start'; - if (drop === 'right') placement = alignEnd ? 'right-end' : 'right-start'; - if (drop === 'left') placement = alignEnd ? 'left-end' : 'left-start'; - - let menu = null; - - const menuProps = { - ref: mergedRef, - 'aria-labelledby': toggleNode && toggleNode.id, - }; - const childArgs = { - show, - alignEnd, - close: handleClose, - }; - - if (!usePopper) { - menu = children({ ...childArgs, props: menuProps }); - } else if (popperIsInitialized.current || show) { - // Add it this way, so it doesn't override someones usage - // with react-poppers - if (toggleNode) popperConfig.referenceElement = toggleNode; - - menu = ( - - {/* eslint-disable-next-line no-shadow */} - {({ ref, style, ...popper }) => { - scheduleUpdateRef.current = popper.scheduleUpdate; - - return children({ - ...popper, - ...childArgs, - props: { ...menuProps, ref, style }, - }); - }} - - ); - } - - useRootClose(ref, handleClose, { - clickTrigger: rootCloseEvent, - disabled: !(menu && show), - }); - - return menu; + return args.hasShown ? children(args) : null; } DropdownMenu.displayName = 'ReactOverlaysDropdownMenu'; diff --git a/src/DropdownToggle.js b/src/DropdownToggle.js index d0130f53..5904a49b 100644 --- a/src/DropdownToggle.js +++ b/src/DropdownToggle.js @@ -4,10 +4,10 @@ import { useContext } from 'react'; import DropdownContext from './DropdownContext'; export function useDropdownToggle() { - const { show, toggle, toggleRef } = useContext(DropdownContext); + const { show, toggle, setToggle } = useContext(DropdownContext); return [ { - ref: toggleRef, + ref: setToggle, 'aria-haspopup': true, 'aria-expanded': !!show, }, diff --git a/src/Overlay.js b/src/Overlay.js index 48cecafc..ffafce02 100644 --- a/src/Overlay.js +++ b/src/Overlay.js @@ -1,9 +1,11 @@ import PropTypes from 'prop-types'; -import React, { useState, useRef } from 'react'; +import PopperJS from 'popper.js'; +import React, { useState } from 'react'; import ReactDOM from 'react-dom'; +import useCallbackRef from '@restart/hooks/useCallbackRef'; -import { Popper, placements } from 'react-popper'; import useRootClose from './useRootClose'; +import usePopper from './usePopper'; import useWaitForDOMRef from './utils/useWaitForDOMRef'; import { useMergedRefs } from './utils/mergeRefs'; @@ -12,12 +14,47 @@ import { useMergedRefs } from './utils/mergeRefs'; * great for custom tooltip overlays. */ const Overlay = React.forwardRef((props, outerRef) => { - const rootCloseRef = useRef(null); + const { + flip, + placement, + containerPadding, + popperConfig = {}, + transition: Transition, + } = props; + + const [ref, attachRef] = useCallbackRef(); + const [arrowRef, attachArrowRef] = useCallbackRef(); + const mergedRef = useMergedRefs(attachRef, outerRef); + const container = useWaitForDOMRef(props.container); const target = useWaitForDOMRef(props.target); const [exited, setExited] = useState(!props.show); + const { modifiers = {} } = popperConfig; + + const { styles, arrowStyles, ...popper } = usePopper(target, ref, { + ...popperConfig, + placement: placement || 'bottom', + enableEvents: props.show, + modifiers: { + ...modifiers, + preventOverflow: { + padding: containerPadding || 5, + ...modifiers.preventOverflow, + }, + arrow: { + ...modifiers.arrow, + enabled: !!arrowRef, + element: arrowRef, + }, + flip: { + enabled: !!flip, + ...modifiers.preventOverflow, + }, + }, + }); + if (props.show) { if (exited) setExited(false); } else if (!props.transition && !exited) { @@ -32,20 +69,10 @@ const Overlay = React.forwardRef((props, outerRef) => { } }; - const { - children, - flip, - placement, - containerPadding, - popperConfig = {}, - transition: Transition, - } = props; - // Don't un-render the overlay while it's transitioning out. const mountOverlay = props.show || (Transition && !exited); - const innerRef = useMergedRefs(rootCloseRef, outerRef); - useRootClose(rootCloseRef, props.onHide, { + useRootClose(ref, props.onHide, { disabled: !props.rootClose || props.rootCloseDisabled, clickTrigger: props.rootCloseEvent, }); @@ -55,63 +82,37 @@ const Overlay = React.forwardRef((props, outerRef) => { return null; } - let child = children; - - const { modifiers = {} } = popperConfig; - const popperProps = { - ...popperConfig, - innerRef, - placement, - referenceElement: target, - enableEvents: props.show, - modifiers: { - ...modifiers, - preventOverflow: { - padding: containerPadding || 5, - ...modifiers.preventOverflow, - }, - flip: { - enabled: !!flip, - ...modifiers.preventOverflow, - }, + let child = props.children({ + ...popper, + show: props.show, + props: { + style: styles, + ref: mergedRef, }, - }; + arrowProps: { + style: arrowStyles, + ref: attachArrowRef, + }, + }); - child = ( - - {({ arrowProps, style, ref, ...popper }) => { - let innerChild = props.children({ - ...popper, - // popper doesn't set the initial placement - placement: popper.placement || placement, - show: props.show, - - arrowProps, - props: { ref, style }, - }); - - if (Transition) { - let { onExit, onExiting, onEnter, onEntering, onEntered } = props; - - innerChild = ( - - {innerChild} - - ); - } - return innerChild; - }} - - ); + if (Transition) { + let { onExit, onExiting, onEnter, onEntering, onEntered } = props; + + child = ( + + {child} + + ); + } return container ? ReactDOM.createPortal(child, container) : null; }); @@ -125,7 +126,7 @@ Overlay.propTypes = { show: PropTypes.bool, /** Specify where the overlay element is positioned in relation to the target element */ - placement: PropTypes.oneOf(placements), + placement: PropTypes.oneOf(PopperJS.placements), /** * A DOM Element, Ref to an element, or function that returns either. The `target` element is where diff --git a/src/index.js b/src/index.js index fb2a39a4..55cbf2ab 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,17 @@ import Dropdown from './Dropdown'; +import { useDropdownMenu } from './DropdownMenu'; +import { useDropdownToggle } from './DropdownToggle'; import Modal from './Modal'; import Overlay from './Overlay'; import Portal from './Portal'; import useRootClose from './useRootClose'; -export { Dropdown, Modal, Overlay, Portal, useRootClose }; +export { + Dropdown, + useDropdownMenu, + useDropdownToggle, + Modal, + Overlay, + Portal, + useRootClose, +}; diff --git a/src/usePopper.js b/src/usePopper.js new file mode 100644 index 00000000..6de266b7 --- /dev/null +++ b/src/usePopper.js @@ -0,0 +1,121 @@ +import PopperJS from 'popper.js'; + +import { useCallback, useEffect, useState, useRef } from 'react'; + +const initialPopperStyles = { + position: 'absolute', + top: '0', + left: '0', + opacity: '0', + pointerEvents: 'none', +}; + +const initialArrowStyles = {}; + +const getRefValue = refOrValue => + refOrValue !== null && 'current' in refOrValue + ? refOrValue.current + : refOrValue; + +export default function usePopper( + referenceElement, + popperElement, + { + enabled = true, + placement = 'bottom', + positionFixed = false, + eventsEnabled = true, + modifiers = {}, + } = {}, +) { + const popperInstanceRef = useRef(); + + const hasArrow = !!(modifiers.arrow && modifiers.arrow.element); + + const scheduleUpdate = useCallback(() => { + if (popperInstanceRef.current) { + popperInstanceRef.current.scheduleUpdate(); + } + }, [popperInstanceRef]); + + const [state, setState] = useState({ + placement, + scheduleUpdate, + outOfBoundaries: false, + styles: initialPopperStyles, + arrowStyles: initialArrowStyles, + }); + + // A placement difference in state means popper determined a new placement + // apart from the props value. By the time the popper element is rendered with + // the new position Popper has already measured it, if the place change triggers + // a size change it will result in a misaligned popper. So we schedule an update to be sure. + useEffect(() => { + scheduleUpdate(); + }, [state.placement, scheduleUpdate]); + + /** Toggle Events */ + useEffect(() => { + if (popperInstanceRef.current) { + // eslint-disable-next-line no-unused-expressions + eventsEnabled + ? popperInstanceRef.current.enableEventListeners() + : popperInstanceRef.current.disableEventListeners(); + } + }, [eventsEnabled, popperInstanceRef]); + + useEffect(() => { + if (!enabled || referenceElement === null || popperElement === null) { + return undefined; + } + + const arrow = modifiers.arrow && { + ...modifiers.arrow, + element: getRefValue(modifiers.arrow.element), + }; + + popperInstanceRef.current = new PopperJS(referenceElement, popperElement, { + placement, + positionFixed, + modifiers: { + ...modifiers, + arrow, + applyStyle: { enabled: false }, + updateStateModifier: { + enabled: true, + order: 900, + fn(data) { + setState({ + scheduleUpdate, + styles: { + position: data.offsets.popper.position, + ...data.styles, + }, + arrowStyles: data.arrowStyles, + outOfBoundaries: data.hide, + placement: data.placement, + }); + }, + }, + }, + }); + + return () => { + if (popperInstanceRef.current !== null) { + popperInstanceRef.current.destroy(); + popperInstanceRef.current = null; + } + }; + // intentionally NOT re-running on new modifiers + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + enabled, + placement, + positionFixed, + referenceElement, + popperElement, + hasArrow, + ]); + + return state; +} diff --git a/src/useRootClose.js b/src/useRootClose.js index 6de08a52..55b90fe6 100644 --- a/src/useRootClose.js +++ b/src/useRootClose.js @@ -67,7 +67,7 @@ function useRootClose( }); useEffect(() => { - if (disabled) return undefined; + if (disabled || ref == null) return undefined; // Use capture for this listener so it fires before React's listener, to // avoid false positives in the contains() check below if the target DOM @@ -95,7 +95,14 @@ function useRootClose( removeKeyupListener(); mobileSafariHackListeners.forEach(remove => remove()); }; - }, [disabled, clickTrigger, handleMouseCapture, handleMouse, handleKeyUp]); + }, [ + ref, + disabled, + clickTrigger, + handleMouseCapture, + handleMouse, + handleKeyUp, + ]); } export default useRootClose; diff --git a/test/helpers.js b/test/helpers.js index 5d9e1be8..345bac2a 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -1,32 +1,7 @@ -import { cloneElement } from 'react'; -import ReactDOM from 'react-dom'; - export function shouldWarn(about) { console.error.expected.push(about); } -/** - * Helper for rendering and updating props for plain class Components - * since `setProps` is deprecated. - * @param {ReactElement} element Root element to render - * @param {HTMLElement?} mountPoint Optional mount node, when empty it uses an unattached div like `renderIntoDocument()` - * @return {ComponentInstance} The instance, with a new method `renderWithProps` which will return a new instance with updated props - */ -export function render(element, mountPoint) { - let mount = mountPoint || document.createElement('div'); - - // eslint-disable-next-line react/no-render-return-value - let instance = ReactDOM.render(element, mount); - - if (!instance.renderWithProps) { - instance.renderWithProps = function(newProps) { - return render(cloneElement(element, newProps), mount); - }; - } - - return instance; -} - let style; let seen = []; @@ -37,7 +12,7 @@ export function injectCss(rules) { style = style || - (function() { + (function iife() { let _style = document.createElement('style'); _style.appendChild(document.createTextNode('')); document.head.appendChild(_style); @@ -48,7 +23,7 @@ export function injectCss(rules) { style.innerHTML += `\n${rules}`; } -injectCss.reset = function() { +injectCss.reset = () => { if (style) { document.head.removeChild(style); } diff --git a/www/gatsby-browser.js b/www/gatsby-browser.js index d5cffa19..11bb8456 100644 --- a/www/gatsby-browser.js +++ b/www/gatsby-browser.js @@ -1,3 +1,3 @@ -import './src/styles.less'; +import './src/styles.scss'; export const onClientEntry = () => {}; diff --git a/www/gatsby-config.js b/www/gatsby-config.js index 485cda7c..d8782334 100644 --- a/www/gatsby-config.js +++ b/www/gatsby-config.js @@ -30,8 +30,11 @@ module.exports = { name: 'source', }, }, - // 'gatsby-plugin-emotion', - 'gatsby-plugin-less', + 'gatsby-plugin-sass', + { + resolve: 'gatsby-plugin-astroturf', + options: { extension: '.module.scss' }, + }, { resolve: 'gatsby-transformer-react-docgen', options: { diff --git a/www/gatsby-ssr.js b/www/gatsby-ssr.js index 717eb7a3..502b7ba9 100644 --- a/www/gatsby-ssr.js +++ b/www/gatsby-ssr.js @@ -1,15 +1,9 @@ const React = require('react'); -require('./src/styles.less'); +require('./src/styles.scss'); exports.onRenderBody = ({ setHeadComponents }) => { setHeadComponents( <> - - p.block && - css` - display: block; - margin-top: 20px; - `} - - :before, - :after { + &.block { + display: block; + margin-top: 20px; + } + + &:before, + &:after { color: #969584; } - :before { + &:before { content: '{ '; } - :after { + &:after { content: ' }'; } `; diff --git a/www/src/components/Playground.js b/www/src/components/Playground.js index f42c6c6d..433dd943 100644 --- a/www/src/components/Playground.js +++ b/www/src/components/Playground.js @@ -14,8 +14,8 @@ import * as ReactOverlays from 'react-overlays'; import getOffset from 'dom-helpers/query/offset'; -import { css } from '@emotion/core'; -import styled from '@emotion/styled'; +import { css as emotionCss } from '@emotion/core'; +import emotionStyled from '@emotion/styled'; import injectCss from '../injectCss'; Babel.registerPreset('env', require('@babel/preset-env')); @@ -38,8 +38,8 @@ const scope = { Transition, ENTERED, ENTERING, - css, - styled, + css: emotionCss, + styled: emotionStyled, }; export default class Playground extends React.Component { diff --git a/www/src/examples/.eslintrc b/www/src/examples/.eslintrc index 59fe9fc3..d429377f 100644 --- a/www/src/examples/.eslintrc +++ b/www/src/examples/.eslintrc @@ -21,6 +21,8 @@ "Modal": false, "Overlay": false, "Dropdown": false, + "useDropdownMenu": false, + "useDropdownToggle": false, "Portal": false, "useRootClose": false, "css": false, diff --git a/www/src/examples/Dropdown.js b/www/src/examples/Dropdown.js index 2fd7d2ea..04f2bee0 100644 --- a/www/src/examples/Dropdown.js +++ b/www/src/examples/Dropdown.js @@ -9,36 +9,34 @@ const MenuContainer = styled('div')` padding: 20px; `; -const Menu = ({ role }) => ( - - {({ show, onClose, props }) => ( - - - - - )} - -); - -const Toggle = ({ id, children }) => ( - - {({ toggle, show, props }) => ( - - )} - -); + + + ); +}; + +const Toggle = ({ id, children }) => { + const [props, { show, toggle }] = useDropdownToggle(); + return ( + + ); +}; const DropdownButton = ({ show, onToggle, drop, alignEnd, title, role }) => ( ( @@ -97,7 +97,7 @@ class TransitionExample extends React.Component { modifiers={{ offset: { enabled: true, offset: '0 5px' } }} target={() => this.tooltipRef.current} > - {({ ref, style }) => ( + {({ props: { ref, style } }) => (
Hello there
diff --git a/www/src/injectCss.js b/www/src/injectCss.js index 0da5671e..3f256e0f 100644 --- a/www/src/injectCss.js +++ b/www/src/injectCss.js @@ -8,7 +8,7 @@ export default function injectCss(rules) { style = style || - (function() { + (() => { let _style = document.createElement('style'); _style.appendChild(document.createTextNode('')); document.head.appendChild(_style); diff --git a/www/src/pages/index.js b/www/src/pages/index.js index 9c493389..67e66bac 100644 --- a/www/src/pages/index.js +++ b/www/src/pages/index.js @@ -2,6 +2,8 @@ import PropTypes from 'prop-types'; import React from 'react'; import { graphql } from 'gatsby'; + +import styled from 'astroturf'; import PropTable from '../components/PropTable'; import Playground from '../components/Playground'; import HookDocumentation from '../components/HookDocumentation'; @@ -13,6 +15,13 @@ import PortalSource from '../examples/Portal'; import useRootCloseSource from '../examples/useRootClose'; import TransitionSource from '../examples/Transition'; +const NavList = styled('ul')` + composes: nav d-flex flex-column from global; + + position: sticky; + top: 40px; +`; + class Anchor extends React.Component { static propTypes = { id: PropTypes.string, @@ -49,32 +58,41 @@ class Example extends React.Component { return (
- -
+

Portals diff --git a/www/src/styles.less b/www/src/styles.scss similarity index 89% rename from www/src/styles.less rename to www/src/styles.scss index 611483c0..1d9bb148 100644 --- a/www/src/styles.less +++ b/www/src/styles.scss @@ -1,6 +1,5 @@ -// .panel-default { -// border-radius: 0; -// } +@import './variables.scss'; +@import '~bootstrap/scss/bootstrap.scss'; button { padding: 0; @@ -17,17 +16,6 @@ button { padding-top: 0; } -.side-panel { - ul { - position: sticky; - top: 40px; - } - - ul > li { - padding: 5px; - } -} - pre { border-radius: 0; border: none; @@ -36,10 +24,10 @@ pre { } code { - color: #555; + color: $primary; margin: -0.05rem -0.15em; padding: 0.05rem 0.35em; - background-color: rgba(0, 0, 0, 0.04); + background-color: transparentize($primary, 0.9); } .playground-editor, diff --git a/www/yarn.lock b/www/yarn.lock index 06d513d3..d9d5108f 100644 --- a/www/yarn.lock +++ b/www/yarn.lock @@ -27,7 +27,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.2": +"@babel/core@^7.1.2", "@babel/core@^7.3.4": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== @@ -57,7 +57,7 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.1.3", "@babel/generator@^7.4.4": +"@babel/generator@^7.1.3", "@babel/generator@^7.3.4", "@babel/generator@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== @@ -1534,7 +1534,7 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@babel/types@^7.1.3", "@babel/types@^7.4.4": +"@babel/types@^7.1.3", "@babel/types@^7.3.4", "@babel/types@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== @@ -2155,7 +2155,7 @@ ajv@^6.1.0: json-schema-traverse "^0.4.1" uri-js "^4.2.1" -ajv@^6.9.1: +ajv@^6.5.5, ajv@^6.9.1: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== @@ -2169,6 +2169,11 @@ alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -2348,6 +2353,18 @@ asn1.js@^4.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" @@ -2372,10 +2389,33 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astroturf@^0.9.5: + version "0.9.5" + resolved "https://registry.yarnpkg.com/astroturf/-/astroturf-0.9.5.tgz#bb0531fd5e21d9142ff46e8f1bcd04f33a595132" + integrity sha512-+NoPljRuzAY9Co2lFy392ko6XDVd1L6tSifaUmAm/smQjfkXIkQUAJn2tIv4o+eu4SigUIiypEsJSIgdRCHRnA== + dependencies: + "@babel/core" "^7.3.4" + "@babel/generator" "^7.3.4" + "@babel/template" "^7.2.2" + "@babel/types" "^7.3.4" + common-tags "^1.8.0" + errno "^0.1.7" + fs-extra "^8.0.0" + loader-utils "^1.2.3" + lodash "^4.17.11" + memory-fs "^0.4.1" + postcss-loader "^3.0.0" + postcss-nested "^4.1.1" + async-each@^1.0.0, async-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" @@ -2390,6 +2430,11 @@ async@^2.1.4: dependencies: lodash "^4.17.10" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + atob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" @@ -2414,6 +2459,16 @@ autoprefixer@^9.6.0: postcss "^7.0.17" postcss-value-parser "^4.0.0" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + axobject-query@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.1.tgz#05dfa705ada8ad9db993fa6896f22d395b0b0a07" @@ -2634,6 +2689,13 @@ batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" @@ -2663,6 +2725,11 @@ big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" @@ -2671,6 +2738,13 @@ blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + bluebird@^3.5.0: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -2729,6 +2803,11 @@ boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" +bootstrap@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.3.1.tgz#280ca8f610504d99d7b6b4bfc4b68cec601704ac" + integrity sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag== + boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" @@ -3104,6 +3183,24 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -3155,11 +3252,16 @@ capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + ccount@^1.0.0, ccount@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.3.tgz#f1cec43f332e2ea5a569fd46f9f5bde4e6102aff" -chalk@1.1.3, chalk@^1.1.3: +chalk@1.1.3, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -3405,6 +3507,16 @@ clone-buffer@^1.0.0: resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= +clone-deep@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" + integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ== + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.4" + kind-of "^6.0.0" + shallow-clone "^1.0.0" + clone-response@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -3488,6 +3600,13 @@ colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + comma-separated-tokens@^1.0.0, comma-separated-tokens@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.5.tgz#b13793131d9ea2d2431cf5b507ddec258f0ce0db" @@ -3735,7 +3854,7 @@ core-js@^2.4.1: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -3848,6 +3967,14 @@ cross-spawn@5.1.0, cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -4106,6 +4233,13 @@ damerau-levenshtein@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -4141,7 +4275,7 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.2.0: +decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -4232,6 +4366,11 @@ del@^3.0.0: pify "^3.0.0" rimraf "^2.2.8" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + delegate@^3.1.2: version "3.2.0" resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" @@ -4571,6 +4710,14 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -4716,7 +4863,7 @@ eol@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/eol/-/eol-0.8.1.tgz#defc3224990c7eca73bb34461a56cf9dc24761d0" -errno@^0.1.3, errno@~0.1.7: +errno@^0.1.3, errno@^0.1.7, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" dependencies: @@ -5157,7 +5304,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0: +extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -5191,6 +5338,16 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -5405,14 +5562,40 @@ follow-redirects@^1.0.0: dependencies: debug "^3.1.0" -for-in@^1.0.2: +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= + +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -5472,6 +5655,15 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.0.1.tgz#90294081f978b1f182f347a440a209154344285b" + integrity sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -5514,6 +5706,16 @@ fsevents@^1.2.7: nan "^2.9.2" node-pre-gyp "^0.10.0" +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -5598,6 +5800,11 @@ gatsby-page-utils@^0.0.5: micromatch "^3.1.10" slash "^1.0.0" +gatsby-plugin-astroturf@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/gatsby-plugin-astroturf/-/gatsby-plugin-astroturf-0.2.1.tgz#b5ed009f5bb682dc78840a0adf25823c6d539aef" + integrity sha512-BjlGgfMVQVJjAeIKfCy+b+MyWWGAbAQKn20CGBsWcvGl/Yj+dYNUgptLqdpV1mBKA8JKmL5QDx60vnW9ouR7EA== + gatsby-plugin-catch-links@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/gatsby-plugin-catch-links/-/gatsby-plugin-catch-links-2.1.2.tgz#f7e04e2b390341ba4b1f8f0e12d4bcf78b1e542d" @@ -5641,6 +5848,14 @@ gatsby-plugin-page-creator@^2.1.5: lodash "^4.17.14" micromatch "^3.1.10" +gatsby-plugin-sass@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/gatsby-plugin-sass/-/gatsby-plugin-sass-2.0.11.tgz#25ef6a206107e24ac49d50866f0595c2aa489649" + integrity sha512-EopQgb7FoC8XmkM691NppbAwPi2JaC6yv7SWrSdCDEJkLxr9V98KCfr7tMk0KW64LF8pj+XjtwKVtEwCPEQ0gg== + dependencies: + "@babel/runtime" "^7.0.0" + sass-loader "^7.0.1" + gatsby-plugin-sorted-assets@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/gatsby-plugin-sorted-assets/-/gatsby-plugin-sorted-assets-1.0.2.tgz#09a3b66850fc9c12b0fd2658626bb7322b706c8a" @@ -5902,6 +6117,13 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -5915,6 +6137,11 @@ get-port@^4.0.0: resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -5930,6 +6157,13 @@ get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + git-up@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0" @@ -5993,9 +6227,10 @@ glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +glob@^7.0.0, glob@^7.1.4, glob@~7.1.1: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -6004,10 +6239,9 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -6016,10 +6250,10 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== +glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -6083,6 +6317,15 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" @@ -6243,6 +6486,19 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -6581,6 +6837,15 @@ http-proxy@^1.17.0: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -6671,6 +6936,18 @@ imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -6686,7 +6963,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -6983,6 +7260,13 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -7145,13 +7429,18 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + is-unc-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" dependencies: unc-path-regex "^0.1.2" -is-utf8@^0.2.1: +is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= @@ -7217,6 +7506,11 @@ isomorphic-fetch@^2.1.1: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + isurl@^1.0.0-alpha5: version "1.0.0" resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" @@ -7234,6 +7528,11 @@ jest-worker@^23.2.0: dependencies: merge-stream "^1.0.1" +js-base64@^2.1.8: + version "2.5.1" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" + integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== + js-levenshtein@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5" @@ -7268,6 +7567,11 @@ js-yaml@~3.10.0: argparse "^1.0.7" esprima "^4.0.0" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" @@ -7293,11 +7597,16 @@ json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" -json-stringify-safe@^5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -7309,6 +7618,13 @@ json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + json5@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" @@ -7331,6 +7647,16 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + jsx-ast-utils@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" @@ -7438,6 +7764,17 @@ livereload-js@^2.3.0: resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -7468,6 +7805,15 @@ loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" +loader-utils@^1.0.1, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" @@ -7530,6 +7876,11 @@ lodash.mergewith@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" +lodash.tail@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ= + lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" @@ -7543,15 +7894,15 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@^4.11.1, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - -lodash@^4.17.11: +lodash@^4.0.0, lodash@^4.17.11, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +lodash@^4.11.1, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + lodash@^4.17.14: version "4.17.14" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" @@ -7593,7 +7944,7 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4 dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.2.0, loud-rejection@^1.6.0: +loud-rejection@^1.0.0, loud-rejection@^1.2.0, loud-rejection@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" dependencies: @@ -7674,6 +8025,11 @@ map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -7820,6 +8176,22 @@ memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -7873,19 +8245,19 @@ mime-db@1.40.0: version "1.35.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" -mime-types@~2.1.17, mime-types@~2.1.18: - version "2.1.19" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" - dependencies: - mime-db "~1.35.0" - -mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.24" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== dependencies: mime-db "1.40.0" +mime-types@~2.1.17, mime-types@~2.1.18: + version "2.1.19" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" + dependencies: + mime-db "~1.35.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -7935,7 +8307,7 @@ minimatch@3.0.3: dependencies: brace-expansion "^1.0.0" -minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -7945,7 +8317,7 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.0, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -7993,7 +8365,15 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -8069,6 +8449,11 @@ name-all-modules-plugin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/name-all-modules-plugin/-/name-all-modules-plugin-1.0.1.tgz#0abfb6ad835718b9fb4def0674e06657a954375c" +nan@^2.13.2: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" @@ -8169,6 +8554,24 @@ node-forge@0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -8250,6 +8653,29 @@ node-releases@^1.1.8: dependencies: semver "^5.3.0" +node-sass@^4.12.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" + integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.11" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + noms@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" @@ -8257,6 +8683,13 @@ noms@0.0.0: inherits "^2.0.1" readable-stream "~1.0.31" +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -8273,6 +8706,16 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -8340,7 +8783,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -8372,6 +8815,11 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -8557,6 +9005,13 @@ os-homedir@^2.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-2.0.0.tgz#a0c76bb001a8392a503cbd46e7e650b3423a923c" integrity sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q== +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" @@ -8578,7 +9033,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" -osenv@^0.1.4: +osenv@0, osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" dependencies: @@ -8874,6 +9329,15 @@ path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -8897,6 +9361,11 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + physical-cpu-count@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660" @@ -9035,6 +9504,16 @@ postcss-loader@^2.1.3: postcss-load-config "^2.0.0" schema-utils "^0.4.0" +postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + postcss-merge-longhand@^4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" @@ -9124,6 +9603,14 @@ postcss-modules-values@^1.3.0: icss-replace-symbols "^1.1.0" postcss "^6.0.1" +postcss-nested@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-4.1.2.tgz#8e0570f736bfb4be5136e31901bf2380b819a561" + integrity sha512-9bQFr2TezohU3KRSu9f6sfecXmf/x6RXDedl8CHF6fyuyVW7UqgNMRdWMHZQWuFY6Xqs2NYk+Fj4Z4vSOf7PQg== + dependencies: + postcss "^7.0.14" + postcss-selector-parser "^5.0.0" + postcss-normalize-charset@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" @@ -9242,7 +9729,7 @@ postcss-selector-parser@^3.0.0: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^5.0.0-rc.4: +postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.4: version "5.0.0" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== @@ -9301,7 +9788,7 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.5: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.17: +postcss@^7.0.14, postcss@^7.0.17: version "7.0.17" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f" integrity sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ== @@ -9439,6 +9926,11 @@ pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +psl@^1.1.24: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + public-encrypt@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" @@ -9476,7 +9968,7 @@ punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" -punycode@^1.2.4: +punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -9497,6 +9989,11 @@ qs@^6.4.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" @@ -9740,6 +10237,14 @@ read-chunk@^3.0.0: pify "^4.0.1" with-open-file "^0.1.5" +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -9755,6 +10260,15 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -9867,6 +10381,14 @@ recursive-readdir@2.2.1: dependencies: minimatch "3.0.3" +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + redux-thunk@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" @@ -10213,10 +10735,43 @@ repeat-string@^1.5.0, repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@ version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + replace-ext@1.0.0, replace-ext@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" +request@^2.87.0, request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -10271,7 +10826,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.3: +resolve@^1.1.3, resolve@^1.10.0: version "1.11.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== @@ -10317,7 +10872,7 @@ rgba-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" -rimraf@2.6.3, rimraf@^2.6.3: +rimraf@2, rimraf@2.6.3, rimraf@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -10385,7 +10940,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -10404,6 +10959,28 @@ sanitize-html@^1.18.2: srcset "^1.0.0" xtend "^4.0.0" +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" + integrity sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w== + dependencies: + clone-deep "^2.0.1" + loader-utils "^1.0.1" + lodash.tail "^4.1.1" + neo-async "^2.5.0" + pify "^3.0.0" + semver "^5.5.0" + sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -10439,6 +11016,14 @@ scroll-behavior@^0.9.9: dom-helpers "^3.2.1" invariant "^2.2.2" +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" @@ -10486,6 +11071,11 @@ semver@^6.1.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -10584,6 +11174,15 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" + integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA== + dependencies: + is-extendable "^0.1.1" + kind-of "^5.0.0" + mixin-object "^2.0.1" + shallow-compare@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/shallow-compare/-/shallow-compare-1.2.2.tgz#fa4794627bf455a47c4f56881d8a6132d581ffdb" @@ -10797,6 +11396,13 @@ source-map@0.5.7, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, sourc version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -10883,6 +11489,21 @@ srcset@^1.0.0: array-uniq "^1.0.2" number-is-nan "^1.0.0" +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -10926,6 +11547,13 @@ statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + dependencies: + readable-stream "^2.0.1" + stream-array@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/stream-array/-/stream-array-1.1.2.tgz#9e5f7345f2137c30ee3b498b9114e80b52bb7eb5" @@ -10993,7 +11621,7 @@ string-template@~0.2.1: resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= -string-width@^1.0.1: +string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" dependencies: @@ -11073,6 +11701,13 @@ strip-bom-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -11081,6 +11716,13 @@ strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -11174,6 +11816,15 @@ tapable@^1.1.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + tar@^4: version "4.4.4" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" @@ -11374,10 +12025,23 @@ toposort@^2.0.2: resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + trim-lines@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.1.tgz#da738ff58fa74817588455e30b11b85289f2a396" +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -11394,7 +12058,7 @@ trough@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.2.tgz#7f1663ec55c480139e2de5e486c6aef6cc24a535" -"true-case-path@^1.0.3": +"true-case-path@^1.0.2", "true-case-path@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== @@ -11414,6 +12078,18 @@ tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -11809,6 +12485,15 @@ vendors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + vfile-location@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.3.tgz#083ba80e50968e8d420be49dd1ea9a992131df77" @@ -12104,11 +12789,16 @@ whatwg-fetch@>=0.10.0: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" -which@^1.2.14, which@^1.2.9: +which@1, which@^1.2.14, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" dependencies: @@ -12268,6 +12958,13 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" @@ -12310,6 +13007,25 @@ yargs@^12.0.2, yargs@^12.0.5: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + yargs@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" diff --git a/yarn.lock b/yarn.lock index 3789140d..224b1539 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7685,7 +7685,7 @@ pngjs@^3.0.0, pngjs@^3.2.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== -popper.js@^1.14.4: +popper.js@^1.14.4, popper.js@^1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2" integrity sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA== From f44ca177576e0694eafb9e2cf7c2517d1f5e4af1 Mon Sep 17 00:00:00 2001 From: Bogdan Chadkin Date: Sun, 7 Jul 2019 13:35:06 +0300 Subject: [PATCH 3/8] Remove react-popper --- package.json | 1 - yarn.lock | 25 ++++--------------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 03881f31..07a815d2 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,6 @@ "dom-helpers": "^3.4.0", "popper.js": "^1.15.0", "prop-types": "^15.7.2", - "react-popper": "^1.3.3", "uncontrollable": "^7.0.0", "warning": "^4.0.3" }, diff --git a/yarn.lock b/yarn.lock index 224b1539..578187ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2820,7 +2820,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-react-context@0.2.2, create-react-context@<=0.2.2: +create-react-context@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.2.tgz#9836542f9aaa22868cd7d4a6f82667df38019dca" integrity sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A== @@ -7685,7 +7685,7 @@ pngjs@^3.0.0, pngjs@^3.2.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== -popper.js@^1.14.4, popper.js@^1.15.0: +popper.js@^1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2" integrity sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA== @@ -8141,7 +8141,7 @@ prop-types-exact@^1.2.0: object.assign "^4.1.0" reflect.ownkeys "^0.2.0" -prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -8362,18 +8362,6 @@ react-live@^2.1.2: react-simple-code-editor "^0.9.0" unescape "^0.2.0" -react-popper@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.3.tgz#2c6cef7515a991256b4f0536cd4bdcb58a7b6af6" - integrity sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w== - dependencies: - "@babel/runtime" "^7.1.2" - create-react-context "<=0.2.2" - popper.js "^1.14.4" - prop-types "^15.6.1" - typed-styles "^0.0.7" - warning "^4.0.2" - react-simple-code-editor@^0.9.0: version "0.9.13" resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.9.13.tgz#4567b23c5dff4e74d9c4f9f29f95b74a5d511b5a" @@ -9864,11 +9852,6 @@ type-is@~1.6.17: media-typer "0.3.0" mime-types "~2.1.24" -typed-styles@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" - integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -10173,7 +10156,7 @@ warning@^3.0.0: dependencies: loose-envify "^1.0.0" -warning@^4.0.2, warning@^4.0.3: +warning@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== From 8986b3d08cd340d6888bb9cfe44dba0b88b48709 Mon Sep 17 00:00:00 2001 From: Bogdan Chadkin Date: Sun, 7 Jul 2019 14:00:42 +0300 Subject: [PATCH 4/8] Remove explicit ref from dependencies list --- src/usePopper.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/usePopper.js b/src/usePopper.js index 6de266b7..e2d5ebc9 100644 --- a/src/usePopper.js +++ b/src/usePopper.js @@ -36,7 +36,7 @@ export default function usePopper( if (popperInstanceRef.current) { popperInstanceRef.current.scheduleUpdate(); } - }, [popperInstanceRef]); + }, []); const [state, setState] = useState({ placement, @@ -62,7 +62,7 @@ export default function usePopper( ? popperInstanceRef.current.enableEventListeners() : popperInstanceRef.current.disableEventListeners(); } - }, [eventsEnabled, popperInstanceRef]); + }, [eventsEnabled]); useEffect(() => { if (!enabled || referenceElement === null || popperElement === null) { From 02366b86652bedfee4e085fb7240c6cf77ad8674 Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Mon, 5 Aug 2019 12:36:40 -0400 Subject: [PATCH 5/8] address feedback --- src/Dropdown.js | 69 +++++++++++++++++++++++++++++----------- src/DropdownMenu.js | 8 ++--- src/DropdownToggle.js | 4 +++ src/Overlay.js | 12 +++---- src/usePopper.js | 12 +++++++ test/DropdownSpec.js | 21 ++++++------ test/OverlaySpec.js | 3 +- test/useRootCloseSpec.js | 2 +- 8 files changed, 90 insertions(+), 41 deletions(-) diff --git a/src/Dropdown.js b/src/Dropdown.js index 763151d4..b2486fb1 100644 --- a/src/Dropdown.js +++ b/src/Dropdown.js @@ -1,16 +1,27 @@ import matches from 'dom-helpers/query/matches'; import qsa from 'dom-helpers/query/querySelectorAll'; -import React, { useCallback, useRef, useEffect, useMemo } from 'react'; +import React, { + useCallback, + useRef, + useEffect, + useState, + useMemo, +} from 'react'; import PropTypes from 'prop-types'; import { useUncontrolled } from 'uncontrollable'; -import useCallbackRef from '@restart/hooks/useCallbackRef'; import usePrevious from '@restart/hooks/usePrevious'; +import useCallbackRef from '@restart/hooks/useCallbackRef'; import useEventCallback from '@restart/hooks/useEventCallback'; import DropdownContext from './DropdownContext'; import DropdownMenu from './DropdownMenu'; import DropdownToggle from './DropdownToggle'; +function useForceUpdate() { + const [, setState] = useState(false); + return useCallback(() => setState(value => !value), []); +} + const propTypes = { /** * A render prop that returns the root dropdown element. The `props` @@ -104,12 +115,28 @@ function Dropdown({ focusFirstItemOnShow, children, }) { + const forceUpdate = useForceUpdate(); const { show, onToggle } = useUncontrolled( { defaultShow, show: rawShow, onToggle: rawOnToggle }, { show: 'onToggle' }, ); - const [toggleElement, attachToggle] = useCallbackRef(); - const [menuElement, attachMenu] = useCallbackRef(); + + const [toggleElement, setToggle] = useCallbackRef(); + + // We use normal refs instead of useCallbackRef in order to populate the + // the value as quickly as possible, otherwise the effect to focus the element + // may run before the state value is set + const menuRef = useRef(); + const menuElement = menuRef.current; + + const setMenu = useCallback( + ref => { + menuRef.current = ref; + // ensure that a menu set triggers an update for consumers + forceUpdate(); + }, + [forceUpdate], + ); const lastShow = usePrevious(show); const lastSourceEvent = useRef(null); @@ -130,18 +157,18 @@ function Dropdown({ alignEnd, menuElement, toggleElement, - setMenu: attachMenu, - setToggle: attachToggle, + setMenu, + setToggle, }), [ - alignEnd, - attachMenu, - attachToggle, + toggle, drop, - menuElement, show, - toggle, + alignEnd, + menuElement, toggleElement, + setMenu, + setToggle, ], ); @@ -149,7 +176,7 @@ function Dropdown({ focusInDropdown.current = menuElement.contains(document.activeElement); } - const focus = useEventCallback(() => { + const focusToggle = useEventCallback(() => { if (toggleElement && toggleElement.focus) { toggleElement.focus(); } @@ -158,9 +185,12 @@ function Dropdown({ const maybeFocusFirst = useEventCallback(() => { const type = lastSourceEvent.current; let focusStype = focusFirstItemOnShow; + if (focusStype == null) { focusStype = - menuElement && matches(menuElement, '[role=menu]') ? 'keyboard' : false; + menuRef.current && matches(menuRef.current, '[role=menu]') + ? 'keyboard' + : false; } if ( @@ -170,7 +200,7 @@ function Dropdown({ return; } - let first = qsa(menuElement, itemSelector)[0]; + let first = qsa(menuRef.current, itemSelector)[0]; if (first && first.focus) first.focus(); }); @@ -178,18 +208,19 @@ function Dropdown({ if (show) maybeFocusFirst(); else if (focusInDropdown.current) { focusInDropdown.current = false; + focusToggle(); } // only `show` should be changing - }, [show, focusInDropdown, focus, maybeFocusFirst]); + }, [show, focusInDropdown, focusToggle, maybeFocusFirst]); useEffect(() => { lastSourceEvent.current = null; }); const getNextFocusedChild = (current, offset) => { - if (!menuElement) return null; + if (!menuRef.current) return null; - let items = qsa(menuElement, itemSelector); + let items = qsa(menuRef.current, itemSelector); let index = items.indexOf(current) + offset; index = Math.max(0, Math.min(index, items.length)); @@ -206,7 +237,9 @@ function Dropdown({ if ( isInput && (key === ' ' || - (key !== 'Escape' && menuElement && menuElement.contains(target))) + (key !== 'Escape' && + menuRef.current && + menuRef.current.contains(target))) ) { return; } diff --git a/src/DropdownMenu.js b/src/DropdownMenu.js index 6c21bb44..b745216f 100644 --- a/src/DropdownMenu.js +++ b/src/DropdownMenu.js @@ -7,11 +7,9 @@ import useRootClose from './useRootClose'; import DropdownContext from './DropdownContext'; export function useDropdownMenu(options = {}) { - // const prevProps = usePrevious(props); const context = useContext(DropdownContext); - // const [ref, attachRef] = useCallbackRef(); - const [arrowRef, attachArrowRef] = useCallbackRef(); + const [arrowElement, attachArrowRef] = useCallbackRef(); const hasShownRef = useRef(false); @@ -51,8 +49,8 @@ export function useDropdownMenu(options = {}) { flip: { enabled: !!flip }, arrow: { ...(popperConfig.modifiers && popperConfig.modifiers.arrow), - enabled: !!arrowRef, - element: arrowRef, + enabled: !!arrowElement, + element: arrowElement, }, ...popperConfig.modifiers, }, diff --git a/src/DropdownToggle.js b/src/DropdownToggle.js index 5904a49b..39294726 100644 --- a/src/DropdownToggle.js +++ b/src/DropdownToggle.js @@ -3,6 +3,10 @@ import { useContext } from 'react'; import DropdownContext from './DropdownContext'; +/** + * Wires up Dropdown toggle functinality, returning a set a props to attach + * to the element that functions as the dropdown toggle (generally a button). + */ export function useDropdownToggle() { const { show, toggle, setToggle } = useContext(DropdownContext); return [ diff --git a/src/Overlay.js b/src/Overlay.js index ffafce02..332fd929 100644 --- a/src/Overlay.js +++ b/src/Overlay.js @@ -22,8 +22,8 @@ const Overlay = React.forwardRef((props, outerRef) => { transition: Transition, } = props; - const [ref, attachRef] = useCallbackRef(); - const [arrowRef, attachArrowRef] = useCallbackRef(); + const [rootElement, attachRef] = useCallbackRef(); + const [arrowElement, attachArrowRef] = useCallbackRef(); const mergedRef = useMergedRefs(attachRef, outerRef); const container = useWaitForDOMRef(props.container); @@ -33,7 +33,7 @@ const Overlay = React.forwardRef((props, outerRef) => { const { modifiers = {} } = popperConfig; - const { styles, arrowStyles, ...popper } = usePopper(target, ref, { + const { styles, arrowStyles, ...popper } = usePopper(target, rootElement, { ...popperConfig, placement: placement || 'bottom', enableEvents: props.show, @@ -45,8 +45,8 @@ const Overlay = React.forwardRef((props, outerRef) => { }, arrow: { ...modifiers.arrow, - enabled: !!arrowRef, - element: arrowRef, + enabled: !!arrowElement, + element: arrowElement, }, flip: { enabled: !!flip, @@ -72,7 +72,7 @@ const Overlay = React.forwardRef((props, outerRef) => { // Don't un-render the overlay while it's transitioning out. const mountOverlay = props.show || (Transition && !exited); - useRootClose(ref, props.onHide, { + useRootClose(rootElement, props.onHide, { disabled: !props.rootClose || props.rootCloseDisabled, clickTrigger: props.rootCloseEvent, }); diff --git a/src/usePopper.js b/src/usePopper.js index b91f1d22..a4449386 100644 --- a/src/usePopper.js +++ b/src/usePopper.js @@ -12,6 +12,18 @@ const initialPopperStyles = { const initialArrowStyles = {}; +/** + * Position an element relative some reference element using Popper.js + * + * @param {HTMLElement} referenceElement The element + * @param {HTMLElement} popperElement + * @param {Object} options + * @param {Object} options.modifiers Popper.js modifiers + * @param {Boolean} options.enabled toggle the popper functionality on/off + * @param {String} options.placement The popper element placement relative to the reference element + * @param {Boolean} options.positionFixed use fixed positioning + * @param {Boolean} options.eventsEnabled have Popper listen on window resize events to reposition the element + */ export default function usePopper( referenceElement, popperElement, diff --git a/test/DropdownSpec.js b/test/DropdownSpec.js index afc933f6..b9bc5105 100644 --- a/test/DropdownSpec.js +++ b/test/DropdownSpec.js @@ -3,6 +3,7 @@ import ReactDOM from 'react-dom'; import { act } from 'react-dom/test-utils'; import { mount } from 'enzyme'; +import simulant from 'simulant'; import Dropdown from '../src/Dropdown'; @@ -78,7 +79,9 @@ describe('', () => { args.alignEnd.should.equal(true); }); - mount(); + mount( + , + ); renderSpy.should.have.been.called; }); @@ -90,9 +93,10 @@ describe('', () => { const wrapper = mount(); wrapper.assertNone('.show'); + wrapper.assertNone('ReactOverlaysDropdownMenu > *'); wrapper.assertSingle('button[aria-expanded=false]').simulate('click'); - wrapper.assertSingle('ReactOverlaysDropdown[show=true]'); + wrapper.assertSingle('ReactOverlaysDropdown'); wrapper.assertSingle('div[data-show=true]'); wrapper.assertSingle('button[aria-expanded=true]').simulate('click'); @@ -106,14 +110,13 @@ describe('', () => { const closeSpy = sinon.spy(); const wrapper = mount(); + wrapper.find('.toggle').simulate('click'); + act(() => { - wrapper.find('.toggle').simulate('click'); + // Use native events as the click doesn't have to be in the React portion + simulant.fire(document.body, 'click'); }); - // Use native events as the click doesn't have to be in the React portion - const event = new MouseEvent('click'); - document.dispatchEvent(event); - closeSpy.should.have.been.calledTwice; closeSpy.lastCall.args[0].should.equal(false); }); @@ -152,10 +155,10 @@ describe('', () => { wrapper.find('.toggle').simulate('keyDown', { key: 'ArrowDown' }); - wrapper.assertSingle('ReactOverlaysDropdown[show=true]'); + wrapper.assertSingle('ReactOverlaysDropdownMenu div'); }); - it('closes when item is clickes', () => { + it('closes when item is clicked', () => { const onToggle = sinon.spy(); const wrapper = mount().setProps({ diff --git a/test/OverlaySpec.js b/test/OverlaySpec.js index 80e781d6..cb600cfa 100644 --- a/test/OverlaySpec.js +++ b/test/OverlaySpec.js @@ -30,7 +30,7 @@ describe('Overlay', () => { document.body.removeChild(trigger); }); // these don't test a lot over rootCloseWrapper - xdescribe('is wrapped with RootCloseWrapper if rootClose prop passed', () => { + describe('is wrapped with RootCloseWrapper if rootClose prop passed', () => { const props = { rootClose: true, show: true, @@ -65,7 +65,6 @@ describe('Overlay', () => { mountPoint.click(); }); setTimeout(() => { - console.log(props.onHide.callCount === 1); expect(props.onHide).to.have.been.calledOnce(); done(); }, 0); diff --git a/test/useRootCloseSpec.js b/test/useRootCloseSpec.js index c5d9d7ad..a10c27d4 100644 --- a/test/useRootCloseSpec.js +++ b/test/useRootCloseSpec.js @@ -59,7 +59,7 @@ describe('RootCloseWrapper', () => { simulant.fire(document.getElementById('my-div'), eventName); expect(spy).to.not.have.been.called; - console.log(eventName); + simulant.fire(document.body, eventName); expect(spy).to.have.been.calledOnce; From 4724b0f31b179966e3a89761c7eb710b1c73a3ed Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Mon, 5 Aug 2019 12:47:11 -0400 Subject: [PATCH 6/8] move hook upstream --- package.json | 16 +-- src/Dropdown.js | 14 +-- yarn.lock | 312 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 245 insertions(+), 97 deletions(-) diff --git a/package.json b/package.json index 07a815d2..1f33ddc6 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "dependencies": { "@babel/runtime": "^7.4.5", - "@restart/hooks": "^0.3.2", + "@restart/hooks": "^0.3.9", "dom-helpers": "^3.4.0", "popper.js": "^1.15.0", "prop-types": "^15.7.2", @@ -77,7 +77,7 @@ "@babel/polyfill": "^7.4.4", "@babel/preset-env": "^7.5.4", "@babel/preset-react": "^7.0.0", - "@emotion/core": "^10.0.14", + "@emotion/core": "^10.0.15", "@react-bootstrap/eslint-config": "^1.2.0", "babel-eslint": "^10.0.2", "babel-plugin-add-module-exports": "^1.0.2", @@ -93,10 +93,10 @@ "eslint-plugin-jsx-a11y": "^6.2.3", "eslint-plugin-mocha": "^6.0.0", "eslint-plugin-prettier": "^3.1.0", - "eslint-plugin-react": "^7.14.2", + "eslint-plugin-react": "^7.14.3", "eslint-plugin-react-hooks": "^1.6.1", - "gh-pages": "^2.0.1", - "husky": "^3.0.0", + "gh-pages": "^2.1.0", + "husky": "^3.0.2", "jquery": "^3.4.1", "karma": "^4.2.0", "karma-chrome-launcher": "^3.0.0", @@ -106,19 +106,19 @@ "karma-sinon-chai": "^2.0.2", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "4.0.2", - "lint-staged": "^9.2.0", + "lint-staged": "^9.2.1", "lodash": "^4.17.14", "mocha": "^6.1.4", "prettier": "^1.18.2", "react": "^16.8.6", "react-dom": "^16.8.6", "react-live": "^2.1.2", - "react-transition-group": "^4.2.1", + "react-transition-group": "^4.2.2", "rimraf": "^2.6.3", "simulant": "^0.2.2", "sinon": "^7.3.2", "sinon-chai": "^3.3.0", - "webpack": "^4.35.3", + "webpack": "^4.39.1", "webpack-atoms": "^11.0.4", "webpack-cli": "^3.3.6" } diff --git a/src/Dropdown.js b/src/Dropdown.js index b2486fb1..3d6aa36d 100644 --- a/src/Dropdown.js +++ b/src/Dropdown.js @@ -1,27 +1,17 @@ import matches from 'dom-helpers/query/matches'; import qsa from 'dom-helpers/query/querySelectorAll'; -import React, { - useCallback, - useRef, - useEffect, - useState, - useMemo, -} from 'react'; +import React, { useCallback, useRef, useEffect, useMemo } from 'react'; import PropTypes from 'prop-types'; import { useUncontrolled } from 'uncontrollable'; import usePrevious from '@restart/hooks/usePrevious'; import useCallbackRef from '@restart/hooks/useCallbackRef'; +import useForceUpdate from '@restart/hooks/useForceUpdate'; import useEventCallback from '@restart/hooks/useEventCallback'; import DropdownContext from './DropdownContext'; import DropdownMenu from './DropdownMenu'; import DropdownToggle from './DropdownToggle'; -function useForceUpdate() { - const [, setState] = useState(false); - return useCallback(() => setState(value => !value), []); -} - const propTypes = { /** * A render prop that returns the root dropdown element. The `props` diff --git a/yarn.lock b/yarn.lock index 578187ca..c3ff9038 100644 --- a/yarn.lock +++ b/yarn.lock @@ -811,25 +811,25 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@emotion/cache@^10.0.14": - version "10.0.14" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.14.tgz#56093cff025c04b0330bdd92afe8335ed326dd18" - integrity sha512-HNGEwWnPlNyy/WPXBXzbjzkzeZFV657Z99/xq2xs5yinJHbMfi3ioCvBJ6Y8Zc8DQzO9F5jDmVXJB41Ytx3QMw== +"@emotion/cache@^10.0.15": + version "10.0.15" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.15.tgz#b81767b48015aae2689c60373992145c67b8de02" + integrity sha512-8VthgeKhlGeTXSW1JN7I14AnAaiFPbOrqNqg3dPoGCZ3bnMjkrmRU0zrx0BtBw9esBaPaQgDB9y0tVgAGT2Mrg== dependencies: "@emotion/sheet" "0.9.3" "@emotion/stylis" "0.8.4" "@emotion/utils" "0.11.2" "@emotion/weak-memoize" "0.2.3" -"@emotion/core@^10.0.14": - version "10.0.14" - resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.14.tgz#cac5c334b278d5b7688cfff39e460a5b50abb71c" - integrity sha512-G9FbyxLm3lSnPfLDcag8fcOQBKui/ueXmWOhV+LuEQg9HrqExuWnWaO6gm6S5rNe+AMcqLXVljf8pYgAdFLNSg== +"@emotion/core@^10.0.15": + version "10.0.15" + resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.15.tgz#b8489d85d64b45bd03abdb8a3d9639ba8a0328d0" + integrity sha512-VHwwl3k/ddMfQOHYgOJryXOs2rGJ5AfKLQGm5AVolNonnr6tkmDI4nzIMNaPpveoXVs7sP0OrF24UunIPxveQw== dependencies: "@babel/runtime" "^7.4.3" - "@emotion/cache" "^10.0.14" + "@emotion/cache" "^10.0.15" "@emotion/css" "^10.0.14" - "@emotion/serialize" "^0.11.8" + "@emotion/serialize" "^0.11.9" "@emotion/sheet" "0.9.3" "@emotion/utils" "0.11.2" @@ -863,6 +863,17 @@ "@emotion/utils" "0.11.2" csstype "^2.5.7" +"@emotion/serialize@^0.11.9": + version "0.11.9" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.9.tgz#123e0f51d2dee9693fae1057bd7fc27b021d6868" + integrity sha512-/Cn4V81z3ZyFiDQRw8nhGFaHkxHtmCSSBUit4vgTuLA1BqxfJUYiqSq97tq/vV8z9LfIoqs6a9v6QrUFWZpK7A== + dependencies: + "@emotion/hash" "0.7.2" + "@emotion/memoize" "0.7.2" + "@emotion/unitless" "0.7.4" + "@emotion/utils" "0.11.2" + csstype "^2.5.7" + "@emotion/sheet@0.9.3": version "0.9.3" resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.3.tgz#689f135ecf87d3c650ed0c4f5ddcbe579883564a" @@ -896,11 +907,32 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@nodelib/fs.scandir@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz#7fa8fed654939e1a39753d286b48b4836d00e0eb" + integrity sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg== + dependencies: + "@nodelib/fs.stat" "2.0.1" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.1", "@nodelib/fs.stat@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz#814f71b1167390cfcb6a6b3d9cdeb0951a192c14" + integrity sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw== + "@nodelib/fs.stat@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.walk@^1.2.1": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz#6a6450c5e17012abd81450eb74949a4d970d2807" + integrity sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ== + dependencies: + "@nodelib/fs.scandir" "2.1.1" + fastq "^1.6.0" + "@react-bootstrap/eslint-config@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@react-bootstrap/eslint-config/-/eslint-config-1.2.0.tgz#7796fb67bbc6383adb29beeab93f5ff36e32050d" @@ -910,10 +942,10 @@ eslint-config-prettier "^3.0.1" eslint-plugin-react-hooks "^1.5.1" -"@restart/hooks@^0.3.2": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.8.tgz#2f34f503d92ad95586c34f1175d6743f3a520a4e" - integrity sha512-0AO6p7iOqWeLu9++Qz1P0efRmA7nDT3uMx4banEUj0KZLNOBkK98zddsKtRjwBlJw2dbL/V+u5+recuCwjO/pg== +"@restart/hooks@^0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.9.tgz#b2849bee3faec1d3fc531fdf301f4b27649baa8e" + integrity sha512-6gL84qcdZHUN0V5czyMXzAbcBBpHm8H5Gwj7eqnVi6p3JzGwJ5m2at19dKE9Gv3SsU3Hv9SPDX+6zQSExCjjkQ== "@sailshq/lodash@^3.10.2": version "3.10.3" @@ -1177,11 +1209,16 @@ 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@^6.0.7, acorn@^6.2.0: +acorn@^6.0.7: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3" integrity sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw== +acorn@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51" + integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q== + after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" @@ -1215,12 +1252,12 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0: +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.5.5, ajv@^6.9.1: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -1386,6 +1423,11 @@ array-union@^1.0.1, array-union@^1.0.2: dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1958,6 +2000,27 @@ cacache@^11.3.2: unique-filename "^1.1.1" y18n "^4.0.0" +cacache@^12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.2.tgz#8db03205e36089a3df6954c66ce92541441ac46c" + integrity sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -2181,7 +2244,7 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== -chrome-trace-event@^1.0.0: +chrome-trace-event@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== @@ -3218,17 +3281,15 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== +del@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-5.0.0.tgz#4fa698b7a1ffb4e2ab3e8929ed699799654d6720" + integrity sha512-TfU3nUY0WDIhN18eq+pgpbLY9AfL5RfiE9czKaTSolc6aK7qASXfDErvYgjV1UqCR4sNXDoxO0/idPmhDUt2Sg== dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" + globby "^10.0.0" is-path-cwd "^2.0.0" is-path-in-cwd "^2.0.0" p-map "^2.0.0" - pify "^4.0.1" rimraf "^2.6.3" delayed-stream@~1.0.0: @@ -3290,6 +3351,13 @@ dir-glob@^2.0.0, dir-glob@^2.2.2: dependencies: path-type "^3.0.0" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + discontinuous-range@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" @@ -3793,10 +3861,10 @@ eslint-plugin-react-hooks@^1.5.1, eslint-plugin-react-hooks@^1.6.1: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.1.tgz#3c66a5515ea3e0a221ffc5d4e75c971c217b1a4c" integrity sha512-wHhmGJyVuijnYIJXZJHDUF2WM+rJYTjulUTqF9k61d3BTk8etydz+M4dXUVH7M76ZRS85rqBTCx0Es/lLsrjnA== -eslint-plugin-react@^7.14.2: - version "7.14.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.2.tgz#94c193cc77a899ac0ecbb2766fbef88685b7ecc1" - integrity sha512-jZdnKe3ip7FQOdjxks9XPN0pjUKZYq48OggNMd16Sk+8VXx6JOvXmlElxROCgp7tiUsTsze3jd78s/9AFJP2mA== +eslint-plugin-react@^7.14.3: + version "7.14.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz#911030dd7e98ba49e1b2208599571846a66bdf13" + integrity sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA== dependencies: array-includes "^3.0.3" doctrine "^2.1.0" @@ -3816,7 +3884,7 @@ eslint-scope@3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^4.0.0: +eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== @@ -3966,7 +4034,7 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^2.0.1: +execa@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/execa/-/execa-2.0.3.tgz#4b84301b33042cfb622771e886ed0b10e5634642" integrity sha512-iM124nlyGSrXmuyZF1EMe83ESY2chIYVyDRZKgmcDynid2Q2v/+GuE7gNMl6Sy9Niwf4MC0DDxagOxeMPjuLsw== @@ -4099,6 +4167,18 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" +fast-glob@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.0.4.tgz#d484a41005cb6faeb399b951fd1bd70ddaebb602" + integrity sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg== + dependencies: + "@nodelib/fs.stat" "^2.0.1" + "@nodelib/fs.walk" "^1.2.1" + glob-parent "^5.0.0" + is-glob "^4.0.1" + merge2 "^1.2.3" + micromatch "^4.0.2" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -4109,6 +4189,13 @@ fast-levenshtein@~2.0.4: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + favicons-webpack-plugin@^0.0.9: version "0.0.9" resolved "https://registry.yarnpkg.com/favicons-webpack-plugin/-/favicons-webpack-plugin-0.0.9.tgz#df63e80c556b804e4925ec8e05bee36391573dc9" @@ -4577,10 +4664,10 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -gh-pages@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-2.0.1.tgz#aefe47a43b8d9d2aa3130576b33fe95641e29a2f" - integrity sha512-uFlk3bukljeiWKQ2XvPfjcSi/ou7IfoDf2p+Fj672saLAr8bnOdFVqI/JSgrSgInKpCg5BksxEwGUl++dbg8Dg== +gh-pages@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-2.1.0.tgz#dcf519825d77d3a3ee78763076f4158403fc88c4" + integrity sha512-QmV1fh/2W5GZkfoLsG4g6dRTWiNYuCetMQmm8CL6Us8JVnAufYtS0uJPD8NYogmNB4UZzdRG44uPAL+jcBzEwQ== dependencies: async "^2.6.1" commander "^2.18.0" @@ -4742,6 +4829,20 @@ globalyzer@^0.1.0: resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.4.tgz#bc8e273afe1ac7c24eea8def5b802340c5cc534f" integrity sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA== +globby@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" + integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -5081,10 +5182,10 @@ humanize-url@^1.0.0: normalize-url "^1.0.0" strip-url-auth "^1.0.0" -husky@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/husky/-/husky-3.0.1.tgz#06152c28e129622b05fa09c494209de8cf2dfb59" - integrity sha512-PXBv+iGKw23GHUlgELRlVX9932feFL407/wHFwtsGeArp0dDM4u+/QusSQwPKxmNgjpSL+ustbOdQ2jetgAZbA== +husky@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/husky/-/husky-3.0.2.tgz#e78fd2ae16edca59fc88e56aeb8d70acdcc1c082" + integrity sha512-WXCtaME2x0o4PJlKY4ap8BzLA+D0zlvefqAvLCPriOOu+x0dpO5uc5tlB7CY6/0SE2EESmoZsj4jW5D09KrJoA== dependencies: chalk "^2.4.2" cosmiconfig "^5.2.1" @@ -5139,6 +5240,11 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558" + integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ== + image-size@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.4.0.tgz#d4b4e1f61952e4cbc1cea9a6b0c915fecb707510" @@ -5227,6 +5333,11 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -6066,18 +6177,18 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -lint-staged@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-9.2.0.tgz#155e5723dffdaa55d252c47bab05a2962c1e9781" - integrity sha512-K/CQWcxYunc8lGMNTFvtI4+ybJcHW3K4Ghudz2OrJhIWdW/i1WWu9rGiVj4yJ0+D/xh8a08kp5slt89VZC9Eqg== +lint-staged@^9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-9.2.1.tgz#57fc5947611604d5a32e478734a13f3e4687f646" + integrity sha512-3lGgJfBddCy/WndKdNko+uJbwyYjBD1k+V+SA+phBYWzH265S95KQya/Wln/UL+hOjc7NcjtFYVCUWuAcqYHhg== dependencies: chalk "^2.4.2" commander "^2.20.0" cosmiconfig "^5.2.1" debug "^4.1.1" dedent "^0.7.0" - del "^4.1.1" - execa "^2.0.1" + del "^5.0.0" + execa "^2.0.3" listr "^0.14.3" log-symbols "^3.0.0" micromatch "^4.0.2" @@ -6174,7 +6285,7 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -loader-runner@^2.3.0: +loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== @@ -6449,7 +6560,7 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" -memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: +memory-fs@^0.4.0, memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= @@ -6505,7 +6616,7 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -6681,7 +6792,7 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -6870,7 +6981,7 @@ node-fetch@^2.2.0: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== -node-libs-browser@^2.0.0: +node-libs-browser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== @@ -7562,6 +7673,11 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pathval@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -8377,10 +8493,10 @@ react-test-renderer@^16.0.0-0: react-is "^16.8.6" scheduler "^0.13.6" -react-transition-group@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.2.1.tgz#61fc9e36568bff9a1fe4e60fae323c8a6dbc0680" - integrity sha512-IXrPr93VzCPupwm2O6n6C2kJIofJ/Rp5Ltihhm9UfE8lkuVX2ng/SUUl/oWjblybK9Fq2Io7LGa6maVqPB762Q== +react-transition-group@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.2.2.tgz#8b5252410180c27fd7eebf50b185256b41799b16" + integrity sha512-uP0tjqewtvjb7kGZFpZYPoD/NlVZmIgts9eTt1w35pAaEApPxQGv94lD3VkqyXf2aMqrSGwhs6EV/DLaoKbLSw== dependencies: "@babel/runtime" "^7.4.5" dom-helpers "^3.4.0" @@ -8774,6 +8890,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rfdc@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" @@ -8824,6 +8945,11 @@ run-node@^1.0.0: resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -9573,7 +9699,7 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -tapable@^1.0.0, tapable@^1.1.0: +tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== @@ -9600,7 +9726,7 @@ teeny-request@^3.11.3: node-fetch "^2.2.0" uuid "^3.3.2" -terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.3.0: +terser-webpack-plugin@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz#69aa22426299f4b5b3775cbed8cb2c5d419aa1d4" integrity sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg== @@ -9616,6 +9742,21 @@ terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.3.0: webpack-sources "^1.3.0" worker-farm "^1.7.0" +terser-webpack-plugin@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4" + integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^1.7.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + terser@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/terser/-/terser-4.1.2.tgz#b2656c8a506f7ce805a3f300a2ff48db022fa391" @@ -9625,6 +9766,15 @@ terser@^4.0.0: source-map "~0.6.1" source-map-support "~0.5.12" +terser@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.1.3.tgz#6074fbcf3517561c3272ea885f422c7a8c32d689" + integrity sha512-on13d+cnpn5bMouZu+J8tPYQecsdRJCJuxFJ+FVoPBoLJgk5bCBkp+Uen2hWyi0KIUm6eDarnlAlH+KgIx/PuQ== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + test-exclude@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" @@ -10163,7 +10313,7 @@ warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchpack@^1.5.0: +watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== @@ -10260,34 +10410,42 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.35.3: - version "4.36.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.36.1.tgz#f546fda7a403a76faeaaa7196c50d12370ed18a9" - integrity sha512-Ej01/N9W8DVyhEpeQnbUdGvOECw0L46FxS12cCOs8gSK7bhUlrbHRnWkjiXckGlHjUrmL89kDpTRIkUk6Y+fKg== +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.39.1: + version "4.39.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.39.1.tgz#60ed9fb2b72cd60f26ea526c404d2a4cc97a1bd8" + integrity sha512-/LAb2TJ2z+eVwisldp3dqTEoNhzp/TLCZlmZm3GGGAlnfIWDgOEE758j/9atklNLfRyhKbZTCOIoPqLJXeBLbQ== dependencies: "@webassemblyjs/ast" "1.8.5" "@webassemblyjs/helper-module-context" "1.8.5" "@webassemblyjs/wasm-edit" "1.8.5" "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.2.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" + eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" schema-utils "^1.0.0" - tapable "^1.1.0" - terser-webpack-plugin "^1.1.0" - watchpack "^1.5.0" - webpack-sources "^1.3.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.1" + watchpack "^1.6.0" + webpack-sources "^1.4.1" whatwg-fetch@>=0.10.0: version "3.0.0" From b1c0304cc0d494008086726155718a161e70ac67 Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Mon, 5 Aug 2019 21:07:41 -0400 Subject: [PATCH 7/8] rm useless tests --- test/OverlaySpec.js | 81 --------------------------------------------- 1 file changed, 81 deletions(-) delete mode 100644 test/OverlaySpec.js diff --git a/test/OverlaySpec.js b/test/OverlaySpec.js deleted file mode 100644 index cb600cfa..00000000 --- a/test/OverlaySpec.js +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react'; -import { act } from 'react-dom/test-utils'; -import { mount } from 'enzyme'; - -import Overlay from '../src/Overlay'; - -function renderTooltip({ props }) { - const { ref, style } = props; - return ( -
- hello there -
- ); -} - -describe('Overlay', () => { - let mountPoint; - let trigger; - - beforeEach(() => { - mountPoint = document.createElement('div'); - trigger = document.createElement('div'); - - document.body.appendChild(mountPoint); - document.body.appendChild(trigger); - }); - - afterEach(() => { - document.body.removeChild(mountPoint); - document.body.removeChild(trigger); - }); - // these don't test a lot over rootCloseWrapper - describe('is wrapped with RootCloseWrapper if rootClose prop passed', () => { - const props = { - rootClose: true, - show: true, - target: trigger, - }; - - let instance; - - beforeEach(() => { - props.onHide = sinon.spy(); - - instance = mount({renderTooltip}, { - attachTo: mountPoint, - }); - }); - afterEach(() => { - instance.unmount(); - }); - - it('renders RootCloseWrapper', () => { - act(() => { - mountPoint.click(); - }); - - expect(props.onHide).to.have.been.calledOnce(); - }); - - it('passes down the rootCloseEvent', done => { - instance.setProps({ rootCloseEvent: 'mousedown' }); - - act(() => { - mountPoint.click(); - }); - setTimeout(() => { - expect(props.onHide).to.have.been.calledOnce(); - done(); - }, 0); - }); - - it('passes down the rootCloseDisabled', () => { - instance.setProps({ rootCloseDisabled: true }); - - const wrapper = instance.find('RootCloseWrapper'); - - expect(wrapper.props().disabled).to.equal(true); - }); - }); -}); From dc56ea12277e298235163e1ef1b8a9000a251370 Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Wed, 7 Aug 2019 11:46:15 -0400 Subject: [PATCH 8/8] Apply suggestions from code review Co-Authored-By: Jimmy Jia --- src/Dropdown.js | 10 +++++----- src/DropdownMenu.js | 5 ++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Dropdown.js b/src/Dropdown.js index 3d6aa36d..856fcc93 100644 --- a/src/Dropdown.js +++ b/src/Dropdown.js @@ -174,18 +174,18 @@ function Dropdown({ const maybeFocusFirst = useEventCallback(() => { const type = lastSourceEvent.current; - let focusStype = focusFirstItemOnShow; + let focusType = focusFirstItemOnShow; - if (focusStype == null) { - focusStype = + if (focusType == null) { + focusType = menuRef.current && matches(menuRef.current, '[role=menu]') ? 'keyboard' : false; } if ( - focusStype === false || - (focusStype === 'keyboard' && !/^key.+$/.test(type)) + focusType === false || + (focusType === 'keyboard' && !/^key.+$/.test(type)) ) { return; } diff --git a/src/DropdownMenu.js b/src/DropdownMenu.js index b745216f..e11f9b6b 100644 --- a/src/DropdownMenu.js +++ b/src/DropdownMenu.js @@ -30,7 +30,6 @@ export function useDropdownMenu(options = {}) { const handleClose = e => { if (!context.toggle) return; - context.toggle(false, e); }; @@ -38,8 +37,8 @@ export function useDropdownMenu(options = {}) { let placement = alignEnd ? 'bottom-end' : 'bottom-start'; if (drop === 'up') placement = alignEnd ? 'top-end' : 'top-start'; - if (drop === 'right') placement = alignEnd ? 'right-end' : 'right-start'; - if (drop === 'left') placement = alignEnd ? 'left-end' : 'left-start'; + else if (drop === 'right') placement = alignEnd ? 'right-end' : 'right-start'; + else if (drop === 'left') placement = alignEnd ? 'left-end' : 'left-start'; const popper = usePopper(toggleElement, menuElement, { placement,