UNPKG

24.1 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 return new (P || (P = Promise))(function (resolve, reject) {
4 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
7 step((generator = generator.apply(thisArg, _arguments || [])).next());
8 });
9};
10var __generator = (this && this.__generator) || function (thisArg, body) {
11 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13 function verb(n) { return function (v) { return step([n, v]); }; }
14 function step(op) {
15 if (f) throw new TypeError("Generator is already executing.");
16 while (_) try {
17 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;
18 if (y = 0, t) op = [op[0] & 2, t.value];
19 switch (op[0]) {
20 case 0: case 1: t = op; break;
21 case 4: _.label++; return { value: op[1], done: false };
22 case 5: _.label++; y = op[1]; op = [0]; continue;
23 case 7: op = _.ops.pop(); _.trys.pop(); continue;
24 default:
25 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29 if (t[2]) _.ops.pop();
30 _.trys.pop(); continue;
31 }
32 op = body.call(thisArg, _);
33 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35 }
36};
37var __read = (this && this.__read) || function (o, n) {
38 var m = typeof Symbol === "function" && o[Symbol.iterator];
39 if (!m) return o;
40 var i = m.call(o), r, ar = [], e;
41 try {
42 while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
43 }
44 catch (error) { e = { error: error }; }
45 finally {
46 try {
47 if (r && !r.done && (m = i["return"])) m.call(i);
48 }
49 finally { if (e) throw e.error; }
50 }
51 return ar;
52};
53var __spread = (this && this.__spread) || function () {
54 for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
55 return ar;
56};
57var __importDefault = (this && this.__importDefault) || function (mod) {
58 return (mod && mod.__esModule) ? mod : { "default": mod };
59};
60Object.defineProperty(exports, "__esModule", { value: true });
61var url_1 = require("url");
62var url_join_1 = __importDefault(require("url-join"));
63var make_hooks_1 = require("./utils/make-hooks");
64var filterLabel = function (commits, label) {
65 return commits.filter(function (commit) { return commit.labels.includes(label); });
66};
67var Changelog = /** @class */ (function () {
68 function Changelog(logger, options) {
69 this.logger = logger;
70 this.options = options;
71 this.hooks = make_hooks_1.makeChangelogHooks();
72 this.options.changelogTitles.pushToMaster = '⚠️ Pushed to master';
73 }
74 Changelog.prototype.loadDefaultHooks = function () {
75 var _this = this;
76 this.hooks.renderChangelogAuthor.tap('Default', function (author, commit) {
77 return _this.createUserLink(author, commit);
78 });
79 this.hooks.renderChangelogAuthorLine.tap('Default', function (author, user) {
80 var authorString = author.name && user ? author.name + " (" + user + ")" : user;
81 return authorString ? "- " + authorString : undefined;
82 });
83 this.hooks.renderChangelogLine.tapPromise('Default', function (currCommits, renderLine) { return __awaiter(_this, void 0, void 0, function () {
84 var _this = this;
85 return __generator(this, function (_a) {
86 return [2 /*return*/, Promise.all(currCommits.map(function (commit) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
87 return [2 /*return*/, renderLine(commit)];
88 }); }); }))];
89 });
90 }); });
91 this.hooks.renderChangelogTitle.tap('Default', function (label, changelogTitles) { return "#### " + changelogTitles[label] + "\n"; });
92 };
93 // Every Commit will either be a PR, jira story, or push to master (patch)
94 Changelog.prototype.generateReleaseNotes = function (commits) {
95 return __awaiter(this, void 0, void 0, function () {
96 var split, sections, result;
97 return __generator(this, function (_a) {
98 switch (_a.label) {
99 case 0:
100 if (commits.length === 0) {
101 return [2 /*return*/, ''];
102 }
103 this.logger.verbose.info('Generating release notes for:\n', commits);
104 split = this.splitCommits(commits);
105 this.logger.verbose.info('Split commits into groups');
106 this.logger.veryVerbose.info('\n', split);
107 sections = [];
108 return [4 /*yield*/, this.createLabelSection(split, sections)];
109 case 1:
110 _a.sent();
111 this.logger.verbose.info('Added groups to changelog');
112 return [4 /*yield*/, this.createAuthorSection(split, sections)];
113 case 2:
114 _a.sent();
115 this.logger.verbose.info('Added authors to changelog');
116 result = sections.join('\n\n');
117 this.logger.verbose.info('Successfully generated release notes.');
118 return [2 /*return*/, result];
119 }
120 });
121 });
122 };
123 Changelog.prototype.createUserLink = function (author, commit) {
124 var githubUrl = new url_1.URL(this.options.baseUrl).origin;
125 if (author.username === 'invalid-email-address') {
126 return;
127 }
128 return author.username
129 ? "[@" + author.username + "](" + url_join_1.default(githubUrl, author.username) + ")"
130 : author.email || commit.authorEmail;
131 };
132 /**
133 * Split commits into changelogTitle sections.
134 */
135 Changelog.prototype.splitCommits = function (commits) {
136 var _this = this;
137 var currentCommits = __spread(commits);
138 commits
139 .filter(function (commit) { return commit.labels.length === 0; })
140 .map(function (commit) { return commit.labels.push('patch'); });
141 return Object.assign.apply(Object, __spread([{}], Object.keys(this.options.changelogTitles).map(function (label) {
142 var _a;
143 var matchedCommits = filterLabel(currentCommits, _this.options.versionLabels.get(label) || label);
144 if (matchedCommits.length === 0) {
145 return {};
146 }
147 currentCommits = currentCommits.filter(function (commit) { return !matchedCommits.includes(commit); });
148 return _a = {},
149 _a[label] = matchedCommits,
150 _a;
151 })));
152 };
153 Changelog.prototype.createUserLinkList = function (commit) {
154 return __awaiter(this, void 0, void 0, function () {
155 var result;
156 var _this = this;
157 return __generator(this, function (_a) {
158 switch (_a.label) {
159 case 0:
160 result = new Set();
161 return [4 /*yield*/, Promise.all(commit.authors.map(function (author) { return __awaiter(_this, void 0, void 0, function () {
162 var link;
163 return __generator(this, function (_a) {
164 switch (_a.label) {
165 case 0: return [4 /*yield*/, this.hooks.renderChangelogAuthor.promise(author, commit, this.options)];
166 case 1:
167 link = _a.sent();
168 if (link) {
169 result.add(link);
170 }
171 return [2 /*return*/];
172 }
173 });
174 }); }))];
175 case 1:
176 _a.sent();
177 return [2 /*return*/, __spread(result).join(' ')];
178 }
179 });
180 });
181 };
182 Changelog.prototype.generateCommitNote = function (commit) {
183 return __awaiter(this, void 0, void 0, function () {
184 var jira, pr, link, prLink, user;
185 return __generator(this, function (_a) {
186 switch (_a.label) {
187 case 0:
188 jira = '';
189 pr = '';
190 if (commit.jira && this.options.jira) {
191 link = url_join_1.default.apply(void 0, __spread([this.options.jira], commit.jira.number));
192 jira = "[" + commit.jira.number + "](" + link + "): ";
193 }
194 if (commit.pullRequest) {
195 prLink = url_join_1.default(this.options.baseUrl, 'pull', commit.pullRequest.number.toString());
196 pr = "[#" + commit.pullRequest.number + "](" + prLink + ")";
197 }
198 return [4 /*yield*/, this.createUserLinkList(commit)];
199 case 1:
200 user = _a.sent();
201 return [2 /*return*/, "- " + jira + commit.subject.trim() + " " + pr + (user ? " (" + user + ")" : '')];
202 }
203 });
204 });
205 };
206 Changelog.prototype.createAuthorSection = function (split, sections) {
207 return __awaiter(this, void 0, void 0, function () {
208 var authors, commits, authorSection;
209 var _this = this;
210 return __generator(this, function (_a) {
211 switch (_a.label) {
212 case 0:
213 authors = new Set();
214 commits = Object.values(split).reduce(function (labeledCommits, sectionCommits) { return __spread(labeledCommits, sectionCommits); }, []);
215 return [4 /*yield*/, Promise.all(commits.map(function (commit) { return __awaiter(_this, void 0, void 0, function () {
216 var _this = this;
217 return __generator(this, function (_a) {
218 commit.authors.map(function (author) { return __awaiter(_this, void 0, void 0, function () {
219 var user, authorEntry;
220 return __generator(this, function (_a) {
221 switch (_a.label) {
222 case 0:
223 if (author.username === 'invalid-email-address') {
224 return [2 /*return*/];
225 }
226 return [4 /*yield*/, this.hooks.renderChangelogAuthor.promise(author, commit, this.options)];
227 case 1:
228 user = _a.sent();
229 return [4 /*yield*/, this.hooks.renderChangelogAuthorLine.promise(author, user)];
230 case 2:
231 authorEntry = _a.sent();
232 if (authorEntry && !authors.has(authorEntry)) {
233 authors.add(authorEntry);
234 }
235 return [2 /*return*/];
236 }
237 });
238 }); });
239 return [2 /*return*/];
240 });
241 }); }))];
242 case 1:
243 _a.sent();
244 if (authors.size > 0) {
245 authorSection = "#### Authors: " + authors.size + "\n\n";
246 authorSection += __spread(authors).join('\n');
247 sections.push(authorSection);
248 }
249 return [2 /*return*/];
250 }
251 });
252 });
253 };
254 Changelog.prototype.createLabelSection = function (split, sections) {
255 return __awaiter(this, void 0, void 0, function () {
256 var _this = this;
257 return __generator(this, function (_a) {
258 switch (_a.label) {
259 case 0: return [4 /*yield*/, Promise.all(Object.entries(split).map(function (_a) {
260 var _b = __read(_a, 2), label = _b[0], labelCommits = _b[1];
261 return __awaiter(_this, void 0, void 0, function () {
262 var title, lines;
263 var _this = this;
264 return __generator(this, function (_c) {
265 switch (_c.label) {
266 case 0: return [4 /*yield*/, this.hooks.renderChangelogTitle.promise(label, this.options.changelogTitles)];
267 case 1:
268 title = _c.sent();
269 return [4 /*yield*/, this.hooks.renderChangelogLine.promise(labelCommits, function (commit) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
270 return [2 /*return*/, this.generateCommitNote(commit)];
271 }); }); })];
272 case 2:
273 lines = _c.sent();
274 sections.push(__spread([title], lines).join('\n'));
275 return [2 /*return*/];
276 }
277 });
278 });
279 }))];
280 case 1:
281 _a.sent();
282 return [2 /*return*/];
283 }
284 });
285 });
286 };
287 return Changelog;
288}());
289exports.default = Changelog;
290//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NoYW5nZWxvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSwyQkFBMEI7QUFDMUIsc0RBQTRCO0FBSzVCLGlEQUF3RDtBQThCeEQsSUFBTSxXQUFXLEdBQUcsVUFBQyxPQUEwQixFQUFFLEtBQWE7SUFDNUQsT0FBQSxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQUEsTUFBTSxJQUFJLE9BQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQTdCLENBQTZCLENBQUM7QUFBdkQsQ0FBdUQsQ0FBQztBQUUxRDtJQUtFLG1CQUFZLE1BQWUsRUFBRSxPQUFxQztRQUNoRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLCtCQUFrQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsWUFBWSxHQUFHLHNCQUFzQixDQUFDO0lBQ3JFLENBQUM7SUFFRCxvQ0FBZ0IsR0FBaEI7UUFBQSxpQkFrQkM7UUFqQkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQUMsTUFBTSxFQUFFLE1BQU07WUFDN0QsT0FBQSxLQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFBbkMsQ0FBbUMsQ0FDcEMsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFDLE1BQU0sRUFBRSxJQUFJO1lBQy9ELElBQU0sWUFBWSxHQUNoQixNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FB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
\No newline at end of file