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