UNPKG

sf-decomposer

Version:

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

39 lines 1.64 kB
'use strict'; import { readdir, stat, rename, copyFile, unlink, mkdir } from 'node:fs/promises'; import { dirname, join } from 'node:path'; import { CONCURRENCY_LIMITS } from '../../helpers/constants.js'; import { pLimit } from '../../helpers/pLimit.js'; async function moveFile(source, destination) { await mkdir(dirname(destination), { recursive: true }); try { await rename(source, destination); } catch (err) { const code = err.code; // EXDEV: cross-device rename. EPERM/EEXIST: Windows rename when destination exists. if (code === 'EXDEV' || code === 'EPERM' || code === 'EEXIST') { await copyFile(source, destination); await unlink(source); } else { throw err; } } } export async function moveFiles(sourceDirectory, destinationDirectory, predicate) { const files = await readdir(sourceDirectory); // Limit concurrent stat operations const statLimit = pLimit(CONCURRENCY_LIMITS.FILE_OPERATIONS); const fileStats = await Promise.all(files.map((file) => statLimit(async () => ({ file, isFile: (await stat(join(sourceDirectory, file))).isFile(), shouldMove: predicate(file), })))); // Limit concurrent file move operations const moveLimit = pLimit(CONCURRENCY_LIMITS.FILE_OPERATIONS); const moveTasks = fileStats .filter(({ isFile, shouldMove }) => isFile && shouldMove) .map(({ file }) => moveLimit(() => moveFile(join(sourceDirectory, file), join(destinationDirectory, file)))); await Promise.all(moveTasks); } //# sourceMappingURL=moveFiles.js.map