"use strict"; // FIXME: Document that this *may* not strip whitespace around text elements, and that it includes potentially-whitespace-only text elements between tags! const Promise = require("bluebird"); const saxes = require("saxes"); const consumable = require("@joepie91/consumable"); const pEvent = require("p-event"); const debug = require("debug")("promistream:parse-xml"); const pipe = require("@promistream/pipe"); const map = require("@promistream/map"); const buffer = require("@promistream/buffer"); const lastWill = require("@promistream/last-will"); const { validateOptions, validateValue } = require("@validatem/core"); const required = require("@validatem/required"); const defaultTo = require("@validatem/default-to"); const isString = require("@validatem/is-string"); const allowExtraProperties = require("@validatem/allow-extra-properties"); const arrayOf = require("@validatem/array-of"); module.exports = function parseXML(_options) { let options = validateOptions(arguments, [ defaultTo({}), allowExtraProperties({ events: [ required, arrayOf(isString) ] }) ]); debug("Creating Saxes parser"); let parser = new saxes.SaxesParser(options); let queue = consumable([]); let endEventPromise = pEvent(parser, "end"); for (let eventName of options.events) { parser.on(eventName, (value) => { debug(`${eventName} event emitted by parser`); queue.peek().push({ type: eventName, value: value }); }); } return pipe([ map((value) => { validateValue(value, [ isString ]); // FIXME: Turn this into a clearer error debug("Writing chunk to parser"); parser.write(value); debug(`Returning ${queue.peek().length} parser items`); return queue.replace([]); }), lastWill({ onAllEnds: () => { return Promise.try(() => { parser.close(); return endEventPromise; }).then(() => { debug("Parser finished processing"); return queue.consume(); }); }}), buffer() ]); };