UNPKG

@neodx/vfs

Version:

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

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