7
7
unreleased ,
8
8
Version ,
9
9
} from './constants' ;
10
+ import { PackageRename } from './shared-types' ;
10
11
11
12
const changelogTitle = '# Changelog' ;
12
13
const changelogDescription = `All notable changes to this project will be documented in this file.
@@ -165,24 +166,50 @@ function getTagUrl(repoUrl: string, tag: string) {
165
166
* @param repoUrl - The URL for the GitHub repository.
166
167
* @param tagPrefix - The prefix used in tags before the version number.
167
168
* @param releases - The releases to generate link definitions for.
169
+ * @param packageRename - The package rename properties
170
+ * An optional, which is required only in case of package renamed.
168
171
* @returns The stringified release link definitions.
169
172
*/
170
173
function stringifyLinkReferenceDefinitions (
171
174
repoUrl : string ,
172
175
tagPrefix : string ,
173
176
releases : ReleaseMetadata [ ] ,
177
+ packageRename ?: PackageRename ,
174
178
) {
175
- // A list of release versions in descending SemVer order
176
- const descendingSemverVersions = releases
177
- . map ( ( { version } ) => version )
178
- . sort ( ( a : Version , b : Version ) => {
179
- return semver . gt ( a , b ) ? - 1 : 1 ;
180
- } ) ;
181
- const latestSemverVersion = descendingSemverVersions [ 0 ] ;
182
- // A list of release versions in chronological order
183
- const chronologicalVersions = releases . map ( ( { version } ) => version ) ;
184
- const hasReleases = chronologicalVersions . length > 0 ;
179
+ const unreleasedLinkReferenceDefinition =
180
+ getUnreleasedLinkReferenceDefinition (
181
+ repoUrl ,
182
+ tagPrefix ,
183
+ releases ,
184
+ packageRename ,
185
+ ) ;
186
+
187
+ const releaseLinkReferenceDefinitions = getReleaseLinkReferenceDefinitions (
188
+ repoUrl ,
189
+ tagPrefix ,
190
+ releases ,
191
+ packageRename ,
192
+ ) . join ( '\n' ) ;
193
+ return `${ unreleasedLinkReferenceDefinition } \n${ releaseLinkReferenceDefinitions } ${
194
+ releases . length > 0 ? '\n' : ''
195
+ } `;
196
+ }
185
197
198
+ /**
199
+ * Get a string of unreleased link reference definition.
200
+ *
201
+ * @param repoUrl - The URL for the GitHub repository.
202
+ * @param tagPrefix - The prefix used in tags before the version number.
203
+ * @param releases - The releases to generate link definitions for.
204
+ * @param packageRename - The package rename properties.
205
+ * @returns A unreleased link reference definition string.
206
+ */
207
+ function getUnreleasedLinkReferenceDefinition (
208
+ repoUrl : string ,
209
+ tagPrefix : string ,
210
+ releases : ReleaseMetadata [ ] ,
211
+ packageRename ?: PackageRename ,
212
+ ) : string {
186
213
// The "Unreleased" section represents all changes made since the *highest*
187
214
// release, not the most recent release. This is to accomodate patch releases
188
215
// of older versions that don't represent the latest set of changes.
@@ -193,42 +220,102 @@ function stringifyLinkReferenceDefinitions(
193
220
//
194
221
// If there have not been any releases yet, the repo URL is used directly as
195
222
// the link definition.
196
- const unreleasedLinkReferenceDefinition = `[${ unreleased } ]: ${
223
+
224
+ // A list of release versions in descending SemVer order
225
+ const descendingSemverVersions = releases
226
+ . map ( ( { version } ) => version )
227
+ . sort ( ( a : Version , b : Version ) => {
228
+ return semver . gt ( a , b ) ? - 1 : 1 ;
229
+ } ) ;
230
+ const latestSemverVersion = descendingSemverVersions [ 0 ] ;
231
+ const hasReleases = descendingSemverVersions . length > 0 ;
232
+ // if there is a package renamed, the tag prefix before the rename will be considered for compare
233
+ // [Unreleased]: https://github.com/ExampleUsernameOrOrganization/ExampleRepository/compare/[email protected]
234
+ const tagPrefixToCompare =
235
+ packageRename && packageRename . versionBeforeRename === latestSemverVersion
236
+ ? packageRename . tagPrefixBeforeRename
237
+ : tagPrefix ;
238
+
239
+ return `[${ unreleased } ]: ${
197
240
hasReleases
198
- ? getCompareUrl ( repoUrl , `${ tagPrefix } ${ latestSemverVersion } ` , 'HEAD' )
241
+ ? getCompareUrl (
242
+ repoUrl ,
243
+ `${ tagPrefixToCompare } ${ latestSemverVersion } ` ,
244
+ 'HEAD' ,
245
+ )
199
246
: withTrailingSlash ( repoUrl )
200
247
} `;
248
+ }
201
249
250
+ /**
251
+ * Get a list of release link reference definitions.
252
+ *
253
+ * @param repoUrl - The URL for the GitHub repository.
254
+ * @param tagPrefix - The prefix used in tags before the version number.
255
+ * @param releases - The releases to generate link definitions for.
256
+ * @param packageRename - The package rename properties.
257
+ * @returns A list of release link reference definitions.
258
+ */
259
+ function getReleaseLinkReferenceDefinitions (
260
+ repoUrl : string ,
261
+ tagPrefix : string ,
262
+ releases : ReleaseMetadata [ ] ,
263
+ packageRename ?: PackageRename ,
264
+ ) : string [ ] {
202
265
// The "previous" release that should be used for comparison is not always
203
266
// the most recent release chronologically. The _highest_ version that is
204
267
// lower than the current release is used as the previous release, so that
205
268
// patch releases on older releases can be accomodated.
206
- const releaseLinkReferenceDefinitions = releases
207
- . map ( ( { version } ) => {
208
- let diffUrl ;
209
- if ( version === chronologicalVersions [ chronologicalVersions . length - 1 ] ) {
210
- diffUrl = getTagUrl ( repoUrl , `${ tagPrefix } ${ version } ` ) ;
269
+ const chronologicalVersions = releases . map ( ( { version } ) => version ) ;
270
+ let tagPrefixToCompare = tagPrefix ;
271
+ const releaseLinkReferenceDefinitions = releases . map ( ( { version } ) => {
272
+ let diffUrl ;
273
+ // once the version matches with versionBeforeRename, rest of the lines in changelog will be assumed as migrated tags
274
+ if ( packageRename && packageRename . versionBeforeRename === version ) {
275
+ tagPrefixToCompare = packageRename . tagPrefixBeforeRename ;
276
+ }
277
+
278
+ if ( version === chronologicalVersions [ chronologicalVersions . length - 1 ] ) {
279
+ diffUrl = getTagUrl ( repoUrl , `${ tagPrefixToCompare } ${ version } ` ) ;
280
+ } else {
281
+ const versionIndex = chronologicalVersions . indexOf ( version ) ;
282
+ const previousVersion = chronologicalVersions
283
+ . slice ( versionIndex )
284
+ . find ( ( releaseVersion : Version ) => {
285
+ return semver . gt ( version , releaseVersion ) ;
286
+ } ) ;
287
+
288
+ if ( previousVersion ) {
289
+ if (
290
+ packageRename &&
291
+ packageRename . versionBeforeRename === previousVersion
292
+ ) {
293
+ // The package was renamed at this version
294
+ // (the tag prefix holds the new name).
295
+ diffUrl = getCompareUrl (
296
+ repoUrl ,
297
+ `${ packageRename . tagPrefixBeforeRename } ${ previousVersion } ` ,
298
+ `${ tagPrefix } ${ version } ` ,
299
+ ) ;
300
+ } else {
301
+ // If the package was ever renamed, it was not renamed at this version,
302
+ // so use either the old tag prefix or the new tag prefix.
303
+ // If the package was never renamed, use the tag prefix as it is.
304
+ diffUrl = getCompareUrl (
305
+ repoUrl ,
306
+ `${ tagPrefixToCompare } ${ previousVersion } ` ,
307
+ `${ tagPrefixToCompare } ${ version } ` ,
308
+ ) ;
309
+ }
211
310
} else {
212
- const versionIndex = chronologicalVersions . indexOf ( version ) ;
213
- const previousVersion = chronologicalVersions
214
- . slice ( versionIndex )
215
- . find ( ( releaseVersion : Version ) => {
216
- return semver . gt ( version , releaseVersion ) ;
217
- } ) ;
218
- diffUrl = previousVersion
219
- ? getCompareUrl (
220
- repoUrl ,
221
- `${ tagPrefix } ${ previousVersion } ` ,
222
- `${ tagPrefix } ${ version } ` ,
223
- )
224
- : getTagUrl ( repoUrl , `${ tagPrefix } ${ version } ` ) ;
311
+ // This is the smallest release.
312
+ diffUrl = getTagUrl ( repoUrl , `${ tagPrefixToCompare } ${ version } ` ) ;
225
313
}
226
- return `[${ version } ]: ${ diffUrl } ` ;
227
- } )
228
- . join ( '\n' ) ;
229
- return `${ unreleasedLinkReferenceDefinition } \n${ releaseLinkReferenceDefinitions } ${
230
- releases . length > 0 ? '\n' : ''
231
- } `;
314
+ }
315
+ return `[${ version } ]: ${ diffUrl } ` ;
316
+ } ) ;
317
+
318
+ return releaseLinkReferenceDefinitions ;
232
319
}
233
320
234
321
type AddReleaseOptions = {
@@ -265,28 +352,35 @@ export default class Changelog {
265
352
266
353
#formatter: Formatter ;
267
354
355
+ readonly #packageRename: PackageRename | undefined ;
356
+
268
357
/**
269
358
* Construct an empty changelog.
270
359
*
271
360
* @param options - Changelog options.
272
361
* @param options.repoUrl - The GitHub repository URL for the current project.
273
362
* @param options.tagPrefix - The prefix used in tags before the version number.
274
363
* @param options.formatter - A function that formats the changelog string.
364
+ * @param options.packageRename - The package rename properties.
365
+ * An optional, which is required only in case of package renamed.
275
366
*/
276
367
constructor ( {
277
368
repoUrl,
278
369
tagPrefix = 'v' ,
279
370
formatter = ( changelog ) => changelog ,
371
+ packageRename,
280
372
} : {
281
373
repoUrl : string ;
282
374
tagPrefix ?: string ;
283
375
formatter ?: Formatter ;
376
+ packageRename ?: PackageRename ;
284
377
} ) {
285
378
this . #releases = [ ] ;
286
379
this . #changes = { [ unreleased ] : { } } ;
287
380
this . #repoUrl = repoUrl ;
288
381
this . #tagPrefix = tagPrefix ;
289
382
this . #formatter = formatter ;
383
+ this . #packageRename = packageRename ;
290
384
}
291
385
292
386
/**
@@ -468,6 +562,7 @@ ${stringifyLinkReferenceDefinitions(
468
562
this . #repoUrl,
469
563
this . #tagPrefix,
470
564
this . #releases,
565
+ this . #packageRename,
471
566
) } `;
472
567
473
568
return this . #formatter( changelog ) ;
0 commit comments