@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
JavaScript
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);
}
}));
}