diff --git a/package.json b/package.json index e8cb435d..7cb9be07 100644 --- a/package.json +++ b/package.json @@ -63,8 +63,9 @@ "node-emoji": "^1.8.1", "node-fetch": "^2.0.0", "open-in-editor": "^2.2.0", - "opn": "^4.0.2", + "opn": "^5.3.0", "ora": "^1.2.0", + "platform-select": "^1.1.0", "react": "^16.2.0", "react-deep-force-update": "^2.0.1", "react-hot-loader": "3.0.0-beta.7", diff --git a/src/server/middleware/devToolsMiddleware.js b/src/server/middleware/devToolsMiddleware.js index 01f7902a..c4b70192 100644 --- a/src/server/middleware/devToolsMiddleware.js +++ b/src/server/middleware/devToolsMiddleware.js @@ -5,27 +5,41 @@ const fs = require('fs'); const path = require('path'); const opn = require('opn'); +const select = require('platform-select'); +const logger = require('../../logger'); /** - * Returns name of Chrome app to launch based on the platform + * Launches given `url` in browser based on platform */ -const getChromeAppName = () => { - switch (process.platform) { - case 'darwin': - return 'google chrome'; - case 'win32': - return 'chrome'; - default: - return 'google-chrome'; - } -}; +const launchBrowser = url => { + const open = app => () => opn(url, { app }); -/** - * Launches given `url` in Chrome - */ -const launchChrome = url => { - opn(url, { app: getChromeAppName() }, err => { - console.error('Google Chrome exited with error', err); + /** + * Run Chrome (Chrome Canary) or supported platform. + * In case of macOS, we can eventually fallback to Safari. + * + * select(attemp1, attemp2, attemp3,...) // attempt to run is from left to right + */ + select( + { + // try to find & run Google Chrome + darwin: open('google chrome'), + win32: open('chrome'), + _: open('google-chrome'), + }, + { + // On macOS let's try to find & run Canary + darwin: open('google chrome canary'), + }, + { + // No Canary / Chrome, let's run Safari + darwin: open('safari'), + } + ).catch(e => { + console.log(e); // print error to artifacts + logger.warn( + `Cannot start browser for debugging. Navigate manually to "${url}"` + ); }); }; @@ -64,7 +78,7 @@ function devToolsMiddleware(debuggerProxy) { */ case '/launch-js-devtools': { if (!debuggerProxy.isDebuggerConnected()) { - launchChrome(`http://localhost:${req.socket.localPort}/debugger-ui`); + launchBrowser(`http://localhost:${req.socket.localPort}/debugger-ui`); } res.end('OK'); break; diff --git a/yarn.lock b/yarn.lock index a625e41c..60c031b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3889,6 +3889,10 @@ is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -5344,12 +5348,11 @@ opn@^3.0.2: dependencies: object-assign "^4.0.1" -opn@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" +opn@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" + is-wsl "^1.1.0" optimist@^0.6.1: version "0.6.1" @@ -5606,6 +5609,10 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" +platform-select@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/platform-select/-/platform-select-1.1.0.tgz#0226792a63903386bd37d49e40bfc22d06654670" + plist@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/plist/-/plist-2.0.1.tgz#0a32ca9481b1c364e92e18dc55c876de9d01da8b"