Socket
Socket
Sign inDemoInstall

@metamask/auto-changelog

Package Overview
Dependencies
Maintainers
12
Versions
19
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@metamask/auto-changelog - npm Package Compare versions

Comparing version 3.3.0 to 3.4.0

dist/shared-types.d.ts

6

dist/changelog.d.ts
import { ChangeCategory, Version } from './constants';
import { PackageRename } from './shared-types';
/**

@@ -51,7 +52,10 @@ * Formatter function that formats a Markdown changelog string.

* @param options.formatter - A function that formats the changelog string.
* @param options.packageRename - The package rename properties.
* An optional, which is required only in case of package renamed.
*/
constructor({ repoUrl, tagPrefix, formatter, }: {
constructor({ repoUrl, tagPrefix, formatter, packageRename, }: {
repoUrl: string;
tagPrefix?: string;
formatter?: Formatter;
packageRename?: PackageRename;
});

@@ -58,0 +62,0 @@ /**

116

dist/changelog.js

@@ -16,4 +16,5 @@ "use strict";

};
var _Changelog_releases, _Changelog_changes, _Changelog_repoUrl, _Changelog_tagPrefix, _Changelog_formatter;
var _Changelog_releases, _Changelog_changes, _Changelog_repoUrl, _Changelog_tagPrefix, _Changelog_formatter, _Changelog_packageRename;
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("@metamask/utils");
const semver_1 = __importDefault(require("semver"));

@@ -59,3 +60,4 @@ const constants_1 = require("./constants");

.map((category) => {
const changes = categories[category];
var _a;
const changes = (_a = categories[category]) !== null && _a !== void 0 ? _a : [];
return stringifyCategory(category, changes);

@@ -123,15 +125,21 @@ })

* @param releases - The releases to generate link definitions for.
* @param packageRename - The package rename properties
* An optional, which is required only in case of package renamed.
* @returns The stringified release link definitions.
*/
function stringifyLinkReferenceDefinitions(repoUrl, tagPrefix, releases) {
// A list of release versions in descending SemVer order
const descendingSemverVersions = releases
.map(({ version }) => version)
.sort((a, b) => {
return semver_1.default.gt(a, b) ? -1 : 1;
});
const latestSemverVersion = descendingSemverVersions[0];
// A list of release versions in chronological order
const chronologicalVersions = releases.map(({ version }) => version);
const hasReleases = chronologicalVersions.length > 0;
function stringifyLinkReferenceDefinitions(repoUrl, tagPrefix, releases, packageRename) {
const unreleasedLinkReferenceDefinition = getUnreleasedLinkReferenceDefinition(repoUrl, tagPrefix, releases, packageRename);
const releaseLinkReferenceDefinitions = getReleaseLinkReferenceDefinitions(repoUrl, tagPrefix, releases, packageRename).join('\n');
return `${unreleasedLinkReferenceDefinition}\n${releaseLinkReferenceDefinitions}${releases.length > 0 ? '\n' : ''}`;
}
/**
* Get a string of unreleased link reference definition.
*
* @param repoUrl - The URL for the GitHub repository.
* @param tagPrefix - The prefix used in tags before the version number.
* @param releases - The releases to generate link definitions for.
* @param packageRename - The package rename properties.
* @returns A unreleased link reference definition string.
*/
function getUnreleasedLinkReferenceDefinition(repoUrl, tagPrefix, releases, packageRename) {
// The "Unreleased" section represents all changes made since the *highest*

@@ -147,5 +155,29 @@ // release, not the most recent release. This is to accomodate patch releases

// the link definition.
const unreleasedLinkReferenceDefinition = `[${constants_1.unreleased}]: ${hasReleases
? getCompareUrl(repoUrl, `${tagPrefix}${latestSemverVersion}`, 'HEAD')
// A list of release versions in descending SemVer order
const descendingSemverVersions = releases
.map(({ version }) => version)
.sort((a, b) => {
return semver_1.default.gt(a, b) ? -1 : 1;
});
const latestSemverVersion = descendingSemverVersions[0];
const hasReleases = descendingSemverVersions.length > 0;
// if there is a package renamed, the tag prefix before the rename will be considered for compare
// [Unreleased]: https://github.com/ExampleUsernameOrOrganization/ExampleRepository/compare/test@0.0.2...HEAD
const tagPrefixToCompare = packageRename && packageRename.versionBeforeRename === latestSemverVersion
? packageRename.tagPrefixBeforeRename
: tagPrefix;
return `[${constants_1.unreleased}]: ${hasReleases
? getCompareUrl(repoUrl, `${tagPrefixToCompare}${latestSemverVersion}`, 'HEAD')
: withTrailingSlash(repoUrl)}`;
}
/**
* Get a list of release link reference definitions.
*
* @param repoUrl - The URL for the GitHub repository.
* @param tagPrefix - The prefix used in tags before the version number.
* @param releases - The releases to generate link definitions for.
* @param packageRename - The package rename properties.
* @returns A list of release link reference definitions.
*/
function getReleaseLinkReferenceDefinitions(repoUrl, tagPrefix, releases, packageRename) {
// The "previous" release that should be used for comparison is not always

@@ -155,7 +187,12 @@ // the most recent release chronologically. The _highest_ version that is

// patch releases on older releases can be accomodated.
const releaseLinkReferenceDefinitions = releases
.map(({ version }) => {
const chronologicalVersions = releases.map(({ version }) => version);
let tagPrefixToCompare = tagPrefix;
const releaseLinkReferenceDefinitions = releases.map(({ version }) => {
let diffUrl;
// once the version matches with versionBeforeRename, rest of the lines in changelog will be assumed as migrated tags
if (packageRename && packageRename.versionBeforeRename === version) {
tagPrefixToCompare = packageRename.tagPrefixBeforeRename;
}
if (version === chronologicalVersions[chronologicalVersions.length - 1]) {
diffUrl = getTagUrl(repoUrl, `${tagPrefix}${version}`);
diffUrl = getTagUrl(repoUrl, `${tagPrefixToCompare}${version}`);
}

@@ -169,10 +206,24 @@ else {

});
diffUrl = previousVersion
? getCompareUrl(repoUrl, `${tagPrefix}${previousVersion}`, `${tagPrefix}${version}`)
: getTagUrl(repoUrl, `${tagPrefix}${version}`);
if (previousVersion) {
if (packageRename &&
packageRename.versionBeforeRename === previousVersion) {
// The package was renamed at this version
// (the tag prefix holds the new name).
diffUrl = getCompareUrl(repoUrl, `${packageRename.tagPrefixBeforeRename}${previousVersion}`, `${tagPrefix}${version}`);
}
else {
// If the package was ever renamed, it was not renamed at this version,
// so use either the old tag prefix or the new tag prefix.
// If the package was never renamed, use the tag prefix as it is.
diffUrl = getCompareUrl(repoUrl, `${tagPrefixToCompare}${previousVersion}`, `${tagPrefixToCompare}${version}`);
}
}
else {
// This is the smallest release.
diffUrl = getTagUrl(repoUrl, `${tagPrefixToCompare}${version}`);
}
}
return `[${version}]: ${diffUrl}`;
})
.join('\n');
return `${unreleasedLinkReferenceDefinition}\n${releaseLinkReferenceDefinitions}${releases.length > 0 ? '\n' : ''}`;
});
return releaseLinkReferenceDefinitions;
}

@@ -196,4 +247,6 @@ /**

* @param options.formatter - A function that formats the changelog string.
* @param options.packageRename - The package rename properties.
* An optional, which is required only in case of package renamed.
*/
constructor({ repoUrl, tagPrefix = 'v', formatter = (changelog) => changelog, }) {
constructor({ repoUrl, tagPrefix = 'v', formatter = (changelog) => changelog, packageRename, }) {
_Changelog_releases.set(this, void 0);

@@ -204,2 +257,3 @@ _Changelog_changes.set(this, void 0);

_Changelog_formatter.set(this, void 0);
_Changelog_packageRename.set(this, void 0);
__classPrivateFieldSet(this, _Changelog_releases, [], "f");

@@ -210,2 +264,3 @@ __classPrivateFieldSet(this, _Changelog_changes, { [constants_1.unreleased]: {} }, "f");

__classPrivateFieldSet(this, _Changelog_formatter, formatter, "f");
__classPrivateFieldSet(this, _Changelog_packageRename, packageRename, "f");
}

@@ -296,2 +351,3 @@ /**

migrateUnreleasedChangesToRelease(version) {
var _a, _b;
const releaseChanges = __classPrivateFieldGet(this, _Changelog_changes, "f")[version];

@@ -302,7 +358,7 @@ if (!releaseChanges) {

const unreleasedChanges = __classPrivateFieldGet(this, _Changelog_changes, "f")[constants_1.unreleased];
for (const category of Object.keys(unreleasedChanges)) {
for (const category of (0, utils_1.getKnownPropertyNames)(unreleasedChanges)) {
if (releaseChanges[category]) {
releaseChanges[category] = [
...unreleasedChanges[category],
...releaseChanges[category],
...((_a = unreleasedChanges[category]) !== null && _a !== void 0 ? _a : []),
...((_b = releaseChanges[category]) !== null && _b !== void 0 ? _b : []),
];

@@ -376,3 +432,3 @@ }

${stringifyLinkReferenceDefinitions(__classPrivateFieldGet(this, _Changelog_repoUrl, "f"), __classPrivateFieldGet(this, _Changelog_tagPrefix, "f"), __classPrivateFieldGet(this, _Changelog_releases, "f"))}`;
${stringifyLinkReferenceDefinitions(__classPrivateFieldGet(this, _Changelog_repoUrl, "f"), __classPrivateFieldGet(this, _Changelog_tagPrefix, "f"), __classPrivateFieldGet(this, _Changelog_releases, "f"), __classPrivateFieldGet(this, _Changelog_packageRename, "f"))}`;
return __classPrivateFieldGet(this, _Changelog_formatter, "f").call(this, changelog);

@@ -382,3 +438,3 @@ }

exports.default = Changelog;
_Changelog_releases = new WeakMap(), _Changelog_changes = new WeakMap(), _Changelog_repoUrl = new WeakMap(), _Changelog_tagPrefix = new WeakMap(), _Changelog_formatter = new WeakMap();
_Changelog_releases = new WeakMap(), _Changelog_changes = new WeakMap(), _Changelog_repoUrl = new WeakMap(), _Changelog_tagPrefix = new WeakMap(), _Changelog_formatter = new WeakMap(), _Changelog_packageRename = new WeakMap();
//# sourceMappingURL=changelog.js.map

@@ -116,4 +116,6 @@ #!/usr/bin/env node

* @param options.formatter - A custom Markdown formatter to use.
* @param options.packageRename - The package rename properties.
* An optional, which is required only in case of package renamed.
*/
async function validate({ changelogPath, currentVersion, isReleaseCandidate, repoUrl, tagPrefix, fix, formatter, }) {
async function validate({ changelogPath, currentVersion, isReleaseCandidate, repoUrl, tagPrefix, fix, formatter, packageRename, }) {
const changelogContent = await readChangelog(changelogPath);

@@ -128,2 +130,3 @@ try {

formatter,
packageRename,
});

@@ -200,2 +203,10 @@ return undefined;

type: 'string',
})
.option('versionBeforePackageRename', {
description: 'A version of the package before being renamed.',
type: 'string',
})
.option('tagPrefixBeforePackageRename', {
description: 'A tag prefix of the package before being renamed.',
type: 'string',
});

@@ -252,3 +263,3 @@ }

.usage(`Utilities for validating and updating "Keep a Changelog" formatted changelogs.\nUsage: $0 [command] [options]`);
const { file: changelogFilename, rc: isReleaseCandidate, repo: repoUrl, root: projectRootDirectory, tagPrefix, fix, prettier: usePrettier, } = argv;
const { file: changelogFilename, rc: isReleaseCandidate, repo: repoUrl, root: projectRootDirectory, tagPrefix, fix, prettier: usePrettier, versionBeforePackageRename, tagPrefixBeforePackageRename, } = argv;
let { currentVersion } = argv;

@@ -312,2 +323,6 @@ if (projectRootDirectory) {

}
if ((versionBeforePackageRename && !tagPrefixBeforePackageRename) ||
(!versionBeforePackageRename && tagPrefixBeforePackageRename)) {
return exitWithError('--version-before-package-rename and --tag-prefix-before-package-rename must be given together or not at all.');
}
let changelogPath = changelogFilename;

@@ -350,2 +365,9 @@ if (!path_1.default.isAbsolute(changelogFilename) && projectRootDirectory) {

else if (command === 'validate') {
let packageRename;
if (versionBeforePackageRename && tagPrefixBeforePackageRename) {
packageRename = {
versionBeforeRename: versionBeforePackageRename,
tagPrefixBeforeRename: tagPrefixBeforePackageRename,
};
}
await validate({

@@ -359,2 +381,3 @@ changelogPath,

formatter,
packageRename,
});

@@ -361,0 +384,0 @@ }

import Changelog, { Formatter } from './changelog';
import { PackageRename } from './shared-types';
/**

@@ -11,5 +12,7 @@ * Constructs a Changelog instance that represents the given changelog, which

* @param options.formatter - A custom Markdown formatter to use.
* @param options.packageRename - The package rename properties
* An optional, which is required only in case of package renamed.
* @returns A changelog instance that reflects the changelog text provided.
*/
export declare function parseChangelog({ changelogContent, repoUrl, tagPrefix, formatter, }: {
export declare function parseChangelog({ changelogContent, repoUrl, tagPrefix, formatter, packageRename, }: {
changelogContent: string;

@@ -19,2 +22,3 @@ repoUrl: string;

formatter?: Formatter;
packageRename?: PackageRename;
}): Changelog;

@@ -37,7 +37,14 @@ "use strict";

* @param options.formatter - A custom Markdown formatter to use.
* @param options.packageRename - The package rename properties
* An optional, which is required only in case of package renamed.
* @returns A changelog instance that reflects the changelog text provided.
*/
function parseChangelog({ changelogContent, repoUrl, tagPrefix = 'v', formatter = undefined, }) {
function parseChangelog({ changelogContent, repoUrl, tagPrefix = 'v', formatter = undefined, packageRename, }) {
const changelogLines = changelogContent.split('\n');
const changelog = new changelog_1.default({ repoUrl, tagPrefix, formatter });
const changelog = new changelog_1.default({
repoUrl,
tagPrefix,
formatter,
packageRename,
});
const unreleasedHeaderIndex = changelogLines.indexOf(`## [${constants_1.unreleased}]`);

@@ -44,0 +51,0 @@ if (unreleasedHeaderIndex === -1) {

@@ -161,5 +161,2 @@ "use strict";

async function updateChangelog({ changelogContent, currentVersion, repoUrl, isReleaseCandidate, projectRootDirectory, tagPrefixes = ['v'], formatter = undefined, }) {
if (isReleaseCandidate && !currentVersion) {
throw new Error(`A version must be specified if 'isReleaseCandidate' is set.`);
}
const changelog = (0, parse_changelog_1.parseChangelog)({

@@ -176,6 +173,2 @@ changelogContent,

});
if (isReleaseCandidate &&
mostRecentTag === `${tagPrefixes[0]}${currentVersion || ''}`) {
throw new Error(`Current version already has tag, which is unexpected for a release candidate.`);
}
const commitRange = mostRecentTag === null ? 'HEAD' : `${mostRecentTag}..HEAD`;

@@ -191,29 +184,32 @@ const commitsHashesSinceLastRelease = await getCommitHashesInRange(commitRange, projectRootDirectory);

}
// Ensure release header exists, if necessary
if (isReleaseCandidate &&
!changelog
if (isReleaseCandidate) {
if (!currentVersion) {
throw new Error(`A version must be specified if 'isReleaseCandidate' is set.`);
}
if (mostRecentTag === `${tagPrefixes[0]}${currentVersion !== null && currentVersion !== void 0 ? currentVersion : ''}`) {
throw new Error(`Current version already has a tag ('${mostRecentTag}'), which is unexpected for a release candidate.`);
}
// Ensure release header exists, if necessary
if (!changelog
.getReleases()
.find((release) => release.version === currentVersion)) {
// Typecast: currentVersion will be defined here due to type guard at the
// top of this function.
changelog.addRelease({ version: currentVersion });
}
if (isReleaseCandidate && hasUnreleasedChanges) {
// Typecast: currentVersion will be defined here due to type guard at the
// top of this function.
changelog.migrateUnreleasedChangesToRelease(currentVersion);
}
const newChangeEntries = newCommits.map(({ prNumber, description }) => {
if (prNumber) {
const suffix = `([#${prNumber}](${repoUrl}/pull/${prNumber}))`;
return `${description} ${suffix}`;
changelog.addRelease({ version: currentVersion });
}
return description;
});
for (const description of newChangeEntries.reverse()) {
changelog.addChange({
version: isReleaseCandidate ? currentVersion : undefined,
category: constants_1.ChangeCategory.Uncategorized,
description,
if (hasUnreleasedChanges) {
changelog.migrateUnreleasedChangesToRelease(currentVersion);
}
const newChangeEntries = newCommits.map(({ prNumber, description }) => {
if (prNumber) {
const suffix = `([#${prNumber}](${repoUrl}/pull/${prNumber}))`;
return `${description} ${suffix}`;
}
return description;
});
for (const description of newChangeEntries.reverse()) {
changelog.addChange({
version: isReleaseCandidate ? currentVersion : undefined,
category: constants_1.ChangeCategory.Uncategorized,
description,
});
}
}

@@ -220,0 +216,0 @@ return changelog.toString();

import { Formatter } from './changelog';
import { Version } from './constants';
import { PackageRename } from './shared-types';
/**

@@ -54,2 +55,6 @@ * Indicates that the changelog is invalid.

formatter?: Formatter;
/**
* The package rename properties, used in case of package is renamed
*/
packageRename?: PackageRename;
};

@@ -71,2 +76,4 @@ /**

* @param options.formatter - A custom Markdown formatter to use.
* @param options.packageRename - The package rename properties.
* An optional, which is required only in case of package renamed.
* @throws `InvalidChangelogError` - Will throw if the changelog is invalid

@@ -82,3 +89,3 @@ * @throws `MissingCurrentVersionError` - Will throw if `isReleaseCandidate` is

*/
export declare function validateChangelog({ changelogContent, currentVersion, repoUrl, isReleaseCandidate, tagPrefix, formatter, }: ValidateChangelogOptions): void;
export declare function validateChangelog({ changelogContent, currentVersion, repoUrl, isReleaseCandidate, tagPrefix, formatter, packageRename, }: ValidateChangelogOptions): void;
export {};

@@ -78,2 +78,4 @@ "use strict";

* @param options.formatter - A custom Markdown formatter to use.
* @param options.packageRename - The package rename properties.
* An optional, which is required only in case of package renamed.
* @throws `InvalidChangelogError` - Will throw if the changelog is invalid

@@ -89,3 +91,3 @@ * @throws `MissingCurrentVersionError` - Will throw if `isReleaseCandidate` is

*/
function validateChangelog({ changelogContent, currentVersion, repoUrl, isReleaseCandidate, tagPrefix = 'v', formatter = undefined, }) {
function validateChangelog({ changelogContent, currentVersion, repoUrl, isReleaseCandidate, tagPrefix = 'v', formatter = undefined, packageRename, }) {
var _a, _b;

@@ -97,2 +99,3 @@ const changelog = (0, parse_changelog_1.parseChangelog)({

formatter,
packageRename,
});

@@ -99,0 +102,0 @@ const hasUnreleasedChanges = Object.keys(changelog.getUnreleasedChanges()).length !== 0;

{
"name": "@metamask/auto-changelog",
"version": "3.3.0",
"version": "3.4.0",
"description": "Utilities for validating and updating \"Keep a Changelog\" formatted changelogs",

@@ -46,2 +46,3 @@ "publishConfig": {

"@metamask/eslint-config-typescript": "^11.1.0",
"@metamask/utils": "^8.1.0",
"@types/cross-spawn": "^6.0.2",

@@ -48,0 +49,0 @@ "@types/diff": "^5.0.0",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc