UNPKG

electron-builder

Version:

A complete solution to package and build a ready for distribution Electron app for MacOS, Windows and Linux with “auto update” support out of the box

210 lines (186 loc) 9.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GitHubPublisher = undefined; var _bluebirdLstC; function _load_bluebirdLstC() { return _bluebirdLstC = require("bluebird-lst-c"); } var _bluebirdLstC2; function _load_bluebirdLstC2() { return _bluebirdLstC2 = _interopRequireDefault(require("bluebird-lst-c")); } var _util; function _load_util() { return _util = require("../util/util"); } var _log; function _load_log() { return _log = require("../util/log"); } var _url; function _load_url() { return _url = require("url"); } var _mime; function _load_mime() { return _mime = _interopRequireDefault(require("mime")); } var _restApiRequest; function _load_restApiRequest() { return _restApiRequest = require("./restApiRequest"); } var _publisher; function _load_publisher() { return _publisher = require("./publisher"); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class GitHubPublisher extends (_publisher || _load_publisher()).Publisher { constructor(info, version) { let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; let isPublishOptionGuessed = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; super(); this.info = info; this.version = version; this.options = options; this.isPublishOptionGuessed = isPublishOptionGuessed; let token = info.token; if ((0, (_util || _load_util()).isEmptyOrSpaces)(token)) { token = process.env.GH_TOKEN; if ((0, (_util || _load_util()).isEmptyOrSpaces)(token)) { throw new Error(`GitHub Personal Access Token is not set, neither programmatically, nor using env "GH_TOKEN"`); } } this.token = token; this.options = options || {}; this.policy = this.options.publish || "always"; if (version.startsWith("v")) { throw new Error(`Version must not starts with "v": ${ version }`); } this.tag = info.vPrefixedTagName === false ? version : `v${ version }`; this._releasePromise = this.token === "__test__" ? (_bluebirdLstC2 || _load_bluebirdLstC2()).default.resolve(null) : this.init(); } get releasePromise() { return this._releasePromise; } init() { var _this = this; return (0, (_bluebirdLstC || _load_bluebirdLstC()).coroutine)(function* () { const createReleaseIfNotExists = _this.policy !== "onTagOrDraft"; // we don't use "Get a release by tag name" because "tag name" means existing git tag, but we draft release and don't create git tag const releases = yield (0, (_restApiRequest || _load_restApiRequest()).githubRequest)(`/repos/${ _this.info.owner }/${ _this.info.repo }/releases`, _this.token); for (let release of releases) { if (release.tag_name === _this.tag || release.tag_name === _this.version) { if (release.draft) { return release; } if (!_this.isPublishOptionGuessed && _this.policy === "onTag") { throw new Error(`Release with tag ${ _this.tag } must be a draft`); } const message = `Release with tag ${ _this.tag } is not a draft, artifacts will be not published`; if (_this.isPublishOptionGuessed || _this.policy === "onTagOrDraft") { (0, (_log || _load_log()).log)(message); } else { (0, (_log || _load_log()).warn)(message); } return null; } } if (createReleaseIfNotExists) { (0, (_log || _load_log()).log)(`Release with tag ${ _this.tag } doesn't exist, creating one`); return _this.createRelease(); } else { (0, (_log || _load_log()).log)(`Release with tag ${ _this.tag } doesn't exist, artifacts will be not published`); return null; } })(); } doUpload(fileName, dataLength, requestProcessor) { var _this2 = this; return (0, (_bluebirdLstC || _load_bluebirdLstC()).coroutine)(function* () { const release = yield _this2.releasePromise; if (release == null) { (0, (_util || _load_util()).debug)(`Release with tag ${ _this2.tag } doesn't exist and is not created, artifact ${ fileName } is not published`); return; } const parsedUrl = (0, (_url || _load_url()).parse)(release.upload_url.substring(0, release.upload_url.indexOf("{")) + "?name=" + fileName); let badGatewayCount = 0; uploadAttempt: for (let i = 0; i < 3; i++) { try { return yield (0, (_restApiRequest || _load_restApiRequest()).doApiRequest)({ hostname: parsedUrl.hostname, path: parsedUrl.path, method: "POST", headers: { Accept: "application/vnd.github.v3+json", "User-Agent": "electron-builder", "Content-Type": (_mime || _load_mime()).default.lookup(fileName), "Content-Length": dataLength } }, _this2.token, requestProcessor); } catch (e) { if (e instanceof (_restApiRequest || _load_restApiRequest()).HttpError) { if (e.response.statusCode === 422 && e.description != null && e.description.errors != null && e.description.errors[0].code === "already_exists") { // delete old artifact and re-upload (0, (_log || _load_log()).log)(`Artifact ${ fileName } already exists, overwrite one`); const assets = yield (0, (_restApiRequest || _load_restApiRequest()).githubRequest)(`/repos/${ _this2.info.owner }/${ _this2.info.repo }/releases/${ release.id }/assets`, _this2.token); for (let asset of assets) { if (asset.name === fileName) { yield (0, (_restApiRequest || _load_restApiRequest()).githubRequest)(`/repos/${ _this2.info.owner }/${ _this2.info.repo }/releases/assets/${ asset.id }`, _this2.token, null, "DELETE"); continue uploadAttempt; } } (0, (_log || _load_log()).log)(`Artifact ${ fileName } not found, trying to upload again`); continue; } else if (e.response.statusCode === 502 && badGatewayCount++ < 3) { continue; } } throw e; } } })(); } createRelease() { return (0, (_restApiRequest || _load_restApiRequest()).githubRequest)(`/repos/${ this.info.owner }/${ this.info.repo }/releases`, this.token, { tag_name: this.tag, name: this.version, draft: this.options.draft == null || this.options.draft, prerelease: this.options.prerelease != null && this.options.prerelease }); } // test only //noinspection JSUnusedGlobalSymbols getRelease() { var _this3 = this; return (0, (_bluebirdLstC || _load_bluebirdLstC()).coroutine)(function* () { return (0, (_restApiRequest || _load_restApiRequest()).githubRequest)(`/repos/${ _this3.info.owner }/${ _this3.info.repo }/releases/${ _this3._releasePromise.value().id }`, _this3.token); })(); } //noinspection JSUnusedGlobalSymbols deleteRelease() { var _this4 = this; return (0, (_bluebirdLstC || _load_bluebirdLstC()).coroutine)(function* () { if (!_this4._releasePromise.isFulfilled()) { return; } const release = _this4._releasePromise.value(); if (release == null) { return; } for (let i = 0; i < 3; i++) { try { return yield (0, (_restApiRequest || _load_restApiRequest()).githubRequest)(`/repos/${ _this4.info.owner }/${ _this4.info.repo }/releases/${ release.id }`, _this4.token, null, "DELETE"); } catch (e) { if (e instanceof (_restApiRequest || _load_restApiRequest()).HttpError && (e.response.statusCode === 405 || e.response.statusCode === 502)) { continue; } throw e; } } (0, (_log || _load_log()).warn)(`Cannot delete release ${ release.id }`); })(); } } exports.GitHubPublisher = GitHubPublisher; //# sourceMappingURL=gitHubPublisher.js.map