sf-decomposer
Version:
Split large Salesforce metadata files into version-control-friendly pieces and rebuild deployment-ready files.
46 lines • 2.48 kB
JavaScript
;
import { resolve, join, basename } from 'node:path';
import { readFile, readdir } from 'node:fs/promises';
import { getRepoRoot } from '../service/core/getRepoRoot.js';
import { IGNORE_FILE, SFDX_PROJECT_FILE_NAME } from '../helpers/constants.js';
export async function getPackageDirectories(metaDirectory, ignoreDirs, repoRootOverride) {
const { repoRoot, dxConfigFilePath } = repoRootOverride
? { repoRoot: repoRootOverride, dxConfigFilePath: join(repoRootOverride, SFDX_PROJECT_FILE_NAME) }
: (await getRepoRoot());
const ignorePath = resolve(repoRoot, IGNORE_FILE);
const sfdxProjectRaw = await readFile(dxConfigFilePath, 'utf-8');
const sfdxProject = JSON.parse(sfdxProjectRaw);
const normalizedIgnoreDirs = (ignoreDirs ?? []).map((dir) => basename(dir));
const packageDirectories = sfdxProject.packageDirectories.map((directory) => resolve(repoRoot, directory.path));
const searchPromises = packageDirectories.map(async (directory) => {
if (!normalizedIgnoreDirs.includes(basename(directory))) {
return searchRecursively(directory, metaDirectory);
}
return undefined;
});
const results = await Promise.all(searchPromises);
const metadataPaths = results.filter((filePath) => filePath !== undefined).map((filePath) => resolve(filePath));
return { metadataPaths, ignorePath };
}
async function searchRecursively(dxDirectory, subDirectoryName) {
try {
const files = await readdir(dxDirectory, { withFileTypes: true });
// First check if the directory we're looking for is at this level
const directMatch = files.find((file) => file.isDirectory() && file.name === subDirectoryName);
if (directMatch) {
return join(dxDirectory, directMatch.name);
}
// If not found, search recursively in subdirectories in parallel
const searchPromises = files
.filter((file) => file.isDirectory())
.map((file) => searchRecursively(join(dxDirectory, file.name), subDirectoryName));
const results = await Promise.all(searchPromises);
return results.find((result) => result !== undefined);
}
catch (error) {
// Handle permission errors or other filesystem errors gracefully
/* istanbul ignore next -- @preserve: Filesystem permission errors are platform-specific */
return undefined;
}
}
//# sourceMappingURL=getPackageDirectories.js.map