UNPKG

15.3 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = void 0;
7
8require("source-map-support/register");
9
10var _publisherBase = _interopRequireDefault(require("@electron-forge/publisher-base"));
11
12var _asyncOra = require("@electron-forge/async-ora");
13
14var _debug = _interopRequireDefault(require("debug"));
15
16var _formData = _interopRequireDefault(require("form-data"));
17
18var _fs = _interopRequireDefault(require("fs"));
19
20var _nodeFetch = _interopRequireDefault(require("node-fetch"));
21
22var _path = _interopRequireDefault(require("path"));
23
24function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
26function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
27
28function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
29
30function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
31
32function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
33
34function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
35
36function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
37
38function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { keys.push.apply(keys, Object.getOwnPropertySymbols(object)); } if (enumerableOnly) keys = keys.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); return keys; }
39
40function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
41
42function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
43
44const d = (0, _debug.default)('electron-forge:publish:nucleus');
45
46class PublisherNucleus extends _publisherBase.default {
47 constructor(...args) {
48 super(...args);
49
50 _defineProperty(this, "name", 'nucleus');
51
52 _defineProperty(this, "collapseMakeResults", makeResults => {
53 const newMakeResults = [];
54 var _iteratorNormalCompletion = true;
55 var _didIteratorError = false;
56 var _iteratorError = undefined;
57
58 try {
59 for (var _iterator = makeResults[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
60 const result = _step.value;
61 const existingResult = newMakeResults.find(nResult => nResult.arch === result.arch && nResult.platform === result.platform && nResult.packageJSON.version === result.packageJSON.version);
62
63 if (existingResult) {
64 existingResult.artifacts.push(...result.artifacts);
65 } else {
66 newMakeResults.push(_objectSpread({}, result));
67 }
68 }
69 } catch (err) {
70 _didIteratorError = true;
71 _iteratorError = err;
72 } finally {
73 try {
74 if (!_iteratorNormalCompletion && _iterator.return != null) {
75 _iterator.return();
76 }
77 } finally {
78 if (_didIteratorError) {
79 throw _iteratorError;
80 }
81 }
82 }
83
84 return newMakeResults;
85 });
86 }
87
88 publish({
89 makeResults
90 }) {
91 var _this = this;
92
93 return _asyncToGenerator(function* () {
94 const config = _this.config;
95
96 const collapsedResults = _this.collapseMakeResults(makeResults);
97
98 var _iteratorNormalCompletion2 = true;
99 var _didIteratorError2 = false;
100 var _iteratorError2 = undefined;
101
102 try {
103 for (var _iterator2 = collapsedResults.entries()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
104 const _step2$value = _slicedToArray(_step2.value, 2),
105 resultIdx = _step2$value[0],
106 makeResult = _step2$value[1];
107
108 const msg = `Uploading result (${resultIdx + 1}/${collapsedResults.length})`;
109 d(msg);
110 yield (0, _asyncOra.asyncOra)(msg,
111 /*#__PURE__*/
112 _asyncToGenerator(function* () {
113 const data = new _formData.default();
114 data.append('platform', makeResult.platform);
115 data.append('arch', makeResult.arch);
116 data.append('version', makeResult.packageJSON.version);
117 let artifactIdx = 0;
118 var _iteratorNormalCompletion3 = true;
119 var _didIteratorError3 = false;
120 var _iteratorError3 = undefined;
121
122 try {
123 for (var _iterator3 = makeResult.artifacts[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
124 const artifactPath = _step3.value;
125 // Skip the RELEASES file, it is automatically generated on the server
126 // eslint-disable-next-line no-continue
127 if (_path.default.basename(artifactPath).toLowerCase() === 'releases') continue;
128 data.append(`file${artifactIdx}`, _fs.default.createReadStream(artifactPath));
129 artifactIdx += 1;
130 }
131 } catch (err) {
132 _didIteratorError3 = true;
133 _iteratorError3 = err;
134 } finally {
135 try {
136 if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
137 _iterator3.return();
138 }
139 } finally {
140 if (_didIteratorError3) {
141 throw _iteratorError3;
142 }
143 }
144 }
145
146 const response = yield (0, _nodeFetch.default)(`${config.host}/rest/app/${config.appId}/channel/${config.channelId}/upload`, {
147 headers: {
148 Authorization: config.token
149 },
150 method: 'POST',
151 body: data
152 });
153
154 if (response.status !== 200) {
155 throw new Error(`Unexpected response code from Nucleus: ${response.status}\n\nBody:\n${yield response.text()}`);
156 }
157 }));
158 }
159 } catch (err) {
160 _didIteratorError2 = true;
161 _iteratorError2 = err;
162 } finally {
163 try {
164 if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
165 _iterator2.return();
166 }
167 } finally {
168 if (_didIteratorError2) {
169 throw _iteratorError2;
170 }
171 }
172 }
173 })();
174 }
175
176}
177
178exports.default = PublisherNucleus;
179//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9QdWJsaXNoZXJOdWNsZXVzLnRzIl0sIm5hbWVzIjpbImQiLCJQdWJsaXNoZXJOdWNsZXVzIiwiUHVibGlzaGVyQmFzZSIsIm1ha2VSZXN1bHRzIiwibmV3TWFrZVJlc3VsdHMiLCJyZXN1bHQiLCJleGlzdGluZ1Jlc3VsdCIsImZpbmQiLCJuUmVzdWx0IiwiYXJjaCIsInBsYXRmb3JtIiwicGFja2FnZUpTT04iLCJ2ZXJzaW9uIiwiYXJ0aWZhY3RzIiwicHVzaCIsInB1Ymxpc2giLCJjb25maWciLCJjb2xsYXBzZWRSZXN1bHRzIiwiY29sbGFwc2VNYWtlUmVzdWx0cyIsImVudHJpZXMiLCJyZXN1bHRJZHgiLCJtYWtlUmVzdWx0IiwibXNnIiwibGVuZ3RoIiwiZGF0YSIsIkZvcm1EYXRhIiwiYXBwZW5kIiwiYXJ0aWZhY3RJZHgiLCJhcnRpZmFjdFBhdGgiLCJwYXRoIiwiYmFzZW5hbWUiLCJ0b0xvd2VyQ2FzZSIsImZzIiwiY3JlYXRlUmVhZFN0cmVhbSIsInJlc3BvbnNlIiwiaG9zdCIsImFwcElkIiwiY2hhbm5lbElkIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJ0b2tlbiIsIm1ldGhvZCIsImJvZHkiLCJzdGF0dXMiLCJFcnJvciIsInRleHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsTUFBTUEsQ0FBQyxHQUFHLG9CQUFNLGdDQUFOLENBQVY7O0FBRWUsTUFBTUMsZ0JBQU4sU0FBK0JDLHNCQUEvQixDQUFxRTtBQUFBO0FBQUE7O0FBQUEsa0NBQzNFLFNBRDJFOztBQUFBLGlEQUduREMsV0FBRCxJQUFrRDtBQUM5RSxZQUFNQyxjQUFrQyxHQUFHLEVBQTNDO0FBRDhFO0FBQUE7QUFBQTs7QUFBQTtBQUU5RSw2QkFBcUJELFdBQXJCLDhIQUFrQztBQUFBLGdCQUF2QkUsTUFBdUI7QUFDaEMsZ0JBQU1DLGNBQWMs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QUNTLE1BQVQsS0FBb0IsR0FBeEIsRUFBNkI7QUFDM0Isb0JBQU0sSUFBSUMsS0FBSixDQUFXLDBDQUF5Q1YsUUFBUSxDQUFDUyxNQUFPLGNBQTFELE1BQTZFVCxRQUFRLENBQUNXLElBQVQsRUFBZ0IsRUFBdkcsQ0FBTjtBQUNEO0FBQ0YsV0ExQkssRUFBTjtBQTJCRDtBQXBDOEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBcUNoRDs7QUF2RGlGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFB1Ymxpc2hlckJhc2UsIHsgUHVibGlzaGVyT3B0aW9ucyB9IGZyb20gJ0BlbGVjdHJvbi1mb3JnZS9wdWJsaXNoZXItYmFzZSc7XG5pbXBvcnQgeyBhc3luY09yYSB9IGZyb20gJ0BlbGVjdHJvbi1mb3JnZS9hc3luYy1vcmEnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBmZXRjaCBmcm9tICdub2RlLWZldGNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBQdWJsaXNoZXJOdWNsZXVzQ29uZmlnIH0gZnJvbSAnLi9Db25maWcnO1xuXG5jb25zdCBkID0gZGVidWcoJ2VsZWN0cm9uLWZvcmdlOnB1Ymxpc2g6bnVjbGV1cycpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQdWJsaXNoZXJOdWNsZXVzIGV4dGVuZHMgUHVibGlzaGVyQmFzZTxQdWJsaXNoZXJOdWNsZXVzQ29uZmlnPiB7XG4gIG5hbWUgPSAnbnVjbGV1cyc7XG5cbiAgcHJpdmF0ZSBjb2xsYXBzZU1ha2VSZXN1bHRzID0gKG1ha2VSZXN1bHRzOiBQdWJsaXNoZXJPcHRpb25zWydtYWtlUmVzdWx0cyddKSA9PiB7XG4gICAgY29uc3QgbmV3TWFrZVJlc3VsdHM6IHR5cGVvZiBtYWtlUmVzdWx0cyA9IFtdO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIG1ha2VSZXN1bHRzKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1Jlc3VsdCA9IG5ld01ha2VSZXN1bHRzLmZpbmQoblJlc3VsdCA9PiBuUmVzdWx0LmFyY2ggPT09IHJlc3VsdC5hcmNoXG4gICAgICAgICAgJiYgblJlc3VsdC5wbGF0Zm9ybSA9PT0gcmVzdWx0LnBsYXRmb3JtXG4gICAgICAgICAgJiYgblJlc3VsdC5wYWNrYWdlSlNPTi52ZXJzaW9uID09PSByZXN1bHQucGFja2FnZUpTT04udmVyc2lvbik7XG4gICAgICBpZiAoZXhpc3RpbmdSZXN1bHQpIHtcbiAgICAgICAgZXhpc3RpbmdSZXN1bHQuYXJ0aWZhY3RzLnB1c2goLi4ucmVzdWx0LmFydGlmYWN0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdNYWtlUmVzdWx0cy5wdXNoKHsgLi4ucmVzdWx0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3TWFrZVJlc3VsdHM7XG4gIH1cblxuICBhc3luYyBwdWJsaXNoKHsgbWFrZVJlc3VsdHMgfTogUHVibGlzaGVyT3B0aW9ucykge1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzO1xuXG4gICAgY29uc3QgY29sbGFwc2VkUmVzdWx0cyA9IHRoaXMuY29sbGFwc2VNYWtlUmVzdWx0cyhtYWtlUmVzdWx0cyk7XG5cbiAgICBmb3IgKGNvbnN0IFtyZXN1bHRJZHgsIG1ha2VSZXN1bHRdIG9mIGNvbGxhcHNlZFJlc3VsdHMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBtc2cgPSBgVXBsb2FkaW5nIHJlc3VsdCAoJHtyZXN1bHRJZHggKyAxfS8ke2NvbGxhcHNlZFJlc3VsdHMubGVuZ3RofSlgO1xuICAgICAgZChtc2cpO1xuXG4gICAgICBhd2FpdCBhc3luY09yYShtc2csIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBkYXRhLmFwcGVuZCgncGxhdGZvcm0nLCBtYWtlUmVzdWx0LnBsYXRmb3JtKTtcbiAgICAgICAgZGF0YS5hcHBlbmQoJ2FyY2gnLCBtYWtlUmVzdWx0LmFyY2gpO1xuICAgICAgICBkYXRhLmFwcGVuZCgndmVyc2lvbicsIG1ha2VSZXN1bHQucGFja2FnZUpTT04udmVyc2lvbik7XG5cbiAgICAgICAgbGV0IGFydGlmYWN0SWR4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBhcnRpZmFjdFBhdGggb2YgbWFrZVJlc3VsdC5hcnRpZmFjdHMpIHtcbiAgICAgICAgICAvLyBTa2lwIHRoZSBSRUxFQVNFUyBmaWxlLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBvbiB0aGUgc2VydmVyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgICAgaWYgKHBhdGguYmFzZW5hbWUoYXJ0aWZhY3RQYXRoKS50b0xvd2VyQ2FzZSgpID09PSAncmVsZWFzZXMnKSBjb250aW51ZTtcbiAgICAgICAgICBkYXRhLmFwcGVuZChgZmlsZSR7YXJ0aWZhY3RJZHh9YCwgZnMuY3JlYXRlUmVhZFN0cmVhbShhcnRpZmFjdFBhdGgpKTtcbiAgICAgICAgICBhcnRpZmFjdElkeCArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtjb25maWcuaG9zdH0vcmVzdC9hcHAvJHtjb25maWcuYXBwSWR9L2NoYW5uZWwvJHtjb25maWcuY2hhbm5lbElkfS91cGxvYWRgLCB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogY29uZmlnLnRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHJlc3BvbnNlIGNvZGUgZnJvbSBOdWNsZXVzOiAke3Jlc3BvbnNlLnN0YXR1c31cXG5cXG5Cb2R5OlxcbiR7YXdhaXQgcmVzcG9uc2UudGV4dCgpfWApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
\No newline at end of file