UNPKG

@alinex/datastore

Version:

Read, work and write data structures from and to differents locations and formats.

63 lines 2.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.format = exports.parse = void 0; const path_1 = require("path"); const util_1 = require("util"); const debug_1 = require("debug"); const xml = require("xml2js"); const Format = require("./index"); const parseString = util_1.promisify(xml.parseString); const debug = debug_1.default('datastore:format:xml'); function preformat(obj) { if (typeof obj !== 'object') return obj; Object.keys(obj).forEach(key => { if (obj[key] instanceof Date) { obj[key] = obj[key].toISOString(); } else if (typeof obj[key] == 'object' && obj[key]) { preformat(obj[key]); } }); return obj; } const parse = async function (parsedUri, buffer) { if (!parsedUri.pathname) return Promise.reject(`No pathname given in ${parsedUri.href}`); const pathname = parsedUri.hash || path_1.basename(parsedUri.pathname); debug(`parsing ${pathname}`); let data = await Format.cast(await parseString(buffer.toString(), { trim: true, emptyTag: null, explicitRoot: false, explicitArray: false, normalizeTags: true, preserveChildrenOrder: true }).catch(e => { e.data = buffer.toString(); throw e; }), 'boolean', 'number', 'date'); if (Object.keys(data).length == 1) { const key = Object.keys(data)[0]; if (Array.isArray(data[key])) data = data[key]; } return data; }; exports.parse = parse; const format = (function (parsedUri, data, options) { if (!parsedUri.pathname) return Promise.reject(`No pathname given in ${parsedUri.href}`); const pathname = parsedUri.hash || path_1.basename(parsedUri.pathname); debug(`formatting for ${pathname}`); if (Array.isArray(data)) { data = { entry: data }; } let rootName = 'data'; if (options && options.rootName) rootName = options.rootName; const builder = new xml.Builder({ rootName, cdata: true }); return Promise.resolve(Buffer.from(builder.buildObject(preformat(Object.assign({}, data))))); }); exports.format = format; //# sourceMappingURL=xml.js.map