{"version":3,"file":"json.cjs","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":["createJsonFileApi","vfs","path","read","options","readVfsJson","write","json","writeVfsJson","update","updater","updateVfsJson","parseJson","error","Error","message","serializeJson","current","createVfsPlugin","jsonFile","readJson","writeJson","updateJson"],"mappings":"oFAqDO,SAASA,EACdC,CAAY,CACZC,CAAY,EAEZ,MAAO,CACLC,KAAMC,AAAAA,GAAWC,EAAYJ,EAAKC,EAAME,GACxCE,MAAO,CAACC,EAAMH,IAAYI,EAAaP,EAAKC,EAAMK,EAAMH,GACxDK,OAAQ,CAACC,EAASN,IAAYO,EAAcV,EAAKC,EAAMQ,EAASN,EAClE,CACF,CAEO,eAAeC,EACpBJ,CAAY,CACZC,CAAY,CACZE,CAAyB,EAEzB,GAAI,CACF,OAAOQ,EAAAA,UAAa,MAAMX,EAAIE,IAAI,CAACD,EAAM,SAAUE,EACrD,CAAE,MAAOS,EAAO,CACd,MAAM,AAAIC,MAAM,CAAC,aAAa,EAAEZ,EAAK;AAAG,EAAEW,EAAiBE,OAAO,CAAC,CAAC,CACtE,CACF,CAEO,eAAeP,EACpBP,CAAY,CACZC,CAAY,CACZK,CAAO,CACPH,CAA6B,EAE7B,OAAO,MAAMH,EAAIK,KAAK,CAACJ,EAAMc,EAAAA,cAAcT,EAAMH,GACnD,CAEO,eAAeO,EACpBV,CAAY,CACZC,CAAY,CACZQ,CAAsB,CACtBN,CAA+C,EAG/C,IAAMa,EAAU,MAAMZ,EAAYJ,EAAKC,EAAME,GAE7C,OAAO,MAAMI,EAAaP,EAAKC,EAAM,MAAOQ,EAAQO,IAAoBA,EAASb,EACnF,0CApDO,WACL,OAAOc,EAAAA,eAAAA,CAA+B,OAAQjB,AAAAA,IAC5CA,EAAIkB,QAAQ,CAAGjB,AAAAA,GAAQF,EAAkBC,EAAKC,GAC9CD,EAAImB,QAAQ,CAAG,CAAClB,EAAME,IAAYC,EAAYJ,EAAKC,EAAME,GACzDH,EAAIoB,SAAS,CAAG,CAACnB,EAAMK,EAAMH,IAAYI,EAAaP,EAAKC,EAAMK,EAAMH,GACvEH,EAAIqB,UAAU,CAAG,CAACpB,EAAMQ,EAASN,IAAYO,EAAcV,EAAKC,EAAMQ,EAASN,GACxEH,GAEX"}