UNPKG

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