From ce21dc4d2c62a817a61c1722d7b0f9fea5b36d07 Mon Sep 17 00:00:00 2001 From: thecodrr Date: Sun, 4 Aug 2019 10:30:56 +0500 Subject: [PATCH 1/4] feat: fallback to default browser if chrome not found --- .../{launchChrome.js => launchDebugger.js} | 40 ++++++++++++++++++- .../server/middleware/MiddlewareManager.js | 4 +- .../middleware/getDevToolsMiddleware.js | 18 ++++----- .../cli/src/commands/server/webSocketProxy.js | 2 +- 4 files changed, 51 insertions(+), 13 deletions(-) rename packages/cli/src/commands/server/{launchChrome.js => launchDebugger.js} (56%) diff --git a/packages/cli/src/commands/server/launchChrome.js b/packages/cli/src/commands/server/launchDebugger.js similarity index 56% rename from packages/cli/src/commands/server/launchChrome.js rename to packages/cli/src/commands/server/launchDebugger.js index 87d880a93..d2d236449 100644 --- a/packages/cli/src/commands/server/launchChrome.js +++ b/packages/cli/src/commands/server/launchDebugger.js @@ -11,6 +11,8 @@ import open from 'open'; import {execSync} from 'child_process'; import {logger} from '@react-native-community/cli-tools'; +import launchBrowser from './launchBrowser'; +import chalk from 'chalk'; function commandExistsUnixSync(commandName) { try { @@ -24,6 +26,28 @@ function commandExistsUnixSync(commandName) { } } +function commandExistsWindowsSync(commandName) { + try { + var stdout = execSync('where ' + commandName, {stdio: []}); + return !!stdout; + } catch (error) { + return false; + } +} + +function commandExists(commandName) { + switch (process.platform) { + case 'win32': + return commandExistsWindowsSync(commandName); + case 'linux': + case 'darwin': + return commandExistsUnixSync(commandName); + default: + // assume it doesn't exist, just to be safe. + return false; + } +} + function getChromeAppName(): string { switch (process.platform) { case 'darwin': @@ -52,4 +76,18 @@ function launchChrome(url: string) { }); } -export default launchChrome; +function launchDebugger(url: string) { + if (!commandExists(getChromeAppName())) { + logger.info( + `For a better debugging experience please install Google Chrome from: ${chalk.underline.dim( + 'https://www.google.com/chrome/', + )}`, + ); + //fallback to default browser + launchBrowser(url); + return; + } + launchChrome(); +} + +export default launchDebugger; diff --git a/packages/cli/src/commands/server/middleware/MiddlewareManager.js b/packages/cli/src/commands/server/middleware/MiddlewareManager.js index d3c222a97..77c802600 100644 --- a/packages/cli/src/commands/server/middleware/MiddlewareManager.js +++ b/packages/cli/src/commands/server/middleware/MiddlewareManager.js @@ -33,7 +33,7 @@ type Options = { type WebSocketProxy = { server: WebSocketServer, - isChromeConnected: () => boolean, + isDebuggerConnected: () => boolean, }; type Connect = $Call; @@ -72,7 +72,7 @@ export default class MiddlewareManager { attachDevToolsSocket(socket: WebSocketProxy) { this.app.use( - getDevToolsMiddleware(this.options, () => socket.isChromeConnected()), + getDevToolsMiddleware(this.options, () => socket.isDebuggerConnected()), ); } } diff --git a/packages/cli/src/commands/server/middleware/getDevToolsMiddleware.js b/packages/cli/src/commands/server/middleware/getDevToolsMiddleware.js index aacd32b22..1f4f2b827 100644 --- a/packages/cli/src/commands/server/middleware/getDevToolsMiddleware.js +++ b/packages/cli/src/commands/server/middleware/getDevToolsMiddleware.js @@ -6,14 +6,14 @@ * * @format */ -import launchChrome from '../launchChrome'; import {logger} from '@react-native-community/cli-tools'; import {exec} from 'child_process'; +import launchDebugger from './../launchDebugger'; -function launchChromeDevTools(port, args = '') { +function launchDefaultDebugger(port, args = '') { const debuggerURL = `http://localhost:${port}/debugger-ui${args}`; logger.info('Launching Dev Tools...'); - launchChrome(debuggerURL); + launchDebugger(debuggerURL); } function escapePath(pathname) { @@ -21,14 +21,14 @@ function escapePath(pathname) { return `"${pathname}"`; } -function launchDevTools({port, watchFolders}, isChromeConnected) { +function launchDevTools({port, watchFolders}, isDebuggerConnected) { // Explicit config always wins const customDebugger = process.env.REACT_DEBUGGER; if (customDebugger) { startCustomDebugger({watchFolders, customDebugger}); - } else if (!isChromeConnected()) { - // Dev tools are not yet open; we need to open a session - launchChromeDevTools(port); + } else if (!isDebuggerConnected()) { + // Debugger is not yet open; we need to open a session + launchDefaultDebugger(port); } } @@ -43,10 +43,10 @@ function startCustomDebugger({watchFolders, customDebugger}) { }); } -export default function getDevToolsMiddleware(options, isChromeConnected) { +export default function getDevToolsMiddleware(options, isDebuggerConnected) { return function devToolsMiddleware(req, res, next) { if (req.url === '/launch-js-devtools') { - launchDevTools(options, isChromeConnected); + launchDevTools(options, isDebuggerConnected); res.end('OK'); } else { next(); diff --git a/packages/cli/src/commands/server/webSocketProxy.js b/packages/cli/src/commands/server/webSocketProxy.js index d333bbac2..4b6773085 100644 --- a/packages/cli/src/commands/server/webSocketProxy.js +++ b/packages/cli/src/commands/server/webSocketProxy.js @@ -75,7 +75,7 @@ function attachToServer(server, path) { return { server: wss, - isChromeConnected() { + isDebuggerConnected() { return !!debuggerSocket; }, }; From 93d9aa969b0cf8e11878a1ef5c2158e9e3981932 Mon Sep 17 00:00:00 2001 From: thecodrr Date: Sun, 4 Aug 2019 21:48:36 +0500 Subject: [PATCH 2/4] refactor: make flow happy --- packages/cli/src/commands/server/launchDebugger.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/commands/server/launchDebugger.js b/packages/cli/src/commands/server/launchDebugger.js index d2d236449..62b2ed682 100644 --- a/packages/cli/src/commands/server/launchDebugger.js +++ b/packages/cli/src/commands/server/launchDebugger.js @@ -28,7 +28,7 @@ function commandExistsUnixSync(commandName) { function commandExistsWindowsSync(commandName) { try { - var stdout = execSync('where ' + commandName, {stdio: []}); + const stdout = execSync('where ' + commandName, {stdio: []}); return !!stdout; } catch (error) { return false; @@ -87,7 +87,7 @@ function launchDebugger(url: string) { launchBrowser(url); return; } - launchChrome(); + launchChrome(url); } export default launchDebugger; From 15319dc2245b2575483a321247a46dccd9f73c05 Mon Sep 17 00:00:00 2001 From: thecodrr Date: Sun, 4 Aug 2019 22:12:39 +0500 Subject: [PATCH 3/4] refactor: fix launchDebugger path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Michał Pierzchała --- .../cli/src/commands/server/middleware/getDevToolsMiddleware.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/commands/server/middleware/getDevToolsMiddleware.js b/packages/cli/src/commands/server/middleware/getDevToolsMiddleware.js index 1f4f2b827..fad5a8728 100644 --- a/packages/cli/src/commands/server/middleware/getDevToolsMiddleware.js +++ b/packages/cli/src/commands/server/middleware/getDevToolsMiddleware.js @@ -8,7 +8,7 @@ */ import {logger} from '@react-native-community/cli-tools'; import {exec} from 'child_process'; -import launchDebugger from './../launchDebugger'; +import launchDebugger from '../launchDebugger'; function launchDefaultDebugger(port, args = '') { const debuggerURL = `http://localhost:${port}/debugger-ui${args}`; From 6dfeb565badd59e7f6cf7f89f7bd385b61fbf273 Mon Sep 17 00:00:00 2001 From: thecodrr Date: Sat, 10 Aug 2019 13:41:45 +0500 Subject: [PATCH 4/4] refactor: rename launchBrowser to launchDefaultBrowser --- packages/cli/src/commands/server/launchDebugger.js | 5 ++--- .../server/{launchBrowser.js => launchDefaultBrowser.js} | 4 ++-- .../cli/src/commands/server/middleware/openURLMiddleware.js | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) rename packages/cli/src/commands/server/{launchBrowser.js => launchDefaultBrowser.js} (83%) diff --git a/packages/cli/src/commands/server/launchDebugger.js b/packages/cli/src/commands/server/launchDebugger.js index 62b2ed682..1865e4462 100644 --- a/packages/cli/src/commands/server/launchDebugger.js +++ b/packages/cli/src/commands/server/launchDebugger.js @@ -11,7 +11,7 @@ import open from 'open'; import {execSync} from 'child_process'; import {logger} from '@react-native-community/cli-tools'; -import launchBrowser from './launchBrowser'; +import launchDefaultBrowser from './launchDefaultBrowser'; import chalk from 'chalk'; function commandExistsUnixSync(commandName) { @@ -83,8 +83,7 @@ function launchDebugger(url: string) { 'https://www.google.com/chrome/', )}`, ); - //fallback to default browser - launchBrowser(url); + launchDefaultBrowser(url); return; } launchChrome(url); diff --git a/packages/cli/src/commands/server/launchBrowser.js b/packages/cli/src/commands/server/launchDefaultBrowser.js similarity index 83% rename from packages/cli/src/commands/server/launchBrowser.js rename to packages/cli/src/commands/server/launchDefaultBrowser.js index 06152765d..0d8fc94fb 100644 --- a/packages/cli/src/commands/server/launchBrowser.js +++ b/packages/cli/src/commands/server/launchDefaultBrowser.js @@ -11,7 +11,7 @@ import open from 'open'; import {logger} from '@react-native-community/cli-tools'; -function launchBrowser(url: string) { +function launchDefaultBrowser(url: string) { open(url, err => { if (err) { logger.error('Browser exited with error:', err); @@ -19,4 +19,4 @@ function launchBrowser(url: string) { }); } -export default launchBrowser; +export default launchDefaultBrowser; diff --git a/packages/cli/src/commands/server/middleware/openURLMiddleware.js b/packages/cli/src/commands/server/middleware/openURLMiddleware.js index fa0f716b3..6f468c0a3 100644 --- a/packages/cli/src/commands/server/middleware/openURLMiddleware.js +++ b/packages/cli/src/commands/server/middleware/openURLMiddleware.js @@ -7,7 +7,7 @@ * @format */ -import launchBrowser from '../launchBrowser'; +import launchDefaultBrowser from '../launchDefaultBrowser'; import {logger} from '@react-native-community/cli-tools'; /** @@ -17,7 +17,7 @@ export default function openURLMiddleware(req, res, next) { if (req.url === '/open-url') { const {url} = JSON.parse(req.rawBody); logger.info(`Opening ${url}...`); - launchBrowser(url); + launchDefaultBrowser(url); res.end('OK'); } else { next();