sitegen/framework/lib/fs.ts

111 lines
2.4 KiB
TypeScript

// File System APIs. Some custom APIs, but mostly a re-export a mix of built-in
// Node.js sync+promise fs methods. For convenince.
export {
createReadStream,
createWriteStream,
existsSync,
open,
readdir,
readdirSync,
readFile,
readFileSync,
rm,
rmSync,
stat,
statSync,
writeFile,
writeFileSync,
type FileHandle,
};
export function mkdir(dir: string) {
return nodeMkdir(dir, { recursive: true });
}
export function mkdirSync(dir: string) {
return nodeMkdirSync(dir, { recursive: true });
}
export type WriteFileAsyncOptions = Parameters<typeof writeFile>[2];
export async function writeMkdir(
file: string,
contents: Buffer | string,
options?: WriteFileAsyncOptions,
) {
await mkdir(path.dirname(file));
return writeFile(file, contents, options);
}
export function writeMkdirSync(file: string, contents: Buffer | string) {
mkdirSync(path.dirname(file));
return writeFileSync(file, contents);
}
export function readDirRecOptionalSync(dir: string) {
try {
return readdirSync(dir, { recursive: true, encoding: "utf8" });
} catch (err: any) {
if (err.code === "ENOENT") return [];
throw err;
}
}
export async function readJson<T>(file: string) {
return JSON.parse(await readFile(file, "utf-8")) as T;
}
export function readJsonSync<T>(file: string) {
return JSON.parse(readFileSync(file, "utf-8")) as T;
}
export async function removeEmptyDirectories(dir: string, removeRoot = false) {
try {
const entries = await readdir(dir, { withFileTypes: true });
let len = entries.length;
for (const entry of entries) {
if (entry.isDirectory()) {
const subDirPath = path.join(dir, entry.name);
if (await removeEmptyDirectories(subDirPath, true)) len -= 1;
}
}
if (len === 0) {
if (removeRoot) {
await rmdir(dir);
}
return true;
}
} catch (error: any) {
if (error.code === "ENOENT") {
// Directory doesn't exist, ignore
return;
}
throw error;
}
return false;
}
import * as path from "node:path";
import {
createReadStream,
createWriteStream,
existsSync,
mkdirSync as nodeMkdirSync,
readdirSync,
readFileSync,
rmSync,
statSync,
writeFileSync,
} from "node:fs";
import {
mkdir as nodeMkdir,
open,
readdir,
readFile,
rm,
rmdir,
stat,
writeFile,
type FileHandle,
} from "node:fs/promises";
export { Stats } from "node:fs";