You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
4.0 KiB
95 lines
4.0 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.parseChangelog = exports.getLocalChangelog = exports.breakingChangesInUpdate = exports.displayReleaseNotes = exports.getReleaseNotesForUpdate = void 0;
|
|
const clc = require("colorette");
|
|
const { marked } = require("marked");
|
|
const path = require("path");
|
|
const semver = require("semver");
|
|
const TerminalRenderer = require("marked-terminal");
|
|
const Table = require("cli-table");
|
|
const extensionsApi_1 = require("./extensionsApi");
|
|
const localHelper_1 = require("./localHelper");
|
|
const logger_1 = require("../logger");
|
|
const refs = require("./refs");
|
|
const utils_1 = require("../utils");
|
|
marked.setOptions({
|
|
renderer: new TerminalRenderer(),
|
|
});
|
|
const EXTENSIONS_CHANGELOG = "CHANGELOG.md";
|
|
const VERSION_LINE_REGEX = /##.*(\d+\.\d+\.\d+(?:-((\d+|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(\d+|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?).*/;
|
|
async function getReleaseNotesForUpdate(args) {
|
|
const releaseNotes = {};
|
|
const filter = `id<="${args.toVersion}" AND id>"${args.fromVersion}"`;
|
|
const extensionVersions = await (0, extensionsApi_1.listExtensionVersions)(args.extensionRef, filter);
|
|
extensionVersions.sort((ev1, ev2) => {
|
|
return -semver.compare(ev1.spec.version, ev2.spec.version);
|
|
});
|
|
for (const extensionVersion of extensionVersions) {
|
|
if (extensionVersion.releaseNotes) {
|
|
const version = refs.parse(extensionVersion.ref).version;
|
|
releaseNotes[version] = extensionVersion.releaseNotes;
|
|
}
|
|
}
|
|
return releaseNotes;
|
|
}
|
|
exports.getReleaseNotesForUpdate = getReleaseNotesForUpdate;
|
|
function displayReleaseNotes(releaseNotes, fromVersion) {
|
|
const versions = [fromVersion].concat(Object.keys(releaseNotes));
|
|
const breakingVersions = breakingChangesInUpdate(versions);
|
|
const table = new Table({ head: ["Version", "What's New"], style: { head: ["yellow", "bold"] } });
|
|
for (const [version, note] of Object.entries(releaseNotes)) {
|
|
if (breakingVersions.includes(version)) {
|
|
table.push([clc.yellow(clc.bold(version)), marked(note)]);
|
|
}
|
|
else {
|
|
table.push([version, marked(note)]);
|
|
}
|
|
}
|
|
logger_1.logger.info(clc.bold("What's new with this update:"));
|
|
if (breakingVersions.length) {
|
|
(0, utils_1.logLabeledWarning)("warning", "This is a major version update, which means it may contain breaking changes." +
|
|
" Read the release notes carefully before continuing with this update.");
|
|
}
|
|
logger_1.logger.info(table.toString());
|
|
}
|
|
exports.displayReleaseNotes = displayReleaseNotes;
|
|
function breakingChangesInUpdate(versionsInUpdate) {
|
|
const breakingVersions = [];
|
|
const semvers = versionsInUpdate.map((v) => semver.parse(v)).sort(semver.compare);
|
|
for (let i = 1; i < semvers.length; i++) {
|
|
const hasMajorBump = semvers[i - 1].major < semvers[i].major;
|
|
const hasMinorBumpInPreview = semvers[i - 1].major === 0 &&
|
|
semvers[i].major === 0 &&
|
|
semvers[i - 1].minor < semvers[i].minor;
|
|
if (hasMajorBump || hasMinorBumpInPreview) {
|
|
breakingVersions.push(semvers[i].raw);
|
|
}
|
|
}
|
|
return breakingVersions;
|
|
}
|
|
exports.breakingChangesInUpdate = breakingChangesInUpdate;
|
|
function getLocalChangelog(directory) {
|
|
const rawChangelog = (0, localHelper_1.readFile)(path.resolve(directory, EXTENSIONS_CHANGELOG));
|
|
return parseChangelog(rawChangelog);
|
|
}
|
|
exports.getLocalChangelog = getLocalChangelog;
|
|
function parseChangelog(rawChangelog) {
|
|
const changelog = {};
|
|
let currentVersion = "";
|
|
for (const line of rawChangelog.split("\n")) {
|
|
const matches = line.match(VERSION_LINE_REGEX);
|
|
if (matches) {
|
|
currentVersion = matches[1];
|
|
}
|
|
else if (currentVersion) {
|
|
if (!changelog[currentVersion]) {
|
|
changelog[currentVersion] = line;
|
|
}
|
|
else {
|
|
changelog[currentVersion] += `\n${line}`;
|
|
}
|
|
}
|
|
}
|
|
return changelog;
|
|
}
|
|
exports.parseChangelog = parseChangelog;
|