UNPKG

@flxbl-io/sfp

Version:

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

354 lines 36.5 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 }); //TODO: Replace with SDR const path = __importStar(require("path")); const MetadataInfo_1 = require("./MetadataInfo"); const Fileutils_1 = __importDefault(require("../utils/Fileutils")); const _ = __importStar(require("lodash")); const ignore_1 = __importDefault(require("ignore")); const fs = __importStar(require("fs-extra")); const ProjectConfig_1 = __importDefault(require("../project/ProjectConfig")); const glob_1 = require("glob"); const SEP = /\/|\\/; class MetadataFiles { constructor() { if (fs.existsSync('.forceignore')) { this.forceignore = (0, ignore_1.default)().add(fs.readFileSync('.forceignore', 'utf8').toString()); } else { this.forceignore = (0, ignore_1.default)(); } } static getFullApiName(fileName) { let fullName = ''; let metadateType = MetadataInfo_1.MetadataInfo.getMetadataName(fileName); let splitFilepath = fileName.split(SEP); let isObjectChild = MetadataInfo_1.METADATA_INFO.CustomObject.childXmlNames.includes(metadateType); if (isObjectChild) { let objectName = splitFilepath[splitFilepath.length - 3]; let fieldName = splitFilepath[splitFilepath.length - 1].split('.')[0]; fullName = objectName.concat('.' + fieldName); } else { fullName = splitFilepath[splitFilepath.length - 1].split('.')[0]; } return fullName; } static getFullApiNameWithExtension(fileName) { let fullName = ''; let metadateType = MetadataInfo_1.MetadataInfo.getMetadataName(fileName); let splitFilepath = fileName.split(SEP); let isObjectChild = MetadataInfo_1.METADATA_INFO.CustomObject.childXmlNames.includes(metadateType); if (isObjectChild) { let objectName = splitFilepath[splitFilepath.length - 3]; let fieldName = splitFilepath[splitFilepath.length - 1]; fullName = objectName.concat('.' + fieldName); } else { fullName = splitFilepath[splitFilepath.length - 1]; } return fullName; } static isCustomMetadata(filepath, name) { let result = true; let splitFilepath = filepath.split(SEP); let componentName = splitFilepath[splitFilepath.length - 1]; componentName = componentName.substring(0, componentName.indexOf('.')); if (name === MetadataInfo_1.METADATA_INFO.CustomField.xmlName || name === MetadataInfo_1.METADATA_INFO.CustomObject.xmlName) { //Custom Field or Custom Object result = componentName.endsWith('__c') || componentName.endsWith('__mdt'); } return result; } static getMemberNameFromFilepath(filepath, name) { let member; let splitFilepath = filepath.split(SEP); let lastIndex = splitFilepath.length - 1; let isObjectChild = MetadataInfo_1.METADATA_INFO.CustomObject.childXmlNames.includes(name); let metadataDescribe = MetadataInfo_1.METADATA_INFO[name]; if (isObjectChild) { let objectName = splitFilepath[lastIndex - 2]; let fieldName = splitFilepath[lastIndex].split('.')[0]; member = objectName.concat('.' + fieldName); } else if (metadataDescribe.inFolder) { let baseName = metadataDescribe.directoryName; let baseIndex = filepath.indexOf(baseName) + baseName.length; let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator cmpPath = cmpPath.substring(0, cmpPath.indexOf('.')); member = cmpPath.replace(SEP, '/'); } else { if (MetadataInfo_1.SOURCE_EXTENSION_REGEX.test(splitFilepath[lastIndex])) { member = splitFilepath[lastIndex].replace(MetadataInfo_1.SOURCE_EXTENSION_REGEX, ''); } else { const auraRegExp = new RegExp('aura'); const lwcRegExp = new RegExp('lwc'); const staticResourceRegExp = new RegExp('staticresources'); const experienceBundleRegExp = new RegExp('experiences'); if (auraRegExp.test(filepath) || lwcRegExp.test(filepath)) { member = splitFilepath[lastIndex - 1]; } else if (staticResourceRegExp.test(filepath)) { //Return the fileName let baseName = 'staticresources'; let baseIndex = filepath.indexOf(baseName) + baseName.length; let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator member = cmpPath.split(SEP)[0]; let extension = path.parse(member).ext; member = member.replace(new RegExp(extension + '$'), ''); } else if (experienceBundleRegExp.test(filepath)) { //Return the fileName let baseName = 'experiences'; let baseIndex = filepath.indexOf(baseName) + baseName.length; let cmpPath = filepath.substring(baseIndex + 1); // add 1 to remove the path seperator member = cmpPath.split(SEP)[0]; let extension = path.parse(member).ext; member = member.replace(new RegExp(extension + '$'), ''); } else { let extension = path.parse(splitFilepath[lastIndex]).ext; member = splitFilepath[lastIndex].replace(new RegExp(extension + '$'), ''); } } } return member; } loadComponents(srcFolder, checkIgnore = true) { let metadataFiles = Fileutils_1.default.getAllFilesSync(srcFolder); let keys = Object.keys(MetadataInfo_1.METADATA_INFO); if (Array.isArray(metadataFiles) && metadataFiles.length > 0) { metadataFiles.forEach((metadataFile) => { let found = false; for (let i = 0; i < keys.length; i++) { let match = false; if (metadataFile.endsWith(MetadataInfo_1.METADATA_INFO[keys[i]].sourceExtension)) { match = true; } else if (MetadataInfo_1.METADATA_INFO[keys[i]].inFolder && metadataFile.endsWith(MetadataInfo_1.METADATA_INFO[keys[i]].folderExtension)) { match = true; } if (match) { if (_.isNil(MetadataInfo_1.METADATA_INFO[keys[i]].files)) { MetadataInfo_1.METADATA_INFO[keys[i]].files = []; MetadataInfo_1.METADATA_INFO[keys[i]].components = []; } if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) { MetadataInfo_1.METADATA_INFO[keys[i]].files.push(metadataFile); let name = Fileutils_1.default.getFileNameWithoutExtension(metadataFile, MetadataInfo_1.METADATA_INFO[keys[i]].sourceExtension); if (MetadataInfo_1.METADATA_INFO[keys[i]].isChildComponent) { let fileParts = metadataFile.split(SEP); let parentName = fileParts[fileParts.length - 3]; name = parentName + '.' + name; } MetadataInfo_1.METADATA_INFO[keys[i]].components.push(name); } found = true; break; } } if (!found) { const auraRegExp = new RegExp('aura'); if (auraRegExp.test(metadataFile) && MetadataInfo_1.SOURCE_EXTENSION_REGEX.test(metadataFile)) { if (_.isNil(MetadataInfo_1.METADATA_INFO.AuraDefinitionBundle.files)) { MetadataInfo_1.METADATA_INFO.AuraDefinitionBundle.files = []; MetadataInfo_1.METADATA_INFO.AuraDefinitionBundle.components = []; } if (!checkIgnore || (checkIgnore && this.accepts(metadataFile))) { MetadataInfo_1.METADATA_INFO.AuraDefinitionBundle.files.push(metadataFile); let name = Fileutils_1.default.getFileNameWithoutExtension(metadataFile); MetadataInfo_1.METADATA_INFO.AuraDefinitionBundle.components.push(name); } } } }); } else { keys.forEach((key) => { if (_.isNil(MetadataInfo_1.METADATA_INFO[key].files)) { MetadataInfo_1.METADATA_INFO[key].files = []; MetadataInfo_1.METADATA_INFO[key].components = []; } }); } } //Check if a component is accepted by forceignore. accepts(filePath) { return !this.forceignore.ignores(path.relative(process.cwd(), filePath)); } async isInModuleFolder(filePath) { const packageDirectories = ProjectConfig_1.default.getSFDXProjectConfig(null).packageDirectories.map((elem) => elem.path); if (!packageDirectories || packageDirectories.length == 0) { return false; } const moduleFolder = packageDirectories.find((packageFolder) => { let packageFolderNormalized = path.relative('', packageFolder); return filePath.startsWith(packageFolderNormalized); }); return moduleFolder !== undefined; } /** * Copy a file to an outpu directory. If the filePath is a Metadata file Path, * All the metadata requirement are also copied. For example MyApexClass.cls-meta.xml will also copy MyApexClass.cls. * Enforcing the .forceignore to ignire file ignored in the project. * @param filePath * @param outputFolder */ static copyFile(filePath, outputFolder) { console.log(`Copying file ${filePath} from file system to ${outputFolder}`); const LWC_IGNORE_FILES = ['jsconfig.json', '.eslintrc.json']; const pairStatResources = MetadataInfo_1.METADATA_INFO.StaticResource.directoryName; const pairStatResourcesRegExp = new RegExp(pairStatResources); const pairAuaraRegExp = new RegExp(MetadataInfo_1.METADATA_INFO.AuraDefinitionBundle.directoryName); let copyOutputFolder = outputFolder; if (!fs.existsSync(filePath)) { return; } let exists = fs.existsSync(path.join(outputFolder, filePath)); if (exists) { return; } if (filePath.startsWith('.')) { let parts = path.parse(filePath); if (parts.dir === '') { fs.copyFileSync(filePath, path.join(outputFolder, filePath)); return; } } let fileName = path.parse(filePath).base; //exclude lwc ignored files if (LWC_IGNORE_FILES.includes(fileName)) { return; } let filePathParts = filePath.split(SEP); if (fs.existsSync(outputFolder) == false) { fs.mkdirSync(outputFolder); } // Create folder structure for (let i = 0; i < filePathParts.length - 1; i++) { let folder = filePathParts[i].replace('"', ''); outputFolder = path.join(outputFolder, folder); if (fs.existsSync(outputFolder) == false) { fs.mkdirSync(outputFolder); } } // Copy all file with same base name let associatedFilePattern = ''; if (MetadataInfo_1.SOURCE_EXTENSION_REGEX.test(filePath)) { associatedFilePattern = filePath.replace(MetadataInfo_1.SOURCE_EXTENSION_REGEX, '.*'); } else { let extension = path.parse(filePath).ext; associatedFilePattern = filePath.replace(extension, '.*'); } let files = (0, glob_1.globSync)(associatedFilePattern); for (let i = 0; i < files.length; i++) { if (fs.lstatSync(files[i]).isDirectory() == false) { let oneFilePath = path.join('.', files[i]); let oneFilePathParts = oneFilePath.split(SEP); fileName = oneFilePathParts[oneFilePathParts.length - 1]; let outputPath = path.join(outputFolder, fileName); fs.copyFileSync(files[i], outputPath); } } // Hadle ObjectTranslations // If a file fieldTranslation is copied, make sure the ObjectTranslation File is also copied if (filePath.endsWith('Translation-meta.xml') && filePath.indexOf('globalValueSet') < 0) { let parentFolder = filePathParts[filePathParts.length - 2]; let objectTranslation = parentFolder + MetadataInfo_1.METADATA_INFO.CustomObjectTranslation.sourceExtension; let outputPath = path.join(outputFolder, objectTranslation); let sourceFile = filePath.replace(fileName, objectTranslation); if (fs.existsSync(sourceFile) == true) { fs.copyFileSync(sourceFile, outputPath); } } //FOR STATIC RESOURCES - WHERE THE CORRESPONDING DIRECTORY + THE ROOT META FILE HAS TO BE INCLUDED if (pairStatResourcesRegExp.test(filePath)) { outputFolder = path.join('.', copyOutputFolder); let srcFolder = '.'; let staticRecourceRoot = ''; let resourceFile = ''; for (let i = 0; i < filePathParts.length; i++) { outputFolder = path.join(outputFolder, filePathParts[i]); srcFolder = path.join(srcFolder, filePathParts[i]); if (filePathParts[i] === MetadataInfo_1.METADATA_INFO.StaticResource.directoryName) { let fileOrDirname = filePathParts[i + 1]; let fileOrDirnameParts = fileOrDirname.split('.'); srcFolder = path.join(srcFolder, fileOrDirnameParts[0]); outputFolder = path.join(outputFolder, fileOrDirnameParts[0]); resourceFile = srcFolder + MetadataInfo_1.METADATA_INFO.StaticResource.sourceExtension; MetadataInfo_1.METADATA_INFO.StaticResource.sourceExtension; staticRecourceRoot = outputFolder + MetadataInfo_1.METADATA_INFO.StaticResource.sourceExtension; if (fs.existsSync(srcFolder)) { if (fs.existsSync(outputFolder) == false) { fs.mkdirSync(outputFolder); } } break; } } if (fs.existsSync(srcFolder)) { Fileutils_1.default.copyRecursiveSync(srcFolder, outputFolder); } if (fs.existsSync(resourceFile)) { fs.copyFileSync(resourceFile, staticRecourceRoot); } } //FOR AURA components and LWC components if (pairAuaraRegExp.test(filePath)) { outputFolder = path.join('.', copyOutputFolder); let srcFolder = '.'; for (let i = 0; i < filePathParts.length; i++) { outputFolder = path.join(outputFolder, filePathParts[i]); srcFolder = path.join(srcFolder, filePathParts[i]); if (filePathParts[i] === 'aura' || filePathParts[i] === 'lwc') { let fileOrDirname = filePathParts[i + 1]; let fileOrDirnameParts = fileOrDirname.split('.'); srcFolder = path.join(srcFolder, fileOrDirnameParts[0]); outputFolder = path.join(outputFolder, fileOrDirnameParts[0]); if (fs.existsSync(srcFolder)) { if (fs.existsSync(outputFolder) == false) { fs.mkdirSync(outputFolder); } } break; } } if (fs.existsSync(srcFolder)) { Fileutils_1.default.copyRecursiveSync(srcFolder, outputFolder); } } } } MetadataFiles.sourceOnly = false; exports.default = MetadataFiles; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWV0YWRhdGFGaWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL21ldGFkYXRhL01ldGFkYXRhRmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdCQUF3QjtBQUN4QiwyQ0FBNkI7QUFDN0IsaURBQXVHO0FBQ3ZHLG1FQUEyQztBQUMzQywwQ0FBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDZDQUErQjtBQUMvQiw2RUFBcUQ7QUFDckQsK0JBQWdDO0FBRWhDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQztBQUVwQixNQUFxQixhQUFhO0lBRzlCO1FBQ0ksSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFBLGdCQUFNLEdBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4RixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBQSxnQkFBTSxHQUFFLENBQUM7UUFDaEMsQ0FBQztJQUNMLENBQUM7SUFDRCxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQWdCO1FBQ2xDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLFlBQVksR0FBRywyQkFBWSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxRCxJQUFJLGFBQWEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksYUFBYSxHQUFHLDRCQUFhLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEYsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNoQixJQUFJLFVBQVUsR0FBRyxhQUFhLENB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