@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
258 lines • 19.8 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require('fs-extra');
const lodash_1 = __importDefault(require("lodash"));
const SfpPackage_1 = require("../package/SfpPackage");
let path = require('path');
/**
* Helper functions for retrieving info from project config
*/
class ProjectConfig {
/**
* Returns 0H Id of package from project config
* @param projectConfig
* @param sfdxPackage
*/
static getPackageId(projectConfig, sfdxPackage) {
if (projectConfig['packageAliases']?.[sfdxPackage]) {
return projectConfig['packageAliases'][sfdxPackage];
}
else {
throw Error('No Package Id found in sfdx-project.json. Please ensure package alias have the package added');
}
}
/**
* Returns package names, as an array of strings
* @param projectDirectory
*/
static getAllPackages(projectDirectory) {
let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
let sfdxpackages = [];
projectConfig['packageDirectories'].forEach((pkg) => {
//Only push packages that have package and versionNumber, ignore everything else
if (pkg.package && pkg.versionNumber)
sfdxpackages.push(pkg.package);
});
return sfdxpackages;
}
static getAllExternalPackages(projectConfig) {
let externalPackages = [];
let packagesInCurrentDirectory = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig);
const packageAliases = projectConfig.packageAliases || {};
Object.entries(packageAliases).forEach(([key, value]) => {
if (!lodash_1.default.find(packagesInCurrentDirectory, (elem) => {
return elem.package == key;
}, 0))
externalPackages.push({ alias: key, Package2IdOrSubscriberPackageVersionId: value });
});
return externalPackages;
}
/**
* Returns package names from projectConfig, as an array of strings
* @param projectDirectory
*/
static getAllPackagesFromProjectConfig(projectConfig) {
let sfdxpackages = [];
projectConfig.packageDirectories.forEach((pkg) => {
//Only push packages that have package and versionNumber, ignore everything else
if (pkg.package && pkg.versionNumber)
sfdxpackages.push(pkg.package);
});
return sfdxpackages;
}
static getAllPackagesAndItsDependencies(projectConfig) {
let pkgWithDependencies = new Map();
let packages = ProjectConfig.getAllPackageDirectoriesFromConfig(projectConfig);
for (let pkg of packages) {
if (pkg.dependencies) {
pkgWithDependencies.set(pkg.package, pkg.dependencies);
}
}
return pkgWithDependencies;
}
static getAllPackageDirectoriesFromDirectory(projectDirectory) {
let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
let sfdxpackages = [];
projectConfig.packageDirectories?.forEach((pkg) => {
//Only push packages that have package and versionNumber, ignore everything else
if (pkg.package && pkg.versionNumber)
sfdxpackages.push(pkg);
});
return sfdxpackages;
}
static getAllPackageDirectoriesFromConfig(projectConfig) {
let sfdxpackages = [];
projectConfig.packageDirectories?.forEach((pkg) => {
//Only push packages that have package and versionNumber, ignore everything else
if (pkg.package && pkg.versionNumber)
sfdxpackages.push(pkg);
});
return sfdxpackages;
}
/**
* Returns package manifest as JSON object
* @param projectDirectory
*/
static getSFDXProjectConfig(projectDirectory) {
let projectConfigJSON;
if (projectDirectory) {
projectConfigJSON = path.join(projectDirectory, 'sfdx-project.json');
}
else {
projectConfigJSON = 'sfdx-project.json';
}
try {
return JSON.parse(fs.readFileSync(projectConfigJSON, 'utf8'));
}
catch (error) {
throw new Error(`sfdx-project.json doesn't exist or not readable at ${projectConfigJSON}`);
}
}
/**
* Returns type of package
* @param projectConfig
* @param sfdxPackage
*/
static getPackageType(projectConfig, sfdxPackage) {
let packageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig);
if (projectConfig['packageAliases']?.[sfdxPackage]) {
return SfpPackage_1.PackageType.Unlocked;
}
else {
if (packageDescriptor.type?.toLowerCase() === SfpPackage_1.PackageType.Data)
return SfpPackage_1.PackageType.Data;
else if (packageDescriptor.type?.toLowerCase() === SfpPackage_1.PackageType.Diff)
return SfpPackage_1.PackageType.Diff;
else
return SfpPackage_1.PackageType.Source;
}
}
/**
* Returns package descriptor from package manifest at project directory
* @param projectDirectory
* @param sfdxPackage
*/
static getSFDXPackageDescriptor(projectDirectory, sfdxPackage) {
let projectConfig = ProjectConfig.getSFDXProjectConfig(projectDirectory);
let sfdxPackageDescriptor = ProjectConfig.getPackageDescriptorFromConfig(sfdxPackage, projectConfig);
return sfdxPackageDescriptor;
}
/**
* Returns package descriptor from project config JSON object
* @param sfdxPackage
* @param projectConfig
*/
static getPackageDescriptorFromConfig(sfdxPackage, projectConfig) {
let sfdxPackageDescriptor;
if (sfdxPackage) {
projectConfig['packageDirectories'].forEach((pkg) => {
if (sfdxPackage == pkg['package']) {
sfdxPackageDescriptor = pkg;
}
});
}
if (sfdxPackageDescriptor == null)
throw new Error(`Package ${sfdxPackage} does not exist,Please check inputs`);
return sfdxPackageDescriptor;
}
/**
* Returns descriptor of default package
* @param projectDirectory
*/
static getDefaultSFDXPackageDescriptor(projectDirectory) {
let packageDirectory;
let sfdxPackageDescriptor;
let projectConfig = this.getSFDXProjectConfig(projectDirectory);
//Return the default package directory
projectConfig['packageDirectories'].forEach((pkg) => {
if (pkg['default'] == true) {
packageDirectory = pkg['path'];
sfdxPackageDescriptor = pkg;
}
});
if (packageDirectory == null)
throw new Error('Package or package directory not exist');
else
return sfdxPackageDescriptor;
}
/**
* Returns pruned package manifest, containing sfdxPackage only
* @param projectDirectory
* @param sfdxPackage
*/
static cleanupMPDFromProjectDirectory(projectDirectory, sfdxPackage) {
const projectConfig = this.getSFDXProjectConfig(projectDirectory);
return ProjectConfig.cleanupMPDFromProjectConfig(projectConfig, sfdxPackage);
}
/**
* Returns pruned package manifest, containing sfdxPackage only
* @param projectConfig
* @param sfdxPackage
*/
static cleanupMPDFromProjectConfig(projectConfig, sfdxPackage) {
if (sfdxPackage) {
let i = projectConfig['packageDirectories'].length;
while (i--) {
if (sfdxPackage != projectConfig['packageDirectories'][i]['package']) {
projectConfig['packageDirectories'].splice(i, 1);
}
}
}
else {
let i = projectConfig['packageDirectories'].length;
while (i--) {
if (!fs.existsSync(projectConfig['packageDirectories'][i]['path'])) {
projectConfig['packageDirectories'].splice(i, 1);
}
}
}
projectConfig['packageDirectories'][0]['default'] = true; //add default = true
return projectConfig;
}
/**
* Returns pruned package manifest, containing sfdxPackages only
* @param projectConfig
* @param sfdxPackages
*/
static cleanupPackagesFromProjectConfig(projectConfig, sfdxPackages) {
let revisedPackageDirectory = [];
let originalPackageDirectory = projectConfig['packageDirectories'];
for (let pkg of originalPackageDirectory) {
for (const sfdxPackage of sfdxPackages) {
if (pkg.package == sfdxPackage) {
pkg.default = false;
revisedPackageDirectory.push(pkg);
}
}
}
projectConfig['packageDirectories'][0]['default'] = true; //add default = true
projectConfig.packageDirectories = revisedPackageDirectory;
return projectConfig;
}
/**
* Returns pruned package manifest, containing sfdxPackages only
* @param projectConfig
* @param sfdxPackages
*/
static cleanupPackagesFromProjectDirectory(projectDirectory, sfdxPackages) {
const projectConfig = this.getSFDXProjectConfig(projectDirectory);
return ProjectConfig.cleanupPackagesFromProjectConfig(projectConfig, sfdxPackages);
}
static async updateProjectConfigWithDependencies(projectConfig, dependencyMap) {
let updatedprojectConfig = await lodash_1.default.cloneDeep(projectConfig);
updatedprojectConfig.packageDirectories.map((pkg) => {
return Object.assign(pkg, { dependencies: dependencyMap.get(pkg.package) });
});
// Sort the package directories in the correct order
let sortedPackages = Array.from(dependencyMap.keys());
updatedprojectConfig.packageDirectories.sort((a, b) => {
return sortedPackages.indexOf(a.package) - sortedPackages.indexOf(b.package);
});
return updatedprojectConfig;
}
}
exports.default = ProjectConfig;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvamVjdENvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3Byb2plY3QvUHJvamVjdENvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUUvQixvREFBdUI7QUFDdkIsc0RBQW9EO0FBQ3BELElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUUzQjs7R0FFRztBQUNILE1BQXFCLGFBQWE7SUFDOUI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsYUFBa0IsRUFBRSxXQUFtQjtRQUM5RCxJQUFJLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxPQUFPLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hELENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxLQUFLLENBQUMsOEZBQThGLENBQUMsQ0FBQztRQUNoSCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxjQUFjLENBQUMsZ0JBQXdCO1FBQ2pELElBQUksYUFBYSxHQUFHLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pFLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN0QixhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNoRCxnRkFBZ0Y7WUFDaEYsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxhQUFhO2dCQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVN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