UNPKG

4.04 kBJavaScriptView Raw
1// When we run into an uncaught exception, fail hard
2// DEV: Without this line, Karma can hang indefinitely
3process.on('uncaughtException', function handleUncaughtException (err) {
4 throw err;
5});
6
7// Load in our dependencies
8var assert = require('assert');
9var path = require('path');
10var app = require('electron').app;
11var BrowserWindow = require('electron').BrowserWindow;
12var program = require('commander');
13
14// Set up our CLI parser
15program.name = 'electron-launcher';
16program.option('--user-data-dir [dir]', 'Directory to store user data');
17program.option('--show', 'Boolean to make the window visible');
18program.option('--stdin-options', 'Load additional options via `stdin`');
19program.option('--default-user-agent', 'Boolean when spefified uses default user agent');
20program.option('--url [url]', 'URL to load page at');
21program.option('--require [filepath]', 'Path to main process file to require');
22program.allowUnknownOption();
23
24// Parse and assert our arguments
25program.parse(process.argv);
26assert(program.userDataDir, 'Expected `--user-data-dir` to be provided but it was not.');
27assert(program.url, 'Expected `--url` to be provided but it was not.');
28
29// When all windows are closed, exit out
30app.on('window-all-closed', function handleWindowsClosed () {
31 app.quit();
32});
33
34// Update `userData` before Electron loads
35// DEV: This prevents cookies/localStorage from contaminating across apps
36app.setPath('userData', program.userDataDir);
37
38// If we have another file to require, then load it
39// DEV: We use `path.resolve` to resolve relative paths from working directory
40// Otherwise, a `require('./foo')` would load relative to this file
41if (program.require) {
42 require(path.resolve(program.require));
43}
44
45// When Electron is done loading, launch our applicaiton
46app.on('ready', function handleReady () {
47 // If we have `stdin` options, then load them in
48 // https://nodejs.org/docs/latest-v12.x/api/process.html#process_process_stdin
49 // DEV: We perform this after `app.on('ready')` as we want to handle all those actions synchrously
50 if (program.stdinOptions) {
51 var stdinContent = '';
52 process.stdin.setEncoding('utf8');
53 process.stdin.on('readable', function handleReadable () {
54 // Use a loop to make sure we read all available data.
55 while (true) {
56 var stdinChunk = process.stdin.read();
57 if (stdinChunk === null) {
58 break;
59 }
60 stdinContent += stdinChunk;
61 }
62 });
63 process.stdin.on('end', function handleEnd () {
64 var stdinOptions = JSON.parse(stdinContent);
65 Object.assign(program, stdinOptions);
66 launchBrowserWindow();
67 });
68 // Otherwise, launch our browser window
69 } else {
70 // DEV: We run `launchBrowserWindow` asynchronously to match async behavior in both cases
71 process.nextTick(launchBrowserWindow);
72 }
73
74 function launchBrowserWindow() { /* jshint ignore:line */
75 // Create our browser window
76 var browserWindowOptions = Object.assign({
77 show: false
78 }, program.browserWindowOptions);
79 if (program.show !== undefined) {
80 browserWindowOptions.show = !!program.show;
81 }
82 var browserWindow = new BrowserWindow(browserWindowOptions);
83
84 var loadURLOptions = Object.assign({}, program.loadURLOptions);
85 if (program.defaultUserAgent !== true) {
86 // Set a custom User-Agent for better logging
87 // https://github.com/atom/electron/blob/v0.36.9/docs/api/browser-window.md#winloadurlurl-options
88 // https://github.com/atom/electron/blob/v0.36.9/docs/api/web-contents.md#webcontentsloadurlurl-options
89 // DEV: Default would be "Chrome 47.0.2526 (Linux 0.0.0)"
90 // https://github.com/karma-runner/karma/blob/v0.13.21/lib/browser.js#L25
91 // https://github.com/karma-runner/karma/blob/v0.13.21/lib/helper.js#L7-L11
92 // Example: Electron 0.36.9 (Node.js 5.1.1)
93 loadURLOptions.userAgent = 'Electron ' + process.versions.electron + ' (Node ' + process.versions.node + ')';
94 }
95 browserWindow.loadURL(program.url, loadURLOptions);
96 }
97});