UNPKG

@flxbl-io/sfp

Version:

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

180 lines 17.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 fs = __importStar(require("fs-extra")); const ValidateError_1 = __importDefault(require("../../errors/ValidateError")); const sfdxflags_1 = require("../../flags/sfdxflags"); const core_2 = require("@oclif/core"); core_1.Messages.importMessagesDirectory(__dirname); const messages = core_1.Messages.loadMessages('@flxbl-io/sfp', 'validateAgainstOrg'); class ValidateAgainstOrg extends SfpCommand_1.default { async execute() { let executionStartTime = Date.now(); 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)(`validateAgainstOrg`)}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Target Org: ${this.flags.targetorg}`)); if (this.flags.releaseconfig) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Domains: ${this.flags.releaseconfig}`)); } 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.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}`)); } 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}`)); } sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, core_1.LoggerLevel.INFO); let validateResult; try { let validateProps = { validateAgainst: ValidateImpl_1.ValidateAgainst.PROVIDED_ORG, 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, targetOrg: this.flags.targetorg, diffcheck: this.flags.diffcheck, branch: this.flags.ref, baseBranch: this.flags.baseRef, disableArtifactCommit: this.flags.disableartifactupdate, disableSourcePackageOverride: this.flags.disablesourcepkgoverride, disableParallelTestExecution: this.flags.disableparalleltesting, orgInfo: this.flags.orginfo, installExternalDependencies: this.flags.installdeps, }; //Add check for devhub if (this.flags.devhubalias) { validateProps.hubOrg = await core_1.Org.create({ aliasOrUsername: this.flags.devhubalias }); } setReleaseConfigForReleaseBasedModes(this.flags.releaseconfig, validateProps); let validateImpl = new ValidateImpl_1.default(validateProps); validateResult = await validateImpl.exec(); } catch (error) { if (error instanceof ValidateError_1.default) { validateResult = error.data; } 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; } } } } ValidateAgainstOrg.aliases = ['orchestrator:validateagainstorg', 'validateAgainstOrg']; ValidateAgainstOrg.description = messages.getMessage('commandDescription'); ValidateAgainstOrg.examples = [`$ sfp validate org -o <targetorg>`]; ValidateAgainstOrg.flags = { targetorg: sfdxflags_1.requiredUserNameFlag, mode: core_2.Flags.string({ description: 'validation mode', default: 'thorough', required: true, options: ['individual', 'fastfeedback', 'thorough', 'ff-release-config', 'thorough-release-config'], }), releaseconfig: (0, sfdxflags_1.arrayFlagSfdxStyle)({ aliases: ['domain'], description: messages.getMessage('releaseConfigFileFlagDescription'), }), coveragepercent: core_2.Flags.integer({ description: messages.getMessage('coveragePercentFlagDescription'), default: 75, }), diffcheck: core_2.Flags.boolean({ description: messages.getMessage('diffCheckFlagDescription'), default: false, }), disableartifactupdate: core_2.Flags.boolean({ description: messages.getMessage('disableArtifactUpdateFlagDescription'), default: false, }), logsgroupsymbol: sfdxflags_1.logsgroupsymbol, ref: core_2.Flags.string({ aliases: ['branch'], dependsOn: ['baseRef'], description: messages.getMessage('refFlagDescription'), }), baseRef: core_2.Flags.string({ aliases: ['basebranch'], description: messages.getMessage('baseRefFlagDescription'), }), orginfo: core_2.Flags.boolean({ description: messages.getMessage('orgInfoFlagDescription'), default: false, }), installdeps: core_2.Flags.boolean({ description: messages.getMessage('installDepsFlagDescription'), default: false, }), devhubalias: sfdxflags_1.targetdevhubusername, disablesourcepkgoverride: core_2.Flags.boolean({ description: messages.getMessage('disableSourcePackageOverride'), dependsOn: ['devhubalias'] }), disableparalleltesting: core_2.Flags.boolean({ description: messages.getMessage('disableParallelTestingFlagDescription'), default: false, }), loglevel: sfdxflags_1.loglevel }; exports.default = ValidateAgainstOrg; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3ZhbGlkYXRlL29yZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQThEO0FBQzlELGtFQUEwQztBQUMxQyxpRkFBZ0g7QUFDaEgscUZBQTZEO0FBQzdELG1FQUFrRjtBQUNsRiw2Q0FBK0I7QUFDL0IsK0VBQXVEO0FBRXZELHFEQUFrSTtBQUNsSSxzQ0FBb0M7QUFHcEMsZUFBUSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzVDLE1BQU0sUUFBUSxHQUFHLGVBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLG9CQUFvQixDQUFDLENBQUM7QUFFOUUsTUFBcUIsa0JBQW1CLFNBQVEsb0JBQVU7SUE0RHRELEtBQUssQ0FBQyxPQUFPO1FBQ1QsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFcEMsSUFBSSxJQUE2QixDQUFDO1FBQ2xDLElBQUksR0FBRztZQUNILEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3hELGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDaEMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtTQUMxQyxDQUFDO1FBRUYsb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx5QkFBWSxFQUFDLFlBQVksSUFBQSw4QkFBaUIsRUFBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25GLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEseUJBQVksRUFBQyxlQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxD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