electron-forge
Version:
A complete tool for building modern Electron applications
205 lines (159 loc) • 6.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createDefaultCertificate = exports.isSupportedOnCurrentPlatform = undefined;
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _bluebird = require('bluebird');
var createDefaultCertificate = exports.createDefaultCertificate = function () {
var _ref2 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee2(publisherName, outPath) {
var defaultPvk, targetCert, targetPfx;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
defaultPvk = _path2.default.resolve(__dirname, '..', '..', '..', 'res', 'default.pvk');
targetCert = _path2.default.join(outPath, 'default.cer');
targetPfx = _path2.default.join(outPath, 'default.pfx');
_context2.next = 5;
return spawnSdkTool('makecert.exe', ['-r', '-h', '0', '-n', 'CN=' + publisherName, '-eku', '1.3.6.1.5.5.7.3.3', '-pe', '-sv', defaultPvk, targetCert]);
case 5:
_context2.next = 7;
return spawnSdkTool('pvk2pfx.exe', ['-pvk', defaultPvk, '-spc', targetCert, '-pfx', targetPfx]);
case 7:
return _context2.abrupt('return', targetPfx);
case 8:
case 'end':
return _context2.stop();
}
}
}, _callee2, this);
}));
return function createDefaultCertificate(_x, _x2) {
return _ref2.apply(this, arguments);
};
}();
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _spawnRx = require('spawn-rx');
var _ensureOutput = require('../../util/ensure-output');
var _configFn = require('../../util/config-fn');
var _configFn2 = _interopRequireDefault(_configFn);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// electron-windows-store doesn't set its 'os' field even though it only runs on
// win32
var isSupportedOnCurrentPlatform = exports.isSupportedOnCurrentPlatform = function () {
var _ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee() {
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt('return', process.platform === 'win32');
case 1:
case 'end':
return _context.stop();
}
}
}, _callee, undefined);
}));
return function isSupportedOnCurrentPlatform() {
return _ref.apply(this, arguments);
};
}();
// NB: This is not a typo, we require AppXs to be built on 64-bit
// but if we're running in a 32-bit node.js process, we're going to
// be Wow64 redirected
var windowsSdkPath = process.arch === 'x64' ? 'C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x64' : 'C:\\Program Files\\Windows Kits\\10\\bin\\x64';
function findSdkTool(exe) {
var sdkTool = _path2.default.join(windowsSdkPath, exe);
if (!_fs2.default.existsSync(sdkTool)) {
sdkTool = (0, _spawnRx.findActualExecutable)(exe, []).cmd;
}
if (!_fs2.default.existsSync(sdkTool)) {
throw new Error('Can\'t find ' + exe + ' in PATH, you probably need to install the Windows SDK');
}
return sdkTool;
}
function spawnSdkTool(exe, params) {
return (0, _spawnRx.spawnPromise)(findSdkTool(exe), params);
}
exports.default = function () {
var _ref3 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee3(_ref4) {
var dir = _ref4.dir,
appName = _ref4.appName,
targetArch = _ref4.targetArch,
forgeConfig = _ref4.forgeConfig,
packageJSON = _ref4.packageJSON;
var windowsStore, outPath, opts, noBeta, err;
return _regenerator2.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
windowsStore = require('electron-windows-store');
outPath = _path2.default.resolve(dir, '../make/appx/' + targetArch);
_context3.next = 4;
return (0, _ensureOutput.ensureDirectory)(outPath);
case 4:
opts = (0, _assign2.default)({
publisher: packageJSON.author,
flatten: false,
deploy: false,
packageVersion: packageJSON.version + '.0',
packageName: appName.replace(/-/g, ''),
packageDisplayName: appName,
packageDescription: packageJSON.description || appName,
packageExecutable: 'app\\' + appName + '.exe',
windowsKit: _path2.default.dirname(findSdkTool('makeappx.exe'))
}, (0, _configFn2.default)(forgeConfig.windowsStoreConfig, targetArch), {
inputDirectory: dir,
outputDirectory: outPath
});
if (opts.devCert) {
_context3.next = 9;
break;
}
_context3.next = 8;
return createDefaultCertificate(opts.publisher, outPath);
case 8:
opts.devCert = _context3.sent;
case 9:
if (!opts.publisher.match(/^CN=/)) {
opts.publisher = 'CN=' + opts.publisher;
}
if (!opts.packageVersion.match(/-/)) {
_context3.next = 18;
break;
}
if (!opts.makeVersionWinStoreCompatible) {
_context3.next = 16;
break;
}
noBeta = opts.packageVersion.replace(/-.*/, '');
opts.packageVersion = noBeta + '.0';
_context3.next = 18;
break;
case 16:
err = "Windows Store version numbers don't support semver beta tags. To" + 'automatically fix this, set makeVersionWinStoreCompatible to true or ' + 'explicitly set packageVersion to a version of the format X.Y.Z.A';
throw new Error(err);
case 18:
delete opts.makeVersionWinStoreCompatible;
_context3.next = 21;
return windowsStore(opts);
case 21:
return _context3.abrupt('return', [_path2.default.resolve(outPath, opts.packageName + '.appx')]);
case 22:
case 'end':
return _context3.stop();
}
}
}, _callee3, undefined);
}));
return function (_x3) {
return _ref3.apply(this, arguments);
};
}();