floss
Version:
Unit-testing for those hard to reach places
87 lines • 6.18 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.floss = void 0;
const path = require("path");
const child_process_1 = require("child_process");
let electron;
try {
// eslint-disable-next-line global-require, @typescript-eslint/no-var-requires
electron = require('electron');
}
catch (err) {
// silence is golden
}
/**
* API to launch the Floss application.
* @module floss
* @param {Object|String} options The options map or path.
* @param {String} [options.path] Path to the JS file to run, can be a glob.
* @param {Boolean} [options.debug] `true` opens in headful mode.
* @param {String} [options.electron] Path to custom electron version. If undefined
* will use environment variable `ELECTRON_PATH` or electron
* installed alongside.
* @param {String} [options.require] Additional module to require.
* @param {String} [options.reporter=spec] Mocha reporter (non-debug mode only)
* @param {String|Object} [options.reporterOptions] Additional options for the reporter
* useful for specifying an output file if using the 'xunit' reporter.
* Options can be a querystring format, e.g., `"foo=2&bar=something"`
* @param {String[]} [options.args] Additional Electron arguments, can be useful
* for things like disable autoplay gestures, e.g.,
* `["--autoplay-policy=no-user-gesture-required"]`
* @param {Function} done Called when completed. Passes error if failed.
*/
function floss(options) {
if (typeof options === 'string') {
options = { path: options };
}
const opts = Object.assign({
path: '',
debug: false,
quiet: false,
args: [],
electron: process.env.ELECTRON_PATH || electron
}, options);
if (!opts.path) {
throw new Error('No path specified for Floss.');
}
else if (typeof opts.path !== 'string') {
throw new Error('Path type is not a string');
}
if (!opts.electron) {
throw new Error('Unable to find Electron. Install \'electron\' alongside Floss.');
}
const app = path.join(__dirname, 'main');
const args = JSON.stringify(opts);
// copy the environment and remove things that would prevent Floss from running properly
const envCopy = Object.assign({}, process.env);
delete envCopy.ELECTRON_RUN_AS_NODE;
delete envCopy.ELECTRON_NO_ATTACH_CONSOLE;
return new Promise((resolve, reject) => {
let execPath = opts.electron;
// In the case where floss is running in windows with the cmdline option --electron electron
// options.electron will just be "electron" at this point.
// Due to limitations with how nodejs spawns windows processes we need to add .cmd to the end of the command
// https://github.com/nodejs/node/issues/3675
const isWindows = (/^win/).test(process.platform);
if (isWindows && !path.extname(execPath)) {
execPath += '.cmd';
}
const childProcess = child_process_1.spawn(execPath, [app, args, ...opts.args], {
stdio: 'pipe',
env: envCopy
});
childProcess.stdout.on('data', (data) => {
process.stdout.write(data);
});
childProcess.on('close', (code) => {
if (code !== 0) {
reject(new Error('Mocha tests failed.'));
}
else {
resolve();
}
});
});
}
exports.floss = floss;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLGlEQUFzQztBQUV0QyxJQUFJLFFBQWdCLENBQUM7QUFFckIsSUFDQTtJQUNJLDhFQUE4RTtJQUM5RSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBc0IsQ0FBQztDQUN2RDtBQUNELE9BQU8sR0FBRyxFQUNWO0lBQ0ksb0JBQW9CO0NBQ3ZCO0FBWUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILFNBQVMsS0FBSyxDQUFDLE9BQThCO0lBRXpDLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUMvQjtRQUNJLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztLQUMvQjtJQUVELE1BQU0sSUFBSSxHQUFpQixNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3JDLElBQUksRUFBRSxFQUFFO1FBQ1IsS0FBSyxFQUFFLEtBQUs7UUFDWixLQUFLLEVBQUUsS0FBSztRQUNaLElBQUksRUFBRSxFQUFFO1FBQ1IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLFFBQVE7S0FDbEQsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVaLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUNkO1FBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0tBQ25EO1NBQ0ksSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUN0QztRQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztLQUNoRDtJQUVELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUNsQjtRQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztLQUNyRjtJQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbEMsd0ZBQXdGO0lBQ3hGLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUvQyxPQUFPLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztJQUNwQyxPQUFPLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQztJQUUxQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBRW5DLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFrQixDQUFDO1FBQ3ZDLDRGQUE0RjtRQUM1RiwwREFBMEQ7UUFDMUQsNEdBQTRHO1FBQzVHLDZDQUE2QztRQUM3QyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbEQsSUFBSSxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUN4QztZQUNJLFFBQVEsSUFBSSxNQUFNLENBQUM7U0FDdEI7UUFDRCxNQUFNLFlBQVksR0FBRyxxQkFBSyxDQUN0QixRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQWdCLENBQUMsRUFBRTtZQUM3QyxLQUFLLEVBQUUsTUFBTTtZQUNiLEdBQUcsRUFBRSxPQUFPO1NBQ2YsQ0FDSixDQUFDO1FBRUYsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFFcEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBRTlCLElBQUksSUFBSSxLQUFLLENBQUMsRUFDZDtnQkFDSSxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO2FBQzVDO2lCQUVEO2dCQUNJLE9BQU8sRUFBRSxDQUFDO2FBQ2I7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVRLHNCQUFLIn0=
;