UNPKG

electron-forge

Version:

A complete tool for building modern Electron applications

207 lines (161 loc) 16.4 kB
'use strict'; 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, userConfig, 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: userConfig = (0, _configFn2.default)(forgeConfig.windowsStoreConfig, targetArch); 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: userConfig.windowsKit || _path2.default.dirname(findSdkTool('makeappx.exe')) }, userConfig, { inputDirectory: dir, outputDirectory: outPath }); if (opts.devCert) { _context3.next = 10; break; } _context3.next = 9; return createDefaultCertificate(opts.publisher, outPath); case 9: opts.devCert = _context3.sent; case 10: if (!opts.publisher.match(/^CN=/)) { opts.publisher = 'CN=' + opts.publisher; } if (!opts.packageVersion.match(/-/)) { _context3.next = 19; break; } if (!opts.makeVersionWinStoreCompatible) { _context3.next = 17; break; } noBeta = opts.packageVersion.replace(/-.*/, ''); opts.packageVersion = noBeta + '.0'; _context3.next = 19; break; case 17: 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 19: delete opts.makeVersionWinStoreCompatible; _context3.next = 22; return windowsStore(opts); case 22: return _context3.abrupt('return', [_path2.default.resolve(outPath, opts.packageName + '.appx')]); case 23: case 'end': return _context3.stop(); } } }, _callee3, undefined); })); return function (_x3) { return _ref3.apply(this, arguments); }; }(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ha2Vycy93aW4zMi9hcHB4LmpzIl0sIm5hbWVzIjpbInB1Ymxpc2hlck5hbWUiLCJvdXRQYXRoIiwiZGVmYXVsdFB2ayIsInJlc29sdmUiLCJfX2Rpcm5hbWUiLCJ0YXJnZXRDZXJ0Iiwiam9pbiIsInRhcmdldFBmeCIsInNwYXduU2RrVG9vbCIsImNyZWF0ZURlZmF1bHRDZXJ0aWZpY2F0ZSIsImlzU3VwcG9ydGVkT25DdXJyZW50UGxhdGZvcm0iLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJ3aW5kb3dzU2RrUGF0aCIsImFyY2giLCJmaW5kU2RrVG9vbCIsImV4ZSIsInNka1Rvb2wiLCJleGlzdHNTeW5jIiwiY21kIiwiRXJyb3IiLCJwYXJhbXMiLCJkaXIiLCJhcHBOYW1lIiwidGFyZ2V0QXJjaCIsImZvcmdlQ29uZmlnIiwicGFja2FnZUpTT04iLCJ3aW5kb3dzU3RvcmUiLCJyZXF1aXJlIiwidXNlckNvbmZpZyIsIndpbmRvd3NTdG9yZUNvbmZpZyIsIm9wdHMiLCJwdWJsaXNoZXIiLCJhdXRob3IiLCJmbGF0dGVuIiwiZGVwbG95IiwicGFja2FnZVZlcnNpb24iLCJ2ZXJzaW9uIiwicGFja2FnZU5hbWUiLCJyZXBsYWNlIiwicGFja2FnZURpc3BsYXlOYW1lIiwicGFja2FnZURlc2NyaXB0aW9uIiwiZGVzY3JpcHRpb24iLCJwYWNrYWdlRXhlY3V0YWJsZSIsIndpbmRvd3NLaXQiLCJkaXJuYW1lIiwiaW5wdXREaXJlY3RvcnkiLCJvdXRwdXREaXJlY3RvcnkiLCJkZXZDZXJ0IiwibWF0Y2giLCJtYWtlVmVyc2lvbldpblN0b3JlQ29tcGF0aWJsZSIsIm5vQmV0YSIsImVyciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tFQW1DTyxrQkFBd0NBLGFBQXhDLEVBQXVEQyxPQUF2RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQ0Msc0JBREQsR0FDYyxlQUFLQyxPQUFMLENBQWFDLFNBQWIsRUFBd0IsSUFBeEIsRUFBOEIsSUFBOUIs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QXlCOEIsS0FBS08sV0FBOUIsV0FBRCxDQWhETTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHIiwiZmlsZSI6Im1ha2Vycy93aW4zMi9hcHB4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgc3Bhd25Qcm9taXNlLCBmaW5kQWN0dWFsRXhlY3V0YWJsZSB9IGZyb20gJ3NwYXduLXJ4JztcblxuaW1wb3J0IHsgZW5zdXJlRGlyZWN0b3J5IH0gZnJvbSAnLi4vLi4vdXRpbC9lbnN1cmUtb3V0cHV0JztcbmltcG9ydCBjb25maWdGbiBmcm9tICcuLi8uLi91dGlsL2NvbmZpZy1mbic7XG5cbi8vIGVsZWN0cm9uLXdpbmRvd3Mtc3RvcmUgZG9lc24ndCBzZXQgaXRzICdvcycgZmllbGQgZXZlbiB0aG91Z2ggaXQgb25seSBydW5zIG9uXG4vLyB3aW4zMlxuZXhwb3J0IGNvbnN0IGlzU3VwcG9ydGVkT25DdXJyZW50UGxhdGZvcm0gPSBhc3luYyAoKSA9PiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuXG4vLyBOQjogVGhpcyBpcyBub3QgYSB0eXBvLCB3ZSByZXF1aXJlIEFwcFhzIHRvIGJlIGJ1aWx0IG9uIDY0LWJpdFxuLy8gYnV0IGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSAzMi1iaXQgbm9kZS5qcyBwcm9jZXNzLCB3ZSdyZSBnb2luZyB0b1xuLy8gYmUgV293NjQgcmVkaXJlY3RlZFxuY29uc3Qgd2luZG93c1Nka1BhdGggPSBwcm9jZXNzLmFyY2ggPT09ICd4NjQnID9cbiAgJ0M6XFxcXFByb2dyYW0gRmlsZXMgKHg4NilcXFxcV2luZG93cyBLaXRzXFxcXDEwXFxcXGJpblxcXFx4NjQnIDpcbiAgJ0M6XFxcXFByb2dyYW0gRmlsZXNcXFxcV2luZG93cyBLaXRzXFxcXDEwXFxcXGJpblxcXFx4NjQnO1xuXG5mdW5jdGlvbiBmaW5kU2RrVG9vbChleGUpIHtcbiAgbGV0IHNka1Rvb2wgPSBwYXRoLmpvaW4od2luZG93c1Nka1BhdGgsIGV4ZSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzZGtUb29sKSkge1xuICAgIHNka1Rvb2wgPSBmaW5kQWN0dWFsRXhlY3V0YWJsZShleGUsIFtdKS5jbWQ7XG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2RrVG9vbCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGZpbmQgJHtleGV9IGluIFBBVEgsIHlvdSBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgdGhlIFdpbmRvd3MgU0RLYCk7XG4gIH1cblxuICByZXR1cm4gc2RrVG9vbDtcbn1cblxuZnVuY3Rpb24gc3Bhd25TZGtUb29sKGV4ZSwgcGFyYW1zKSB7XG4gIHJldHVybiBzcGF3blByb21pc2UoZmluZFNka1Rvb2woZXhlKSwgcGFyYW1zKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDZXJ0aWZpY2F0ZShwdWJsaXNoZXJOYW1lLCBvdXRQYXRoKSB7XG4gIGNvbnN0IGRlZmF1bHRQdmsgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAncmVzJywgJ2RlZmF1bHQucHZrJyk7XG4gIGNvbnN0IHRhcmdldENlcnQgPSBwYXRoLmpvaW4ob3V0UGF0aCwgJ2RlZmF1bHQuY2VyJyk7XG4gIGNvbnN0IHRhcmdldFBmeCA9IHBhdGguam9pbihvdXRQYXRoLCAnZGVmYXVsdC5wZngnKTtcblxuICBhd2FpdCBzcGF3blNka1Rvb2woXG4gICAgJ21ha2VjZXJ0LmV4ZScsXG4gICAgWyctcicsICctaCcsICcwJywgJy1uJywgYENOPSR7cHVibGlzaGVyTmFtZX1gLCAnLWVrdScsICcxLjMuNi4xLjUuNS43LjMuMycsICctcGUnLCAnLXN2JywgZGVmYXVsdFB2aywgdGFyZ2V0Q2VydF0pO1xuXG4gIGF3YWl0IHNwYXduU2RrVG9vbCgncHZrMnBmeC5leGUnLCBbJy1wdmsnLCBkZWZhdWx0UHZrLCAnLXNwYycsIHRhcmdldENlcnQsICctcGZ4JywgdGFyZ2V0UGZ4XSk7XG5cbiAgcmV0dXJuIHRhcmdldFBmeDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKHsgZGlyLCBhcHBOYW1lLCB0YXJnZXRBcmNoLCBmb3JnZUNvbmZpZywgcGFja2FnZUpTT04gfSkgPT4ge1xuICBjb25zdCB3aW5kb3dzU3RvcmUgPSByZXF1aXJlKCdlbGVjdHJvbi13aW5kb3dzLXN0b3JlJyk7XG5cbiAgY29uc3Qgb3V0UGF0aCA9IHBhdGgucmVzb2x2ZShkaXIsIGAuLi9tYWtlL2FwcHgvJHt0YXJnZXRBcmNofWApO1xuICBhd2FpdCBlbnN1cmVEaXJlY3Rvcnkob3V0UGF0aCk7XG5cbiAgY29uc3QgdXNlckNvbmZpZyA9IGNvbmZpZ0ZuKGZvcmdlQ29uZmlnLndpbmRvd3NTdG9yZUNvbmZpZywgdGFyZ2V0QXJjaCk7XG5cbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHB1Ymxpc2hlcjogcGFja2FnZUpTT04uYXV0aG9yLFxuICAgIGZsYXR0ZW46IGZhbHNlLFxuICAgIGRlcGxveTogZmFsc2UsXG4gICAgcGFja2FnZVZlcnNpb246IGAke3BhY2thZ2VKU09OLnZlcnNpb259LjBgLFxuICAgIHBhY2thZ2VOYW1lOiBhcHBOYW1lLnJlcGxhY2UoLy0vZywgJycpLFxuICAgIHBhY2thZ2VEaXNwbGF5TmFtZTogYXBwTmFtZSxcbiAgICBwYWNrYWdlRGVzY3JpcHRpb246IHBhY2thZ2VKU09OLmRlc2NyaXB0aW9uIHx8IGFwcE5hbWUsXG4gICAgcGFja2FnZUV4ZWN1dGFibGU6IGBhcHBcXFxcJHthcHBOYW1lfS5leGVgLFxuICAgIHdpbmRvd3NLaXQ6IHVzZXJDb25maWcud2luZG93c0tpdCB8fCBwYXRoLmRpcm5hbWUoZmluZFNka1Rvb2woJ21ha2VhcHB4LmV4ZScpKSxcbiAgfSwgdXNlckNvbmZpZywge1xuICAgIGlucHV0RGlyZWN0b3J5OiBkaXIsXG4gICAgb3V0cHV0RGlyZWN0b3J5OiBvdXRQYXRoLFxuICB9KTtcblxuICBpZiAoIW9wdHMuZGV2Q2VydCkge1xuICAgIG9wdHMuZGV2Q2VydCA9IGF3YWl0IGNyZWF0ZURlZmF1bHRDZXJ0aWZpY2F0ZShvcHRzLnB1Ymxpc2hlciwgb3V0UGF0aCk7XG4gIH1cblxuICBpZiAoIW9wdHMucHVibGlzaGVyLm1hdGNoKC9eQ049LykpIHtcbiAgICBvcHRzLnB1Ymxpc2hlciA9IGBDTj0ke29wdHMucHVibGlzaGVyfWA7XG4gIH1cblxuICBpZiAob3B0cy5wYWNrYWdlVmVyc2lvbi5tYXRjaCgvLS8pKSB7XG4gICAgaWYgKG9wdHMubWFrZVZlcnNpb25XaW5TdG9yZUNvbXBhdGlibGUpIHtcbiAgICAgIGNvbnN0IG5vQmV0YSA9IG9wdHMucGFja2FnZVZlcnNpb24ucmVwbGFjZSgvLS4qLywgJycpO1xuICAgICAgb3B0cy5wYWNrYWdlVmVyc2lvbiA9IGAke25vQmV0YX0uMGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVyciA9IFwiV2luZG93cyBTdG9yZSB2ZXJzaW9uIG51bWJlcnMgZG9uJ3Qgc3VwcG9ydCBzZW12ZXIgYmV0YSB0YWdzLiBUb1wiICtcbiAgICAgICAgJ2F1dG9tYXRpY2FsbHkgZml4IHRoaXMsIHNldCBtYWtlVmVyc2lvbldpblN0b3JlQ29tcGF0aWJsZSB0byB0cnVlIG9yICcgK1xuICAgICAgICAnZXhwbGljaXRseSBzZXQgcGFja2FnZVZlcnNpb24gdG8gYSB2ZXJzaW9uIG9mIHRoZSBmb3JtYXQgWC5ZLlouQSc7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZSBvcHRzLm1ha2VWZXJzaW9uV2luU3RvcmVDb21wYXRpYmxlO1xuXG4gIGF3YWl0IHdpbmRvd3NTdG9yZShvcHRzKTtcblxuICByZXR1cm4gW3BhdGgucmVzb2x2ZShvdXRQYXRoLCBgJHtvcHRzLnBhY2thZ2VOYW1lfS5hcHB4YCldO1xufTtcbiJdfQ==