UNPKG

@flxbl-io/sfp

Version:

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

218 lines 23.7 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 ProjectConfig_1 = __importDefault(require("../../project/ProjectConfig")); const rimraf = __importStar(require("rimraf")); const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger")); const fs_extra_1 = require("fs-extra"); const fs = __importStar(require("fs-extra")); let path = require('path'); class SfpPackageContentGenerator { static async generateSfpPackageDirectory(logger, projectDirectory, projectConfig, sfdx_package, packageDirectory, versionNumber, destructiveManifestFilePath, configFilePath, pathToReplacementForceIgnore, revisionFrom, revisionTo) { let artifactDirectory = `.sfpowerscripts/${this.makefolderid(5)}_source`, rootDirectory; if (projectDirectory) { rootDirectory = projectDirectory; } else { rootDirectory = ''; } if (packageDirectory == null) packageDirectory = ''; (0, fs_extra_1.mkdirpSync)(artifactDirectory); //Ensure the directory is clean rimraf.sync(path.join(artifactDirectory, packageDirectory)); //Create a new directory fs.mkdirsSync(path.join(artifactDirectory, packageDirectory)); SfpPackageContentGenerator.createScripts(artifactDirectory, rootDirectory, sfdx_package); SfpPackageContentGenerator.createForceIgnores(artifactDirectory, rootDirectory); if (pathToReplacementForceIgnore) SfpPackageContentGenerator.replaceRootForceIgnore(artifactDirectory, pathToReplacementForceIgnore, logger); if (destructiveManifestFilePath) { SfpPackageContentGenerator.copyDestructiveManifests(destructiveManifestFilePath, artifactDirectory, rootDirectory, logger); } if (configFilePath) { SfpPackageContentGenerator.copyConfigFilePath(configFilePath, artifactDirectory, rootDirectory, logger); } SfpPackageContentGenerator.handleUnpackagedMetadata(sfdx_package, projectConfig, rootDirectory, artifactDirectory); SfpPackageContentGenerator.createPackageManifests(artifactDirectory, rootDirectory, projectConfig, sfdx_package, versionNumber); fs.copySync(path.join(rootDirectory, packageDirectory), path.join(artifactDirectory, packageDirectory)); return artifactDirectory; } static handleUnpackagedMetadata(sfdx_package, projectConfig, rootDirectory, artifactDirectory) { const packageDescriptor = ProjectConfig_1.default.getPackageDescriptorFromConfig(sfdx_package, projectConfig); if (packageDescriptor.unpackagedMetadata?.path) { if (fs.pathExistsSync(packageDescriptor.unpackagedMetadata.path)) { let unpackagedMetadataDir = path.join(artifactDirectory, `unpackagedMetadata`); (0, fs_extra_1.mkdirpSync)(unpackagedMetadataDir); fs.copySync(path.join(rootDirectory, packageDescriptor.unpackagedMetadata.path), unpackagedMetadataDir); } else { throw new Error(`unpackagedMetadata ${packageDescriptor.unpackagedMetadata.path} does not exist`); } } } static createPackageManifests(artifactDirectory, projectDirectory, projectConfig, sfdx_package, versionNumber) { // Create pruned package manifest in source directory let cleanedUpProjectManifest = ProjectConfig_1.default.cleanupMPDFromProjectConfig(projectConfig, sfdx_package); //Ensure version numbers are used from cleanedUpProjectManifest.packageDirectories[0].versionNumber = versionNumber; //Handle unpackaged metadata if (fs.existsSync(path.join(artifactDirectory, 'unpackagedMetadata'))) { cleanedUpProjectManifest.packageDirectories[0].unpackagedMetadata.path = path.join('unpackagedMetadata'); cleanedUpProjectManifest.packageDirectories.push({ path: path.join('unpackagedMetadata'), default: false }); } //Setup preDeployment Script Path if (fs.existsSync(path.join(artifactDirectory, 'scripts', `preDeployment`))) cleanedUpProjectManifest.packageDirectories[0].preDeploymentScript = path.join('scripts', `preDeployment`); //Setup postDeployment Script Path if (fs.existsSync(path.join(artifactDirectory, 'scripts', `postDeployment`))) cleanedUpProjectManifest.packageDirectories[0].postDeploymentScript = path.join('scripts', `postDeployment`); fs.writeFileSync(path.join(artifactDirectory, 'sfdx-project.json'), JSON.stringify(cleanedUpProjectManifest)); // Copy original package manifest let manifestsDir = path.join(artifactDirectory, `manifests`); (0, fs_extra_1.mkdirpSync)(manifestsDir); fs.copySync(path.join(projectDirectory, 'sfdx-project.json'), path.join(manifestsDir, 'sfdx-project.json.ori')); } /** * Create scripts directory containing preDeploy & postDeploy * @param artifactDirectory * @param projectDirectory * @param sfdx_package */ static createScripts(artifactDirectory, projectDirectory, sfdx_package) { let scriptsDir = path.join(artifactDirectory, `scripts`); (0, fs_extra_1.mkdirpSync)(scriptsDir); let packageDescriptor = ProjectConfig_1.default.getSFDXPackageDescriptor(projectDirectory, sfdx_package); if (packageDescriptor.preDeploymentScript) { if (projectDirectory) packageDescriptor.preDeploymentScript = path.join(projectDirectory, packageDescriptor.preDeploymentScript); if (fs.existsSync(packageDescriptor.preDeploymentScript)) { fs.copySync(packageDescriptor.preDeploymentScript, path.join(scriptsDir, `preDeployment`)); } else { throw new Error(`preDeploymentScript ${packageDescriptor.preDeploymentScript} does not exist`); } } if (packageDescriptor.postDeploymentScript) { if (projectDirectory) packageDescriptor.postDeploymentScript = path.join(projectDirectory, packageDescriptor.postDeploymentScript); if (fs.existsSync(packageDescriptor.postDeploymentScript)) { fs.copySync(packageDescriptor.postDeploymentScript, path.join(scriptsDir, `postDeployment`)); } else { throw new Error(`postDeploymentScript ${packageDescriptor.postDeploymentScript} does not exist`); } } } /** * Create root forceignore and forceignores directory containing ignore files for different stages * @param artifactDirectory * @param projectDirectory */ static createForceIgnores(artifactDirectory, projectDirectory) { let forceIgnoresDir = path.join(artifactDirectory, `forceignores`); (0, fs_extra_1.mkdirpSync)(forceIgnoresDir); let projectConfig = ProjectConfig_1.default.getSFDXProjectConfig(projectDirectory); let ignoreFiles = projectConfig.plugins?.sfp?.ignoreFiles; //TODO: Make this readable //This is a fix when sfppackage is used in stages where build is not involved //So it has to be build from the root of the unzipped directory //and whatever mentioned in .json is already translated let rootForceIgnore = path.join(projectDirectory, '.forceignore'); let copyForceIgnoreForStage = (stage) => { if (ignoreFiles?.[stage]) { if (fs.existsSync(path.join(projectDirectory, ignoreFiles[stage]))) { fs.copySync(path.join(projectDirectory, ignoreFiles[stage]), path.join(forceIgnoresDir, '.' + stage + 'ignore')); } else if (fs.existsSync(path.join(projectDirectory, 'forceignores', '.' + stage + 'ignore'))) { fs.copySync(path.join(projectDirectory, 'forceignores', '.' + stage + 'ignore'), path.join(forceIgnoresDir, '.' + stage + 'ignore')); } else throw new Error(`${ignoreFiles[stage]} does not exist`); } else fs.copySync(rootForceIgnore, path.join(forceIgnoresDir, '.' + stage + 'ignore')); //append additional entry to force ignore file //TODO: Revisit the location fs.appendFileSync(path.join(forceIgnoresDir, '.' + stage + 'ignore'), "\n**/postDeploy"); }; let stages = ['prepare', 'validate', 'quickbuild', 'build']; stages.forEach((stage) => copyForceIgnoreForStage(stage)); fs.copySync(rootForceIgnore, path.join(artifactDirectory, '.forceignore')); } /** * Replaces root forceignore with provided forceignore * @param artifactDirectory * @param pathToReplacementForceIgnore */ static replaceRootForceIgnore(artifactDirectory, pathToReplacementForceIgnore, logger) { if (fs.existsSync(pathToReplacementForceIgnore)) { fs.copySync(pathToReplacementForceIgnore, path.join(artifactDirectory, '.forceignore')); } else { sfp_logger_1.default.log(`${pathToReplacementForceIgnore} does not exist`, sfp_logger_1.LoggerLevel.INFO, logger); sfp_logger_1.default.log('Package creation will continue using the unchanged forceignore in the root directory', sfp_logger_1.LoggerLevel.INFO, logger); } } static copyDestructiveManifests(destructiveManifestFilePath, artifactDirectory, projectDirectory, logger) { if (fs.existsSync(destructiveManifestFilePath)) { try { fs.mkdirsSync(path.join(artifactDirectory, 'destructive')); fs.copySync(path.join(projectDirectory, destructiveManifestFilePath), path.join(artifactDirectory, 'destructive', 'destructiveChanges.xml')); } catch (error) { sfp_logger_1.default.log('Unable to read/parse destructive manifest, Please check your artifacts, Will result in an error while deploying', sfp_logger_1.LoggerLevel.WARN, logger); } } } static copyConfigFilePath(configFilePath, artifactDirectory, projectDirectory, logger) { if (fs.existsSync(configFilePath)) { try { fs.mkdirsSync(path.join(artifactDirectory, 'config')); fs.copySync(path.join(projectDirectory, configFilePath), path.join(artifactDirectory, 'config', 'project-scratch-def.json')); } catch (error) { sfp_logger_1.default.log(error, sfp_logger_1.LoggerLevel.TRACE, logger); sfp_logger_1.default.log('Utilizing default config file path', sfp_logger_1.LoggerLevel.TRACE, logger); } } } static makefolderid(length) { let result = ''; let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let charactersLength = characters.length; for (let i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } } SfpPackageContentGenerator.isPreDeploymentScriptAvailable = false; SfpPackageContentGenerator.isPostDeploymentScriptAvailable = false; exports.default = SfpPackageContentGenerator; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2ZwUGFja2FnZUNvbnRlbnRHZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS9wYWNrYWdlL2dlbmVyYXRvcnMvU2ZwUGFja2FnZUNvbnRlbnRHZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdGQUF3RDtBQUN4RCwrQ0FBaUM7QUFDakMsbUVBQXNFO0FBQ3RFLHVDQUFzQztBQUN0Qyw2Q0FBK0I7QUFFL0IsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRTNCLE1BQXFCLDBCQUEwQjtJQUlwQyxNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUMzQyxNQUFjLEVBQ2QsZ0JBQXdCLEVBQ3hCLGFBQWtCLEVBQ2xCLFlBQW9CLEVBQ3BCLGdCQUF3QixFQUN4QixhQUFvQixFQUNwQiwyQkFBb0MsRUFDcEMsY0FBdUIsRUFDdkIsNEJBQXFDLEVBQ3JDLFlBQXFCLEVBQ3JCLFVBQW1CO1FBRW5CLElBQUksaUJBQWlCLEdBQVcsbUJBQW1CLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDNUUsYUFBcUIsQ0FBQztRQUUxQixJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDbkIsYUFBYSxHQUFHLGdCQUFnQixDQUFDO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ0osYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN2QixDQUFDO1FBRUQsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJO1lBQUUsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBRXBELElBQUEscUJBQVUsRUFBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlCLCtCQUErQjtRQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBRTVELHdCQUF3QjtRQUN4QixF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