{"version":3,"file":"hash.mjs","names":[],"sources":["../../../../../../@warlock.js/fs/src/hash.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { readFileSync } from \"node:fs\";\n\nexport type HashAlgorithm = \"sha256\" | \"sha1\" | \"md5\" | \"sha512\";\n\n/**\n * Compute a hex digest of a file's contents. Uses streaming for large\n * files so memory doesn't spike when hashing big assets.\n *\n * @param path - File to hash.\n * @param algorithm - Hash algorithm (default `sha256`).\n *\n * @example\n *   const fingerprint = await hashFile(\"./bundle.js\");\n *   const quick = await hashFile(\"./small.txt\", \"md5\");\n */\nexport function hashFileAsync(\n  path: string,\n  algorithm: HashAlgorithm = \"sha256\",\n): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const hash = createHash(algorithm);\n    const stream = createReadStream(path);\n    stream.on(\"data\", chunk => hash.update(chunk));\n    stream.on(\"end\", () => resolve(hash.digest(\"hex\")));\n    stream.on(\"error\", reject);\n  });\n}\n\nexport function hashFile(path: string, algorithm: HashAlgorithm = \"sha256\"): string {\n  return createHash(algorithm).update(readFileSync(path)).digest(\"hex\");\n}\n\n/**\n * Hash an in-memory string without touching disk. Convenient when the\n * caller already has the content loaded (e.g. file watcher diffing).\n */\nexport function hashString(content: string, algorithm: HashAlgorithm = \"sha256\"): string {\n  return createHash(algorithm).update(content).digest(\"hex\");\n}\n\n/**\n * Hash an arbitrary buffer.\n */\nexport function hashBuffer(\n  content: Buffer | Uint8Array,\n  algorithm: HashAlgorithm = \"sha256\",\n): string {\n  return createHash(algorithm).update(content).digest(\"hex\");\n}\n\n/**\n * Like `hashFileAsync` but reads the file in one go. Slightly faster for\n * small files; use the streaming variant for anything > ~1 MB.\n */\nexport async function hashFileSmallAsync(\n  path: string,\n  algorithm: HashAlgorithm = \"sha256\",\n): Promise<string> {\n  return createHash(algorithm).update(await readFile(path)).digest(\"hex\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,SAAgB,cACd,MACA,YAA2B,UACV;CACjB,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,OAAO,WAAW,SAAS;EACjC,MAAM,SAAS,iBAAiB,IAAI;EACpC,OAAO,GAAG,SAAQ,UAAS,KAAK,OAAO,KAAK,CAAC;EAC7C,OAAO,GAAG,aAAa,QAAQ,KAAK,OAAO,KAAK,CAAC,CAAC;EAClD,OAAO,GAAG,SAAS,MAAM;CAC3B,CAAC;AACH;AAEA,SAAgB,SAAS,MAAc,YAA2B,UAAkB;CAClF,OAAO,WAAW,SAAS,CAAC,CAAC,OAAO,aAAa,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK;AACtE;;;;;AAMA,SAAgB,WAAW,SAAiB,YAA2B,UAAkB;CACvF,OAAO,WAAW,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,OAAO,KAAK;AAC3D;;;;AAKA,SAAgB,WACd,SACA,YAA2B,UACnB;CACR,OAAO,WAAW,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,OAAO,KAAK;AAC3D;;;;;AAMA,eAAsB,mBACpB,MACA,YAA2B,UACV;CACjB,OAAO,WAAW,SAAS,CAAC,CAAC,OAAO,MAAM,SAAS,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK;AACxE"}