UNPKG

electron-forge

Version:

A complete tool for building modern Electron applications

269 lines (210 loc) 20.3 kB
'use strict'; 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=