@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
JavaScript
;
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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