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