{"version":3,"file":"json_file.js","sourceRoot":"","sources":["../src/json_file.ts"],"names":[],"mappings":"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","sourcesContent":["import {ParseableFile} from './parsable_file';\n\nexport type JSONValue = null | number | string | boolean | JSONValue[] | {[k: string]: undefined | JSONValue};\n\nexport type JSONObject = {[k: string]: undefined | JSONValue};\n\nexport class JSONFile extends ParseableFile {\n stringify(content?: T): string {\n return JSON.stringify(content, null, 2) || '{}';\n }\n parse(content: string): T {\n return JSON.parse(content);\n }\n get parsedContent(): Promise {\n return (async () => {\n return this.parse(await this.content);\n })();\n }\n /** @see https://stackoverflow.com/a/8817461/340688 */\n static getDeep(obj: JSONObject, key: string): undefined | JSONValue {\n const paths = key.split('.');\n // eslint-disable-next-line\n let current: any = obj;\n let i;\n for (i = 0; i < paths.length; ++i) {\n const m = current[paths[i]];\n if (m !== undefined && m !== null) {\n current = current[paths[i]];\n } else {\n return undefined;\n }\n }\n return current as JSONValue;\n }\n /** @see https://stackoverflow.com/a/18937118/340688 */\n static setDeep(obj: JSONObject, key: string, value: JSONValue): JSONObject {\n const path = key.split('.');\n // eslint-disable-next-line\n path.reduce((a, b, level): any => {\n const len = path.length - 1;\n if (typeof a[b] === 'undefined' && level !== len) {\n a[b] = {};\n return a[b];\n }\n if (level === len) {\n a[b] = value;\n return value;\n }\n return a[b];\n }, obj);\n return obj;\n }\n /** @see https://stackoverflow.com/a/48666737/340688 */\n static unsetDeep(obj: JSONObject, key: string) {\n const path = key.split('.');\n for (let i = 0; i < path.length - 1; i++) {\n const v = obj[path[i]];\n console.log(v);\n if (typeof v === 'object' && v && !Array.isArray(v)) {\n obj = v;\n }\n }\n const value = path.pop();\n if (value) delete obj[value];\n }\n async getDeep(prop: string) {\n const content = await this.parsedContent;\n return JSONFile.getDeep(content, prop);\n }\n async setDeep(prop: string, value: JSONValue) {\n const content = await this.parsedContent;\n JSONFile.setDeep(content, prop, value);\n return await this.update(content);\n }\n async unsetDeep(prop: string) {\n const content = await this.parsedContent;\n JSONFile.unsetDeep(content, prop);\n return await this.update(content);\n }\n async get(prop: keyof T) {\n return (await this.parsedContent)[prop];\n }\n async set(prop: keyof T, value: JSONValue) {\n const content = await this.parsedContent;\n Object.assign(content, {[prop]: value});\n return await this.update(content);\n }\n async unset(prop: keyof T) {\n const content = await this.parsedContent;\n delete content[prop];\n return await this.update(content);\n }\n}\n"]}