@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
142 lines • 11.7 kB
JavaScript
;
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;
};
Object.defineProperty(exports, "__esModule", { value: true });
const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger"));
const fs = __importStar(require("fs-extra"));
const path = require("path");
const lodash = require("lodash");
const gitUrlParse = require("git-url-parse");
/**
* Methods for getting information about artifacts
*/
class SfpPackageInquirer {
get pathToLatestPackageManifestFromArtifacts() {
return this._pathToLatestPackageManifestFromArtifacts;
}
get prunedLatestPackageManifestFromArtifacts() {
return this._prunedLatestPackageManifestFromArtifacts;
}
constructor(sfpPackages, packageLogger) {
this.sfpPackages = sfpPackages;
this.packageLogger = packageLogger;
}
getLatestProjectConfig() {
let latestPackageManifest = this.getLatestPackageManifestFromArtifacts(this.sfpPackages);
if (latestPackageManifest) {
this._latestPackageManifestFromArtifacts = latestPackageManifest.latestPackageManifest;
this._pathToLatestPackageManifestFromArtifacts = latestPackageManifest.pathToLatestPackageManifest;
this._prunedLatestPackageManifestFromArtifacts = this.pruneLatestPackageManifest(latestPackageManifest.latestPackageManifest, this.sfpPackages);
}
return this._latestPackageManifestFromArtifacts;
}
/**
* Gets latest package manifest from artifacts
* Returns null if unable to find latest package manifest
*/
getLatestPackageManifestFromArtifacts(sfpPackages) {
let latestPackageManifest;
let pathToLatestPackageManifest;
this.validateArtifactsSourceRepository();
let latestSfpPackage;
for (let sfpPackage of sfpPackages) {
if (latestSfpPackage == null ||
latestSfpPackage.creation_details.timestamp < sfpPackage.creation_details.timestamp) {
latestSfpPackage = sfpPackage;
let pathToPackageManifest = path.join(sfpPackage.sourceDir, 'manifests', 'sfdx-project.json.ori');
if (fs.existsSync(pathToPackageManifest)) {
latestPackageManifest = JSON.parse(fs.readFileSync(pathToPackageManifest, 'utf8'));
pathToLatestPackageManifest = pathToPackageManifest;
}
}
}
if (latestPackageManifest) {
sfp_logger_1.default.log(`Found latest package manifest in ${latestSfpPackage.packageName} artifact`, sfp_logger_1.LoggerLevel.INFO, this.packageLogger);
return { latestPackageManifest, pathToLatestPackageManifest };
}
else
return null;
}
/**
* Verify that artifacts are from the same source repository
*/
validateArtifactsSourceRepository() {
let remoteURL;
for (let sfpPackage of this.sfpPackages) {
let currentRemoteURL;
try {
currentRemoteURL = gitUrlParse(sfpPackage.repository_url);
}
catch (ex) {
if (ex instanceof Error && ex.message === 'URL parsing failed.') {
throw new Error(`Invalid repository URL for package '${sfpPackage.package_name}': ${sfpPackage.repository_url}`);
}
else {
throw ex;
}
}
if (remoteURL == null) {
remoteURL = currentRemoteURL;
continue;
}
const propertiesToVerify = [
'source', 'full_name'
];
for (let property of propertiesToVerify) {
if (currentRemoteURL[property] !== remoteURL[property]) {
sfp_logger_1.default.log(`remoteURL: ${JSON.stringify(remoteURL)}`, sfp_logger_1.LoggerLevel.DEBUG, this.packageLogger);
sfp_logger_1.default.log(`currentRemoteURL: ${JSON.stringify(currentRemoteURL)}`, sfp_logger_1.LoggerLevel.DEBUG, this.packageLogger);
throw new Error(`Artifacts must originate from the same source repository, for deployment to work. The artifact ${sfpPackage.packageName} has repository URL that doesn't meet the current repository URL ${JSON.stringify(currentRemoteURL)} not equal ${JSON.stringify(remoteURL)}`);
}
}
}
}
/**
* Remove packages that do not have an artifact from the package manifest
* @param latestPackageManifest
* @param artifacts
*/
pruneLatestPackageManifest(latestPackageManifest, sfpPackages) {
let prunedLatestPackageManifest = lodash.cloneDeep(latestPackageManifest);
let packagesWithArtifacts = [];
sfpPackages.forEach((sfpPackage) => {
packagesWithArtifacts.push(sfpPackage.packageName);
});
let i = prunedLatestPackageManifest.packageDirectories.length;
while (i--) {
if (!packagesWithArtifacts.includes(prunedLatestPackageManifest.packageDirectories[i].package)) {
let removedPackageDirectory = prunedLatestPackageManifest.packageDirectories.splice(i, 1);
// Also remove references to the package as a dependency
prunedLatestPackageManifest.packageDirectories.forEach((pkg) => {
let indexOfDependency = pkg.dependencies?.findIndex((dependency) => dependency.package === removedPackageDirectory[0].package);
if (indexOfDependency >= 0)
pkg.dependencies.splice(indexOfDependency, 1);
});
}
}
return prunedLatestPackageManifest;
}
}
exports.default = SfpPackageInquirer;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2ZwUGFja2FnZUlucXVpcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvcGFja2FnZS9TZnBQYWNrYWdlSW5xdWlyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1FQUFzRTtBQUN0RSw2Q0FBK0I7QUFDL0IsNkJBQThCO0FBQzlCLGlDQUFrQztBQUNsQyw2Q0FBOEM7QUFHOUM7O0dBRUc7QUFDSCxNQUFxQixrQkFBa0I7SUFLbkMsSUFBSSx3Q0FBd0M7UUFDeEMsT0FBTyxJQUFJLENBQUMseUNBQXlDLENBQUM7SUFDMUQsQ0FBQztJQUNELElBQUksd0NBQXdDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLHlDQUF5QyxDQUFDO0lBQzFELENBQUM7SUFFRCxZQUE2QixXQUF5QixFQUFVLGFBQXNCO1FBQXpELGdCQUFXLEdBQVgsV0FBVyxDQUFjO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQVM7SUFBRyxDQUFDO0lBRW5GLHNCQUFzQjtRQUN6QixJQUFJLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFekYsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxtQ0FBbUMsR0FBRyxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQztZQUN2RixJQUFJLENBQUMseUNBQXlDLEdBQUcscUJBQXFCLENBQUMsMkJBQTJCLENBQUM7WUFFbkcsSUFBSSxDQUFDLHlDQUF5QyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FDNUUscUJBQXFCLENBQUMscUJBQXFCLEVBQzNDLElBQUksQ0FBQyxXQUFXLENBQ25CLENBQUM7UUFDTixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsbUNBQW1DLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHFDQUFxQyxDQUN6QyxXQUF5QjtRQUt6QixJQUFJLHFCQUEw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