UNPKG

recurring

Version:

a recurly v2 api client for node.js

109 lines (96 loc) 2.43 kB
'use strict' const xml2js = require('xml2js') function parseTypes(input) { let result = { } let item, key const keys = Object.keys(input) let mode = 'normal' try { for (let i = 0; i < keys.length; i++) { key = keys[i] item = input[key] if (mode === 'array') { mode = 'normal' if (Array.isArray(item)) { result = [ ] for (let j = 0; j < item.length; j++) { if (typeof item[j] === 'string') { result.push(item[j]) } else { result.push(parseTypes(item[j])) } } } else if (typeof item === 'string') { result = [ item ] } else { result = [ parseTypes(item) ] } } else if (typeof item === 'object') { if (item['#'] && item.type && (item.type === 'datetime')) { result[key] = new Date(item['#']) } else if (item['#'] && item.type && (item.type === 'integer')) { result[key] = parseInt(item['#'], 10) } else if (item['#'] && item.type && (item.type === 'boolean')) { result[key] = Boolean(item['#'] === 'true') } else if (item.nil && (item.nil === 'nil')) { result[key] = '' } else { result[key] = parseTypes(item) } } else if ((key === 'type') && (item === 'array')) { mode = 'array' } else { result[key] = item } } } catch (exception) { // console.error('recurly.parseTypes: @ ' + key + ' ' + item + ' ' + JSON.stringify(exception)); result = input } return result } class RecurlyParser { constructor() { this.parser = new xml2js.Parser( { mergeAttrs: true, attrkey: '#', charkey: '#', explicitArray: false, explicitRoot: false }) } parseXML(input, callback) { let calledBack = false this.parser.removeAllListeners('error') this.parser.on('error', exception => { calledBack = true callback(exception) }) this.parser.parseString(input, (err, json) => { if (calledBack) { return } if (err) { return callback(err) } callback(null, parseTypes(json)) }) } } function createParser() { return new RecurlyParser() } exports.createParser = createParser