{"version":3,"file":"fs.cjs","names":["process","toUint8Array","isUint8Array","jsonStringifySorted"],"sources":["../../src/node/fs.ts"],"sourcesContent":["import { mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises'\nimport { dirname, join as joinPath, normalize } from 'node:path'\nimport process from 'node:process'\nimport { toUint8Array } from '../common/data/bin'\nimport { isUint8Array } from '../common/data/is'\nimport { jsonStringifySorted } from '../common/data/json'\n\n/** Try to use `~` for HOME folder if possible */\nexport function toHumanReadableFilePath(path: string) {\n  const p = normalize(path)\n  const h = process.env.HOME\n  if (h && p.startsWith(h))\n    return `~${p.slice(h.length)}`\n\n  return p\n}\n\n/**\n *  Tests whether a value is a valid file path. Attention! Also folders are valid file paths.\n *  @deprecated\n */\nexport async function exists(path: string): Promise<boolean> {\n  try {\n    await stat(path)\n  }\n  catch (err) {\n    return false\n  }\n  return true\n}\n\nexport async function isFile(path: string) {\n  try {\n    const s = await stat(path)\n    return s.isFile()\n  }\n  catch (err) {\n    return false\n  }\n}\n\nexport async function isFolder(path: string) {\n  try {\n    const s = await stat(path)\n    return s.isDirectory()\n  }\n  catch (err) {\n    return false\n  }\n}\n\nexport function isHiddenPath(path: string): boolean {\n  return path.startsWith('.') || path.includes('/.')\n}\n\n/** Create missing folders e.g. `/a/b/c` will create folders `/a/b/c` */\nexport async function ensureFolder(...parts: string[]): Promise<string> {\n  const path = joinPath(...parts)\n  if (!(await isFolder(path)))\n    await mkdir(path, { recursive: true })\n  return path\n}\n\n/** Create missing folder to file location e.g. `/a/b/c/s.txt` will create folders `/a/b/c` */\nexport async function ensureFolderForFile(...parts: string[]): Promise<string> {\n  const path = dirname(joinPath(...parts))\n  if (!(await isFolder(path)))\n    await mkdir(path, { recursive: true })\n  return path\n}\n\nexport async function removeFolder(...parts: string[]): Promise<string> {\n  const path = joinPath(...parts)\n  if (await isFolder(path))\n    await rm(path, { recursive: true })\n  return path\n}\n\nexport async function readText(...parts: string[]): Promise<string | undefined> {\n  const path = joinPath(...parts)\n  if (await isFile(path))\n    return await readFile(path, 'utf-8')\n}\n\nexport async function readJson<T = object>(...parts: string[]): Promise<T | undefined> {\n  const content = await readText(...parts)\n  if (content != null) {\n    try {\n      return JSON.parse(content)\n    }\n    catch (err) { }\n  }\n}\n\nexport async function readBin(...parts: string[]): Promise<Uint8Array | undefined> {\n  const path = joinPath(...parts)\n  if (await isFile(path))\n    return toUint8Array(await readFile(path))\n}\n\n/** @deprecated use readJson or readBin */\nexport async function readData(...parts: string[]): Promise<Uint8Array | undefined> {\n  const path = joinPath(...parts)\n  if (await isFile(path))\n    return await readFile(path)\n}\n\nexport async function writeText(path: string, content: string, createFolders = false): Promise<void> {\n  if (createFolders)\n    await ensureFolderForFile(path)\n  await writeFile(path, content, 'utf-8')\n}\n\n/** @deprecated use writeBin or writeJson */\nexport async function writeData(path: string, content: object | Uint8Array, createFolders = false): Promise<void> {\n  if (createFolders)\n    await ensureFolderForFile(path)\n  const data = isUint8Array(content) ? content : JSON.stringify(content)\n  await writeFile(path, data)\n}\n\nexport async function writeBin(path: string, content: Uint8Array, info: {\n  createFolders?: boolean\n} = {}): Promise<void> {\n  const { createFolders = false } = info\n  if (createFolders)\n    await ensureFolderForFile(path)\n  await writeFile(path, content)\n}\n\nexport async function writeJson<T = object>(path: string, content: T, info: {\n  createFolders?: boolean\n  pretty?: boolean\n} = {}): Promise<void> {\n  const { createFolders = false, pretty = false } = info\n  await writeText(path, jsonStringifySorted(content, pretty ? 2 : undefined), createFolders)\n}\n"],"mappings":";;;;;;;;;;;;AAQA,SAAgB,wBAAwB,MAAc;CACpD,MAAM,6BAAc,KAAK;CACzB,MAAM,IAAIA,qBAAQ,IAAI;AACtB,KAAI,KAAK,EAAE,WAAW,EAAE,CACtB,QAAO,IAAI,EAAE,MAAM,EAAE,OAAO;AAE9B,QAAO;;;;;;AAOT,eAAsB,OAAO,MAAgC;AAC3D,KAAI;AACF,mCAAW,KAAK;UAEX,KAAK;AACV,SAAO;;AAET,QAAO;;AAGT,eAAsB,OAAO,MAAc;AACzC,KAAI;AAEF,UADU,iCAAW,KAAK,EACjB,QAAQ;UAEZ,KAAK;AACV,SAAO;;;AAIX,eAAsB,SAAS,MAAc;AAC3C,KAAI;AAEF,UADU,iCAAW,KAAK,EACjB,aAAa;UAEjB,KAAK;AACV,SAAO;;;AAIX,SAAgB,aAAa,MAAuB;AAClD,QAAO,KAAK,WAAW,IAAI,IAAI,KAAK,SAAS,KAAK;;;AAIpD,eAAsB,aAAa,GAAG,OAAkC;CACtE,MAAM,2BAAgB,GAAG,MAAM;AAC/B,KAAI,CAAE,MAAM,SAAS,KAAK,CACxB,mCAAY,MAAM,EAAE,WAAW,MAAM,CAAC;AACxC,QAAO;;;AAIT,eAAsB,oBAAoB,GAAG,OAAkC;CAC7E,MAAM,kDAAwB,GAAG,MAAM,CAAC;AACxC,KAAI,CAAE,MAAM,SAAS,KAAK,CACxB,mCAAY,MAAM,EAAE,WAAW,MAAM,CAAC;AACxC,QAAO;;AAGT,eAAsB,aAAa,GAAG,OAAkC;CACtE,MAAM,2BAAgB,GAAG,MAAM;AAC/B,KAAI,MAAM,SAAS,KAAK,CACtB,gCAAS,MAAM,EAAE,WAAW,MAAM,CAAC;AACrC,QAAO;;AAGT,eAAsB,SAAS,GAAG,OAA8C;CAC9E,MAAM,2BAAgB,GAAG,MAAM;AAC/B,KAAI,MAAM,OAAO,KAAK,CACpB,QAAO,qCAAe,MAAM,QAAQ;;AAGxC,eAAsB,SAAqB,GAAG,OAAyC;CACrF,MAAM,UAAU,MAAM,SAAS,GAAG,MAAM;AACxC,KAAI,WAAW,KACb,KAAI;AACF,SAAO,KAAK,MAAM,QAAQ;UAErB,KAAK;;AAIhB,eAAsB,QAAQ,GAAG,OAAkD;CACjF,MAAM,2BAAgB,GAAG,MAAM;AAC/B,KAAI,MAAM,OAAO,KAAK,CACpB,QAAOC,yBAAa,qCAAe,KAAK,CAAC;;;AAI7C,eAAsB,SAAS,GAAG,OAAkD;CAClF,MAAM,2BAAgB,GAAG,MAAM;AAC/B,KAAI,MAAM,OAAO,KAAK,CACpB,QAAO,qCAAe,KAAK;;AAG/B,eAAsB,UAAU,MAAc,SAAiB,gBAAgB,OAAsB;AACnG,KAAI,cACF,OAAM,oBAAoB,KAAK;AACjC,uCAAgB,MAAM,SAAS,QAAQ;;;AAIzC,eAAsB,UAAU,MAAc,SAA8B,gBAAgB,OAAsB;AAChH,KAAI,cACF,OAAM,oBAAoB,KAAK;AAEjC,uCAAgB,MADHC,oCAAa,QAAQ,GAAG,UAAU,KAAK,UAAU,QAAQ,CAC3C;;AAG7B,eAAsB,SAAS,MAAc,SAAqB,OAE9D,EAAE,EAAiB;CACrB,MAAM,EAAE,gBAAgB,UAAU;AAClC,KAAI,cACF,OAAM,oBAAoB,KAAK;AACjC,uCAAgB,MAAM,QAAQ;;AAGhC,eAAsB,UAAsB,MAAc,SAAY,OAGlE,EAAE,EAAiB;CACrB,MAAM,EAAE,gBAAgB,OAAO,SAAS,UAAU;AAClD,OAAM,UAAU,MAAMC,6CAAoB,SAAS,SAAS,IAAI,OAAU,EAAE,cAAc"}