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..1865e4462 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 launchDefaultBrowser from './launchDefaultBrowser'; +import chalk from 'chalk'; function commandExistsUnixSync(commandName) { try { @@ -24,6 +26,28 @@ function commandExistsUnixSync(commandName) { } } +function commandExistsWindowsSync(commandName) { + try { + const 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,17 @@ 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/', + )}`, + ); + launchDefaultBrowser(url); + return; + } + launchChrome(url); +} + +export default launchDebugger; 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/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..fad5a8728 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/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(); 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; }, };