UNPKG

62 kBJavaScriptView Raw
1"use strict";
2var __assign = (this && this.__assign) || function () {
3 __assign = Object.assign || function(t) {
4 for (var s, i = 1, n = arguments.length; i < n; i++) {
5 s = arguments[i];
6 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7 t[p] = s[p];
8 }
9 return t;
10 };
11 return __assign.apply(this, arguments);
12};
13var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14 return new (P || (P = Promise))(function (resolve, reject) {
15 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
18 step((generator = generator.apply(thisArg, _arguments || [])).next());
19 });
20};
21var __generator = (this && this.__generator) || function (thisArg, body) {
22 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24 function verb(n) { return function (v) { return step([n, v]); }; }
25 function step(op) {
26 if (f) throw new TypeError("Generator is already executing.");
27 while (_) try {
28 if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29 if (y = 0, t) op = [op[0] & 2, t.value];
30 switch (op[0]) {
31 case 0: case 1: t = op; break;
32 case 4: _.label++; return { value: op[1], done: false };
33 case 5: _.label++; y = op[1]; op = [0]; continue;
34 case 7: op = _.ops.pop(); _.trys.pop(); continue;
35 default:
36 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40 if (t[2]) _.ops.pop();
41 _.trys.pop(); continue;
42 }
43 op = body.call(thisArg, _);
44 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46 }
47};
48var __rest = (this && this.__rest) || function (s, e) {
49 var t = {};
50 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
51 t[p] = s[p];
52 if (s != null && typeof Object.getOwnPropertySymbols === "function")
53 for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
54 t[p[i]] = s[p[i]];
55 return t;
56};
57var __read = (this && this.__read) || function (o, n) {
58 var m = typeof Symbol === "function" && o[Symbol.iterator];
59 if (!m) return o;
60 var i = m.call(o), r, ar = [], e;
61 try {
62 while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
63 }
64 catch (error) { e = { error: error }; }
65 finally {
66 try {
67 if (r && !r.done && (m = i["return"])) m.call(i);
68 }
69 finally { if (e) throw e.error; }
70 }
71 return ar;
72};
73var __spread = (this && this.__spread) || function () {
74 for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
75 return ar;
76};
77var __importDefault = (this && this.__importDefault) || function (mod) {
78 return (mod && mod.__esModule) ? mod : { "default": mod };
79};
80var __importStar = (this && this.__importStar) || function (mod) {
81 if (mod && mod.__esModule) return mod;
82 var result = {};
83 if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
84 result["default"] = mod;
85 return result;
86};
87Object.defineProperty(exports, "__esModule", { value: true });
88var cosmiconfig_1 = __importDefault(require("cosmiconfig"));
89var deepmerge_1 = __importDefault(require("deepmerge"));
90var dotenv_1 = __importDefault(require("dotenv"));
91var is_ci_1 = __importDefault(require("is-ci"));
92var semver_1 = require("semver");
93var git_1 = __importDefault(require("./git"));
94var init_1 = __importDefault(require("./init"));
95var main_1 = require("./main");
96var release_1 = __importStar(require("./release"));
97var github_token_1 = __importDefault(require("./utils/github-token"));
98var load_plugins_1 = __importDefault(require("./utils/load-plugins"));
99var logger_1 = __importDefault(require("./utils/logger"));
100var make_hooks_1 = require("./utils/make-hooks");
101var try_require_1 = __importDefault(require("./utils/try-require"));
102var Auto = /** @class */ (function () {
103 function Auto(args) {
104 var _this = this;
105 this.prefixRelease = function (release) {
106 if (!_this.release) {
107 throw _this.createErrorMessage();
108 }
109 return _this.release.options.noVersionPrefix || release.startsWith('v')
110 ? release
111 : "v" + release;
112 };
113 this.args = args;
114 this.logger = logger_1.default(args.veryVerbose ? 'veryVerbose' : args.verbose ? 'verbose' : undefined);
115 this.hooks = make_hooks_1.makeHooks();
116 this.hooks.onCreateRelease.tap('Link onCreateChangelog', function (release) {
117 release.hooks.onCreateChangelog.tap('Link onCreateChangelog', function (changelog) {
118 _this.hooks.onCreateChangelog.call(changelog);
119 });
120 });
121 this.hooks.onCreateRelease.tap('Link onCreateLogParse', function (release) {
122 release.hooks.onCreateLogParse.tap('Link onCreateLogParse', function (logParse) {
123 _this.hooks.onCreateLogParse.call(logParse);
124 });
125 });
126 dotenv_1.default.config();
127 }
128 /**
129 * Loads a config from a path, package name, or special `auto-config` pattern
130 *
131 * ex: auto-config-MY_CONFIG
132 * ex: @MY_CONFIG/auto-config
133 *
134 * @param extend Path or name of config to find
135 */
136 Auto.prototype.loadExtendConfig = function (extend) {
137 var config = try_require_1.default(extend);
138 this.logger.verbose.note(extend + " found: " + config);
139 if (!config) {
140 var scope = extend + "/auto-config";
141 config = try_require_1.default(scope);
142 this.logger.verbose.note(scope + " found: " + config);
143 }
144 if (!config) {
145 var scope = "auto-config-" + extend;
146 config = try_require_1.default(scope);
147 this.logger.verbose.note(scope + " found: " + config);
148 }
149 if (typeof config === 'function') {
150 return config();
151 }
152 return config || {};
153 };
154 /**
155 * Load the .autorc from the file system, set up defaults, combine with CLI args
156 * load the extends property, load the plugins and start the git remote interface.
157 */
158 Auto.prototype.loadConfig = function () {
159 return __awaiter(this, void 0, void 0, function () {
160 var explorer, result, rawConfig, definitions, labels, skipReleaseLabels, config, repository, token, _a, githubOptions;
161 return __generator(this, function (_b) {
162 switch (_b.label) {
163 case 0:
164 explorer = cosmiconfig_1.default('auto');
165 return [4 /*yield*/, explorer.search()];
166 case 1:
167 result = _b.sent();
168 rawConfig = {};
169 if (result && result.config) {
170 rawConfig = result.config;
171 }
172 if (rawConfig.extends) {
173 rawConfig = deepmerge_1.default(rawConfig, this.loadExtendConfig(rawConfig.extends));
174 }
175 this.labels = release_1.defaultLabelDefinition;
176 if (rawConfig.labels) {
177 definitions = Object.entries(rawConfig.labels).map(function (_a) {
178 var _b = __read(_a, 2), label = _b[0], labelDef = _b[1];
179 var _c;
180 var definition = typeof labelDef === 'string' ? { name: labelDef } : labelDef;
181 if (!definition.name) {
182 definition.name = label;
183 }
184 return _c = {},
185 _c[label] = definition,
186 _c;
187 });
188 labels = Object.assign.apply(Object, __spread([{}], definitions));
189 this.labels = deepmerge_1.default(this.labels, labels);
190 }
191 this.semVerLabels = release_1.getVersionMap(this.labels);
192 this.logger.verbose.success('Using SEMVER labels:', '\n', this.semVerLabels);
193 skipReleaseLabels = rawConfig.skipReleaseLabels || [];
194 if (!skipReleaseLabels.includes(this.semVerLabels.get('skip-release'))) {
195 skipReleaseLabels.push(this.semVerLabels.get('skip-release'));
196 }
197 config = __assign({}, rawConfig, this.args, { labels: this.labels, skipReleaseLabels: skipReleaseLabels });
198 this.logger.verbose.success('Loaded `auto` with config:', rawConfig);
199 this.loadPlugins(config);
200 this.hooks.beforeRun.call(config);
201 return [4 /*yield*/, this.getRepo(config)];
202 case 2:
203 repository = _b.sent();
204 if (!(repository && repository.token)) return [3 /*break*/, 3];
205 _a = repository.token;
206 return [3 /*break*/, 5];
207 case 3: return [4 /*yield*/, github_token_1.default(config.githubApi)];
208 case 4:
209 _a = _b.sent();
210 _b.label = 5;
211 case 5:
212 token = _a;
213 githubOptions = __assign({ owner: config.owner, repo: config.repo }, repository, { token: token, baseUrl: config.githubApi || 'https://api.github.com' });
214 this.git = this.startGit(githubOptions);
215 this.release = new release_1.default(this.git, config, this.logger);
216 this.hooks.onCreateRelease.call(this.release);
217 return [2 /*return*/];
218 }
219 });
220 });
221 };
222 /**
223 * Interactive prompt for initializing an .autorc
224 */
225 Auto.prototype.init = function (options) {
226 if (options === void 0) { options = {}; }
227 return __awaiter(this, void 0, void 0, function () {
228 return __generator(this, function (_a) {
229 switch (_a.label) {
230 case 0: return [4 /*yield*/, init_1.default(options, this.logger)];
231 case 1:
232 _a.sent();
233 return [2 /*return*/];
234 }
235 });
236 });
237 };
238 /**
239 * Create all of the user's labels on the git remote if the don't already exist
240 *
241 * @param options Options for the createLabels functionality
242 */
243 Auto.prototype.createLabels = function (options) {
244 if (options === void 0) { options = {}; }
245 return __awaiter(this, void 0, void 0, function () {
246 return __generator(this, function (_a) {
247 switch (_a.label) {
248 case 0:
249 if (!this.release || !this.labels) {
250 throw this.createErrorMessage();
251 }
252 return [4 /*yield*/, this.release.addLabelsToProject(this.labels, options)];
253 case 1:
254 _a.sent();
255 return [2 /*return*/];
256 }
257 });
258 });
259 };
260 /**
261 * Get the labels on a specific PR. Defaults to the labels of the last merged PR
262 *
263 * @param options Options for the createLabels functionality
264 */
265 Auto.prototype.label = function (_a) {
266 var pr = (_a === void 0 ? {} : _a).pr;
267 return __awaiter(this, void 0, void 0, function () {
268 var labels, pulls, lastMerged;
269 return __generator(this, function (_b) {
270 switch (_b.label) {
271 case 0:
272 if (!this.git) {
273 throw this.createErrorMessage();
274 }
275 this.logger.verbose.info("Using command: 'label'");
276 labels = [];
277 if (!!pr) return [3 /*break*/, 2];
278 return [4 /*yield*/, this.git.getPullRequests({
279 state: 'closed'
280 })];
281 case 1:
282 pulls = _b.sent();
283 lastMerged = pulls
284 .sort(function (a, b) {
285 return new Date(b.merged_at).getTime() - new Date(a.merged_at).getTime();
286 })
287 .find(function (pull) { return !!pull.merged_at; });
288 if (lastMerged) {
289 labels = lastMerged.labels.map(function (label) { return label.name; });
290 }
291 return [3 /*break*/, 4];
292 case 2: return [4 /*yield*/, this.git.getLabels(pr)];
293 case 3:
294 labels = _b.sent();
295 _b.label = 4;
296 case 4:
297 if (labels.length) {
298 console.log(labels.join('\n'));
299 }
300 return [2 /*return*/];
301 }
302 });
303 });
304 };
305 /**
306 * Create a status on a PR.
307 *
308 * @param options Options for the pr status functionality
309 */
310 Auto.prototype.pr = function (_a) {
311 var dryRun = _a.dryRun, pr = _a.pr, url = _a.url, options = __rest(_a, ["dryRun", "pr", "url"]);
312 return __awaiter(this, void 0, void 0, function () {
313 var sha, res, target_url;
314 return __generator(this, function (_b) {
315 switch (_b.label) {
316 case 0:
317 if (!this.git) {
318 throw this.createErrorMessage();
319 }
320 sha = options.sha;
321 this.logger.verbose.info("Using command: 'pr'");
322 if (!(!sha && pr)) return [3 /*break*/, 2];
323 this.logger.verbose.info('Getting commit SHA from PR.');
324 return [4 /*yield*/, this.git.getPullRequest(pr)];
325 case 1:
326 res = _b.sent();
327 sha = res.data.head.sha;
328 return [3 /*break*/, 4];
329 case 2:
330 if (!!sha) return [3 /*break*/, 4];
331 this.logger.verbose.info('No PR found, getting commit SHA from HEAD.');
332 return [4 /*yield*/, this.git.getSha()];
333 case 3:
334 sha = _b.sent();
335 _b.label = 4;
336 case 4:
337 this.logger.verbose.info('Found PR SHA:', sha);
338 target_url = url;
339 if (!!dryRun) return [3 /*break*/, 6];
340 return [4 /*yield*/, this.git.createStatus(__assign({}, options, { sha: sha,
341 target_url: target_url }))];
342 case 5:
343 _b.sent();
344 this.logger.log.success('Posted status to Pull Request.');
345 return [3 /*break*/, 7];
346 case 6:
347 this.logger.verbose.info('`pr` dry run complete.');
348 _b.label = 7;
349 case 7:
350 this.logger.verbose.success('Finished `pr` command');
351 return [2 /*return*/];
352 }
353 });
354 });
355 };
356 /**
357 * Check that a PR has a SEMVER label. Set a success status on the PR.
358 *
359 * @param options Options for the pr check functionality
360 */
361 Auto.prototype.prCheck = function (_a) {
362 var dryRun = _a.dryRun, pr = _a.pr, url = _a.url, options = __rest(_a, ["dryRun", "pr", "url"]);
363 return __awaiter(this, void 0, void 0, function () {
364 var target_url, msg, sha, res, labels, labelTexts_1, releaseTag, skipReleaseTag, semverTag, description, error_1;
365 var _this = this;
366 return __generator(this, function (_b) {
367 switch (_b.label) {
368 case 0:
369 if (!this.git || !this.release || !this.semVerLabels) {
370 throw this.createErrorMessage();
371 }
372 this.logger.verbose.info("Using command: 'pr-check' for '" + url + "'");
373 target_url = url;
374 _b.label = 1;
375 case 1:
376 _b.trys.push([1, 4, , 5]);
377 return [4 /*yield*/, this.git.getPullRequest(pr)];
378 case 2:
379 res = _b.sent();
380 sha = res.data.head.sha;
381 return [4 /*yield*/, this.git.getLabels(pr)];
382 case 3:
383 labels = _b.sent();
384 labelTexts_1 = __spread(this.semVerLabels.values());
385 releaseTag = labels.find(function (l) { return l === 'release'; });
386 skipReleaseTag = labels.find(function (l) {
387 return !!_this.release && _this.release.options.skipReleaseLabels.includes(l);
388 });
389 semverTag = labels.find(function (l) {
390 return labelTexts_1.includes(l) &&
391 !!_this.release &&
392 !_this.release.options.skipReleaseLabels.includes(l) &&
393 l !== 'release';
394 });
395 if (semverTag === undefined && !skipReleaseTag) {
396 throw new Error('No semver label!');
397 }
398 this.logger.log.success("PR is using label: " + semverTag);
399 description = void 0;
400 if (skipReleaseTag) {
401 description = 'PR will not create a release';
402 }
403 else if (releaseTag) {
404 description = "PR will create release once merged - " + semverTag;
405 }
406 else {
407 description = "CI - " + semverTag;
408 }
409 msg = {
410 description: description,
411 state: 'success'
412 };
413 return [3 /*break*/, 5];
414 case 4:
415 error_1 = _b.sent();
416 msg = {
417 description: error_1.message,
418 state: 'error'
419 };
420 return [3 /*break*/, 5];
421 case 5:
422 this.logger.verbose.info('Posting comment to GitHub\n', msg);
423 if (!!dryRun) return [3 /*break*/, 7];
424 return [4 /*yield*/, this.git.createStatus(__assign({}, options, msg, { target_url: target_url,
425 sha: sha }))];
426 case 6:
427 _b.sent();
428 this.logger.log.success('Posted status to Pull Request.');
429 return [3 /*break*/, 8];
430 case 7:
431 this.logger.verbose.info('`pr-check` dry run complete.');
432 _b.label = 8;
433 case 8:
434 this.logger.verbose.success('Finished `pr-check` command');
435 return [2 /*return*/];
436 }
437 });
438 });
439 };
440 /**
441 * Comment on a PR. Only one comment will be present on the PR, Older comments are removed.
442 * You can use the "context" option to multiple comments on a PR.
443 *
444 * @param options Options for the comment functionality
445 */
446 Auto.prototype.comment = function (_a) {
447 var message = _a.message, pr = _a.pr, _b = _a.context, context = _b === void 0 ? 'default' : _b, dryRun = _a.dryRun;
448 return __awaiter(this, void 0, void 0, function () {
449 return __generator(this, function (_c) {
450 switch (_c.label) {
451 case 0:
452 if (!this.git) {
453 throw this.createErrorMessage();
454 }
455 this.logger.verbose.info("Using command: 'comment'");
456 if (!dryRun) return [3 /*break*/, 1];
457 this.logger.log.info("Would have commented on " + pr + " under \"" + context + "\" context:\n\n" + message);
458 return [3 /*break*/, 3];
459 case 1: return [4 /*yield*/, this.git.createComment(message, pr, context)];
460 case 2:
461 _c.sent();
462 this.logger.log.success("Commented on PR #" + pr);
463 _c.label = 3;
464 case 3: return [2 /*return*/];
465 }
466 });
467 });
468 };
469 /**
470 * Calculate the version bump for the current state of the repository.
471 */
472 Auto.prototype.version = function () {
473 return __awaiter(this, void 0, void 0, function () {
474 var bump;
475 return __generator(this, function (_a) {
476 switch (_a.label) {
477 case 0:
478 this.logger.verbose.info("Using command: 'version'");
479 return [4 /*yield*/, this.getVersion()];
480 case 1:
481 bump = _a.sent();
482 console.log(bump);
483 return [2 /*return*/];
484 }
485 });
486 });
487 };
488 /**
489 * Calculate the the changelog and commit it.
490 */
491 Auto.prototype.changelog = function (options) {
492 return __awaiter(this, void 0, void 0, function () {
493 return __generator(this, function (_a) {
494 switch (_a.label) {
495 case 0:
496 this.logger.verbose.info("Using command: 'changelog'");
497 return [4 /*yield*/, this.makeChangelog(options)];
498 case 1:
499 _a.sent();
500 return [2 /*return*/];
501 }
502 });
503 });
504 };
505 /**
506 * Make a release to the git remote with the changes.
507 */
508 Auto.prototype.runRelease = function (options) {
509 return __awaiter(this, void 0, void 0, function () {
510 return __generator(this, function (_a) {
511 switch (_a.label) {
512 case 0:
513 this.logger.verbose.info("Using command: 'release'");
514 return [4 /*yield*/, this.makeRelease(options)];
515 case 1:
516 _a.sent();
517 return [2 /*return*/];
518 }
519 });
520 });
521 };
522 /**
523 * Run the full workflow.
524 *
525 * 1. Calculate version
526 * 2. Make changelog
527 * 3. Publish code
528 * 4. Create a release
529 */
530 Auto.prototype.shipit = function (options) {
531 return __awaiter(this, void 0, void 0, function () {
532 var version, lastRelease, commitsInRelease, newVersion, current;
533 return __generator(this, function (_a) {
534 switch (_a.label) {
535 case 0:
536 if (!this.git || !this.release) {
537 throw this.createErrorMessage();
538 }
539 this.logger.verbose.info("Using command: 'shipit'");
540 this.hooks.beforeShipIt.call();
541 return [4 /*yield*/, this.getVersion()];
542 case 1:
543 version = _a.sent();
544 if (version === '') {
545 return [2 /*return*/];
546 }
547 return [4 /*yield*/, this.git.getLatestRelease()];
548 case 2:
549 lastRelease = _a.sent();
550 return [4 /*yield*/, this.release.getCommitsInRelease(lastRelease)];
551 case 3:
552 commitsInRelease = _a.sent();
553 return [4 /*yield*/, this.makeChangelog(options)];
554 case 4:
555 _a.sent();
556 if (!!options.dryRun) return [3 /*break*/, 9];
557 return [4 /*yield*/, this.hooks.version.promise(version)];
558 case 5:
559 _a.sent();
560 return [4 /*yield*/, this.hooks.afterVersion.promise()];
561 case 6:
562 _a.sent();
563 return [4 /*yield*/, this.hooks.publish.promise(version)];
564 case 7:
565 _a.sent();
566 return [4 /*yield*/, this.hooks.afterPublish.promise()];
567 case 8:
568 _a.sent();
569 _a.label = 9;
570 case 9: return [4 /*yield*/, this.makeRelease(options)];
571 case 10:
572 newVersion = _a.sent();
573 if (!options.dryRun) return [3 /*break*/, 12];
574 this.logger.log.warn("The version reported in the line above hasn't been incremneted during `dry-run`");
575 return [4 /*yield*/, this.getCurrentVersion(lastRelease)];
576 case 11:
577 current = _a.sent();
578 this.logger.log.warn("Published version would be " + semver_1.inc(current, version));
579 _a.label = 12;
580 case 12: return [4 /*yield*/, this.hooks.afterShipIt.promise(newVersion, commitsInRelease)];
581 case 13:
582 _a.sent();
583 return [2 /*return*/];
584 }
585 });
586 });
587 };
588 Auto.prototype.startGit = function (gitOptions) {
589 if (!gitOptions.owner || !gitOptions.repo || !gitOptions.token) {
590 throw new Error('Must set owner, repo, and GitHub token.');
591 }
592 this.logger.verbose.info('Options contain repo information.');
593 // So that --verbose can be used on public CIs
594 var tokenlessArgs = __assign({}, gitOptions, { token: "[Token starting with " + gitOptions.token.substring(0, 4) + "]" });
595 this.logger.verbose.info('Initializing GitHub API with:\n', tokenlessArgs);
596 return new git_1.default({
597 owner: gitOptions.owner,
598 repo: gitOptions.repo,
599 token: gitOptions.token,
600 baseUrl: gitOptions.baseUrl
601 }, this.logger);
602 };
603 Auto.prototype.getVersion = function () {
604 return __awaiter(this, void 0, void 0, function () {
605 var lastRelease;
606 return __generator(this, function (_a) {
607 switch (_a.label) {
608 case 0:
609 if (!this.git || !this.release) {
610 throw this.createErrorMessage();
611 }
612 return [4 /*yield*/, this.git.getLatestRelease()];
613 case 1:
614 lastRelease = _a.sent();
615 return [2 /*return*/, this.release.getSemverBump(lastRelease)];
616 }
617 });
618 });
619 };
620 Auto.prototype.getCurrentVersion = function (lastRelease) {
621 return __awaiter(this, void 0, void 0, function () {
622 var lastVersion;
623 var _this = this;
624 return __generator(this, function (_a) {
625 switch (_a.label) {
626 case 0:
627 this.hooks.getPreviousVersion.tap('None', function () {
628 _this.logger.veryVerbose.info('No previous release found, using 0.0.0 as previous version.');
629 return _this.prefixRelease('0.0.0');
630 });
631 return [4 /*yield*/, this.hooks.getPreviousVersion.promise(this.prefixRelease)];
632 case 1:
633 lastVersion = _a.sent();
634 if (lastRelease.match(/\d+\.\d+\.\d+/) && semver_1.gt(lastRelease, lastVersion)) {
635 this.logger.veryVerbose.info('Using latest release as previous version');
636 return [2 /*return*/, lastRelease];
637 }
638 return [2 /*return*/, lastVersion];
639 }
640 });
641 });
642 };
643 Auto.prototype.makeChangelog = function (_a) {
644 var _b = _a === void 0 ? {} : _a, dryRun = _b.dryRun, from = _b.from, to = _b.to, message = _b.message;
645 return __awaiter(this, void 0, void 0, function () {
646 var lastRelease, _c, releaseNotes, currentVersion;
647 return __generator(this, function (_d) {
648 switch (_d.label) {
649 case 0:
650 if (!this.release || !this.git) {
651 throw this.createErrorMessage();
652 }
653 return [4 /*yield*/, this.setGitUser()];
654 case 1:
655 _d.sent();
656 _c = from;
657 if (_c) return [3 /*break*/, 3];
658 return [4 /*yield*/, this.git.getLatestRelease()];
659 case 2:
660 _c = (_d.sent());
661 _d.label = 3;
662 case 3:
663 lastRelease = _c;
664 return [4 /*yield*/, this.release.generateReleaseNotes(lastRelease, to || undefined)];
665 case 4:
666 releaseNotes = _d.sent();
667 this.logger.log.info('New Release Notes\n', releaseNotes);
668 if (!!dryRun) return [3 /*break*/, 7];
669 return [4 /*yield*/, this.getCurrentVersion(lastRelease)];
670 case 5:
671 currentVersion = _d.sent();
672 return [4 /*yield*/, this.release.addToChangelog(releaseNotes, lastRelease, currentVersion, message)];
673 case 6:
674 _d.sent();
675 return [3 /*break*/, 8];
676 case 7:
677 this.logger.verbose.info('`changelog` dry run complete.');
678 _d.label = 8;
679 case 8: return [2 /*return*/];
680 }
681 });
682 });
683 };
684 Auto.prototype.makeRelease = function (_a) {
685 var _b = _a === void 0 ? {} : _a, dryRun = _b.dryRun, useVersion = _b.useVersion, slack = _b.slack;
686 return __awaiter(this, void 0, void 0, function () {
687 var lastRelease, releaseNotes, version, _c, prefixed;
688 return __generator(this, function (_d) {
689 switch (_d.label) {
690 case 0:
691 if (!this.release || !this.git) {
692 throw this.createErrorMessage();
693 }
694 return [4 /*yield*/, this.git.getLatestRelease()];
695 case 1:
696 lastRelease = _d.sent();
697 // Find base commit or latest release to generate the changelog to HEAD (new tag)
698 this.logger.veryVerbose.info("Using " + lastRelease + " as previous release.");
699 if (lastRelease.match(/\d+\.\d+\.\d+/)) {
700 lastRelease = this.prefixRelease(lastRelease);
701 }
702 this.logger.log.info('Last used release:', lastRelease);
703 return [4 /*yield*/, this.release.generateReleaseNotes(lastRelease)];
704 case 2:
705 releaseNotes = _d.sent();
706 this.logger.log.info("Using release notes:\n" + releaseNotes);
707 _c = useVersion;
708 if (_c) return [3 /*break*/, 4];
709 return [4 /*yield*/, this.getCurrentVersion(lastRelease)];
710 case 3:
711 _c = (_d.sent());
712 _d.label = 4;
713 case 4:
714 version = _c;
715 if (!version) {
716 this.logger.log.error('Could not calculate next version from last tag.');
717 return [2 /*return*/];
718 }
719 prefixed = this.prefixRelease(version);
720 this.logger.log.info("Publishing " + prefixed + " to GitHub.");
721 if (!!dryRun) return [3 /*break*/, 8];
722 return [4 /*yield*/, this.git.publish(releaseNotes, prefixed)];
723 case 5:
724 _d.sent();
725 if (!slack) return [3 /*break*/, 7];
726 this.logger.log.info('Posting release to slack');
727 return [4 /*yield*/, this.release.postToSlack(releaseNotes, prefixed)];
728 case 6:
729 _d.sent();
730 _d.label = 7;
731 case 7: return [3 /*break*/, 9];
732 case 8:
733 this.logger.verbose.info('Release dry run complete.');
734 _d.label = 9;
735 case 9: return [2 /*return*/, prefixed];
736 }
737 });
738 });
739 };
740 Auto.prototype.createErrorMessage = function () {
741 return new Error("Auto is not initialized! Make sure the have run Auto.loadConfig");
742 };
743 /**
744 * Set the git user to make releases and commit with.
745 */
746 Auto.prototype.setGitUser = function () {
747 return __awaiter(this, void 0, void 0, function () {
748 var error_2, _a, email, name, packageAuthor;
749 return __generator(this, function (_b) {
750 switch (_b.label) {
751 case 0:
752 _b.trys.push([0, 3, , 9]);
753 // If these values are not set git config will exit with an error
754 return [4 /*yield*/, main_1.execPromise('git', ['config', 'user.email'])];
755 case 1:
756 // If these values are not set git config will exit with an error
757 _b.sent();
758 return [4 /*yield*/, main_1.execPromise('git', ['config', 'user.name'])];
759 case 2:
760 _b.sent();
761 return [3 /*break*/, 9];
762 case 3:
763 error_2 = _b.sent();
764 if (!is_ci_1.default) {
765 this.logger.log.note("Detected local environment, will not set git user. This happens automatically in a CI environment.\n\nIf a command fails manually run:\n\n - git config user.email your@email.com\n - git config user.name \"Your Name\"");
766 return [2 /*return*/];
767 }
768 if (!this.release) {
769 return [2 /*return*/];
770 }
771 _a = this.release.options, email = _a.email, name = _a.name;
772 return [4 /*yield*/, this.hooks.getAuthor.promise()];
773 case 4:
774 packageAuthor = _b.sent();
775 email = packageAuthor ? packageAuthor.email : email;
776 name = packageAuthor ? packageAuthor.name : name;
777 if (!email) return [3 /*break*/, 6];
778 return [4 /*yield*/, main_1.execPromise('git', ['config', 'user.email', "\"" + email + "\""])];
779 case 5:
780 _b.sent();
781 _b.label = 6;
782 case 6:
783 if (!name) return [3 /*break*/, 8];
784 return [4 /*yield*/, main_1.execPromise('git', ['config', 'user.name', "\"" + name + "\""])];
785 case 7:
786 _b.sent();
787 _b.label = 8;
788 case 8: return [3 /*break*/, 9];
789 case 9: return [2 /*return*/];
790 }
791 });
792 });
793 };
794 Auto.prototype.getRepo = function (config) {
795 return __awaiter(this, void 0, void 0, function () {
796 return __generator(this, function (_a) {
797 if (config.owner && config.repo) {
798 return [2 /*return*/, config];
799 }
800 return [2 /*return*/, this.hooks.getRepository.promise()];
801 });
802 });
803 };
804 /**
805 * Apply all of the plugins in the config.
806 */
807 Auto.prototype.loadPlugins = function (config) {
808 var _this = this;
809 var pluginsPaths = config.plugins || ['npm'];
810 pluginsPaths
811 .map(function (plugin) {
812 return typeof plugin === 'string' ? [plugin, {}] : plugin;
813 })
814 .map(function (plugin) { return load_plugins_1.default(plugin, _this.logger); })
815 .filter(function (plugin) { return !!plugin; })
816 .forEach(function (plugin) {
817 _this.logger.verbose.info("Using " + plugin.name + " Plugin...");
818 plugin.apply(_this);
819 });
820 };
821 return Auto;
822}());
823exports.default = Auto;
824//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hdXRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDREQUFzQztBQUN0Qyx3REFBOEI7QUFDOUIsa0RBQXlCO0FBQ3pCLGdEQUF5QjtBQUN6QixpQ0FBOEM7QUFpQjlDLDhDQUFrRDtBQUNsRCxnREFBMEI7QUFFMUIsK0JBQXFDO0FBQ3JDLG1EQU9tQjtBQUVuQixzRUFBa0Q7QUFDbEQsc0VBQTJEO0FBQzNELDBEQUFvRDtBQUNwRCxpREFBK0M7QUFDL0Msb0VBQTZDO0FBa0M3QztJQVVFLGNBQVksSUFBYztRQUExQixpQkFzQkM7UUEyaEJnQixrQkFBYSxHQUFHLFVBQUMsT0FBZTtZQUMvQyxJQUFJLENBQUMsS0FBSSxDQUFDLE9BQU8sRUFBRTtnQkFDakIsTUFBTSxLQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUNqQztZQUVELE9BQU8sS0FBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUNwRSxDQUFDLENBQUMsT0FBTztnQkFDVCxDQUFDLENBQUMsTUFBSSxPQUFTLENBQUM7UUFDcEIsQ0FBQyxDQUFDO1FBeGpCQSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLGdCQUFTLENBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ3hFLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxHQUFHLHNCQUFTLEVBQUUsQ0FBQztRQUV6QixJ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
\No newline at end of file