1 | ;
|
2 | var __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 | };
|
10 | var __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 | };
|
37 | var __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 | };
|
53 | var __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 | };
|
57 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
58 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
59 | };
|
60 | Object.defineProperty(exports, "__esModule", { value: true });
|
61 | var url_1 = require("url");
|
62 | var url_join_1 = __importDefault(require("url-join"));
|
63 | var make_hooks_1 = require("./utils/make-hooks");
|
64 | var filterLabel = function (commits, label) {
|
65 | return commits.filter(function (commit) { return commit.labels.includes(label); });
|
66 | };
|
67 | var 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 | }());
|
289 | exports.default = Changelog;
|
290 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NoYW5nZWxvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSwyQkFBMEI7QUFDMUIsc0RBQTRCO0FBSzVCLGlEQUF3RDtBQThCeEQsSUFBTSxXQUFXLEdBQUcsVUFBQyxPQUEwQixFQUFFLEtBQWE7SUFDNUQsT0FBQSxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQUEsTUFBTSxJQUFJLE9BQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQTdCLENBQTZCLENBQUM7QUFBdkQsQ0FBdUQsQ0FBQztBQUUxRDtJQUtFLG1CQUFZLE1BQWUsRUFBRSxPQUFxQztRQUNoRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLCtCQUFrQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsWUFBWSxHQUFHLHNCQUFzQixDQUFDO0lBQ3JFLENBQUM7SUFFRCxvQ0FBZ0IsR0FBaEI7UUFBQSxpQkFrQkM7UUFqQkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQUMsTUFBTSxFQUFFLE1BQU07WUFDN0QsT0FBQSxLQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFBbkMsQ0FBbUMsQ0FDcEMsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFDLE1BQU0sRUFBRSxJQUFJO1lBQy9ELElBQU0sWUFBWSxHQUNoQixNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FB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 |
\ | No newline at end of file |