Improve hook dependencies

This commit is contained in:
Jordan Eldredge 2019-03-19 07:35:36 -07:00
parent bd5fa82c99
commit 8c915f7f06
9 changed files with 128 additions and 330 deletions

View file

@ -13,7 +13,8 @@
"prettier",
"import",
"no-constructor-bind",
"@typescript-eslint"
"@typescript-eslint",
"react-hooks"
],
"settings": {
"react": {
@ -148,6 +149,8 @@
"import/no-named-as-default-member": "error",
"import/no-unresolved": "error",
"import/order": "warn",
"no-constructor-bind/no-constructor-bind": "error"
"no-constructor-bind/no-constructor-bind": "error",
"react-hooks/rules-of-hooks": "error",
"react-hooks/exhaustive-deps": "error"
}
}

View file

@ -48,11 +48,11 @@ function ContextMenuTarget(props: Props) {
return () => {
document.removeEventListener("click", handleGlobalClick);
};
}, [selected, handleNode.current]);
}, [selected]);
const offset = useMemo(() => {
return getNodeOffset(handleNode.current);
}, [selected, handleNode.current]);
}, []);
const { handle, children, top, bottom, ...passThroughProps } = props;
return (

View file

@ -17,6 +17,12 @@ function supress(e: React.DragEvent<HTMLDivElement>) {
}
const DropTarget = (props: Props) => {
const {
// eslint-disable-next-line no-shadow, no-unused-vars
handleDrop,
...passThroughProps
} = props;
const onDrop = useCallback((e: React.DragEvent<HTMLDivElement>) => {
supress(e);
// TODO: We could probably move this coordinate logic into the playlist.
@ -27,14 +33,8 @@ const DropTarget = (props: Props) => {
}
const { left: x, top: y } = currentTarget.getBoundingClientRect();
props.handleDrop(e, { x, y });
}, [props.handleDrop]);
const {
// eslint-disable-next-line no-shadow, no-unused-vars
handleDrop,
...passThroughProps
} = props;
handleDrop(e, { x, y });
}, [handleDrop]);
return (
<div
{...passThroughProps}

View file

@ -21,29 +21,30 @@ function enterFullScreen(node: HTMLDivElement) {
}
function FullScreen(props: Props) {
const { onChange, enabled } = props;
const ref = useRef<HTMLDivElement | null>(null);
useEffect(() => {
function detectFullScreen() {
if (props.onChange) {
props.onChange(fscreen.fullscreenElement === ref.current);
if (onChange) {
onChange(fscreen.fullscreenElement === ref.current);
}
}
fscreen.addEventListener("fullscreenchange", detectFullScreen);
return () => {
fscreen.removeEventListener("fullscreenchange", detectFullScreen);
};
}, [props.onChange, ref.current]);
}, [onChange]);
// This must run in response to a click event, so we'll use useLayoutEffect just in case.
useLayoutEffect(() => {
const enabled = fscreen.fullscreenElement === ref.current;
if (enabled && !props.enabled) {
const isEnabled = fscreen.fullscreenElement === ref.current;
if (isEnabled && !enabled) {
leaveFullScreen();
} else if (!enabled && props.enabled && ref.current != null) {
} else if (!isEnabled && enabled && ref.current != null) {
enterFullScreen(ref.current);
}
}, [props.enabled, ref.current]);
}, [enabled]);
return (
<div

View file

@ -38,7 +38,19 @@ const TRANSITION_TYPE_DURATIONS = {
[TransitionType.USER_PRESET]: 5.7,
};
function Visualizer(props: Props) {
function Visualizer(_props: Props) {
const {
butterchurn,
analyser,
width,
height,
currentPreset,
transitionType,
trackTitle,
isEnabledVisualizer,
message,
playing,
} = _props;
const canvasRef = useRef(null);
const [visualizer, setVisualizer] = useState<ButterchurnVisualizer | null>(
null
@ -46,7 +58,7 @@ function Visualizer(props: Props) {
// Initialize the visualizer
useEffect(() => {
if (canvasRef.current == null || props.butterchurn == null) {
if (canvasRef.current == null || butterchurn == null) {
return;
}
if (visualizer != null) {
@ -55,73 +67,75 @@ function Visualizer(props: Props) {
// node, or the canvas, that change won't be respected.
return;
}
const _visualizer = props.butterchurn.createVisualizer(
props.analyser.context,
const _visualizer = butterchurn.createVisualizer(
analyser.context,
canvasRef.current,
{
width: props.width,
height: props.height,
width,
height,
meshWidth: 32,
meshHeight: 24,
pixelRatio: window.devicePixelRatio || 1,
}
);
_visualizer.connectAudio(props.analyser);
_visualizer.connectAudio(analyser);
setVisualizer(_visualizer);
}, [canvasRef.current, props.butterchurn, props.analyser]);
}, [butterchurn, analyser, height, width, visualizer]);
// Ensure render size stays up to date
useEffect(() => {
if (visualizer == null) {
return;
}
visualizer.setRendererSize(props.width, props.height);
}, [visualizer, props.width, props.height]);
visualizer.setRendererSize(width, height);
}, [visualizer, width, height]);
// Load presets when they change
const hasLoadedPreset = useRef<boolean>(false);
useEffect(() => {
if (visualizer == null || props.currentPreset == null) {
if (visualizer == null || currentPreset == null) {
return;
}
if (hasLoadedPreset.current) {
visualizer.loadPreset(
props.currentPreset,
TRANSITION_TYPE_DURATIONS[props.transitionType]
currentPreset,
TRANSITION_TYPE_DURATIONS[transitionType]
);
} else {
visualizer.loadPreset(
props.currentPreset,
currentPreset,
TRANSITION_TYPE_DURATIONS[TransitionType.IMMEDIATE]
);
hasLoadedPreset.current = true;
}
}, [visualizer, props.currentPreset]);
// We don't want to trigger the transition if the transition type changes.
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [visualizer, currentPreset]);
// Handle title animations
useEffect(() => {
if (visualizer == null || !props.trackTitle) {
if (visualizer == null || !trackTitle) {
return;
}
visualizer.launchSongTitleAnim(props.trackTitle);
}, [visualizer, props.trackTitle]);
visualizer.launchSongTitleAnim(trackTitle);
}, [visualizer, trackTitle]);
const lastShownMessage = useRef<null | number>(null);
useEffect(() => {
if (visualizer == null || props.message == null) {
if (visualizer == null || message == null) {
return;
}
if (
lastShownMessage.current == null ||
props.message.time > lastShownMessage.current
message.time > lastShownMessage.current
) {
lastShownMessage.current = Date.now();
visualizer.launchSongTitleAnim(props.message.text);
visualizer.launchSongTitleAnim(message.text);
}
}, [visualizer, props.message]);
}, [visualizer, message]);
const shouldAnimate = props.playing && props.isEnabledVisualizer;
const shouldAnimate = playing && isEnabledVisualizer;
// Kick off the animation loop
useEffect(() => {
@ -143,12 +157,12 @@ function Visualizer(props: Props) {
return (
<canvas
height={props.height}
width={props.width}
height={height}
width={width}
style={{
height: "100%",
width: "100%",
display: props.isEnabledVisualizer ? "block" : "none",
display: isEnabledVisualizer ? "block" : "none",
}}
ref={canvasRef}
/>

View file

@ -50,40 +50,63 @@ interface OwnProps {
type Props = StateProps & DispatchProps & OwnProps;
function Milkdrop(props: Props) {
function useMilkdropKeyBindings(props: Props) {
const {
onFocusedKeyDown,
selectNextPreset,
selectPreviousPreset,
toggleRandomize,
togglePresetOverlay,
scheduleMilkdropMessage,
trackTitle,
toggleCycling,
} = props;
// Handle keyboard events
useEffect(() => {
return props.onFocusedKeyDown(e => {
return onFocusedKeyDown(e => {
switch (e.keyCode) {
case 32: // spacebar
props.selectNextPreset();
selectNextPreset();
break;
case 8: // backspace
props.selectPreviousPreset(TransitionType.IMMEDIATE);
selectPreviousPreset(TransitionType.IMMEDIATE);
break;
case 72: // H
props.selectNextPreset(TransitionType.IMMEDIATE);
selectNextPreset(TransitionType.IMMEDIATE);
break;
case 82: // R
props.toggleRandomize();
toggleRandomize();
break;
case 76: // L
props.togglePresetOverlay();
togglePresetOverlay();
e.stopPropagation();
break;
case 84: // T
if (props.trackTitle != null) {
props.scheduleMilkdropMessage(props.trackTitle);
if (trackTitle != null) {
scheduleMilkdropMessage(trackTitle);
}
e.stopPropagation();
break;
case 145: // scroll lock
case 125: // F14 (scroll lock for OS X)
props.toggleCycling();
toggleCycling();
break;
}
});
}, [props.onFocusedKeyDown]);
}, [
onFocusedKeyDown,
selectNextPreset,
selectPreviousPreset,
toggleRandomize,
togglePresetOverlay,
scheduleMilkdropMessage,
trackTitle,
toggleCycling,
]);
}
function Milkdrop(props: Props) {
useMilkdropKeyBindings(props);
// Cycle presets
useEffect(() => {

View file

@ -14,14 +14,14 @@ export function useScreenSize() {
export function useWindowSize() {
const [size, setSize] = useState<Size>(Utils.getWindowSize());
const hander = Utils.throttle(() => {
const handler = Utils.throttle(() => {
setSize(Utils.getWindowSize());
}, 100) as () => void;
useEffect(() => {
window.addEventListener("resize", hander);
window.addEventListener("resize", handler);
return () => {
window.removeEventListener("resize", hander);
window.removeEventListener("resize", handler);
};
}, [setSize]);
}, [setSize, handler]);
return size;
}

View file

@ -150,8 +150,11 @@
"config/jest.*.js"
]
},
"prettier": {"trailingComma": "es5"},
"prettier": {
"trailingComma": "es5"
},
"dependencies": {
"eslint-plugin-react-hooks": "^1.5.1",
"fscreen": "^1.0.2"
}
}

292
yarn.lock
View file

@ -996,26 +996,16 @@ acorn-globals@^4.1.0:
dependencies:
acorn "^5.0.0"
acorn-jsx@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
dependencies:
acorn "^3.0.4"
acorn-jsx@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e"
integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==
acorn@^3.0.4:
version "3.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
acorn@^5.0.0:
version "5.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102"
acorn@^5.3.0, acorn@^5.5.0:
acorn@^5.3.0:
version "5.5.3"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9"
@ -1044,10 +1034,6 @@ ajv-errors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59"
ajv-keywords@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
ajv-keywords@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be"
@ -1059,7 +1045,7 @@ ajv@^4.9.1:
co "^4.6.0"
json-stable-stringify "^1.0.1"
ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
ajv@^5.1.0:
version "5.5.2"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
dependencies:
@ -1246,7 +1232,7 @@ array-unique@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
arrify@^1.0.0, arrify@^1.0.1:
arrify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
@ -1332,7 +1318,7 @@ aws4@^1.6.0, aws4@^1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
babel-code-frame@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
dependencies:
@ -1945,22 +1931,12 @@ caller-callsite@^2.0.0:
dependencies:
callsites "^2.0.0"
caller-path@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
dependencies:
callsites "^0.2.0"
caller-path@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
dependencies:
caller-callsite "^2.0.0"
callsites@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
callsites@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
@ -2075,10 +2051,6 @@ chalk@^2.4.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chardet@^0.4.0:
version "0.4.2"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
chardet@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.5.0.tgz#fe3ac73c00c3d865ffcc02a0682e2c20b6a06029"
@ -2161,10 +2133,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
inherits "^2.0.1"
safe-buffer "^5.0.1"
circular-json@^0.3.1:
version "0.3.3"
resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
class-utils@^0.3.5:
version "0.3.6"
resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
@ -2376,14 +2344,6 @@ concat-stream@^1.5.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
concat-stream@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
dependencies:
inherits "^2.0.3"
readable-stream "^2.2.2"
typedarray "^0.0.6"
config-chain@^1.1.11:
version "1.1.12"
resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
@ -2497,15 +2457,6 @@ corser@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87"
cosmiconfig@^3.0.1:
version "3.1.0"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-3.1.0.tgz#640a94bf9847f321800403cd273af60665c73397"
dependencies:
is-directory "^0.3.1"
js-yaml "^3.9.0"
parse-json "^3.0.0"
require-from-string "^2.0.1"
cosmiconfig@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc"
@ -2552,7 +2503,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"
cross-spawn@^5.0.1, cross-spawn@^5.1.0:
cross-spawn@^5.0.1:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
dependencies:
@ -3000,18 +2951,6 @@ define-property@^2.0.2:
is-descriptor "^1.0.2"
isobject "^3.0.1"
del@^2.0.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
dependencies:
globby "^5.0.0"
is-path-cwd "^1.0.0"
is-path-in-cwd "^1.0.0"
object-assign "^4.0.1"
pify "^2.0.0"
pinkie-promise "^2.0.0"
rimraf "^2.2.8"
del@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
@ -3111,7 +3050,7 @@ doctrine@1.5.0:
esutils "^2.0.2"
isarray "^1.0.0"
doctrine@^2.0.2, doctrine@^2.1.0:
doctrine@^2.0.2:
version "2.1.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
dependencies:
@ -3342,7 +3281,7 @@ errno@^0.1.3:
dependencies:
prr "~1.0.1"
errno@^0.1.4, 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:
@ -3492,6 +3431,11 @@ eslint-plugin-prettier@^2.2.0:
fast-diff "^1.1.1"
jest-docblock "^21.0.0"
eslint-plugin-react-hooks@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.5.1.tgz#3c601326914ee0e1fedd709115db4940bdbbed4a"
integrity sha512-i3dIrmZ+Ssrm0LrbbtuGcRf7EEpe1FaMuL8XnnpZO0X4tk3dZNzevWxD0/7nMAFa5yZQfNnYkfEP0MmwLvbdHw==
eslint-plugin-react@^7.7.0:
version "7.7.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz#f606c719dbd8a1a2b3d25c16299813878cca0160"
@ -3501,7 +3445,7 @@ eslint-plugin-react@^7.7.0:
jsx-ast-utils "^2.0.1"
prop-types "^15.6.0"
eslint-scope@3.7.1, eslint-scope@^3.7.1:
eslint-scope@3.7.1:
version "3.7.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
dependencies:
@ -3532,49 +3476,6 @@ eslint-visitor-keys@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
eslint@^4.5.0:
version "4.19.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
dependencies:
ajv "^5.3.0"
babel-code-frame "^6.22.0"
chalk "^2.1.0"
concat-stream "^1.6.0"
cross-spawn "^5.1.0"
debug "^3.1.0"
doctrine "^2.1.0"
eslint-scope "^3.7.1"
eslint-visitor-keys "^1.0.0"
espree "^3.5.4"
esquery "^1.0.0"
esutils "^2.0.2"
file-entry-cache "^2.0.0"
functional-red-black-tree "^1.0.1"
glob "^7.1.2"
globals "^11.0.1"
ignore "^3.3.3"
imurmurhash "^0.1.4"
inquirer "^3.0.6"
is-resolvable "^1.0.0"
js-yaml "^3.9.1"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.3.0"
lodash "^4.17.4"
minimatch "^3.0.2"
mkdirp "^0.5.1"
natural-compare "^1.4.0"
optionator "^0.8.2"
path-is-inside "^1.0.2"
pluralize "^7.0.0"
progress "^2.0.0"
regexpp "^1.0.1"
require-uncached "^1.0.3"
semver "^5.3.0"
strip-ansi "^4.0.0"
strip-json-comments "~2.0.1"
table "4.0.2"
text-table "~0.2.0"
eslint@^5.15.1:
version "5.15.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.15.1.tgz#8266b089fd5391e0009a047050795b1d73664524"
@ -3617,13 +3518,6 @@ eslint@^5.15.1:
table "^5.2.3"
text-table "^0.2.0"
espree@^3.5.4:
version "3.5.4"
resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
dependencies:
acorn "^5.5.0"
acorn-jsx "^3.0.0"
espree@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
@ -3641,12 +3535,6 @@ esprima@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
esquery@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
dependencies:
estraverse "^4.0.0"
esquery@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
@ -3923,14 +3811,6 @@ extend@~3.0.1, extend@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
external-editor@^2.0.4:
version "2.1.0"
resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48"
dependencies:
chardet "^0.4.0"
iconv-lite "^0.4.17"
tmp "^0.0.33"
external-editor@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.0.tgz#dc35c48c6f98a30ca27a20e9687d7f3c77704bb6"
@ -4078,13 +3958,6 @@ figures@^2.0.0:
dependencies:
escape-string-regexp "^1.0.5"
file-entry-cache@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
dependencies:
flat-cache "^1.2.1"
object-assign "^4.0.1"
file-entry-cache@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
@ -4260,15 +4133,6 @@ find-versions@^3.0.0:
array-uniq "^2.0.0"
semver-regex "^2.0.0"
flat-cache@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
dependencies:
circular-json "^0.3.1"
del "^2.0.2"
graceful-fs "^4.1.2"
write "^0.2.1"
flat-cache@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
@ -4578,10 +4442,6 @@ global@~4.3.0:
min-document "^2.19.0"
process "~0.5.1"
globals@^11.0.1:
version "11.3.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0"
globals@^11.1.0:
version "11.9.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249"
@ -4595,17 +4455,6 @@ globals@^9.18.0:
version "9.18.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
globby@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
dependencies:
array-union "^1.0.1"
arrify "^1.0.0"
glob "^7.0.3"
object-assign "^4.0.1"
pify "^2.0.0"
pinkie-promise "^2.0.0"
globby@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
@ -5091,7 +4940,7 @@ https-proxy-agent@^2.1.0:
agent-base "^4.1.0"
debug "^3.1.0"
iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13:
iconv-lite@0.4.19, iconv-lite@~0.4.13:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
@ -5139,7 +4988,7 @@ ignore-walk@^3.0.1:
dependencies:
minimatch "^3.0.4"
ignore@^3.3.3, ignore@^3.3.5:
ignore@^3.3.5:
version "3.3.7"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
@ -5246,25 +5095,6 @@ ini@^1.3.4, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
inquirer@^3.0.6:
version "3.3.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
dependencies:
ansi-escapes "^3.0.0"
chalk "^2.0.0"
cli-cursor "^2.1.0"
cli-width "^2.0.0"
external-editor "^2.0.4"
figures "^2.0.0"
lodash "^4.3.0"
mute-stream "0.0.7"
run-async "^2.2.0"
rx-lite "^4.0.8"
rx-lite-aggregates "^4.0.8"
string-width "^2.1.0"
strip-ansi "^4.0.0"
through "^2.3.6"
inquirer@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.0.0.tgz#e8c20303ddc15bbfc2c12a6213710ccd9e1413d8"
@ -6028,17 +5858,6 @@ jest-resolve@^24.1.0:
chalk "^2.0.1"
realpath-native "^1.0.0"
jest-runner-eslint@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/jest-runner-eslint/-/jest-runner-eslint-0.4.0.tgz#938a54fb767d1803d45613ae3eac0adc2de426db"
dependencies:
cosmiconfig "^3.0.1"
eslint "^4.5.0"
find-up "^2.1.0"
pify "3.0.0"
throat "4.1.0"
worker-farm "1.5.0"
jest-runner@^24.1.0:
version "24.1.0"
resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.1.0.tgz#3686a2bb89ce62800da23d7fdc3da2c32792943b"
@ -6209,7 +6028,7 @@ js-yaml@^3.9.0:
argparse "^1.0.7"
esprima "^4.0.0"
js-yaml@^3.9.1, js-yaml@~3.10.0:
js-yaml@~3.10.0:
version "3.10.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
dependencies:
@ -7654,12 +7473,6 @@ parse-json@^2.2.0:
dependencies:
error-ex "^1.2.0"
parse-json@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-3.0.0.tgz#fa6f47b18e23826ead32f263e744d0e1e847fb13"
dependencies:
error-ex "^1.3.1"
parse-json@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
@ -7779,14 +7592,14 @@ phin@^2.9.1:
version "2.9.3"
resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
pify@3.0.0, pify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
pify@^2.0.0, pify@^2.2.0, pify@^2.3.0:
version "2.3.0"
resolved "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
pify@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
@ -7831,10 +7644,6 @@ pkg-dir@^3.0.0:
dependencies:
find-up "^3.0.0"
pluralize@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
pn@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
@ -8760,10 +8569,6 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
regexpp@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
regexpp@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
@ -8953,13 +8758,6 @@ require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
require-uncached@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
dependencies:
caller-path "^0.1.0"
resolve-from "^1.0.0"
requireindex@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef"
@ -8990,10 +8788,6 @@ resolve-dir@^0.1.0:
expand-tilde "^1.2.2"
global-modules "^0.2.3"
resolve-from@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
resolve-from@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
@ -9084,16 +8878,6 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
rx-lite-aggregates@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
dependencies:
rx-lite "*"
rx-lite@*, rx-lite@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
rxjs@^6.1.0:
version "6.2.1"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.1.tgz#246cebec189a6cbc143a3ef9f62d6f4c91813ca1"
@ -9385,12 +9169,6 @@ slash@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
slice-ansi@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
dependencies:
is-fullwidth-code-point "^2.0.0"
slice-ansi@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
@ -9928,17 +9706,6 @@ symbol-tree@^3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
table@4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
dependencies:
ajv "^5.2.3"
ajv-keywords "^2.1.0"
chalk "^2.1.0"
lodash "^4.17.4"
slice-ansi "1.0.0"
string-width "^2.1.1"
table@^5.2.3:
version "5.2.3"
resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2"
@ -10059,7 +9826,7 @@ test-exclude@^5.0.0:
read-pkg-up "^4.0.0"
require-main-filename "^1.0.1"
text-table@^0.2.0, text-table@~0.2.0:
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@ -10067,7 +9834,7 @@ then-read-stream@^1.3.0, then-read-stream@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/then-read-stream/-/then-read-stream-1.3.1.tgz#81f91fa31d8044bd9a6d49b84af4fb6b34b5cfc7"
throat@4.1.0, throat@^4.0.0:
throat@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
@ -10935,13 +10702,6 @@ workbox-webpack-plugin@^3.6.3:
json-stable-stringify "^1.0.1"
workbox-build "^3.6.3"
worker-farm@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.0.tgz#adfdf0cd40581465ed0a1f648f9735722afd5c8d"
dependencies:
errno "^0.1.4"
xtend "^4.0.1"
worker-farm@^1.5.2:
version "1.6.0"
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
@ -10974,12 +10734,6 @@ write@1.0.3:
dependencies:
mkdirp "^0.5.1"
write@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
dependencies:
mkdirp "^0.5.1"
ws@^3.0.0:
version "3.3.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
@ -11037,7 +10791,7 @@ xregexp@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"
xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
xtend@^4.0.0, xtend@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"