UNPKG

@flxbl-io/sfp

Version:

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

269 lines 18 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 path_1 = __importDefault(require("path")); const fs = __importStar(require("fs-extra")); const xml2json_1 = __importDefault(require("../../utils/xml2json")); const xml2js = require('xml2js'); class PackageManifest { /** * Getter for package manifest JSON */ get manifestJson() { return this._manifestJson; } /** * Getter for package manifest XML */ get manifestXml() { return this._manifestXml; } constructor() { } /** * Factory method * @param mdapiDir directory containing package.xml * @returns instance of PackageManifest */ static async create(mdapiDir) { const packageManifest = new PackageManifest(); const packageXml = fs.readFileSync(path_1.default.join(mdapiDir, 'package.xml'), 'utf8'); packageManifest._manifestXml = packageXml; packageManifest._manifestJson = await (0, xml2json_1.default)(packageXml); return packageManifest; } /** * Factory method * @param components * @param apiVersion * @returns intance of PackageManifest */ static createFromScratch(components, apiVersion) { const packageManifest = new PackageManifest(); const packageJson = { $: { xmlns: 'http://soap.sforce.com/2006/04/metadata' }, types: [], version: apiVersion, }; components.forEach((component) => { const type = packageJson.types.find((type) => type.name === component.type); if (type) { // Add member to existing type type.members.push(component.fullName); } else { // create new type const newType = { name: component.type, members: [component.fullName], }; packageJson.types.push(newType); } }); const builder = new xml2js.Builder({ xmldec: { version: '1.0', encoding: 'UTF-8' }, }); let packageObj = { Package: packageJson, }; packageManifest._manifestXml = builder.buildObject(packageObj); packageManifest._manifestJson = packageObj; return packageManifest; } /** * Factory method * @param manifest package JSON * @returns instance of PackageManifest */ static async createWithJSONManifest(manifest) { const packageManifest = new PackageManifest(); packageManifest._manifestJson = manifest; const builder = new xml2js.Builder({ xmldec: { version: '1.0', encoding: 'UTF-8' }, }); packageManifest._manifestXml = builder.buildObject(manifest); return packageManifest; } /** * * @returns true or false, for whether there are profiles */ isProfilesInPackage() { let isProfilesFound = false; if (this._manifestJson.Package.types) { if (Array.isArray(this._manifestJson.Package.types)) { for (const type of this._manifestJson.Package.types) { if (type.name === 'Profile') { isProfilesFound = true; break; } } } else if (this.manifestJson.Package.types.name === 'Profile') { isProfilesFound = true; } } return isProfilesFound; } /** * * @returns true or false, for whether there are profiles */ isPermissionSetsInPackage() { let isPermissionSetFound = false; if (this._manifestJson.Package.types) { if (Array.isArray(this._manifestJson.Package.types)) { for (const type of this._manifestJson.Package.types) { if (type.name === 'PermissionSet') { isPermissionSetFound = true; break; } } } else if (this.manifestJson.Package.types.name === 'PermissionSet') { isPermissionSetFound = true; } } return isPermissionSetFound; } isPermissionSetGroupsFoundInPackage() { let isPermissionSetGroupFound = false; if (Array.isArray(this._manifestJson?.Package?.types)) { for (let type of this._manifestJson.Package.types) { if (type.name === 'PermissionSetGroup') { isPermissionSetGroupFound = true; break; } } } else if (this._manifestJson?.Package?.types?.name === 'PermissionSetGroup') { isPermissionSetGroupFound = true; } return isPermissionSetGroupFound; } /** * * @returns true or false, for whether there are Apex classes and/or triggers */ isApexInPackage() { let isApexFound = false; if (this._manifestJson.Package.types) { if (Array.isArray(this._manifestJson.Package.types)) { for (const type of this._manifestJson.Package.types) { if (type.name === 'ApexClass' || type.name === 'ApexTrigger') { isApexFound = true; break; } } } else if (this._manifestJson.Package.types.name === 'ApexClass' || this._manifestJson.Package.types.name === 'ApexTrigger') { isApexFound = true; } } return isApexFound; } /** * * @returns Apex triggers if there are any, otherwise returns undefined */ fetchTriggers() { let triggers; let types; if (this._manifestJson.Package.types) { if (this._manifestJson.Package.types instanceof Array) { types = this._manifestJson.Package.types; } else { // Create array with single type types = [this._manifestJson.Package.types]; } } if (types) { for (const type of types) { if (type.name === 'ApexTrigger') { if (type.members instanceof Array) { triggers = type.members; } else { // Create array with single member triggers = [type.members]; } break; } } } return triggers; } isPayloadContainTypesOtherThan(providedType) { let anyOtherType = false; if (this._manifestJson.Package.types) { if (Array.isArray(this._manifestJson.Package.types)) { for (const type of this._manifestJson.Package.types) { if (type.name !== providedType) { anyOtherType = true; break; } } } else if (this._manifestJson.Package.types.name !== providedType) { anyOtherType = true; } } return anyOtherType; } isPayLoadContainTypesSupportedByProfiles() { const profileSupportedMetadataTypes = [ 'ApexClass', 'CustomApplication', 'CustomObject', 'CustomField', 'Layout', 'ApexPage', 'CustomTab', 'RecordType', 'SystemPermissions', ]; let containsProfileSupportedType = false; if (this._manifestJson.Package.types) { if (Array.isArray(this._manifestJson.Package.types)) { for (const type of this._manifestJson.Package.types) { if (profileSupportedMetadataTypes.includes(type.name)) { containsProfileSupportedType = true; break; } } } else if (profileSupportedMetadataTypes.includes(this._manifestJson.Package.types.name)) { containsProfileSupportedType = true; } } return containsProfileSupportedType; } } exports.default = PackageManifest; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2FnZU1hbmlmZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUvcGFja2FnZS9jb21wb25lbnRzL1BhY2thZ2VNYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLDZDQUErQjtBQUUvQixvRUFBNEM7QUFDNUMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRWpDLE1BQXFCLGVBQWU7SUFJaEM7O09BRUc7SUFDSCxJQUFJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFFRCxnQkFBdUIsQ0FBQztJQUV4Qjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBZ0I7UUFDaEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUU5QyxNQUFNLFVBQVUsR0FBVyxFQUFFLENBQUMsWUFBWSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXZGLGVBQWUsQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDO1FBQzFDLGVBQWUsQ0FBQyxhQUFhLEdBQUcsTUFBTSxJQUFBLGtCQUFRLEVBQUMsVUFBVSxDQUFDLENBQUM7UUFFM0QsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQWdELEVBQUUsVUFBa0I7UUFDekYsTUFBTSxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUU5QyxNQUFNLFdBQVcsR0FBRztZQUNoQixDQUFDLEVBQUUsRUFB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