UNPKG

sf-decomposer

Version:

Split large Salesforce metadata files into version-control-friendly pieces and rebuild deployment-ready files.

46 lines 2.48 kB
'use strict'; 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