From 6485324677c1da87e613831252daedea03f655c4 Mon Sep 17 00:00:00 2001 From: Kiran Niranjan Date: Tue, 25 Jul 2017 14:27:57 +0530 Subject: [PATCH 1/8] Implemented Spell checker --- demo/win.html | 4 ++++ js/preload/preloadMain.js | 5 +++++ js/spellChecker/spellChecker.js | 25 +++++++++++++++++++++++++ js/windowMgr.js | 5 +++-- package.json | 11 ++++++----- 5 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 js/spellChecker/spellChecker.js diff --git a/demo/win.html b/demo/win.html index e0a336ac..c4bece32 100644 --- a/demo/win.html +++ b/demo/win.html @@ -2,4 +2,8 @@ Test Window has been opened +

+ + +

diff --git a/js/preload/preloadMain.js b/js/preload/preloadMain.js index 96cdef62..6ff38854 100644 --- a/js/preload/preloadMain.js +++ b/js/preload/preloadMain.js @@ -18,6 +18,7 @@ const apiEnums = require('../enums/api.js'); const apiCmds = apiEnums.cmds; const apiName = apiEnums.apiName; const getMediaSources = require('../desktopCapturer/getSources'); +const SpellCheckerHelper = require('../spellChecker/spellChecker').SpellCheckHelper; require('../downloadManager/downloadManager'); @@ -328,4 +329,8 @@ function createAPI() { window.addEventListener('online', updateOnlineStatus, false); updateOnlineStatus(); + + // Method to initialize spell checker + const spellChecker = new SpellCheckerHelper(); + spellChecker.initializeSpellChecker(); } diff --git a/js/spellChecker/spellChecker.js b/js/spellChecker/spellChecker.js new file mode 100644 index 00000000..56d91fdd --- /dev/null +++ b/js/spellChecker/spellChecker.js @@ -0,0 +1,25 @@ +const { SpellCheckHandler, ContextMenuListener, ContextMenuBuilder } = require('electron-spellchecker'); + +class SpellCheckHelper { + + constructor() { + this.spellCheckHandler = new SpellCheckHandler(); + } + + /** + * To initialize for a specific window + */ + initializeSpellChecker() { + this.spellCheckHandler.attachToInput(); + + const contextMenuBuilder = new ContextMenuBuilder(this.spellCheckHandler); + this.contextMenuListener = new ContextMenuListener((info) => { + contextMenuBuilder.showPopupMenu(info); + }, null, null); + } + +} + +module.exports = { + SpellCheckHelper: SpellCheckHelper +}; \ No newline at end of file diff --git a/js/windowMgr.js b/js/windowMgr.js index 056e3e92..0bdec07d 100644 --- a/js/windowMgr.js +++ b/js/windowMgr.js @@ -22,7 +22,8 @@ const { getConfigField, updateConfigField } = require('./config.js'); const { isNodeEnv } = require('./utils/misc'); //context menu -const contextMenu = require('./menus/contextMenu.js'); +// TODO: remove this once spell checker is ready +//const contextMenu = require('./menus/contextMenu.js'); // show dialog when certificate errors occur require('./dialogs/showCertError.js'); @@ -319,7 +320,7 @@ function doCreateMainWindow(initialUrl, initialBounds) { } }); - contextMenu(mainWindow); + //contextMenu(mainWindow); } app.on('before-quit', function () { diff --git a/package.json b/package.json index b298ffa1..c73f559c 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "unpacked-win": "npm run prebuild && npm run test && build --win --x64 --dir", "unpacked-win-x86": "npm run prebuild && npm run test && build --win --ia32", "prebuild": "npm run rebuild && npm run browserify-preload", - "browserify-preload": "browserify -o js/preload/_preloadMain.js -x electron --insert-global-vars=__filename,__dirname js/preload/preloadMain.js", + "browserify-preload": "browserify -o js/preload/_preloadMain.js -x electron --insert-global-vars=__filename,__dirname js/preload/preloadMain.js --external electron-spellchecker js/preload/preloadMain.js > js/preload/_preloadMain.js", "rebuild": "electron-rebuild -f", "test": "npm run lint && jest --verbose --testPathPattern test && npm run rebuild && npm run spectron-test", "spectron-test": "jest --config tests/spectron/jest_spectron.json --runInBand && npm run rebuild", @@ -87,15 +87,16 @@ }, "dependencies": { "@paulcbetts/system-idle-time": "^1.0.4", + "appdirectory": "^0.1.0", "async": "^2.1.5", "auto-launch": "^5.0.1", "electron-context-menu": "^0.8.0", - "electron-squirrel-startup": "^1.0.0", - "keymirror": "0.1.1", - "winreg": "^1.2.3", "electron-dl": "^1.9.0", + "electron-spellchecker": "^1.2.0", + "electron-squirrel-startup": "^1.0.0", "filesize": "^3.5.10", - "appdirectory": "^0.1.0" + "keymirror": "0.1.1", + "winreg": "^1.2.3" }, "optionalDependencies": { "screen-snippet": "git+https://github.com/symphonyoss/ScreenSnippet.git#v1.0.1" From 1ef82d220402b656364de7f6d9e8e41c7329dde5 Mon Sep 17 00:00:00 2001 From: Kiran Niranjan Date: Wed, 26 Jul 2017 15:34:26 +0530 Subject: [PATCH 2/8] Electron-47 1. Handled spellchecker issue for pop outs 2. Wrote spectron test for spellchecker --- js/preload/preloadMain.js | 20 +++- js/spellChecker/spellChecker.js | 26 ++++- tests/spectron/spellChecker.spectron.js | 120 ++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 7 deletions(-) create mode 100644 tests/spectron/spellChecker.spectron.js diff --git a/js/preload/preloadMain.js b/js/preload/preloadMain.js index 6ff38854..ffc340ee 100644 --- a/js/preload/preloadMain.js +++ b/js/preload/preloadMain.js @@ -18,7 +18,21 @@ const apiEnums = require('../enums/api.js'); const apiCmds = apiEnums.cmds; const apiName = apiEnums.apiName; const getMediaSources = require('../desktopCapturer/getSources'); -const SpellCheckerHelper = require('../spellChecker/spellChecker').SpellCheckHelper; + +// bug in electron preventing us from using spellchecker in pop outs +// https://github.com/electron/electron/issues/4025 +// so loading the spellchecker in try catch so that we don't +// block other method from loading +try { + const SpellCheckerHelper = require('../spellChecker/spellChecker').SpellCheckHelper; + // Method to initialize spell checker + const spellChecker = new SpellCheckerHelper(); + spellChecker.initializeSpellChecker(); +} catch (err){ + /* eslint-disable no-console */ + console.error('requiring spellchecker module: ' + err); + /* eslint-enable no-console */ +} require('../downloadManager/downloadManager'); @@ -329,8 +343,4 @@ function createAPI() { window.addEventListener('online', updateOnlineStatus, false); updateOnlineStatus(); - - // Method to initialize spell checker - const spellChecker = new SpellCheckerHelper(); - spellChecker.initializeSpellChecker(); } diff --git a/js/spellChecker/spellChecker.js b/js/spellChecker/spellChecker.js index 56d91fdd..2a8a2092 100644 --- a/js/spellChecker/spellChecker.js +++ b/js/spellChecker/spellChecker.js @@ -1,3 +1,5 @@ +const { remote } = require('electron'); +const { MenuItem } = remote; const { SpellCheckHandler, ContextMenuListener, ContextMenuBuilder } = require('electron-spellchecker'); class SpellCheckHelper { @@ -7,17 +9,37 @@ class SpellCheckHelper { } /** - * To initialize for a specific window + * Method to initialize spell checker */ initializeSpellChecker() { this.spellCheckHandler.attachToInput(); - const contextMenuBuilder = new ContextMenuBuilder(this.spellCheckHandler); + const contextMenuBuilder = new ContextMenuBuilder(this.spellCheckHandler, null, false, SpellCheckHelper.processMenu); this.contextMenuListener = new ContextMenuListener((info) => { contextMenuBuilder.showPopupMenu(info); }, null, null); } + /** + * Method to add default menu items to the + * menu that was generated by ContextMenuBuilder + * + * This method will be invoked by electron-spellchecker + * before showing the context menu + * + * @param menu + * @returns menu + */ + static processMenu(menu) { + menu.append(new MenuItem({ type: 'separator' })); + menu.append(new MenuItem({ + role: 'reload', + accelerator: 'CmdOrCtrl+R', + label: 'Reload' + })); + return menu; + } + } module.exports = { diff --git a/tests/spectron/spellChecker.spectron.js b/tests/spectron/spellChecker.spectron.js new file mode 100644 index 00000000..204c8753 --- /dev/null +++ b/tests/spectron/spellChecker.spectron.js @@ -0,0 +1,120 @@ +const Application = require('./spectronSetup'); +const path = require('path'); +const {isMac} = require('../../js/utils/misc.js'); +const childProcess = require('child_process'); +let app = new Application({}); +let robot; + +describe('Tests for spellChecker', () => { + + let originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; + jasmine.DEFAULT_TIMEOUT_INTERVAL = Application.getTimeOut(); + + beforeAll((done) => { + childProcess.exec(`npm rebuild robotjs --target=${process.version} --build-from-source`, function () { + robot = require('robotjs'); + app.startApplication().then((startedApp) => { + app = startedApp; + done(); + }); + }); + }); + + afterAll((done) => { + if (app && app.isRunning()) { + jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; + app.stop().then(() => { + done(); + }).catch((err) => { + console.log(err); + done(); + }); + } + }); + + it('should launch the app', (done) => { + return app.client.waitUntilWindowLoaded().then(() => { + return app.client.getWindowCount().then((count) => { + expect(count === 1).toBeTruthy(); + done(); + }).catch((err) => { + expect(err).toBeFalsy(); + }); + }).catch((err) => { + expect(err).toBeFalsy(); + }); + }); + + it('should check window count', () => { + return app.client.url('file:///' + path.join(__dirname, '..', '..', 'demo/index.html')); + }); + + it('should set the misspelled word', () => { + return app.client + .windowByIndex(0) + .setValue('#tag', 'comming ') + .getValue('#tag').then((value) => { + expect(value === 'comming ').toBeTruthy(); + }); + }); + + it('should bring the app to front in windows', (done) => { + if (!isMac) { + app.browserWindow.focus(); + app.browserWindow.restore(); + app.browserWindow.getBounds().then((bounds) => { + robot.setMouseDelay(100); + let x = bounds.x + 200; + let y = bounds.y + 200; + robot.moveMouseSmooth(x, y); + robot.mouseClick(); + done(); + }); + } else { + done(); + } + }); + + it('should invoke context menu ', (done) => { + if (isMac) { + app.browserWindow.getBounds().then((bounds) => { + let x = bounds.x + 45; + let y = bounds.y + 398; + + robot.moveMouseSmooth(x, y); + robot.setMouseDelay(200); + robot.mouseClick('left', true); + robot.mouseClick('right'); + robot.setKeyboardDelay(500); + robot.keyTap('down'); + robot.keyTap('down'); + robot.keyTap('enter'); + done(); + }); + } else { + app.browserWindow.getBounds().then((bounds) => { + let x = bounds.x + 55; + let y = bounds.y + 430; + + robot.moveMouseSmooth(x, y); + robot.setMouseDelay(200); + robot.mouseClick('left', true); + robot.mouseClick('right'); + robot.setKeyboardDelay(500); + robot.keyTap('down'); + robot.keyTap('down'); + robot.keyTap('enter'); + done(); + }); + } + }); + + it('should verify the text field', () => { + return app.client + .windowByIndex(0) + .getValue('#tag').then((value) => { + expect(value).toBe('coming '); + }); + }); + +}); \ No newline at end of file From 95d3a4372659b1a665fe94f4bacd8479c381804e Mon Sep 17 00:00:00 2001 From: Kiran Niranjan Date: Wed, 26 Jul 2017 15:56:55 +0530 Subject: [PATCH 3/8] Electron-47 - Removed the old "electron-context-menu" that was being used --- js/windowMgr.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/js/windowMgr.js b/js/windowMgr.js index 0bdec07d..420ef61e 100644 --- a/js/windowMgr.js +++ b/js/windowMgr.js @@ -21,10 +21,6 @@ const throttle = require('./utils/throttle.js'); const { getConfigField, updateConfigField } = require('./config.js'); const { isNodeEnv } = require('./utils/misc'); -//context menu -// TODO: remove this once spell checker is ready -//const contextMenu = require('./menus/contextMenu.js'); - // show dialog when certificate errors occur require('./dialogs/showCertError.js'); @@ -320,7 +316,6 @@ function doCreateMainWindow(initialUrl, initialBounds) { } }); - //contextMenu(mainWindow); } app.on('before-quit', function () { From e21f7adfaa9b08babe431b65f63c58540cd57a6e Mon Sep 17 00:00:00 2001 From: Kiran Niranjan Date: Tue, 1 Aug 2017 12:19:59 +0530 Subject: [PATCH 4/8] Electron-47 1. Fixed some issues with windows 2. Changed the arg from external to exclude --- demo/win.html | 15 +++++++++++++++ js/preload/preloadMain.js | 28 ++++++++++++++++------------ js/spellChecker/spellChecker.js | 2 +- package.json | 2 +- 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/demo/win.html b/demo/win.html index c4bece32..fe18a2ae 100644 --- a/demo/win.html +++ b/demo/win.html @@ -6,4 +6,19 @@ Test Window has been opened

+ +
+

Badge Count:

+ +
+ + diff --git a/js/preload/preloadMain.js b/js/preload/preloadMain.js index ffc340ee..5be794c2 100644 --- a/js/preload/preloadMain.js +++ b/js/preload/preloadMain.js @@ -19,22 +19,26 @@ const apiCmds = apiEnums.cmds; const apiName = apiEnums.apiName; const getMediaSources = require('../desktopCapturer/getSources'); +require('../downloadManager/downloadManager'); + // bug in electron preventing us from using spellchecker in pop outs // https://github.com/electron/electron/issues/4025 // so loading the spellchecker in try catch so that we don't // block other method from loading -try { - const SpellCheckerHelper = require('../spellChecker/spellChecker').SpellCheckHelper; - // Method to initialize spell checker - const spellChecker = new SpellCheckerHelper(); - spellChecker.initializeSpellChecker(); -} catch (err){ - /* eslint-disable no-console */ - console.error('requiring spellchecker module: ' + err); - /* eslint-enable no-console */ -} - -require('../downloadManager/downloadManager'); +document.addEventListener('DOMContentLoaded', () => { + try { + /* eslint-disable global-require */ + const SpellCheckerHelper = require('../spellChecker/spellChecker').SpellCheckHelper; + /* eslint-enable global-require */ + // Method to initialize spell checker + const spellChecker = new SpellCheckerHelper(); + spellChecker.initializeSpellChecker(); + } catch (err) { + /* eslint-disable no-console */ + console.error('requiring spellchecker module: ' + err); + /* eslint-enable no-console */ + } +}); const nodeURL = require('url'); diff --git a/js/spellChecker/spellChecker.js b/js/spellChecker/spellChecker.js index 2a8a2092..257de828 100644 --- a/js/spellChecker/spellChecker.js +++ b/js/spellChecker/spellChecker.js @@ -17,7 +17,7 @@ class SpellCheckHelper { const contextMenuBuilder = new ContextMenuBuilder(this.spellCheckHandler, null, false, SpellCheckHelper.processMenu); this.contextMenuListener = new ContextMenuListener((info) => { contextMenuBuilder.showPopupMenu(info); - }, null, null); + }); } /** diff --git a/package.json b/package.json index 2f8ba87c..9ed9ad74 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "unpacked-win": "npm run prebuild && npm run test && build --win --x64 --dir", "unpacked-win-x86": "npm run prebuild && npm run test && build --win --ia32", "prebuild": "npm run rebuild && npm run browserify-preload", - "browserify-preload": "browserify -o js/preload/_preloadMain.js -x electron --insert-global-vars=__filename,__dirname js/preload/preloadMain.js --external electron-spellchecker js/preload/preloadMain.js > js/preload/_preloadMain.js", + "browserify-preload": "browserify -o js/preload/_preloadMain.js -x electron --insert-global-vars=__filename,__dirname js/preload/preloadMain.js --exclude electron-spellchecker", "rebuild": "electron-rebuild -f", "test": "npm run lint && jest --verbose --testPathPattern test && npm run rebuild", "spectron-test": "jest --config tests/spectron/jest_spectron.json --runInBand && npm run rebuild", From ae0398d8d072d22246cfc1ba04002b2d7504ae0c Mon Sep 17 00:00:00 2001 From: Kiran Niranjan Date: Tue, 1 Aug 2017 13:28:32 +0530 Subject: [PATCH 5/8] Electron-47 1. Added a default language ('en-US') for windows 2. Included app.asar.unpacked dir in the windows installer as `spawn-rx` module is required for spellchecker to work. --- installer/win/Symphony-x64.aip | 34 ++++++++++++++++++++++++++++++--- js/spellChecker/spellChecker.js | 10 ++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/installer/win/Symphony-x64.aip b/installer/win/Symphony-x64.aip index 49beae9a..9eb07fb5 100644 --- a/installer/win/Symphony-x64.aip +++ b/installer/win/Symphony-x64.aip @@ -45,12 +45,21 @@ + + + + + + + + + @@ -58,32 +67,41 @@ + + + - + + + + - + + + + @@ -97,6 +115,7 @@ + @@ -111,6 +130,10 @@ + + + + @@ -126,6 +149,8 @@ + + @@ -141,6 +166,8 @@ + + @@ -162,7 +189,7 @@ - + @@ -442,3 +469,4 @@ + diff --git a/js/spellChecker/spellChecker.js b/js/spellChecker/spellChecker.js index 257de828..7af964f9 100644 --- a/js/spellChecker/spellChecker.js +++ b/js/spellChecker/spellChecker.js @@ -1,5 +1,6 @@ const { remote } = require('electron'); const { MenuItem } = remote; +const { isMac } = require('./../utils/misc'); const { SpellCheckHandler, ContextMenuListener, ContextMenuBuilder } = require('electron-spellchecker'); class SpellCheckHelper { @@ -14,6 +15,15 @@ class SpellCheckHelper { initializeSpellChecker() { this.spellCheckHandler.attachToInput(); + // This is only for window as in mac the + // language is switched w.r.t to the current system language. + // + // In windows we need to implement RxJS observable + // in order to switch language dynamically + if (!isMac) { + this.spellCheckHandler.switchLanguage('en-US'); + } + const contextMenuBuilder = new ContextMenuBuilder(this.spellCheckHandler, null, false, SpellCheckHelper.processMenu); this.contextMenuListener = new ContextMenuListener((info) => { contextMenuBuilder.showPopupMenu(info); From c8ca074f92ddd02362bbdb2114bb3ca02d996a64 Mon Sep 17 00:00:00 2001 From: Kiran Niranjan Date: Wed, 2 Aug 2017 16:17:30 +0530 Subject: [PATCH 6/8] Electron-47 1. Removed `electron-context-menu` from dependency 2. Added cld.node in app.asar.unpacked dir 3. Resolved conflicts --- installer/win/Symphony-x64.aip | 109 ++++++++++++++++++++++++++++++--- js/menus/contextMenu.js | 51 --------------- package.json | 2 +- 3 files changed, 101 insertions(+), 61 deletions(-) delete mode 100644 js/menus/contextMenu.js diff --git a/installer/win/Symphony-x64.aip b/installer/win/Symphony-x64.aip index 9eb07fb5..cb16940e 100644 --- a/installer/win/Symphony-x64.aip +++ b/installer/win/Symphony-x64.aip @@ -43,14 +43,18 @@ + + + + @@ -59,7 +63,7 @@ - + @@ -67,20 +71,64 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + + - + @@ -89,11 +137,51 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -103,6 +191,7 @@ + @@ -145,6 +234,7 @@ + @@ -168,8 +258,10 @@ + + @@ -189,7 +281,7 @@ - + @@ -468,5 +560,4 @@ - - + \ No newline at end of file diff --git a/js/menus/contextMenu.js b/js/menus/contextMenu.js deleted file mode 100644 index efd89b8a..00000000 --- a/js/menus/contextMenu.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; -var cm = require('electron-context-menu'); - -/** - * Creates & applies Right Click Context Menu based on - * electron-context-menu library o all windows. - * Unless activated on edittable field, Reload option is shown. - * Enabled Cut/Copy/Paste/Delete/Select all on text. - * Enabled Save Image on images - * Enabled Copy Link on href Link - * Inspect Element is not enabled. - */ -function contextMenu(browserWindow){ - cm({ - browserWindow, - - prepend: (params) => [ - { - role: 'reload', - enabled: params.isEditable === false, - visible: params.isEditable === false - }, - { - role: 'undo', - enabled: params.isEditable && params.editFlags.canUndu, - visible: params.isEditable - }, - { - role: 'redo', - enabled: params.isEditable && params.editFlags.canRedo, - visible: params.isEditable - } - ], - append: (params) => [ - { - role: 'delete', - enabled: params.isEditable && params.editFlags.canDelete, - visible: params.isEditable - }, - { - role: 'selectall', - enabled: params.isEditable && params.editFlags.canSelectAll, - visible: params.isEditable - } - ], - - showInspectElement: false - }); -} - -module.exports = contextMenu; \ No newline at end of file diff --git a/package.json b/package.json index 9ed9ad74..9cc57af8 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "transformIgnorePatterns": [] }, "build": { + "asarUnpack": ["node_modules/@paulcbetts/cld/build/Release/cld.node"], "files": [ "!coverage/*", "!installer/*", @@ -90,7 +91,6 @@ "appdirectory": "^0.1.0", "async": "^2.1.5", "auto-launch": "^5.0.1", - "electron-context-menu": "^0.8.0", "electron-dl": "^1.9.0", "electron-spellchecker": "^1.2.0", "electron-squirrel-startup": "^1.0.0", From 173c2c692a7b41dbe6a5e0834de00995654dbe47 Mon Sep 17 00:00:00 2001 From: Kiran Niranjan Date: Wed, 2 Aug 2017 16:19:27 +0530 Subject: [PATCH 7/8] Electron-47 - Renamed error message and added some done() callback --- js/preload/preloadMain.js | 2 +- tests/spectron/spellChecker.spectron.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/js/preload/preloadMain.js b/js/preload/preloadMain.js index 5be794c2..02977158 100644 --- a/js/preload/preloadMain.js +++ b/js/preload/preloadMain.js @@ -35,7 +35,7 @@ document.addEventListener('DOMContentLoaded', () => { spellChecker.initializeSpellChecker(); } catch (err) { /* eslint-disable no-console */ - console.error('requiring spellchecker module: ' + err); + console.error('unable to load the spell checker module, hence, skipping the spell check feature ' + err); /* eslint-enable no-console */ } }); diff --git a/tests/spectron/spellChecker.spectron.js b/tests/spectron/spellChecker.spectron.js index 204c8753..9588eb35 100644 --- a/tests/spectron/spellChecker.spectron.js +++ b/tests/spectron/spellChecker.spectron.js @@ -39,9 +39,11 @@ describe('Tests for spellChecker', () => { done(); }).catch((err) => { expect(err).toBeFalsy(); + done(); }); }).catch((err) => { expect(err).toBeFalsy(); + done(); }); }); From 65cea1fb1f0e89f6e0e895c4de193bf8e16b8500 Mon Sep 17 00:00:00 2001 From: Kiran Niranjan Date: Wed, 9 Aug 2017 21:34:50 +0530 Subject: [PATCH 8/8] Electron-47 - Resolved merge conflicts --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 6eefcfe1..f0c30cd8 100644 --- a/package.json +++ b/package.json @@ -92,13 +92,12 @@ "async.map": "^0.5.2", "async.mapseries": "^0.5.2", "auto-launch": "^5.0.1", - "electron-context-menu": "^0.8.0", "electron-dl": "^1.9.0", + "electron-spellchecker": "^1.2.0", "electron-squirrel-startup": "^1.0.0", "filesize": "^3.5.10", "keymirror": "0.1.1", - "winreg": "^1.2.3", - "electron-spellchecker": "^1.2.0" + "winreg": "^1.2.3" }, "optionalDependencies": { "screen-snippet": "git+https://github.com/symphonyoss/ScreenSnippet.git#v1.0.1"