electron-forge
Version:
A complete tool for building modern Electron applications
528 lines (400 loc) • 19 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _bluebird = require('bluebird');
require('colors');
var _fsExtra = require('fs-extra');
var _fsExtra2 = _interopRequireDefault(_fsExtra);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _oraHandler = require('../util/ora-handler');
var _oraHandler2 = _interopRequireDefault(_oraHandler);
var _electronHostArch = require('../util/electron-host-arch');
var _electronHostArch2 = _interopRequireDefault(_electronHostArch);
var _forgeConfig = require('../util/forge-config');
var _forgeConfig2 = _interopRequireDefault(_forgeConfig);
var _hook = require('../util/hook');
var _hook2 = _interopRequireDefault(_hook);
var _messages = require('../util/messages');
var _readPackageJson = require('../util/read-package-json');
var _readPackageJson2 = _interopRequireDefault(_readPackageJson);
var _requireSearch = require('../util/require-search');
var _resolveDir = require('../util/resolve-dir');
var _resolveDir2 = _interopRequireDefault(_resolveDir);
var _package = require('./package');
var _package2 = _interopRequireDefault(_package);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @typedef {Object} MakeOptions
* @property {string} [dir=process.cwd()] The path to the app from which distributables are generated
* @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually
* @property {boolean} [skipPackage=false] Whether to skip the pre-make packaging step
* @property {Array<string>} [overrideTargets] An array of make targets to override your forge config
* @property {string} [arch=host architecture] The target architecture
* @property {string} [platform=process.platform] The target platform.
* @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables
*/
/**
* Make distributables for an Electron application.
*
* @param {MakeOptions} providedOptions - Options for the make method
* @return {Promise} Will resolve when the make process is complete
*/
exports.default = function () {
var _ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee3() {
var providedOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _Object$assign, dir, interactive, skipPackage, overrideTargets, arch, platform, outDir, forgeConfig, makers, targets, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, target, maker, declaredArch, targetArchs, packageJSON, appName, outputs, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _loop, _iterator2, _step2, result;
return _regenerator2.default.wrap(function _callee3$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
// eslint-disable-next-line prefer-const, no-unused-vars
_Object$assign = (0, _assign2.default)({
dir: process.cwd(),
interactive: false,
skipPackage: false,
arch: (0, _electronHostArch2.default)(),
platform: process.platform
}, providedOptions), dir = _Object$assign.dir, interactive = _Object$assign.interactive, skipPackage = _Object$assign.skipPackage, overrideTargets = _Object$assign.overrideTargets, arch = _Object$assign.arch, platform = _Object$assign.platform;
outDir = providedOptions.outDir || _path2.default.resolve(dir, 'out');
_oraHandler2.default.interactive = interactive;
forgeConfig = void 0;
_context5.next = 6;
return (0, _oraHandler2.default)('Resolving Forge Config', (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee() {
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return (0, _resolveDir2.default)(dir);
case 2:
dir = _context.sent;
if (dir) {
_context.next = 5;
break;
}
throw 'Failed to locate makeable Electron application';
case 5:
_context.next = 7;
return (0, _forgeConfig2.default)(dir);
case 7:
forgeConfig = _context.sent;
case 8:
case 'end':
return _context.stop();
}
}
}, _callee, undefined);
})));
case 6:
if (['darwin', 'win32', 'linux'].includes(platform)) {
_context5.next = 8;
break;
}
throw new Error('\'' + platform + '\' is an invalid platform. Choices are \'darwin\', \'win32\' or \'linux\'');
case 8:
makers = {};
targets = overrideTargets || forgeConfig.make_targets[platform];
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context5.prev = 13;
_iterator = (0, _getIterator3.default)(targets);
case 15:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context5.next = 30;
break;
}
target = _step.value;
maker = (0, _requireSearch.requireSearchRaw)(__dirname, ['../makers/' + platform + '/' + target + '.js', '../makers/generic/' + target + '.js', 'electron-forge-maker-' + target, target, _path2.default.resolve(dir, target), _path2.default.resolve(dir, 'node_modules', target)]);
if (maker) {
_context5.next = 20;
break;
}
throw new Error(['Could not find a build target with the name: ', target + ' for the platform: ' + platform].join(''));
case 20:
if (maker.isSupportedOnCurrentPlatform) {
_context5.next = 22;
break;
}
throw new Error(['Maker for target ' + target + ' is incompatible with this version of ', 'electron-forge, please upgrade or contact the maintainer ', '(needs to implement \'isSupportedOnCurrentPlatform)\')'].join(''));
case 22:
_context5.next = 24;
return maker.isSupportedOnCurrentPlatform();
case 24:
if (_context5.sent) {
_context5.next = 26;
break;
}
throw new Error(['Cannot build for ' + platform + ' target ' + target + ': the maker declared ', 'that it cannot run on ' + process.platform].join(''));
case 26:
makers[target] = maker.default || maker;
case 27:
_iteratorNormalCompletion = true;
_context5.next = 15;
break;
case 30:
_context5.next = 36;
break;
case 32:
_context5.prev = 32;
_context5.t0 = _context5['catch'](13);
_didIteratorError = true;
_iteratorError = _context5.t0;
case 36:
_context5.prev = 36;
_context5.prev = 37;
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
case 39:
_context5.prev = 39;
if (!_didIteratorError) {
_context5.next = 42;
break;
}
throw _iteratorError;
case 42:
return _context5.finish(39);
case 43:
return _context5.finish(36);
case 44:
if (skipPackage) {
_context5.next = 50;
break;
}
(0, _messages.info)(interactive, 'We need to package your application before we can make it'.green);
_context5.next = 48;
return (0, _package2.default)({
dir: dir,
interactive: interactive,
arch: arch,
platform: platform,
outDir: outDir
});
case 48:
_context5.next = 51;
break;
case 50:
(0, _messages.warn)(interactive, 'WARNING: Skipping the packaging step, this could result in an out of date build'.red);
case 51:
declaredArch = arch;
(0, _messages.info)(interactive, 'Making for the following targets:', ('' + targets.join(', ')).cyan);
targetArchs = [declaredArch];
if (!(declaredArch === 'all')) {
_context5.next = 64;
break;
}
_context5.t1 = platform;
_context5.next = _context5.t1 === 'darwin' ? 58 : _context5.t1 === 'linux' ? 60 : _context5.t1 === 'win32' ? 62 : 62;
break;
case 58:
targetArchs = ['x64'];
return _context5.abrupt('break', 64);
case 60:
targetArchs = ['ia32', 'x64', 'armv7l'];
return _context5.abrupt('break', 64);
case 62:
targetArchs = ['ia32', 'x64'];
return _context5.abrupt('break', 64);
case 64:
_context5.next = 66;
return (0, _readPackageJson2.default)(dir);
case 66:
packageJSON = _context5.sent;
appName = forgeConfig.electronPackagerConfig.name || packageJSON.productName || packageJSON.name;
outputs = [];
_context5.next = 71;
return (0, _hook2.default)(forgeConfig, 'preMake');
case 71:
_iteratorNormalCompletion2 = true;
_didIteratorError2 = false;
_iteratorError2 = undefined;
_context5.prev = 74;
_loop = _regenerator2.default.mark(function _loop() {
var targetArch, packageDir, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _loop2, _iterator3, _step3;
return _regenerator2.default.wrap(function _loop$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
targetArch = _step2.value;
packageDir = _path2.default.resolve(outDir, appName + '-' + platform + '-' + targetArch);
_context4.next = 4;
return _fsExtra2.default.pathExists(packageDir);
case 4:
if (_context4.sent) {
_context4.next = 6;
break;
}
throw new Error('Couldn\'t find packaged app at: ' + packageDir);
case 6:
_iteratorNormalCompletion3 = true;
_didIteratorError3 = false;
_iteratorError3 = undefined;
_context4.prev = 9;
_loop2 = _regenerator2.default.mark(function _loop2() {
var target, maker;
return _regenerator2.default.wrap(function _loop2$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
target = _step3.value;
maker = makers[target];
// eslint-disable-next-line no-loop-func
_context3.next = 4;
return (0, _oraHandler2.default)('Making for target: ' + target.cyan + ' - On platform: ' + platform.cyan + ' - For arch: ' + targetArch.cyan, (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee2() {
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
_context2.t0 = outputs;
_context2.next = 4;
return maker({
dir: packageDir,
appName: appName,
targetPlatform: platform,
targetArch: targetArch,
forgeConfig: forgeConfig,
packageJSON: packageJSON
});
case 4:
_context2.t1 = _context2.sent;
_context2.t0.push.call(_context2.t0, _context2.t1);
_context2.next = 15;
break;
case 8:
_context2.prev = 8;
_context2.t2 = _context2['catch'](0);
if (!_context2.t2) {
_context2.next = 14;
break;
}
throw {
message: 'An error occured while making for target: ' + target,
stack: _context2.t2.message + '\n' + _context2.t2.stack
};
case 14:
throw new Error('An unknown error occured while making for target: ' + target);
case 15:
case 'end':
return _context2.stop();
}
}
}, _callee2, undefined, [[0, 8]]);
})));
case 4:
case 'end':
return _context3.stop();
}
}
}, _loop2, undefined);
});
_iterator3 = (0, _getIterator3.default)(targets);
case 12:
if (_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done) {
_context4.next = 17;
break;
}
return _context4.delegateYield(_loop2(), 't0', 14);
case 14:
_iteratorNormalCompletion3 = true;
_context4.next = 12;
break;
case 17:
_context4.next = 23;
break;
case 19:
_context4.prev = 19;
_context4.t1 = _context4['catch'](9);
_didIteratorError3 = true;
_iteratorError3 = _context4.t1;
case 23:
_context4.prev = 23;
_context4.prev = 24;
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
case 26:
_context4.prev = 26;
if (!_didIteratorError3) {
_context4.next = 29;
break;
}
throw _iteratorError3;
case 29:
return _context4.finish(26);
case 30:
return _context4.finish(23);
case 31:
case 'end':
return _context4.stop();
}
}
}, _loop, undefined, [[9, 19, 23, 31], [24,, 26, 30]]);
});
_iterator2 = (0, _getIterator3.default)(targetArchs);
case 77:
if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {
_context5.next = 82;
break;
}
return _context5.delegateYield(_loop(), 't2', 79);
case 79:
_iteratorNormalCompletion2 = true;
_context5.next = 77;
break;
case 82:
_context5.next = 88;
break;
case 84:
_context5.prev = 84;
_context5.t3 = _context5['catch'](74);
_didIteratorError2 = true;
_iteratorError2 = _context5.t3;
case 88:
_context5.prev = 88;
_context5.prev = 89;
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
case 91:
_context5.prev = 91;
if (!_didIteratorError2) {
_context5.next = 94;
break;
}
throw _iteratorError2;
case 94:
return _context5.finish(91);
case 95:
return _context5.finish(88);
case 96:
_context5.next = 98;
return (0, _hook2.default)(forgeConfig, 'postMake', outputs);
case 98:
result = _context5.sent;
// If the postMake hooks modifies the locations / names of the outputs it must return
// the new locations so that the publish step knows where to look
if (Array.isArray(result)) {
outputs = result;
}
return _context5.abrupt('return', outputs);
case 101:
case 'end':
return _context5.stop();
}
}
}, _callee3, undefined, [[13, 32, 36, 44], [37,, 39, 43], [74, 84, 88, 96], [89,, 91, 95]]);
}));
return function () {
return _ref.apply(this, arguments);
};
}();