{"version":3,"file":"json.mjs","sources":["../../../src/plugins/json.ts"],"sourcesContent":["import {\n  parseJson,\n  type ParseJsonParams,\n  serializeJson,\n  type SerializeJsonParams\n} from '@neodx/fs';\nimport type { BaseVfs } from '../core/types';\nimport { createVfsPlugin } from '../create-vfs-plugin';\n\nexport interface JsonPluginApi {\n  jsonFile<FileContents extends JSONValue | unknown = unknown>(\n    path: string\n  ): JsonFileApi<FileContents>;\n  readJson<T extends JSONValue | unknown = unknown>(\n    path: string,\n    options?: ParseJsonParams\n  ): Promise<T>;\n  writeJson<T extends JSONValue | unknown = unknown>(\n    path: string,\n    json: T,\n    options?: SerializeJsonParams\n  ): Promise<void>;\n  updateJson<T extends JSONValue | unknown = unknown>(\n    path: string,\n    updater: JsonUpdate<T>,\n    options?: ParseJsonParams & SerializeJsonParams\n  ): Promise<void>;\n}\n\nexport interface JsonFileApi<FileContents extends JSONValue | unknown = unknown> {\n  read<T extends FileContents = FileContents>(options?: ParseJsonParams): Promise<T>;\n  write<T extends FileContents = FileContents>(\n    json: T,\n    options?: SerializeJsonParams\n  ): Promise<void>;\n  update<T extends FileContents = FileContents>(\n    updater: JsonUpdate<T>,\n    options?: ParseJsonParams & SerializeJsonParams\n  ): Promise<void>;\n}\n\nexport type JsonUpdate<T> = (json: T) => T | void | Promise<T | void>;\n\nexport function json() {\n  return createVfsPlugin<JsonPluginApi>('json', vfs => {\n    vfs.jsonFile = path => createJsonFileApi(vfs, path);\n    vfs.readJson = (path, options) => readVfsJson(vfs, path, options);\n    vfs.writeJson = (path, json, options) => writeVfsJson(vfs, path, json, options);\n    vfs.updateJson = (path, updater, options) => updateVfsJson(vfs, path, updater, options);\n    return vfs;\n  });\n}\n\nexport function createJsonFileApi<FileContents extends JSONValue | unknown = unknown>(\n  vfs: BaseVfs,\n  path: string\n): JsonFileApi<FileContents> {\n  return {\n    read: options => readVfsJson(vfs, path, options),\n    write: (json, options) => writeVfsJson(vfs, path, json, options),\n    update: (updater, options) => updateVfsJson(vfs, path, updater, options)\n  };\n}\n\nexport async function readVfsJson<T extends JSONValue | unknown = unknown>(\n  vfs: BaseVfs,\n  path: string,\n  options?: ParseJsonParams\n) {\n  try {\n    return parseJson<T>(await vfs.read(path, 'utf-8'), options);\n  } catch (error) {\n    throw new Error(`Cannot parse ${path}:\\n${(error as Error).message}`);\n  }\n}\n\nexport async function writeVfsJson<T extends JSONValue | unknown = unknown>(\n  vfs: BaseVfs,\n  path: string,\n  json: T,\n  options?: SerializeJsonParams\n) {\n  return await vfs.write(path, serializeJson(json, options));\n}\n\nexport async function updateVfsJson<T extends JSONValue | unknown = unknown>(\n  vfs: BaseVfs,\n  path: string,\n  updater: JsonUpdate<T>,\n  options?: ParseJsonParams & SerializeJsonParams\n) {\n  // TODO Implement support for empty, damaged, or nonexistent files\n  const current = await readVfsJson(vfs, path, options);\n\n  return await writeVfsJson(vfs, path, (await updater(current as any)) ?? current, options);\n}\n\n// TODO Probably, move away to a more generic space\nexport type JSONPrimitive = string | number | boolean | null;\nexport type JSONValue = JSONPrimitive | JSONObject | JSONArray;\nexport type JSONArray = JSONValue[];\nexport interface JSONObject {\n  [member: string]: JSONValue;\n}\n"],"names":["json","createVfsPlugin","vfs","jsonFile","path","createJsonFileApi","readJson","options","readVfsJson","writeJson","writeVfsJson","updateJson","updater","updateVfsJson","read","write","update","parseJson","error","Error","message","serializeJson","current"],"mappings":"yHA2CO,SAASA,IACd,OAAOC,EAA+B,OAAQC,AAAAA,IAC5CA,EAAIC,QAAQ,CAAGC,AAAAA,GAAQC,EAAkBH,EAAKE,GAC9CF,EAAII,QAAQ,CAAG,CAACF,EAAMG,IAAYC,EAAYN,EAAKE,EAAMG,GACzDL,EAAIO,SAAS,CAAG,CAACL,EAAMJ,EAAMO,IAAYG,EAAaR,EAAKE,EAAMJ,EAAMO,GACvEL,EAAIS,UAAU,CAAG,CAACP,EAAMQ,EAASL,IAAYM,EAAcX,EAAKE,EAAMQ,EAASL,GACxEL,GAEX,CAEO,SAASG,EACdH,CAAY,CACZE,CAAY,EAEZ,MAAO,CACLU,KAAMP,AAAAA,GAAWC,EAAYN,EAAKE,EAAMG,GACxCQ,MAAO,CAACf,EAAMO,IAAYG,EAAaR,EAAKE,EAAMJ,EAAMO,GACxDS,OAAQ,CAACJ,EAASL,IAAYM,EAAcX,EAAKE,EAAMQ,EAASL,EAClE,CACF,CAEO,eAAeC,EACpBN,CAAY,CACZE,CAAY,CACZG,CAAyB,EAEzB,GAAI,CACF,OAAOU,EAAa,MAAMf,EAAIY,IAAI,CAACV,EAAM,SAAUG,EACrD,CAAE,MAAOW,EAAO,CACd,MAAM,AAAIC,MAAM,CAAC,aAAa,EAAEf,EAAK;AAAG,EAAEc,EAAiBE,OAAO,CAAC,CAAC,CACtE,CACF,CAEO,eAAeV,EACpBR,CAAY,CACZE,CAAY,CACZJ,CAAO,CACPO,CAA6B,EAE7B,OAAO,MAAML,EAAIa,KAAK,CAACX,EAAMiB,EAAcrB,EAAMO,GACnD,CAEO,eAAeM,EACpBX,CAAY,CACZE,CAAY,CACZQ,CAAsB,CACtBL,CAA+C,EAG/C,IAAMe,EAAU,MAAMd,EAAYN,EAAKE,EAAMG,GAE7C,OAAO,MAAMG,EAAaR,EAAKE,EAAM,MAAOQ,EAAQU,IAAoBA,EAASf,EACnF"}