UNPKG

@flxbl-io/sfp

Version:

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

231 lines 19.5 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 sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger")); const QueryHelper_1 = __importDefault(require("../queryHelper/QueryHelper")); const AliasList_1 = require("../utils/AliasList"); const ObjectCRUDHelper_1 = __importDefault(require("../utils/ObjectCRUDHelper")); const InstalledPackagesQueryExecutor_1 = __importDefault(require("./packageQuery/InstalledPackagesQueryExecutor")); const dedent_1 = __importDefault(require("dedent")); class SFPOrg extends core_1.Org { /** * Get list of all artifacts in an org */ async getInstalledArtifacts(orderBy = `CreatedDate`, logger) { let records = []; try { records = await QueryHelper_1.default.query(`SELECT Id, Name, CommitId__c, Version__c, Tag__c FROM SfpowerscriptsArtifact2__c ORDER BY ${orderBy} ASC`, this.getConnection(), false); return records; } catch (error) { sfp_logger_1.default.log('Unable to fetch any sfp artifacts in the org\n' + '1. sfpowerscripts artifact package is not installed in the org\n' + '2. The required prerequisite object is not deployed to this org\n', sfp_logger_1.LoggerLevel.WARN, logger); } return records; } /** * Check whether an artifact is installed in a Org * @param {Logger} logger * @param {SfpPackage} sfpPackage */ async isArtifactInstalledInOrg(logger, sfpPackage) { let result = { isInstalled: false, }; try { sfp_logger_1.default.log(`Querying for version of ${sfpPackage.packageName} in the Org.`, sfp_logger_1.LoggerLevel.TRACE, logger); result.isInstalled = false; let installedArtifacts = await this.getInstalledArtifacts(); let packageName = sfpPackage.packageName; for (const artifact of installedArtifacts) { if (artifact.Name === packageName) { result.versionNumber = artifact.Version__c; if (artifact.Version__c === sfpPackage.package_version_number) { result.isInstalled = true; return result; } } } } catch (error) { sfp_logger_1.default.log('Unable to fetch any sfp artifacts in the org\n' + '1. sfp package is not installed in the org\n' + '2. The required prerequisite object is not deployed to this org\n', sfp_logger_1.LoggerLevel.WARN, logger); } return result; } /** * Updates or Create information about an artifact in the org * @param {Logger} logger * @param {SfpPackage} sfpPackage */ async updateArtifactInOrg(logger, sfpPackage) { try { let artifactId = await this.getArtifactRecordId(sfpPackage); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_MESSAGE)(`Existing artifact record id for ${sfpPackage.packageName} in Org for ${sfpPackage.package_version_number}: ${artifactId ? artifactId : 'N/A'}`), sfp_logger_1.LoggerLevel.INFO, logger); let packageName = sfpPackage.package_name; if (artifactId == null) { artifactId = await ObjectCRUDHelper_1.default.createRecord(this.getConnection(), 'SfpowerscriptsArtifact2__c', { Name: packageName, Tag__c: sfpPackage.tag, Version__c: sfpPackage.package_version_number, CommitId__c: sfpPackage.sourceVersion, }); } else { artifactId = await ObjectCRUDHelper_1.default.updateRecord(this.getConnection(), 'SfpowerscriptsArtifact2__c', { Id: artifactId, Name: packageName, Tag__c: sfpPackage.tag, Version__c: sfpPackage.package_version_number, CommitId__c: sfpPackage.sourceVersion, }); } sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_MESSAGE)(`Updated Org with new Artifact ${packageName} ${sfpPackage.sourceVersion} ${sfpPackage.package_version_number} ${artifactId ? artifactId : ''}`), sfp_logger_1.LoggerLevel.INFO, logger); return artifactId; } catch (error) { sfp_logger_1.default.log((0, dedent_1.default)(`Unable to fetch any sfp artifacts in the org,skipping updates in the org - 1. sfp artifact package is not installed in the org - 2. The required prerequisite object is not deployed to this org`), sfp_logger_1.LoggerLevel.WARN, logger); } } async getArtifactRecordId(sfpPackage) { let installedArtifacts = await this.getInstalledArtifacts(); let packageName = sfpPackage.packageName; for (const artifact of installedArtifacts) { if (artifact.Name === packageName) { return artifact.Id; } } return null; } /** * Retrieves all packages(recognized by Salesforce) installed in the org */ async getAllInstalled2GPPackages() { const installedPackages = []; let records = await InstalledPackagesQueryExecutor_1.default.exec(this.getConnection()); records.forEach((record) => { let packageVersionNumber = `${record.SubscriberPackageVersion.MajorVersion}.${record.SubscriberPackageVersion.MinorVersion}.${record.SubscriberPackageVersion.PatchVersion}.${record.SubscriberPackageVersion.BuildNumber}`; let packageDetails = { name: record.SubscriberPackage.Name, package2Id: record.SubscriberPackageId, namespacePrefix: record.SubscriberPackage.NamespacePrefix, subscriberPackageVersionId: record.SubscriberPackageVersion.Id, versionNumber: packageVersionNumber, type: record.SubscriberPackageVersion.Package2ContainerOptions, isOrgDependent: record.SubscriberPackageVersion.IsOrgDependent, }; installedPackages.push(packageDetails); }); return installedPackages; } /** * Retrives all managed packages in the org */ async getAllInstalledManagedPackages() { const installedPackages = await this.getAllInstalled2GPPackages(); return installedPackages.filter((installedPackage) => installedPackage.type === 'Managed'); } /** * List all the packages created in DevHub, will throw an error, if its not a DevHub */ async listAllPackages() { if (await this.determineIfDevHubOrg(true)) { let records = await QueryHelper_1.default.query(packageQuery, this.getConnection(), true); records.forEach((record) => { record.IsOrgDependent = record.ContainerOptions === 'Managed' ? 'N/A' : record.IsOrgDependent === true ? 'Yes' : 'No'; }); return records; } else throw new Error('Package Type Information can only be fetched from a DevHub'); } async getAlias() { return await (0, AliasList_1.convertUsernameToAlias)(this.getUsername()); } /** * Return all artifacts including sfp as well as external unlocked/managed */ async getAllInstalledArtifacts() { let artifacts = await this.getInstalledArtifacts(`Name`); let installedArtifacts = []; let installed2GPPackages = await this.getAllInstalled2GPPackages(); artifacts.forEach((artifact) => { let installedArtifact = { name: artifact.Name, version: artifact.Version__c, commitId: artifact.CommitId__c, isInstalledBysfp: true, }; let packageFound = installed2GPPackages.find((elem) => elem.name == artifact.Name); if (packageFound) { installedArtifact.subscriberVersion = packageFound.subscriberPackageVersionId; if (packageFound.isOrgDependent) installedArtifact.type = `OrgDependendent`; else installedArtifact.type = `Unlocked`; } else { installedArtifact.subscriberVersion = `N/A`; installedArtifact.type = `Source/Data`; } installedArtifacts.push(installedArtifact); }); installed2GPPackages.forEach((installed2GPPackage) => { let packageFound = installedArtifacts.find((elem) => elem.name == installed2GPPackage.name); if (!packageFound) { let installedArtifact = { name: installed2GPPackage.name, version: installed2GPPackage.versionNumber, commitId: `N/A`, }; if (installed2GPPackage.isOrgDependent) installedArtifact.type = `OrgDependendent`; else if (installed2GPPackage.type == `Managed`) installedArtifact.type = `Managed`; else installedArtifact.type = `Unlocked`; installedArtifact.subscriberVersion = installed2GPPackage.subscriberPackageVersionId; installedArtifact.isInstalledBysfp = false; installedArtifacts.push(installedArtifact); } }); return installedArtifacts; } } exports.default = SFPOrg; const packageQuery = 'SELECT Id,Name, Description, NamespacePrefix, ContainerOptions, IsOrgDependent ' + 'FROM Package2 ' + 'WHERE IsDeprecated != true ' + 'ORDER BY NamespacePrefix, Name'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU0ZQT3JnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvb3JnL1NGUE9yZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXVDO0FBQ3ZDLG1FQUF5RjtBQUd6Riw2RUFBcUQ7QUFDckQsa0RBQTREO0FBQzVELGlGQUF5RDtBQUN6RCxtSEFBMkY7QUFDM0Ysb0RBQTRCO0FBRTVCLE1BQXFCLE1BQU8sU0FBUSxVQUFHO0lBQ25DOztPQUVHO0lBQ0ksS0FBSyxDQUFDLHFCQUFxQixDQUFDLFVBQWtCLGFBQWEsRUFBRSxNQUFlO1FBQy9FLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUM7WUFDRCxPQUFPLEdBQUcsTUFBTSxxQkFBVyxDQUFDLEtBQUssQ0FDN0IsNkZBQTZGLE9BQU8sTUFBTSxFQUMxRyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQ3BCLEtBQUssQ0FDUixDQUFDO1lBQ0YsT0FBTyxPQUFPLENBQUM7UUFDbkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixvQkFBUyxDQUFDLEdBQUcsQ0FDVCxnREFBZ0Q7Z0JBQzVDLGtFQUFrRTtnQkFDbEUsbUVBQW1FLEVBQ3ZFLHdCQUFXLENBQUMsSUFBSSxFQUNoQixNQUFNLENBQ1QsQ0FBQztRQUNOLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyx3QkFBd0IsQ0FDakMsTUFBYyxFQUNkLFVBQXNCO1FBRXRCLElBQUksTUFBTSxHQUFxRDtZQUMzRCxXQUFXLEVBQUUsS0FBSztTQUNyQixDQUFDO1FBQ0YsSUFBSSxDQUFDO1lBQ0Qsb0JBQVMsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLFVBQVUsQ0FBQyxXQUFXLGNBQWMsRUFBRSx3QkFBVyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMx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