-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
102 lines (92 loc) · 2.67 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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) {
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) {
return
}
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 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.
}
}
if (process.platform === 'darwin' && browser === 'open') {
browser = undefined
}
// Fallback to opn
// (It will always open new tab)
try {
const options = {app: browser}
opn(url, options).catch(() => {}) // Prevent `unhandledRejection` error.
return true
} catch (err) {
return false
}
}
/**
* Reads the BROWSER evironment 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:
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