UNPKG

@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
"use strict"; 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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