import fs from "fs"; import path from "path"; import { isAscii } from "buffer"; export function fmtCPPString(str: string) { return ( '"' + str .replace(/\\/g, "\\\\") .replace(/"/g, '\\"') .replace(/\n/g, "\\n") .replace(/\r/g, "\\r") .replace(/\t/g, "\\t") .replace(/\?/g, "\\?") + // https://stackoverflow.com/questions/1234582 '"' ); } export function cap(str: string) { return str[0].toUpperCase() + str.slice(1); } export function low(str: string) { if (str.startsWith("JS")) { return "js" + str.slice(2); } return str[0].toLowerCase() + str.slice(1); } export function readdirRecursive(root: string): string[] { const files = fs.readdirSync(root, { withFileTypes: true }); return files.flatMap(file => { const fullPath = path.join(root, file.name); return file.isDirectory() ? readdirRecursive(fullPath) : fullPath; }); } export function resolveSyncOrNull(specifier: string, from: string) { try { return Bun.resolveSync(specifier, from); } catch { return null; } } export function checkAscii(str: string) { if (!isAscii(Buffer.from(str))) { throw new Error(`non-ascii character in string "${str}". this will not be a valid ASCIILiteral`); } return str; }