From b9cacadceeee870b1ea81c38b241d8f3c192770e Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Sun, 25 Nov 2018 21:40:07 -0800 Subject: [PATCH] Progress --- package.json | 4 +- public/llama.mp3 | Bin 0 -> 38789 bytes src/App.css | 38 +-- src/App.js | 32 +- src/FocusedSkin.js | 64 ++-- src/Overlay.js | 61 +++- src/Skin.js | 3 +- src/WebampComponent.js | 67 ++++ src/index.css | 5 - src/index.js | 10 +- src/redux/selectors.js | 27 ++ src/redux/store.js | 55 ++++ src/utils.js | 3 + yarn.lock | 682 +++++------------------------------------ 14 files changed, 377 insertions(+), 674 deletions(-) create mode 100644 public/llama.mp3 create mode 100644 src/WebampComponent.js delete mode 100644 src/index.css create mode 100644 src/redux/selectors.js create mode 100644 src/redux/store.js diff --git a/package.json b/package.json index 2637b8f2..25c59696 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,11 @@ "image-average-color": "^1.0.0", "react": "^16.2.0", "react-dom": "^16.2.0", + "react-redux": "^5.1.1", "react-scripts": "1.1.1", + "redux": "^4.0.1", "shell-escape": "^0.2.0", - "webamp": "^1.0.0" + "webamp": "^1.3.0-beta.0" }, "scripts": { "start": "react-scripts start", diff --git a/public/llama.mp3 b/public/llama.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7262ff2bd04947d63c8b273557a94fe3b598d24f GIT binary patch literal 38789 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 {skinElements} - {this.state.selectedSkinHash && ( + {this.props.selectedSkinHash == null || ( - + )} @@ -151,4 +146,17 @@ class App extends React.Component { } } -export default App; +const mapStateToProps = state => ({ + selectedSkinHash: Selectors.getSelectedSkinHash(state) +}); + +const mapDispatchToProps = dispatch => ({ + // TODO: Extract to action creator + setSelectedSkin(hash, position) { + dispatch({ type: "SELECT_SKIN", hash, position }); + } +}); +export default connect( + mapStateToProps, + mapDispatchToProps +)(App); diff --git a/src/FocusedSkin.js b/src/FocusedSkin.js index bfd4e2e1..29553e03 100644 --- a/src/FocusedSkin.js +++ b/src/FocusedSkin.js @@ -1,30 +1,42 @@ import React from "react"; +import { connect } from "react-redux"; +import WebampComponent from "./WebampComponent"; import * as Utils from "./utils"; +import * as Selectors from "./redux/selectors"; import { SCREENSHOT_HEIGHT, SCREENSHOT_WIDTH } from "./constants"; -export default class FocusedSkin extends React.Component { +class FocusedSkin extends React.Component { constructor(props) { super(props); // TODO: Handle the case were we come from a permalink - this.state = { - top: this.props.initialTop, - left: this.props.initialLeft, - width: this.props.initialWidth, - height: this.props.initialHeight - }; + if (this.props.initialPosition == null) { + this.state = this._getCenteredState(); + } else { + this.state = { + top: this.props.initialPosition.top, + left: this.props.initialPosition.left, + width: this.props.initialWidth, + height: this.props.initialHeight + }; + } } componentDidMount() { setTimeout(() => { // TODO: Observe DOM and recenter - const { windowWidth, windowHeight } = Utils.getWindowSize(); - this.setState({ - top: (windowHeight - SCREENSHOT_HEIGHT) / 2, - left: (windowWidth - SCREENSHOT_WIDTH) / 2, - height: SCREENSHOT_HEIGHT, - width: SCREENSHOT_WIDTH - }); + this.setState(this._getCenteredState()); }, 0); } + + _getCenteredState() { + // TODO: Observe DOM and recenter + const { windowWidth, windowHeight } = Utils.getWindowSize(); + return { + top: (windowHeight - SCREENSHOT_HEIGHT) / 2, + left: (windowWidth - SCREENSHOT_WIDTH) / 2, + height: SCREENSHOT_HEIGHT, + width: SCREENSHOT_WIDTH + }; + } render() { return (
- + )}
); } } + +const mapStateToProps = state => ({ + hash: Selectors.getSelectedSkinHash(state), + initialPosition: Selectors.getSelectedSkinPosition(state) +}); + +export default connect(mapStateToProps)(FocusedSkin); diff --git a/src/Overlay.js b/src/Overlay.js index 39fed427..2c1c8872 100644 --- a/src/Overlay.js +++ b/src/Overlay.js @@ -1,18 +1,75 @@ import React from "react"; import ReactDOM from "react-dom"; +import { connect } from "react-redux"; -export class Overlay extends React.Component { +class Overlay extends React.Component { constructor() { super(); this._node = document.createElement("div"); this._node.classList.add("overlay"); + this._handleKeyDown = this._handleKeyDown.bind(this); + this._handleClick = this._handleClick.bind(this); + window.document.body.appendChild(this._node); } + componentDidMount() { + window.document.addEventListener("keydown", this._handleKeyDown); + document.body.classList.add("overlay-open"); + } + componentWillUnmount() { window.document.body.removeChild(this._node); + window.document.removeEventListener("keydown", this._handleKeyDown); + document.body.classList.remove("overlay-open"); + } + + _handleKeyDown(e) { + // Esc + if (e.keyCode === 27) { + this.props.closeModal(); + } + } + + _handleClick(e) { + if (e.target === e.currentTarget) { + this.props.closeModal(); + } } render() { - return ReactDOM.createPortal(this.props.children, this._node); + return ReactDOM.createPortal( + , + this._node + ); } } + +const mapDispatchToProps = dispatch => ({ + closeModal() { + dispatch({ type: "CLOSE_MODAL" }); + } +}); +export default connect( + null, + mapDispatchToProps +)(Overlay); diff --git a/src/Skin.js b/src/Skin.js index 478c7336..060c9517 100644 --- a/src/Skin.js +++ b/src/Skin.js @@ -36,7 +36,8 @@ export default class Skin extends React.Component { width: this.props.width, height: this.props.height, top: this.props.top, - left: this.props.left + left: this.props.left, + cursor: "pointer" }} > { + await this._webamp.renderWhenReady(this._ref); + }, 400); + if (this._unmounted === true) { + return; + } + // this.setState({ loading: false }); + } + + render() { + return ( +
(this._ref = node)} + > + +
+ ); + } +} diff --git a/src/index.css b/src/index.css deleted file mode 100644 index b4cc7250..00000000 --- a/src/index.css +++ /dev/null @@ -1,5 +0,0 @@ -body { - margin: 0; - padding: 0; - font-family: sans-serif; -} diff --git a/src/index.js b/src/index.js index 7f76cb9e..15f3f97e 100644 --- a/src/index.js +++ b/src/index.js @@ -1,8 +1,14 @@ import React from "react"; import ReactDOM from "react-dom"; -import "./index.css"; +import { Provider } from "react-redux"; +import { createStore } from "./redux/store"; import App from "./App"; import registerServiceWorker from "./registerServiceWorker"; -ReactDOM.render(, document.getElementById("root")); +ReactDOM.render( + + + , + document.getElementById("root") +); registerServiceWorker(); diff --git a/src/redux/selectors.js b/src/redux/selectors.js new file mode 100644 index 00000000..31d20b2d --- /dev/null +++ b/src/redux/selectors.js @@ -0,0 +1,27 @@ +import * as Utils from "../utils"; + +export function getSelectedSkinHash(state) { + return state.selectedSkinHash; +} + +export function getSelectedSkinPosition(state) { + return state.selectedSkinPosition; +} + +export function getSelectedSkinUrl(state) { + const hash = getSelectedSkinHash(state); + return hash == null ? null : Utils.screenshotUrlFromHash(hash); +} + +export function getUrl(state) { + if (state.selectedSkinHash) { + // TODO: Add a human readable version + return `/skin/${getSelectedSkinHash(state)}/`; + } else { + return "/"; + } +} + +export function getPageTitle(state) { + return "Winamp Skins"; +} diff --git a/src/redux/store.js b/src/redux/store.js new file mode 100644 index 00000000..4e77c6c4 --- /dev/null +++ b/src/redux/store.js @@ -0,0 +1,55 @@ +import { createStore as createReduxStore } from "redux"; +import * as Selectors from "./selectors"; + +const defaultState = { + selectedSkinHash: null, + selectedSkinPosition: null +}; + +function reducer(state = defaultState, action) { + switch (action.type) { + case "SELECT_SKIN": + return { + ...state, + selectedSkinHash: action.hash, + selectedSkinPosition: action.position + }; + case "CLOSE_MODAL": + return { + ...state, + selectedSkinHash: null, + selectedSkinPosition: null + }; + case "URL_CHANGED": + if (action.location.pathname.startsWith("/skin/")) { + const segments = action.location.pathname.split("/"); + return { + ...state, + selectedSkinHash: segments[2], + // TODO: This makes no sense + selectedSkinPosition: null + }; + } + return defaultState; + default: + return state; + } +} +export function createStore() { + const store = createReduxStore(reducer); + let lastUrl = null; + store.subscribe(() => { + const state = store.getState(); + const url = Selectors.getUrl(state); + if (url != lastUrl) { + window.history.pushState({}, Selectors.getPageTitle(state), url); + lastUrl = url; + } + }); + window.onpopstate = function(event) { + const { state } = event; + store.dispatch({ type: "URL_CHANGED", location: document.location }); + }; + store.dispatch({ type: "URL_CHANGED", location: document.location }); + return store; +} diff --git a/src/utils.js b/src/utils.js index 566054be..8a193f7f 100644 --- a/src/utils.js +++ b/src/utils.js @@ -2,6 +2,9 @@ export function screenshotUrlFromHash(hash) { return `https://s3.amazonaws.com/webamp-uploaded-skins/screenshots/${hash}.png`; } +export function skinUrlFromHash(hash) { + return `https://s3.amazonaws.com/webamp-uploaded-skins/skins/${hash}.wsz`; +} export function getWindowSize() { var w = window, d = document, diff --git a/yarn.lock b/yarn.lock index dea64b9b..7e324800 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,12 @@ # yarn lockfile v1 +"@babel/runtime@^7.1.2": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.5.tgz#4170907641cf1f61508f563ece3725150cc6fe39" + dependencies: + regenerator-runtime "^0.12.0" + abab@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -47,12 +53,6 @@ acorn@^5.0.0, acorn@^5.4.0: version "5.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" -add-dom-event-listener@1.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz#8faed2c41008721cf111da1d30d995b85be42bed" - dependencies: - object-assign "4.x" - address@1.0.3, address@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" @@ -61,7 +61,7 @@ ajv-keywords@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" -ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: +ajv-keywords@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be" @@ -89,15 +89,6 @@ ajv@^6.0.1: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.1.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.4.0.tgz#d3aff78e9277549771daf0164cff48482b754fc6" - dependencies: - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - uri-js "^3.0.2" - align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -553,10 +544,6 @@ babel-plugin-jest-hoist@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767" -babel-plugin-remove-webpack@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-webpack/-/babel-plugin-remove-webpack-1.1.0.tgz#82925cab871230c0c6b82cf67a3af243c094d1d6" - babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -789,7 +776,7 @@ babel-plugin-transform-flow-strip-types@^6.22.0: babel-plugin-syntax-flow "^6.18.0" babel-runtime "^6.22.0" -babel-plugin-transform-object-rest-spread@6.26.0, babel-plugin-transform-object-rest-spread@^6.20.2: +babel-plugin-transform-object-rest-spread@6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" dependencies: @@ -849,7 +836,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-preset-env@1.6.1, babel-preset-env@^1.6.1: +babel-preset-env@1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" dependencies: @@ -937,7 +924,7 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@6.26.0, babel-runtime@6.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@6.26.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: @@ -977,10 +964,6 @@ babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24 lodash "^4.17.4" to-fast-properties "^1.0.3" -babel@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4" - babylon@^6.17.0, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -1011,10 +994,6 @@ big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" -bignumber.js@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" - binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" @@ -1029,10 +1008,6 @@ bluebird@^3.4.7: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" -bmp-js@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a" - bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" @@ -1297,10 +1272,6 @@ 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" -cardinal-spline-js@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/cardinal-spline-js/-/cardinal-spline-js-2.3.6.tgz#971be2b72f411a6d336c8012bdd54415d86c9090" - case-sensitive-paths-webpack-plugin@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz#3d29ced8c1f124bf6f53846fb3f5894731fdc909" @@ -1374,10 +1345,6 @@ clap@^1.0.9: dependencies: chalk "^1.1.3" -classnames@^2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" - clean-css@4.1.x: version "4.1.9" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.9.tgz#35cee8ae7687a49b98034f70de00c4edd3826301" @@ -1482,16 +1449,6 @@ commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" -component-classes@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/component-classes/-/component-classes-1.2.6.tgz#c642394c3618a4d8b0b8919efccbbd930e5cd691" - dependencies: - component-indexof "0.0.3" - -component-indexof@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-indexof/-/component-indexof-0.0.3.tgz#11d091312239eb8f32c8f25ae9cb002ffe8d3c24" - compressible@~2.0.13: version "2.0.13" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9" @@ -1587,10 +1544,6 @@ core-js@^2.4.0, core-js@^2.5.0: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" -core-js@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.3.0.tgz#fab83fbb0b2d8dc85fa636c4b9d34c75420c6d65" - 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" @@ -1680,13 +1633,6 @@ crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" -css-animation@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/css-animation/-/css-animation-1.4.1.tgz#5b8813125de0fbbbb0bbe1b472ae84221469b7a8" - dependencies: - babel-runtime "6.x" - component-classes "^1.2.5" - css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" @@ -1973,10 +1919,6 @@ doctrine@^2.0.0: dependencies: esutils "^2.0.2" -dom-align@1.x: - version "1.6.7" - resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.6.7.tgz#6858138efb6b77405ce99146d0be5e4f7282813f" - dom-converter@~0.1: version "0.1.4" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" @@ -1996,10 +1938,6 @@ dom-urls@^1.1.0: dependencies: urijs "^1.16.1" -dom-walk@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -2173,18 +2111,10 @@ es6-map@^0.1.3: es6-symbol "~3.1.1" event-emitter "~0.3.5" -es6-promise@^3.0.2: - version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - es6-promise@^4.0.5: version "4.2.4" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" -es6-promise@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" - es6-set@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" @@ -2267,13 +2197,6 @@ eslint-module-utils@^2.1.1: debug "^2.6.8" pkg-dir "^1.0.0" -eslint-module-utils@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" - dependencies: - debug "^2.6.8" - pkg-dir "^1.0.0" - eslint-plugin-flowtype@2.39.1: version "2.39.1" resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz#b5624622a0388bcd969f4351131232dcb9649cd5" @@ -2295,21 +2218,6 @@ eslint-plugin-import@2.8.0: minimatch "^3.0.3" read-pkg-up "^2.0.0" -eslint-plugin-import@^2.7.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.11.0.tgz#15aeea37a67499d848e8e981806d4627b5503816" - dependencies: - contains-path "^0.1.0" - debug "^2.6.8" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.2.0" - has "^1.0.1" - lodash "^4.17.4" - minimatch "^3.0.3" - read-pkg-up "^2.0.0" - resolve "^1.6.0" - eslint-plugin-jsx-a11y@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz#5c96bb5186ca14e94db1095ff59b3e2bd94069b1" @@ -2470,10 +2378,6 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -exif-parser@^0.1.9: - version "0.1.12" - resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" - expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -2634,10 +2538,6 @@ file-loader@1.1.5: loader-utils "^1.0.2" schema-utils "^0.3.0" -file-type@^3.1.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -2717,12 +2617,6 @@ flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" -for-each@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" - dependencies: - is-function "~1.0.0" - for-in@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2898,13 +2792,6 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -global@~4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - dependencies: - min-document "^2.19.0" - process "~0.5.1" - globals@^9.17.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3082,9 +2969,11 @@ hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" -hoist-non-react-statics@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz#d2ca2dfc19c5a91c5a6615ce8e564ef0347e2a40" +hoist-non-react-statics@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.1.0.tgz#42414ccdfff019cd2168168be998c7b3bd5245c0" + dependencies: + react-is "^16.3.2" home-or-tmp@^2.0.0: version "2.0.0" @@ -3244,10 +3133,6 @@ imagemagick@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/imagemagick/-/imagemagick-0.1.3.tgz#7483cea093b4d9f2e2f396857adc8821b537c56a" -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -3325,26 +3210,22 @@ interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" -invariant@^2.0.0, invariant@^2.2.3: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - dependencies: - loose-envify "^1.0.0" - invariant@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.3.tgz#1a827dfde7dcbd7c323f0ca826be8fa7c5e9d688" dependencies: loose-envify "^1.0.0" +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" -ip-regex@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" - ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -3433,10 +3314,6 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" -is-function@^1.0.1, is-function@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -3867,35 +3744,10 @@ jest@20.0.4: dependencies: jest-cli "^20.0.4" -jimp@^0.2.28: - version "0.2.28" - resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2" - dependencies: - bignumber.js "^2.1.0" - bmp-js "0.0.3" - es6-promise "^3.0.2" - exif-parser "^0.1.9" - file-type "^3.1.0" - jpeg-js "^0.2.0" - load-bmfont "^1.2.3" - mime "^1.3.4" - mkdirp "0.5.1" - pixelmatch "^4.0.0" - pngjs "^3.0.0" - read-chunk "^1.0.1" - request "^2.65.0" - stream-to-buffer "^0.1.0" - tinycolor2 "^1.1.2" - url-regex "^3.0.0" - jpeg-js@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.0.4.tgz#06aaf47efec7af0b1924a59cd695a6d2b5ed870e" -jpeg-js@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482" - js-base64@^2.1.9: version "2.4.3" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" @@ -3904,6 +3756,10 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" @@ -3954,12 +3810,6 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" -jsmediatags@^3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/jsmediatags/-/jsmediatags-3.8.1.tgz#e27d26e957b0b330c28f9762c82940c4dcc64720" - dependencies: - xhr2 "^0.1.4" - json-loader@^0.5.4: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" @@ -4025,16 +3875,6 @@ jsx-ast-utils@^2.0.0: dependencies: array-includes "^3.0.3" -jszip@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.1.5.tgz#e3c2a6c6d706ac6e603314036d43cd40beefdf37" - dependencies: - core-js "~2.3.0" - es6-promise "~3.0.2" - lie "~3.1.0" - pako "~1.0.2" - readable-stream "~2.0.6" - killable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" @@ -4084,24 +3924,6 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lie@~3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" - dependencies: - immediate "~3.0.5" - -load-bmfont@^1.2.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.3.0.tgz#bb7e7c710de6bcafcb13cb3b8c81e0c0131ecbc9" - dependencies: - buffer-equal "0.0.1" - mime "^1.3.4" - parse-bmfont-ascii "^1.0.3" - parse-bmfont-binary "^1.0.5" - parse-bmfont-xml "^1.1.0" - xhr "^2.0.1" - xtend "^4.0.0" - 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" @@ -4156,14 +3978,6 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" -lodash-es@^4.17.5, lodash-es@^4.2.1: - version "4.17.8" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.8.tgz#6fa8c8c5d337481df0bdf1c0d899d42473121e45" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -4180,22 +3994,6 @@ lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.keys@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -4217,7 +4015,7 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -"lodash@>=3.5 <5", lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0: +"lodash@>=3.5 <5", lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" @@ -4235,6 +4033,12 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: dependencies: js-tokens "^3.0.0" +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" @@ -4371,7 +4175,7 @@ mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" -mime@^1.3.4, mime@^1.4.1, mime@^1.5.0, mime@^1.6.0: +mime@^1.4.1, mime@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -4379,12 +4183,6 @@ mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - dependencies: - dom-walk "^0.1.0" - minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" @@ -4606,7 +4404,7 @@ oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@4.1.1, object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@4.1.1, 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" @@ -4751,7 +4549,7 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" -pako@~1.0.2, pako@~1.0.5: +pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" @@ -4771,21 +4569,6 @@ parse-asn1@^5.0.0: evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" -parse-bmfont-ascii@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" - -parse-bmfont-binary@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" - -parse-bmfont-xml@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.3.tgz#d6b66a371afd39c5007d9f0eeb262a4f2cce7b7c" - dependencies: - xml-parse-from-string "^1.0.0" - xml2js "^0.4.5" - parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -4795,13 +4578,6 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" -parse-headers@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" - dependencies: - for-each "^0.3.2" - trim "0.0.1" - parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -4910,12 +4686,6 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pixelmatch@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" - dependencies: - pngjs "^3.0.0" - pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" @@ -4932,10 +4702,6 @@ pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" -pngjs@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b" - pngparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pngparse/-/pngparse-2.0.1.tgz#86852de4de349f4efb1e852e7525655e5ac5dfb8" @@ -5244,10 +5010,6 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -prettier@^1.10.2: - version "1.12.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.12.1.tgz#c1ad20e803e7749faf905a409d2367e06bbe7325" - pretty-bytes@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" @@ -5270,10 +5032,6 @@ private@^0.1.6, private@^0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" @@ -5282,10 +5040,6 @@ process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" @@ -5302,14 +5056,6 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@15.x, prop-types@^15.5.4, prop-types@^15.5.8: - version "15.6.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.3.1" - object-assign "^4.1.1" - prop-types@^15.5.10, prop-types@^15.6.0: version "15.6.0" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" @@ -5318,6 +5064,13 @@ prop-types@^15.5.10, prop-types@^15.6.0: loose-envify "^1.3.1" object-assign "^4.1.1" +prop-types@^15.6.1: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + dependencies: + loose-envify "^1.3.1" + object-assign "^4.1.1" + proxy-addr@~2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" @@ -5351,10 +5104,6 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -punycode@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -5420,14 +5169,6 @@ range-parser@^1.0.3, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" -raven-for-redux@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/raven-for-redux/-/raven-for-redux-1.3.1.tgz#865f0056ec1706073c1b3a33164640453ed4fed2" - -raven-js@^3.19.1: - version "3.24.2" - resolved "https://registry.yarnpkg.com/raven-js/-/raven-js-3.24.2.tgz#c5cacb363b198812e80cd4c6714e5e478549ebcf" - raw-body@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" @@ -5437,63 +5178,6 @@ raw-body@2.3.2: iconv-lite "0.4.19" unpipe "1.0.0" -rc-align@2.x: - version "2.3.6" - resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-2.3.6.tgz#35046d2ac25771b1e5cbd600eae8f862c450f9e6" - dependencies: - babel-runtime "^6.26.0" - dom-align "1.x" - prop-types "^15.5.8" - rc-util "^4.0.4" - shallowequal "^1.0.2" - -rc-animate@2.x: - version "2.4.4" - resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-2.4.4.tgz#a05a784c747beef140d99ff52b6117711bef4b1e" - dependencies: - babel-runtime "6.x" - css-animation "^1.3.2" - prop-types "15.x" - -rc-slider@^8.1.5: - version "8.6.1" - resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-8.6.1.tgz#ee5e0380dbdf4b5de6955a265b0d4ff6196405d1" - dependencies: - babel-runtime "6.x" - classnames "^2.2.5" - prop-types "^15.5.4" - rc-tooltip "^3.7.0" - rc-util "^4.0.4" - shallowequal "^1.0.1" - warning "^3.0.0" - -rc-tooltip@^3.7.0: - version "3.7.2" - resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-3.7.2.tgz#3698656d4bacd51b72d9e327bed15d1d5a9f1b27" - dependencies: - babel-runtime "6.x" - prop-types "^15.5.8" - rc-trigger "^2.2.2" - -rc-trigger@^2.2.2: - version "2.3.4" - resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-2.3.4.tgz#389dfa5e834ecc3a446fe9cefc0b4a32900f4227" - dependencies: - babel-runtime "6.x" - prop-types "15.x" - rc-align "2.x" - rc-animate "2.x" - rc-util "^4.4.0" - -rc-util@^4.0.4, rc-util@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.5.0.tgz#3183e6ec806f382efb2d3e85770d95875fa6180f" - dependencies: - add-dom-event-listener "1.x" - babel-runtime "6.x" - prop-types "^15.5.10" - shallowequal "^0.2.2" - rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: version "1.2.5" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" @@ -5535,29 +5219,29 @@ react-dom@^16.2.0: object-assign "^4.1.1" prop-types "^15.6.0" -react-dom@^16.3.0: - version "16.3.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.3.2.tgz#cb90f107e09536d683d84ed5d4888e9640e0e4df" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.0" - react-error-overlay@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.0.tgz#d198408a85b4070937a98667f500c832f86bd5d4" -react-redux@^5.0.7: - version "5.0.7" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" +react-is@^16.3.2, react-is@^16.6.0: + version "16.6.3" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.6.3.tgz#d2d7462fcfcbe6ec0da56ad69047e47e56e7eac0" + +react-lifecycles-compat@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + +react-redux@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.1.tgz#88e368682c7fa80e34e055cd7ac56f5936b0f52f" dependencies: - hoist-non-react-statics "^2.5.0" - invariant "^2.0.0" - lodash "^4.17.5" - lodash-es "^4.17.5" + "@babel/runtime" "^7.1.2" + hoist-non-react-statics "^3.1.0" + invariant "^2.2.4" loose-envify "^1.1.0" - prop-types "^15.6.0" + prop-types "^15.6.1" + react-is "^16.6.0" + react-lifecycles-compat "^3.0.0" react-scripts@1.1.1: version "1.1.1" @@ -5612,19 +5296,6 @@ react@^16.2.0: object-assign "^4.1.1" prop-types "^15.6.0" -react@^16.3.0: - version "16.3.2" - resolved "https://registry.yarnpkg.com/react/-/react-16.3.2.tgz#fdc8420398533a1e58872f59091b272ce2f91ea9" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.0" - -read-chunk@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194" - 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" @@ -5676,17 +5347,6 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable string_decoder "~1.0.3" util-deprecate "~1.0.1" -readable-stream@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" @@ -5733,22 +5393,12 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" -redux-devtools-extension@^2.13.2: - version "2.13.2" - resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.2.tgz#e0f9a8e8dfca7c17be92c7124958a3b94eb2911d" - -redux-thunk@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5" - -redux@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" +redux@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" dependencies: - lodash "^4.2.1" - lodash-es "^4.2.1" - loose-envify "^1.1.0" - symbol-observable "^1.0.3" + loose-envify "^1.4.0" + symbol-observable "^1.2.0" regenerate@^1.2.1: version "1.3.3" @@ -5758,6 +5408,10 @@ regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -5870,33 +5524,6 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -request@^2.65.0: - version "2.85.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - request@^2.79.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" @@ -5947,10 +5574,6 @@ requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" -reselect@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" - resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -5982,12 +5605,6 @@ resolve@^1.3.2, resolve@^1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.6.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" - dependencies: - path-parse "^1.0.5" - restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -6050,7 +5667,7 @@ sane@~1.6.0: walker "~1.0.5" watch "~0.10.0" -sax@>=0.6.0, sax@^1.2.1, sax@~1.2.1: +sax@^1.2.1, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -6150,16 +5767,6 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shallowequal@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-0.2.2.tgz#1e32fd5bcab6ad688a4812cb0cc04efc75c7014e" - dependencies: - lodash.keys "^3.1.2" - -shallowequal@^1.0.1, shallowequal@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.0.2.tgz#1561dbdefb8c01408100319085764da3fcf83f8f" - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -6341,16 +5948,6 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" -stream-to-buffer@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9" - dependencies: - stream-to "~0.2.0" - -stream-to@~0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d" - strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -6497,7 +6094,7 @@ sw-toolbox@^3.4.0: path-to-regexp "^1.0.1" serviceworker-cache-polyfill "^4.0.0" -symbol-observable@^1.0.3: +symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -6587,14 +6184,6 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -tinycolor2@^1.1.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" - -tinyqueue@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-1.2.3.tgz#b6a61de23060584da29f82362e45df1ec7353f3d" - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -6635,10 +6224,6 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" -trim@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -6756,12 +6341,6 @@ upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" -uri-js@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-3.0.2.tgz#f90b858507f81dea4dcfbb3c4c3dbfa2b557faaa" - dependencies: - punycode "^2.1.0" - urijs@^1.16.1: version "1.19.1" resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a" @@ -6794,12 +6373,6 @@ url-parse@^1.1.8: querystringify "~1.0.0" requires-port "~1.0.0" -url-regex@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" - dependencies: - ip-regex "^1.0.1" - url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -6872,12 +6445,6 @@ walker@~1.0.5: dependencies: makeerror "1.0.x" -warning@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" - dependencies: - loose-envify "^1.0.0" - watch@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" @@ -6896,39 +6463,9 @@ wbuf@^1.1.0, wbuf@^1.7.2: dependencies: minimalistic-assert "^1.0.0" -webamp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/webamp/-/webamp-1.0.0.tgz#3c2788f6bcd272b50fc43ec9cec0461602191e49" - dependencies: - babel "^6.23.0" - babel-plugin-remove-webpack "^1.1.0" - babel-plugin-transform-object-rest-spread "^6.20.2" - babel-plugin-transform-react-jsx "^6.24.1" - babel-preset-env "^1.6.1" - babel-runtime "^6.26.0" - cardinal-spline-js "^2.3.6" - classnames "^2.2.5" - eslint-plugin-import "^2.7.0" - invariant "^2.2.3" - jsmediatags "^3.8.1" - jszip "^3.1.3" - prettier "^1.10.2" - prop-types "^15.5.10" - raven-for-redux "^1.3.1" - raven-js "^3.19.1" - rc-slider "^8.1.5" - react "^16.3.0" - react-dom "^16.3.0" - react-redux "^5.0.7" - redux "^3.7.2" - redux-devtools-extension "^2.13.2" - redux-thunk "^2.1.0" - reselect "^3.0.1" - tinyqueue "^1.2.3" - webpack "^3.6.0" - webpack-merge "^4.1.2" - webpack-pwa-manifest "^3.6.2" - winamp-eqf "^1.0.0" +webamp@^1.3.0-beta.0: + version "1.3.0-beta.0" + resolved "https://registry.yarnpkg.com/webamp/-/webamp-1.3.0-beta.0.tgz#130e2c8f52313a1a96d9dad7f9ed6f4765c04f6d" webidl-conversions@^3.0.0: version "3.0.1" @@ -6987,20 +6524,6 @@ webpack-manifest-plugin@1.3.2: fs-extra "^0.30.0" lodash ">=3.5 <5" -webpack-merge@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.2.tgz#5d372dddd3e1e5f8874f5bf5a8e929db09feb216" - dependencies: - lodash "^4.17.5" - -webpack-pwa-manifest@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/webpack-pwa-manifest/-/webpack-pwa-manifest-3.6.2.tgz#361a2dff083a87cdc373bd27defdcfe317ecff1f" - dependencies: - css-color-names "0.0.4" - jimp "^0.2.28" - mime "^1.6.0" - webpack-sources@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" @@ -7035,33 +6558,6 @@ webpack@3.8.1: webpack-sources "^1.0.1" yargs "^8.0.2" -webpack@^3.6.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894" - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - async "^2.1.2" - enhanced-resolve "^3.4.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - mkdirp "~0.5.0" - node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^4.2.1" - tapable "^0.2.7" - uglifyjs-webpack-plugin "^0.4.6" - watchpack "^1.4.0" - webpack-sources "^1.0.1" - yargs "^8.0.2" - websocket-driver@>=0.5.1: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" @@ -7120,10 +6616,6 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" -winamp-eqf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/winamp-eqf/-/winamp-eqf-1.0.0.tgz#0c3702e579a25511d0934b78ea8e6a8b9cbb259a" - window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" @@ -7176,19 +6668,6 @@ xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" -xhr2@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" - -xhr@^2.0.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.1.tgz#ba982cced205ae5eec387169ac9dc77ca4853d38" - dependencies: - global "~4.3.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - xml-char-classes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" @@ -7197,21 +6676,6 @@ xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" -xml-parse-from-string@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" - -xml2js@^0.4.5: - version "0.4.19" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" - dependencies: - sax ">=0.6.0" - xmlbuilder "~9.0.1" - -xmlbuilder@~9.0.1: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - xtend@^4.0.0, xtend@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"