UNPKG

@flxbl-io/sfp

Version:

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

209 lines 19.2 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 core_1 = require("@salesforce/core"); const SfpCommand_1 = __importDefault(require("../../SfpCommand")); const ValidateImpl_1 = __importStar(require("../../impl/validate/ValidateImpl")); const SFPStatsSender_1 = __importDefault(require("../../core/stats/SFPStatsSender")); const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger")); const ValidateError_1 = __importDefault(require("../../errors/ValidateError")); const fs = __importStar(require("fs-extra")); const sfdxflags_1 = require("../../flags/sfdxflags"); const core_2 = require("@oclif/core"); const sfp_logger_2 = require("@flxbl-io/sfp-logger"); core_1.Messages.importMessagesDirectory(__dirname); const messages = core_1.Messages.loadMessages('@flxbl-io/sfp', 'validate'); class ValidateAgainstPool extends SfpCommand_1.default { async execute() { let executionStartTime = Date.now(); await this.hubOrg.refreshAuth(); let tags; tags = { tag: this.flags.tag != null ? this.flags.tag : undefined, validation_mode: this.flags.mode, releaseConfig: this.flags.releaseconfig, }; sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`command: ${(0, sfp_logger_1.COLOR_KEY_MESSAGE)(`validate`)}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Pools being used: ${this.flags.pools}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Validation Mode: ${(0, sfp_logger_1.COLOR_KEY_MESSAGE)(`${ValidateImpl_1.ValidationMode[Object.keys(ValidateImpl_1.ValidationMode)[Object.values(ValidateImpl_1.ValidationMode).indexOf(this.flags.mode)]]}`)}`)); if (this.flags.releaseconfig) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Domains: ${this.flags.releaseconfig}`)); } if (this.flags.mode != ValidateImpl_1.ValidationMode.FAST_FEEDBACK) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Coverage Percentage: ${this.flags.coveragepercent}`)); } if (this.flags.ref) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Ref: ${this.flags.ref}`)); } if (this.flags.baseRef) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Base Ref: ${this.flags.baseRef}`)); } sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_2.LoggerLevel.INFO); let validateResult; try { let validateProps = { validateAgainst: ValidateImpl_1.ValidateAgainst.PRECREATED_POOL, validationMode: ValidateImpl_1.ValidationMode[Object.keys(ValidateImpl_1.ValidationMode)[Object.values(ValidateImpl_1.ValidationMode).indexOf(this.flags.mode)]], coverageThreshold: this.flags.coveragepercent, logsGroupSymbol: this.flags.logsgroupsymbol, pools: this.flags.pools, hubOrg: this.hubOrg, shapeFile: this.flags.shapefile, isDeleteScratchOrg: this.flags.deletescratchorg, keys: this.flags.keys, branch: this.flags.ref, baseBranch: this.flags.baseRef, diffcheck: !this.flags.disablediffcheck, disableArtifactCommit: true, orgInfo: this.flags.orginfo, disableSourcePackageOverride: this.flags.disablesourcepkgoverride, disableParallelTestExecution: this.flags.disableparalleltesting, installExternalDependencies: this.flags.installdeps, }; setReleaseConfigForReleaseBasedModes(this.flags.releaseconfig, validateProps); let validateImpl = new ValidateImpl_1.default(validateProps); validateResult = await validateImpl.exec(); SFPStatsSender_1.default.logCount('validate.succeeded', tags); } catch (error) { if (error instanceof ValidateError_1.default) { validateResult = error.data; } else sfp_logger_1.default.log(error.message); SFPStatsSender_1.default.logCount('validate.failed', tags); process.exitCode = 1; } finally { let totalElapsedTime = Date.now() - executionStartTime; SFPStatsSender_1.default.logGauge('validate.duration', totalElapsedTime, tags); SFPStatsSender_1.default.logCount('validate.scheduled', tags); if (validateResult) { SFPStatsSender_1.default.logGauge('validate.packages.scheduled', validateResult.deploymentResult?.scheduled, tags); SFPStatsSender_1.default.logGauge('validate.packages.succeeded', validateResult.deploymentResult?.deployed?.length, tags); SFPStatsSender_1.default.logGauge('validate.packages.failed', validateResult.deploymentResult?.failed?.length, tags); } } function setReleaseConfigForReleaseBasedModes(releaseConfigPaths, validateProps) { if (validateProps.validationMode == ValidateImpl_1.ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG || validateProps.validationMode == ValidateImpl_1.ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG) { if (!releaseConfigPaths || releaseConfigPaths.length === 0) { throw new Error(`Release config paths are required when using validation by release config`); } const validPaths = releaseConfigPaths.filter(path => fs.existsSync(path)); if (validPaths.length === 0) { throw new Error(`None of the provided release config paths exist, please check the paths: ${releaseConfigPaths.join(', ')}`); } // Assuming validateProps can handle an array of paths; adjust as per your implementation validateProps.releaseConfigPaths = validPaths; } } } } ValidateAgainstPool.aliases = ['orchestrator:validate', 'validate']; ValidateAgainstPool.requiresProject = true; ValidateAgainstPool.description = messages.getMessage('commandDescription'); ValidateAgainstPool.requiresDevhubUsername = true; ValidateAgainstPool.examples = [ `$ sfp validate -p "POOL_TAG_1,POOL_TAG_2" -v <devHubUsername>`, ]; //Fix Typo ValidateAgainstPool.flags = { pools: (0, sfdxflags_1.arrayFlagSfdxStyle)({ char: 'p', description: messages.getMessage('poolsFlagDescription'), required: true, }), targetdevhubusername: sfdxflags_1.targetdevhubusername, mode: core_2.Flags.string({ description: 'validation mode', default: 'thorough', required: true, options: ['individual', 'fastfeedback', 'thorough', 'ff-release-config', 'thorough-release-config'], }), installdeps: core_2.Flags.boolean({ description: messages.getMessage('installDepsFlagDescription'), default: false, }), releaseconfig: (0, sfdxflags_1.arrayFlagSfdxStyle)({ aliases: ['domain'], description: messages.getMessage('releaseConfigFileFlagDescription'), }), coveragepercent: core_2.Flags.integer({ description: messages.getMessage('coveragePercentFlagDescription'), default: 75, }), disablesourcepkgoverride: core_2.Flags.boolean({ description: messages.getMessage('disableSourcePackageOverride'), default: false, }), deletescratchorg: core_2.Flags.boolean({ char: 'x', description: messages.getMessage('deleteScratchOrgFlagDescription'), default: false, }), orginfo: core_2.Flags.boolean({ description: messages.getMessage('orgInfoFlagDescription'), default: false, }), keys: core_2.Flags.string({ required: false, description: messages.getMessage('keysFlagDescription'), }), ref: core_2.Flags.string({ aliases: ['branch'], dependsOn: ['baseRef'], description: messages.getMessage('refFlagDescription'), }), baseRef: core_2.Flags.string({ aliases: ['basebranch'], description: messages.getMessage('baseRefFlagDescription'), }), tag: core_2.Flags.string({ description: messages.getMessage('tagFlagDescription'), }), disableparalleltesting: core_2.Flags.boolean({ description: messages.getMessage('disableParallelTestingFlagDescription'), default: false, }), disablediffcheck: core_2.Flags.boolean({ description: messages.getMessage('disableDiffCheckFlagDescription'), default: false, }), disableartifactupdate: core_2.Flags.boolean({ description: messages.getMessage('disableArtifactUpdateFlagDescription'), deprecated: { message: "disableartifactupdate flag is deprecated, Artifacts used for validation are never recorded in the org " }, default: false, }), logsgroupsymbol: sfdxflags_1.logsgroupsymbol, loglevel: sfdxflags_1.loglevel }; exports.default = ValidateAgainstPool; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy92YWxpZGF0ZS9wb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNEM7QUFDNUMsa0VBQTBDO0FBQzFDLGlGQUFnSDtBQUNoSCxxRkFBNkQ7QUFDN0QsbUVBQWtGO0FBQ2xGLCtFQUF1RDtBQUV2RCw2Q0FBK0I7QUFDL0IscURBQTRHO0FBQzVHLHNDQUFvQztBQUNwQyxxREFBbUQ7QUFFbkQsZUFBUSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzVDLE1BQU0sUUFBUSxHQUFHLGVBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBRXBFLE1BQXFCLG1CQUFvQixTQUFRLG9CQUFVO0lBc0Z2RCxLQUFLLENBQUMsT0FBTztRQUNULElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXBDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVoQyxJQUFJLElBQTZCLENBQUM7UUFDbEMsSUFBSSxHQUFHO1lBQ0gsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDeEQsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtZQUNoQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO1NBQzFDLENBQUM7UUFFRixvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLHlCQUFZLEVBQUMsWUFBWSxJQUFBLDhCQUFpQixFQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEs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