keep-a-changelog 3.0.4 → 3.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1 @@
1
1
  #!/usr/bin/env -S deno run --allow-read --allow-write --allow-env
2
- export {};
package/bin.js CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env -S deno run --allow-read --allow-write --allow-env
2
2
  import { join } from "node:path";
3
3
  import { parseArgs } from "node:util";
4
4
  import { cwd, exit } from "node:process";
@@ -7,231 +7,226 @@ import { parse as parseIni } from "ini";
7
7
  import { Changelog, parser, Release } from "./mod.js";
8
8
  import getSettingsForURL from "./src/settings.js";
9
9
  const { values } = parseArgs({
10
- options: {
11
- help: {
12
- type: "boolean",
13
- short: "h",
14
- },
15
- file: {
16
- type: "string",
17
- default: "CHANGELOG.md",
18
- },
19
- format: {
20
- type: "string",
21
- default: "compact",
22
- },
23
- release: {
24
- type: "boolean",
25
- },
26
- init: {
27
- type: "boolean",
28
- },
29
- create: {
30
- type: "string",
31
- },
32
- url: {
33
- type: "string",
34
- },
35
- https: {
36
- type: "boolean",
37
- default: true,
38
- },
39
- quiet: {
40
- type: "boolean",
41
- },
42
- head: {
43
- type: "string",
44
- },
45
- combine: {
46
- type: "boolean",
47
- },
48
- "bullet-style": {
49
- type: "string",
50
- default: "-",
51
- },
52
- "latest-release": {
53
- type: "boolean",
54
- },
55
- "latest-release-full": {
56
- type: "boolean",
57
- },
58
- "no-v-prefix": {
59
- type: "boolean",
60
- },
61
- "no-sort-releases": {
62
- type: "boolean",
63
- },
10
+ options: {
11
+ help: {
12
+ type: "boolean",
13
+ short: "h"
64
14
  },
15
+ file: {
16
+ type: "string",
17
+ default: "CHANGELOG.md"
18
+ },
19
+ format: {
20
+ type: "string",
21
+ default: "compact"
22
+ },
23
+ release: {
24
+ type: "boolean"
25
+ },
26
+ init: {
27
+ type: "boolean"
28
+ },
29
+ create: {
30
+ type: "string"
31
+ },
32
+ url: {
33
+ type: "string"
34
+ },
35
+ https: {
36
+ type: "boolean",
37
+ default: true
38
+ },
39
+ quiet: {
40
+ type: "boolean"
41
+ },
42
+ head: {
43
+ type: "string"
44
+ },
45
+ combine: {
46
+ type: "boolean"
47
+ },
48
+ "bullet-style": {
49
+ type: "string",
50
+ default: "-"
51
+ },
52
+ "latest-release": {
53
+ type: "boolean"
54
+ },
55
+ "latest-release-full": {
56
+ type: "boolean"
57
+ },
58
+ "no-v-prefix": {
59
+ type: "boolean"
60
+ },
61
+ "no-sort-releases": {
62
+ type: "boolean"
63
+ }
64
+ }
65
65
  });
66
66
  const file = join(cwd(), values.file);
67
67
  try {
68
- if (values.help) {
69
- showHelp();
70
- exit(0);
71
- }
72
- if (values.init) {
73
- const changelog = new Changelog("Changelog").addRelease(new Release("0.1.0", new Date(), "First version"));
74
- changelog.format = values.format;
75
- changelog.bulletStyle = values["bullet-style"];
76
- save(file, changelog, true);
77
- exit(0);
78
- }
79
- const changelog = parser(readFileSync(file, { encoding: "utf8" }), {
80
- autoSortReleases: !values["no-sort-releases"],
81
- });
68
+ if (values.help) {
69
+ showHelp();
70
+ exit(0);
71
+ }
72
+ if (values.init) {
73
+ const changelog = new Changelog("Changelog").addRelease(new Release("0.1.0", new Date(), "First version"));
82
74
  changelog.format = values.format;
83
75
  changelog.bulletStyle = values["bullet-style"];
84
- if (values["no-v-prefix"]) {
85
- changelog.tagNameBuilder = (release) => String(release.version);
86
- }
87
- if (values["latest-release"]) {
88
- const release = changelog.releases.find((release) => release.date && release.version);
89
- if (release) {
90
- console.log(release.version?.toString());
91
- }
92
- exit(0);
93
- }
94
- if (values["latest-release-full"]) {
95
- const release = changelog.releases.find((release) => release.date && release.version);
96
- if (release) {
97
- console.log(release.toString());
98
- }
99
- exit(0);
100
- }
101
- if (values.release) {
102
- const release = changelog.releases.find((release) => {
103
- if (release.date) {
104
- return false;
105
- }
106
- if (typeof values.release === "string") {
107
- return !release.version ||
108
- values.release === release.version.toString();
109
- }
110
- return !!release.version;
111
- });
112
- if (release) {
113
- release.date = new Date();
114
- if (typeof values.release === "string") {
115
- release.setVersion(values.release);
116
- }
117
- }
118
- else {
119
- console.error("Not found any valid unreleased version");
120
- exit(1);
121
- }
122
- }
123
- if (values.combine) {
124
- const combinedReleases = changelog.releases.reduce((acc, release) => {
125
- if (release.version) {
126
- if (acc[release.version]) {
127
- acc[release.version].combineChanges(release.changes);
128
- }
129
- else {
130
- acc[release.version] = release;
131
- }
132
- }
133
- return acc;
134
- }, {});
135
- changelog.releases = Object.values(combinedReleases);
136
- }
137
- if (values.create) {
138
- let version = values.create || undefined;
139
- if (version === "major" || version === "minor" || version === "patch") {
140
- const latestRelease = changelog.releases.find((release) => release.parsedVersion);
141
- if (!latestRelease) {
142
- console.error("No releases found to bump version from.");
143
- exit(1);
144
- }
145
- let { major, minor, patch } = latestRelease.parsedVersion;
146
- if (version === "major") {
147
- major += 1;
148
- minor = 0;
149
- patch = 0;
150
- }
151
- else if (version === "minor") {
152
- minor += 1;
153
- patch = 0;
154
- }
155
- else if (version === "patch") {
156
- patch += 1;
157
- }
158
- version = `${major}.${minor}.${patch}`;
159
- }
160
- const release = changelog.releases.find((release) => release.version === version);
161
- if (release) {
162
- console.warn("Release already exists.");
163
- }
164
- else {
165
- changelog.addRelease(new Release(version));
76
+ save(file, changelog, true);
77
+ exit(0);
78
+ }
79
+ const changelog = parser(readFileSync(file, {
80
+ encoding: "utf8"
81
+ }), {
82
+ autoSortReleases: !values["no-sort-releases"]
83
+ });
84
+ changelog.format = values.format;
85
+ changelog.bulletStyle = values["bullet-style"];
86
+ if (values["no-v-prefix"]) {
87
+ changelog.tagNameBuilder = (release)=>String(release.version);
88
+ }
89
+ if (values["latest-release"]) {
90
+ const release = changelog.releases.find((release)=>release.date && release.version);
91
+ if (release) {
92
+ console.log(release.version?.toString());
93
+ }
94
+ exit(0);
95
+ }
96
+ if (values["latest-release-full"]) {
97
+ const release = changelog.releases.find((release)=>release.date && release.version);
98
+ if (release) {
99
+ console.log(release.toString());
100
+ }
101
+ exit(0);
102
+ }
103
+ if (values.release) {
104
+ const release = changelog.releases.find((release)=>{
105
+ if (release.date) {
106
+ return false;
107
+ }
108
+ if (typeof values.release === "string") {
109
+ return !release.version || values.release === release.version.toString();
110
+ }
111
+ return !!release.version;
112
+ });
113
+ if (release) {
114
+ release.date = new Date();
115
+ if (typeof values.release === "string") {
116
+ release.setVersion(values.release);
117
+ }
118
+ } else {
119
+ console.error("Not found any valid unreleased version");
120
+ exit(1);
121
+ }
122
+ }
123
+ if (values.combine) {
124
+ const combinedReleases = changelog.releases.reduce((acc, release)=>{
125
+ if (release.version) {
126
+ if (acc[release.version]) {
127
+ acc[release.version].combineChanges(release.changes);
128
+ } else {
129
+ acc[release.version] = release;
166
130
  }
167
- }
168
- save(file, changelog);
169
- }
170
- catch (err) {
171
- console.error(red(err.message));
172
- if (!values.quiet) {
131
+ }
132
+ return acc;
133
+ }, {});
134
+ changelog.releases = Object.values(combinedReleases);
135
+ }
136
+ if (values.create) {
137
+ let version = values.create || undefined;
138
+ if (version === "major" || version === "minor" || version === "patch") {
139
+ const latestRelease = changelog.releases.find((release)=>release.parsedVersion);
140
+ if (!latestRelease) {
141
+ console.error("No releases found to bump version from.");
173
142
  exit(1);
174
- }
143
+ }
144
+ let { major, minor, patch } = latestRelease.parsedVersion;
145
+ if (version === "major") {
146
+ major += 1;
147
+ minor = 0;
148
+ patch = 0;
149
+ } else if (version === "minor") {
150
+ minor += 1;
151
+ patch = 0;
152
+ } else if (version === "patch") {
153
+ patch += 1;
154
+ }
155
+ version = `${major}.${minor}.${patch}`;
156
+ }
157
+ const release = changelog.releases.find((release)=>release.version === version);
158
+ if (release) {
159
+ console.warn("Release already exists.");
160
+ } else {
161
+ changelog.addRelease(new Release(version));
162
+ }
163
+ }
164
+ save(file, changelog);
165
+ } catch (err) {
166
+ console.error(red(err.message));
167
+ if (!values.quiet) {
168
+ exit(1);
169
+ }
175
170
  }
176
171
  function save(file, changelog, isNew = false) {
177
- changelog.url = values.url || changelog.url || getRemoteUrl(values.https);
178
- if (!changelog.url) {
179
- console.error(red('Please, set the repository url with --url="https://github.com/username/repository"'));
180
- changelog.url = "https://example.com";
181
- }
182
- if (changelog.url) {
183
- const settings = getSettingsForURL(changelog.url);
184
- if (settings) {
185
- changelog.head = settings.head;
186
- changelog.tagLinkBuilder = settings.tagLink;
187
- }
188
- }
189
- if (values.head) {
190
- changelog.head = values.head;
191
- }
192
- writeFileSync(file, changelog.toString());
193
- if (isNew) {
194
- console.log(green("Generated new file"), file);
195
- }
196
- else {
197
- console.log(green("Updated file"), file);
198
- }
172
+ changelog.url = values.url || changelog.url || getRemoteUrl(values.https);
173
+ if (!changelog.url) {
174
+ console.error(red('Please, set the repository url with --url="https://github.com/username/repository"'));
175
+ changelog.url = "https://example.com";
176
+ }
177
+ if (changelog.url) {
178
+ const settings = getSettingsForURL(changelog.url);
179
+ if (settings) {
180
+ changelog.head = settings.head;
181
+ changelog.tagLinkBuilder = settings.tagLink;
182
+ }
183
+ }
184
+ if (values.head) {
185
+ changelog.head = values.head;
186
+ }
187
+ writeFileSync(file, changelog.toString());
188
+ if (isNew) {
189
+ console.log(green("Generated new file"), file);
190
+ } else {
191
+ console.log(green("Updated file"), file);
192
+ }
199
193
  }
200
194
  function red(message) {
201
- return "\u001b[" + 31 + "m" + message + "\u001b[" + 39 + "m";
195
+ return "\u001b[" + 31 + "m" + message + "\u001b[" + 39 + "m";
202
196
  }
203
197
  function green(message) {
204
- return "\u001b[" + 32 + "m" + message + "\u001b[" + 39 + "m";
198
+ return "\u001b[" + 32 + "m" + message + "\u001b[" + 39 + "m";
205
199
  }
206
200
  function normalizeUrl(url, https) {
207
- // remove .git suffix
208
- url = url.replace(/\.git$/, "");
209
- // normalize git@host urls
210
- if (url.startsWith("git@")) {
211
- url = url.replace(/^git@([^:]+):(.*)$/, (https ? "https" : "http") + "://$1/$2");
212
- }
213
- // remove trailing slashes
214
- url = url.replace(/\/+$/, "");
215
- return new URL(url);
201
+ // remove .git suffix
202
+ url = url.replace(/\.git$/, "");
203
+ // normalize git@host urls
204
+ if (url.startsWith("git@")) {
205
+ url = url.replace(/^git@([^:]+):(.*)$/, (https ? "https" : "http") + "://$1/$2");
206
+ }
207
+ // remove trailing slashes
208
+ url = url.replace(/\/+$/, "");
209
+ return new URL(url);
216
210
  }
217
211
  function getRemoteUrl(https = true) {
218
- try {
219
- const file = join(cwd(), ".git", "config");
220
- const content = readFileSync(file, { encoding: "utf8" });
221
- const data = parseIni(content);
222
- const origin = data['remote "origin"'];
223
- if (!origin?.url) {
224
- return;
225
- }
226
- return normalizeUrl(origin.url, https).href;
227
- }
228
- catch (err) {
229
- console.error(red(err.message));
230
- // Ignore
212
+ try {
213
+ const file = join(cwd(), ".git", "config");
214
+ const content = readFileSync(file, {
215
+ encoding: "utf8"
216
+ });
217
+ const data = parseIni(content);
218
+ const origin = data['remote "origin"'];
219
+ if (!origin?.url) {
220
+ return;
231
221
  }
222
+ return normalizeUrl(origin.url, https).href;
223
+ } catch (err) {
224
+ console.error(red(err.message));
225
+ // Ignore
226
+ }
232
227
  }
233
228
  function showHelp() {
234
- console.log(`keep-a-changelog
229
+ console.log(`keep-a-changelog
235
230
 
236
231
  Usage: keep-a-changelog [options]
237
232
 
@@ -256,3 +251,4 @@ Options:
256
251
  --help, -h Show this help message
257
252
  `);
258
253
  }
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vVXNlcnMvb3NjYXJvdGVyby93d3cva2VlcC1hLWNoYW5nZWxvZy9iaW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuaW1wb3J0IHsgY3dkLCBleGl0IH0gZnJvbSBcIm5vZGU6cHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlSW5pIH0gZnJvbSBcImluaVwiO1xuaW1wb3J0IHsgQ2hhbmdlbG9nLCBwYXJzZXIsIFJlbGVhc2UgfSBmcm9tIFwiLi9tb2QuanNcIjtcbmltcG9ydCBnZXRTZXR0aW5nc0ZvclVSTCBmcm9tIFwiLi9zcmMvc2V0dGluZ3MuanNcIjtcblxuY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gIG9wdGlvbnM6IHtcbiAgICBoZWxwOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIHNob3J0OiBcImhcIixcbiAgICB9LFxuICAgIGZpbGU6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZWZhdWx0OiBcIkNIQU5HRUxPRy5tZFwiLFxuICAgIH0sXG4gICAgZm9ybWF0OiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVmYXVsdDogXCJjb21wYWN0XCIsXG4gICAgfSxcbiAgICByZWxlYXNlOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGluaXQ6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgY3JlYXRlOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdXJsOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgaHR0cHM6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB9LFxuICAgIHF1aWV0OiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGhlYWQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBjb21iaW5lOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIFwiYnVsbGV0LXN0eWxlXCI6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZWZhdWx0OiBcIi1cIixcbiAgICB9LFxuICAgIFwibGF0ZXN0LXJlbGVhc2VcIjoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBcImxhdGVzdC1yZWxlYXNlLWZ1bGxcIjoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBcIm5vLXYtcHJlZml4XCI6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgXCJuby1zb3J0LXJlbGVhc2VzXCI6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gIH0sXG59KTtcblxuY29uc3QgZmlsZSA9IGpvaW4oY3dkKCksIHZhbHVlcy5maWxlKTtcblxudHJ5IHtcbiAgaWYgKHZhbHVlcy5oZWxwKSB7XG4gICAgc2hvd0hlbHAoKTtcbiAgICBleGl0KDApO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5pbml0KSB7XG4gICAgY29uc3QgY2hhbmdlbG9nID0gbmV3IENoYW5nZWxvZyhcIkNoYW5nZWxvZ1wiKS5hZGRSZWxlYXNlKFxuICAgICAgbmV3IFJlbGVhc2UoXCIwLjEuMFwiLCBuZXcgRGF0ZSgpLCBcIkZpcnN0IHZlcnNpb25cIiksXG4gICAgKTtcblxuICAgIGNoYW5nZWxvZy5mb3JtYXQgPSB2YWx1ZXMuZm9ybWF0IGFzIFwiY29tcGFjdFwiIHwgXCJtYXJrZG93bmxpbnRcIjtcbiAgICBjaGFuZ2Vsb2cuYnVsbGV0U3R5bGUgPSB2YWx1ZXNbXCJidWxsZXQtc3R5bGVcIl0gYXMgXCItXCIgfCBcIipcIiB8IFwiK1wiO1xuXG4gICAgc2F2ZShmaWxlLCBjaGFuZ2Vsb2csIHRydWUpO1xuICAgIGV4aXQoMCk7XG4gIH1cblxuICBjb25zdCBjaGFuZ2Vsb2cgPSBwYXJzZXIocmVhZEZpbGVTeW5jKGZpbGUsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pLCB7XG4gICAgYXV0b1NvcnRSZWxlYXNlczogIXZhbHVlc1tcIm5vLXNvcnQtcmVsZWFzZXNcIl0sXG4gIH0pO1xuICBjaGFuZ2Vsb2cuZm9ybWF0ID0gdmFsdWVzLmZvcm1hdCBhcyBcImNvbXBhY3RcIiB8IFwibWFya2Rvd25saW50XCI7XG4gIGNoYW5nZWxvZy5idWxsZXRTdHlsZSA9IHZhbHVlc1tcImJ1bGxldC1zdHlsZVwiXSBhcyBcIi1cIiB8IFwiKlwiIHwgXCIrXCI7XG4gIGlmICh2YWx1ZXNbXCJuby12LXByZWZpeFwiXSkge1xuICAgIGNoYW5nZWxvZy50YWdOYW1lQnVpbGRlciA9IChyZWxlYXNlKSA9PiBTdHJpbmcocmVsZWFzZS52ZXJzaW9uKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXNbXCJsYXRlc3QtcmVsZWFzZVwiXSkge1xuICAgIGNvbnN0IHJlbGVhc2UgPSBjaGFuZ2Vsb2cucmVsZWFzZXMuZmluZCgocmVsZWFzZSkgPT5cbiAgICAgIHJlbGVhc2UuZGF0ZSAmJiByZWxlYXNlLnZlcnNpb25cbiAgICApO1xuXG4gICAgaWYgKHJlbGVhc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKHJlbGVhc2UudmVyc2lvbj8udG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgZXhpdCgwKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXNbXCJsYXRlc3QtcmVsZWFzZS1mdWxsXCJdKSB7XG4gICAgY29uc3QgcmVsZWFzZSA9IGNoYW5nZWxvZy5yZWxlYXNlcy5maW5kKChyZWxlYXNlKSA9PlxuICAgICAgcmVsZWFzZS5kYXRlICYmIHJlbGVhc2UudmVyc2lvblxuICAgICk7XG5cbiAgICBpZiAocmVsZWFzZSkge1xuICAgICAgY29uc29sZS5sb2cocmVsZWFzZS50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBleGl0KDApO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5yZWxlYXNlKSB7XG4gICAgY29uc3QgcmVsZWFzZSA9IGNoYW5nZWxvZy5yZWxlYXNlcy5maW5kKChyZWxlYXNlKSA9PiB7XG4gICAgICBpZiAocmVsZWFzZS5kYXRlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZXMucmVsZWFzZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gIXJlbGVhc2UudmVyc2lvbiB8fFxuICAgICAgICAgIHZhbHVlcy5yZWxlYXNlID09PSByZWxlYXNlLnZlcnNpb24udG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICEhcmVsZWFzZS52ZXJzaW9uO1xuICAgIH0pO1xuXG4gICAgaWYgKHJlbGVhc2UpIHtcbiAgICAgIHJlbGVhc2UuZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlcy5yZWxlYXNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJlbGVhc2Uuc2V0VmVyc2lvbih2YWx1ZXMucmVsZWFzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb3QgZm91bmQgYW55IHZhbGlkIHVucmVsZWFzZWQgdmVyc2lvblwiKTtcbiAgICAgIGV4aXQoMSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHZhbHVlcy5jb21iaW5lKSB7XG4gICAgY29uc3QgY29tYmluZWRSZWxlYXNlcyA9IGNoYW5nZWxvZy5yZWxlYXNlcy5yZWR1Y2UoKGFjYywgcmVsZWFzZSkgPT4ge1xuICAgICAgaWYgKHJlbGVhc2UudmVyc2lvbikge1xuICAgICAgICBpZiAoYWNjW3JlbGVhc2UudmVyc2lvbl0pIHtcbiAgICAgICAgICBhY2NbcmVsZWFzZS52ZXJzaW9uXS5jb21iaW5lQ2hhbmdlcyhyZWxlYXNlLmNoYW5nZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjY1tyZWxlYXNlLnZlcnNpb25dID0gcmVsZWFzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB0eXBlb2YgY2hhbmdlbG9nLnJlbGVhc2VzWzBdPik7XG5cbiAgICBjaGFuZ2Vsb2cucmVsZWFzZXMgPSBPYmplY3QudmFsdWVzKGNvbWJpbmVkUmVsZWFzZXMpO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5jcmVhdGUpIHtcbiAgICBsZXQgdmVyc2lvbiA9IHZhbHVlcy5jcmVhdGUgfHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHZlcnNpb24gPT09IFwibWFqb3JcIiB8fCB2ZXJzaW9uID09PSBcIm1pbm9yXCIgfHwgdmVyc2lvbiA9PT0gXCJwYXRjaFwiKSB7XG4gICAgICBjb25zdCBsYXRlc3RSZWxlYXNlID0gY2hhbmdlbG9nLnJlbGVhc2VzLmZpbmQoKHJlbGVhc2UpID0+XG4gICAgICAgIHJlbGVhc2UucGFyc2VkVmVyc2lvblxuICAgICAgKTtcblxuICAgICAgaWYgKCFsYXRlc3RSZWxlYXNlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyByZWxlYXNlcyBmb3VuZCB0byBidW1wIHZlcnNpb24gZnJvbS5cIik7XG4gICAgICAgIGV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGxldCB7IG1ham9yLCBtaW5vciwgcGF0Y2ggfSA9IGxhdGVzdFJlbGVhc2UucGFyc2VkVmVyc2lvbiE7XG5cbiAgICAgIGlmICh2ZXJzaW9uID09PSBcIm1ham9yXCIpIHtcbiAgICAgICAgbWFqb3IgKz0gMTtcbiAgICAgICAgbWlub3IgPSAwO1xuICAgICAgICBwYXRjaCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT09IFwibWlub3JcIikge1xuICAgICAgICBtaW5vciArPSAxO1xuICAgICAgICBwYXRjaCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT09IFwicGF0Y2hcIikge1xuICAgICAgICBwYXRjaCArPSAxO1xuICAgICAgfVxuXG4gICAgICB2ZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9YDtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlID0gY2hhbmdlbG9nLnJlbGVhc2VzLmZpbmQoKHJlbGVhc2UpID0+XG4gICAgICByZWxlYXNlLnZlcnNpb24gPT09IHZlcnNpb25cbiAgICApO1xuXG4gICAgaWYgKHJlbGVhc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlJlbGVhc2UgYWxyZWFkeSBleGlzdHMuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFuZ2Vsb2cuYWRkUmVsZWFzZShuZXcgUmVsZWFzZSh2ZXJzaW9uKSk7XG4gICAgfVxuICB9XG5cbiAgc2F2ZShmaWxlLCBjaGFuZ2Vsb2cpO1xufSBjYXRjaCAoZXJyKSB7XG4gIGNvbnNvbGUuZXJyb3IocmVkKChlcnIgYXMgRXJyb3IpLm1lc3NhZ2UpKTtcblxuICBpZiAoIXZhbHVlcy5xdWlldCkge1xuICAgIGV4aXQoMSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2F2ZShmaWxlOiBzdHJpbmcsIGNoYW5nZWxvZzogQ2hhbmdlbG9nLCBpc05ldyA9IGZhbHNlKSB7XG4gIGNoYW5nZWxvZy51cmwgPSB2YWx1ZXMudXJsIHx8IGNoYW5nZWxvZy51cmwgfHwgZ2V0UmVtb3RlVXJsKHZhbHVlcy5odHRwcyk7XG5cbiAgaWYgKCFjaGFuZ2Vsb2cudXJsKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIHJlZChcbiAgICAgICAgJ1BsZWFzZSwgc2V0IHRoZSByZXBvc2l0b3J5IHVybCB3aXRoIC0tdXJsPVwiaHR0cHM6Ly9naXRodWIuY29tL3VzZXJuYW1lL3JlcG9zaXRvcnlcIicsXG4gICAgICApLFxuICAgICk7XG4gICAgY2hhbmdlbG9nLnVybCA9IFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiO1xuICB9XG5cbiAgaWYgKGNoYW5nZWxvZy51cmwpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzRm9yVVJMKGNoYW5nZWxvZy51cmwpO1xuXG4gICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICBjaGFuZ2Vsb2cuaGVhZCA9IHNldHRpbmdzLmhlYWQ7XG4gICAgICBjaGFuZ2Vsb2cudGFnTGlua0J1aWxkZXIgPSBzZXR0aW5ncy50YWdMaW5rO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZXMuaGVhZCkge1xuICAgIGNoYW5nZWxvZy5oZWFkID0gdmFsdWVzLmhlYWQ7XG4gIH1cblxuICB3cml0ZUZpbGVTeW5jKGZpbGUsIGNoYW5nZWxvZy50b1N0cmluZygpKTtcblxuICBpZiAoaXNOZXcpIHtcbiAgICBjb25zb2xlLmxvZyhncmVlbihcIkdlbmVyYXRlZCBuZXcgZmlsZVwiKSwgZmlsZSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coZ3JlZW4oXCJVcGRhdGVkIGZpbGVcIiksIGZpbGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZChtZXNzYWdlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIFwiXFx1MDAxYltcIiArIDMxICsgXCJtXCIgKyBtZXNzYWdlICsgXCJcXHUwMDFiW1wiICsgMzkgKyBcIm1cIjtcbn1cblxuZnVuY3Rpb24gZ3JlZW4obWVzc2FnZTogc3RyaW5nKSB7XG4gIHJldHVybiBcIlxcdTAwMWJbXCIgKyAzMiArIFwibVwiICsgbWVzc2FnZSArIFwiXFx1MDAxYltcIiArIDM5ICsgXCJtXCI7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVVybCh1cmw6IHN0cmluZywgaHR0cHM6IGJvb2xlYW4pIHtcbiAgLy8gcmVtb3ZlIC5naXQgc3VmZml4XG4gIHVybCA9IHVybC5yZXBsYWNlKC9cXC5naXQkLywgXCJcIik7XG5cbiAgLy8gbm9ybWFsaXplIGdpdEBob3N0IHVybHNcbiAgaWYgKHVybC5zdGFydHNXaXRoKFwiZ2l0QFwiKSkge1xuICAgIHVybCA9IHVybC5yZXBsYWNlKFxuICAgICAgL15naXRAKFteOl0rKTooLiopJC8sXG4gICAgICAoaHR0cHMgPyBcImh0dHBzXCIgOiBcImh0dHBcIikgKyBcIjovLyQxLyQyXCIsXG4gICAgKTtcbiAgfVxuXG4gIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaGVzXG4gIHVybCA9IHVybC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuICByZXR1cm4gbmV3IFVSTCh1cmwpO1xufVxuXG5mdW5jdGlvbiBnZXRSZW1vdGVVcmwoaHR0cHMgPSB0cnVlKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZSA9IGpvaW4oY3dkKCksIFwiLmdpdFwiLCBcImNvbmZpZ1wiKTtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKGZpbGUsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBwYXJzZUluaShjb250ZW50KTtcbiAgICBjb25zdCBvcmlnaW4gPSBkYXRhWydyZW1vdGUgXCJvcmlnaW5cIiddIGFzIHsgdXJsPzogc3RyaW5nIH07XG5cbiAgICBpZiAoIW9yaWdpbj8udXJsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZVVybChvcmlnaW4udXJsLCBodHRwcykuaHJlZjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihyZWQoKGVyciBhcyBFcnJvcikubWVzc2FnZSkpO1xuICAgIC8vIElnbm9yZVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dIZWxwKCkge1xuICBjb25zb2xlLmxvZyhga2VlcC1hLWNoYW5nZWxvZ1xuXG5Vc2FnZToga2VlcC1hLWNoYW5nZWxvZyBbb3B0aW9uc11cblxuT3B0aW9uczpcbiAgLS1maWxlLCAtZiAgICAgICAgICAgICAgICBDaGFuZ2Vsb2cgZmlsZSAoZGVmYXVsdDogQ0hBTkdFTE9HLm1kKVxuICAtLWZvcm1hdCAgICAgICAgICAgICAgICAgIE91dHB1dCBmb3JtYXQgKGRlZmF1bHQ6IGNvbXBhY3QpXG4gIC0tYnVsbGV0LXN0eWxlICAgICAgICAgICAgQnVsbGV0IHBvaW50IHN0eWxlIChkZWZhdWx0OiAtKVxuICAtLXVybCAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnkgVVJMXG5cbiAgLS1pbml0ICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXplIGEgbmV3IGNoYW5nZWxvZyBmaWxlXG4gIC0tbGF0ZXN0LXJlbGVhc2UgICAgICAgICAgUHJpbnQgdGhlIGxhdGVzdCByZWxlYXNlIHZlcnNpb25cbiAgLS1sYXRlc3QtcmVsZWFzZS1mdWxsICAgICBQcmludCB0aGUgbGF0ZXN0IHJlbGVhc2VcblxuICAtLXJlbGVhc2UgICAgICAgICAgICAgICAgIFNldCB0aGUgZGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHJlbGVhc2VcbiAgLS1jb21iaW5lICAgICAgICAgICAgICAgICBDb21iaW5lIGNoYW5nZXMgZnJvbSByZWxlYXNlcyB3aXRoIHRoZSBzYW1lIHZlcnNpb25cbiAgLS1jcmVhdGUgICAgICAgICAgICAgICAgICBDcmVhdGUgYSBuZXcgcmVsZWFzZS4gT3B0aW9uYWxseSBhY2NlcHRzIGEgdmVyc2lvbiBudW1iZXIgb3IgJ3BhdGNoJywgJ21pbm9yJyBvciAnbWFqb3InXG5cbiAgLS1uby12LXByZWZpeCAgICAgICAgICAgICBEbyBub3QgYWRkIGEgXCJ2XCIgcHJlZml4IHRvIHRoZSB2ZXJzaW9uXG4gIC0tbm8tc29ydC1yZWxlYXNlcyAgICAgICAgRG8gbm90IHNvcnQgcmVsZWFzZXNcbiAgLS1oZWFkICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIEhFQUQgbGlua1xuICAtLXF1aWV0ICAgICAgICAgICAgICAgICAgIERvIG5vdCBwcmludCBlcnJvcnNcbiAgLS1oZWxwLCAtaCAgICAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBtZXNzYWdlXG5gKTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxTQUFTLElBQUksUUFBUSxZQUFZ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
package/mod.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import parser from "./src/parser.js";
2
+ import Change from "./src/Change.js";
3
+ import Changelog from "./src/Changelog.js";
4
+ import Release from "./src/Release.js";
5
+ export { Change, Changelog, parser, Release };
package/mod.js CHANGED
@@ -3,3 +3,4 @@ import Change from "./src/Change.js";
3
3
  import Changelog from "./src/Changelog.js";
4
4
  import Release from "./src/Release.js";
5
5
  export { Change, Changelog, parser, Release };
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vVXNlcnMvb3NjYXJvdGVyby93d3cva2VlcC1hLWNoYW5nZWxvZy9tb2QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhcnNlciBmcm9tIFwiLi9zcmMvcGFyc2VyLmpzXCI7XG5pbXBvcnQgQ2hhbmdlIGZyb20gXCIuL3NyYy9DaGFuZ2UuanNcIjtcbmltcG9ydCBDaGFuZ2Vsb2cgZnJvbSBcIi4vc3JjL0NoYW5nZWxvZy5qc1wiO1xuaW1wb3J0IFJlbGVhc2UgZnJvbSBcIi4vc3JjL1JlbGVhc2UuanNcIjtcblxuZXhwb3J0IHsgQ2hhbmdlLCBDaGFuZ2Vsb2csIHBhcnNlciwgUmVsZWFzZSB9O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sWUFBWSxrQkFBa0I7QUFDckMsT0FBTyxZQUFZLGtCQUFrQjtBQUNyQyxPQUFPLGVBQWUscUJBQXFCO0FBQzNDLE9BQU8sYUFBYSxtQkFBbUI7QUFFdkMsU0FBUyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEdBQUcifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keep-a-changelog",
3
- "version": "3.0.4",
3
+ "version": "3.0.5",
4
4
  "description": "Parse and generate changelogs following the [keepachangelog](https://keepachangelog.com/) format.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -21,55 +21,57 @@
21
21
  "bin": {
22
22
  "changelog": "./bin.js"
23
23
  },
24
+ "main": "./mod.js",
25
+ "types": "./mod.d.ts",
24
26
  "dependencies": {
25
- "ini": "6.0.0",
26
- "semver": "7.7.4"
27
+ "ini": "^6.0.0",
28
+ "semver": "^7.7.4"
27
29
  },
28
30
  "exports": {
29
31
  ".": {
30
- "types": "./types/mod.d.ts",
32
+ "types": "./mod.d.ts",
31
33
  "import": "./mod.js",
32
34
  "default": "./mod.js"
33
35
  },
34
- "./bin.js": {
35
- "types": "./types/bin.d.ts",
36
- "import": "./bin.js",
37
- "default": "./bin.js"
38
- },
39
- "./mod.js": {
40
- "types": "./types/mod.d.ts",
36
+ "./mod.ts": {
37
+ "types": "./mod.d.ts",
41
38
  "import": "./mod.js",
42
39
  "default": "./mod.js"
43
40
  },
44
- "./src/Change.js": {
45
- "types": "./types/src/Change.d.ts",
41
+ "./bin.ts": {
42
+ "types": "./bin.d.ts",
43
+ "import": "./bin.js",
44
+ "default": "./bin.js"
45
+ },
46
+ "./src/Change.ts": {
47
+ "types": "./src/Change.d.ts",
46
48
  "import": "./src/Change.js",
47
49
  "default": "./src/Change.js"
48
50
  },
49
- "./src/Changelog.js": {
50
- "types": "./types/src/Changelog.d.ts",
51
+ "./src/settings.ts": {
52
+ "types": "./src/settings.d.ts",
53
+ "import": "./src/settings.js",
54
+ "default": "./src/settings.js"
55
+ },
56
+ "./src/Changelog.ts": {
57
+ "types": "./src/Changelog.d.ts",
51
58
  "import": "./src/Changelog.js",
52
59
  "default": "./src/Changelog.js"
53
60
  },
54
- "./src/deps.js": {
55
- "types": "./types/src/deps.d.ts",
56
- "import": "./src/deps.js",
57
- "default": "./src/deps.js"
58
- },
59
- "./src/parser.js": {
60
- "types": "./types/src/parser.d.ts",
61
+ "./src/parser.ts": {
62
+ "types": "./src/parser.d.ts",
61
63
  "import": "./src/parser.js",
62
64
  "default": "./src/parser.js"
63
65
  },
64
- "./src/Release.js": {
65
- "types": "./types/src/Release.d.ts",
66
+ "./src/Release.ts": {
67
+ "types": "./src/Release.d.ts",
66
68
  "import": "./src/Release.js",
67
69
  "default": "./src/Release.js"
68
70
  },
69
- "./src/settings.js": {
70
- "types": "./types/src/settings.d.ts",
71
- "import": "./src/settings.js",
72
- "default": "./src/settings.js"
71
+ "./src/deps.ts": {
72
+ "types": "./src/deps.d.ts",
73
+ "import": "./src/deps.js",
74
+ "default": "./src/deps.js"
73
75
  }
74
76
  }
75
77
  }
@@ -0,0 +1,8 @@
1
+ export default class Change {
2
+ title: string;
3
+ description: string;
4
+ issues: string[];
5
+ static extractIssues(text: string, issues: string[]): string;
6
+ constructor(title: string, description?: string);
7
+ toString(bulletStyle?: string): string;
8
+ }