import type { Tree } from 'nx/src/shared/tree'; import { parseJson, serializeJson } from 'nx/src/utils/json'; import type { JsonParseOptions, JsonSerializeOptions } from 'nx/src/utils/json'; /** * Reads a json file, removes all comments and parses JSON. * * @param tree - file system tree * @param path - file path * @param options - Optional JSON Parse Options */ export function readJson( tree: Tree, path: string, options?: JsonParseOptions ): T { if (!tree.exists(path)) { throw new Error(`Cannot find ${path}`); } try { return parseJson(tree.read(path, 'utf-8'), options); } catch (e) { throw new Error(`Cannot parse ${path}: ${e.message}`); } } /** * Writes a JSON value to the file system tree * @param tree File system tree * @param path Path of JSON file in the Tree * @param value Serializable value to write * @param options Optional JSON Serialize Options */ export function writeJson( tree: Tree, path: string, value: T, options?: JsonSerializeOptions ): void { tree.write(path, serializeJson(value, options)); } /** * Updates a JSON value to the file system tree * * @param tree File system tree * @param path Path of JSON file in the Tree * @param updater Function that maps the current value of a JSON document to a new value to be written to the document * @param options Optional JSON Parse and Serialize Options */ export function updateJson( tree: Tree, path: string, updater: (value: T) => U, options?: JsonParseOptions & JsonSerializeOptions ): void { const updatedValue = updater(readJson(tree, path, options)); writeJson(tree, path, updatedValue, options); }