changelog-tool 0.7.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/.github/workflows/node.yml +1 -1
- package/changelog.md +20 -1
- package/changelog.mjs +17 -4
- package/package.json +8 -1
- package/parse.mjs +26 -1
- package/readme.md +3 -0
- package/test/parse.mjs +41 -1
package/changelog.md
CHANGED
@@ -1,6 +1,22 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
1.0.0 (2023-06-20)
|
5
|
+
------------------
|
6
|
+
|
7
|
+
First stable release! Just kidding, it was already stable.
|
8
|
+
|
9
|
+
* Add support for [Markdown reference links][1]. References are a Markdown
|
10
|
+
feature that lets you write links in paragraphs, but put the actual target
|
11
|
+
near the end of the document similar to references in technical documents.
|
12
|
+
This can declutter the reading experience for those reading the Markdown
|
13
|
+
sources. The tool doesn't let you quickly add links via the CLI yet, but it
|
14
|
+
will no longer mangle them when they appear.
|
15
|
+
* Testing Node 20
|
16
|
+
* Bugfix: Always insert an empty line between the 'preface' and bulletpoints
|
17
|
+
sections of a version block.
|
18
|
+
|
19
|
+
|
4
20
|
0.7.2 (2023-02-17)
|
5
21
|
------------------
|
6
22
|
|
@@ -70,4 +86,7 @@ Changelog
|
|
70
86
|
0.1.0 (2023-02-08)
|
71
87
|
------------------
|
72
88
|
|
73
|
-
* Implemented the 'help' and 'init' commands
|
89
|
+
* Implemented the 'help' and 'init' commands
|
90
|
+
|
91
|
+
[1]: https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#link "Markdown cheatsheet: Links"
|
92
|
+
|
package/changelog.mjs
CHANGED
@@ -10,13 +10,21 @@ export class Changelog {
|
|
10
10
|
*/
|
11
11
|
versions = [];
|
12
12
|
|
13
|
+
/**
|
14
|
+
* @type {Link[]}
|
15
|
+
*/
|
16
|
+
links = [];
|
17
|
+
|
13
18
|
toString() {
|
14
19
|
|
15
20
|
return (
|
16
21
|
this.title + '\n' +
|
17
22
|
('='.repeat(this.title.length)) + '\n' +
|
18
23
|
'\n' +
|
19
|
-
this.versions.map(version => version.toString()).join('\n\n')
|
24
|
+
this.versions.map(version => version.toString()).join('\n\n') +
|
25
|
+
|
26
|
+
// Sorry about this line future me (or someone else)
|
27
|
+
(this.links.length > 0 ? ('\n' + this.links.map( link => wrap(`[${link.name}]: ${link.href}${link.title?` "${link.title}"`:''}`, link.name.length+4)).join('\n') + '\n') : '')
|
20
28
|
);
|
21
29
|
|
22
30
|
}
|
@@ -133,7 +141,7 @@ export class VersionLog {
|
|
133
141
|
return (
|
134
142
|
title + '\n' +
|
135
143
|
('-'.repeat(title.length)) + '\n' +
|
136
|
-
(this.preface ? '\n' + wrap(this.preface, 0, lineLength) : '') +
|
144
|
+
(this.preface ? '\n' + wrap(this.preface, 0, lineLength) + '\n' : '') +
|
137
145
|
'\n' +
|
138
146
|
this.items.map(version => version.output(lineWrap)).join('\n') +
|
139
147
|
'\n' +
|
@@ -147,7 +155,7 @@ export class VersionLog {
|
|
147
155
|
export class LogItem {
|
148
156
|
|
149
157
|
/**
|
150
|
-
* @type string
|
158
|
+
* @type {string}
|
151
159
|
*/
|
152
160
|
message;
|
153
161
|
|
@@ -177,4 +185,9 @@ export class LogItem {
|
|
177
185
|
|
178
186
|
}
|
179
187
|
|
180
|
-
|
188
|
+
/**
|
189
|
+
* @typedef Link {Object}
|
190
|
+
* @property Link.href {string}
|
191
|
+
* @property Link.name {string}
|
192
|
+
* @property Link.title {string|null}
|
193
|
+
*/
|
package/package.json
CHANGED
@@ -1,13 +1,20 @@
|
|
1
1
|
{
|
2
2
|
"name": "changelog-tool",
|
3
|
-
"version": "0.
|
3
|
+
"version": "1.0.0",
|
4
4
|
"description": "A CLI tool for manipulating changelogs",
|
5
5
|
"type": "module",
|
6
6
|
"main": "index.mjs",
|
7
|
+
"homepage": "https://github.com/evert/changelog-tool",
|
8
|
+
"author": "Evert Pot (https://evertpot.com/)",
|
9
|
+
"license": "MIT",
|
7
10
|
"scripts": {
|
8
11
|
"test": "node --test",
|
9
12
|
"watch": "tsc --watch"
|
10
13
|
},
|
14
|
+
"repository": {
|
15
|
+
"type": "git",
|
16
|
+
"url": "git@github.com:evert/changelog-tool.git"
|
17
|
+
},
|
11
18
|
"keywords": [
|
12
19
|
"changelog",
|
13
20
|
"markdown"
|
package/parse.mjs
CHANGED
@@ -14,6 +14,10 @@ export async function parseFile(filename) {
|
|
14
14
|
|
15
15
|
}
|
16
16
|
|
17
|
+
const linkReferenceRe = /^\[([a-zA-Z0-9])+\]:/;
|
18
|
+
const versionRe = /^([0-9\.]{3,}(?:-(?:alpha|beta)\.[0-9]+)?) \(([0-9]{4}-[0-9]{2}-[0-9]{2}|\?\?\?\?-\?\?-\?\?)\)$/;
|
19
|
+
|
20
|
+
|
17
21
|
/**
|
18
22
|
* @param {string} changelogInput
|
19
23
|
* @returns {Changelog}
|
@@ -51,10 +55,31 @@ export function parse(changelogInput) {
|
|
51
55
|
continue;
|
52
56
|
}
|
53
57
|
|
58
|
+
// Look for link references
|
59
|
+
if (linkReferenceRe.test(line)) {
|
60
|
+
|
61
|
+
let linkRefLine = line;
|
62
|
+
while(lines[idx+1]?.match(/^\W\W/)) {
|
63
|
+
// If the line was folded over multiple lines, read those too.
|
64
|
+
linkRefLine += ' ' + lines[idx+1].trim();
|
65
|
+
idx++;
|
66
|
+
}
|
67
|
+
const name = linkRefLine.match(linkReferenceRe)?.[1];
|
68
|
+
const href = linkRefLine.split(' ')[1];
|
69
|
+
const title = linkRefLine.includes('"') ? linkRefLine.substring(linkRefLine.indexOf('"')+1,linkRefLine.lastIndexOf('"')) : null;
|
70
|
+
changelog.links.push({
|
71
|
+
name: /** @type {string} */(name),
|
72
|
+
href,
|
73
|
+
title
|
74
|
+
});
|
75
|
+
continue;
|
76
|
+
|
77
|
+
}
|
78
|
+
|
54
79
|
// Look to the next line for ----
|
55
80
|
if (lines[idx+1]?.match(/^-{1,}$/)) {
|
56
81
|
// Found a new Version
|
57
|
-
const matches = line.match(
|
82
|
+
const matches = line.match(versionRe);
|
58
83
|
|
59
84
|
if (!matches) {
|
60
85
|
throw new Error(`A version title must have the format "1.0.0 (YYYY-MM-DD)" or "1.0.0 (????-??-??)" for unreleased versions. We found: "${line}"`);
|
package/readme.md
CHANGED
package/test/parse.mjs
CHANGED
@@ -83,7 +83,6 @@ Well, that's all folks.
|
|
83
83
|
*
|
84
84
|
`;
|
85
85
|
|
86
|
-
debugger;
|
87
86
|
const result = await parse(input);
|
88
87
|
|
89
88
|
const latest = result.get('0.2.0');
|
@@ -93,3 +92,44 @@ Well, that's all folks.
|
|
93
92
|
|
94
93
|
|
95
94
|
});
|
95
|
+
|
96
|
+
test('Link references', async() => {
|
97
|
+
|
98
|
+
|
99
|
+
const input = `Changesss
|
100
|
+
=========
|
101
|
+
|
102
|
+
0.2.0 (????-??-??)
|
103
|
+
------------------
|
104
|
+
|
105
|
+
WOW another release. How good is that?
|
106
|
+
Here's another line.
|
107
|
+
|
108
|
+
* Implemented the 'list' command.
|
109
|
+
* Added testing framework. See [the blog post][1] for more information.
|
110
|
+
|
111
|
+
0.1.0 (2023-02-08)
|
112
|
+
------------------
|
113
|
+
|
114
|
+
* Implemented the ['help'][2] and 'init' commands.
|
115
|
+
|
116
|
+
[1]: https://evertpot.com/ "My Blog"
|
117
|
+
[2]: https://indieweb.social/@evert "My Mastodon account, but it's split
|
118
|
+
over two lines"
|
119
|
+
`;
|
120
|
+
|
121
|
+
debugger;
|
122
|
+
const result = await parse(input);
|
123
|
+
|
124
|
+
assert.deepEqual({
|
125
|
+
name: '1',
|
126
|
+
href: 'https://evertpot.com/',
|
127
|
+
title: 'My Blog',
|
128
|
+
}, result.links[0]);
|
129
|
+
assert.deepEqual({
|
130
|
+
name: '2',
|
131
|
+
href: 'https://indieweb.social/@evert',
|
132
|
+
title: 'My Mastodon account, but it\'s split over two lines',
|
133
|
+
}, result.links[1]);
|
134
|
+
|
135
|
+
});
|