electron-forge
Version:
A complete tool for building modern Electron applications
152 lines (111 loc) • 14.7 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 _bluebird = require('bluebird');
let createDefaultCertificate = exports.createDefaultCertificate = (() => {
var _ref2 = (0, _bluebird.coroutine)(function* (publisherName, { certFilePath, certFileName, install, program }) {
const makeCertOptions = {
publisherName,
certFilePath: certFilePath || process.cwd(),
certFileName: certFileName || 'default',
install: typeof install === 'boolean' ? install : false,
program: program || { windowsKit: _path2.default.dirname(findSdkTool('makecert.exe')) }
};
if (!(0, _sign.isValidPublisherName)(publisherName)) {
throw new Error(`Received invalid publisher name: '${publisherName}' did not conform to X.500 distinguished name syntax for MakeCert.`);
}
return yield (0, _sign.makeCert)(makeCertOptions);
});
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 _resolveCommand = require('cross-spawn/lib/util/resolveCommand');
var _resolveCommand2 = _interopRequireDefault(_resolveCommand);
var _electronWindowsStore = require('electron-windows-store');
var _electronWindowsStore2 = _interopRequireDefault(_electronWindowsStore);
var _sign = require('electron-windows-store/lib/sign');
var _configFn = require('../../util/config-fn');
var _configFn2 = _interopRequireDefault(_configFn);
var _authorName = require('../../util/author-name');
var _authorName2 = _interopRequireDefault(_authorName);
var _ensureOutput = require('../../util/ensure-output');
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
const isSupportedOnCurrentPlatform = exports.isSupportedOnCurrentPlatform = (() => {
var _ref = (0, _bluebird.coroutine)(function* () {
return process.platform === 'win32';
});
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
const windowsSdkPath = process.arch === 'x64' ? 'C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x64' : 'C:\\Program Files\\Windows Kits\\10\\bin\\x64';
function findSdkTool(exe) {
let sdkTool = _path2.default.join(windowsSdkPath, exe);
if (!_fs2.default.existsSync(sdkTool)) {
sdkTool = (0, _resolveCommand2.default)(exe, true);
}
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 getDistinguishedNameFromAuthor(author) {
return `CN=${(0, _authorName2.default)(author)}`;
}
exports.default = (() => {
var _ref3 = (0, _bluebird.coroutine)(function* ({ dir, appName, targetArch, forgeConfig, packageJSON }) {
const outPath = _path2.default.resolve(dir, `../make/appx/${targetArch}`);
yield (0, _ensureOutput.ensureDirectory)(outPath);
const userConfig = (0, _configFn2.default)(forgeConfig.windowsStoreConfig, targetArch);
const opts = (0, _assign2.default)({
publisher: getDistinguishedNameFromAuthor(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.publisher) {
throw 'Please set config.forge.windowsStoreConfig.publisher or author.name in package.json for the appx target';
}
if (!opts.devCert) {
opts.devCert = yield createDefaultCertificate(opts.publisher, { certFilePath: outPath, program: opts });
}
if (opts.packageVersion.match(/-/)) {
if (opts.makeVersionWinStoreCompatible) {
const noBeta = opts.packageVersion.replace(/-.*/, '');
opts.packageVersion = `${noBeta}.0`;
} else {
const 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);
}
}
delete opts.makeVersionWinStoreCompatible;
yield (0, _electronWindowsStore2.default)(opts);
return [_path2.default.resolve(outPath, `${opts.packageName}.appx`)];
});
return function (_x3) {
return _ref3.apply(this, arguments);
};
})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ha2Vycy93aW4zMi9hcHB4LmpzIl0sIm5hbWVzIjpbInB1Ymxpc2hlck5hbWUiLCJjZXJ0RmlsZVBhdGgiLCJjZXJ0RmlsZU5hbWUiLCJpbnN0YWxsIiwicHJvZ3JhbSIsIm1ha2VDZXJ0T3B0aW9ucyIsInByb2Nlc3MiLCJjd2QiLCJ3aW5kb3dzS2l0IiwicGF0aCIsImRpcm5hbWUiLCJmaW5kU2RrVG9vbCIsIkVycm9yIiwiY3JlYXRlRGVmYXVsdENlcnRpZmljYXRlIiwiaXNTdXBwb3J0ZWRPbkN1cnJlbnRQbGF0Zm9ybSIsInBsYXRmb3JtIiwid2luZG93c1Nka1BhdGgiLCJhcmNoIiwiZXhlIiwic2RrVG9vbCIsImpvaW4iLCJmcyIsImV4aXN0c1N5bmMiLCJnZXREaXN0aW5ndWlzaGVkTmFtZUZyb21BdXRob3IiLCJhdXRob3IiLCJkaXIiLCJhcHBOYW1lIiwidGFyZ2V0QXJjaCIsImZvcmdlQ29uZmlnIiwicGFja2FnZUpTT04iLCJvdXRQYXRoIiwicmVzb2x2ZSIsInVzZXJDb25maWciLCJ3aW5kb3dzU3RvcmVDb25maWciLCJvcHRzIiwicHVibGlzaGVyIiwiZmxhdHRlbiIsImRlcGxveSIsInBhY2thZ2VWZXJzaW9uIiwidmVyc2lvbiIsInBhY2thZ2VOYW1lIiwicmVwbGFjZSIsInBhY2thZ2VEaXNwbGF5TmFtZSIsInBhY2thZ2VEZXNjcmlwdGlvbiIsImRlc2NyaXB0aW9uIiwicGFja2FnZUV4ZWN1dGFibGUiLCJpbnB1dERpcmVjdG9yeSIsIm91dHB1dERpcmVjdG9yeSIsImRldkNlcnQiLCJtYXRjaCIsIm1ha2VWZXJzaW9uV2luU3RvcmVDb21wYXRpYmxlIiwibm9CZXRhIiwiZXJyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozt1Q0FrQ08sV0FBd0NBLGFBQXhDLEVBQXVELEVBQUVDLFlBQUYsRUFBZ0JDLFlBQWhCLEVBQThCQyxPQUE5QixFQUF1Q0MsT0FBdkMsRUFBdkQsRUFBeUc7QUFDOUcsVUFBTUMsa0JBQWtCO0FBQ3RC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QUFNbkMseUJBQXlCcUIsS0FBS0MsU0FBOUIsRUFBeUMsRUFBRWxDLGNBQWM2QixPQUFoQixFQUF5QjFCLFNBQVM4QixJQUFsQyxFQUF6QyxDQUFyQjtBQUNEOztBQUVELFFBQUlBLEtBQUtJLGNBQUwsQ0FBb0JXLEtBQXBCLENBQTBCLEdBQTFCLENBQUosRUFBb0M7QUFDbEMsVUFBSWYsS0FBS2dCLDZCQUFULEVBQXdDO0FBQ3RDLGNBQU1DLFNBQVNqQixLQUFLSSxjQUFMLENBQW9CRyxPQUFwQixDQUE0QixLQUE1QixFQUFtQyxFQUFuQyxDQUFmO0FBQ0FQLGFBQUtJLGNBQUwsR0FBdUIsR0FBRWEsTUFBTyxJQUFoQztBQUNELE9BSEQsTUFHTztBQUNMLGNBQU1DLE1BQU0scUVBQ1YsdUVBRFUsR0FFVixrRUFGRjs7QUFJQSxjQUFNLElBQUl4QyxLQUFKLENBQVV3QyxHQUFWLENBQU47QUFDRDtBQUNGOztBQUVELFdBQU9sQixLQUFLZ0IsNkJBQVo7O0FBRUEsVUFBTSxvQ0FBYWhCLElBQWIsQ0FBTjs7QUFFQSxXQUFPLENBQUN6QixlQUFLc0IsT0FBTCxDQUFhRCxPQUFiLEVBQXVCLEdBQUVJLEtBQUtNLFdBQVksT0FBMUMsQ0FBRCxDQUFQO0FBQ0QsRyIsImZpbGUiOiJtYWtlcnMvd2luMzIvYXBweC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCByZXNvbHZlQ29tbWFuZCBmcm9tICdjcm9zcy1zcGF3bi9saWIvdXRpbC9yZXNvbHZlQ29tbWFuZCc7XG5pbXBvcnQgd2luZG93c1N0b3JlIGZyb20gJ2VsZWN0cm9uLXdpbmRvd3Mtc3RvcmUnO1xuaW1wb3J0IHsgaXNWYWxpZFB1Ymxpc2hlck5hbWUsIG1ha2VDZXJ0IH0gZnJvbSAnZWxlY3Ryb24td2luZG93cy1zdG9yZS9saWIvc2lnbic7XG5cbmltcG9ydCBjb25maWdGbiBmcm9tICcuLi8uLi91dGlsL2NvbmZpZy1mbic7XG5pbXBvcnQgZ2V0TmFtZUZyb21BdXRob3IgZnJvbSAnLi4vLi4vdXRpbC9hdXRob3ItbmFtZSc7XG5pbXBvcnQgeyBlbnN1cmVEaXJlY3RvcnkgfSBmcm9tICcuLi8uLi91dGlsL2Vuc3VyZS1vdXRwdXQnO1xuXG4vLyBlbGVjdHJvbi13aW5kb3dzLXN0b3JlIGRvZXNuJ3Qgc2V0IGl0cyAnb3MnIGZpZWxkIGV2ZW4gdGhvdWdoIGl0IG9ubHkgcnVucyBvblxuLy8gd2luMzJcbmV4cG9ydCBjb25zdCBpc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtID0gYXN5bmMgKCkgPT4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblxuLy8gTkI6IFRoaXMgaXMgbm90IGEgdHlwbywgd2UgcmVxdWlyZSBBcHBYcyB0byBiZSBidWlsdCBvbiA2NC1iaXRcbi8vIGJ1dCBpZiB3ZSdyZSBydW5uaW5nIGluIGEgMzItYml0IG5vZGUuanMgcHJvY2Vzcywgd2UncmUgZ29pbmcgdG9cbi8vIGJlIFdvdzY0IHJlZGlyZWN0ZWRcbmNvbnN0IHdpbmRvd3NTZGtQYXRoID0gcHJvY2Vzcy5hcmNoID09PSAneDY0JyA/XG4gICdDOlxcXFxQcm9ncmFtIEZpbGVzICh4ODYpXFxcXFdpbmRvd3MgS2l0c1xcXFwxMFxcXFxiaW5cXFxceDY0JyA6XG4gICdDOlxcXFxQcm9ncmFtIEZpbGVzXFxcXFdpbmRvd3MgS2l0c1xcXFwxMFxcXFxiaW5cXFxceDY0JztcblxuZnVuY3Rpb24gZmluZFNka1Rvb2woZXhlKSB7XG4gIGxldCBzZGtUb29sID0gcGF0aC5qb2luKHdpbmRvd3NTZGtQYXRoLCBleGUpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2RrVG9vbCkpIHtcbiAgICBzZGtUb29sID0gcmVzb2x2ZUNvbW1hbmQoZXhlLCB0cnVlKTtcbiAgfVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhzZGtUb29sKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgZmluZCAke2V4ZX0gaW4gUEFUSC4gWW91IHByb2JhYmx5IG5lZWQgdG8gaW5zdGFsbCB0aGUgV2luZG93cyBTREsuYCk7XG4gIH1cblxuICByZXR1cm4gc2RrVG9vbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDZXJ0aWZpY2F0ZShwdWJsaXNoZXJOYW1lLCB7IGNlcnRGaWxlUGF0aCwgY2VydEZpbGVOYW1lLCBpbnN0YWxsLCBwcm9ncmFtIH0pIHtcbiAgY29uc3QgbWFrZUNlcnRPcHRpb25zID0ge1xuICAgIHB1Ymxpc2hlck5hbWUsXG4gICAgY2VydEZpbGVQYXRoOiBjZXJ0RmlsZVBhdGggfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICBjZXJ0RmlsZU5hbWU6IGNlcnRGaWxlTmFtZSB8fCAnZGVmYXVsdCcsXG4gICAgaW5zdGFsbDogdHlwZW9mIGluc3RhbGwgPT09ICdib29sZWFuJyA/IGluc3RhbGwgOiBmYWxzZSxcbiAgICBwcm9ncmFtOiBwcm9ncmFtIHx8IHsgd2luZG93c0tpdDogcGF0aC5kaXJuYW1lKGZpbmRTZGtUb29sKCdtYWtlY2VydC5leGUnKSkgfSxcbiAgfTtcblxuICBpZiAoIWlzVmFsaWRQdWJsaXNoZXJOYW1lKHB1Ymxpc2hlck5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBpbnZhbGlkIHB1Ymxpc2hlciBuYW1lOiAnJHtwdWJsaXNoZXJOYW1lfScgZGlkIG5vdCBjb25mb3JtIHRvIFguNTAwIGRpc3Rpbmd1aXNoZWQgbmFtZSBzeW50YXggZm9yIE1ha2VDZXJ0LmApO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IG1ha2VDZXJ0KG1ha2VDZXJ0T3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGdldERpc3Rpbmd1aXNoZWROYW1lRnJvbUF1dGhvcihhdXRob3IpIHtcbiAgcmV0dXJuIGBDTj0ke2dldE5hbWVGcm9tQXV0aG9yKGF1dGhvcil9YDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKHsgZGlyLCBhcHBOYW1lLCB0YXJnZXRBcmNoLCBmb3JnZUNvbmZpZywgcGFja2FnZUpTT04gfSkgPT4ge1xuICBjb25zdCBvdXRQYXRoID0gcGF0aC5yZXNvbHZlKGRpciwgYC4uL21ha2UvYXBweC8ke3RhcmdldEFyY2h9YCk7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeShvdXRQYXRoKTtcblxuICBjb25zdCB1c2VyQ29uZmlnID0gY29uZmlnRm4oZm9yZ2VDb25maWcud2luZG93c1N0b3JlQ29uZmlnLCB0YXJnZXRBcmNoKTtcblxuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcHVibGlzaGVyOiBnZXREaXN0aW5ndWlzaGVkTmFtZUZyb21BdXRob3IocGFja2FnZUpTT04uYXV0aG9yKSxcbiAgICBmbGF0dGVuOiBmYWxzZSxcbiAgICBkZXBsb3k6IGZhbHNlLFxuICAgIHBhY2thZ2VWZXJzaW9uOiBgJHtwYWNrYWdlSlNPTi52ZXJzaW9ufS4wYCxcbiAgICBwYWNrYWdlTmFtZTogYXBwTmFtZS5yZXBsYWNlKC8tL2csICcnKSxcbiAgICBwYWNrYWdlRGlzcGxheU5hbWU6IGFwcE5hbWUsXG4gICAgcGFja2FnZURlc2NyaXB0aW9uOiBwYWNrYWdlSlNPTi5kZXNjcmlwdGlvbiB8fCBhcHBOYW1lLFxuICAgIHBhY2thZ2VFeGVjdXRhYmxlOiBgYXBwXFxcXCR7YXBwTmFtZX0uZXhlYCxcbiAgICB3aW5kb3dzS2l0OiB1c2VyQ29uZmlnLndpbmRvd3NLaXQgfHwgcGF0aC5kaXJuYW1lKGZpbmRTZGtUb29sKCdtYWtlYXBweC5leGUnKSksXG4gIH0sIHVzZXJDb25maWcsIHtcbiAgICBpbnB1dERpcmVjdG9yeTogZGlyLFxuICAgIG91dHB1dERpcmVjdG9yeTogb3V0UGF0aCxcbiAgfSk7XG5cbiAgaWYgKCFvcHRzLnB1Ymxpc2hlcikge1xuICAgIHRocm93ICdQbGVhc2Ugc2V0IGNvbmZpZy5mb3JnZS53aW5kb3dzU3RvcmVDb25maWcucHVibGlzaGVyIG9yIGF1dGhvci5uYW1lIGluIHBhY2thZ2UuanNvbiBmb3IgdGhlIGFwcHggdGFyZ2V0JztcbiAgfVxuXG4gIGlmICghb3B0cy5kZXZDZXJ0KSB7XG4gICAgb3B0cy5kZXZDZXJ0ID0gYXdhaXQgY3JlYXRlRGVmYXVsdENlcnRpZmljYXRlKG9wdHMucHVibGlzaGVyLCB7IGNlcnRGaWxlUGF0aDogb3V0UGF0aCwgcHJvZ3JhbTogb3B0cyB9KTtcbiAgfVxuXG4gIGlmIChvcHRzLnBhY2thZ2VWZXJzaW9uLm1hdGNoKC8tLykpIHtcbiAgICBpZiAob3B0cy5tYWtlVmVyc2lvbldpblN0b3JlQ29tcGF0aWJsZSkge1xuICAgICAgY29uc3Qgbm9CZXRhID0gb3B0cy5wYWNrYWdlVmVyc2lvbi5yZXBsYWNlKC8tLiovLCAnJyk7XG4gICAgICBvcHRzLnBhY2thZ2VWZXJzaW9uID0gYCR7bm9CZXRhfS4wYDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyID0gXCJXaW5kb3dzIFN0b3JlIHZlcnNpb24gbnVtYmVycyBkb24ndCBzdXBwb3J0IHNlbXZlciBiZXRhIHRhZ3MuIFRvXCIgK1xuICAgICAgICAnYXV0b21hdGljYWxseSBmaXggdGhpcywgc2V0IG1ha2VWZXJzaW9uV2luU3RvcmVDb21wYXRpYmxlIHRvIHRydWUgb3IgJyArXG4gICAgICAgICdleHBsaWNpdGx5IHNldCBwYWNrYWdlVmVyc2lvbiB0byBhIHZlcnNpb24gb2YgdGhlIGZvcm1hdCBYLlkuWi5BJztcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycik7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlIG9wdHMubWFrZVZlcnNpb25XaW5TdG9yZUNvbXBhdGlibGU7XG5cbiAgYXdhaXQgd2luZG93c1N0b3JlKG9wdHMpO1xuXG4gIHJldHVybiBbcGF0aC5yZXNvbHZlKG91dFBhdGgsIGAke29wdHMucGFja2FnZU5hbWV9LmFwcHhgKV07XG59O1xuIl19
;