UNPKG

@flxbl-io/sfp

Version:

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

177 lines 17.1 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 }; }; Object.defineProperty(exports, "__esModule", { value: true }); const SfpCommand_1 = __importDefault(require("../SfpCommand")); const core_1 = require("@salesforce/core"); const SFPStatsSender_1 = __importDefault(require("../core/stats/SFPStatsSender")); const DeployImpl_1 = __importStar(require("../impl/deploy/DeployImpl")); const Stage_1 = require("../impl/Stage"); const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger")); const sfp_logger_2 = require("@flxbl-io/sfp-logger"); const GetFormattedTime_1 = __importDefault(require("../core/utils/GetFormattedTime")); const core_2 = require("@oclif/core"); const sfdxflags_1 = require("../flags/sfdxflags"); const sfp_logger_3 = require("@flxbl-io/sfp-logger"); // Initialize Messages with the current plugin directory core_1.Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. const messages = core_1.Messages.loadMessages('@flxbl-io/sfp', 'install'); class Install extends SfpCommand_1.default { async execute() { let executionStartTime = Date.now(); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`command: ${(0, sfp_logger_1.COLOR_KEY_MESSAGE)(`install`)}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Skip artifacts if already installed: ${this.flags.skipifalreadyinstalled}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Artifact Directory: ${this.flags.artifactdir}`)); if (this.flags.artifacts) sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Artifacts to be installed: ${this.flags.artifacts}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Target Environment: ${this.flags.targetorg}`)); if (this.flags.releaseconfig) sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Filter according to: ${this.flags.releaseconfig}`)); if (this.flags.baselineorg) sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Baselined Against Org: ${this.flags.baselineorg}`)); sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_3.LoggerLevel.INFO); let deploymentResult; let tags = { targetOrg: this.flags.targetorg, }; if (this.flags.tag != null) { tags['tag'] = this.flags.tag; } let deployProps = { targetUsername: this.flags.targetorg, artifactDir: this.flags.artifactdir, waitTime: this.flags.waittime, tags: tags, isTestsToBeTriggered: false, deploymentMode: this.flags.enablesourcetracking ? DeployImpl_1.DeploymentMode.SOURCEPACKAGES_PUSH : DeployImpl_1.DeploymentMode.NORMAL, skipIfPackageInstalled: this.flags.skipifalreadyinstalled, logsGroupSymbol: this.flags.logsgroupsymbol, currentStage: Stage_1.Stage.DEPLOY, baselineOrg: this.flags.baselineorg, isRetryOnFailure: this.flags.retryonfailure, releaseConfigPath: this.flags.releaseconfig, filterByProvidedArtifacts: this.flags.artifacts }; try { let deployImpl = new DeployImpl_1.default(deployProps); deploymentResult = await deployImpl.exec(); if (deploymentResult.failed.length > 0 || deploymentResult.error) { process.exitCode = 1; } } catch (error) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(error)); process.exitCode = 1; } finally { let totalElapsedTime = Date.now() - executionStartTime; sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_3.LoggerLevel.INFO); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_SUCCESS)(`${deploymentResult.deployed.length} artifacts installed in ${(0, sfp_logger_2.COLOR_TIME)((0, GetFormattedTime_1.default)(totalElapsedTime))} with {${deploymentResult.failed.length}} errors`)); if (deploymentResult.failed.length > 0) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(`\nArtifacts failed to install:`, deploymentResult.failed.map((packageInfo) => packageInfo.sfpPackage.packageName))); } sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_3.LoggerLevel.INFO); SFPStatsSender_1.default.logCount('deploy.scheduled', tags); SFPStatsSender_1.default.logCount('install.scheduled', tags); SFPStatsSender_1.default.logGauge('deploy.packages.scheduled', deploymentResult.scheduled, tags); SFPStatsSender_1.default.logGauge('install.packages.scheduled', deploymentResult.scheduled, tags); SFPStatsSender_1.default.logGauge('deploy.duration', totalElapsedTime, tags); SFPStatsSender_1.default.logGauge('install.duration', totalElapsedTime, tags); SFPStatsSender_1.default.logGauge('deploy.succeeded.packages', deploymentResult.deployed.length, tags); SFPStatsSender_1.default.logGauge('install.succeeded.packages', deploymentResult.deployed.length, tags); SFPStatsSender_1.default.logGauge('deploy.failed.packages', deploymentResult.failed.length, tags); SFPStatsSender_1.default.logGauge('install.failed.packages', deploymentResult.failed.length, tags); if (deploymentResult.failed.length > 0) { SFPStatsSender_1.default.logCount('deploy.failed', tags); SFPStatsSender_1.default.logCount('install.failed', tags); } else { SFPStatsSender_1.default.logCount('deploy.succeeded', tags); SFPStatsSender_1.default.logCount('install.succeeded', tags); } } } } Install.description = messages.getMessage('commandDescription'); Install.aliases = ['orchestrator:deploy', 'deploy']; Install.examples = [`$ sfp install -o <username>`]; Install.requiresUsername = false; Install.requiresDevhubUsername = false; Install.requiresProject = false; Install.flags = { targetorg: sfdxflags_1.requiredUserNameFlag, artifactdir: core_2.Flags.directory({ description: messages.getMessage('artifactDirectoryFlagDescription'), default: 'artifacts', }), waittime: core_2.Flags.integer({ description: messages.getMessage('waitTimeFlagDescription'), default: 120, }), tag: core_2.Flags.string({ char: 't', description: messages.getMessage('tagFlagDescription'), }), skipifalreadyinstalled: core_2.Flags.boolean({ required: false, default: false, description: messages.getMessage('skipIfAlreadyInstalled'), }), baselineorg: core_2.Flags.string({ char: 'b', description: messages.getMessage('baselineorgFlagDescription'), required: false, dependsOn: ['skipifalreadyinstalled'], }), allowunpromotedpackages: core_2.Flags.boolean({ description: messages.getMessage('allowUnpromotedPackagesFlagDescription'), deprecated: { message: '--allowunpromotedpackages is deprecated, All packages are allowed' }, hidden: true, }), artifacts: (0, sfdxflags_1.arrayFlagSfdxStyle)({ char: 'p', description: messages.getMessage('artifactsOnlyFlagDescription'), }), retryonfailure: core_2.Flags.boolean({ description: messages.getMessage('retryOnFailureFlagDescription'), hidden: true, }), releaseconfig: core_2.Flags.string({ description: messages.getMessage('configFileFlagDescription'), }), enablesourcetracking: core_2.Flags.boolean({ description: messages.getMessage('enableSourceTrackingFlagDescription'), }), logsgroupsymbol: sfdxflags_1.logsgroupsymbol, loglevel: sfdxflags_1.loglevel }; exports.default = Install; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9pbnN0YWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrREFBdUM7QUFDdkMsMkNBQTRDO0FBQzVDLGtGQUEwRDtBQUMxRCx3RUFBc0c7QUFDdEcseUNBQXNDO0FBQ3RDLG1FQUs4QjtBQUM5QixxREFBa0Q7QUFDbEQsc0ZBQThEO0FBQzlELHNDQUFvQztBQUNwQyxrREFBeUc7QUFDekcscURBQW1EO0FBRW5ELHdEQUF3RDtBQUN4RCxlQUFRLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFNUMsaUdBQWlHO0FBQ2pHLG1GQUFtRjtBQUNuRixNQUFNLFFBQVEsR0FBRyxlQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUVuRSxNQUFxQixPQUFRLFNBQVEsb0JBQVU7SUE0RHBDLEtBQUssQ0FBQyxPQUFPO1FBQ2hCLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXBDLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEseUJBQVksRUFBQyxZQUFZLElBQUEsOEJBQWlCLEVBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEUsb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx5QkFBWSxFQUFDLHdDQUF3QyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEseUJBQVksRUFBQyx1QkFBdUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0UsSUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVM7WUFDdkIsb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx5QkFBWSxFQUFDLDhC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