-
Notifications
You must be signed in to change notification settings - Fork 10
/
releases_md.ts
99 lines (82 loc) · 2.48 KB
/
releases_md.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
import { GitLogOutput } from "./helpers.ts";
export class VersionReleaseText {
#fullText: string;
constructor(fullText: string) {
this.#fullText = fullText;
}
get fullText() {
return this.#fullText.trim();
}
get version() {
const version = /\b[0-9]+\.[0-9]+\.[0-9]+\b/.exec(this.#fullText);
if (version == null) {
throw new Error(`Could not find version in ${this.#fullText}.`);
}
return version[0];
}
}
/** Helpers for dealing with a Releases.md file. */
export class ReleasesMdFile {
#filePath: string;
#fileText: string;
constructor(filePath: string) {
this.#filePath = filePath;
this.#fileText = Deno.readTextFileSync(filePath);
}
get filePath() {
return this.#filePath;
}
get fileText() {
return this.#fileText;
}
updateWithGitLog(
{ gitLog, version, date }: {
gitLog: GitLogOutput;
version: string;
date?: Date;
},
) {
const insertText = getInsertText();
this.#updateText(this.#fileText.replace(/^### /m, insertText + "\n\n### "));
function getInsertText() {
const formattedGitLog = gitLog.formatForReleaseMarkdown();
const formattedDate = getFormattedDate(date ?? new Date());
return `### ${version} / ${formattedDate}\n\n` +
`${formattedGitLog}`;
function getFormattedDate(date: Date) {
const formattedMonth = padTwoDigit(date.getMonth() + 1);
const formattedDay = padTwoDigit(date.getDate());
return `${date.getFullYear()}.${formattedMonth}.${formattedDay}`;
function padTwoDigit(val: number) {
return val.toString().padStart(2, "0");
}
}
}
}
getLatestReleaseText() {
const version = this.getAllReleaseTexts().next().value;
if (version instanceof VersionReleaseText) {
return version;
} else {
throw new Error("Expected at least one version.");
}
}
*getAllReleaseTexts() {
const matches = this.#fileText.matchAll(/^### /mg);
let lastIndex = matches.next().value.index!;
for (const match of matches) {
yield new VersionReleaseText(
this.#fileText.substring(lastIndex, match.index!),
);
lastIndex = match.index;
}
yield new VersionReleaseText(
this.#fileText.substring(lastIndex, this.#fileText.length),
);
}
#updateText(newText: string) {
this.#fileText = newText;
Deno.writeTextFileSync(this.#filePath, this.#fileText);
}
}