diff --git a/CHANGELOG.md b/CHANGELOG.md index 1619af53a..828f6b949 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Web UI version numbers should always match the corresponding version of LBRY App ## [Unreleased] ### Added * Now you can revoke your claims from the txns list itself.(#581) + * The app now closes to the system tray unless specifically requested to quit. (#374) * Added new window menu options for reloading and help. * Rewards are now marked in transaction history (#660) * @@ -19,6 +20,8 @@ Web UI version numbers should always match the corresponding version of LBRY App ### Fixed * Fixed console errors on settings page related to improper React input properties. + * Fixed modals being too narrow after font change (#709) + * Fixed bug that prevented new channel and first publish rewards from being claimed (#290) ### Deprecated * diff --git a/app/main.js b/app/main.js index c11468b8f..0774c081a 100644 --- a/app/main.js +++ b/app/main.js @@ -1,4 +1,5 @@ -const {app, BrowserWindow, ipcMain} = require('electron'); +module.exports = { safeQuit } +const {app, BrowserWindow, ipcMain, Menu, Tray, globalShortcut} = require('electron'); const url = require('url'); const isDebug = process.env.NODE_ENV === 'development'; const setMenu = require('./menu/main-menu.js'); @@ -55,6 +56,13 @@ let readyToQuit = false; // sendCredits it to, it's cached in this variable. let openUri = null; +// Set this to true to minimize on clicking close +// false for normal action +let minimize = true; + +// Keep the tray also, it is getting GC'd if put in createTray() +let tray = null; + function processRequestedUri(uri) { // Windows normalizes URIs when they're passed in from other apps. On Windows, // this function tries to restore the original URI that was typed. @@ -167,10 +175,47 @@ function createWindow () { }); } + win.removeAllListeners(); + + win.on('close', function(event) { + if (minimize) { + event.preventDefault(); + win.hide(); + } + }) + win.on('closed', () => { win = null }) + win.on("hide", () => { + // Checks what to show in the tray icon menu + if (minimize) updateTray(); + }); + + win.on("show", () => { + // Checks what to show in the tray icon menu + if (minimize) updateTray(); + }); + + win.on("blur", () => { + // Checks what to show in the tray icon menu + if (minimize) updateTray(); + + // Unregisters Alt+F4 shortcut + globalShortcut.unregister('Alt+F4'); + }); + + win.on("focus", () => { + // Checks what to show in the tray icon menu + if (minimize) updateTray(); + + // Registers shortcut for closing(quitting) the app + globalShortcut.register('Alt+F4', () => safeQuit()); + + win.webContents.send('window-is-focused', null); + }); + // Menu bar win.setAutoHideMenuBar(true); win.setMenuBarVisibility(isDebug); @@ -178,14 +223,65 @@ function createWindow () { }; +function createTray () { + // Minimize to tray logic follows: + // Set the tray icon + const iconPath = path.join(app.getAppPath(), "/dist/img/fav/32x32.png"); + tray = new Tray(iconPath); + tray.setToolTip("LBRY App"); + tray.setTitle("LBRY"); + tray.on('double-click', () => { + win.show() + }) +} + +// This needs to be done as for linux the context menu doesn't update automatically(docs) +function updateTray() { + let contextMenu = Menu.buildFromTemplate(getMenuTemplate()); + if (tray) { + tray.setContextMenu(contextMenu); + } else { + console.log("How did update tray get called without a tray?"); + } +} + +function getMenuTemplate () { + return [ + getToggleItem(), + { + label: "Quit", + click: () => safeQuit(), + }, + ] + + function getToggleItem () { + if (win.isVisible() && win.isFocused()) { + return { + label: 'Hide LBRY App', + click: () => win.hide() + + } + } else { + return { + label: 'Show LBRY App', + click: () => win.show() + } + } + } +} + function handleOpenUriRequested(uri) { if (!win) { // Window not created yet, so store up requested URI for when it is openUri = processRequestedUri(uri); } else { + if (win.isMinimized()) { - win.restore(); + win.restore() + } else if (!win.isVisible()) { + win.show() } + win.focus(); win.webContents.send('open-uri-requested', processRequestedUri(uri)); } @@ -224,6 +320,15 @@ function launchDaemon() { daemonSubprocess.on('exit', handleDaemonSubprocessExited); } + +/* + * Quits by first killing the daemon, the calling quitting for real. + */ +function safeQuit() { + minimize = false; + app.quit(); +} + /* * Quits without any preparation. When a quit is requested (either through the * interface or through app.quit()), we abort the quit, try to shut down the daemon, @@ -231,7 +336,7 @@ function launchDaemon() { */ function quitNow() { readyToQuit = true; - app.quit(); + safeQuit(); } const isSecondaryInstance = app.makeSingleInstance((argv) => { @@ -240,6 +345,8 @@ const isSecondaryInstance = app.makeSingleInstance((argv) => { } else if (win) { if (win.isMinimized()) { win.restore(); + } else if (!win.isVisible()) { + win.show(); } win.focus(); } @@ -252,6 +359,14 @@ if (isSecondaryInstance) { // We're not in the original process, so quit app.on('ready', function(){ launchDaemonIfNotRunning(); + if (process.platform === "linux") { + checkLinuxTraySupport( err => { + if (!err) createTray(); + else minimize = false; + }) + } else { + createTray(); + } createWindow(); }); @@ -385,6 +500,22 @@ function upgrade(event, installerPath) { console.log('After the install is complete, please reopen the app.'); } +// Taken from webtorrent-desktop +function checkLinuxTraySupport (cb) { + // Check that we're on Ubuntu (or another debian system) and that we have + // libappindicator1. + child_process.exec('dpkg --get-selections libappindicator1', function (err, stdout) { + if (err) return cb(err) + // Unfortunately there's no cleaner way, as far as I can tell, to check + // whether a debian package is installed: + if (stdout.endsWith('\tinstall\n')) { + cb(null) + } else { + cb(new Error('debian package not installed')) + } + }) +} + ipcMain.on('upgrade', upgrade); app.setAsDefaultProtocolClient('lbry'); diff --git a/app/menu/main-menu.js b/app/menu/main-menu.js index 7b214bfca..93251992e 100644 --- a/app/menu/main-menu.js +++ b/app/menu/main-menu.js @@ -1,6 +1,18 @@ const { app, shell, Menu } = require('electron'); +const { safeQuit } = require('../main.js') + const baseTemplate = [ + { + label: 'File', + submenu: [ + { + label: 'Quit', + accelerator: "CommandOrControl+Q", + click: () => safeQuit(), + }, + ] + }, { label: 'Edit', submenu: [ diff --git a/app/package.json b/app/package.json index 5a52e2887..cf52260ec 100644 --- a/app/package.json +++ b/app/package.json @@ -20,7 +20,7 @@ "electron-rebuild": "^1.5.11" }, "lbrySettings": { - "lbrynetDaemonVersion": "0.17.1", + "lbrynetDaemonVersion": "0.18.0rc1", "lbrynetDaemonUrlTemplate": "https://github.com/lbryio/lbry/releases/download/vDAEMONVER/lbrynet-daemon-vDAEMONVER-OSNAME.zip" }, "license": "MIT" diff --git a/build/prebuild.sh b/build/prebuild.sh index 568c93c59..16f4e4d19 100755 --- a/build/prebuild.sh +++ b/build/prebuild.sh @@ -41,7 +41,7 @@ set -eu if $LINUX; then INSTALL="$SUDO apt-get install --no-install-recommends -y" - $INSTALL build-essential libssl-dev libffi-dev libgmp3-dev python2.7-dev libsecret-1-dev + $INSTALL build-essential libssl-dev libffi-dev libgmp3-dev python2.7-dev libsecret-1-dev wget elif $OSX && ! cmd_exists brew ; then /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" fi diff --git a/build/upload_assets.py b/build/upload_assets.py index bc702b26b..ed40c9ec7 100644 --- a/build/upload_assets.py +++ b/build/upload_assets.py @@ -29,7 +29,7 @@ def get_asset_filename(): def upload_to_s3(folder): - tag = subprocess.check_output(['git', 'describe', '--always', 'HEAD']).strip() + tag = subprocess.check_output(['git', 'describe', '--always', '--abbrev=8', 'HEAD']).strip() commit_date = subprocess.check_output([ 'git', 'show', '-s', '--format=%cd', '--date=format:%Y%m%d-%H%I%S', 'HEAD']).strip() diff --git a/ui/dist/img/fav/32x32.png b/ui/dist/img/fav/32x32.png new file mode 100644 index 000000000..ece10998c Binary files /dev/null and b/ui/dist/img/fav/32x32.png differ diff --git a/ui/js/actions/content.js b/ui/js/actions/content.js index d5281a0f9..6347536c0 100644 --- a/ui/js/actions/content.js +++ b/ui/js/actions/content.js @@ -78,25 +78,18 @@ export function doFetchFeaturedUris() { type: types.FETCH_FEATURED_CONTENT_STARTED, }); - const success = ({ Categories, Uris }) => { - let featuredUris = {}; + const success = ({ Uris }) => { let urisToResolve = []; - Categories.forEach(category => { - if (Uris[category] && Uris[category].length) { - const uris = Uris[category]; - - featuredUris[category] = uris; - urisToResolve = [...urisToResolve, ...uris]; - } - }); + for (let category in Uris) { + urisToResolve = [...urisToResolve, ...Uris[category]]; + } const actions = [ doResolveUris(urisToResolve), { type: types.FETCH_FEATURED_CONTENT_COMPLETED, data: { - categories: Categories, - uris: featuredUris, + uris: Uris, success: true, }, }, @@ -108,15 +101,12 @@ export function doFetchFeaturedUris() { dispatch({ type: types.FETCH_FEATURED_CONTENT_COMPLETED, data: { - categories: [], uris: {}, }, }); }; - lbryio - .call("file", "list_homepage", { version: "early-access" }) - .then(success, failure); + lbryio.call("file", "list_homepage").then(success, failure); }; } diff --git a/ui/js/component/video/view.jsx b/ui/js/component/video/view.jsx index fb1bd3420..f65a63204 100644 --- a/ui/js/component/video/view.jsx +++ b/ui/js/component/video/view.jsx @@ -73,9 +73,7 @@ class Video extends React.PureComponent { "It looks like you deleted or moved this file. We're rebuilding it now. It will only take a few seconds." ); } else if (isLoading) { - loadStatusMessage = __( - "Requesting stream... it may sit here for like 15-20 seconds in a really awkward way... we're working on it" - ); + loadStatusMessage = __("Requesting stream..."); } else if (isDownloading) { loadStatusMessage = __("Downloading stream... not long left now!"); } diff --git a/ui/js/main.js b/ui/js/main.js index de18d0ee1..b074f4b6d 100644 --- a/ui/js/main.js +++ b/ui/js/main.js @@ -37,6 +37,14 @@ ipcRenderer.on("open-menu", (event, uri) => { } }); +const dock = remote.app.dock; + +ipcRenderer.on("window-is-focused", (event, data) => { + if (!dock) return; + app.store.dispatch({ type: types.WINDOW_FOCUSED }); + dock.setBadge(""); +}); + document.addEventListener("click", event => { var target = event.target; while (target && target !== document) { @@ -52,21 +60,6 @@ document.addEventListener("click", event => { } }); -const application = remote.app; -const dock = application.dock; -const win = remote.getCurrentWindow(); - -// Tear down previous event listeners when reload -win.removeAllListeners(); - -// Clear the badge when the window is focused -win.on("focus", () => { - if (!dock) return; - - app.store.dispatch({ type: types.WINDOW_FOCUSED }); - dock.setBadge(""); -}); - const initialState = app.store.getState(); var init = function() { diff --git a/ui/js/modal/modalCreditIntro/view.jsx b/ui/js/modal/modalCreditIntro/view.jsx index 9675ba275..73604985d 100644 --- a/ui/js/modal/modalCreditIntro/view.jsx +++ b/ui/js/modal/modalCreditIntro/view.jsx @@ -4,8 +4,7 @@ import { CreditAmount, CurrencySymbol } from "component/common"; import Link from "component/link/index"; const ModalCreditIntro = props => { - const { closeModal, currentBalance, totalRewardValue, verifyAccount } = props; - + const { closeModal, totalRewardValue, verifyAccount } = props; const totalRewardRounded = Math.round(totalRewardValue / 10) * 10; return ( diff --git a/ui/js/rewards.js b/ui/js/rewards.js index 0a3475246..2c8eae8a2 100644 --- a/ui/js/rewards.js +++ b/ui/js/rewards.js @@ -1,4 +1,3 @@ -const hashes = require("jshashes"); import lbry from "lbry"; import lbryio from "lbryio"; import { doShowSnackBar } from "actions/app"; @@ -37,54 +36,6 @@ function rewardMessage(type, amount) { }[type]; } -function toHex(s) { - let h = ""; - for (var i = 0; i < s.length; i++) { - let c = s.charCodeAt(i).toString(16); - if (c.length < 2) { - c = "0".concat(c); - } - h += c; - } - return h; -} - -function fromHex(h) { - let s = ""; - for (let i = 0; i < h.length; i += 2) { - s += String.fromCharCode(parseInt(h.substr(i, 2), 16)); - } - return s; -} - -function reverseString(s) { - let o = ""; - for (let i = s.length - 1; i >= 0; i--) { - o += s[i]; - } - return o; -} - -function pack(num) { - return ( - "" + - String.fromCharCode(num & 0xff) + - String.fromCharCode((num >> 8) & 0xff) + - String.fromCharCode((num >> 16) & 0xff) + - String.fromCharCode((num >> 24) & 0xff) - ); -} - -// Returns true if claim is an initial claim, false if it's an update to an existing claim -function isInitialClaim(claim) { - const reversed = reverseString(fromHex(claim.txid)); - const concat = reversed.concat(pack(claim.nout)); - const sha256 = new hashes.SHA256({ utf8: false }).raw(concat); - const ripemd160 = new hashes.RMD160({ utf8: false }).raw(sha256); - const hash = toHex(reverseString(ripemd160)); - return hash == claim.claim_id; -} - const rewards = {}; rewards.TYPE_NEW_DEVELOPER = "new_developer"; @@ -149,7 +100,7 @@ rewards.claimReward = function(type) { claim.name.length && claim.name[0] == "@" && claim.txid.length && - isInitialClaim(claim) + claim.category == "claim" ); }); if (claim) { @@ -173,7 +124,7 @@ rewards.claimReward = function(type) { claim.name.length && claim.name[0] != "@" && claim.txid.length && - isInitialClaim(claim) + claim.category == "claim" ); }); if (claim) { diff --git a/ui/package.json b/ui/package.json index 8b820fb0d..93b023d35 100644 --- a/ui/package.json +++ b/ui/package.json @@ -70,8 +70,9 @@ "node-loader": "^0.6.0", "prettier": "^1.4.2", "style-loader": "^0.18.2", - "webpack": "^2.6.1", + "webpack": "^3.0.0", "webpack-dev-server": "^2.4.4", + "webpack-merge": "^4.1.1", "webpack-notifier": "^1.5.0", "webpack-target-electron-renderer": "^0.4.0" }, diff --git a/ui/scss/_vars.scss b/ui/scss/_vars.scss index b7c3a9057..44c6087aa 100644 --- a/ui/scss/_vars.scss +++ b/ui/scss/_vars.scss @@ -128,6 +128,7 @@ $text-color: #000; --card-small-width: $spacing-vertical * 10; /* Modal */ + --modal-width: 420px; --modal-bg: var(--color-bg); --modal-overlay-bg: rgba(#F5F5F5, 0.75); // --color-canvas: #F5F5F5 --modal-border: 1px solid rgb(204, 204, 204); diff --git a/ui/scss/component/_modal.scss b/ui/scss/component/_modal.scss index cb664e4c1..26fa408df 100644 --- a/ui/scss/component/_modal.scss +++ b/ui/scss/component/_modal.scss @@ -29,7 +29,7 @@ border-radius: 4px; padding: $spacing-vertical; box-shadow: var(--box-shadow-layer); - max-width: 400px; + max-width: var(--modal-width); word-break: break-word; } @@ -70,13 +70,13 @@ .error-modal { max-width: none; - width: 400px; + width: var(--modal-width); } .error-modal__error-list { /*shitty hack/temp fix for long errors making modal unusable*/ border: 1px solid var(--input-border-color); padding: 8px; list-style: none; max-height: 400px; - max-width: 400px; + max-width: var(--modal-width); overflow-y: hidden; } diff --git a/ui/watch.sh b/ui/watch.sh index 6a60eb10c..e7092699d 100755 --- a/ui/watch.sh +++ b/ui/watch.sh @@ -21,5 +21,5 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" node_modules/.bin/node-sass --output $DIR/../app/dist/css --sourcemap=none $DIR/scss/ node_modules/.bin/node-sass --output $DIR/../app/dist/css --sourcemap=none --watch $DIR/scss/ & - node_modules/.bin/webpack --config webpack.dev.config.js --progress --colors --watch -) + node_modules/.bin/webpack --config webpack.dev.js --progress --colors --watch +) \ No newline at end of file diff --git a/ui/webpack.common.js b/ui/webpack.common.js new file mode 100644 index 000000000..d2d7e0719 --- /dev/null +++ b/ui/webpack.common.js @@ -0,0 +1,55 @@ +const path = require("path"); +const webpack = require("webpack") +const appPath = path.resolve(__dirname, "js"); + +process.traceDeprecation = true; + +const PATHS = { + app: path.join(__dirname, "app"), + dist: path.join(__dirname, "dist") +}; + +module.exports = { + entry: ["babel-polyfill", "./js/main.js"], + output: { + path: path.join(PATHS.dist, "js"), + publicPath: "/js/", + filename: "bundle.js" + }, + resolve: { + modules: [appPath, "node_modules"], + extensions: [".js", ".jsx", ".css"] + }, + module: { + rules: [ + { + test: /\.jsx?$/, + enforce: "pre", + loaders: ["eslint"], + // define an include so we check just the files we need + include: PATHS.app + }, + { + test: /\.node$/, + use: ["node-loader"] + }, + { + test: /\.css$/, + use: ["style-loader", "css-loader"] + }, + { + test: /\.jsx?$/, + exclude: /node_modules/, + use: { + loader: "babel-loader", + options: { + cacheDirectory: true, + presets: [ "es2015", "react", "stage-2" ] + } + } + } + ] + }, + target: "electron-main", +}; + diff --git a/ui/webpack.dev.js b/ui/webpack.dev.js new file mode 100644 index 000000000..073dfdc23 --- /dev/null +++ b/ui/webpack.dev.js @@ -0,0 +1,22 @@ +const path = require("path"); +const webpack = require("webpack") +const WebpackNotifierPlugin = require("webpack-notifier") +const merge = require('webpack-merge'); +const common = require('./webpack.common.js'); + +module.exports = merge(common, { + output: { + pathinfo: true + }, + cache: true, + devtool: "eval", + plugins: [ + new WebpackNotifierPlugin(), + new webpack.DefinePlugin({ + ENV: JSON.stringify("development"), + }), + new webpack.LoaderOptionsPlugin({ + debug: true + }) + ] +}); \ No newline at end of file diff --git a/ui/webpack.prod.js b/ui/webpack.prod.js new file mode 100644 index 000000000..142f6bbfb --- /dev/null +++ b/ui/webpack.prod.js @@ -0,0 +1,11 @@ +const webpack = require("webpack") +const merge = require('webpack-merge'); +const common = require('./webpack.common.js'); + +module.exports = merge(common, { + plugins: [ + new webpack.DefinePlugin({ + ENV: JSON.stringify("production") + }) + ] +}); diff --git a/ui/yarn.lock b/ui/yarn.lock index 63f3c02d8..99db2b20c 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -41,10 +41,14 @@ acorn@^5.0.0, acorn@^5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" -ajv-keywords@^1.0.0, ajv-keywords@^1.1.1: +ajv-keywords@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" +ajv-keywords@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + ajv@^4.7.0, ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" @@ -61,6 +65,15 @@ ajv@^5.0.0: json-schema-traverse "^0.3.0" json-stable-stringify "^1.0.1" +ajv@^5.1.5: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + 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" @@ -1127,6 +1140,10 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + caniuse-api@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" @@ -1168,7 +1185,7 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chokidar@^1.0.0, chokidar@^1.4.3, chokidar@^1.6.0, chokidar@^1.6.1: +chokidar@^1.0.0, chokidar@^1.6.0, chokidar@^1.6.1, chokidar@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: @@ -1891,14 +1908,14 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec" +enhanced-resolve@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" object-assign "^4.0.1" - tapable "^0.2.5" + tapable "^0.2.7" enhanced-resolve@~0.9.0: version "0.9.1" @@ -2312,6 +2329,14 @@ fast-deep-equal@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-0.1.0.tgz#5c6f4599aba6b333ee3342e2ed978672f1001f8d" +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" @@ -3411,7 +3436,7 @@ loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" -loader-utils@^0.2.11, loader-utils@^0.2.16: +loader-utils@^0.2.11: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" dependencies: @@ -3420,7 +3445,7 @@ loader-utils@^0.2.11, loader-utils@^0.2.16: json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.2: +loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" dependencies: @@ -3663,6 +3688,12 @@ mediasource@^2.0.0, mediasource@^2.1.0: readable-stream "^2.0.5" to-arraybuffer "^1.0.1" +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" @@ -4206,6 +4237,14 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -5423,9 +5462,9 @@ source-list-map@^0.1.7, source-list-map@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" -source-list-map@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.2.tgz#9889019d1024cce55cdc069498337ef6186a11a1" +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" source-map-support@^0.4.2: version "0.4.15" @@ -5445,10 +5484,14 @@ source-map@^0.4.2, source-map@~0.4.1: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.3: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + spawn-rx@^2.0.10: version "2.0.11" resolved "https://registry.yarnpkg.com/spawn-rx/-/spawn-rx-2.0.11.tgz#65451ad65662801daea75549832a782de0048dbf" @@ -5653,6 +5696,12 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" +supports-color@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + dependencies: + has-flag "^2.0.0" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -5684,9 +5733,9 @@ tapable@^0.1.8, tapable@~0.1.8: version "0.1.10" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" -tapable@^0.2.5, tapable@~0.2.5: - version "0.2.6" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d" +tapable@^0.2.7: + version "0.2.8" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" tar-pack@^3.4.0: version "3.4.0" @@ -5811,7 +5860,7 @@ ua-parser-js@^0.7.9: version "0.7.13" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.13.tgz#cd9dd2f86493b3f44dbeeef3780fda74c5ee14be" -uglify-js@^2.8.27: +uglify-js@^2.8.29: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" dependencies: @@ -5833,6 +5882,14 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" +uglifyjs-webpack-plugin@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" + dependencies: + source-map "^0.5.6" + uglify-js "^2.8.29" + webpack-sources "^1.0.1" + uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -5974,12 +6031,12 @@ watchpack@^0.2.1: chokidar "^1.0.0" graceful-fs "^4.1.2" -watchpack@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87" +watchpack@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" dependencies: async "^2.1.2" - chokidar "^1.4.3" + chokidar "^1.7.0" graceful-fs "^4.1.2" wbuf@^1.1.0, wbuf@^1.7.2: @@ -6030,6 +6087,12 @@ webpack-dev-server@^2.4.4: webpack-dev-middleware "^1.10.2" yargs "^6.0.0" +webpack-merge@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.1.tgz#f1197a0a973e69c6fbeeb6d658219aa8c0c13555" + dependencies: + lodash "^4.17.4" + webpack-notifier@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/webpack-notifier/-/webpack-notifier-1.5.0.tgz#c010007d448cebc34defc99ecf288fa5e8c6baf6" @@ -6038,12 +6101,12 @@ webpack-notifier@^1.5.0: object-assign "^4.1.0" strip-ansi "^3.0.1" -webpack-sources@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb" +webpack-sources@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.2.tgz#d0148ec083b3b5ccef1035a6b3ec16442983b27a" dependencies: - source-list-map "^1.1.1" - source-map "~0.5.3" + source-list-map "^2.0.0" + source-map "~0.6.1" webpack-target-electron-renderer@^0.4.0: version "0.4.0" @@ -6071,31 +6134,32 @@ webpack@^1.12.0: watchpack "^0.2.1" webpack-core "~0.6.9" -webpack@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.6.1.tgz#2e0457f0abb1ac5df3ab106c69c672f236785f07" +webpack@^3.0.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.8.1.tgz#b16968a81100abe61608b0153c9159ef8bb2bd83" dependencies: acorn "^5.0.0" acorn-dynamic-import "^2.0.0" - ajv "^4.7.0" - ajv-keywords "^1.1.1" + ajv "^5.1.5" + ajv-keywords "^2.0.0" async "^2.1.2" - enhanced-resolve "^3.0.0" + 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 "^0.2.16" + 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 "^3.1.0" - tapable "~0.2.5" - uglify-js "^2.8.27" - watchpack "^1.3.1" - webpack-sources "^0.2.3" - yargs "^6.0.0" + 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.6.5" @@ -6123,6 +6187,10 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + which@1, which@^1.0.5, which@^1.2.10, which@^1.2.9: version "1.2.14" resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" @@ -6196,6 +6264,12 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + yargs@^6.0.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" @@ -6232,6 +6306,24 @@ yargs@^7.0.0, yargs@^7.0.2: y18n "^3.2.1" yargs-parser "^5.0.0" +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" diff --git a/yarn.lock b/yarn.lock index 40bbafce5..3119be846 100644 --- a/yarn.lock +++ b/yarn.lock @@ -311,13 +311,13 @@ debug@2.2.0: dependencies: ms "0.7.1" -debug@2.6.0, debug@^2.3.2, debug@^2.6.0: +debug@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" dependencies: ms "0.7.2" -debug@^2.1.3, debug@^2.2.0, debug@^2.6.8: +debug@^2.1.3, debug@^2.2.0, debug@^2.3.2, debug@^2.6.0, debug@^2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: