// 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[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(file: string) { return JSON.parse(await readFile(file, "utf-8")) as T; } export function readJsonSync(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";