1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | 'use strict';
|
9 |
|
10 | var chalk = require('chalk');
|
11 | var execSync = require('child_process').execSync;
|
12 | var spawn = require('cross-spawn');
|
13 | var open = require('open');
|
14 |
|
15 |
|
16 | var OSX_CHROME = 'google chrome';
|
17 |
|
18 | const Actions = Object.freeze({
|
19 | NONE: 0,
|
20 | BROWSER: 1,
|
21 | SCRIPT: 2,
|
22 | });
|
23 |
|
24 | function getBrowserEnv() {
|
25 |
|
26 |
|
27 |
|
28 | const value = process.env.BROWSER;
|
29 | const args = process.env.BROWSER_ARGS
|
30 | ? process.env.BROWSER_ARGS.split(' ')
|
31 | : [];
|
32 | let action;
|
33 | if (!value) {
|
34 |
|
35 | action = Actions.BROWSER;
|
36 | } else if (value.toLowerCase().endsWith('.js')) {
|
37 | action = Actions.SCRIPT;
|
38 | } else if (value.toLowerCase() === 'none') {
|
39 | action = Actions.NONE;
|
40 | } else {
|
41 | action = Actions.BROWSER;
|
42 | }
|
43 | return { action, value, args };
|
44 | }
|
45 |
|
46 | function executeNodeScript(scriptPath, url) {
|
47 | const extraArgs = process.argv.slice(2);
|
48 | const child = spawn(process.execPath, [scriptPath, ...extraArgs, url], {
|
49 | stdio: 'inherit',
|
50 | });
|
51 | child.on('close', code => {
|
52 | if (code !== 0) {
|
53 | console.log();
|
54 | console.log(
|
55 | chalk.red(
|
56 | 'The script specified as BROWSER environment variable failed.'
|
57 | )
|
58 | );
|
59 | console.log(chalk.cyan(scriptPath) + ' exited with code ' + code + '.');
|
60 | console.log();
|
61 | return;
|
62 | }
|
63 | });
|
64 | return true;
|
65 | }
|
66 |
|
67 | function startBrowserProcess(browser, url, args) {
|
68 |
|
69 |
|
70 |
|
71 |
|
72 | const shouldTryOpenChromiumWithAppleScript =
|
73 | process.platform === 'darwin' &&
|
74 | (typeof browser !== 'string' || browser === OSX_CHROME);
|
75 |
|
76 | if (shouldTryOpenChromiumWithAppleScript) {
|
77 |
|
78 | const supportedChromiumBrowsers = [
|
79 | 'Google Chrome Canary',
|
80 | 'Google Chrome',
|
81 | 'Microsoft Edge',
|
82 | 'Brave Browser',
|
83 | 'Vivaldi',
|
84 | 'Chromium',
|
85 | ];
|
86 |
|
87 | for (let chromiumBrowser of supportedChromiumBrowsers) {
|
88 | try {
|
89 |
|
90 |
|
91 | execSync('ps cax | grep "' + chromiumBrowser + '"');
|
92 | execSync(
|
93 | 'osascript openChrome.applescript "' +
|
94 | encodeURI(url) +
|
95 | '" "' +
|
96 | chromiumBrowser +
|
97 | '"',
|
98 | {
|
99 | cwd: __dirname,
|
100 | stdio: 'ignore',
|
101 | }
|
102 | );
|
103 | return true;
|
104 | } catch (err) {
|
105 |
|
106 | }
|
107 | }
|
108 | }
|
109 |
|
110 |
|
111 |
|
112 |
|
113 |
|
114 | if (process.platform === 'darwin' && browser === 'open') {
|
115 | browser = undefined;
|
116 | }
|
117 |
|
118 |
|
119 | if (typeof browser === 'string' && args.length > 0) {
|
120 | browser = [browser].concat(args);
|
121 | }
|
122 |
|
123 |
|
124 |
|
125 | try {
|
126 | var options = { app: browser, wait: false, url: true };
|
127 | open(url, options).catch(() => {});
|
128 | return true;
|
129 | } catch (err) {
|
130 | return false;
|
131 | }
|
132 | }
|
133 |
|
134 |
|
135 |
|
136 |
|
137 |
|
138 | function openBrowser(url) {
|
139 | const { action, value, args } = getBrowserEnv();
|
140 | switch (action) {
|
141 | case Actions.NONE:
|
142 |
|
143 | return false;
|
144 | case Actions.SCRIPT:
|
145 | return executeNodeScript(value, url);
|
146 | case Actions.BROWSER:
|
147 | return startBrowserProcess(value, url, args);
|
148 | default:
|
149 | throw new Error('Not implemented.');
|
150 | }
|
151 | }
|
152 |
|
153 | module.exports = openBrowser;
|