UNPKG

@flxbl-io/sfp

Version:

sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model

243 lines 25.3 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; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _a; Object.defineProperty(exports, "__esModule", { value: true }); const core_1 = require("@salesforce/core"); const SfpCommand_1 = __importDefault(require("../../SfpCommand")); const ReleaseDefinitionLoader_1 = __importDefault(require("../../impl/release/ReleaseDefinitionLoader")); const ProjectConfig_1 = __importDefault(require("../../core/project/ProjectConfig")); const GroupConsoleLogs_1 = __importDefault(require("../../ui/GroupConsoleLogs")); const FetchImpl_1 = __importDefault(require("../../impl/artifacts/FetchImpl")); const path = require("path"); const ArtifactFetcher_1 = __importDefault(require("../../core/artifacts/ArtifactFetcher")); const SfpPackage_1 = require("../../core/package/SfpPackage"); const SfpPackageBuilder_1 = __importDefault(require("../../core/package/SfpPackageBuilder")); const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger")); const SfpPackageInquirer_1 = __importDefault(require("../../core/package/SfpPackageInquirer")); const Git_1 = __importDefault(require("../../core/git/Git")); const fs = __importStar(require("fs-extra")); const sfp_logger_2 = require("@flxbl-io/sfp-logger"); const os_1 = require("os"); const sfp_logger_3 = require("@flxbl-io/sfp-logger"); const sfp_logger_4 = require("@flxbl-io/sfp-logger"); const core_2 = require("@oclif/core"); const sfdxflags_1 = require("../../flags/sfdxflags"); core_1.Messages.importMessagesDirectory(__dirname); const messages = core_1.Messages.loadMessages('@flxbl-io/sfp', 'patch'); class Patch extends SfpCommand_1.default { async execute() { let git; try { let logger = new sfp_logger_1.ConsoleLogger(); sfp_logger_1.default.log((0, sfp_logger_4.COLOR_HEADER)(`Source Branch: ${this.flags.sourcebranchname}`), sfp_logger_1.LoggerLevel.INFO, logger); sfp_logger_1.default.log((0, sfp_logger_4.COLOR_HEADER)(`Release Definition: ${this.flags.releasedefinitions}`), sfp_logger_1.LoggerLevel.INFO, logger); sfp_logger_1.default.log((0, sfp_logger_4.COLOR_HEADER)(`Target Branch: ${this.flags.targetbranchname}`), sfp_logger_1.LoggerLevel.INFO, logger); sfp_logger_1.default.printHeaderLine('', sfp_logger_4.COLOR_HEADER, sfp_logger_1.LoggerLevel.INFO); //Load release definition let releaseDefinitions = await this.loadReleaseDefintions(this.flags.releasedefinitions); sfp_logger_1.default.log(os_1.EOL, sfp_logger_1.LoggerLevel.INFO, logger); sfp_logger_1.default.log((0, sfp_logger_3.COLOR_WARNING)('This process may take a bit of time'), sfp_logger_1.LoggerLevel.INFO, logger); //Create temporary git rep git = await Git_1.default.initiateRepoAtTempLocation(logger, null, this.flags.sourcebranchname); await git.createBranch(this.flags.targetbranchname); //Fetch artifacts await this.fetchArtifacts(releaseDefinitions, this.flags.scriptpath, this.flags.scope, this.flags.npmrcpath, logger); //overwrite modules await this.overwriteModules(releaseDefinitions, git, logger); sfp_logger_1.default.log((0, sfp_logger_2.COLOR_KEY_MESSAGE)(`Patching of Branch ${this.flags.targetbranchname} with release ${this.flags.releasedefinitions} completed`), sfp_logger_1.LoggerLevel.INFO); sfp_logger_1.default.log((0, sfp_logger_2.COLOR_KEY_MESSAGE)(`New Branch with patches created ${this.flags.targetbranchname}`), sfp_logger_1.LoggerLevel.INFO); } finally { if (git) await git.deleteTempoRepoIfAny(); } } async fetchArtifacts(releaseDefintions, fetchArtifactScript, scope, npmrcPath, logger) { let groupSection = new GroupConsoleLogs_1.default('Fetching artifacts').begin(); sfp_logger_1.default.log((0, sfp_logger_2.COLOR_KEY_MESSAGE)('Fetching artifacts'), sfp_logger_1.LoggerLevel.INFO, logger); let fetchImpl = new FetchImpl_1.default('artifacts', fetchArtifactScript, scope, npmrcPath, logger); await fetchImpl.fetchArtifacts(releaseDefintions); groupSection.end(); } async loadReleaseDefintions(releaseDefinitionPaths) { let releaseDefinitions = []; for (const pathToReleaseDefintion of releaseDefinitionPaths) { let releaseDefinition = await ReleaseDefinitionLoader_1.default.loadReleaseDefinition(pathToReleaseDefintion); releaseDefinitions.push(releaseDefinition); } return releaseDefinitions; } async overwriteModules(releaseDefinitions, git, logger) { let temporaryWorkingDirectory = git.getRepositoryPath(); let revisedProjectConfig = ProjectConfig_1.default.getSFDXProjectConfig(temporaryWorkingDirectory); for (const releaseDefinition of releaseDefinitions) { let revisedArtifactDirectory = path.join('artifacts', releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-')); if (releaseDefinition.releaseConfigName) { revisedArtifactDirectory = path.join('artifacts', releaseDefinition.releaseConfigName.replace(/[/\\?%*:|"<>]/g, '-'), releaseDefinition.release.replace(/[/\\?%*:|"<>]/g, '-')); } let artifacts = ArtifactFetcher_1.default.fetchArtifacts(revisedArtifactDirectory, null, logger); if (artifacts.length === 0) throw new Error(`No artifacts to deploy found in ${revisedArtifactDirectory}`); //Convert artifacts to SfpPackages let sfpPackages = await this.generateSfpPackageFromArtifacts(artifacts, logger); //Grab the latest projectConfig from Packages let sfpPackageInquirer = new SfpPackageInquirer_1.default(sfpPackages, logger); let sfdxProjectConfigFromLeadingArtifact = sfpPackageInquirer.getLatestProjectConfig(); let idx = 0; for (const sfpPackage of sfpPackages) { sfp_logger_1.default.log(`Processing package ${sfpPackage.packageName}`); let packageDescriptorFromArtifact = ProjectConfig_1.default.getPackageDescriptorFromConfig(sfpPackage.packageName, sfdxProjectConfigFromLeadingArtifact); //Retrieve the project directory path from the current working directory and remove it try { //Find path let pathToPackageInSourceBranch = ProjectConfig_1.default.getPackageDescriptorFromConfig(sfpPackage.packageName, revisedProjectConfig).path; //Remove the path mentioned in the target path fs.removeSync(path.join(temporaryWorkingDirectory, pathToPackageInSourceBranch)); } catch (error) { //Package not found, do nothing } //Create new path as mentioned in artifact fs.mkdirpSync(path.join(temporaryWorkingDirectory, sfpPackage.packageDirectory)); //Copy from artifacts to each package directory //If diff, artifact will only contain delta, so use the version control to checkout the entire reference if (sfpPackage.packageType == SfpPackage_1.PackageType.Diff) { await git.checkoutPath(sfpPackage.commitSHATo, sfpPackage.packageDirectory); } else { fs.copySync(path.join(sfpPackage.sourceDir, sfpPackage.packageDirectory), path.join(temporaryWorkingDirectory, sfpPackage.packageDirectory)); } sfp_logger_1.default.log((0, sfp_logger_2.COLOR_KEY_MESSAGE)(`Succesfully copied from artifact ${sfpPackage.packageName} ${sfpPackage.package_version_number} to target directory`), sfp_logger_1.LoggerLevel.INFO); //Find package index and replace the descriptor from the artifact let packageIndex = this.getPackageIndex(sfpPackage.packageName, revisedProjectConfig); if (packageIndex != -1) { revisedProjectConfig.packageDirectories = revisedProjectConfig.packageDirectories.map((sfdxPackage) => { if (sfdxPackage.package == sfpPackage.packageName) { delete packageDescriptorFromArtifact.default; return packageDescriptorFromArtifact; } else { return sfdxPackage; } }); } else { //Package is not in the source branch, so find an anchor package let currentIdx = idx--; while (true) { if ((currentIdx = -1)) { //There is no package above me to anchor. so just add it 0 revisedProjectConfig.packageDirectories.splice(0, 0, packageDescriptorFromArtifact); } else { packageIndex = this.getPackageIndex(sfpPackages[currentIdx].packageName, revisedProjectConfig); if (packageIndex >= 0) { revisedProjectConfig.packageDirectories.splice(packageIndex, 0, packageDescriptorFromArtifact); } else currentIdx--; } } } //Write sfdx project.json immediately fs.writeJSONSync(path.join(temporaryWorkingDirectory, 'sfdx-project.json'), revisedProjectConfig, { spaces: 4, }); //Commit to git try { await git.commitFile([sfpPackage.packageDescriptor.path, 'sfdx-project.json'], `Reset ${sfpPackage.packageName} to ${sfpPackage.package_version_number}`); await git.addAnnotatedTag(`${sfpPackage.packageName}_v${sfpPackage.package_version_number}-ALIGN`, `${sfpPackage.packageName} ${sfpPackage.packageType} Package ${sfpPackage.package_version_number}`); } catch (error) { //Ignore } sfp_logger_1.default.log((0, sfp_logger_2.COLOR_KEY_MESSAGE)(`Processed ${sfpPackage.packageName} to ${sfpPackage.package_version_number}`), sfp_logger_1.LoggerLevel.INFO); idx++; } sfp_logger_1.default.log('Packages' + sfpPackages.length, sfp_logger_1.LoggerLevel.TRACE, logger); } //Push back await git.pushToRemote(this.flags.targetbranchname, true); await git.pushTags(); } async generateSfpPackageFromArtifacts(artifacts, logger) { let sfpPackages = []; for (const artifact of artifacts) { let sfpPackage = await SfpPackageBuilder_1.default.buildPackageFromArtifact(artifact, logger); sfpPackages.push(sfpPackage); } return sfpPackages; } getPackageIndex(sfdxPackage, projectConfig) { return projectConfig.packageDirectories.find((packageDescriptor) => packageDescriptor.package == sfdxPackage); } } _a = Patch; Patch.description = messages.getMessage('commandDescription'); Patch.examples = [`$ sfp repo:patch -n <releaseName>`]; Patch.requiresProject = true; Patch.requiresDevhubUsername = false; Patch.flags = { releasedefinitions: (0, sfdxflags_1.arrayFlagSfdxStyle)({ char: 'p', required: true, description: messages.getMessage('releaseDefinitionFlagDescription'), }), sourcebranchname: core_2.Flags.string({ char: 's', required: true, description: messages.getMessage('sourcebranchNameFlagDescription'), }), targetbranchname: core_2.Flags.string({ char: 't', required: true, description: messages.getMessage('targetbranchNameFlagDescription'), }), scriptpath: core_2.Flags.file({ char: 'f', description: messages.getMessage('scriptPathFlagDescription'), }), npm: core_2.Flags.boolean({ description: messages.getMessage('npmFlagDescription'), exclusive: ['scriptpath'], }), scope: core_2.Flags.string({ description: messages.getMessage('scopeFlagDescription'), dependsOn: ['npm'], parse: async (scope) => scope.replace(/@/g, '').toLowerCase(), }), npmrcpath: core_2.Flags.file({ description: messages.getMessage('npmrcPathFlagDescription'), dependsOn: ['npm'], required: false, }), logsgroupsymbol: sfdxflags_1.logsgroupsymbol, loglevel: sfdxflags_1.loglevel }; exports.default = Patch; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvcmVwby9wYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE0QztBQUM1QyxrRUFBMEM7QUFDMUMseUdBQWlGO0FBQ2pGLHFGQUE2RDtBQUM3RCxpRkFBeUQ7QUFDekQsK0VBQXVEO0FBRXZELDZCQUE4QjtBQUM5QiwyRkFBaUY7QUFDakYsOERBQXdFO0FBQ3hFLDZGQUFxRTtBQUNyRSxtRUFBcUY7QUFDckYsK0ZBQXVFO0FBQ3ZFLDZEQUFxQztBQUNyQyw2Q0FBK0I7QUFDL0IscURBQXlEO0FBQ3pELDJCQUF5QjtBQUN6QixxREFBcUQ7QUFDckQscURBQW9EO0FBQ3BELHNDQUFvQztBQUNwQyxxREFBc0Y7QUFFdEYsZUFBUSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzVDLE1BQU0sUUFBUSxHQUFHLGVBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRWpFLE1BQXFCLEtBQU0sU0FBUSxvQkFBVTtJQThDekMsS0FBSyxDQUFDLE9BQU87UUFDVCxJQUFJLEdBQUcsQ0FBQztRQUNSLElBQUksQ0FBQztZQUNELElBQUksTUFBTSxHQUFXLElBQUksMEJBQWEsRUFBRSxDQUFDO1lBRXpDLG9CQUFTLENBQUMsR0FBRyxDQUNULElBQUEseUJBQVksRUFBQyxrQkFBa0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQzdELHdCQUFXLENBQUMsSUFBSSxFQUNoQixNQUFNLENBQ1QsQ0FBQztZQUNGLG9CQUFTLENBQUMsR0FBRyxDQUNULElBQUEseUJBQVksRUFBQyx1QkFBdUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQ3BFLHdCQUFXLENBQUMsSUFBSSxFQUNoQixNQUFNLENBQ1QsQ0FB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