electron-forge
Version:
A complete tool for building modern Electron applications
269 lines (210 loc) • 20.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _bluebird = require('bluebird');
var _debug = require('debug');
var _debug2 = _interopRequireDefault(_debug);
var _nodeFetch = require('node-fetch');
var _nodeFetch2 = _interopRequireDefault(_nodeFetch);
var _formData = require('form-data');
var _formData2 = _interopRequireDefault(_formData);
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);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var d = (0, _debug2.default)('electron-forge:publish:ers');
var ersPlatform = function ersPlatform(platform, arch) {
switch (platform) {
case 'darwin':
return 'osx_64';
case 'linux':
return arch === 'ia32' ? 'linux_32' : 'linux_64';
case 'win32':
return arch === 'ia32' ? 'windows_32' : 'windows_64';
default:
return platform;
}
};
exports.default = function () {
var _ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee3(artifacts, packageJSON, forgeConfig, authToken, tag, platform, arch) {
var ersConfig, api, _ref2, token, authFetch, versions, existingVersion, channel, uploaded;
return _regenerator2.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
ersConfig = forgeConfig.electronReleaseServer;
if (ersConfig.baseUrl && ersConfig.username && ersConfig.password) {
_context3.next = 3;
break;
}
throw 'In order to publish to ERS you must set the "electronReleaseServer.baseUrl", "electronReleaseServer.username" and "electronReleaseServer.password" properties in your forge config. See the docs for more info';
case 3:
d('attempting to authenticate to ERS');
api = function api(apiPath) {
return ersConfig.baseUrl + '/' + apiPath;
};
_context3.next = 7;
return (0, _nodeFetch2.default)(api('api/auth/login'), {
method: 'POST',
body: (0, _stringify2.default)({
username: ersConfig.username,
password: ersConfig.password
}),
headers: {
'Content-Type': 'application/json'
}
});
case 7:
_context3.next = 9;
return _context3.sent.json();
case 9:
_ref2 = _context3.sent;
token = _ref2.token;
authFetch = function authFetch(apiPath, options) {
return (0, _nodeFetch2.default)(api(apiPath), (0, _assign2.default)({}, options || {}, {
headers: (0, _assign2.default)({}, (options || {}).headers, { Authorization: 'Bearer ' + token })
}));
};
_context3.next = 14;
return authFetch('api/version');
case 14:
_context3.next = 16;
return _context3.sent.json();
case 16:
versions = _context3.sent;
existingVersion = versions.find(function (version) {
return version.name === packageJSON.version;
});
channel = 'stable';
if (packageJSON.version.indexOf('beta') !== -1) {
channel = 'beta';
}
if (packageJSON.version.indexOf('alpha') !== -1) {
channel = 'alpha';
}
if (existingVersion) {
_context3.next = 24;
break;
}
_context3.next = 24;
return authFetch('api/version', {
method: 'POST',
body: (0, _stringify2.default)({
channel: {
name: channel
},
name: packageJSON.version,
notes: ''
}),
headers: {
'Content-Type': 'application/json'
}
});
case 24:
uploaded = 0;
_context3.next = 27;
return (0, _oraHandler2.default)('Uploading Artifacts ' + uploaded + '/' + artifacts.length, function () {
var _ref3 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee2(uploadSpinner) {
var updateSpinner;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
updateSpinner = function updateSpinner() {
uploadSpinner.text = 'Uploading Artifacts ' + uploaded + '/' + artifacts.length; // eslint-disable-line no-param-reassign
};
_context2.next = 3;
return _promise2.default.all(artifacts.map(function (artifactPath) {
return new _promise2.default(function () {
var _ref4 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee(resolve, reject) {
var existingAsset, artifactForm;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!existingVersion) {
_context.next = 7;
break;
}
existingAsset = existingVersion.assets.find(function (asset) {
return asset.name === _path2.default.basename(artifactPath);
});
if (!existingAsset) {
_context.next = 7;
break;
}
d('asset at path:', artifactPath, 'already exists on server');
uploaded += 1;
updateSpinner();
return _context.abrupt('return');
case 7:
_context.prev = 7;
d('attempting to upload asset:', artifactPath);
artifactForm = new _formData2.default();
artifactForm.append('token', token);
artifactForm.append('version', packageJSON.version);
artifactForm.append('platform', ersPlatform(platform, arch));
artifactForm.append('file', _fsExtra2.default.createReadStream(artifactPath));
_context.next = 16;
return authFetch('api/asset', {
method: 'POST',
body: artifactForm,
headers: artifactForm.getHeaders()
});
case 16:
d('upload successful for asset:', artifactPath);
uploaded += 1;
updateSpinner();
_context.next = 24;
break;
case 21:
_context.prev = 21;
_context.t0 = _context['catch'](7);
reject(_context.t0);
case 24:
case 'end':
return _context.stop();
}
}
}, _callee, undefined, [[7, 21]]);
}));
return function (_x9, _x10) {
return _ref4.apply(this, arguments);
};
}());
}));
case 3:
case 'end':
return _context2.stop();
}
}
}, _callee2, undefined);
}));
return function (_x8) {
return _ref3.apply(this, arguments);
};
}());
case 27:
case 'end':
return _context3.stop();
}
}
}, _callee3, undefined);
}));
return function (_x, _x2, _x3, _x4, _x5, _x6, _x7) {
return _ref.apply(this, arguments);
};
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInB1Ymxpc2hlcnMvZWxlY3Ryb24tcmVsZWFzZS1zZXJ2ZXIuanMiXSwibmFtZXMiOlsiZCIsImVyc1BsYXRmb3JtIiwicGxhdGZvcm0iLCJhcmNoIiwiYXJ0aWZhY3RzIiwicGFja2FnZUpTT04iLCJmb3JnZUNvbmZpZyIsImF1dGhUb2tlbiIsInRhZyIsImVyc0NvbmZpZyIsImVsZWN0cm9uUmVsZWFzZVNlcnZlciIsImJhc2VVcmwiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiYXBpIiwiYXBpUGF0aCIsIm1ldGhvZCIsImJvZHkiLCJoZWFkZXJzIiwianNvbiIsInRva2VuIiwiYXV0aEZldGNoIiwib3B0aW9ucyIsIkF1dGhvcml6YXRpb24iLCJ2ZXJzaW9ucyIsImV4aXN0aW5nVmVyc2lvbiIsImZpbmQiLCJ2ZXJzaW9uIiwibmFtZSIsImNoYW5uZWwiLCJpbmRleE9mIiwibm90ZXMiLCJ1cGxvYWRlZCIsImxlbmd0aCIsInVwbG9hZFNwaW5uZXIiLCJ1cGRhdGVTcGlubmVyIiwidGV4dCIsImFsbCIsIm1hcCIsInJlc29sdmUiLCJyZWplY3QiLCJleGlzdGluZ0Fzc2V0IiwiYXNzZXRzIiwiYXNzZXQiLCJiYXNlbmFtZSIsImFydGlmYWN0UGF0aCIsImFydGlmYWN0Rm9ybSIsImFwcGVuZCIsImNyZWF0ZVJlYWRTdHJlYW0iLCJnZXRIZWFkZXJzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRUE7Ozs7OztBQUVBLElBQU1BLElBQUkscUJBQU0sNEJBQU4sQ0FBVjs7QUFFQSxJQUFNQyxjQUFjLFNBQWRBLFdBQWMsQ0FBQ0MsUUFBRCxFQUFXQyxJQUFYLEVBQW9CO0FBQ3RDLFVBQVFELFFBQVI7QUFDRSxTQUFLLFFBQUw7QUFDRSxhQUFPLFFBQVA7QUFDRixTQUFLLE9BQUw7QUFDRSxhQUFPQyxTQUFTLE1BQVQsR0FBa0IsVUFBbEIsR0FBK0IsVUFBdEM7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RCx3Q0FBRSw4QkFBRixFQUFrQzZDLFlBQWxDO0FBQ0FiLGtEQUFZLENBQVo7QUFDQUc7QUF4QlE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBMEJSSzs7QUExQlE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNkJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsOEJBRDhCO0FBQUEseUJBQWQsQ0FBWixDQUw4RDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQUFoRTs7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFyRE87O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRyIsImZpbGUiOiJwdWJsaXNoZXJzL2VsZWN0cm9uLXJlbGVhc2Utc2VydmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBmZXRjaCBmcm9tICdub2RlLWZldGNoJztcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgYXN5bmNPcmEgZnJvbSAnLi4vdXRpbC9vcmEtaGFuZGxlcic7XG5cbmNvbnN0IGQgPSBkZWJ1ZygnZWxlY3Ryb24tZm9yZ2U6cHVibGlzaDplcnMnKTtcblxuY29uc3QgZXJzUGxhdGZvcm0gPSAocGxhdGZvcm0sIGFyY2gpID0+IHtcbiAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgIGNhc2UgJ2Rhcndpbic6XG4gICAgICByZXR1cm4gJ29zeF82NCc7XG4gICAgY2FzZSAnbGludXgnOlxuICAgICAgcmV0dXJuIGFyY2ggPT09ICdpYTMyJyA/ICdsaW51eF8zMicgOiAnbGludXhfNjQnO1xuICAgIGNhc2UgJ3dpbjMyJzpcbiAgICAgIHJldHVybiBhcmNoID09PSAnaWEzMicgPyAnd2luZG93c18zMicgOiAnd2luZG93c182NCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBwbGF0Zm9ybTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKGFydGlmYWN0cywgcGFja2FnZUpTT04sIGZvcmdlQ29uZmlnLCBhdXRoVG9rZW4sIHRhZywgcGxhdGZvcm0sIGFyY2gpID0+IHtcbiAgY29uc3QgZXJzQ29uZmlnID0gZm9yZ2VDb25maWcuZWxlY3Ryb25SZWxlYXNlU2VydmVyO1xuICBpZiAoIShlcnNDb25maWcuYmFzZVVybCAmJiBlcnNDb25maWcudXNlcm5hbWUgJiYgZXJzQ29uZmlnLnBhc3N3b3JkKSkge1xuICAgIHRocm93ICdJbiBvcmRlciB0byBwdWJsaXNoIHRvIEVSUyB5b3UgbXVzdCBzZXQgdGhlIFwiZWxlY3Ryb25SZWxlYXNlU2VydmVyLmJhc2VVcmxcIiwgXCJlbGVjdHJvblJlbGVhc2VTZXJ2ZXIudXNlcm5hbWVcIiBhbmQgXCJlbGVjdHJvblJlbGVhc2VTZXJ2ZXIucGFzc3dvcmRcIiBwcm9wZXJ0aWVzIGluIHlvdXIgZm9yZ2UgY29uZmlnLiBTZWUgdGhlIGRvY3MgZm9yIG1vcmUgaW5mbyc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgfVxuXG4gIGQoJ2F0dGVtcHRpbmcgdG8gYXV0aGVudGljYXRlIHRvIEVSUycpO1xuXG4gIGNvbnN0IGFwaSA9IGFwaVBhdGggPT4gYCR7ZXJzQ29uZmlnLmJhc2VVcmx9LyR7YXBpUGF0aH1gO1xuXG4gIGNvbnN0IHsgdG9rZW4gfSA9IGF3YWl0IChhd2FpdCBmZXRjaChhcGkoJ2FwaS9hdXRoL2xvZ2luJyksIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VybmFtZTogZXJzQ29uZmlnLnVzZXJuYW1lLFxuICAgICAgcGFzc3dvcmQ6IGVyc0NvbmZpZy5wYXNzd29yZCxcbiAgICB9KSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gIH0pKS5qc29uKCk7XG5cbiAgY29uc3QgYXV0aEZldGNoID0gKGFwaVBhdGgsIG9wdGlvbnMpID0+IGZldGNoKGFwaShhcGlQYXRoKSwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyB8fCB7fSwge1xuICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe30sIChvcHRpb25zIHx8IHt9KS5oZWFkZXJzLCB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gIH0pLFxuICB9KSk7XG5cbiAgY29uc3QgdmVyc2lvbnMgPSBhd2FpdCAoYXdhaXQgYXV0aEZldGNoKCdhcGkvdmVyc2lvbicpKS5qc29uKCk7XG4gIGNvbnN0IGV4aXN0aW5nVmVyc2lvbiA9IHZlcnNpb25zLmZpbmQodmVyc2lvbiA9PiB2ZXJzaW9uLm5hbWUgPT09IHBhY2thZ2VKU09OLnZlcnNpb24pO1xuXG4gIGxldCBjaGFubmVsID0gJ3N0YWJsZSc7XG4gIGlmIChwYWNrYWdlSlNPTi52ZXJzaW9uLmluZGV4T2YoJ2JldGEnKSAhPT0gLTEpIHtcbiAgICBjaGFubmVsID0gJ2JldGEnO1xuICB9XG4gIGlmIChwYWNrYWdlSlNPTi52ZXJzaW9uLmluZGV4T2YoJ2FscGhhJykgIT09IC0xKSB7XG4gICAgY2hhbm5lbCA9ICdhbHBoYSc7XG4gIH1cblxuICBpZiAoIWV4aXN0aW5nVmVyc2lvbikge1xuICAgIGF3YWl0IGF1dGhGZXRjaCgnYXBpL3ZlcnNpb24nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2hhbm5lbDoge1xuICAgICAgICAgIG5hbWU6IGNoYW5uZWwsXG4gICAgICAgIH0sXG4gICAgICAgIG5hbWU6IHBhY2thZ2VKU09OLnZlcnNpb24sXG4gICAgICAgIG5vdGVzOiAnJyxcbiAgICAgIH0pLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGxldCB1cGxvYWRlZCA9IDA7XG4gIGF3YWl0IGFzeW5jT3JhKGBVcGxvYWRpbmcgQXJ0aWZhY3RzICR7dXBsb2FkZWR9LyR7YXJ0aWZhY3RzLmxlbmd0aH1gLCBhc3luYyAodXBsb2FkU3Bpbm5lcikgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZVNwaW5uZXIgPSAoKSA9PiB7XG4gICAgICB1cGxvYWRTcGlubmVyLnRleHQgPSBgVXBsb2FkaW5nIEFydGlmYWN0cyAke3VwbG9hZGVkfS8ke2FydGlmYWN0cy5sZW5ndGh9YDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIH07XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChhcnRpZmFjdHMubWFwKGFydGlmYWN0UGF0aCA9PlxuICAgICAgbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAoZXhpc3RpbmdWZXJzaW9uKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdBc3NldCA9IGV4aXN0aW5nVmVyc2lvbi5hc3NldHMuZmluZChhc3NldCA9PiBhc3NldC5uYW1lID09PSBwYXRoLmJhc2VuYW1lKGFydGlmYWN0UGF0aCkpO1xuICAgICAgICAgIGlmIChleGlzdGluZ0Fzc2V0KSB7XG4gICAgICAgICAgICBkKCdhc3NldCBhdCBwYXRoOicsIGFydGlmYWN0UGF0aCwgJ2FscmVhZHkgZXhpc3RzIG9uIHNlcnZlcicpO1xuICAgICAgICAgICAgdXBsb2FkZWQgKz0gMTtcbiAgICAgICAgICAgIHVwZGF0ZVNwaW5uZXIoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkKCdhdHRlbXB0aW5nIHRvIHVwbG9hZCBhc3NldDonLCBhcnRpZmFjdFBhdGgpO1xuICAgICAgICAgIGNvbnN0IGFydGlmYWN0Rm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgIGFydGlmYWN0Rm9ybS5hcHBlbmQoJ3Rva2VuJywgdG9rZW4pO1xuICAgICAgICAgIGFydGlmYWN0Rm9ybS5hcHBlbmQoJ3ZlcnNpb24nLCBwYWNrYWdlSlNPTi52ZXJzaW9uKTtcbiAgICAgICAgICBhcnRpZmFjdEZvcm0uYXBwZW5kKCdwbGF0Zm9ybScsIGVyc1BsYXRmb3JtKHBsYXRmb3JtLCBhcmNoKSk7XG4gICAgICAgICAgYXJ0aWZhY3RGb3JtLmFwcGVuZCgnZmlsZScsIGZzLmNyZWF0ZVJlYWRTdHJlYW0oYXJ0aWZhY3RQYXRoKSk7XG4gICAgICAgICAgYXdhaXQgYXV0aEZldGNoKCdhcGkvYXNzZXQnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGJvZHk6IGFydGlmYWN0Rm9ybSxcbiAgICAgICAgICAgIGhlYWRlcnM6IGFydGlmYWN0Rm9ybS5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZCgndXBsb2FkIHN1Y2Nlc3NmdWwgZm9yIGFzc2V0OicsIGFydGlmYWN0UGF0aCk7XG4gICAgICAgICAgdXBsb2FkZWQgKz0gMTtcbiAgICAgICAgICB1cGRhdGVTcGlubmVyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICkpO1xuICB9KTtcbn07XG4iXX0=