UNPKG

@augment-vir/node

Version:

A collection of augments, helpers types, functions, and classes only for Node.js (backend) JavaScript environments.

78 lines (77 loc) 2.77 kB
import { check } from '@augment-vir/assert'; import { getObjectTypedEntries } from '@augment-vir/common'; import { readdir, readFile, rm, stat } from 'node:fs/promises'; import { join } from 'node:path'; import { writeFileAndDir } from './write.js'; /** * Read all contents within a directory and store them in an object. Optionally recursive. * * @category Node : File * @category Package : @augment-vir/node * @package [`@augment-vir/node`](https://www.npmjs.com/package/@augment-vir/node) */ export async function readAllDirContents(dir, { recursive = false, excludeList, }) { const fileNames = (await readdir(dir)).sort(); const allFileContents = await Promise.all(fileNames.map(async (fileName) => { const filePath = join(dir, fileName); if (excludeList?.some((excludeItem) => { if (check.isString(excludeItem)) { return filePath.includes(excludeItem); } else { return filePath.match(excludeItem); } })) { return undefined; } const isFile = (await stat(filePath)).isFile(); const contents = isFile ? (await readFile(filePath)).toString() : recursive ? await readAllDirContents(filePath, { recursive, excludeList }) : undefined; if (check.isObject(contents) && !Object.keys(contents).length) { return undefined; } return contents; })); return fileNames.reduce((accum, fileName, index) => { if (allFileContents[index] != undefined) { const fileContents = allFileContents[index]; accum[fileName] = fileContents; } return accum; }, {}); } /** * Deletes and entire directory and resets it to the given contents. * * @category Node : File * @category Package : @augment-vir/node * @package [`@augment-vir/node`](https://www.npmjs.com/package/@augment-vir/node) */ export async function resetDirContents(rootDir, contents) { await rm(rootDir, { force: true, recursive: true, }); await writeDirContents(rootDir, contents); } /** * Write {@link DirContents} to a directory. * * @category Node : File * @category Package : @augment-vir/node * @package [`@augment-vir/node`](https://www.npmjs.com/package/@augment-vir/node) */ export async function writeDirContents(rootDir, contents) { await Promise.all(getObjectTypedEntries(contents).map(async ([relativePath, content,]) => { const fullPath = join(rootDir, relativePath); if (check.isString(content)) { await writeFileAndDir(fullPath, content); } else { await writeDirContents(fullPath, content); } })); }