UNPKG

generator-begcode

Version:

Spring Boot + Angular/React/Vue in one handy generator

71 lines (70 loc) 2.13 kB
import assert from 'assert'; import { XMLParser, XMLBuilder } from 'fast-xml-parser'; import { merge } from 'lodash-es'; const defaultXmlCommonOptions = { ignoreAttributes: false, attributeNamePrefix: '@@', commentPropName: '#comment', parseAttributeValue: false, }; const defaultXmlParserOptions = { ...defaultXmlCommonOptions, }; const defaultXmlBuildOptions = { ...defaultXmlCommonOptions, suppressBooleanAttributes: false, suppressEmptyNode: true, format: true, indentBy: ' ', }; export default class XmlStorage { sortFile; saveFile; loadFile; parser; builder; _cachedStore; constructor({ saveFile, loadFile, xmlParserOptions, xmlBuildOptions, sortFile, }) { assert(saveFile, 'saveFile callback is required to create a storage'); assert(loadFile, 'loadFile callback is required to create a storage'); this.parser = new XMLParser({ ...defaultXmlParserOptions, ...xmlParserOptions }); this.builder = new XMLBuilder({ ...defaultXmlBuildOptions, ...xmlBuildOptions }); this.saveFile = saveFile; this.loadFile = loadFile; this.sortFile = sortFile ?? true; } clearCache() { delete this._cachedStore; } save(sort = this.sortFile) { if (sort) { this.sort(); } this.persist(false); } merge(source) { assert(typeof source === 'object', 'Storage `merge` method only accept objects'); this._cachedStore = merge({}, this.store, source); } sort() { } persist(sort = this.sortFile) { if (this._cachedStore) { if (sort) { this.sort(); } this.saveFile(this.builder.build(this._cachedStore)); } } get store() { this.load(); return this._cachedStore; } load() { if (!this._cachedStore) { this._cachedStore = this.parser.parse(this.loadFile()); } } mergeContent(existing, newContent) { return newContent ? { ...existing, ...this.parser.parse(newContent) } : existing; } }