changelog-tool 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
package/changelog.md CHANGED
@@ -1,6 +1,23 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ 0.5.0 (2023-02-12)
5
+ ------------------
6
+
7
+ * Support changing the version to the next major/minor using the `--major` and
8
+ `--minor` arguments.
9
+ * The `add` command now uses the -m argument instead of a positional for the
10
+ message.
11
+ * bla
12
+ * bla
13
+
14
+
15
+ 0.4.1 (2023-02-12)
16
+ ------------------
17
+
18
+ * Make sure that the binary is executable
19
+
20
+
4
21
  0.4.0 (2023-02-12)
5
22
  ------------------
6
23
 
package/changelog.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { wrap } from './util.mjs';
1
+ import { calculateNextVersion, wrap } from './util.mjs';
2
2
 
3
3
  // @ts-check
4
4
  export class Changelog {
@@ -38,21 +38,14 @@ export class Changelog {
38
38
  * Adds a new version to the log. Version string is automatically increased
39
39
  * from the previous one
40
40
  *
41
+ * @params {'patch'|'minor'|'major'} changeType
41
42
  * @returns {VersionLog}
42
43
  */
43
- newVersion() {
44
+ newVersion(changeType = 'patch') {
44
45
 
45
- const lastVersionStr = this.versions[0].version;
46
- const lastVersionParts = lastVersionStr.split('.');
47
- if (!lastVersionParts.at(-1)?.match(/^[0-9]+$/)) {
48
- throw new Error(`Could not automatically determine the next version string after "${lastVersionStr}"`);
49
- }
50
- const newVersionStr = [
51
- ...lastVersionParts.slice(0, -1),
52
- // @ts-ignore-error 'Possibly udefined', but we know it isnt
53
- parseInt(lastVersionParts.at(-1)) + 1
54
- ].join('.');
55
- const versionLog = new VersionLog(newVersionStr);
46
+ const lastVersion = this.versions[0].version;
47
+ const newVersion = calculateNextVersion(lastVersion);
48
+ const versionLog = new VersionLog(newVersion);
56
49
 
57
50
  return this.add(versionLog);
58
51
 
package/cli.mjs CHANGED
@@ -1,8 +1,9 @@
1
+ #!/usr/bin/env node
1
2
  // @ts-check
2
3
  import { parseArgs } from 'node:util';
3
4
  import * as fs from 'node:fs/promises';
4
5
  import * as url from 'node:url';
5
- import { readPackageVersion, exists } from './util.mjs';
6
+ import { readPackageVersion, exists, calculateNextVersion } from './util.mjs';
6
7
  import { Changelog, VersionLog, LogItem } from './changelog.mjs';
7
8
  import { parseFile } from './parse.mjs';
8
9
 
@@ -30,6 +31,23 @@ async function main() {
30
31
  default: false,
31
32
  description: 'Show all versions',
32
33
  },
34
+ message: {
35
+ type: 'string',
36
+ description: 'Changelog message',
37
+ short: 'm'
38
+ },
39
+ patch: {
40
+ type: 'boolean',
41
+ description: 'Indicates that the current change is a patch-level change.',
42
+ },
43
+ minor: {
44
+ type: 'boolean',
45
+ description: 'Indicates that the current change is a minor change.',
46
+ },
47
+ major: {
48
+ type: 'boolean',
49
+ description: 'Indicates that the current change is a major change.',
50
+ },
33
51
  },
34
52
  allowPositionals: true,
35
53
  });
@@ -51,10 +69,21 @@ async function main() {
51
69
  await init();
52
70
  break;
53
71
  case 'add' :
54
- if (positionals.length < 2) {
55
- throw new Error('The "message" argument must be specified with the "add" command');
72
+ /** @type {'major' | 'minor' | 'patch'} */
73
+ let changeType = 'patch';
74
+ if (values.minor) {
75
+ changeType = 'minor';
76
+ }
77
+ if (values.major) {
78
+ changeType = 'major';
79
+ }
80
+ if (!values.message) {
81
+ throw new Error('The "-m" or "-message" argument is required');
56
82
  }
57
- await add(positionals.slice(1).join(' '));
83
+ await add({
84
+ message: values.message,
85
+ changeType,
86
+ });
58
87
  break;
59
88
  case 'release' :
60
89
  await release();
@@ -91,13 +120,13 @@ Manipulate your changelog file
91
120
 
92
121
  Usage:
93
122
 
94
- changelog init - Create a new, empty changelog.
95
- changelog add [message] - Adds a new line to the changelog.
96
- changelog release - Marks the current changelog as released.
97
- changelog show - Show the last changelog.
98
- changelog show [version] - Show the changelog of a specific version.
99
- changelog list - List all versions in the changelog.
100
- changelog format - Reformats the changelog in the standard format.
123
+ changelog init - Create a new, empty changelog.
124
+ changelog add -m [message] - Adds a new line to the changelog.
125
+ changelog release - Marks the current changelog as released.
126
+ changelog show - Show the last changelog.
127
+ changelog show [version] - Show the changelog of a specific version.
128
+ changelog list - List all versions in the changelog.
129
+ changelog format - Reformats the changelog in the standard format.
101
130
 
102
131
  The logs this tool uses follows a specific markdown format. Currently it will
103
132
  only look for a file named 'changelog.md' in the current directory.
@@ -169,16 +198,28 @@ async function format() {
169
198
  }
170
199
 
171
200
  /**
172
- * @param {string} message
201
+ * @param {Object} options
202
+ * @param {string} options.message
203
+ * @param {'patch'|'major'|'minor'} options.changeType
173
204
  */
174
- async function add(message) {
205
+ async function add({message, changeType}) {
175
206
  const changelog = await parseChangelog();
176
207
 
177
208
  let lastVersion = changelog.versions[0];
178
209
  if (lastVersion.date) {
179
- lastVersion = changelog.newVersion();
210
+ lastVersion = changelog.newVersion(changeType);
180
211
  console.log('Creating new version: %s', lastVersion.version);
212
+ } else {
213
+ if (changeType === 'minor' || changeType === 'major') {
214
+ const previousVersion = changelog.versions[1];
215
+ const updatedVersionStr = calculateNextVersion(previousVersion.version, changeType);
216
+ if (updatedVersionStr !== lastVersion.version) {
217
+ console.log('Updating unreleased version from %s to %s', lastVersion.version, updatedVersionStr);
218
+ lastVersion.version = updatedVersionStr;
219
+ }
220
+ }
181
221
  }
222
+
182
223
  lastVersion.add(message);
183
224
 
184
225
  await fs.writeFile(filename, changelog.toString());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "changelog-tool",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "A CLI tool for manipulating changelogs",
5
5
  "main": "index.mjs",
6
6
  "scripts": {
package/readme.md CHANGED
@@ -36,13 +36,33 @@ To tool can be used programmatically and with the CLI. The CLI has the
36
36
  following commands:
37
37
 
38
38
  ```
39
- npx changelog init - Create a new, empty npx changelog.
40
- npx changelog add [message] - Adds a new line to the npx changelog.
41
- npx changelog release - Marks the current npx changelog as released.
42
- npx changelog show - Show the last npx changelog.
43
- npx changelog show [version] - Show the npx changelog of a specific version.
44
- npx changelog list - List all versions in the npx changelog.
45
- npx changelog format - Reformats the npx changelog in the standard format.
39
+ npx changelog init - Create a new, empty npx changelog.
40
+ npx changelog add -m [message] - Adds a new line to the npx changelog.
41
+ npx changelog release - Marks the current npx changelog as released.
42
+ npx changelog show - Show the last npx changelog.
43
+ npx changelog show [version] - Show the npx changelog of a specific version.
44
+ npx changelog list - List all versions in the npx changelog.
45
+ npx changelog format - Reformats the npx changelog in the standard format.
46
46
  ```
47
47
 
48
- Feature requests and bug reports are welcome.
48
+ ### Invoking add
49
+
50
+ Easiest is to just run:
51
+
52
+ ```
53
+ npx changelog add -m "Bug fix"
54
+ ```
55
+
56
+ This will automatically add a line to the latest unreleased version. If there
57
+ is no unreleased version, it will create a new patch version.
58
+
59
+ If the change should cause a minor or major version bump, you can specify the
60
+ these options too:
61
+
62
+ ```
63
+ npx changelog add --minor -m "New feature"
64
+ npx changelog add --major -m "Backwards compatibility break"
65
+ ```
66
+
67
+ These settings will automatically adjust the version string of the most recent
68
+ unreleased version.
package/util.mjs CHANGED
@@ -62,7 +62,7 @@ export function wrap(input, secondLineOffset = 0, lineLength = 79) {
62
62
  }
63
63
 
64
64
  const maxLength = lines.length > 1 ? lineLength - secondLineOffset : lineLength;
65
-
65
+
66
66
  const potentialNewLine = [lines.at(-1),word].join(' ');
67
67
  if (potentialNewLine.length>maxLength) {
68
68
  lines.push(word);
@@ -74,3 +74,37 @@ export function wrap(input, secondLineOffset = 0, lineLength = 79) {
74
74
  return lines.join('\n' + ' '.repeat(secondLineOffset));
75
75
 
76
76
  }
77
+
78
+ /**
79
+ * @param {string} prevVersion
80
+ * @param {'patch'|'minor'|'major'} changeType
81
+ * @returns {string}
82
+ */
83
+ export function calculateNextVersion(prevVersion, changeType = 'patch') {
84
+
85
+ // This function only currently understands 1 format, but this may change
86
+ // in the future.
87
+ if (!prevVersion.match(/^[0-9]+\.[0-9]+\.[0-9]+$/)) {
88
+ throw new Error(`Could not automatically determine the next ${changeType} version from ${prevVersion}. You might want to request a new feature to support this`);
89
+ }
90
+
91
+ const parts = prevVersion.split('.').map( part => +part);
92
+
93
+ switch(changeType) {
94
+ case 'major' :
95
+ parts[0]++;
96
+ parts[1]=0;
97
+ parts[2]=0;
98
+ break;
99
+ case 'minor' :
100
+ parts[1]++;
101
+ parts[2]=0;
102
+ break;
103
+ case 'patch' :
104
+ parts[2]++;
105
+ break;
106
+ }
107
+
108
+ return parts.join('.');
109
+
110
+ }