@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
148 lines • 15 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const ArtifactGenerator_1 = __importDefault(require("./core/artifacts/generators/ArtifactGenerator"));
const sfp_logger_1 = require("@flxbl-io/sfp-logger");
const PackageDiffImpl_1 = __importDefault(require("./core/package/diff/PackageDiffImpl"));
const core_1 = require("@salesforce/core");
const os_1 = require("os");
const SfpCommand_1 = __importDefault(require("./SfpCommand"));
const SfpPackage_1 = require("./core/package/SfpPackage");
const GetFormattedTime_1 = __importDefault(require("./core/utils/GetFormattedTime"));
const fs = require('fs-extra');
const Git_1 = __importDefault(require("./core/git/Git"));
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', 'create-package');
class PackageCreateCommand extends SfpCommand_1.default {
/**
* Entry point for package installation commands
*
*/
async execute() {
let isToCreatePackage = await this.preCreate();
if (isToCreatePackage) {
try {
let packageMetadata = await this.create();
await this.postCreate(packageMetadata);
}
catch (err) {
console.log(err);
process.exit(1);
}
}
}
async preCreate() {
this.sfdxPackage = this.flags.package;
this.versionNumber = this.flags.versionnumber;
this.artifactDirectory = this.flags.artifactdir;
this.refname = this.flags.refname;
this.branch = this.flags.branch;
if (this.hubOrg)
await this.hubOrg.refreshAuth();
let isToRunBuild;
if (this.flags.diffcheck) {
let packageDiffImpl = new PackageDiffImpl_1.default(new sfp_logger_1.ConsoleLogger(), this.sfdxPackage, null);
let isToRunBuild = (await packageDiffImpl.exec()).isToBeBuilt;
if (isToRunBuild)
console.log(`Detected changes to ${this.sfdxPackage} package...proceeding\n`);
else
console.log(`No changes detected for ${this.sfdxPackage} package...skipping\n`);
}
else
isToRunBuild = true;
if (isToRunBuild) {
let git = await Git_1.default.initiateRepo(new sfp_logger_1.ConsoleLogger());
this.repositoryURL = await git.getRemoteOriginUrl(this.flags.repourl);
this.commitId = await git.getHeadCommit();
}
return isToRunBuild;
}
async postCreate(sfpPackage) {
this.printPackageDetails(sfpPackage);
if (this.flags.gittag) {
let git = await Git_1.default.initiateRepo(new sfp_logger_1.ConsoleLogger());
let tagname = `${this.sfdxPackage}_v${sfpPackage.package_version_number}`;
await git.addAnnotatedTag(tagname, `${sfpPackage.packageName} sfp package ${sfpPackage.package_version_number}`);
sfpPackage.tag = tagname;
}
//Generate Artifact
let artifactFilepath = await ArtifactGenerator_1.default.generateArtifact(sfpPackage, process.cwd(), this.artifactDirectory);
this.generateEnvironmentVariables(artifactFilepath, sfpPackage);
}
generateEnvironmentVariables(artifactFilepath, sfpPackage) {
let prefix = 'sfp';
if (this.refname != null)
prefix = `${this.refname}_${prefix}`;
console.log('\nOutput variables:');
fs.writeFileSync('.env', `${prefix}_artifact_directory=${artifactFilepath}\n`, { flag: 'a' });
console.log(`${prefix}_artifact_directory=${artifactFilepath}`);
fs.writeFileSync('.env', `${prefix}_package_version_number=${sfpPackage.package_version_number}\n`, {
flag: 'a',
});
console.log(`${prefix}_package_version_number=${sfpPackage.package_version_number}`);
if (sfpPackage.package_version_id) {
fs.writeFileSync('.env', `${prefix}_package_version_id=${sfpPackage.package_version_id}\n`, {
flag: 'a',
});
console.log(`${prefix}_package_version_id=${sfpPackage.package_version_id}`);
}
}
printPackageDetails(sfpPackage) {
console.log((0, sfp_logger_1.COLOR_HEADER)(`${os_1.EOL}${sfpPackage.packageName} package created in ${(0, GetFormattedTime_1.default)(sfpPackage.creation_details.creation_time)}`));
console.log((0, sfp_logger_1.COLOR_HEADER)(`-- Package Details:--`));
console.log((0, sfp_logger_1.COLOR_HEADER)(`-- Package Version Number: `), (0, sfp_logger_1.COLOR_KEY_MESSAGE)(sfpPackage.package_version_number));
if (sfpPackage.package_type !== SfpPackage_1.PackageType.Data) {
if (sfpPackage.package_type == SfpPackage_1.PackageType.Unlocked) {
if (sfpPackage.package_version_id)
console.log((0, sfp_logger_1.COLOR_HEADER)(`-- Package Version Id: `), (0, sfp_logger_1.COLOR_KEY_MESSAGE)(sfpPackage.package_version_id));
if (sfpPackage.test_coverage)
console.log((0, sfp_logger_1.COLOR_HEADER)(`-- Package Test Coverage: `), (0, sfp_logger_1.COLOR_KEY_MESSAGE)(sfpPackage.test_coverage));
if (sfpPackage.has_passed_coverage_check)
console.log((0, sfp_logger_1.COLOR_HEADER)(`-- Package Coverage Check Passed: `), (0, sfp_logger_1.COLOR_KEY_MESSAGE)(sfpPackage.has_passed_coverage_check));
}
console.log((0, sfp_logger_1.COLOR_HEADER)(`-- Apex In Package: `), (0, sfp_logger_1.COLOR_KEY_MESSAGE)(sfpPackage.isApexFound ? 'Yes' : 'No'));
console.log((0, sfp_logger_1.COLOR_HEADER)(`-- Profiles In Package: `), (0, sfp_logger_1.COLOR_KEY_MESSAGE)(sfpPackage.isProfilesFound ? 'Yes' : 'No'));
console.log((0, sfp_logger_1.COLOR_HEADER)(`-- Metadata Count: `), (0, sfp_logger_1.COLOR_KEY_MESSAGE)(sfpPackage.metadataCount));
}
}
}
PackageCreateCommand.requiresUsername = false;
PackageCreateCommand.requiresDevhubUsername = false;
PackageCreateCommand.requiresProject = true;
PackageCreateCommand.flags = {
package: core_2.Flags.string({
required: true,
char: 'n',
description: messages.getMessage('packageFlagDescription'),
}),
diffcheck: core_2.Flags.boolean({
description: messages.getMessage('diffCheckFlagDescription'),
}),
gittag: core_2.Flags.boolean({
description: messages.getMessage('gitTagFlagDescription'),
}),
repourl: core_2.Flags.string({
char: 'r',
description: messages.getMessage('repoUrlFlagDescription'),
}),
versionnumber: core_2.Flags.string({
description: messages.getMessage('versionNumberFlagDescription'),
}),
artifactdir: core_2.Flags.directory({
description: messages.getMessage('artifactDirectoryFlagDescription'),
default: 'artifacts',
}),
branch: core_2.Flags.string({
description: messages.getMessage('branchFlagDescription'),
}),
refname: core_2.Flags.string({
description: messages.getMessage('refNameFlagDescription'),
}),
loglevel: sfdxflags_1.loglevel
};
exports.default = PackageCreateCommand;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2FnZUNyZWF0ZUNvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUGFja2FnZUNyZWF0ZUNvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzR0FBOEU7QUFDOUUscURBQXNGO0FBQ3RGLDBGQUFrRTtBQUNsRSwyQ0FBNEM7QUFDNUMsMkJBQXlCO0FBQ3pCLDhEQUFzQztBQUN0QywwREFBb0U7QUFDcEUscUZBQTZEO0FBQzdELE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMvQix5REFBaUM7QUFDakMsc0NBQW9DO0FBQ3BDLGlEQUE2QztBQUU3QyxlQUFRLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDNUMsTUFBTSxRQUFRLEdBQUcsZUFBUSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUUxRSxNQUE4QixvQkFBcUIsU0FBUSxvQkFBVTtJQTZDakU7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDVCxJQUFJLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQy9DLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUM7Z0JBQ0QsSUFBSSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxTQUFTO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtB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