@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
JavaScript
"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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