UNPKG

@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
"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; }; 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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