UNPKG

@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
"use strict"; 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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