@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
180 lines • 14.9 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const CommitUpdater_1 = __importDefault(require("./CommitUpdater"));
const WorkItemUpdater_1 = __importDefault(require("./WorkItemUpdater"));
const OrgsUpdater_1 = __importDefault(require("./OrgsUpdater"));
const fs = __importStar(require("fs-extra"));
let hash = require('object-hash');
class ReleaseChangelogUpdater {
constructor(releaseChangelog, releaseName, artifactsToSfpPackage, packagesToChangelogFilePaths, workItemFilters, org) {
this.releaseChangelog = releaseChangelog;
this.releaseName = releaseName;
this.artifactsToSfpPackage = artifactsToSfpPackage;
this.packagesToChangelogFilePaths = packagesToChangelogFilePaths;
this.workItemFilters = workItemFilters;
this.org = org;
}
update() {
let buildNumber;
if (this.releaseChangelog.releases[this.releaseChangelog.releases.length - 1]?.buildNumber) {
buildNumber = this.releaseChangelog.releases[this.releaseChangelog.releases.length - 1].buildNumber + 1;
}
else {
buildNumber = 1;
}
let latestRelease = this.initLatestRelease(this.releaseName, buildNumber, this.artifactsToSfpPackage);
let releaseWithMatchingHashId = this.findRelease(this.releaseChangelog.releases, latestRelease);
if (!releaseWithMatchingHashId) {
let artifactsToLatestCommitId;
if (this.releaseChangelog.releases.length > 0) {
artifactsToLatestCommitId = this.getArtifactsToLatestCommitId(this.releaseChangelog, latestRelease);
}
let readPackageChangelog = (changelogFilePath) => {
return JSON.parse(fs.readFileSync(changelogFilePath, 'utf8'));
};
new CommitUpdater_1.default(latestRelease, artifactsToLatestCommitId, this.packagesToChangelogFilePaths, readPackageChangelog).update();
new WorkItemUpdater_1.default(latestRelease, this.workItemFilters).update();
this.releaseChangelog.releases.push(latestRelease);
}
else {
if (!this.containsLatestReleaseName(releaseWithMatchingHashId.names, latestRelease.names[0])) {
// append latestReleaseName
releaseWithMatchingHashId.names.push(latestRelease.names[0]);
}
}
if (this.org) {
new OrgsUpdater_1.default(this.releaseChangelog, latestRelease, this.org, releaseWithMatchingHashId).update();
}
return this.releaseChangelog;
}
/**
* Get map of artifacts to the latest commit Id in past releases
* Also sets artifact "from" property
* @param releaseChangelog
* @param latestRelease
* @returns
*/
getArtifactsToLatestCommitId(releaseChangelog, latestRelease) {
let artifactsToLatestCommitId = {};
for (let latestReleaseArtifact of latestRelease.artifacts) {
loopThroughReleases: for (let i = releaseChangelog.releases.length - 1; i >= 0; i--) {
for (let artifact of releaseChangelog.releases[i].artifacts) {
if (artifact.name === latestReleaseArtifact.name) {
latestReleaseArtifact.from = artifact.to;
artifactsToLatestCommitId[latestReleaseArtifact.name] = artifact.latestCommitId;
break loopThroughReleases;
}
}
}
}
return artifactsToLatestCommitId;
}
/**
* Finds release with matching hash Id
* Returns null if match cannot be found
* @param releaseChangelog
* @param latestRelease
* @returns
*/
findRelease(releases, latestRelease) {
let foundRelease = null;
if (releases.length > 0) {
// First level matching with hashId
foundRelease = releases.find(release => release.hashId === latestRelease.hashId);
// If not found by hashId, proceed to next level matching with names and artifacts
if (foundRelease == null) {
// Create a map for constant time lookup of all release's artifacts
const allArtifacts = new Map();
for (let release of releases) {
for (let artifact of release.artifacts) {
if (allArtifacts.has(artifact.name)) {
allArtifacts.get(artifact.name).push(artifact.version);
}
else {
allArtifacts.set(artifact.name, [artifact.version]);
}
}
}
// Check if all artifacts in the latest release exist in previous releases
let isAllArtifactsAlreadyAvailablePreviously = true;
for (let artifact of latestRelease.artifacts) {
if (!allArtifacts.has(artifact.name) || !allArtifacts.get(artifact.name).includes(artifact.version)) {
isAllArtifactsAlreadyAvailablePreviously = false;
break;
}
}
// If all artifacts match, check for names
if (isAllArtifactsAlreadyAvailablePreviously) {
for (let release of releases) {
if (release.names.includes(latestRelease.names[0])) {
foundRelease = release;
break;
}
}
}
}
}
return foundRelease;
}
/**
* Initalise latest release
* @param releaseName
* @param artifactsToSfpPackage
* @returns
*/
initLatestRelease(releaseName, buildNumber, artifactsToSfpPackage) {
let latestRelease = {
names: [releaseName],
buildNumber: buildNumber,
workItems: {},
artifacts: [],
hashId: undefined,
};
for (let sfpPackage of Object.values(artifactsToSfpPackage)) {
let artifact = {
name: sfpPackage.packageName,
from: undefined,
to: sfpPackage.sourceVersion?.slice(0, 8),
version: sfpPackage.package_version_number,
repoUrl: sfpPackage.repository_url,
latestCommitId: undefined,
commits: undefined,
};
latestRelease['artifacts'].push(artifact);
}
latestRelease.hashId = hash(latestRelease.artifacts);
latestRelease.date = new Date().toString();
return latestRelease;
}
containsLatestReleaseName(releaseNames, latestReleaseName) {
return releaseNames.find((name) => name.toLowerCase() === latestReleaseName.toLowerCase()) ? true : false;
}
}
exports.default = ReleaseChangelogUpdater;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsZWFzZUNoYW5nZWxvZ1VwZGF0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW1wbC9jaGFuZ2Vsb2cvUmVsZWFzZUNoYW5nZWxvZ1VwZGF0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLG9FQUE0QztBQUM1Qyx3RUFBZ0Q7QUFDaEQsZ0VBQXdDO0FBRXhDLDZDQUErQjtBQUUvQixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7QUFFbEMsTUFBcUIsdUJBQXVCO0lBQ3hDLFlBQ1ksZ0JBQWtDLEVBQ2xDLFdBQW1CLEVBQ25CLHFCQUFrRCxFQUNsRCw0QkFBcUQsRUFDckQsZUFBeUIsRUFDekIsR0FBVztRQUxYLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUE2QjtRQUNsRCxpQ0FBNEIsR0FBNUIsNEJBQTRCLENBQXlCO1FBQ3JELG9CQUFlLEdBQWYsZUFBZSxDQUFVO1FBQ3pCLFFBQUcsR0FBSCxHQUFHLENBQVE7SUFDbkIsQ0FBQztJQUVMLE1BQU07UUFDRixJQUFJLFdBQW1CLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ3pGLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDNUcsQ0FBQzthQUFNLENBQUM7WUFDSixXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFFRCxJ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