@farmfe/core
Version:
Farm is a extremely fast web build tool written in Rust. Farm can start a project in milliseconds and perform HMR within 10ms, making it much faster than similar tools like webpack and vite.
116 lines • 4.21 kB
JavaScript
/**
* The following is modified based on source found in
* https://github.com/facebook/create-react-app
*
* MIT Licensed
* Copyright (c) 2015-present, Facebook, Inc.
* https://github.com/facebook/create-react-app/blob/master/LICENSE
*/
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { execSync } from 'child_process';
import { execa } from 'execa';
import open from 'open';
import { Logger, cyan, red } from '../utils/index.js';
// https://github.com/sindresorhus/open#app
const OSX_CHROME = 'google chrome';
function getBrowserEnv() {
// Attempt to honor this environment variable.
// It is specific to the operating system.
// See https://github.com/sindresorhus/open#app for documentation.
const value = process.env.BROWSER;
let action;
if (!value) {
// Default.
action = 1 /* Actions.BROWSER */;
}
else if (value.toLowerCase().endsWith('.js')) {
action = 2 /* Actions.SCRIPT */;
}
else if (value.toLowerCase() === 'none') {
action = 0 /* Actions.NONE */;
}
else {
action = 1 /* 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(red('The script specified as BROWSER environment variable failed.'));
console.log(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);
const dirname = path.dirname(fileURLToPath(import.meta.url));
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: path.resolve(dirname, '../../bin'),
stdio: 'ignore'
});
return true;
}
catch {
// Ignore errors
}
}
// Another special case: on OS X, check if BROWSER has been set to "open".
// In this case, instead of passing the string `open` to `open` function (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 open
// (It will always open new tab)
try {
const options = browser ? { app: { name: browser, arguments: [] } } : {};
const logger = new Logger();
open(url, options).catch((e) => {
logger.error(e);
}); // Prevent `unhandledRejection` error.
return true;
}
catch {
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.
*/
export function openBrowser(url) {
const { action, value } = getBrowserEnv();
switch (action) {
case 0 /* Actions.NONE */:
// Special case: BROWSER="none" will prevent opening completely.
return false;
case 2 /* Actions.SCRIPT */:
return executeNodeScript(value, url);
case 1 /* Actions.BROWSER */:
return startBrowserProcess(value, url);
default:
throw new Error('Not implemented.');
}
}
//# sourceMappingURL=open.js.map