123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- const opn = require('opn')
- const execa = require('execa')
- const chalk = require('chalk')
- const execSync = require('child_process').execSync
- 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) {
-
- 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 = execa('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 {
- var options = { app: browser }
- opn(url, options).catch(() => {})
- return true
- } catch (err) {
- return false
- }
- }
- exports.openBrowser = function (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.')
- }
- }
|