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