react-torch
Version:
A lib to server-side render with react.
184 lines (183 loc) • 7.18 kB
JavaScript
;
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.openBrowser = void 0;
var open_1 = __importDefault(require("open"));
var chalk_1 = __importDefault(require("chalk"));
var child_process_1 = __importDefault(require("child_process"));
var cross_spawn_1 = __importDefault(require("cross-spawn"));
var execSync = child_process_1.default.execSync;
// https://github.com/sindresorhus/open#app
var OSX_CHROME = 'google chrome';
var Actions = Object.freeze({
NONE: 0,
BROWSER: 1,
SCRIPT: 2,
});
function getBrowserEnv() {
// Attempt to honor this environment variable.
// It is specific to the operating system.
// See https://github.com/sindresorhus/open#app for documentation.
var value = process.env.BROWSER;
var args = process.env.BROWSER_ARGS
? process.env.BROWSER_ARGS.split(' ')
: [];
var 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: action, value: value, args: args };
}
function executeNodeScript(scriptPath, url) {
var extraArgs = process.argv.slice(2);
var child = (0, cross_spawn_1.default)('node', __spreadArray(__spreadArray([scriptPath], __read(extraArgs), false), [url], false), {
stdio: 'inherit',
});
child.on('close', function (code) {
if (code !== 0) {
console.log();
console.log(chalk_1.default.red('The script specified as BROWSER environment variable failed.'));
console.log(chalk_1.default.cyan(scriptPath) + ' exited with code ' + code + '.');
console.log();
return;
}
});
return true;
}
function startBrowserProcess(browser, url, args) {
var e_1, _a;
// 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.
var shouldTryOpenChromiumWithAppleScript = process.platform === 'darwin' &&
(typeof browser !== 'string' || browser === OSX_CHROME);
if (shouldTryOpenChromiumWithAppleScript) {
// Will use the first open browser found from list
var supportedChromiumBrowsers = [
'Google Chrome Canary',
'Google Chrome',
'Microsoft Edge',
'Brave Browser',
'Vivaldi',
'Chromium',
];
try {
for (var supportedChromiumBrowsers_1 = __values(supportedChromiumBrowsers), supportedChromiumBrowsers_1_1 = supportedChromiumBrowsers_1.next(); !supportedChromiumBrowsers_1_1.done; supportedChromiumBrowsers_1_1 = supportedChromiumBrowsers_1.next()) {
var chromiumBrowser = supportedChromiumBrowsers_1_1.value;
try {
// Try our best to reuse existing tab
// on OSX Chromium-based browser with AppleScript
execSync('ps cax | grep "' + chromiumBrowser + '"');
execSync('osascript openChrome.applescript "' +
encodeURI(url) +
'" "' +
chromiumBrowser +
'"', {
cwd: __dirname,
stdio: 'ignore',
});
return true;
}
catch (err) {
// Ignore errors.
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (supportedChromiumBrowsers_1_1 && !supportedChromiumBrowsers_1_1.done && (_a = supportedChromiumBrowsers_1.return)) _a.call(supportedChromiumBrowsers_1);
}
finally { if (e_1) throw e_1.error; }
}
}
// Another special case: on OS X, check if BROWSER has been set to "open".
// In this case, instead of passing `open` to `opn` (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;
}
// If there are arguments, they must be passed as array with the browser
if (typeof browser === 'string' && args.length > 0) {
browser = [browser].concat(args);
}
// Fallback to open
// (It will always open new tab)
try {
var options = { app: browser ? { name: browser } : undefined, wait: false };
(0, open_1.default)(url, options).catch(function () { }); // Prevent `unhandledRejection` error.
return true;
}
catch (err) {
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.
*/
function openBrowser(url) {
var _a = getBrowserEnv(), action = _a.action, value = _a.value, args = _a.args;
switch (action) {
case Actions.NONE:
// Special case: BROWSER="none" will prevent opening completely.
return false;
case Actions.SCRIPT:
return executeNodeScript(value, url);
case Actions.BROWSER:
return startBrowserProcess(value, url, args);
default:
throw new Error('Not implemented.');
}
}
exports.openBrowser = openBrowser;