From 61ab5ac9e0f5a7de2333e2d445cc30651f0d0a75 Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Tue, 25 Sep 2018 13:09:16 -0400 Subject: [PATCH] perf(app): Upgrade Electron to v3 and remove Node in renderer --- __mocks__/setup-mock-globals.js | 13 ++ app-shell/build/release-notes.md | 75 ++--------- app-shell/electron-builder.json | 2 +- app-shell/package.json | 6 +- app-shell/src/preload.js | 13 ++ app-shell/src/ui.js | 9 +- app/package.json | 2 +- app/src/logger.js | 2 +- app/src/shell/__tests__/api-update.test.js | 6 +- app/src/shell/__tests__/shell.test.js | 11 +- app/src/shell/api-update.js | 6 +- app/src/shell/index.js | 10 +- app/webpack.config.js | 15 +-- jest.config.js | 35 ++++++ package.json | 38 +----- yarn.lock | 140 ++++++++++----------- 16 files changed, 170 insertions(+), 213 deletions(-) create mode 100644 __mocks__/setup-mock-globals.js create mode 100644 app-shell/src/preload.js create mode 100644 jest.config.js diff --git a/__mocks__/setup-mock-globals.js b/__mocks__/setup-mock-globals.js new file mode 100644 index 00000000000..38d1a1e7ebe --- /dev/null +++ b/__mocks__/setup-mock-globals.js @@ -0,0 +1,13 @@ +// sets up a mock global available to all tests +'use strict' + +const mockElectron = require('./electron') + +global.APP_SHELL = { + __mockElectron: mockElectron, + ipcRenderer: mockElectron.ipcRenderer, + apiUpdate: mockElectron.remote.require('./api-update'), + config: mockElectron.remote.require('./config'), + discovery: mockElectron.remote.require('./discovery'), + update: mockElectron.remote.require('./update'), +} diff --git a/app-shell/build/release-notes.md b/app-shell/build/release-notes.md index 72954fb7abc..aaf4222effd 100644 --- a/app-shell/build/release-notes.md +++ b/app-shell/build/release-notes.md @@ -1,4 +1,4 @@ -# Changes since 3.3.0 +# Changes since 3.4.0 For more details, please see the full [technical change log][changelog] @@ -7,91 +7,32 @@ For more details, please see the full [technical change log][changelog] ## Opentrons App -We've updated the app to give you information about your protocols _before_ you start calibrating and running your robot. On top of that, our **Linux build of the app is now able to self-update!** - ### Known issues +- Downgrading back to `3.4.0` from later releases _may_ cause the app to crash unless you delete the configuration folder (which will reset your app's configuration): + - macOS: `~/Library/Application Support/Opentrons` + - Linux: `~/.config/Opentrons` + - Windows: `%APPDATA%\Opentrons` - The app's run log is still having problems displaying the current run step, especially if pauses and resumes are involved ([#2047][2047]) -### Bug fixes - -- Cleaned up some scrolling and modal coverage issues -- Ensured that external links actually get opened in your browser -- Fixed a bug where the arrow keys could change the jog step size (thanks to [Philipp Jaeger][2300] for reporting this issue!) -- Fixed support chat so required configuration information is properly sent - [2047]: https://github.com/Opentrons/opentrons/issues/2047 -[2300]: https://github.com/Opentrons/opentrons/issues/2300 -### New features +### Bug fixes -- When updating your app, you're going to see these release notes to see what's changed since the last version -- Linux builds are now packaged as [AppImages][appimage], which means: - - The Linux version of the app now supports auto-update - - While we only officially support Ubuntu, the app _should_ now also be able to run on Fedora 21 or later -- We've got a shiny new protocol summary page to give you more information about your protocol at a glance after you upload it -- The app now automatically provides pipette configuration to support chat so our wonderful staff can better help you +### New features -[appimage]: https://appimage.org/ ## OT2 and Protocol API -This update is all about improving the reliability of your robot and getting you new and updated labware definitions! Remember to update your robot after you update your app to get these changes onto your OT2. - ### Known issues -- This update includes updates to several labware definitions. Please note **these will not overwrite your current labware definitions**, unless you reset your robot's labware definitions. If you would like to get the updates: - - In the app, go to "Robots" > your robot > "Advanced Settings" > "Factory Reset" - - Unfortunately **this will clear out all your previous labware calibrations** - - You will, however, get various fixes to the base definitions that will reduce the amount of calibration you need to do in the future -- While the underlying definition is now correct, there is a known API bug that is causing the robot to think a `50ml` tube in a `15/50ml` tuberack is the same height as the `15ml` tube +- While the underlying definition is correct, there is a known API bug that is causing the robot to think a `50ml` tube in a `15/50ml` tuberack is the same height as the `15ml` tube ### Bug fixes -- Fixed some problems with the Bio-Rad PCR and 10µL tiprack definitions -- Fixed a variety of problems with how the robot boots that could result in an unresponsive robot -- Ensured that factory reset really does clear the labware database every time -- Fixed a problem with state from protocol simulation hanging around for the actual run (which could confuse the robot into thinking it had a tip on when it did not) -- Removed deck calibration from the factory reset options, because the proper way to reset your deck calibration is to go through the full deck calibration process - ### New features -- Added a bunch of new labware definitions! - - [Opentrons modular tuberack set][tuberacks] - - `opentrons-tuberack-15ml` - - `opentrons-tuberack-50ml` - - `opentrons-tuberack-15_50ml` - - `opentrons-tuberack-2ml-eppendorf` - - `opentrons-tuberack-2ml-screwcap` - - [Opentrons aluminum block set][blocks] - - `opentrons-aluminum-block-2ml-eppendorf` - - `opentrons-aluminum-block-2ml-screwcap` - - `opentrons-aluminum-block-96-PCR-plate` - - `opentrons-aluminum-block-PCR-strips-200ul` - - Enjoy using your shiny new tube rack sets and [Temperature Module][tempdeck]! -- Did a lot of plumbing work for upcoming WiFi improvements. (Enterprise networks! Hidden SSIDs!) Keep an eye out for these changes to be finished in an upcoming release -- The API will now automatically keep the firmware of its Smoothie motor controller board up-to-date -- `robot.pause` now supports an optional message to display in the app's run log - - ``` - robot.pause(msg='Waiting for you to click "Resume"') - ``` - -- The min. and max. volumes of the default pipette constructors in the protocol API can now be optionally overridden (thanks [@rvinzent][rvinzent]!) - - ``` - p300 = instruments.P300_Single( - mount='right', - min_volume=42, - max_volume=240, - ) - ``` - -[tuberacks]: https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1 -[blocks]: https://shop.opentrons.com/products/aluminum-block-set -[tempdeck]: https://shop.opentrons.com/products/tempdeck -[rvinzent]: https://github.com/Opentrons/opentrons/pull/2084 diff --git a/app-shell/electron-builder.json b/app-shell/electron-builder.json index fed6f47dd20..6d1794984e6 100644 --- a/app-shell/electron-builder.json +++ b/app-shell/electron-builder.json @@ -1,6 +1,6 @@ { "appId": "com.opentrons.app", - "electronVersion": "1.8.3", + "electronVersion": "3.0.2", "files": [ "**/*", { diff --git a/app-shell/package.json b/app-shell/package.json index 556246ab67e..39265be3e87 100644 --- a/app-shell/package.json +++ b/app-shell/package.json @@ -27,9 +27,9 @@ "@opentrons/discovery-client": "3.4.0", "@thi.ng/paths": "^1.3.8", "dateformat": "^3.0.3", - "electron-debug": "^1.1.0", - "electron-devtools-installer": "^2.2.0", - "electron-store": "^1.3.0", + "electron-debug": "^2.0.0", + "electron-devtools-installer": "^2.2.4", + "electron-store": "^2.0.0", "electron-updater": "^3.1.2", "fs-extra": "^6.0.1", "merge-options": "^1.0.1", diff --git a/app-shell/src/preload.js b/app-shell/src/preload.js new file mode 100644 index 00000000000..c1507b393a6 --- /dev/null +++ b/app-shell/src/preload.js @@ -0,0 +1,13 @@ +// @flow +// preload script for renderer process +// defines subset of Electron API that renderer process is allowed to access +// for security reasons +import {ipcRenderer, remote} from 'electron' + +global.APP_SHELL = { + ipcRenderer, + apiUpdate: remote.require('./api-update'), + config: remote.require('./config'), + discovery: remote.require('./discovery'), + update: remote.require('./update'), +} diff --git a/app-shell/src/ui.js b/app-shell/src/ui.js index a7479b30f45..03457073efe 100644 --- a/app-shell/src/ui.js +++ b/app-shell/src/ui.js @@ -20,13 +20,8 @@ const WINDOW_OPTS = { height: config.height, // allow webPreferences to be set at launchtime from config webPreferences: Object.assign({ - // TODO(mc, 2018-05-15): turn off experimentalFeatures? - experimentalFeatures: true, - - // TODO(mc, 2018-05-15): disable nodeIntegration in renderer thread - nodeIntegration: true, - // node integration needed for mdns robot discovery in webworker - nodeIntegrationInWorker: true, + preload: path.join(__dirname, './preload.js'), + nodeIntegration: false, }, config.webPreferences), } diff --git a/app/package.json b/app/package.json index b834be74ce0..78fe66b962f 100644 --- a/app/package.json +++ b/app/package.json @@ -25,7 +25,7 @@ "@opentrons/shared-data": "3.4.0", "@thi.ng/paths": "^1.3.8", "classnames": "^2.2.5", - "electron": "1.8.3", + "events": "^3.0.0", "history": "^4.7.2", "lodash": "^4.17.4", "mixpanel-browser": "^2.22.1", diff --git a/app/src/logger.js b/app/src/logger.js index 38d1810cc92..1cf62630080 100644 --- a/app/src/logger.js +++ b/app/src/logger.js @@ -1,6 +1,6 @@ // @flow // logger -import {ipcRenderer} from 'electron' +const {ipcRenderer} = global.APP_SHELL // TODO(mc, 2018-05-17): put this type somewhere common to app and app-shell export type LogLevel = diff --git a/app/src/shell/__tests__/api-update.test.js b/app/src/shell/__tests__/api-update.test.js index e320df054bf..df149a723a5 100644 --- a/app/src/shell/__tests__/api-update.test.js +++ b/app/src/shell/__tests__/api-update.test.js @@ -1,10 +1,7 @@ -import electron from 'electron' import {mockResolvedValue} from '../../../__util__/mock-promise' import * as apiUpdate from '../api-update' -jest.mock('electron') - -const {'./api-update': mockApiUpdate} = electron.__mockRemotes +const {apiUpdate: mockApiUpdate} = global.APP_SHELL describe('shell/api-update', () => { let _Blob @@ -16,6 +13,7 @@ describe('shell/api-update', () => { afterEach(() => { global.Blob = _Blob + jest.clearAllMocks() }) test('reducer puts update info in state', () => { diff --git a/app/src/shell/__tests__/shell.test.js b/app/src/shell/__tests__/shell.test.js index 78b849f2bc5..94894bfb7e9 100644 --- a/app/src/shell/__tests__/shell.test.js +++ b/app/src/shell/__tests__/shell.test.js @@ -1,16 +1,14 @@ // tests for the shell module import configureMockStore from 'redux-mock-store' import thunk from 'redux-thunk' -import electron from 'electron' import {shellMiddleware, getShellConfig} from '..' jest.mock('../../logger') -jest.mock('electron') const middlewares = [thunk, shellMiddleware] const mockStore = configureMockStore(middlewares) -const {'./config': mockConfig} = electron.__mockRemotes +const {ipcRenderer: mockIpc, config: mockConfig} = global.APP_SHELL describe('app shell module', () => { afterEach(() => { @@ -23,17 +21,16 @@ describe('app shell module', () => { const action = {type: 'foo', meta: {shell: true}} store.dispatch(action) - expect(electron.ipcRenderer.send).toHaveBeenCalledWith('dispatch', action) + expect(mockIpc.send).toHaveBeenCalledWith('dispatch', action) }) test('catches actions from main and dispatches them to redux', () => { const store = mockStore({}) const action = {type: 'foo'} - expect(electron.ipcRenderer.on) - .toHaveBeenCalledWith('dispatch', expect.any(Function)) + expect(mockIpc.on).toHaveBeenCalledWith('dispatch', expect.any(Function)) - const dispatchHandler = electron.ipcRenderer.on.mock.calls.find(call => { + const dispatchHandler = mockIpc.on.mock.calls.find(call => { return call[0] === 'dispatch' && typeof call[1] === 'function' })[1] diff --git a/app/src/shell/api-update.js b/app/src/shell/api-update.js index 01bf60db4a8..2ac0367aef1 100644 --- a/app/src/shell/api-update.js +++ b/app/src/shell/api-update.js @@ -1,6 +1,4 @@ // @flow -import {remote} from 'electron' - import type {State} from '../types' export type ApiUpdateInfo = { @@ -8,7 +6,9 @@ export type ApiUpdateInfo = { version: string, } -const {getUpdateInfo, getUpdateFileContents} = remote.require('./api-update') +const { + apiUpdate: {getUpdateInfo, getUpdateFileContents}, +} = global.APP_SHELL export function apiUpdateReducer (state: ?ApiUpdateInfo) { if (!state) return getUpdateInfo() diff --git a/app/src/shell/index.js b/app/src/shell/index.js index 851549f9bd7..4b4eb045e4b 100644 --- a/app/src/shell/index.js +++ b/app/src/shell/index.js @@ -1,6 +1,5 @@ // @flow // desktop shell module -import {remote, ipcRenderer} from 'electron' import {combineReducers} from 'redux' import createLogger from '../logger' @@ -16,9 +15,12 @@ import type {ShellUpdateAction} from './update' export type ShellAction = ShellUpdateAction -const {CURRENT_VERSION, CURRENT_RELEASE_NOTES} = remote.require('./update') -const {getConfig} = remote.require('./config') -const {getRobots} = remote.require('./discovery') +const { + ipcRenderer, + update: {CURRENT_VERSION, CURRENT_RELEASE_NOTES}, + config: {getConfig}, + discovery: {getRobots}, +} = global.APP_SHELL const log = createLogger(__filename) diff --git a/app/webpack.config.js b/app/webpack.config.js index af1e530f21c..44cb350f8c9 100644 --- a/app/webpack.config.js +++ b/app/webpack.config.js @@ -23,9 +23,7 @@ const OUTPUT_PATH = path.join(__dirname, 'dist') const JS_OUTPUT_NAME = 'bundle.js' const CSS_OUTPUT_NAME = 'style.css' -const entry = [ - JS_BUNDLE_ENTRY, -] +const entry = [JS_BUNDLE_ENTRY] const output = { path: OUTPUT_PATH, @@ -42,13 +40,13 @@ const rules = [ namedRules.images, ] -const target = 'electron-renderer' +const target = 'web' const plugins = [ new webpack.EnvironmentPlugin( - Object.keys(process.env).filter(v => v.startsWith('OT_APP')).concat([ - 'NODE_ENV', - ]) + Object.keys(process.env) + .filter(v => v.startsWith('OT_APP')) + .concat(['NODE_ENV']) ), new ExtractTextPlugin({ @@ -108,5 +106,8 @@ module.exports = { devServer, node: { __filename: true, + // use userland events because webpack's is out of date + // https://github.com/webpack/node-libs-browser/issues/78 + events: false, }, } diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000000..e0a216812ec --- /dev/null +++ b/jest.config.js @@ -0,0 +1,35 @@ +'use strict' + +module.exports = { + setupFiles: ['/__mocks__/setup-mock-globals.js'], + moduleNameMapper: { + '\\.(css)$': 'identity-obj-proxy', + }, + transform: { + '^.+\\.js$': 'babel-jest', + '\\.(jpg|png|gif|svg|woff|woff2)$': + '@opentrons/components/src/__mocks__/file.js', + }, + transformIgnorePatterns: ['/node_modules/(?!@opentrons/)'], + collectCoverageFrom: [ + '**/*.js', + '!.eslintrc.js', + '!.stylelintrc.js', + '!api/**', + '!webpack-config/**', + '!**/scripts/**', + '!components/interfaces/**', + '!components/styleguide.config.js', + '!**/node_modules/**', + '!**/__mocks__/**', + '!**/dist/**', + '!**/build/**', + '!**/webpack*', + '!**/webpack/**', + '!**/coverage/**', + '!**/test/**', + '!**/test-with-flow/**', + '!**/flow-typed/**', + ], + coverageReporters: ['lcov', 'text'], +} diff --git a/package.json b/package.json index 5cee8634dbb..31126a5a4d5 100755 --- a/package.json +++ b/package.json @@ -19,42 +19,6 @@ "path": "cz-conventional-changelog" } }, - "jest": { - "moduleNameMapper": { - "\\.(css)$": "identity-obj-proxy" - }, - "transform": { - "^.+\\.js$": "babel-jest", - "\\.(jpg|png|gif|svg|woff|woff2)$": "@opentrons/components/src/__mocks__/file.js" - }, - "transformIgnorePatterns": [ - "/node_modules/(?!@opentrons/)" - ], - "collectCoverageFrom": [ - "**/*.js", - "!.eslintrc.js", - "!.stylelintrc.js", - "!api/**", - "!webpack-config/**", - "!**/scripts/**", - "!components/interfaces/**", - "!components/styleguide.config.js", - "!**/node_modules/**", - "!**/__mocks__/**", - "!**/dist/**", - "!**/build/**", - "!**/webpack*", - "!**/webpack/**", - "!**/coverage/**", - "!**/test/**", - "!**/test-with-flow/**", - "!**/flow-typed/**" - ], - "coverageReporters": [ - "lcov", - "text" - ] - }, "devDependencies": { "ajv": "^6.2.1", "babel-cli": "^6.26.0", @@ -73,7 +37,7 @@ "cross-env": "^5.0.1", "css-loader": "^0.28.4", "cz-conventional-changelog": "2.1.0", - "electron": "1.8.3", + "electron": "3.0.2", "electron-builder": "^20.28.4", "electron-publisher-s3": "^20.17.2", "eslint": "3.19.0", diff --git a/yarn.lock b/yarn.lock index 7c27c7c9db7..0570f5ca62d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3091,10 +3091,10 @@ concurrently@^3.5.0: supports-color "^3.2.3" tree-kill "^1.1.0" -conf@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/conf/-/conf-1.4.0.tgz#1ea66c9d7a9b601674a5bb9d2b8dc3c726625e67" - integrity sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg== +conf@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/conf/-/conf-2.0.0.tgz#43f7e282b32faca31f4d18bf279d6841ad657d5a" + integrity sha512-iCLzBsGFi8S73EANsEJZz0JnJ/e5VZef/kSaxydYZLAvw0rFNAUx5R7K5leC/CXXR2mZfXWhUvcZOO/dM2D5xg== dependencies: dot-prop "^4.1.0" env-paths "^1.0.0" @@ -3723,6 +3723,11 @@ deep-equal@^1.0.1: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" @@ -4149,38 +4154,38 @@ electron-builder@^20.28.4: update-notifier "^2.5.0" yargs "^12.0.1" -electron-debug@^1.1.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/electron-debug/-/electron-debug-1.5.0.tgz#d88c02146efb7fc5ae1b21eac56fbe4987eae50c" - integrity sha512-23CLHQXW+gMgdlJbeW1EinPX7DpwuLtfdzSuFL0OnsqEhKGJVJufAZTyq2hc3sr+R53rr3P+mJiYoR5VzAHKJQ== +electron-debug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/electron-debug/-/electron-debug-2.0.0.tgz#3059a6557acbfb091f138d83875f57bac80cea6d" + integrity sha512-orGlw9uErUztdD7cgdKz78txq3czpOnKG/zvvsINkUsugqL+dn77UFrbwRGVgPwuLJ7Ejbjjk9EcxIcgTivMbA== dependencies: electron-is-dev "^0.3.0" electron-localshortcut "^3.0.0" -electron-devtools-installer@^2.2.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-2.2.3.tgz#58b9a4ec507377bc46e091cd43714188e0c369be" - integrity sha512-KFVP2lt3guvhXsUKE3YxbddMOJtpdvTsWfloV/8395Df5Td9Z+YvNl8LFW864mVqdDJsiy2qQ8y95NT5C+avSA== +electron-devtools-installer@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-2.2.4.tgz#261a50337e37121d338b966f07922eb4939a8763" + integrity sha512-b5kcM3hmUqn64+RUcHjjr8ZMpHS2WJ5YO0pnG9+P/RTdx46of/JrEjuciHWux6pE+On6ynWhHJF53j/EDJN0PA== dependencies: "7zip" "0.0.6" cross-unzip "0.0.2" rimraf "^2.5.2" semver "^5.3.0" -electron-download@^3.0.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8" - integrity sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg= +electron-download@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-4.1.1.tgz#02e69556705cc456e520f9e035556ed5a015ebe8" + integrity sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg== dependencies: - debug "^2.2.0" - fs-extra "^0.30.0" - home-path "^1.0.1" + debug "^3.0.0" + env-paths "^1.0.0" + fs-extra "^4.0.1" minimist "^1.2.0" - nugget "^2.0.0" - path-exists "^2.1.0" - rc "^1.1.2" - semver "^5.3.0" - sumchecker "^1.2.0" + nugget "^2.0.1" + path-exists "^3.0.0" + rc "^1.2.1" + semver "^5.4.1" + sumchecker "^2.0.2" electron-is-accelerator@^0.1.0: version "0.1.2" @@ -4257,12 +4262,12 @@ electron-releases@^2.1.0: resolved "https://registry.yarnpkg.com/electron-releases/-/electron-releases-2.1.0.tgz#c5614bf811f176ce3c836e368a0625782341fd4e" integrity sha512-cyKFD1bTE/UgULXfaueIN1k5EPFzs+FRc/rvCY5tIynefAPqopQEgjr0EzY+U3Dqrk/G4m9tXSPuZ77v6dL/Rw== -electron-store@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/electron-store/-/electron-store-1.3.0.tgz#ee488a28a61fb982fd35b658fb9cb6331eb201f8" - integrity sha512-r1Pdl5MwpiCxgbsl0qnwv/GABO5+J/JTO16+KyqL+bOITIk9o3cq3Sw69uO9NgPkpfcKeEwxtJFbtbiBlGTiDA== +electron-store@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-2.0.0.tgz#1035cca2a95409d1f54c7466606345852450d64a" + integrity sha512-1WCFYHsYvZBqDsoaS0Relnz0rd81ZkBAI0Fgx7Nq2UWU77rSNs1qxm4S6uH7TCZ0bV3LQpJFk7id/is/ZgoOPA== dependencies: - conf "^1.3.0" + conf "^2.0.0" electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30: version "1.3.30" @@ -4286,13 +4291,13 @@ electron-updater@^3.1.2: semver "^5.5.1" source-map-support "^0.5.9" -electron@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.3.tgz#001416ea3a25ce594e317cb5531bc41eadd22f7f" - integrity sha512-ZZYSPB9tLh0m4uZOTcQllv/U8ts3GaMyEkBTooBr5rO+xl0WfQlecUcPuyw6aqtrZfNKsqLprorXKgsFmwcI5w== +electron@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/electron/-/electron-3.0.2.tgz#0aed43a331b43dfe671ddb54d75fc4102d362959" + integrity sha512-BsU/KJRPODlEoaOZhsmFTIaG2h1Y28JCrqeTGVqGL+fef/7xQZdHx5ZCStUDXXUSTcoqiHlc5QvLH4PfZFbOmg== dependencies: "@types/node" "^8.0.24" - electron-download "^3.0.1" + electron-download "^4.1.0" extract-zip "^1.0.3" elliptic@^6.0.0: @@ -4444,7 +4449,7 @@ es6-object-assign@^1.0.3, es6-object-assign@~1.1.0: resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= -es6-promise@^4.0.3, es6-promise@^4.0.5: +es6-promise@^4.0.3: version "4.2.4" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" integrity sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ== @@ -4709,6 +4714,11 @@ events@1.1.1, events@^1.0.0: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + eventsource@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" @@ -5340,16 +5350,14 @@ fs-extra-p@^4.6.1: bluebird-lst "^1.0.5" fs-extra "^6.0.1" -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= +fs-extra@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" + jsonfile "^4.0.0" + universalify "^0.1.0" fs-extra@^5.0.0: version "5.0.0" @@ -5748,7 +5756,7 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= @@ -6042,11 +6050,6 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -home-path@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.5.tgz#788b29815b12d53bacf575648476e6f9041d133f" - integrity sha1-eIspgVsS1Tus9XVkhHbm+QQdEz8= - homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" @@ -7420,13 +7423,6 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -7562,13 +7558,6 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" - known-css-properties@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.5.0.tgz#6ff66943ed4a5b55657ee095779a91f4536f8084" @@ -8682,7 +8671,7 @@ nth-check@~1.0.1: dependencies: boolbase "~1.0.0" -nugget@^2.0.0: +nugget@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" integrity sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA= @@ -9141,7 +9130,7 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= -path-exists@^2.0.0, path-exists@^2.1.0: +path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= @@ -10276,7 +10265,7 @@ raw-body@2.3.2: iconv-lite "0.4.19" unpipe "1.0.0" -rc@^1.0.1, rc@^1.1.2, rc@^1.1.6: +rc@^1.0.1, rc@^1.1.6: version "1.2.6" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" integrity sha1-6xiYnG1PTxYsOZ953dKfODVWgJI= @@ -10296,6 +10285,16 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +rc@^1.2.1: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-codemirror2@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/react-codemirror2/-/react-codemirror2-3.0.7.tgz#d5d9888158263ae56da766539d7803486566ab9f" @@ -12332,13 +12331,12 @@ sugarss@^1.0.0: dependencies: postcss "^6.0.14" -sumchecker@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d" - integrity sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0= +sumchecker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e" + integrity sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4= dependencies: debug "^2.2.0" - es6-promise "^4.0.5" supports-color@^0.2.0: version "0.2.0"