UNPKG

@neodx/vfs

Version:

Simple virtual file system - working dir context, lazy changes, different modes, integrations and moreover

1 lines 4.8 kB
{"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"}