This repository has been archived by the owner on Sep 12, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 22
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #28 from netlify/addOpenBrowser
add openBrowser after netlify dev completes
- Loading branch information
Showing
2 changed files
with
157 additions
and
51 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
// from https://github.com/facebook/create-react-app/blob/7864ba3ce70892ebe43d56487b45d3267890df14/packages/react-dev-utils/openBrowser.js | ||
|
||
'use strict' | ||
|
||
var chalk = require('chalk') | ||
var execSync = require('child_process').execSync | ||
var spawn = require('cross-spawn') | ||
var opn = require('opn') | ||
|
||
// https://github.com/sindresorhus/opn#app | ||
var OSX_CHROME = 'google chrome' | ||
|
||
const Actions = Object.freeze({ | ||
NONE: 0, | ||
BROWSER: 1, | ||
SCRIPT: 2 | ||
}) | ||
|
||
function getBrowserEnv() { | ||
// Attempt to honor this environment variable. | ||
// It is specific to the operating system. | ||
// See https://github.com/sindresorhus/opn#app for documentation. | ||
const value = process.env.BROWSER | ||
let action | ||
if (!value) { | ||
// Default. | ||
action = Actions.BROWSER | ||
} else if (value.toLowerCase().endsWith('.js')) { | ||
action = Actions.SCRIPT | ||
} else if (value.toLowerCase() === 'none') { | ||
action = Actions.NONE | ||
} else { | ||
action = Actions.BROWSER | ||
} | ||
return { action, value } | ||
} | ||
|
||
function executeNodeScript(scriptPath, url) { | ||
const extraArgs = process.argv.slice(2) | ||
const child = spawn('node', [scriptPath, ...extraArgs, url], { | ||
stdio: 'inherit' | ||
}) | ||
child.on('close', code => { | ||
if (code !== 0) { | ||
console.log() | ||
console.log(chalk.red('The script specified as BROWSER environment variable failed.')) | ||
console.log(chalk.cyan(scriptPath) + ' exited with code ' + code + '.') | ||
console.log() | ||
return | ||
} | ||
}) | ||
return true | ||
} | ||
|
||
function startBrowserProcess(browser, url) { | ||
// If we're on OS X, the user hasn't specifically | ||
// requested a different browser, we can try opening | ||
// Chrome with AppleScript. This lets us reuse an | ||
// existing tab when possible instead of creating a new one. | ||
const shouldTryOpenChromeWithAppleScript = | ||
process.platform === 'darwin' && (typeof browser !== 'string' || browser === OSX_CHROME) | ||
|
||
if (shouldTryOpenChromeWithAppleScript) { | ||
try { | ||
// Try our best to reuse existing tab | ||
// on OS X Google Chrome with AppleScript | ||
execSync('ps cax | grep "Google Chrome"') | ||
execSync('osascript openChrome.applescript "' + encodeURI(url) + '"', { | ||
cwd: __dirname, | ||
stdio: 'ignore' | ||
}) | ||
return true | ||
} catch (err) { | ||
// Ignore errors. | ||
} | ||
} | ||
|
||
// Another special case: on OS X, check if BROWSER has been set to "open". | ||
// In this case, instead of passing `open` to `opn` (which won't work), | ||
// just ignore it (thus ensuring the intended behavior, i.e. opening the system browser): | ||
// https://github.com/facebook/create-react-app/pull/1690#issuecomment-283518768 | ||
if (process.platform === 'darwin' && browser === 'open') { | ||
browser = undefined | ||
} | ||
|
||
// Fallback to opn | ||
// (It will always open new tab) | ||
try { | ||
var options = { app: browser, wait: false } | ||
opn(url, options).catch(() => {}) // Prevent `unhandledRejection` error. | ||
return true | ||
} catch (err) { | ||
return false | ||
} | ||
} | ||
|
||
/** | ||
* Reads the BROWSER environment variable and decides what to do with it. Returns | ||
* true if it opened a browser or ran a node.js script, otherwise false. | ||
*/ | ||
function openBrowser(url) { | ||
const { action, value } = getBrowserEnv() | ||
switch (action) { | ||
case Actions.NONE: | ||
// Special case: BROWSER="none" will prevent opening completely. | ||
return false | ||
case Actions.SCRIPT: | ||
return executeNodeScript(value, url) | ||
case Actions.BROWSER: | ||
return startBrowserProcess(value, url) | ||
default: | ||
throw new Error('Not implemented.') | ||
} | ||
} | ||
|
||
module.exports = openBrowser |