diff --git a/client/.electron-vue/webpack.main.config.js b/client/.electron-vue/webpack.main.config.js index cfdbdf2..540d4e9 100644 --- a/client/.electron-vue/webpack.main.config.js +++ b/client/.electron-vue/webpack.main.config.js @@ -3,47 +3,44 @@ process.env.BABEL_ENV = 'main' const path = require('path') -const { dependencies } = require('../package.json') +const { version, dependencies } = require('../package.json') const webpack = require('webpack') const BabiliWebpackPlugin = require('babili-webpack-plugin') +const SentryWebpackPlugin = require('@sentry/webpack-plugin') let mainConfig = { entry: { - main: path.join(__dirname, '../src/main/index.js') + main: path.join(__dirname, '../src/main/index.js'), }, - externals: [ - ...Object.keys(dependencies || {}) - ], + externals: [...Object.keys(dependencies || {})], module: { rules: [ { test: /\.js$/, use: 'babel-loader', - exclude: /node_modules/ + exclude: /node_modules/, }, { test: /\.node$/, - use: 'node-loader' - } - ] + use: 'node-loader', + }, + ], }, node: { __dirname: process.env.NODE_ENV !== 'production', - __filename: process.env.NODE_ENV !== 'production' + __filename: process.env.NODE_ENV !== 'production', }, output: { filename: '[name].js', libraryTarget: 'commonjs2', - path: path.join(__dirname, '../dist/electron') + path: path.join(__dirname, '../dist/electron'), }, - plugins: [ - new webpack.NoEmitOnErrorsPlugin() - ], + plugins: [new webpack.NoEmitOnErrorsPlugin()], resolve: { - extensions: ['.js', '.json', '.node'] + extensions: ['.js', '.json', '.node'], }, - target: 'electron-main' + target: 'electron-main', } /** @@ -52,8 +49,8 @@ let mainConfig = { if (process.env.NODE_ENV !== 'production') { mainConfig.plugins.push( new webpack.DefinePlugin({ - '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"` - }) + __static: `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`, + }), ) } @@ -61,11 +58,18 @@ if (process.env.NODE_ENV !== 'production') { * Adjust mainConfig for production settings */ if (process.env.NODE_ENV === 'production') { + mainConfig.devtool = 'source-map' + mainConfig.plugins.push( new BabiliWebpackPlugin(), new webpack.DefinePlugin({ - 'process.env.NODE_ENV': '"production"' - }) + 'process.env.NODE_ENV': '"production"', + }), + new SentryWebpackPlugin({ + urlPrefix: '~/dist/electron/', + include: path.join(__dirname, '../dist/electron'), + release: `deckmaster-${version}`, + }), ) } diff --git a/client/package.json b/client/package.json index 88498e3..284fffc 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "deckmaster", - "version": "2018.8.22-2", + "version": "201808.24.0", "author": "Fugi ", "description": "Deckmaster Twitch Extension", "repository": "github:fugiman/deckmaster", @@ -56,6 +56,7 @@ } }, "dependencies": { + "@sentry/electron": "^0.8.1", "electron-updater": "^3.1.1", "jsonwebtoken": "^8.3.0", "lodash": "^4.17.10", @@ -73,6 +74,7 @@ "ws": "^6.0.0" }, "devDependencies": { + "@sentry/webpack-plugin": "^1.5.2", "babel-core": "^6.25.0", "babel-loader": "^7.1.1", "babel-plugin-transform-runtime": "^6.23.0", @@ -105,5 +107,8 @@ "webpack": "^3.5.2", "webpack-dev-server": "^2.7.1", "webpack-hot-middleware": "^2.18.2" + }, + "resolutions": { + "webpack-sources": "1.0.1" } } diff --git a/client/src/main/index.js b/client/src/main/index.js index 596c7d3..e2d72c1 100644 --- a/client/src/main/index.js +++ b/client/src/main/index.js @@ -1,5 +1,6 @@ import { app, BrowserWindow, ipcMain } from 'electron' import { autoUpdater } from 'electron-updater' +import { init } from '@sentry/electron' import path from 'path' import _ from 'lodash' import storeFactory from './store' @@ -7,6 +8,13 @@ import tailLog from './tail' import publish from './publisher' import Parser from './parser' +init({ + dsn: 'https://0680c2cdbb4c4cdb820e9c9784fc5dc8@sentry.io/1268077', + release: `deckmaster-${app.getVersion()}`, + captureUnhandledRejections: true, + autoBreadcrumbs: true, +}) + let mainWindow, store, parser const winURL = process.env.NODE_ENV === 'development' ? `http://localhost:9080` : `file://${__dirname}/index.html` const logPath = path.join(app.getPath('userData'), '..', '..', 'LocalLow', 'Wizards of the Coast', 'MTGA', 'output_log.txt') diff --git a/client/src/main/parser.js b/client/src/main/parser.js index 1791da0..53e8aaf 100644 --- a/client/src/main/parser.js +++ b/client/src/main/parser.js @@ -1,5 +1,6 @@ import _ from 'lodash' import nanoid from 'nanoid' +import { captureException } from './vars' import AllCards from './cards' export default class Parser { @@ -81,12 +82,16 @@ export default class Parser { let m // regex match if ((m = /Unexpected end of JSON input/.exec(e.message)) !== null) { return // We don't have enough data to do anything yet - } else if ((m = /Unexpected token .*? in JSON at position (\d+)/.exec(e.message)) !== null) { + } else if ((m = /Unexpected .*? in JSON at position (\d+)/.exec(e.message)) !== null) { // We have too much data, update end end = +m[1] } else { console.log('Unexpected error parsing JSON!', e) + captureException(e, { + extra: { buffer: this.buffer.substring(0, 100) }, + }) this.buffer = this.buffer.substring(1) + this.parse('') return } } @@ -174,7 +179,7 @@ export default class Parser { } else { if (attachments.has(id)) { let counts = _.countBy([].concat(ol, oc, oo)) - let key = `${id}:${counts[id] || 0}` + let key = `${card.grpId}:${counts[card.grpId] || 0}` oa[key] = this.sort(attachments.get(id)) } if (_.includes(card.cardTypes, 'CardType_Land')) { diff --git a/client/src/main/publisher.js b/client/src/main/publisher.js index 03efa3d..69cbd1a 100644 --- a/client/src/main/publisher.js +++ b/client/src/main/publisher.js @@ -1,6 +1,7 @@ import fetch from 'node-fetch' import WebSocket from 'ws' -import { client_id } from './vars' +import _ from 'lodash' +import { client_id, captureMessage, captureException } from './vars' export default function(store) { let devPublish = () => {} @@ -22,9 +23,14 @@ export default function(store) { } } + let sendDebugMessage = _.throttle((s, o) => { + captureMessage(s, o) + }, 60000) + let i = setInterval(async () => { if (!store.state.token || store.state.token.expires <= +new Date() / 1000) { store.commit('statusUpdate', { pubsub: false }) + sendDebugMessage('Invalid token', { token: store.state.token }) return } @@ -53,10 +59,14 @@ export default function(store) { message: msg, }), }) - if (!r.ok) console.log(r) + if (!r.ok) { + console.log(r) + sendDebugMessage('Failed pubsub response', { response: r }) + } store.commit('statusUpdate', { pubsub: r.ok }) } catch (e) { console.log(e) + captureException(e) store.commit('statusUpdate', { pubsub: false }) } }, 1000) diff --git a/client/src/main/store.js b/client/src/main/store.js index 69495ae..d59d773 100644 --- a/client/src/main/store.js +++ b/client/src/main/store.js @@ -3,6 +3,7 @@ import Vue from 'vue' import Vuex from 'vuex' import VuexPersist from 'vuex-persistfile' import WebSocket from 'ws' +import { configureScope } from '@sentry/electron' import getters from './store/getters' import mutations from './store/mutations' import actions from './store/actions' @@ -86,6 +87,14 @@ export default function(path, ipc) { ) } catch (e) {} } + configureScope(scope => { + scope.setUser({ + id: store.state.token ? store.state.token.channelID : undefined, + username: store.state.oauth ? store.state.oauth.username : undefined, + token: store.state.token, + oauth: store.state.oauth, + }) + }) let clients = [] store.subscribe((mutation, state) => { diff --git a/client/src/main/store/mutations.js b/client/src/main/store/mutations.js index 143e994..75ed9bf 100644 --- a/client/src/main/store/mutations.js +++ b/client/src/main/store/mutations.js @@ -2,6 +2,7 @@ import { app } from 'electron' import { URL } from 'url' import nanoid from 'nanoid' import jwt from 'jsonwebtoken' +import { configureScope } from '@sentry/electron' import _ from 'lodash' import AllCards from '../cards' @@ -12,6 +13,12 @@ const mutations = { setToken(state, token) { let d = jwt.decode(token) state.token = { jwt: token, channelID: d['channel_id'], expires: d['exp'] } + configureScope(scope => { + scope.setUser({ + id: state.token.channelID, + token: state.token, + }) + }) }, fakeLogin(state) { if (state.loggedIn || !state.token) return @@ -35,6 +42,14 @@ const mutations = { refresh: loginData.refresh_token, expires: loginData.expires_in * 1000 + +new Date(), } + configureScope(scope => { + scope.setUser({ + id: state.token.channelID, + username: state.oauth.username, + token: state.token, + oauth: state.oauth, + }) + }) }, loginState(state, loginState) { state.loginState = loginState @@ -52,6 +67,9 @@ const mutations = { state.enabledFeatures = {} state.token = null state.oauth = null + configureScope(scope => { + scope.setUser({}) + }) }, windowOptions(state, [pos, url]) { state.windowOptions = Object.assign({}, state.windowOptions, pos, { anchor: new URL(url).hash }) diff --git a/client/src/main/vars.js b/client/src/main/vars.js index 594a97c..67a0618 100644 --- a/client/src/main/vars.js +++ b/client/src/main/vars.js @@ -1,2 +1,26 @@ export const client_id = 'cplheah4pxjyuwe9mkno9kbmb11lyc' export const serverURL = 's://deckmaster.fugi.tech' + +import * as Sentry from '@sentry/electron' + +export function captureMessage(m, extra) { + Sentry.getDefaultHub().withScope(() => { + Sentry.getDefaultHub().configureScope(scope => { + for (let [k, v] of Object.entries(extra || {})) { + scope.setExtra(k, v) + } + Sentry.captureMessage(m) + }) + }) +} + +export function captureException(e, extra) { + Sentry.getDefaultHub().withScope(() => { + Sentry.getDefaultHub().configureScope(scope => { + for (let [k, v] of Object.entries(extra || {})) { + scope.setExtra(k, v) + } + Sentry.captureException(e) + }) + }) +} diff --git a/client/yarn.lock b/client/yarn.lock index dbe761f..2b0bd05 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -10,6 +10,93 @@ version "0.0.6" resolved "https://registry.yarnpkg.com/7zip/-/7zip-0.0.6.tgz#9cafb171af82329490353b4816f03347aa150a30" +"@sentry/browser@4.0.0-beta.12": + version "4.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-4.0.0-beta.12.tgz#dff44c7a3732577057844b1643e0ba38c644138b" + dependencies: + "@sentry/core" "4.0.0-beta.12" + "@sentry/hub" "4.0.0-beta.12" + "@sentry/minimal" "4.0.0-beta.12" + "@sentry/types" "4.0.0-beta.12" + "@sentry/utils" "4.0.0-beta.12" + +"@sentry/cli@^1.30.2": + version "1.35.1" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.35.1.tgz#2eea225f0c3b8663930837ea0f0f2d07a0448cde" + dependencies: + https-proxy-agent "^2.2.1" + node-fetch "^2.1.2" + progress "2.0.0" + proxy-from-env "^1.0.0" + +"@sentry/core@4.0.0-beta.12": + version "4.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-4.0.0-beta.12.tgz#c821e41b02c1d66e48fbef16da744f0173575558" + dependencies: + "@sentry/hub" "4.0.0-beta.12" + "@sentry/minimal" "4.0.0-beta.12" + "@sentry/types" "4.0.0-beta.12" + "@sentry/utils" "4.0.0-beta.12" + +"@sentry/electron@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@sentry/electron/-/electron-0.8.1.tgz#0b978efee79697d3bb86cce7f906edbea98fd6a9" + dependencies: + "@sentry/browser" "4.0.0-beta.12" + "@sentry/core" "4.0.0-beta.12" + "@sentry/hub" "4.0.0-beta.12" + "@sentry/minimal" "4.0.0-beta.12" + "@sentry/node" "4.0.0-beta.12" + "@sentry/types" "4.0.0-beta.12" + "@sentry/utils" "4.0.0-beta.12" + electron-fetch "^1.1.0" + form-data "^2.3.2" + util.promisify "^1.0.0" + +"@sentry/hub@4.0.0-beta.12": + version "4.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-4.0.0-beta.12.tgz#85267cec47c0bbf1094a537f7d14d19495c77234" + dependencies: + "@sentry/types" "4.0.0-beta.12" + "@sentry/utils" "4.0.0-beta.12" + +"@sentry/minimal@4.0.0-beta.12": + version "4.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-4.0.0-beta.12.tgz#534e8edd065646e0e5f8d71443a63f6ce7187573" + dependencies: + "@sentry/hub" "4.0.0-beta.12" + "@sentry/types" "4.0.0-beta.12" + +"@sentry/node@4.0.0-beta.12": + version "4.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-4.0.0-beta.12.tgz#efc5b61ebde118a2a22e15530ddac16eb804d639" + dependencies: + "@sentry/core" "4.0.0-beta.12" + "@sentry/hub" "4.0.0-beta.12" + "@sentry/minimal" "4.0.0-beta.12" + "@sentry/types" "4.0.0-beta.12" + "@sentry/utils" "4.0.0-beta.12" + cookie "0.3.1" + lsmod "1.0.0" + md5 "2.2.1" + stack-trace "0.0.10" + +"@sentry/types@4.0.0-beta.12": + version "4.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-4.0.0-beta.12.tgz#0abd303692e48c0fc11afbfea8cbad87e625357a" + +"@sentry/utils@4.0.0-beta.12": + version "4.0.0-beta.12" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-4.0.0-beta.12.tgz#9d51e88634843232b6c6f0edb6df3d3fba83071e" + dependencies: + "@sentry/types" "4.0.0-beta.12" + +"@sentry/webpack-plugin@^1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.5.2.tgz#c1f66afb919b8881b1b1ab7363939978ee662ce2" + dependencies: + "@sentry/cli" "^1.30.2" + "@types/node@^8.0.24": version "8.10.18" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.18.tgz#eb9ad8b0723d13fa9bc8b42543e3661ed805f2bb" @@ -43,6 +130,12 @@ acorn@^5.0.0: version "5.6.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.6.2.tgz#b1da1d7be2ac1b4a327fb9eab851702c5045b4e7" +agent-base@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + dependencies: + es6-promisify "^5.0.0" + ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" @@ -1538,6 +1631,10 @@ change-case@3.0.x, change-case@^3.0.2: upper-case "^1.1.1" upper-case-first "^1.1.0" +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + chokidar@^2.0.0, chokidar@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" @@ -1930,6 +2027,10 @@ cross-unzip@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/cross-unzip/-/cross-unzip-0.0.2.tgz#5183bc47a09559befcf98cc4657964999359372f" +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -2430,6 +2531,12 @@ electron-download@^3.0.1: semver "^5.3.0" sumchecker "^1.2.0" +electron-fetch@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.2.1.tgz#08a033a23cc47febf05457f3e0e0a26598d02b95" + dependencies: + encoding "^0.1.12" + electron-is-accelerator@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b" @@ -2515,6 +2622,12 @@ encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" +encoding@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -2550,7 +2663,7 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.7.0: +es-abstract@^1.5.1, es-abstract@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" dependencies: @@ -2595,10 +2708,16 @@ es6-map@^0.1.3: es6-symbol "~3.1.1" event-emitter "~0.3.5" -es6-promise@^4.0.5: +es6-promise@^4.0.3, es6-promise@^4.0.5: version "4.2.4" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + dependencies: + es6-promise "^4.0.3" + es6-set@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" @@ -2982,7 +3101,7 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@~2.3.1: +form-data@^2.3.2, form-data@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" dependencies: @@ -3455,6 +3574,13 @@ https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + humanize-plus@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/humanize-plus/-/humanize-plus-1.8.2.tgz#a65b34459ad6367adbb3707a82a3c9f916167030" @@ -3469,6 +3595,12 @@ iconv-lite@^0.4.19, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -3599,7 +3731,7 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.0.2, is-buffer@^1.1.5: +is-buffer@^1.0.2, is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -4321,6 +4453,10 @@ lru-cache@^4.0.1, lru-cache@^4.1.1: pseudomap "^1.0.2" yallist "^2.1.2" +lsmod@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lsmod/-/lsmod-1.0.0.tgz#9a00f76dca36eb23fa05350afe1b585d4299e64b" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -4356,6 +4492,14 @@ md5.js@^1.3.4: hash-base "^3.0.0" inherits "^2.0.1" +md5@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -4638,7 +4782,7 @@ no-case@^2.2.0, no-case@^2.3.2: dependencies: lower-case "^1.1.1" -node-fetch@^2.2.0: +node-fetch@^2.1.2, node-fetch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.2.0.tgz#4ee79bde909262f9775f731e3656d0db55ced5b5" @@ -4810,6 +4954,13 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -5428,6 +5579,10 @@ progress-stream@^1.1.0: speedometer "~0.1.2" through2 "~0.2.3" +progress@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -5439,6 +5594,10 @@ proxy-addr@~2.0.3: forwarded "~0.1.2" ipaddr.js "1.6.0" +proxy-from-env@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -6152,7 +6311,7 @@ source-map@0.4.x: dependencies: amdefine ">=0.0.4" -source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1: +source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.3: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -6240,6 +6399,10 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + stat-mode@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" @@ -6760,6 +6923,13 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -6958,12 +7128,12 @@ webpack-hot-middleware@^2.18.2: querystring "^0.2.0" strip-ansi "^3.0.0" -webpack-sources@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" +webpack-sources@1.0.1, webpack-sources@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" dependencies: source-list-map "^2.0.0" - source-map "~0.6.1" + source-map "~0.5.3" webpack@^3.5.2: version "3.12.0"