ng-alain
Version:
Schematics specific to NG-ALAIN
60 lines (54 loc) • 1.57 kB
text/typescript
import { Tree } from '@angular-devkit/schematics';
import { parse, modify, applyEdits, JSONPath, ModificationOptions } from 'jsonc-parser';
export function readJSON<T = any>(tree: Tree, jsonFile: string, type?: string): T {
if (!tree.exists(jsonFile)) return null;
const sourceText = tree.read(jsonFile)!.toString('utf-8');
try {
const json = parse(sourceText);
if (type && !json[type]) {
json[type] = {};
}
return json;
} catch (ex) {
console.log(
`Can't parse json file (${jsonFile}), pls check for comments or trailing commas, or validate json via https://jsonlint.com/`
);
throw ex;
}
}
export function writeJSON(tree: Tree, jsonFile: string, json: any): void {
tree.overwrite(jsonFile, JSON.stringify(json, null, 2));
}
export interface ModifyJSONParam {
path: JSONPath;
value: any;
}
export function modifyJSON(
tree: Tree,
jsonPath: string,
modifies: ModifyJSONParam | ModifyJSONParam[],
options?: ModificationOptions
): void {
if (!tree.exists(jsonPath)) return null;
let sourceText = tree.read(jsonPath)!.toString('utf-8');
(Array.isArray(modifies) ? modifies : [modifies])
.map(item =>
modify(
sourceText,
item.path,
item.value,
options ?? {
formattingOptions: {
insertSpaces: true,
tabSize: 2,
eol: '\n',
keepLines: false
}
}
)
)
.forEach(edit => {
sourceText = applyEdits(sourceText, edit);
});
tree.overwrite(jsonPath, sourceText);
}