@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
165 lines • 17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const url_1 = require("url");
const markdownTable = require('markdown-table');
class ChangelogMarkdownGenerator {
constructor(releaseChangelog, workItemURL, limit, showAllArtifacts, isForWorkItemOnlyOutput = false) {
this.releaseChangelog = releaseChangelog;
this.workItemURL = workItemURL;
this.limit = limit;
this.showAllArtifacts = showAllArtifacts;
this.isForWorkItemOnlyOutput = isForWorkItemOnlyOutput;
}
/**
* Generate markdown from ReleaseChangelog
* @returns
*/
generate() {
let payload = '';
if (this.releaseChangelog.orgs && !this.isForWorkItemOnlyOutput) {
payload = this.generateOrgs(this.releaseChangelog.orgs, payload);
}
payload = this.generateReleases(payload);
return payload;
}
generateReleases(payload) {
let limitReleases;
if (this.limit <= this.releaseChangelog.releases.length)
limitReleases = this.releaseChangelog.releases.length - this.limit;
else
limitReleases = 0; // no limit
// Generate in descending order, starting from latest release
for (let releaseNum = this.releaseChangelog.releases.length - 1; releaseNum >= limitReleases; releaseNum--) {
let release = this.releaseChangelog.releases[releaseNum];
if (!release.names) {
payload += `\n<a id=${release['name']}></a>\n `; // Create anchor from release hash Id
payload += `## ${release['name']}\n`;
}
else {
payload += `\n<a id=${release.hashId}></a>\n`; // Create anchor from release hash Id
payload += `## ${release.names.join(`/`)}\n `;
payload += `Cumulative Release Number: <b>${release.buildNumber}</b> \n\n`;
if (release.date && !this.isForWorkItemOnlyOutput)
payload += `Matching definition first created or deployed to an org on: ${release.date}\n `;
}
if (!this.isForWorkItemOnlyOutput)
payload = this.generateArtifacts(payload, release);
payload = this.generateWorkItems(payload, release);
if (!this.isForWorkItemOnlyOutput) {
let versionChangeOnly = [];
let noChangeInVersion = [];
payload = this.generateCommits(payload, release, versionChangeOnly, noChangeInVersion);
if (versionChangeOnly.length > 0) {
payload += '\n### Additional Information\n';
payload += `The following artifacts' version may have changed due to an update in the scratch org definition file, `;
payload += `incremented package version in SFDX project configuration, or build all packages:\n`;
versionChangeOnly.forEach((artifactName) => (payload += ` - ${artifactName}\n`));
}
if (noChangeInVersion.length > 0 && this.showAllArtifacts) {
payload += '\nArtifacts with no changes:\n';
noChangeInVersion.forEach((artifactName) => (payload += ` - ${artifactName}\n`));
}
}
}
return payload;
}
generateCommits(payload, release, versionChangeOnly, noChangeInVersion) {
let isCommitsSectionEmpty = true;
payload += '\n### Commits :book:\n';
for (let artifact of release.artifacts) {
if (artifact.from !== artifact.to) {
if (artifact.commits.length > 0) {
isCommitsSectionEmpty = false;
payload += `\n#### ${artifact.name}\n`;
let tableOfCommits = [['Date', 'Time', 'Commit ID', 'Commit Message']];
for (let commit of artifact.commits) {
let commitDate = new Date(commit.date);
let specificCommitURL;
if (artifact.repoUrl != null) {
if (artifact.repoUrl.startsWith("git")) {
specificCommitURL = ""; //no http url available
}
else if (artifact.repoUrl.includes("github.com")) {
let repoUrl = artifact.repoUrl.split('.git')[0];
specificCommitURL = `${repoUrl}/commit/${commit.commitId}`;
}
else {
specificCommitURL = ""; //other git providers are not supported
}
}
tableOfCommits.push([
this.getDate(commitDate),
this.getTime(commitDate),
artifact.repoUrl ? `[${commit.commitId}](${specificCommitURL})` : commit.commitId,
commit.message,
]);
}
payload += markdownTable(tableOfCommits) + '\n';
}
else {
versionChangeOnly.push(artifact.name);
}
}
else if (artifact.from === artifact.to) {
noChangeInVersion.push(artifact.name);
}
}
if (isCommitsSectionEmpty) {
payload += `N/A\n`;
}
return payload;
}
generateWorkItems(payload, release) {
payload += '### Work Items :gem:\n';
if (Object.keys(release.workItems).length > 0) {
for (let workItem in release.workItems) {
let specificWorkItemURL;
if (this.workItemURL != null) {
if (this.workItemURL.endsWith('/')) {
specificWorkItemURL = this.workItemURL.concat(workItem);
}
else {
specificWorkItemURL = this.workItemURL.concat(`/${workItem}`);
}
}
payload += `[${workItem}](${specificWorkItemURL})\n`;
}
}
else {
payload += `N/A\n`;
}
return payload;
}
generateArtifacts(payload, release) {
payload += '### Artifacts :package:\n';
for (let artifactNum = 0; artifactNum < release.artifacts.length; artifactNum++) {
if (release.artifacts[artifactNum].from !== release.artifacts[artifactNum].to || this.showAllArtifacts)
payload += `- **${release.artifacts[artifactNum].name}** v${release.artifacts[artifactNum].version} (${release.artifacts[artifactNum].to})\n\n`;
}
return payload;
}
generateOrgs(orgs, payload) {
const baseAddr = 'https://img.shields.io/static/v1';
for (let org of orgs) {
let url = new url_1.URL(`?label=${org.name}&message=${org.latestRelease.names[org.latestRelease.names.length - 1]}-${org.latestRelease.buildNumber}(${org.retryCount})&color=green`, baseAddr);
payload += `[![${org.name}-${org.latestRelease.names[org.latestRelease.names.length - 1]}-${org.latestRelease.buildNumber}(${org.retryCount})-green](${url.toString()})](#${org.latestRelease.hashId}) `;
}
return payload;
}
getDate(date) {
let day = date.getDate();
let month = date.getMonth();
let year = date.getFullYear();
let pad = (n) => (n < 10 ? '0' + n : n);
return pad(day) + '/' + pad(month + 1) + '/' + year;
}
getTime(date) {
let hours = date.getHours();
let minutes = date.getMinutes();
let seconds = date.getSeconds();
let pad = (n) => (n < 10 ? '0' + n : n);
return pad(hours) + ':' + pad(minutes) + ':' + pad(seconds);
}
}
exports.default = ChangelogMarkdownGenerator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hhbmdlbG9nTWFya2Rvd25HZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW1wbC9jaGFuZ2Vsb2cvQ2hhbmdlbG9nTWFya2Rvd25HZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSw2QkFBMEI7QUFFMUIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFaEQsTUFBcUIsMEJBQTBCO0lBQzNDLFlBQ1ksZ0JBQWtDLEVBQ2xDLFdBQW1CLEVBQ25CLEtBQWEsRUFDYixnQkFBeUIsRUFDekIsMEJBQWdDLEtBQUs7UUFKckMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUNuQixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFTO1FBQ3pCLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBYztJQUM5QyxDQUFDO0lBRUo7OztPQUdHO0lBQ0gsUUFBUTtRQUNKLElBQUksT0FBTyxHQUFXLEVBQUUsQ0FBQztRQUV6QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksQ0FBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUcsQ0FBQztZQUNoRSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFRCxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpDLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxPQUFlO1FBQ3BDLElBQUksYUFBcUIsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQ25ELGFBQWEs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