diff --git a/lib/fxp.min.js.map b/lib/fxp.min.js.map index b08fd97c..ff5ef381 100644 --- a/lib/fxp.min.js.map +++ b/lib/fxp.min.js.map @@ -1 +1 @@ -{"version":3,"file":"./lib/fxp.min.js","mappings":"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","sources":["webpack://fxp/./node_modules/strnum/strnum.js","webpack://fxp/./src/fxp.js","webpack://fxp/./src/util.js","webpack://fxp/./src/validator.js","webpack://fxp/./src/xmlbuilder/json2xml.js","webpack://fxp/./src/xmlbuilder/orderedJs2Xml.js","webpack://fxp/./src/xmlparser/DocTypeReader.js","webpack://fxp/./src/xmlparser/OptionsBuilder.js","webpack://fxp/./src/xmlparser/OrderedObjParser.js","webpack://fxp/./src/xmlparser/XMLParser.js","webpack://fxp/./src/xmlparser/node2json.js","webpack://fxp/./src/xmlparser/xmlNode.js","webpack://fxp/webpack/bootstrap","webpack://fxp/webpack/startup"],"sourcesContent":["const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\n// const octRegex = /0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\n//polyfill\nif (!Number.parseInt && window.parseInt) {\n Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n Number.parseFloat = window.parseFloat;\n}\n\n \nconst consider = {\n hex : true,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true\n //skipLike: /regex/\n};\n\nfunction toNumber(str, options = {}){\n // const options = Object.assign({}, consider);\n // if(opt.leadingZeros === false){\n // options.leadingZeros = false;\n // }else if(opt.hex === false){\n // options.hex = false;\n // }\n\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n // if(trimmedStr === \"0.0\") return 0;\n // else if(trimmedStr === \"+0.0\") return 0;\n // else if(trimmedStr === \"-0.0\") return -0;\n\n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n // } else if (options.parseOct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n }else{\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n if(match){\n const sign = match[1];\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n //trim ending zeros for floating number\n \n const eNotation = match[4] || match[6];\n if(!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== \".\") return str; //-0123\n else if(!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== \".\") return str; //0123\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const numStr = \"\" + num;\n if(numStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(eNotation){ //given number has enotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n // const decimalPart = match[5].substr(1);\n // const intPart = trimmedStr.substr(0,trimmedStr.indexOf(\".\"));\n\n \n // const p = numStr.indexOf(\".\");\n // const givenIntPart = numStr.substr(0,p);\n // const givenDecPart = numStr.substr(p+1);\n if(numStr === \"0\" && (numTrimmedByZeros === \"\") ) return num; //0.0\n else if(numStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( sign && numStr === \"-\"+numTrimmedByZeros) return num;\n else return str;\n }\n \n if(leadingZeros){\n // if(numTrimmedByZeros === numStr){\n // if(options.leadingZeros) return num;\n // else return str;\n // }else return str;\n if(numTrimmedByZeros === numStr) return num;\n else if(sign+numTrimmedByZeros === numStr) return num;\n else return str;\n }\n\n if(trimmedStr === numStr) return num;\n else if(trimmedStr === sign+numStr) return num;\n // else{\n // //number with +/- sign\n // trimmedStr.test(/[-+][0-9]);\n\n // }\n return str;\n }\n // else if(!eNotation && trimmedStr && trimmedStr !== Number(trimmedStr) ) return str;\n \n }else{ //non-numeric string\n return str;\n }\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n if(numStr && numStr.indexOf(\".\") !== -1){//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if(numStr === \".\") numStr = \"0\";\n else if(numStr[0] === \".\") numStr = \"0\"+numStr;\n else if(numStr[numStr.length-1] === \".\") numStr = numStr.substr(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\nmodule.exports = toNumber\n","'use strict';\n\nconst validator = require('./validator');\nconst XMLParser = require('./xmlparser/XMLParser');\nconst XMLBuilder = require('./xmlbuilder/json2xml');\n\nmodule.exports = {\n XMLParser: XMLParser,\n XMLValidator: validator,\n XMLBuilder: XMLBuilder\n}","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nconst nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*'\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nconst getAllMatches = function(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n};\n\nconst isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n};\n\nexports.isExist = function(v) {\n return typeof v !== 'undefined';\n};\n\nexports.isEmptyObject = function(obj) {\n return Object.keys(obj).length === 0;\n};\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexports.merge = function(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a); // will return an array of own properties\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n if (arrayMode === 'strict') {\n target[keys[i]] = [ a[keys[i]] ];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n};\n/* exports.merge =function (b,a){\n return Object.assign(b,a);\n} */\n\nexports.getValue = function(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n};\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};\n\nexports.isName = isName;\nexports.getAllMatches = getAllMatches;\nexports.nameRegexp = nameRegexp;\n","'use strict';\n\nconst util = require('./util');\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexports.validate = function (xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n \n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n i+=2;\n i = readPI(xmlData,i);\n if (i.err) return i;\n }else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n \n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if(options.unpairedTags.indexOf(tagName) !== -1){\n //don't push into stack\n } else {\n tags.push({tagName, tagStartPos});\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i+1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else{\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n }else{\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if ( isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n }else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n }else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\"+\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n \"' found.\", {line: 1, col: 1});\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char){\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = util.getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return util.isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return util.isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","'use strict';\n//parse Empty Node as self closing node\nconst buildFromOrderedJs = require('./orderedJs2Xml');\n\nconst defaultOptions = {\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: ' ',\n suppressEmptyNode: false,\n suppressBooleanAttributes: true,\n tagValueProcessor: function(key, a) {\n return a;\n },\n attributeValueProcessor: function(attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: {\n \">\" : { regex: new RegExp(\">\", \"g\"), val: \">\" },\n \"<\" : { regex: new RegExp(\"<\", \"g\"), val: \"<\" },\n \"sQuot\" : { regex: new RegExp(\"\\'\", \"g\"), val: \"'\" },\n \"dQuot\" : { regex: new RegExp(\"\\\"\", \"g\"), val: \""\" }\n },\n processEntities: true,\n stopNodes: []\n};\n\nfunction Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n if (this.options.ignoreAttributes || this.options.attributesGroupName) {\n this.isAttribute = function(/*a*/) {\n return false;\n };\n } else {\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n\n this.processTextOrObjNode = processTextOrObjNode\n\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = '>\\n';\n this.newLine = '\\n';\n } else {\n this.indentate = function() {\n return '';\n };\n this.tagEndChar = '>';\n this.newLine = '';\n }\n\n if (this.options.suppressEmptyNode) {\n this.buildTextNode = buildEmptyTextNode;\n this.buildObjNode = buildEmptyObjNode;\n } else {\n this.buildTextNode = buildTextValNode;\n this.buildObjNode = buildObjectNode;\n }\n\n this.buildTextValNode = buildTextValNode;\n this.buildObjectNode = buildObjectNode;\n\n this.replaceEntitiesValue = replaceEntitiesValue;\n}\n\nBuilder.prototype.build = function(jObj) {\n if(this.options.preserveOrder){\n return buildFromOrderedJs(jObj, this.options);\n }else {\n if(Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1){\n jObj = {\n [this.options.arrayNodeName] : jObj\n }\n }\n return this.j2x(jObj, 0).val;\n }\n};\n\nBuilder.prototype.j2x = function(jObj, level) {\n let attrStr = '';\n let val = '';\n for (let key in jObj) {\n if (typeof jObj[key] === 'undefined') {\n // supress undefined node\n } else if (jObj[key] === null) {\n val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (jObj[key] instanceof Date) {\n val += this.buildTextNode(jObj[key], key, '', level);\n } else if (typeof jObj[key] !== 'object') {\n //premitive type\n const attr = this.isAttribute(key);\n if (attr) {\n let val = this.options.attributeValueProcessor(attr, '' + jObj[key]);\n val = this.replaceEntitiesValue(val);\n attrStr += ' ' + attr + '=\"' + val + '\"';\n }else {\n //tag value\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, '' + jObj[key]);\n val += this.replaceEntitiesValue(newval);\n } else {\n val += this.buildTextNode(jObj[key], key, '', level);\n }\n }\n } else if (Array.isArray(jObj[key])) {\n //repeated nodes\n const arrLen = jObj[key].length;\n for (let j = 0; j < arrLen; j++) {\n const item = jObj[key][j];\n if (typeof item === 'undefined') {\n // supress undefined node\n } else if (item === null) {\n val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (typeof item === 'object') {\n val += this.processTextOrObjNode(item, key, level)\n } else {\n val += this.buildTextNode(item, key, '', level);\n }\n }\n } else {\n //nested node\n if (this.options.attributesGroupName && key === this.options.attributesGroupName) {\n const Ks = Object.keys(jObj[key]);\n const L = Ks.length;\n for (let j = 0; j < L; j++) {\n let val = this.options.attributeValueProcessor(Ks[j], '' + jObj[key][Ks[j]]);\n val = this.replaceEntitiesValue(val);\n attrStr += ' ' + Ks[j] + '=\"' + val + '\"';\n }\n } else {\n val += this.processTextOrObjNode(jObj[key], key, level)\n }\n }\n }\n return {attrStr: attrStr, val: val};\n};\n\nfunction processTextOrObjNode (object, key, level) {\n const result = this.j2x(object, level + 1);\n if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) {\n return this.buildTextNode(result.val, key, result.attrStr, level);\n } else {\n return this.buildObjNode(result.val, key, result.attrStr, level);\n }\n}\n\nfunction buildObjectNode(val, key, attrStr, level) {\n if (attrStr && val.indexOf('<') === -1) {\n return (\n this.indentate(level) +\n '<' +\n key +\n attrStr +\n '>' +\n val +\n //+ this.newLine\n // + this.indentate(level)\n '' +\n textValue +\n ' 0 && this.options.processEntities){\n for (const entityName in this.options.entities) {\n const entity = this.options.entities[entityName];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\n\nfunction buildEmptyTextNode(val, key, attrStr, level) {\n if( val === '' && this.options.unpairedTags.indexOf(key) !== -1){\n return this.indentate(level) + '<' + key + attrStr + this.tagEndChar;\n }else if (val !== '') {\n return this.buildTextValNode(val, key, attrStr, level);\n } else {\n return this.indentate(level) + '<' + key + attrStr + '/' + this.tagEndChar;\n }\n}\n\nfunction indentate(level) {\n return this.options.indentBy.repeat(level);\n}\n\nfunction isAttribute(name /*, options*/) {\n if (name.startsWith(this.options.attributeNamePrefix)) {\n return name.substr(this.attrPrefixLen);\n } else {\n return false;\n }\n}\n\nmodule.exports = Builder;\n","const EOL = \"\\n\";\n\n/**\n * \n * @param {array} jArray \n * @param {any} options \n * @returns \n */\nfunction toXml(jArray, options){\n return arrToStr( jArray, options, \"\", 0);\n}\n\nfunction arrToStr(arr, options, jPath, level){\n let xmlStr = \"\";\n\n let indentation = \"\";\n if(options.format && options.indentBy.length > 0){//TODO: this logic can be avoided for each call\n indentation = EOL + \"\" + options.indentBy.repeat(level);\n }\n\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n let newJPath = \"\";\n if(jPath.length === 0) newJPath = tagName\n else newJPath = `${jPath}.${tagName}`;\n\n if(tagName === options.textNodeName){\n let tagText = tagObj[tagName];\n if(!isStopNode(newJPath, options)){\n tagText = options.tagValueProcessor( tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n xmlStr += indentation + tagText;\n continue;\n }else if( tagName === options.cdataPropName){\n xmlStr += indentation + ``;\n continue;\n }else if( tagName === options.commentPropName){\n xmlStr += indentation + ``;\n continue;\n }else if( tagName[0] === \"?\"){\n const attStr = attr_to_str(tagObj[\":@\"], options);\n xmlStr += indentation + `<${tagName} ${tagObj[tagName][0][options.textNodeName]} ${attStr}?>`;\n continue;\n }\n const attStr = attr_to_str(tagObj[\":@\"], options);\n let tagStart = indentation + `<${tagName}${attStr}`;\n let tagValue = arrToStr(tagObj[tagName], options, newJPath, level + 1);\n if(options.unpairedTags.indexOf(tagName) !== -1){\n xmlStr += tagStart + \">\"; \n }else if( (!tagValue || tagValue.length === 0) && options.suppressEmptyNode){ \n xmlStr += tagStart + \"/>\"; \n }else{ \n //TODO: node with only text value should not parse the text value in next line\n xmlStr += tagStart + `>${tagValue}${indentation}` ;\n }\n }\n \n return xmlStr;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n }\n\nfunction attr_to_str(attrMap, options){\n let attrStr = \"\";\n if(attrMap && !options.ignoreAttributes){\n for( attr in attrMap){\n let attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n if(attrVal === true && options.suppressBooleanAttributes){\n attrStr+= ` ${attr.substr(options.attributeNamePrefix.length)}`;\n }else{\n attrStr+= ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\n\nfunction isStopNode(jPath, options){\n jPath = jPath.substr(0,jPath.length - options.textNodeName.length - 1);\n let tagName = jPath.substr(jPath.lastIndexOf(\".\") + 1);\n for(let index in options.stopNodes){\n if(options.stopNodes[index] === jPath || options.stopNodes[index] === \"*.\"+tagName) return true;\n }\n return false;\n}\n\nfunction replaceEntitiesValue(textValue, options){\n if(textValue && textValue.length > 0 && options.processEntities){\n for (const entityName in options.entities) {\n const entity = options.entities[entityName];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n }\nmodule.exports = toXml;","//TODO: handle comments\nfunction readDocType(xmlData, i){\n \n const entities = {};\n if( xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E')\n { \n i = i+9;\n let angleBracketsCount = 1;\n let hasBody = false, entity = false, comment = false;\n let exp = \"\";\n for(;i') {\n if(comment){\n if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n comment = false;\n }else{\n throw new Error(`Invalid XML comment in DOCTYPE`);\n }\n }else if(entity){\n parseEntityExp(exp, entities);\n entity = false;\n }\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }else if( xmlData[i] === '['){\n hasBody = true;\n }else{\n exp += xmlData[i];\n }\n }\n if(angleBracketsCount !== 0){\n throw new Error(`Unclosed DOCTYPE`);\n }\n }else{\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return {entities, i};\n}\n\nconst entityRegex = RegExp(\"^\\\\s([a-zA-z0-0]+)[ \\t](['\\\"])([^&]+)\\\\2\");\nfunction parseEntityExp(exp, entities){\n const match = entityRegex.exec(exp);\n if(match){\n entities[ match[1] ] = {\n regx : RegExp( `&${match[1]};`,\"g\"),\n val: match[3]\n };\n }\n}\nmodule.exports = readDocType;","\nconst defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true\n },\n tagValueProcessor: function(tagName, val) {\n return val;\n },\n attributeValueProcessor: function(attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n};\n \nconst buildOptions = function(options) {\n return Object.assign({}, defaultOptions, options);\n};\n\nexports.buildOptions = buildOptions;\nexports.defaultOptions = defaultOptions;","'use strict';\n///@ts-check\n\nconst util = require('../util');\nconst xmlNode = require('./xmlNode');\nconst readDocType = require(\"./DocTypeReader\");\nconst toNumber = require(\"strnum\");\n\nconst regx =\n '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nclass OrderedObjParser{\n constructor(options){\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"amp\" : { regex: /&(amp|#38|#x26);/g, val : \"&\"},\n \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n };\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n }\n\n}\n\nfunction addExternalEntities(externalEntities){\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\"+ent+\";\",\"g\"),\n val : externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if(val.length > 0){\n if(!escapeEntities) val = this.replaceEntitiesValue(val);\n \n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if(newval === null || newval === undefined){\n //don't parse\n return val;\n }else if(typeof newval !== typeof val || newval !== val){\n //overwrite\n return newval;\n }else if(this.options.trimValues){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n const trimmedVal = val.trim();\n if(trimmedVal === val){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath) {\n if (!this.options.ignoreAttributes && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = util.getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n let oldVal = matches[i][4];\n const aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if(newVal === null || newVal === undefined){\n //don't parse\n attrs[aName] = oldVal;\n }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n //overwrite\n attrs[aName] = newVal;\n }else{\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs;\n }\n}\n\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n for(let i=0; i< xmlData.length; i++){//for each char in XML data\n const ch = xmlData[i];\n if(ch === '<'){\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if( xmlData[i+1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n if(this.options.removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n }\n }\n\n if(currentNode){\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n \n currentNode = this.tagsNodeStack.pop();//avoid recurssion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if( xmlData[i+1] === '?') {\n let tagData = readTagExp(xmlData,i, false, \"?>\");\n if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n \n if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath);\n }\n currentNode.addChild(childNode);\n\n i = tagData.closeIndex + 1;\n } else if(xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i, \"Comment is not closed.\")\n if(this.options.commentPropName){\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n }\n i = endIndex;\n } else if( xmlData.substr(i + 1, 2) === '!D') {\n const result = readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n }else if(xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9,closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n //cdata should be set even if it is 0 length string\n if(this.options.cdataPropName){\n // let val = this.parseTextData(tagExp, this.options.cdataPropName, jPath + \".\" + this.options.cdataPropName, true, false, true);\n // if(!val) val = \"\";\n currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n }else{\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true);\n if(!val) val = \"\";\n currentNode.add(this.options.textNodeName, val);\n }\n \n i = closeIndex + 2;\n }else {//Opening tag\n \n let result = readTagExp(xmlData,i, this. options.removeNSPrefix);\n let tagName= result.tagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n \n //save text as child node\n if (currentNode && textData) {\n if(currentNode.tagname !== '!xml'){\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n if(tagName !== xmlObj.tagname){\n jPath += jPath ? \".\" + tagName : tagName;\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n currentNode = this.tagsNodeStack.pop();\n }\n\n if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { //TODO: namespace\n let tagContent = \"\";\n //self-closing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){}\n //boolean tag\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){}\n //normal tag\n else{\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, tagName, closeIndex + 1);\n if(!result) throw new Error(`Unexpected end of ${tagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n if(tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n \n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n \n currentNode.addChild(childNode);\n }else{\n //selfClosing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n \n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n currentNode.addChild(childNode);\n }\n //opening tag\n else{\n const childNode = new xmlNode( tagName);\n this.tagsNodeStack.push(currentNode);\n \n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n currentNode.addChild(childNode);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n }else{\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nconst replaceEntitiesValue = function(val){\n if(this.options.processEntities){\n for(let entityName in this.docTypeEntities){\n const entity = this.docTypeEntities[entityName];\n val = val.replace( entity.regx, entity.val);\n }\n for(let entityName in this.lastEntities){\n const entity = this.lastEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n if(this.options.htmlEntities){\n for(let entityName in this.htmlEntities){\n const entity = this.htmlEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n }\n }\n return val;\n}\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if(isLeafNode === undefined) isLeafNode = Object.keys(currentNode.child).length === 0\n \n textData = this.parseTextData(textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * \n * @param {string[]} stopNodes \n * @param {string} jPath\n * @param {string} currentTagName \n */\nfunction isItStopNode(stopNodes, jPath, currentTagName){\n const allNodesExp = \"*.\" + currentTagName;\n for (const stopNodePath in stopNodes) {\n const stopNodeExp = stopNodes[stopNodePath];\n if( allNodesExp === stopNodeExp || jPath === stopNodeExp ) return true;\n }\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-dobule quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if(closingChar[1]){\n if(xmlData[index + 1] === closingChar[1]){\n return {\n data: tagExp,\n index: index\n }\n }\n }else{\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \"\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n const closingIndex = xmlData.indexOf(str, i);\n if(closingIndex === -1){\n throw new Error(errMsg)\n }else{\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n if(!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if(separatorIndex !== -1){//separate tag name and attributes expression\n tagName = tagExp.substr(0, separatorIndex).replace(/\\s\\s*$/, '');\n tagExp = tagExp.substr(separatorIndex + 1);\n }\n\n if(removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n const startIndex = i;\n for (; i < xmlData.length; i++) {\n if( xmlData[i] === \"<\" && xmlData[i+1] === \"/\"){ \n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n if(closeTagName === tagName){\n return {\n tagContent: xmlData.substring(startIndex, i),\n i : closeIndex\n }\n }\n i=closeIndex;\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if(newval === 'true' ) return true;\n else if(newval === 'false' ) return false;\n else return toNumber(val, options);\n } else {\n if (util.isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\n\nmodule.exports = OrderedObjParser;\n","const { buildOptions} = require(\"./OptionsBuilder\");\nconst OrderedObjParser = require(\"./OrderedObjParser\");\nconst { prettify} = require(\"./node2json\");\nconst validator = require('../validator');\n\nclass XMLParser{\n \n constructor(options){\n this.externalEntities = {};\n this.options = buildOptions(options);\n \n }\n /**\n * Parse XML dats to JS object \n * @param {string|Buffer} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData,validationOption){\n if(typeof xmlData === \"string\"){\n }else if( xmlData.toString){\n xmlData = xmlData.toString();\n }else{\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n if( validationOption){\n if(validationOption === true) validationOption = {}; //validate with default options\n \n const result = validator.validate(xmlData, validationOption);\n if (result !== true) {\n throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value){\n if(value.indexOf(\"&\") !== -1){\n throw new Error(\"Entity value can't have '&'\")\n }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for ' '\")\n }else{\n this.externalEntities[key] = value;\n }\n }\n}\n\nmodule.exports = XMLParser;","'use strict';\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nfunction prettify(node, options){\n return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n let newJpath = \"\";\n if(jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if(property === options.textNodeName){\n if(text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n }else if(property === undefined){\n continue;\n }else if(tagObj[property]){\n \n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n\n if(tagObj[\":@\"]){\n assignAttributes( val, tagObj[\":@\"], newJpath, options);\n }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n val = val[options.textNodeName];\n }else if(Object.keys(val).length === 0){\n if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if(compressedObj[property] !== undefined) {\n if(!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [ compressedObj[property] ];\n }\n compressedObj[property].push(val);\n }else{\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf )) {\n compressedObj[property] = [val];\n }else{\n compressedObj[property] = val;\n }\n }\n }\n \n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if(typeof text === \"string\"){\n if(text.length > 0) compressedObj[options.textNodeName] = text;\n }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [ attrMap[atrrName] ];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options){\n const propCount = Object.keys(obj).length;\n if( propCount === 0 || (propCount === 1 && obj[options.textNodeName]) ) return true;\n return false;\n}\nexports.prettify = prettify;\n","'use strict';\n\nclass XmlNode{\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = {}; //attributes map\n }\n add(key,val){\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n this.child.push( {[key]: val });\n }\n addChild(node) {\n if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n }else{\n this.child.push( { [node.tagname]: node.child });\n }\n };\n};\n\n\nmodule.exports = XmlNode;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(316);\n"],"names":["hexRegex","numRegex","Number","parseInt","window","parseFloat","consider","hex","leadingZeros","decimalPoint","eNotation","module","exports","str","options","Object","assign","trimmedStr","trim","undefined","skipLike","test","match","exec","sign","numTrimmedByZeros","numStr","indexOf","replace","length","substr","num","search","validator","require","XMLParser","XMLBuilder","XMLValidator","nameRegexp","regexName","RegExp","isExist","v","isEmptyObject","obj","keys","merge","target","a","arrayMode","len","i","getValue","isName","string","getAllMatches","regex","matches","allmatches","startIndex","lastIndex","index","push","util","defaultOptions","allowBooleanAttributes","unpairedTags","isWhiteSpace","char","readPI","xmlData","start","tagname","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","angleBracketsCount","readAttributeStr","attrStr","startChar","tagClosed","value","validate","tags","tagFound","reachedRoot","err","tagStartPos","closingTag","tagName","substring","result","attrStrStart","isValid","validateAttributeString","code","msg","line","otg","pop","openPos","col","afterAmp","validateAmpersand","JSON","stringify","map","t","validAttrStrRegxp","attrNames","getPositionFromMatch","attrName","validateAttrName","hasOwnProperty","re","validateNumberAmpersand","count","message","lineNumber","lines","split","buildFromOrderedJs","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","cdataPropName","format","indentBy","suppressEmptyNode","suppressBooleanAttributes","tagValueProcessor","key","attributeValueProcessor","preserveOrder","commentPropName","entities","val","processEntities","stopNodes","Builder","this","isAttribute","attrPrefixLen","processTextOrObjNode","indentate","tagEndChar","newLine","buildTextNode","buildEmptyTextNode","buildObjNode","buildEmptyObjNode","buildTextValNode","buildObjectNode","replaceEntitiesValue","object","level","j2x","textValue","entityName","entity","repeat","name","startsWith","prototype","build","jObj","Array","isArray","arrayNodeName","Date","attr","newval","arrLen","j","item","Ks","L","arrToStr","arr","jPath","xmlStr","indentation","newJPath","tagObj","propName","tagStart","attr_to_str","tagValue","attStr","tagText","isStopNode","attrMap","attrVal","lastIndexOf","jArray","entityRegex","parseEntityExp","exp","regx","Error","hasBody","comment","removeNSPrefix","parseTagValue","parseAttributeValue","trimValues","numberParseOptions","alwaysCreateTextNode","htmlEntities","buildOptions","xmlNode","readDocType","toNumber","addExternalEntities","externalEntities","entKeys","ent","lastEntities","parseTextData","dontTrim","hasAttributes","isLeafNode","escapeEntities","parseValue","resolveNameSpace","prefix","charAt","attrsRegx","buildAttributesMap","attrs","oldVal","aName","newVal","attrCollection","parseXml","xmlObj","currentNode","textData","closeIndex","findClosingIndex","colonIndex","saveTextToParentTag","tagsNodeStack","tagData","readTagExp","childNode","add","tagExp","attrExpPresent","addChild","endIndex","docTypeEntities","lastTag","isItStopNode","tagContent","readStopNodeData","child","currentTagName","allNodesExp","stopNodePath","stopNodeExp","errMsg","closingIndex","closingChar","attrBoundary","ch","data","tagExpWithClosingIndex","separatorIndex","shouldParse","OrderedObjParser","prettify","parse","validationOption","toString","orderedObjParser","orderedResult","addEntity","compress","text","compressedObj","newJpath","property","isLeaf","isLeafTag","assignAttributes","jpath","atrrName","propCount","node","XmlNode","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./lib/fxp.min.js","mappings":"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","sources":["webpack://fxp/./node_modules/strnum/strnum.js","webpack://fxp/./src/fxp.js","webpack://fxp/./src/util.js","webpack://fxp/./src/validator.js","webpack://fxp/./src/xmlbuilder/json2xml.js","webpack://fxp/./src/xmlbuilder/orderedJs2Xml.js","webpack://fxp/./src/xmlparser/DocTypeReader.js","webpack://fxp/./src/xmlparser/OptionsBuilder.js","webpack://fxp/./src/xmlparser/OrderedObjParser.js","webpack://fxp/./src/xmlparser/XMLParser.js","webpack://fxp/./src/xmlparser/node2json.js","webpack://fxp/./src/xmlparser/xmlNode.js","webpack://fxp/webpack/bootstrap","webpack://fxp/webpack/startup"],"sourcesContent":["const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\n// const octRegex = /0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\n//polyfill\nif (!Number.parseInt && window.parseInt) {\n Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n Number.parseFloat = window.parseFloat;\n}\n\n \nconst consider = {\n hex : true,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true\n //skipLike: /regex/\n};\n\nfunction toNumber(str, options = {}){\n // const options = Object.assign({}, consider);\n // if(opt.leadingZeros === false){\n // options.leadingZeros = false;\n // }else if(opt.hex === false){\n // options.hex = false;\n // }\n\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n // if(trimmedStr === \"0.0\") return 0;\n // else if(trimmedStr === \"+0.0\") return 0;\n // else if(trimmedStr === \"-0.0\") return -0;\n\n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n // } else if (options.parseOct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n }else{\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n if(match){\n const sign = match[1];\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n //trim ending zeros for floating number\n \n const eNotation = match[4] || match[6];\n if(!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== \".\") return str; //-0123\n else if(!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== \".\") return str; //0123\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const numStr = \"\" + num;\n if(numStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(eNotation){ //given number has enotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n // const decimalPart = match[5].substr(1);\n // const intPart = trimmedStr.substr(0,trimmedStr.indexOf(\".\"));\n\n \n // const p = numStr.indexOf(\".\");\n // const givenIntPart = numStr.substr(0,p);\n // const givenDecPart = numStr.substr(p+1);\n if(numStr === \"0\" && (numTrimmedByZeros === \"\") ) return num; //0.0\n else if(numStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( sign && numStr === \"-\"+numTrimmedByZeros) return num;\n else return str;\n }\n \n if(leadingZeros){\n // if(numTrimmedByZeros === numStr){\n // if(options.leadingZeros) return num;\n // else return str;\n // }else return str;\n if(numTrimmedByZeros === numStr) return num;\n else if(sign+numTrimmedByZeros === numStr) return num;\n else return str;\n }\n\n if(trimmedStr === numStr) return num;\n else if(trimmedStr === sign+numStr) return num;\n // else{\n // //number with +/- sign\n // trimmedStr.test(/[-+][0-9]);\n\n // }\n return str;\n }\n // else if(!eNotation && trimmedStr && trimmedStr !== Number(trimmedStr) ) return str;\n \n }else{ //non-numeric string\n return str;\n }\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n if(numStr && numStr.indexOf(\".\") !== -1){//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if(numStr === \".\") numStr = \"0\";\n else if(numStr[0] === \".\") numStr = \"0\"+numStr;\n else if(numStr[numStr.length-1] === \".\") numStr = numStr.substr(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\nmodule.exports = toNumber\n","'use strict';\n\nconst validator = require('./validator');\nconst XMLParser = require('./xmlparser/XMLParser');\nconst XMLBuilder = require('./xmlbuilder/json2xml');\n\nmodule.exports = {\n XMLParser: XMLParser,\n XMLValidator: validator,\n XMLBuilder: XMLBuilder\n}","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nconst nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*'\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nconst getAllMatches = function(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n};\n\nconst isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n};\n\nexports.isExist = function(v) {\n return typeof v !== 'undefined';\n};\n\nexports.isEmptyObject = function(obj) {\n return Object.keys(obj).length === 0;\n};\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexports.merge = function(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a); // will return an array of own properties\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n if (arrayMode === 'strict') {\n target[keys[i]] = [ a[keys[i]] ];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n};\n/* exports.merge =function (b,a){\n return Object.assign(b,a);\n} */\n\nexports.getValue = function(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n};\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};\n\nexports.isName = isName;\nexports.getAllMatches = getAllMatches;\nexports.nameRegexp = nameRegexp;\n","'use strict';\n\nconst util = require('./util');\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexports.validate = function (xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n \n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n i+=2;\n i = readPI(xmlData,i);\n if (i.err) return i;\n }else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n \n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if(options.unpairedTags.indexOf(tagName) !== -1){\n //don't push into stack\n } else {\n tags.push({tagName, tagStartPos});\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i+1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else{\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n }else{\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if ( isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n }else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n }else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\"+\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n \"' found.\", {line: 1, col: 1});\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char){\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = util.getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return util.isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return util.isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","'use strict';\n//parse Empty Node as self closing node\nconst buildFromOrderedJs = require('./orderedJs2Xml');\n\nconst defaultOptions = {\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: ' ',\n suppressEmptyNode: false,\n suppressBooleanAttributes: true,\n tagValueProcessor: function(key, a) {\n return a;\n },\n attributeValueProcessor: function(attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: {\n \">\" : { regex: new RegExp(\">\", \"g\"), val: \">\" },\n \"<\" : { regex: new RegExp(\"<\", \"g\"), val: \"<\" },\n \"sQuot\" : { regex: new RegExp(\"\\'\", \"g\"), val: \"'\" },\n \"dQuot\" : { regex: new RegExp(\"\\\"\", \"g\"), val: \""\" }\n },\n processEntities: true,\n stopNodes: []\n};\n\nfunction Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n if (this.options.ignoreAttributes || this.options.attributesGroupName) {\n this.isAttribute = function(/*a*/) {\n return false;\n };\n } else {\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n\n this.processTextOrObjNode = processTextOrObjNode\n\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = '>\\n';\n this.newLine = '\\n';\n } else {\n this.indentate = function() {\n return '';\n };\n this.tagEndChar = '>';\n this.newLine = '';\n }\n\n if (this.options.suppressEmptyNode) {\n this.buildTextNode = buildEmptyTextNode;\n this.buildObjNode = buildEmptyObjNode;\n } else {\n this.buildTextNode = buildTextValNode;\n this.buildObjNode = buildObjectNode;\n }\n\n this.buildTextValNode = buildTextValNode;\n this.buildObjectNode = buildObjectNode;\n\n this.replaceEntitiesValue = replaceEntitiesValue;\n}\n\nBuilder.prototype.build = function(jObj) {\n if(this.options.preserveOrder){\n return buildFromOrderedJs(jObj, this.options);\n }else {\n if(Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1){\n jObj = {\n [this.options.arrayNodeName] : jObj\n }\n }\n return this.j2x(jObj, 0).val;\n }\n};\n\nBuilder.prototype.j2x = function(jObj, level) {\n let attrStr = '';\n let val = '';\n for (let key in jObj) {\n if (typeof jObj[key] === 'undefined') {\n // supress undefined node\n } else if (jObj[key] === null) {\n val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (jObj[key] instanceof Date) {\n val += this.buildTextNode(jObj[key], key, '', level);\n } else if (typeof jObj[key] !== 'object') {\n //premitive type\n const attr = this.isAttribute(key);\n if (attr) {\n let val = this.options.attributeValueProcessor(attr, '' + jObj[key]);\n val = this.replaceEntitiesValue(val);\n attrStr += ' ' + attr + '=\"' + val + '\"';\n }else {\n //tag value\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, '' + jObj[key]);\n val += this.replaceEntitiesValue(newval);\n } else {\n val += this.buildTextNode(jObj[key], key, '', level);\n }\n }\n } else if (Array.isArray(jObj[key])) {\n //repeated nodes\n const arrLen = jObj[key].length;\n for (let j = 0; j < arrLen; j++) {\n const item = jObj[key][j];\n if (typeof item === 'undefined') {\n // supress undefined node\n } else if (item === null) {\n val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (typeof item === 'object') {\n val += this.processTextOrObjNode(item, key, level)\n } else {\n val += this.buildTextNode(item, key, '', level);\n }\n }\n } else {\n //nested node\n if (this.options.attributesGroupName && key === this.options.attributesGroupName) {\n const Ks = Object.keys(jObj[key]);\n const L = Ks.length;\n for (let j = 0; j < L; j++) {\n let val = this.options.attributeValueProcessor(Ks[j], '' + jObj[key][Ks[j]]);\n val = this.replaceEntitiesValue(val);\n attrStr += ' ' + Ks[j] + '=\"' + val + '\"';\n }\n } else {\n val += this.processTextOrObjNode(jObj[key], key, level)\n }\n }\n }\n return {attrStr: attrStr, val: val};\n};\n\nfunction processTextOrObjNode (object, key, level) {\n const result = this.j2x(object, level + 1);\n if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) {\n return this.buildTextNode(result.val, key, result.attrStr, level);\n } else {\n return this.buildObjNode(result.val, key, result.attrStr, level);\n }\n}\n\nfunction buildObjectNode(val, key, attrStr, level) {\n if (attrStr && val.indexOf('<') === -1) {\n return (\n this.indentate(level) +\n '<' +\n key +\n attrStr +\n '>' +\n val +\n //+ this.newLine\n // + this.indentate(level)\n '' +\n textValue +\n ' 0 && this.options.processEntities){\n for (const entityName in this.options.entities) {\n const entity = this.options.entities[entityName];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\n\nfunction buildEmptyTextNode(val, key, attrStr, level) {\n if( val === '' && this.options.unpairedTags.indexOf(key) !== -1){\n return this.indentate(level) + '<' + key + attrStr + this.tagEndChar;\n }else if (val !== '') {\n return this.buildTextValNode(val, key, attrStr, level);\n } else {\n return this.indentate(level) + '<' + key + attrStr + '/' + this.tagEndChar;\n }\n}\n\nfunction indentate(level) {\n return this.options.indentBy.repeat(level);\n}\n\nfunction isAttribute(name /*, options*/) {\n if (name.startsWith(this.options.attributeNamePrefix)) {\n return name.substr(this.attrPrefixLen);\n } else {\n return false;\n }\n}\n\nmodule.exports = Builder;\n","const EOL = \"\\n\";\n\n/**\n * \n * @param {array} jArray \n * @param {any} options \n * @returns \n */\nfunction toXml(jArray, options){\n return arrToStr( jArray, options, \"\", 0);\n}\n\nfunction arrToStr(arr, options, jPath, level){\n let xmlStr = \"\";\n\n let indentation = \"\";\n if(options.format && options.indentBy.length > 0){//TODO: this logic can be avoided for each call\n indentation = EOL + \"\" + options.indentBy.repeat(level);\n }\n\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n let newJPath = \"\";\n if(jPath.length === 0) newJPath = tagName\n else newJPath = `${jPath}.${tagName}`;\n\n if(tagName === options.textNodeName){\n let tagText = tagObj[tagName];\n if(!isStopNode(newJPath, options)){\n tagText = options.tagValueProcessor( tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n xmlStr += indentation + tagText;\n continue;\n }else if( tagName === options.cdataPropName){\n xmlStr += indentation + ``;\n continue;\n }else if( tagName === options.commentPropName){\n xmlStr += indentation + ``;\n continue;\n }else if( tagName[0] === \"?\"){\n const attStr = attr_to_str(tagObj[\":@\"], options);\n xmlStr += indentation + `<${tagName} ${tagObj[tagName][0][options.textNodeName]} ${attStr}?>`;\n continue;\n }\n const attStr = attr_to_str(tagObj[\":@\"], options);\n let tagStart = indentation + `<${tagName}${attStr}`;\n let tagValue = arrToStr(tagObj[tagName], options, newJPath, level + 1);\n if(options.unpairedTags.indexOf(tagName) !== -1){\n xmlStr += tagStart + \">\"; \n }else if( (!tagValue || tagValue.length === 0) && options.suppressEmptyNode){ \n xmlStr += tagStart + \"/>\"; \n }else{ \n //TODO: node with only text value should not parse the text value in next line\n xmlStr += tagStart + `>${tagValue}${indentation}` ;\n }\n }\n \n return xmlStr;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n }\n\nfunction attr_to_str(attrMap, options){\n let attrStr = \"\";\n if(attrMap && !options.ignoreAttributes){\n for( attr in attrMap){\n let attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n if(attrVal === true && options.suppressBooleanAttributes){\n attrStr+= ` ${attr.substr(options.attributeNamePrefix.length)}`;\n }else{\n attrStr+= ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\n\nfunction isStopNode(jPath, options){\n jPath = jPath.substr(0,jPath.length - options.textNodeName.length - 1);\n let tagName = jPath.substr(jPath.lastIndexOf(\".\") + 1);\n for(let index in options.stopNodes){\n if(options.stopNodes[index] === jPath || options.stopNodes[index] === \"*.\"+tagName) return true;\n }\n return false;\n}\n\nfunction replaceEntitiesValue(textValue, options){\n if(textValue && textValue.length > 0 && options.processEntities){\n for (const entityName in options.entities) {\n const entity = options.entities[entityName];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n }\nmodule.exports = toXml;","//TODO: handle comments\nfunction readDocType(xmlData, i){\n \n const entities = {};\n if( xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E')\n { \n i = i+9;\n let angleBracketsCount = 1;\n let hasBody = false, entity = false, comment = false;\n let exp = \"\";\n for(;i') {\n if(comment){\n if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n comment = false;\n }else{\n throw new Error(`Invalid XML comment in DOCTYPE`);\n }\n }else if(entity){\n parseEntityExp(exp, entities);\n entity = false;\n }\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }else if( xmlData[i] === '['){\n hasBody = true;\n }else{\n exp += xmlData[i];\n }\n }\n if(angleBracketsCount !== 0){\n throw new Error(`Unclosed DOCTYPE`);\n }\n }else{\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return {entities, i};\n}\n\nconst entityRegex = RegExp(\"^\\\\s([a-zA-z0-0]+)[ \\t](['\\\"])([^&]+)\\\\2\");\nfunction parseEntityExp(exp, entities){\n const match = entityRegex.exec(exp);\n if(match){\n entities[ match[1] ] = {\n regx : RegExp( `&${match[1]};`,\"g\"),\n val: match[3]\n };\n }\n}\nmodule.exports = readDocType;","\nconst defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true\n },\n tagValueProcessor: function(tagName, val) {\n return val;\n },\n attributeValueProcessor: function(attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n};\n \nconst buildOptions = function(options) {\n return Object.assign({}, defaultOptions, options);\n};\n\nexports.buildOptions = buildOptions;\nexports.defaultOptions = defaultOptions;","'use strict';\n///@ts-check\n\nconst util = require('../util');\nconst xmlNode = require('./xmlNode');\nconst readDocType = require(\"./DocTypeReader\");\nconst toNumber = require(\"strnum\");\n\nconst regx =\n '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nclass OrderedObjParser{\n constructor(options){\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"amp\" : { regex: /&(amp|#38|#x26);/g, val : \"&\"},\n \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n };\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n }\n\n}\n\nfunction addExternalEntities(externalEntities){\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\"+ent+\";\",\"g\"),\n val : externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if(val.length > 0){\n if(!escapeEntities) val = this.replaceEntitiesValue(val);\n \n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if(newval === null || newval === undefined){\n //don't parse\n return val;\n }else if(typeof newval !== typeof val || newval !== val){\n //overwrite\n return newval;\n }else if(this.options.trimValues){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n const trimmedVal = val.trim();\n if(trimmedVal === val){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath) {\n if (!this.options.ignoreAttributes && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = util.getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n let oldVal = matches[i][4];\n const aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if(newVal === null || newVal === undefined){\n //don't parse\n attrs[aName] = oldVal;\n }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n //overwrite\n attrs[aName] = newVal;\n }else{\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs;\n }\n}\n\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n for(let i=0; i< xmlData.length; i++){//for each char in XML data\n const ch = xmlData[i];\n if(ch === '<'){\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if( xmlData[i+1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n if(this.options.removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n }\n }\n\n if(currentNode){\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n \n currentNode = this.tagsNodeStack.pop();//avoid recurssion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if( xmlData[i+1] === '?') {\n let tagData = readTagExp(xmlData,i, false, \"?>\");\n if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n \n if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath);\n }\n currentNode.addChild(childNode);\n\n i = tagData.closeIndex + 1;\n } else if(xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i, \"Comment is not closed.\")\n if(this.options.commentPropName){\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n }\n i = endIndex;\n } else if( xmlData.substr(i + 1, 2) === '!D') {\n const result = readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n }else if(xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9,closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n //cdata should be set even if it is 0 length string\n if(this.options.cdataPropName){\n // let val = this.parseTextData(tagExp, this.options.cdataPropName, jPath + \".\" + this.options.cdataPropName, true, false, true);\n // if(!val) val = \"\";\n currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n }else{\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true);\n if(!val) val = \"\";\n currentNode.add(this.options.textNodeName, val);\n }\n \n i = closeIndex + 2;\n }else {//Opening tag\n \n let result = readTagExp(xmlData,i, this. options.removeNSPrefix);\n let tagName= result.tagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n \n //save text as child node\n if (currentNode && textData) {\n if(currentNode.tagname !== '!xml'){\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n if(tagName !== xmlObj.tagname){\n jPath += jPath ? \".\" + tagName : tagName;\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n currentNode = this.tagsNodeStack.pop();\n }\n\n if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { //TODO: namespace\n let tagContent = \"\";\n //self-closing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){}\n //boolean tag\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){}\n //normal tag\n else{\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, tagName, closeIndex + 1);\n if(!result) throw new Error(`Unexpected end of ${tagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n if(tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n \n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n \n currentNode.addChild(childNode);\n }else{\n //selfClosing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n \n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n currentNode.addChild(childNode);\n }\n //opening tag\n else{\n const childNode = new xmlNode( tagName);\n this.tagsNodeStack.push(currentNode);\n \n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n currentNode.addChild(childNode);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n }else{\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nconst replaceEntitiesValue = function(val){\n if(this.options.processEntities){\n for(let entityName in this.docTypeEntities){\n const entity = this.docTypeEntities[entityName];\n val = val.replace( entity.regx, entity.val);\n }\n for(let entityName in this.lastEntities){\n const entity = this.lastEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n if(this.options.htmlEntities){\n for(let entityName in this.htmlEntities){\n const entity = this.htmlEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n }\n }\n return val;\n}\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if(isLeafNode === undefined) isLeafNode = Object.keys(currentNode.child).length === 0\n \n textData = this.parseTextData(textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * \n * @param {string[]} stopNodes \n * @param {string} jPath\n * @param {string} currentTagName \n */\nfunction isItStopNode(stopNodes, jPath, currentTagName){\n const allNodesExp = \"*.\" + currentTagName;\n for (const stopNodePath in stopNodes) {\n const stopNodeExp = stopNodes[stopNodePath];\n if( allNodesExp === stopNodeExp || jPath === stopNodeExp ) return true;\n }\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-dobule quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if(closingChar[1]){\n if(xmlData[index + 1] === closingChar[1]){\n return {\n data: tagExp,\n index: index\n }\n }\n }else{\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \"\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n const closingIndex = xmlData.indexOf(str, i);\n if(closingIndex === -1){\n throw new Error(errMsg)\n }else{\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n if(!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if(separatorIndex !== -1){//separate tag name and attributes expression\n tagName = tagExp.substr(0, separatorIndex).replace(/\\s\\s*$/, '');\n tagExp = tagExp.substr(separatorIndex + 1);\n }\n\n if(removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n const startIndex = i;\n for (; i < xmlData.length; i++) {\n if( xmlData[i] === \"<\" && xmlData[i+1] === \"/\"){ \n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n if(closeTagName === tagName){\n return {\n tagContent: xmlData.substring(startIndex, i),\n i : closeIndex\n }\n }\n i=closeIndex;\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if(newval === 'true' ) return true;\n else if(newval === 'false' ) return false;\n else return toNumber(val, options);\n } else {\n if (util.isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\n\nmodule.exports = OrderedObjParser;\n","const { buildOptions} = require(\"./OptionsBuilder\");\nconst OrderedObjParser = require(\"./OrderedObjParser\");\nconst { prettify} = require(\"./node2json\");\nconst validator = require('../validator');\n\nclass XMLParser{\n \n constructor(options){\n this.externalEntities = {};\n this.options = buildOptions(options);\n \n }\n /**\n * Parse XML dats to JS object \n * @param {string|Buffer} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData,validationOption){\n if(typeof xmlData === \"string\"){\n }else if( xmlData.toString){\n xmlData = xmlData.toString();\n }else{\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n if( validationOption){\n if(validationOption === true) validationOption = {}; //validate with default options\n \n const result = validator.validate(xmlData, validationOption);\n if (result !== true) {\n throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value){\n if(value.indexOf(\"&\") !== -1){\n throw new Error(\"Entity value can't have '&'\")\n }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for ' '\")\n }else{\n this.externalEntities[key] = value;\n }\n }\n}\n\nmodule.exports = XMLParser;","'use strict';\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nfunction prettify(node, options){\n return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n let newJpath = \"\";\n if(jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if(property === options.textNodeName){\n if(text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n }else if(property === undefined){\n continue;\n }else if(tagObj[property]){\n \n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n\n if(tagObj[\":@\"]){\n assignAttributes( val, tagObj[\":@\"], newJpath, options);\n }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n val = val[options.textNodeName];\n }else if(Object.keys(val).length === 0){\n if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if(compressedObj[property] !== undefined) {\n if(!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [ compressedObj[property] ];\n }\n compressedObj[property].push(val);\n }else{\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf )) {\n compressedObj[property] = [val];\n }else{\n compressedObj[property] = val;\n }\n }\n }\n \n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if(typeof text === \"string\"){\n if(text.length > 0) compressedObj[options.textNodeName] = text;\n }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [ attrMap[atrrName] ];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options){\n const propCount = Object.keys(obj).length;\n if( propCount === 0 || (propCount === 1 && obj[options.textNodeName]) ) return true;\n return false;\n}\nexports.prettify = prettify;\n","'use strict';\n\nclass XmlNode{\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = {}; //attributes map\n }\n add(key,val){\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n this.child.push( {[key]: val });\n }\n addChild(node) {\n if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n }else{\n this.child.push( { [node.tagname]: node.child });\n }\n };\n};\n\n\nmodule.exports = XmlNode;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(316);\n"],"names":["hexRegex","numRegex","Number","parseInt","window","parseFloat","consider","hex","leadingZeros","decimalPoint","eNotation","module","exports","str","options","Object","assign","trimmedStr","trim","undefined","skipLike","test","match","exec","sign","numTrimmedByZeros","numStr","indexOf","replace","length","substr","num","search","validator","require","XMLParser","XMLBuilder","XMLValidator","nameRegexp","regexName","RegExp","isExist","v","isEmptyObject","obj","keys","merge","target","a","arrayMode","len","i","getValue","isName","string","getAllMatches","regex","matches","allmatches","startIndex","lastIndex","index","push","util","defaultOptions","allowBooleanAttributes","unpairedTags","isWhiteSpace","char","readPI","xmlData","start","tagname","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","angleBracketsCount","readAttributeStr","attrStr","startChar","tagClosed","value","validate","tags","tagFound","reachedRoot","err","tagStartPos","closingTag","tagName","substring","result","attrStrStart","isValid","validateAttributeString","code","msg","line","otg","pop","openPos","col","afterAmp","validateAmpersand","JSON","stringify","map","t","validAttrStrRegxp","attrNames","getPositionFromMatch","attrName","validateAttrName","hasOwnProperty","re","validateNumberAmpersand","count","message","lineNumber","lines","split","buildFromOrderedJs","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","cdataPropName","format","indentBy","suppressEmptyNode","suppressBooleanAttributes","tagValueProcessor","key","attributeValueProcessor","preserveOrder","commentPropName","entities","val","processEntities","stopNodes","Builder","this","isAttribute","attrPrefixLen","processTextOrObjNode","indentate","tagEndChar","newLine","buildTextNode","buildEmptyTextNode","buildObjNode","buildEmptyObjNode","buildTextValNode","buildObjectNode","replaceEntitiesValue","object","level","j2x","textValue","entityName","entity","repeat","name","startsWith","prototype","build","jObj","Array","isArray","arrayNodeName","Date","attr","newval","arrLen","j","item","Ks","L","arrToStr","arr","jPath","xmlStr","indentation","newJPath","tagObj","propName","tagStart","attr_to_str","tagValue","attStr","tagText","isStopNode","attrMap","attrVal","lastIndexOf","jArray","entityRegex","parseEntityExp","exp","regx","Error","hasBody","comment","removeNSPrefix","parseTagValue","parseAttributeValue","trimValues","numberParseOptions","alwaysCreateTextNode","htmlEntities","buildOptions","xmlNode","readDocType","toNumber","addExternalEntities","externalEntities","entKeys","ent","lastEntities","parseTextData","dontTrim","hasAttributes","isLeafNode","escapeEntities","parseValue","resolveNameSpace","prefix","charAt","attrsRegx","buildAttributesMap","attrs","oldVal","aName","newVal","attrCollection","parseXml","xmlObj","currentNode","textData","closeIndex","findClosingIndex","colonIndex","saveTextToParentTag","tagsNodeStack","tagData","readTagExp","childNode","add","tagExp","attrExpPresent","addChild","endIndex","docTypeEntities","lastTag","isItStopNode","tagContent","readStopNodeData","child","currentTagName","allNodesExp","stopNodePath","stopNodeExp","errMsg","closingIndex","closingChar","attrBoundary","ch","data","tagExpWithClosingIndex","separatorIndex","shouldParse","OrderedObjParser","prettify","parse","validationOption","toString","orderedObjParser","orderedResult","addEntity","compress","text","compressedObj","newJpath","property","isLeaf","isLeafTag","assignAttributes","jpath","atrrName","propCount","node","XmlNode","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/fxparser.min.js.map b/lib/fxparser.min.js.map index 5218483a..62604ccc 100644 --- a/lib/fxparser.min.js.map +++ b/lib/fxparser.min.js.map @@ -1 +1 @@ -{"version":3,"file":"./lib/fxparser.min.js","mappings":"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","sources":["webpack://XMLParser/./node_modules/strnum/strnum.js","webpack://XMLParser/./src/util.js","webpack://XMLParser/./src/validator.js","webpack://XMLParser/./src/xmlparser/DocTypeReader.js","webpack://XMLParser/./src/xmlparser/OptionsBuilder.js","webpack://XMLParser/./src/xmlparser/OrderedObjParser.js","webpack://XMLParser/./src/xmlparser/XMLParser.js","webpack://XMLParser/./src/xmlparser/node2json.js","webpack://XMLParser/./src/xmlparser/xmlNode.js","webpack://XMLParser/webpack/bootstrap","webpack://XMLParser/webpack/startup"],"sourcesContent":["const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\n// const octRegex = /0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\n//polyfill\nif (!Number.parseInt && window.parseInt) {\n Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n Number.parseFloat = window.parseFloat;\n}\n\n \nconst consider = {\n hex : true,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true\n //skipLike: /regex/\n};\n\nfunction toNumber(str, options = {}){\n // const options = Object.assign({}, consider);\n // if(opt.leadingZeros === false){\n // options.leadingZeros = false;\n // }else if(opt.hex === false){\n // options.hex = false;\n // }\n\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n // if(trimmedStr === \"0.0\") return 0;\n // else if(trimmedStr === \"+0.0\") return 0;\n // else if(trimmedStr === \"-0.0\") return -0;\n\n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n // } else if (options.parseOct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n }else{\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n if(match){\n const sign = match[1];\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n //trim ending zeros for floating number\n \n const eNotation = match[4] || match[6];\n if(!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== \".\") return str; //-0123\n else if(!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== \".\") return str; //0123\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const numStr = \"\" + num;\n if(numStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(eNotation){ //given number has enotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n // const decimalPart = match[5].substr(1);\n // const intPart = trimmedStr.substr(0,trimmedStr.indexOf(\".\"));\n\n \n // const p = numStr.indexOf(\".\");\n // const givenIntPart = numStr.substr(0,p);\n // const givenDecPart = numStr.substr(p+1);\n if(numStr === \"0\" && (numTrimmedByZeros === \"\") ) return num; //0.0\n else if(numStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( sign && numStr === \"-\"+numTrimmedByZeros) return num;\n else return str;\n }\n \n if(leadingZeros){\n // if(numTrimmedByZeros === numStr){\n // if(options.leadingZeros) return num;\n // else return str;\n // }else return str;\n if(numTrimmedByZeros === numStr) return num;\n else if(sign+numTrimmedByZeros === numStr) return num;\n else return str;\n }\n\n if(trimmedStr === numStr) return num;\n else if(trimmedStr === sign+numStr) return num;\n // else{\n // //number with +/- sign\n // trimmedStr.test(/[-+][0-9]);\n\n // }\n return str;\n }\n // else if(!eNotation && trimmedStr && trimmedStr !== Number(trimmedStr) ) return str;\n \n }else{ //non-numeric string\n return str;\n }\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n if(numStr && numStr.indexOf(\".\") !== -1){//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if(numStr === \".\") numStr = \"0\";\n else if(numStr[0] === \".\") numStr = \"0\"+numStr;\n else if(numStr[numStr.length-1] === \".\") numStr = numStr.substr(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\nmodule.exports = toNumber\n","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nconst nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*'\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nconst getAllMatches = function(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n};\n\nconst isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n};\n\nexports.isExist = function(v) {\n return typeof v !== 'undefined';\n};\n\nexports.isEmptyObject = function(obj) {\n return Object.keys(obj).length === 0;\n};\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexports.merge = function(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a); // will return an array of own properties\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n if (arrayMode === 'strict') {\n target[keys[i]] = [ a[keys[i]] ];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n};\n/* exports.merge =function (b,a){\n return Object.assign(b,a);\n} */\n\nexports.getValue = function(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n};\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};\n\nexports.isName = isName;\nexports.getAllMatches = getAllMatches;\nexports.nameRegexp = nameRegexp;\n","'use strict';\n\nconst util = require('./util');\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexports.validate = function (xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n \n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n i+=2;\n i = readPI(xmlData,i);\n if (i.err) return i;\n }else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n \n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if(options.unpairedTags.indexOf(tagName) !== -1){\n //don't push into stack\n } else {\n tags.push({tagName, tagStartPos});\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i+1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else{\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n }else{\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if ( isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n }else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n }else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\"+\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n \"' found.\", {line: 1, col: 1});\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char){\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = util.getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return util.isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return util.isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","//TODO: handle comments\nfunction readDocType(xmlData, i){\n \n const entities = {};\n if( xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E')\n { \n i = i+9;\n let angleBracketsCount = 1;\n let hasBody = false, entity = false, comment = false;\n let exp = \"\";\n for(;i') {\n if(comment){\n if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n comment = false;\n }else{\n throw new Error(`Invalid XML comment in DOCTYPE`);\n }\n }else if(entity){\n parseEntityExp(exp, entities);\n entity = false;\n }\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }else if( xmlData[i] === '['){\n hasBody = true;\n }else{\n exp += xmlData[i];\n }\n }\n if(angleBracketsCount !== 0){\n throw new Error(`Unclosed DOCTYPE`);\n }\n }else{\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return {entities, i};\n}\n\nconst entityRegex = RegExp(\"^\\\\s([a-zA-z0-0]+)[ \\t](['\\\"])([^&]+)\\\\2\");\nfunction parseEntityExp(exp, entities){\n const match = entityRegex.exec(exp);\n if(match){\n entities[ match[1] ] = {\n regx : RegExp( `&${match[1]};`,\"g\"),\n val: match[3]\n };\n }\n}\nmodule.exports = readDocType;","\nconst defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true\n },\n tagValueProcessor: function(tagName, val) {\n return val;\n },\n attributeValueProcessor: function(attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n};\n \nconst buildOptions = function(options) {\n return Object.assign({}, defaultOptions, options);\n};\n\nexports.buildOptions = buildOptions;\nexports.defaultOptions = defaultOptions;","'use strict';\n///@ts-check\n\nconst util = require('../util');\nconst xmlNode = require('./xmlNode');\nconst readDocType = require(\"./DocTypeReader\");\nconst toNumber = require(\"strnum\");\n\nconst regx =\n '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nclass OrderedObjParser{\n constructor(options){\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"amp\" : { regex: /&(amp|#38|#x26);/g, val : \"&\"},\n \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n };\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n }\n\n}\n\nfunction addExternalEntities(externalEntities){\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\"+ent+\";\",\"g\"),\n val : externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if(val.length > 0){\n if(!escapeEntities) val = this.replaceEntitiesValue(val);\n \n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if(newval === null || newval === undefined){\n //don't parse\n return val;\n }else if(typeof newval !== typeof val || newval !== val){\n //overwrite\n return newval;\n }else if(this.options.trimValues){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n const trimmedVal = val.trim();\n if(trimmedVal === val){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath) {\n if (!this.options.ignoreAttributes && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = util.getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n let oldVal = matches[i][4];\n const aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if(newVal === null || newVal === undefined){\n //don't parse\n attrs[aName] = oldVal;\n }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n //overwrite\n attrs[aName] = newVal;\n }else{\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs;\n }\n}\n\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n for(let i=0; i< xmlData.length; i++){//for each char in XML data\n const ch = xmlData[i];\n if(ch === '<'){\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if( xmlData[i+1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n if(this.options.removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n }\n }\n\n if(currentNode){\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n \n currentNode = this.tagsNodeStack.pop();//avoid recurssion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if( xmlData[i+1] === '?') {\n let tagData = readTagExp(xmlData,i, false, \"?>\");\n if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n \n if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath);\n }\n currentNode.addChild(childNode);\n\n i = tagData.closeIndex + 1;\n } else if(xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i, \"Comment is not closed.\")\n if(this.options.commentPropName){\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n }\n i = endIndex;\n } else if( xmlData.substr(i + 1, 2) === '!D') {\n const result = readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n }else if(xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9,closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n //cdata should be set even if it is 0 length string\n if(this.options.cdataPropName){\n // let val = this.parseTextData(tagExp, this.options.cdataPropName, jPath + \".\" + this.options.cdataPropName, true, false, true);\n // if(!val) val = \"\";\n currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n }else{\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true);\n if(!val) val = \"\";\n currentNode.add(this.options.textNodeName, val);\n }\n \n i = closeIndex + 2;\n }else {//Opening tag\n \n let result = readTagExp(xmlData,i, this. options.removeNSPrefix);\n let tagName= result.tagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n \n //save text as child node\n if (currentNode && textData) {\n if(currentNode.tagname !== '!xml'){\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n if(tagName !== xmlObj.tagname){\n jPath += jPath ? \".\" + tagName : tagName;\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n currentNode = this.tagsNodeStack.pop();\n }\n\n if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { //TODO: namespace\n let tagContent = \"\";\n //self-closing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){}\n //boolean tag\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){}\n //normal tag\n else{\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, tagName, closeIndex + 1);\n if(!result) throw new Error(`Unexpected end of ${tagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n if(tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n \n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n \n currentNode.addChild(childNode);\n }else{\n //selfClosing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n \n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n currentNode.addChild(childNode);\n }\n //opening tag\n else{\n const childNode = new xmlNode( tagName);\n this.tagsNodeStack.push(currentNode);\n \n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n currentNode.addChild(childNode);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n }else{\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nconst replaceEntitiesValue = function(val){\n if(this.options.processEntities){\n for(let entityName in this.docTypeEntities){\n const entity = this.docTypeEntities[entityName];\n val = val.replace( entity.regx, entity.val);\n }\n for(let entityName in this.lastEntities){\n const entity = this.lastEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n if(this.options.htmlEntities){\n for(let entityName in this.htmlEntities){\n const entity = this.htmlEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n }\n }\n return val;\n}\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if(isLeafNode === undefined) isLeafNode = Object.keys(currentNode.child).length === 0\n \n textData = this.parseTextData(textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * \n * @param {string[]} stopNodes \n * @param {string} jPath\n * @param {string} currentTagName \n */\nfunction isItStopNode(stopNodes, jPath, currentTagName){\n const allNodesExp = \"*.\" + currentTagName;\n for (const stopNodePath in stopNodes) {\n const stopNodeExp = stopNodes[stopNodePath];\n if( allNodesExp === stopNodeExp || jPath === stopNodeExp ) return true;\n }\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-dobule quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if(closingChar[1]){\n if(xmlData[index + 1] === closingChar[1]){\n return {\n data: tagExp,\n index: index\n }\n }\n }else{\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \"\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n const closingIndex = xmlData.indexOf(str, i);\n if(closingIndex === -1){\n throw new Error(errMsg)\n }else{\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n if(!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if(separatorIndex !== -1){//separate tag name and attributes expression\n tagName = tagExp.substr(0, separatorIndex).replace(/\\s\\s*$/, '');\n tagExp = tagExp.substr(separatorIndex + 1);\n }\n\n if(removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n const startIndex = i;\n for (; i < xmlData.length; i++) {\n if( xmlData[i] === \"<\" && xmlData[i+1] === \"/\"){ \n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n if(closeTagName === tagName){\n return {\n tagContent: xmlData.substring(startIndex, i),\n i : closeIndex\n }\n }\n i=closeIndex;\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if(newval === 'true' ) return true;\n else if(newval === 'false' ) return false;\n else return toNumber(val, options);\n } else {\n if (util.isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\n\nmodule.exports = OrderedObjParser;\n","const { buildOptions} = require(\"./OptionsBuilder\");\nconst OrderedObjParser = require(\"./OrderedObjParser\");\nconst { prettify} = require(\"./node2json\");\nconst validator = require('../validator');\n\nclass XMLParser{\n \n constructor(options){\n this.externalEntities = {};\n this.options = buildOptions(options);\n \n }\n /**\n * Parse XML dats to JS object \n * @param {string|Buffer} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData,validationOption){\n if(typeof xmlData === \"string\"){\n }else if( xmlData.toString){\n xmlData = xmlData.toString();\n }else{\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n if( validationOption){\n if(validationOption === true) validationOption = {}; //validate with default options\n \n const result = validator.validate(xmlData, validationOption);\n if (result !== true) {\n throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value){\n if(value.indexOf(\"&\") !== -1){\n throw new Error(\"Entity value can't have '&'\")\n }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for ' '\")\n }else{\n this.externalEntities[key] = value;\n }\n }\n}\n\nmodule.exports = XMLParser;","'use strict';\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nfunction prettify(node, options){\n return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n let newJpath = \"\";\n if(jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if(property === options.textNodeName){\n if(text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n }else if(property === undefined){\n continue;\n }else if(tagObj[property]){\n \n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n\n if(tagObj[\":@\"]){\n assignAttributes( val, tagObj[\":@\"], newJpath, options);\n }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n val = val[options.textNodeName];\n }else if(Object.keys(val).length === 0){\n if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if(compressedObj[property] !== undefined) {\n if(!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [ compressedObj[property] ];\n }\n compressedObj[property].push(val);\n }else{\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf )) {\n compressedObj[property] = [val];\n }else{\n compressedObj[property] = val;\n }\n }\n }\n \n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if(typeof text === \"string\"){\n if(text.length > 0) compressedObj[options.textNodeName] = text;\n }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [ attrMap[atrrName] ];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options){\n const propCount = Object.keys(obj).length;\n if( propCount === 0 || (propCount === 1 && obj[options.textNodeName]) ) return true;\n return false;\n}\nexports.prettify = prettify;\n","'use strict';\n\nclass XmlNode{\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = {}; //attributes map\n }\n add(key,val){\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n this.child.push( {[key]: val });\n }\n addChild(node) {\n if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n }else{\n this.child.push( { [node.tagname]: node.child });\n }\n };\n};\n\n\nmodule.exports = XmlNode;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(870);\n"],"names":["hexRegex","numRegex","Number","parseInt","window","parseFloat","consider","hex","leadingZeros","decimalPoint","eNotation","module","exports","str","options","Object","assign","trimmedStr","trim","undefined","skipLike","test","match","exec","sign","numTrimmedByZeros","numStr","indexOf","replace","length","substr","num","search","nameRegexp","regexName","RegExp","isExist","v","isEmptyObject","obj","keys","merge","target","a","arrayMode","len","i","getValue","isName","string","getAllMatches","regex","matches","allmatches","startIndex","lastIndex","index","push","util","require","defaultOptions","allowBooleanAttributes","unpairedTags","isWhiteSpace","char","readPI","xmlData","start","tagname","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","angleBracketsCount","readAttributeStr","attrStr","startChar","tagClosed","value","validate","tags","tagFound","reachedRoot","err","tagStartPos","closingTag","tagName","substring","result","attrStrStart","isValid","validateAttributeString","code","msg","line","otg","pop","openPos","col","afterAmp","validateAmpersand","JSON","stringify","map","t","validAttrStrRegxp","attrNames","getPositionFromMatch","attrName","validateAttrName","hasOwnProperty","re","validateNumberAmpersand","count","message","lineNumber","lines","split","entityRegex","parseEntityExp","exp","entities","regx","val","Error","hasBody","entity","comment","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","tagValueProcessor","attributeValueProcessor","stopNodes","alwaysCreateTextNode","isArray","commentPropName","processEntities","htmlEntities","buildOptions","xmlNode","readDocType","toNumber","addExternalEntities","externalEntities","entKeys","ent","this","lastEntities","parseTextData","jPath","dontTrim","hasAttributes","isLeafNode","escapeEntities","replaceEntitiesValue","newval","parseValue","resolveNameSpace","prefix","charAt","attrsRegx","buildAttributesMap","attrs","oldVal","aName","newVal","attrCollection","parseXml","xmlObj","currentNode","textData","closeIndex","findClosingIndex","colonIndex","saveTextToParentTag","lastIndexOf","tagsNodeStack","tagData","readTagExp","childNode","add","tagExp","attrExpPresent","addChild","endIndex","docTypeEntities","lastTag","isItStopNode","tagContent","readStopNodeData","child","entityName","currentTagName","allNodesExp","stopNodePath","stopNodeExp","errMsg","closingIndex","closingChar","attrBoundary","ch","data","tagExpWithClosingIndex","separatorIndex","shouldParse","OrderedObjParser","prettify","validator","XMLParser","parse","validationOption","toString","orderedObjParser","orderedResult","addEntity","key","compress","arr","text","compressedObj","newJpath","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","Array","attrMap","jpath","atrrName","propCount","node","XmlNode","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./lib/fxparser.min.js","mappings":"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","sources":["webpack://XMLParser/./node_modules/strnum/strnum.js","webpack://XMLParser/./src/util.js","webpack://XMLParser/./src/validator.js","webpack://XMLParser/./src/xmlparser/DocTypeReader.js","webpack://XMLParser/./src/xmlparser/OptionsBuilder.js","webpack://XMLParser/./src/xmlparser/OrderedObjParser.js","webpack://XMLParser/./src/xmlparser/XMLParser.js","webpack://XMLParser/./src/xmlparser/node2json.js","webpack://XMLParser/./src/xmlparser/xmlNode.js","webpack://XMLParser/webpack/bootstrap","webpack://XMLParser/webpack/startup"],"sourcesContent":["const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\n// const octRegex = /0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\n//polyfill\nif (!Number.parseInt && window.parseInt) {\n Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n Number.parseFloat = window.parseFloat;\n}\n\n \nconst consider = {\n hex : true,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true\n //skipLike: /regex/\n};\n\nfunction toNumber(str, options = {}){\n // const options = Object.assign({}, consider);\n // if(opt.leadingZeros === false){\n // options.leadingZeros = false;\n // }else if(opt.hex === false){\n // options.hex = false;\n // }\n\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n // if(trimmedStr === \"0.0\") return 0;\n // else if(trimmedStr === \"+0.0\") return 0;\n // else if(trimmedStr === \"-0.0\") return -0;\n\n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n // } else if (options.parseOct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n }else{\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n if(match){\n const sign = match[1];\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n //trim ending zeros for floating number\n \n const eNotation = match[4] || match[6];\n if(!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== \".\") return str; //-0123\n else if(!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== \".\") return str; //0123\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const numStr = \"\" + num;\n if(numStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(eNotation){ //given number has enotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n // const decimalPart = match[5].substr(1);\n // const intPart = trimmedStr.substr(0,trimmedStr.indexOf(\".\"));\n\n \n // const p = numStr.indexOf(\".\");\n // const givenIntPart = numStr.substr(0,p);\n // const givenDecPart = numStr.substr(p+1);\n if(numStr === \"0\" && (numTrimmedByZeros === \"\") ) return num; //0.0\n else if(numStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( sign && numStr === \"-\"+numTrimmedByZeros) return num;\n else return str;\n }\n \n if(leadingZeros){\n // if(numTrimmedByZeros === numStr){\n // if(options.leadingZeros) return num;\n // else return str;\n // }else return str;\n if(numTrimmedByZeros === numStr) return num;\n else if(sign+numTrimmedByZeros === numStr) return num;\n else return str;\n }\n\n if(trimmedStr === numStr) return num;\n else if(trimmedStr === sign+numStr) return num;\n // else{\n // //number with +/- sign\n // trimmedStr.test(/[-+][0-9]);\n\n // }\n return str;\n }\n // else if(!eNotation && trimmedStr && trimmedStr !== Number(trimmedStr) ) return str;\n \n }else{ //non-numeric string\n return str;\n }\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n if(numStr && numStr.indexOf(\".\") !== -1){//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if(numStr === \".\") numStr = \"0\";\n else if(numStr[0] === \".\") numStr = \"0\"+numStr;\n else if(numStr[numStr.length-1] === \".\") numStr = numStr.substr(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\nmodule.exports = toNumber\n","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nconst nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*'\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nconst getAllMatches = function(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n};\n\nconst isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n};\n\nexports.isExist = function(v) {\n return typeof v !== 'undefined';\n};\n\nexports.isEmptyObject = function(obj) {\n return Object.keys(obj).length === 0;\n};\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexports.merge = function(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a); // will return an array of own properties\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n if (arrayMode === 'strict') {\n target[keys[i]] = [ a[keys[i]] ];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n};\n/* exports.merge =function (b,a){\n return Object.assign(b,a);\n} */\n\nexports.getValue = function(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n};\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};\n\nexports.isName = isName;\nexports.getAllMatches = getAllMatches;\nexports.nameRegexp = nameRegexp;\n","'use strict';\n\nconst util = require('./util');\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexports.validate = function (xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n \n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n i+=2;\n i = readPI(xmlData,i);\n if (i.err) return i;\n }else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n \n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if(options.unpairedTags.indexOf(tagName) !== -1){\n //don't push into stack\n } else {\n tags.push({tagName, tagStartPos});\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i+1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else{\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n }else{\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if ( isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n }else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n }else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\"+\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n \"' found.\", {line: 1, col: 1});\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char){\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = util.getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return util.isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return util.isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","//TODO: handle comments\nfunction readDocType(xmlData, i){\n \n const entities = {};\n if( xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E')\n { \n i = i+9;\n let angleBracketsCount = 1;\n let hasBody = false, entity = false, comment = false;\n let exp = \"\";\n for(;i') {\n if(comment){\n if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n comment = false;\n }else{\n throw new Error(`Invalid XML comment in DOCTYPE`);\n }\n }else if(entity){\n parseEntityExp(exp, entities);\n entity = false;\n }\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }else if( xmlData[i] === '['){\n hasBody = true;\n }else{\n exp += xmlData[i];\n }\n }\n if(angleBracketsCount !== 0){\n throw new Error(`Unclosed DOCTYPE`);\n }\n }else{\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return {entities, i};\n}\n\nconst entityRegex = RegExp(\"^\\\\s([a-zA-z0-0]+)[ \\t](['\\\"])([^&]+)\\\\2\");\nfunction parseEntityExp(exp, entities){\n const match = entityRegex.exec(exp);\n if(match){\n entities[ match[1] ] = {\n regx : RegExp( `&${match[1]};`,\"g\"),\n val: match[3]\n };\n }\n}\nmodule.exports = readDocType;","\nconst defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true\n },\n tagValueProcessor: function(tagName, val) {\n return val;\n },\n attributeValueProcessor: function(attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n};\n \nconst buildOptions = function(options) {\n return Object.assign({}, defaultOptions, options);\n};\n\nexports.buildOptions = buildOptions;\nexports.defaultOptions = defaultOptions;","'use strict';\n///@ts-check\n\nconst util = require('../util');\nconst xmlNode = require('./xmlNode');\nconst readDocType = require(\"./DocTypeReader\");\nconst toNumber = require(\"strnum\");\n\nconst regx =\n '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nclass OrderedObjParser{\n constructor(options){\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"amp\" : { regex: /&(amp|#38|#x26);/g, val : \"&\"},\n \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n };\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n }\n\n}\n\nfunction addExternalEntities(externalEntities){\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\"+ent+\";\",\"g\"),\n val : externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if(val.length > 0){\n if(!escapeEntities) val = this.replaceEntitiesValue(val);\n \n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if(newval === null || newval === undefined){\n //don't parse\n return val;\n }else if(typeof newval !== typeof val || newval !== val){\n //overwrite\n return newval;\n }else if(this.options.trimValues){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n const trimmedVal = val.trim();\n if(trimmedVal === val){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath) {\n if (!this.options.ignoreAttributes && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = util.getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n let oldVal = matches[i][4];\n const aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if(newVal === null || newVal === undefined){\n //don't parse\n attrs[aName] = oldVal;\n }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n //overwrite\n attrs[aName] = newVal;\n }else{\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs;\n }\n}\n\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n for(let i=0; i< xmlData.length; i++){//for each char in XML data\n const ch = xmlData[i];\n if(ch === '<'){\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if( xmlData[i+1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n if(this.options.removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n }\n }\n\n if(currentNode){\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n \n currentNode = this.tagsNodeStack.pop();//avoid recurssion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if( xmlData[i+1] === '?') {\n let tagData = readTagExp(xmlData,i, false, \"?>\");\n if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n \n if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath);\n }\n currentNode.addChild(childNode);\n\n i = tagData.closeIndex + 1;\n } else if(xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i, \"Comment is not closed.\")\n if(this.options.commentPropName){\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n }\n i = endIndex;\n } else if( xmlData.substr(i + 1, 2) === '!D') {\n const result = readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n }else if(xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9,closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n //cdata should be set even if it is 0 length string\n if(this.options.cdataPropName){\n // let val = this.parseTextData(tagExp, this.options.cdataPropName, jPath + \".\" + this.options.cdataPropName, true, false, true);\n // if(!val) val = \"\";\n currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n }else{\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true);\n if(!val) val = \"\";\n currentNode.add(this.options.textNodeName, val);\n }\n \n i = closeIndex + 2;\n }else {//Opening tag\n \n let result = readTagExp(xmlData,i, this. options.removeNSPrefix);\n let tagName= result.tagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n \n //save text as child node\n if (currentNode && textData) {\n if(currentNode.tagname !== '!xml'){\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n if(tagName !== xmlObj.tagname){\n jPath += jPath ? \".\" + tagName : tagName;\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n currentNode = this.tagsNodeStack.pop();\n }\n\n if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { //TODO: namespace\n let tagContent = \"\";\n //self-closing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){}\n //boolean tag\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){}\n //normal tag\n else{\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, tagName, closeIndex + 1);\n if(!result) throw new Error(`Unexpected end of ${tagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n if(tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n \n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n \n currentNode.addChild(childNode);\n }else{\n //selfClosing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n \n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n currentNode.addChild(childNode);\n }\n //opening tag\n else{\n const childNode = new xmlNode( tagName);\n this.tagsNodeStack.push(currentNode);\n \n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n currentNode.addChild(childNode);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n }else{\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nconst replaceEntitiesValue = function(val){\n if(this.options.processEntities){\n for(let entityName in this.docTypeEntities){\n const entity = this.docTypeEntities[entityName];\n val = val.replace( entity.regx, entity.val);\n }\n for(let entityName in this.lastEntities){\n const entity = this.lastEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n if(this.options.htmlEntities){\n for(let entityName in this.htmlEntities){\n const entity = this.htmlEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n }\n }\n return val;\n}\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if(isLeafNode === undefined) isLeafNode = Object.keys(currentNode.child).length === 0\n \n textData = this.parseTextData(textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * \n * @param {string[]} stopNodes \n * @param {string} jPath\n * @param {string} currentTagName \n */\nfunction isItStopNode(stopNodes, jPath, currentTagName){\n const allNodesExp = \"*.\" + currentTagName;\n for (const stopNodePath in stopNodes) {\n const stopNodeExp = stopNodes[stopNodePath];\n if( allNodesExp === stopNodeExp || jPath === stopNodeExp ) return true;\n }\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-dobule quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if(closingChar[1]){\n if(xmlData[index + 1] === closingChar[1]){\n return {\n data: tagExp,\n index: index\n }\n }\n }else{\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \"\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n const closingIndex = xmlData.indexOf(str, i);\n if(closingIndex === -1){\n throw new Error(errMsg)\n }else{\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n if(!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if(separatorIndex !== -1){//separate tag name and attributes expression\n tagName = tagExp.substr(0, separatorIndex).replace(/\\s\\s*$/, '');\n tagExp = tagExp.substr(separatorIndex + 1);\n }\n\n if(removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n const startIndex = i;\n for (; i < xmlData.length; i++) {\n if( xmlData[i] === \"<\" && xmlData[i+1] === \"/\"){ \n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n if(closeTagName === tagName){\n return {\n tagContent: xmlData.substring(startIndex, i),\n i : closeIndex\n }\n }\n i=closeIndex;\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if(newval === 'true' ) return true;\n else if(newval === 'false' ) return false;\n else return toNumber(val, options);\n } else {\n if (util.isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\n\nmodule.exports = OrderedObjParser;\n","const { buildOptions} = require(\"./OptionsBuilder\");\nconst OrderedObjParser = require(\"./OrderedObjParser\");\nconst { prettify} = require(\"./node2json\");\nconst validator = require('../validator');\n\nclass XMLParser{\n \n constructor(options){\n this.externalEntities = {};\n this.options = buildOptions(options);\n \n }\n /**\n * Parse XML dats to JS object \n * @param {string|Buffer} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData,validationOption){\n if(typeof xmlData === \"string\"){\n }else if( xmlData.toString){\n xmlData = xmlData.toString();\n }else{\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n if( validationOption){\n if(validationOption === true) validationOption = {}; //validate with default options\n \n const result = validator.validate(xmlData, validationOption);\n if (result !== true) {\n throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value){\n if(value.indexOf(\"&\") !== -1){\n throw new Error(\"Entity value can't have '&'\")\n }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for ' '\")\n }else{\n this.externalEntities[key] = value;\n }\n }\n}\n\nmodule.exports = XMLParser;","'use strict';\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nfunction prettify(node, options){\n return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n let newJpath = \"\";\n if(jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if(property === options.textNodeName){\n if(text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n }else if(property === undefined){\n continue;\n }else if(tagObj[property]){\n \n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n\n if(tagObj[\":@\"]){\n assignAttributes( val, tagObj[\":@\"], newJpath, options);\n }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n val = val[options.textNodeName];\n }else if(Object.keys(val).length === 0){\n if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if(compressedObj[property] !== undefined) {\n if(!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [ compressedObj[property] ];\n }\n compressedObj[property].push(val);\n }else{\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf )) {\n compressedObj[property] = [val];\n }else{\n compressedObj[property] = val;\n }\n }\n }\n \n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if(typeof text === \"string\"){\n if(text.length > 0) compressedObj[options.textNodeName] = text;\n }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [ attrMap[atrrName] ];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options){\n const propCount = Object.keys(obj).length;\n if( propCount === 0 || (propCount === 1 && obj[options.textNodeName]) ) return true;\n return false;\n}\nexports.prettify = prettify;\n","'use strict';\n\nclass XmlNode{\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = {}; //attributes map\n }\n add(key,val){\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n this.child.push( {[key]: val });\n }\n addChild(node) {\n if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n }else{\n this.child.push( { [node.tagname]: node.child });\n }\n };\n};\n\n\nmodule.exports = XmlNode;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(870);\n"],"names":["hexRegex","numRegex","Number","parseInt","window","parseFloat","consider","hex","leadingZeros","decimalPoint","eNotation","module","exports","str","options","Object","assign","trimmedStr","trim","undefined","skipLike","test","match","exec","sign","numTrimmedByZeros","numStr","indexOf","replace","length","substr","num","search","nameRegexp","regexName","RegExp","isExist","v","isEmptyObject","obj","keys","merge","target","a","arrayMode","len","i","getValue","isName","string","getAllMatches","regex","matches","allmatches","startIndex","lastIndex","index","push","util","require","defaultOptions","allowBooleanAttributes","unpairedTags","isWhiteSpace","char","readPI","xmlData","start","tagname","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","angleBracketsCount","readAttributeStr","attrStr","startChar","tagClosed","value","validate","tags","tagFound","reachedRoot","err","tagStartPos","closingTag","tagName","substring","result","attrStrStart","isValid","validateAttributeString","code","msg","line","otg","pop","openPos","col","afterAmp","validateAmpersand","JSON","stringify","map","t","validAttrStrRegxp","attrNames","getPositionFromMatch","attrName","validateAttrName","hasOwnProperty","re","validateNumberAmpersand","count","message","lineNumber","lines","split","entityRegex","parseEntityExp","exp","entities","regx","val","Error","hasBody","entity","comment","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","tagValueProcessor","attributeValueProcessor","stopNodes","alwaysCreateTextNode","isArray","commentPropName","processEntities","htmlEntities","buildOptions","xmlNode","readDocType","toNumber","addExternalEntities","externalEntities","entKeys","ent","this","lastEntities","parseTextData","jPath","dontTrim","hasAttributes","isLeafNode","escapeEntities","replaceEntitiesValue","newval","parseValue","resolveNameSpace","prefix","charAt","attrsRegx","buildAttributesMap","attrs","oldVal","aName","newVal","attrCollection","parseXml","xmlObj","currentNode","textData","closeIndex","findClosingIndex","colonIndex","saveTextToParentTag","lastIndexOf","tagsNodeStack","tagData","readTagExp","childNode","add","tagExp","attrExpPresent","addChild","endIndex","docTypeEntities","lastTag","isItStopNode","tagContent","readStopNodeData","child","entityName","currentTagName","allNodesExp","stopNodePath","stopNodeExp","errMsg","closingIndex","closingChar","attrBoundary","ch","data","tagExpWithClosingIndex","separatorIndex","shouldParse","OrderedObjParser","prettify","validator","XMLParser","parse","validationOption","toString","orderedObjParser","orderedResult","addEntity","key","compress","arr","text","compressedObj","newJpath","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","Array","attrMap","jpath","atrrName","propCount","node","XmlNode","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""} \ No newline at end of file