sf-decomposer
Version:
Break down large Salesforce metadata files into smaller, more manageable files for version control and then recreate deployment-compatible files.
47 lines • 2 kB
JavaScript
/* eslint-disable no-await-in-loop */
import { writeFile, rm, mkdir } from 'node:fs/promises';
import { join } from 'node:path';
import { parseXML } from 'xml-disassembler';
import { transformAndCleanup } from '../../core/transformers.js';
export async function disassembleAndGroupFieldPermissions(filePath, format) {
const parsed = await parseXML(filePath);
// this won't disassemble if there's only 1 field permission in the file
const fieldPermissions = parsed?.PermissionSet?.fieldPermissions;
if (!fieldPermissions || !Array.isArray(fieldPermissions)) {
return;
}
const groupedByObject = {};
for (const perm of fieldPermissions) {
const fieldValue = perm?.field;
if (typeof fieldValue !== 'string')
continue;
const objectName = fieldValue.split('.')[0];
if (!groupedByObject[objectName]) {
groupedByObject[objectName] = [];
}
groupedByObject[objectName].push(perm);
}
const outputDir = filePath.replace(/\.xml$/, '');
await mkdir(outputDir, { recursive: true });
for (const [objectName, perms] of Object.entries(groupedByObject)) {
const groupedElement = {
'?xml': {
'@_version': '1.0',
'@_encoding': 'UTF-8',
},
PermissionSet: {
'@_xmlns': 'http://soap.sforce.com/2006/04/metadata',
fieldPermissions: perms.map((perm) => ({
editable: String(perm.editable ?? 'false'),
field: perm.field,
readable: String(perm.readable ?? 'false'),
})),
},
};
const outPath = join(outputDir, `${objectName}.fieldPermissions.${format}`);
const outString = await transformAndCleanup(groupedElement, format);
await writeFile(outPath, outString, 'utf-8');
}
await rm(filePath, { force: true });
}
//# sourceMappingURL=disassembleAndGroupFieldPermissions.js.map