1 | ;
|
2 | var __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 | };
|
13 | var __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 | };
|
21 | var __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 | };
|
48 | var __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 | };
|
57 | var __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 | };
|
73 | var __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 | };
|
77 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
78 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
79 | };
|
80 | var __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 | };
|
87 | Object.defineProperty(exports, "__esModule", { value: true });
|
88 | var cosmiconfig_1 = __importDefault(require("cosmiconfig"));
|
89 | var deepmerge_1 = __importDefault(require("deepmerge"));
|
90 | var dotenv_1 = __importDefault(require("dotenv"));
|
91 | var is_ci_1 = __importDefault(require("is-ci"));
|
92 | var semver_1 = require("semver");
|
93 | var git_1 = __importDefault(require("./git"));
|
94 | var init_1 = __importDefault(require("./init"));
|
95 | var main_1 = require("./main");
|
96 | var release_1 = __importStar(require("./release"));
|
97 | var github_token_1 = __importDefault(require("./utils/github-token"));
|
98 | var load_plugins_1 = __importDefault(require("./utils/load-plugins"));
|
99 | var logger_1 = __importDefault(require("./utils/logger"));
|
100 | var make_hooks_1 = require("./utils/make-hooks");
|
101 | var try_require_1 = __importDefault(require("./utils/try-require"));
|
102 | var 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 | }());
|
823 | exports.default = Auto;
|
824 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hdXRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDREQUFzQztBQUN0Qyx3REFBOEI7QUFDOUIsa0RBQXlCO0FBQ3pCLGdEQUF5QjtBQUN6QixpQ0FBOEM7QUFpQjlDLDhDQUFrRDtBQUNsRCxnREFBMEI7QUFFMUIsK0JBQXFDO0FBQ3JDLG1EQU9tQjtBQUVuQixzRUFBa0Q7QUFDbEQsc0VBQTJEO0FBQzNELDBEQUFvRDtBQUNwRCxpREFBK0M7QUFDL0Msb0VBQTZDO0FBa0M3QztJQVVFLGNBQVksSUFBYztRQUExQixpQkFzQkM7UUEyaEJnQixrQkFBYSxHQUFHLFVBQUMsT0FBZTtZQUMvQyxJQUFJLENBQUMsS0FBSSxDQUFDLE9BQU8sRUFBRTtnQkFDakIsTUFBTSxLQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUNqQztZQUVELE9BQU8sS0FBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUNwRSxDQUFDLENBQUMsT0FBTztnQkFDVCxDQUFDLENBQUMsTUFBSSxPQUFTLENBQUM7UUFDcEIsQ0FBQyxDQUFDO1FBeGpCQSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLGdCQUFTLENBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ3hFLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxHQUFHLHNCQUFTLEVBQUUsQ0FBQztRQUV6QixJ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 |
\ | No newline at end of file |