auto-open-browser
Version:
auto-open-browser
101 lines (90 loc) • 2.35 kB
JavaScript
const chalk = require('chalk')
const execSync = require('child_process').execSync
const spawn = require('cross-spawn')
const opn = require('opn')
const OSX_CHROME = 'google chrome'
const Actions = Object.freeze({
NONE: 0,
BROWSER: 1,
SCRIPT: 2
})
function getBrowserEnv() {
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) {
const shouldTryOpenChromeWithAppleScript =
process.platform === 'darwin' &&
(typeof browser !== 'string' || browser === OSX_CHROME)
if (shouldTryOpenChromeWithAppleScript) {
try {
execSync('ps cax | grep "Google Chrome"')
execSync('osascript openChrome.applescript "' + encodeURI(url) + '"', {
cwd: __dirname,
stdio: 'ignore'
})
return true
}
catch ( err ) {
}
}
if (process.platform === 'darwin' && browser === 'open') {
browser = undefined
}
try {
let options = { app: browser }
opn(url, options)
.catch(() => {
})
return true
}
catch ( err ) {
return false
}
}
function openBrowser(url) {
const { action, value } = getBrowserEnv()
switch (action) {
case Actions.NONE:
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