From e0a14f7d15a293732e630ce1b7faa39924de2359 Mon Sep 17 00:00:00 2001 From: amit kumar gupta Date: Wed, 11 Mar 2026 16:49:21 +0530 Subject: [PATCH] update dependency to fix typings --- CHANGELOG.md | 3 +++ lib/fxp.cjs | 2 +- lib/fxp.min.js | 2 +- lib/fxp.min.js.map | 2 +- lib/fxparser.min.js | 2 +- lib/fxparser.min.js.map | 2 +- package-lock.json | 36 ++++++++++++++++++------------------ package.json | 6 +++--- yarn.lock | 18 +++++++++--------- 9 files changed, 38 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2f7d7b7..bba2f184 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ Note: Due to some last quick changes on v4, detail of v4.5.3 & v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github repository. I'm extremely sorry for the confusion +**5.5.2 / 2026-03-11** +- update dependency to fix typings + **5.5.1 / 2026-03-10** - fix dependency diff --git a/lib/fxp.cjs b/lib/fxp.cjs index 82ca52b1..98d7cbfe 100644 --- a/lib/fxp.cjs +++ b/lib/fxp.cjs @@ -1 +1 @@ -(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>vt,XMLParser:()=>ht,XMLValidator:()=>Tt});const i=":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",n=new RegExp("^["+i+"]["+i+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function s(t,e){const i=[];let n=e.exec(t);for(;n;){const s=[];s.startIndex=e.lastIndex-n[0].length;const r=n.length;for(let t=0;t"!==t[r]&&" "!==t[r]&&"\t"!==t[r]&&"\n"!==t[r]&&"\r"!==t[r];r++)u+=t[r];if(u=u.trim(),"/"===u[u.length-1]&&(u=u.substring(0,u.length-1),r--),!b(u)){let e;return e=0===u.trim().length?"Invalid space after '<'.":"Tag '"+u+"' is an invalid name.",x("InvalidTag",e,E(t,r))}const c=d(t,r);if(!1===c)return x("InvalidAttr","Attributes for '"+u+"' have open quote.",E(t,r));let f=c.value;if(r=c.index,"/"===f[f.length-1]){const i=r-f.length;f=f.substring(0,f.length-1);const s=g(f,e);if(!0!==s)return x(s.err.code,s.err.msg,E(t,i+s.err.line));n=!0}else if(a){if(!c.tagClosed)return x("InvalidTag","Closing tag '"+u+"' doesn't have proper closing.",E(t,r));if(f.trim().length>0)return x("InvalidTag","Closing tag '"+u+"' can't have attributes or invalid starting.",E(t,o));if(0===i.length)return x("InvalidTag","Closing tag '"+u+"' has not been opened.",E(t,o));{const e=i.pop();if(u!==e.tagName){let i=E(t,e.tagStartPos);return x("InvalidTag","Expected closing tag '"+e.tagName+"' (opened in line "+i.line+", col "+i.col+") instead of closing tag '"+u+"'.",E(t,o))}0==i.length&&(s=!0)}}else{const a=g(f,e);if(!0!==a)return x(a.err.code,a.err.msg,E(t,r-f.length+a.err.line));if(!0===s)return x("InvalidXml","Multiple possible root nodes found.",E(t,r));-1!==e.unpairedTags.indexOf(u)||i.push({tagName:u,tagStartPos:o}),n=!0}for(r++;r0)||x("InvalidXml","Invalid '"+JSON.stringify(i.map(t=>t.tagName),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):x("InvalidXml","Start tag expected.",1)}function h(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function l(t,e){const i=e;for(;e5&&"xml"===n)return x("InvalidXml","XML declaration allowed only at the start of the document.",E(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}continue}return e}function p(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){let i=1;for(e+=8;e"===t[e]&&(i--,0===i))break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}const u='"',c="'";function d(t,e){let i="",n="",s=!1;for(;e"===t[e]&&""===n){s=!0;break}i+=t[e]}return""===n&&{value:i,index:e,tagClosed:s}}const f=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function g(t,e){const i=s(t,f),n={};for(let t=0;t!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,i){return t},captureMetaData:!1,maxNestedTags:100,strictReservedNames:!0,jPath:!0};function v(t){return"boolean"==typeof t?{enabled:t,maxEntitySize:1e4,maxExpansionDepth:10,maxTotalExpansions:1e3,maxExpandedLength:1e5,maxEntityCount:100,allowedTags:null,tagFilter:null}:"object"==typeof t&&null!==t?{enabled:!1!==t.enabled,maxEntitySize:t.maxEntitySize??1e4,maxExpansionDepth:t.maxExpansionDepth??10,maxTotalExpansions:t.maxTotalExpansions??1e3,maxExpandedLength:t.maxExpandedLength??1e5,maxEntityCount:t.maxEntityCount??100,allowedTags:t.allowedTags??null,tagFilter:t.tagFilter??null}:v(!0)}const T=function(t){const e=Object.assign({},w,t);return e.processEntities=v(e.processEntities),e.stopNodes&&Array.isArray(e.stopNodes)&&(e.stopNodes=e.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),e};let P;P="function"!=typeof Symbol?"@@xmlMetadata":Symbol("XML Node Metadata");class S{constructor(t){this.tagname=t,this.child=[],this[":@"]=Object.create(null)}add(t,e){"__proto__"===t&&(t="#__proto__"),this.child.push({[t]:e})}addChild(t,e){"__proto__"===t.tagname&&(t.tagname="#__proto__"),t[":@"]&&Object.keys(t[":@"]).length>0?this.child.push({[t.tagname]:t.child,":@":t[":@"]}):this.child.push({[t.tagname]:t.child}),void 0!==e&&(this.child[this.child.length-1][P]={startIndex:e})}static getMetaDataSymbol(){return P}}class A{constructor(t){this.suppressValidationErr=!t,this.options=t}readDocType(t,e){const i=Object.create(null);let n=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");{e+=9;let s=1,r=!1,o=!1,a="";for(;e"===t[e]){if(o?"-"===t[e-1]&&"-"===t[e-2]&&(o=!1,s--):s--,0===s)break}else"["===t[e]?r=!0:a+=t[e];else{if(r&&C(t,"!ENTITY",e)){let s,r;if(e+=7,[s,r,e]=this.readEntityExp(t,e+1,this.suppressValidationErr),-1===r.indexOf("&")){if(!1!==this.options.enabled&&this.options.maxEntityCount&&n>=this.options.maxEntityCount)throw new Error(`Entity count (${n+1}) exceeds maximum allowed (${this.options.maxEntityCount})`);const t=s.replace(/[.\-+*:]/g,"\\.");i[s]={regx:RegExp(`&${t};`,"g"),val:r},n++}}else if(r&&C(t,"!ELEMENT",e)){e+=8;const{index:i}=this.readElementExp(t,e+1);e=i}else if(r&&C(t,"!ATTLIST",e))e+=8;else if(r&&C(t,"!NOTATION",e)){e+=9;const{index:i}=this.readNotationExp(t,e+1,this.suppressValidationErr);e=i}else{if(!C(t,"!--",e))throw new Error("Invalid DOCTYPE");o=!0}s++,a=""}if(0!==s)throw new Error("Unclosed DOCTYPE")}return{entities:i,i:e}}readEntityExp(t,e){e=O(t,e);let i="";for(;ethis.options.maxEntitySize)throw new Error(`Entity "${i}" size (${n.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`);return[i,n,--e]}readNotationExp(t,e){e=O(t,e);let i="";for(;e{for(;e"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let i=0,n="";for(;i0&&(this.path[this.path.length-1].values=void 0);const n=this.path.length;this.siblingStacks[n]||(this.siblingStacks[n]=new Map);const s=this.siblingStacks[n],r=i?`${i}:${t}`:t,o=s.get(r)||0;let a=0;for(const t of s.values())a+=t;s.set(r,o+1);const h={tag:t,position:a,counter:o};null!=i&&(h.namespace=i),null!=e&&(h.values=e),this.path.push(h)}pop(){if(0===this.path.length)return;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0===this.path.length)return;const e=this.path[this.path.length-1];return e.values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const i=t||this.separator;return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(i)}toArray(){return this.path.map(t=>t.tag)}reset(){this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const n=t[i];if("deep-wildcard"===n.type){if(i--,i<0)return!0;const n=t[i];let s=!1;for(let t=e;t>=0;t--){const r=t===this.path.length-1;if(this._matchSegment(n,this.path[t],r)){e=t-1,i--,s=!0;break}}if(!s)return!1}else{const t=e===this.path.length-1;if(!this._matchSegment(n,this.path[e],t))return!1;e--,i--}}return i<0}_matchSegment(t,e,i){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!i)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue){const i=e.values[t.attrName];if(String(i)!==String(t.attrValue))return!1}}if(void 0!==t.position){if(!i)return!1;const n=e.counter??0;if("first"===t.position&&0!==n)return!1;if("odd"===t.position&&n%2!=1)return!1;if("even"===t.position&&n%2!=0)return!1;if("nth"===t.position&&n!==t.positionValue)return!1}return!0}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}}function F(t,e){if(!t)return{};const i=e.attributesGroupName?t[e.attributesGroupName]:t;if(!i)return{};const n={};for(const t in i)t.startsWith(e.attributeNamePrefix)?n[t.substring(e.attributeNamePrefix.length)]=i[t]:n[t]=i[t];return n}function M(t){if(!t||"string"!=typeof t)return;const e=t.indexOf(":");if(-1!==e&&e>0){const i=t.substring(0,e);if("xmlns"!==i)return i}}class L{constructor(t){var e;if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/&#([0-9]{1,7});/g,val:(t,e)=>tt(e,10,"&#")},num_hex:{regex:/&#x([0-9a-fA-F]{1,6});/g,val:(t,e)=>tt(e,16,"&#x")}},this.addExternalEntities=R,this.parseXml=Y,this.parseTextData=G,this.resolveNameSpace=B,this.buildAttributesMap=W,this.isItStopNode=Z,this.replaceEntitiesValue=z,this.readStopNodeData=J,this.saveTextToParentTag=q,this.addChild=X,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?t=>{for(const i of e){if("string"==typeof i&&t===i)return!0;if(i instanceof RegExp&&i.test(t))return!0}}:()=>!1,this.entityExpansionCount=0,this.currentExpandedLength=0,this.matcher=new k,this.isCurrentNodeStopNode=!1,this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodeExpressions=[];for(let t=0;t0)){o||(t=this.replaceEntitiesValue(t,e,i));const n=this.options.jPath?i.toString():i,a=this.options.tagValueProcessor(e,t,n,s,r);return null==a?t:typeof a!=typeof t||a!==t?a:this.options.trimValues||t.trim()===t?H(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function B(t){if(this.options.removeNSPrefix){const e=t.split(":"),i="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=i+e[1])}return t}const U=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function W(t,e,i){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){const n=s(t,U),r=n.length,o={},a={};for(let t=0;t0&&"object"==typeof e&&e.updateCurrent&&e.updateCurrent(a);for(let t=0;t",r,"Closing Tag is not closed.");let s=t.substring(r+2,e).trim();if(this.options.removeNSPrefix){const t=s.indexOf(":");-1!==t&&(s=s.substr(t+1))}this.options.transformTagName&&(s=this.options.transformTagName(s)),i&&(n=this.saveTextToParentTag(n,i,this.matcher));const o=this.matcher.getCurrentTag();if(s&&-1!==this.options.unpairedTags.indexOf(s))throw new Error(`Unpaired tag can not be used as closing tag: `);o&&-1!==this.options.unpairedTags.indexOf(o)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,i=this.tagsNodeStack.pop(),n="",r=e}else if("?"===t[r+1]){let e=Q(t,r,!1,"?>");if(!e)throw new Error("Pi Tag is not closed.");if(n=this.saveTextToParentTag(n,i,this.matcher),this.options.ignoreDeclaration&&"?xml"===e.tagName||this.options.ignorePiTags);else{const t=new S(e.tagName);t.add(this.options.textNodeName,""),e.tagName!==e.tagExp&&e.attrExpPresent&&(t[":@"]=this.buildAttributesMap(e.tagExp,this.matcher,e.tagName)),this.addChild(i,t,this.matcher,r)}r=e.closeIndex+1}else if("!--"===t.substr(r+1,3)){const e=K(t,"--\x3e",r+4,"Comment is not closed.");if(this.options.commentPropName){const s=t.substring(r+4,e-2);n=this.saveTextToParentTag(n,i,this.matcher),i.add(this.options.commentPropName,[{[this.options.textNodeName]:s}])}r=e}else if("!D"===t.substr(r+1,2)){const e=s.readDocType(t,r);this.docTypeEntities=e.entities,r=e.i}else if("!["===t.substr(r+1,2)){const e=K(t,"]]>",r,"CDATA is not closed.")-2,s=t.substring(r+9,e);n=this.saveTextToParentTag(n,i,this.matcher);let o=this.parseTextData(s,i.tagname,this.matcher,!0,!1,!0,!0);null==o&&(o=""),this.options.cdataPropName?i.add(this.options.cdataPropName,[{[this.options.textNodeName]:s}]):i.add(this.options.textNodeName,o),r=e+2}else{let s=Q(t,r,this.options.removeNSPrefix);if(!s){const e=t.substring(Math.max(0,r-50),Math.min(t.length,r+50));throw new Error(`readTagExp returned undefined at position ${r}. Context: "${e}"`)}let o=s.tagName;const a=s.rawTagName;let h=s.tagExp,l=s.attrExpPresent,p=s.closeIndex;if(this.options.transformTagName){const t=this.options.transformTagName(o);h===o&&(h=t),o=t}if(this.options.strictReservedNames&&(o===this.options.commentPropName||o===this.options.cdataPropName))throw new Error(`Invalid tag name: ${o}`);i&&n&&"!xml"!==i.tagname&&(n=this.saveTextToParentTag(n,i,this.matcher,!1));const u=i;u&&-1!==this.options.unpairedTags.indexOf(u.tagname)&&(i=this.tagsNodeStack.pop(),this.matcher.pop());let c=!1;h.length>0&&h.lastIndexOf("/")===h.length-1&&(c=!0,"/"===o[o.length-1]?(o=o.substr(0,o.length-1),h=o):h=h.substr(0,h.length-1),l=o!==h);let d,f=null,g={};d=M(a),o!==e.tagname&&this.matcher.push(o,{},d),o!==h&&l&&(f=this.buildAttributesMap(h,this.matcher,o),f&&(g=F(f,this.options))),o!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode(this.stopNodeExpressions,this.matcher));const m=r;if(this.isCurrentNodeStopNode){let e="";if(c)r=s.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(o))r=s.closeIndex;else{const i=this.readStopNodeData(t,a,p+1);if(!i)throw new Error(`Unexpected end of ${a}`);r=i.i,e=i.tagContent}const n=new S(o);f&&(n[":@"]=f),n.add(this.options.textNodeName,e),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(i,n,this.matcher,m)}else{if(c){if(this.options.transformTagName){const t=this.options.transformTagName(o);h===o&&(h=t),o=t}const t=new S(o);f&&(t[":@"]=f),this.addChild(i,t,this.matcher,m),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(-1!==this.options.unpairedTags.indexOf(o)){const t=new S(o);f&&(t[":@"]=f),this.addChild(i,t,this.matcher,m),this.matcher.pop(),this.isCurrentNodeStopNode=!1,r=s.closeIndex;continue}{const t=new S(o);if(this.tagsNodeStack.length>this.options.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(i),f&&(t[":@"]=f),this.addChild(i,t,this.matcher,m),i=t}}n="",r=p}}else n+=t[r];return e.child};function X(t,e,i,n){this.options.captureMetaData||(n=void 0);const s=this.options.jPath?i.toString():i,r=this.options.updateTag(e.tagname,s,e[":@"]);!1===r||("string"==typeof r?(e.tagname=r,t.addChild(e,n)):t.addChild(e,n))}function z(t,e,i){const n=this.options.processEntities;if(!n||!n.enabled)return t;if(n.allowedTags){const s=this.options.jPath?i.toString():i;if(!(Array.isArray(n.allowedTags)?n.allowedTags.includes(e):n.allowedTags(e,s)))return t}if(n.tagFilter){const s=this.options.jPath?i.toString():i;if(!n.tagFilter(e,s))return t}for(let e in this.docTypeEntities){const i=this.docTypeEntities[e],s=t.match(i.regx);if(s){if(this.entityExpansionCount+=s.length,n.maxTotalExpansions&&this.entityExpansionCount>n.maxTotalExpansions)throw new Error(`Entity expansion limit exceeded: ${this.entityExpansionCount} > ${n.maxTotalExpansions}`);const e=t.length;if(t=t.replace(i.regx,i.val),n.maxExpandedLength&&(this.currentExpandedLength+=t.length-e,this.currentExpandedLength>n.maxExpandedLength))throw new Error(`Total expanded content size exceeded: ${this.currentExpandedLength} > ${n.maxExpandedLength}`)}}if(-1===t.indexOf("&"))return t;for(let e in this.lastEntities){const i=this.lastEntities[e];t=t.replace(i.regex,i.val)}if(-1===t.indexOf("&"))return t;if(this.options.htmlEntities)for(let e in this.htmlEntities){const i=this.htmlEntities[e];t=t.replace(i.regex,i.val)}return t.replace(this.ampEntity.regex,this.ampEntity.val)}function q(t,e,i,n){return t&&(void 0===n&&(n=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,i,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,n))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function Z(t,e){if(!t||0===t.length)return!1;for(let i=0;i"){let n,s="";for(let r=e;r",i,`${e} is not closed`);if(t.substring(i+2,r).trim()===e&&(s--,0===s))return{tagContent:t.substring(n,i),i:r};i=r}else if("?"===t[i+1])i=K(t,"?>",i+1,"StopNode is not closed.");else if("!--"===t.substr(i+1,3))i=K(t,"--\x3e",i+3,"StopNode is not closed.");else if("!["===t.substr(i+1,2))i=K(t,"]]>",i,"StopNode is not closed.")-2;else{const n=Q(t,i,">");n&&((n&&n.tagName)===e&&"/"!==n.tagExp[n.tagExp.length-1]&&s++,i=n.closeIndex)}}function H(t,e,i){if(e&&"string"==typeof t){const e=t.trim();return"true"===e||"false"!==e&&function(t,e={}){if(e=Object.assign({},V,e),!t||"string"!=typeof t)return t;let i=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(i))return t;if("0"===t)return 0;if(e.hex&&$.test(i))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(i);if(i.includes("e")||i.includes("E"))return function(t,e,i){if(!i.eNotation)return t;const n=e.match(D);if(n){let s=n[1]||"";const r=-1===n[3].indexOf("e")?"E":"e",o=n[2],a=s?t[o.length+1]===r:t[o.length]===r;return o.length>1&&a?t:1!==o.length||!n[3].startsWith(`.${r}`)&&n[3][0]!==r?i.leadingZeros&&!a?(e=(n[1]||"")+n[3],Number(e)):t:Number(e)}return t}(t,i,e);{const s=j.exec(i);if(s){const r=s[1]||"",o=s[2];let a=(n=s[3])&&-1!==n.indexOf(".")?("."===(n=n.replace(/0+$/,""))?n="0":"."===n[0]?n="0"+n:"."===n[n.length-1]&&(n=n.substring(0,n.length-1)),n):n;const h=r?"."===t[o.length+1]:"."===t[o.length];if(!e.leadingZeros&&(o.length>1||1===o.length&&!h))return t;{const n=Number(i),s=String(n);if(0===n)return n;if(-1!==s.search(/[eE]/))return e.eNotation?n:t;if(-1!==i.indexOf("."))return"0"===s||s===a||s===`${r}${a}`?n:t;let h=o?a:i;return o?h===s||r+h===s?n:t:h===s||h===r+s?n:t}}return t}var n}(t,i)}return void 0!==t?t:""}function tt(t,e,i){const n=Number.parseInt(t,e);return n>=0&&n<=1114111?String.fromCodePoint(n):i+t+";"}const et=S.getMetaDataSymbol();function it(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;const i={};for(const n in t)n.startsWith(e)?i[n.substring(e.length)]=t[n]:i[n]=t[n];return i}function nt(t,e,i){return st(t,e,i)}function st(t,e,i){let n;const s={};for(let r=0;r0&&(s[e.textNodeName]=n):void 0!==n&&(s[e.textNodeName]=n),s}function rt(t){const e=Object.keys(t);for(let t=0;t0&&(i="\n");const n=[];if(e.stopNodes&&Array.isArray(e.stopNodes))for(let t=0;t`,o=!1,n.pop();continue}if(l===e.commentPropName){r+=i+`\x3c!--${h[l][0][e.textNodeName]}--\x3e`,o=!0,n.pop();continue}if("?"===l[0]){const t=gt(h[":@"],e,u),s="?xml"===l?"":i;let a=h[l][0][e.textNodeName];a=0!==a.length?" "+a:"",r+=s+`<${l}${a}${t}?>`,o=!0,n.pop();continue}let c=i;""!==c&&(c+=e.indentBy);const d=i+`<${l}${gt(h[":@"],e,u)}`;let f;f=u?ct(h[l],e):pt(h[l],e,c,n,s),-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?r+=d+">":r+=d+"/>":f&&0!==f.length||!e.suppressEmptyNode?f&&f.endsWith(">")?r+=d+`>${f}${i}`:(r+=d+">",f&&""!==i&&(f.includes("/>")||f.includes("`):r+=d+"/>",o=!0,n.pop()}return r}function ut(t,e){if(!t||e.ignoreAttributes)return null;const i={};let n=!1;for(let s in t)Object.prototype.hasOwnProperty.call(t,s)&&(i[s.startsWith(e.attributeNamePrefix)?s.substr(e.attributeNamePrefix.length):s]=t[s],n=!0);return n?i:null}function ct(t,e){if(!Array.isArray(t))return null!=t?t.toString():"";let i="";for(let n=0;n${n}`:i+=`<${r}${t}/>`}}}return i}function dt(t,e){let i="";if(t&&!e.ignoreAttributes)for(let n in t){if(!Object.prototype.hasOwnProperty.call(t,n))continue;let s=t[n];!0===s&&e.suppressBooleanAttributes?i+=` ${n.substr(e.attributeNamePrefix.length)}`:i+=` ${n.substr(e.attributeNamePrefix.length)}="${s}"`}return i}function ft(t){const e=Object.keys(t);for(let i=0;i0&&e.processEntities)for(let i=0;i","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1,jPath:!0};function bt(t){if(this.options=Object.assign({},Nt,t),this.options.stopNodes&&Array.isArray(this.options.stopNodes)&&(this.options.stopNodes=this.options.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),this.stopNodeExpressions=[],this.options.stopNodes&&Array.isArray(this.options.stopNodes))for(let t=0;t{for(const i of e){if("string"==typeof i&&t===i)return!0;if(i instanceof RegExp&&i.test(t))return!0}}:()=>!1,this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=wt),this.processTextOrObjNode=Et,this.options.format?(this.indentate=yt,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function Et(t,e,i,n){const s=this.extractAttributes(t);if(n.push(e,s),this.checkStopNode(n)){const s=this.buildRawContent(t),r=this.buildAttributesForStopNode(t);return n.pop(),this.buildObjectNode(s,e,r,i)}const r=this.j2x(t,i+1,n);return n.pop(),void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,r.attrStr,i,n):this.buildObjectNode(r.val,e,r.attrStr,i)}function yt(t){return this.options.indentBy.repeat(t)}function wt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}bt.prototype.build=function(t){if(this.options.preserveOrder)return lt(t,this.options);{Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t});const e=new k;return this.j2x(t,0,e).val}},bt.prototype.j2x=function(t,e,i){let n="",s="";const r=this.options.jPath?i.toString():i,o=this.checkStopNode(i);for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a))if(void 0===t[a])this.isAttribute(a)&&(s+="");else if(null===t[a])this.isAttribute(a)||a===this.options.cdataPropName?s+="":"?"===a[0]?s+=this.indentate(e)+"<"+a+"?"+this.tagEndChar:s+=this.indentate(e)+"<"+a+"/"+this.tagEndChar;else if(t[a]instanceof Date)s+=this.buildTextValNode(t[a],a,"",e,i);else if("object"!=typeof t[a]){const h=this.isAttribute(a);if(h&&!this.ignoreAttributesFn(h,r))n+=this.buildAttrPairStr(h,""+t[a],o);else if(!h)if(a===this.options.textNodeName){let e=this.options.tagValueProcessor(a,""+t[a]);s+=this.replaceEntitiesValue(e)}else{i.push(a);const n=this.checkStopNode(i);if(i.pop(),n){const i=""+t[a];s+=""===i?this.indentate(e)+"<"+a+this.closeTag(a)+this.tagEndChar:this.indentate(e)+"<"+a+">"+i+""+t+"${t}`;else if("object"==typeof t&&null!==t){const n=this.buildRawContent(t),s=this.buildAttributesForStopNode(t);e+=""===n?`<${i}${s}/>`:`<${i}${s}>${n}`}}else if("object"==typeof n&&null!==n){const t=this.buildRawContent(n),s=this.buildAttributesForStopNode(n);e+=""===t?`<${i}${s}/>`:`<${i}${s}>${t}`}else e+=`<${i}>${n}`}return e},bt.prototype.buildAttributesForStopNode=function(t){if(!t||"object"!=typeof t)return"";let e="";if(this.options.attributesGroupName&&t[this.options.attributesGroupName]){const i=t[this.options.attributesGroupName];for(let t in i){if(!Object.prototype.hasOwnProperty.call(i,t))continue;const n=t.startsWith(this.options.attributeNamePrefix)?t.substring(this.options.attributeNamePrefix.length):t,s=i[t];!0===s&&this.options.suppressBooleanAttributes?e+=" "+n:e+=" "+n+'="'+s+'"'}}else for(let i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;const n=this.isAttribute(i);if(n){const s=t[i];!0===s&&this.options.suppressBooleanAttributes?e+=" "+n:e+=" "+n+'="'+s+'"'}}return e},bt.prototype.buildObjectNode=function(t,e,i,n){if(""===t)return"?"===e[0]?this.indentate(n)+"<"+e+i+"?"+this.tagEndChar:this.indentate(n)+"<"+e+i+this.closeTag(e)+this.tagEndChar;{let s=""+t+s}},bt.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>`+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(n)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(n)+"<"+e+i+"?"+this.tagEndChar;{let s=this.options.tagValueProcessor(e,t);return s=this.replaceEntitiesValue(s),""===s?this.indentate(n)+"<"+e+i+this.closeTag(e)+this.tagEndChar:this.indentate(n)+"<"+e+i+">"+s+"0&&this.options.processEntities)for(let e=0;e{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>vt,XMLParser:()=>ht,XMLValidator:()=>Tt});const i=":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",n=new RegExp("^["+i+"]["+i+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function s(t,e){const i=[];let n=e.exec(t);for(;n;){const s=[];s.startIndex=e.lastIndex-n[0].length;const r=n.length;for(let t=0;t"!==t[r]&&" "!==t[r]&&"\t"!==t[r]&&"\n"!==t[r]&&"\r"!==t[r];r++)u+=t[r];if(u=u.trim(),"/"===u[u.length-1]&&(u=u.substring(0,u.length-1),r--),!b(u)){let e;return e=0===u.trim().length?"Invalid space after '<'.":"Tag '"+u+"' is an invalid name.",x("InvalidTag",e,E(t,r))}const c=d(t,r);if(!1===c)return x("InvalidAttr","Attributes for '"+u+"' have open quote.",E(t,r));let f=c.value;if(r=c.index,"/"===f[f.length-1]){const i=r-f.length;f=f.substring(0,f.length-1);const s=g(f,e);if(!0!==s)return x(s.err.code,s.err.msg,E(t,i+s.err.line));n=!0}else if(a){if(!c.tagClosed)return x("InvalidTag","Closing tag '"+u+"' doesn't have proper closing.",E(t,r));if(f.trim().length>0)return x("InvalidTag","Closing tag '"+u+"' can't have attributes or invalid starting.",E(t,o));if(0===i.length)return x("InvalidTag","Closing tag '"+u+"' has not been opened.",E(t,o));{const e=i.pop();if(u!==e.tagName){let i=E(t,e.tagStartPos);return x("InvalidTag","Expected closing tag '"+e.tagName+"' (opened in line "+i.line+", col "+i.col+") instead of closing tag '"+u+"'.",E(t,o))}0==i.length&&(s=!0)}}else{const a=g(f,e);if(!0!==a)return x(a.err.code,a.err.msg,E(t,r-f.length+a.err.line));if(!0===s)return x("InvalidXml","Multiple possible root nodes found.",E(t,r));-1!==e.unpairedTags.indexOf(u)||i.push({tagName:u,tagStartPos:o}),n=!0}for(r++;r0)||x("InvalidXml","Invalid '"+JSON.stringify(i.map(t=>t.tagName),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):x("InvalidXml","Start tag expected.",1)}function h(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function l(t,e){const i=e;for(;e5&&"xml"===n)return x("InvalidXml","XML declaration allowed only at the start of the document.",E(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}continue}return e}function p(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){let i=1;for(e+=8;e"===t[e]&&(i--,0===i))break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}const u='"',c="'";function d(t,e){let i="",n="",s=!1;for(;e"===t[e]&&""===n){s=!0;break}i+=t[e]}return""===n&&{value:i,index:e,tagClosed:s}}const f=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function g(t,e){const i=s(t,f),n={};for(let t=0;t!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,i){return t},captureMetaData:!1,maxNestedTags:100,strictReservedNames:!0,jPath:!0};function v(t){return"boolean"==typeof t?{enabled:t,maxEntitySize:1e4,maxExpansionDepth:10,maxTotalExpansions:1e3,maxExpandedLength:1e5,maxEntityCount:100,allowedTags:null,tagFilter:null}:"object"==typeof t&&null!==t?{enabled:!1!==t.enabled,maxEntitySize:t.maxEntitySize??1e4,maxExpansionDepth:t.maxExpansionDepth??10,maxTotalExpansions:t.maxTotalExpansions??1e3,maxExpandedLength:t.maxExpandedLength??1e5,maxEntityCount:t.maxEntityCount??100,allowedTags:t.allowedTags??null,tagFilter:t.tagFilter??null}:v(!0)}const T=function(t){const e=Object.assign({},w,t);return e.processEntities=v(e.processEntities),e.stopNodes&&Array.isArray(e.stopNodes)&&(e.stopNodes=e.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),e};let P;P="function"!=typeof Symbol?"@@xmlMetadata":Symbol("XML Node Metadata");class S{constructor(t){this.tagname=t,this.child=[],this[":@"]=Object.create(null)}add(t,e){"__proto__"===t&&(t="#__proto__"),this.child.push({[t]:e})}addChild(t,e){"__proto__"===t.tagname&&(t.tagname="#__proto__"),t[":@"]&&Object.keys(t[":@"]).length>0?this.child.push({[t.tagname]:t.child,":@":t[":@"]}):this.child.push({[t.tagname]:t.child}),void 0!==e&&(this.child[this.child.length-1][P]={startIndex:e})}static getMetaDataSymbol(){return P}}class A{constructor(t){this.suppressValidationErr=!t,this.options=t}readDocType(t,e){const i=Object.create(null);let n=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");{e+=9;let s=1,r=!1,o=!1,a="";for(;e"===t[e]){if(o?"-"===t[e-1]&&"-"===t[e-2]&&(o=!1,s--):s--,0===s)break}else"["===t[e]?r=!0:a+=t[e];else{if(r&&C(t,"!ENTITY",e)){let s,r;if(e+=7,[s,r,e]=this.readEntityExp(t,e+1,this.suppressValidationErr),-1===r.indexOf("&")){if(!1!==this.options.enabled&&this.options.maxEntityCount&&n>=this.options.maxEntityCount)throw new Error(`Entity count (${n+1}) exceeds maximum allowed (${this.options.maxEntityCount})`);const t=s.replace(/[.\-+*:]/g,"\\.");i[s]={regx:RegExp(`&${t};`,"g"),val:r},n++}}else if(r&&C(t,"!ELEMENT",e)){e+=8;const{index:i}=this.readElementExp(t,e+1);e=i}else if(r&&C(t,"!ATTLIST",e))e+=8;else if(r&&C(t,"!NOTATION",e)){e+=9;const{index:i}=this.readNotationExp(t,e+1,this.suppressValidationErr);e=i}else{if(!C(t,"!--",e))throw new Error("Invalid DOCTYPE");o=!0}s++,a=""}if(0!==s)throw new Error("Unclosed DOCTYPE")}return{entities:i,i:e}}readEntityExp(t,e){e=O(t,e);let i="";for(;ethis.options.maxEntitySize)throw new Error(`Entity "${i}" size (${n.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`);return[i,n,--e]}readNotationExp(t,e){e=O(t,e);let i="";for(;e{for(;e0&&(this.path[this.path.length-1].values=void 0);const n=this.path.length;this.siblingStacks[n]||(this.siblingStacks[n]=new Map);const s=this.siblingStacks[n],r=i?`${i}:${t}`:t,o=s.get(r)||0;let a=0;for(const t of s.values())a+=t;s.set(r,o+1);const h={tag:t,position:a,counter:o};null!=i&&(h.namespace=i),null!=e&&(h.values=e),this.path.push(h)}pop(){if(0===this.path.length)return;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0===this.path.length)return;const e=this.path[this.path.length-1];return e.values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const i=t||this.separator;return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(i)}toArray(){return this.path.map(t=>t.tag)}reset(){this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const n=t[i];if("deep-wildcard"===n.type){if(i--,i<0)return!0;const n=t[i];let s=!1;for(let t=e;t>=0;t--){const r=t===this.path.length-1;if(this._matchSegment(n,this.path[t],r)){e=t-1,i--,s=!0;break}}if(!s)return!1}else{const t=e===this.path.length-1;if(!this._matchSegment(n,this.path[e],t))return!1;e--,i--}}return i<0}_matchSegment(t,e,i){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!i)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue){const i=e.values[t.attrName];if(String(i)!==String(t.attrValue))return!1}}if(void 0!==t.position){if(!i)return!1;const n=e.counter??0;if("first"===t.position&&0!==n)return!1;if("odd"===t.position&&n%2!=1)return!1;if("even"===t.position&&n%2!=0)return!1;if("nth"===t.position&&n!==t.positionValue)return!1}return!0}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}}class k{constructor(t,e={}){this.pattern=t,this.separator=e.separator||".",this.segments=this._parse(t),this._hasDeepWildcard=this.segments.some(t=>"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let i=0,n="";for(;i0){const i=t.substring(0,e);if("xmlns"!==i)return i}}class L{constructor(t){var e;if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/&#([0-9]{1,7});/g,val:(t,e)=>tt(e,10,"&#")},num_hex:{regex:/&#x([0-9a-fA-F]{1,6});/g,val:(t,e)=>tt(e,16,"&#x")}},this.addExternalEntities=R,this.parseXml=Y,this.parseTextData=G,this.resolveNameSpace=B,this.buildAttributesMap=W,this.isItStopNode=Z,this.replaceEntitiesValue=z,this.readStopNodeData=J,this.saveTextToParentTag=q,this.addChild=X,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?t=>{for(const i of e){if("string"==typeof i&&t===i)return!0;if(i instanceof RegExp&&i.test(t))return!0}}:()=>!1,this.entityExpansionCount=0,this.currentExpandedLength=0,this.matcher=new _,this.isCurrentNodeStopNode=!1,this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodeExpressions=[];for(let t=0;t0)){o||(t=this.replaceEntitiesValue(t,e,i));const n=this.options.jPath?i.toString():i,a=this.options.tagValueProcessor(e,t,n,s,r);return null==a?t:typeof a!=typeof t||a!==t?a:this.options.trimValues||t.trim()===t?H(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function B(t){if(this.options.removeNSPrefix){const e=t.split(":"),i="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=i+e[1])}return t}const U=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function W(t,e,i){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){const n=s(t,U),r=n.length,o={},a={};for(let t=0;t0&&"object"==typeof e&&e.updateCurrent&&e.updateCurrent(a);for(let t=0;t",r,"Closing Tag is not closed.");let s=t.substring(r+2,e).trim();if(this.options.removeNSPrefix){const t=s.indexOf(":");-1!==t&&(s=s.substr(t+1))}this.options.transformTagName&&(s=this.options.transformTagName(s)),i&&(n=this.saveTextToParentTag(n,i,this.matcher));const o=this.matcher.getCurrentTag();if(s&&-1!==this.options.unpairedTags.indexOf(s))throw new Error(`Unpaired tag can not be used as closing tag: `);o&&-1!==this.options.unpairedTags.indexOf(o)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,i=this.tagsNodeStack.pop(),n="",r=e}else if("?"===t[r+1]){let e=Q(t,r,!1,"?>");if(!e)throw new Error("Pi Tag is not closed.");if(n=this.saveTextToParentTag(n,i,this.matcher),this.options.ignoreDeclaration&&"?xml"===e.tagName||this.options.ignorePiTags);else{const t=new S(e.tagName);t.add(this.options.textNodeName,""),e.tagName!==e.tagExp&&e.attrExpPresent&&(t[":@"]=this.buildAttributesMap(e.tagExp,this.matcher,e.tagName)),this.addChild(i,t,this.matcher,r)}r=e.closeIndex+1}else if("!--"===t.substr(r+1,3)){const e=K(t,"--\x3e",r+4,"Comment is not closed.");if(this.options.commentPropName){const s=t.substring(r+4,e-2);n=this.saveTextToParentTag(n,i,this.matcher),i.add(this.options.commentPropName,[{[this.options.textNodeName]:s}])}r=e}else if("!D"===t.substr(r+1,2)){const e=s.readDocType(t,r);this.docTypeEntities=e.entities,r=e.i}else if("!["===t.substr(r+1,2)){const e=K(t,"]]>",r,"CDATA is not closed.")-2,s=t.substring(r+9,e);n=this.saveTextToParentTag(n,i,this.matcher);let o=this.parseTextData(s,i.tagname,this.matcher,!0,!1,!0,!0);null==o&&(o=""),this.options.cdataPropName?i.add(this.options.cdataPropName,[{[this.options.textNodeName]:s}]):i.add(this.options.textNodeName,o),r=e+2}else{let s=Q(t,r,this.options.removeNSPrefix);if(!s){const e=t.substring(Math.max(0,r-50),Math.min(t.length,r+50));throw new Error(`readTagExp returned undefined at position ${r}. Context: "${e}"`)}let o=s.tagName;const a=s.rawTagName;let h=s.tagExp,l=s.attrExpPresent,p=s.closeIndex;if(this.options.transformTagName){const t=this.options.transformTagName(o);h===o&&(h=t),o=t}if(this.options.strictReservedNames&&(o===this.options.commentPropName||o===this.options.cdataPropName))throw new Error(`Invalid tag name: ${o}`);i&&n&&"!xml"!==i.tagname&&(n=this.saveTextToParentTag(n,i,this.matcher,!1));const u=i;u&&-1!==this.options.unpairedTags.indexOf(u.tagname)&&(i=this.tagsNodeStack.pop(),this.matcher.pop());let c=!1;h.length>0&&h.lastIndexOf("/")===h.length-1&&(c=!0,"/"===o[o.length-1]?(o=o.substr(0,o.length-1),h=o):h=h.substr(0,h.length-1),l=o!==h);let d,f=null,g={};d=M(a),o!==e.tagname&&this.matcher.push(o,{},d),o!==h&&l&&(f=this.buildAttributesMap(h,this.matcher,o),f&&(g=F(f,this.options))),o!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode(this.stopNodeExpressions,this.matcher));const m=r;if(this.isCurrentNodeStopNode){let e="";if(c)r=s.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(o))r=s.closeIndex;else{const i=this.readStopNodeData(t,a,p+1);if(!i)throw new Error(`Unexpected end of ${a}`);r=i.i,e=i.tagContent}const n=new S(o);f&&(n[":@"]=f),n.add(this.options.textNodeName,e),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(i,n,this.matcher,m)}else{if(c){if(this.options.transformTagName){const t=this.options.transformTagName(o);h===o&&(h=t),o=t}const t=new S(o);f&&(t[":@"]=f),this.addChild(i,t,this.matcher,m),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(-1!==this.options.unpairedTags.indexOf(o)){const t=new S(o);f&&(t[":@"]=f),this.addChild(i,t,this.matcher,m),this.matcher.pop(),this.isCurrentNodeStopNode=!1,r=s.closeIndex;continue}{const t=new S(o);if(this.tagsNodeStack.length>this.options.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(i),f&&(t[":@"]=f),this.addChild(i,t,this.matcher,m),i=t}}n="",r=p}}else n+=t[r];return e.child};function X(t,e,i,n){this.options.captureMetaData||(n=void 0);const s=this.options.jPath?i.toString():i,r=this.options.updateTag(e.tagname,s,e[":@"]);!1===r||("string"==typeof r?(e.tagname=r,t.addChild(e,n)):t.addChild(e,n))}function z(t,e,i){const n=this.options.processEntities;if(!n||!n.enabled)return t;if(n.allowedTags){const s=this.options.jPath?i.toString():i;if(!(Array.isArray(n.allowedTags)?n.allowedTags.includes(e):n.allowedTags(e,s)))return t}if(n.tagFilter){const s=this.options.jPath?i.toString():i;if(!n.tagFilter(e,s))return t}for(let e in this.docTypeEntities){const i=this.docTypeEntities[e],s=t.match(i.regx);if(s){if(this.entityExpansionCount+=s.length,n.maxTotalExpansions&&this.entityExpansionCount>n.maxTotalExpansions)throw new Error(`Entity expansion limit exceeded: ${this.entityExpansionCount} > ${n.maxTotalExpansions}`);const e=t.length;if(t=t.replace(i.regx,i.val),n.maxExpandedLength&&(this.currentExpandedLength+=t.length-e,this.currentExpandedLength>n.maxExpandedLength))throw new Error(`Total expanded content size exceeded: ${this.currentExpandedLength} > ${n.maxExpandedLength}`)}}if(-1===t.indexOf("&"))return t;for(let e in this.lastEntities){const i=this.lastEntities[e];t=t.replace(i.regex,i.val)}if(-1===t.indexOf("&"))return t;if(this.options.htmlEntities)for(let e in this.htmlEntities){const i=this.htmlEntities[e];t=t.replace(i.regex,i.val)}return t.replace(this.ampEntity.regex,this.ampEntity.val)}function q(t,e,i,n){return t&&(void 0===n&&(n=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,i,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,n))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function Z(t,e){if(!t||0===t.length)return!1;for(let i=0;i"){let n,s="";for(let r=e;r",i,`${e} is not closed`);if(t.substring(i+2,r).trim()===e&&(s--,0===s))return{tagContent:t.substring(n,i),i:r};i=r}else if("?"===t[i+1])i=K(t,"?>",i+1,"StopNode is not closed.");else if("!--"===t.substr(i+1,3))i=K(t,"--\x3e",i+3,"StopNode is not closed.");else if("!["===t.substr(i+1,2))i=K(t,"]]>",i,"StopNode is not closed.")-2;else{const n=Q(t,i,">");n&&((n&&n.tagName)===e&&"/"!==n.tagExp[n.tagExp.length-1]&&s++,i=n.closeIndex)}}function H(t,e,i){if(e&&"string"==typeof t){const e=t.trim();return"true"===e||"false"!==e&&function(t,e={}){if(e=Object.assign({},V,e),!t||"string"!=typeof t)return t;let i=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(i))return t;if("0"===t)return 0;if(e.hex&&$.test(i))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(i);if(i.includes("e")||i.includes("E"))return function(t,e,i){if(!i.eNotation)return t;const n=e.match(D);if(n){let s=n[1]||"";const r=-1===n[3].indexOf("e")?"E":"e",o=n[2],a=s?t[o.length+1]===r:t[o.length]===r;return o.length>1&&a?t:1!==o.length||!n[3].startsWith(`.${r}`)&&n[3][0]!==r?i.leadingZeros&&!a?(e=(n[1]||"")+n[3],Number(e)):t:Number(e)}return t}(t,i,e);{const s=j.exec(i);if(s){const r=s[1]||"",o=s[2];let a=(n=s[3])&&-1!==n.indexOf(".")?("."===(n=n.replace(/0+$/,""))?n="0":"."===n[0]?n="0"+n:"."===n[n.length-1]&&(n=n.substring(0,n.length-1)),n):n;const h=r?"."===t[o.length+1]:"."===t[o.length];if(!e.leadingZeros&&(o.length>1||1===o.length&&!h))return t;{const n=Number(i),s=String(n);if(0===n)return n;if(-1!==s.search(/[eE]/))return e.eNotation?n:t;if(-1!==i.indexOf("."))return"0"===s||s===a||s===`${r}${a}`?n:t;let h=o?a:i;return o?h===s||r+h===s?n:t:h===s||h===r+s?n:t}}return t}var n}(t,i)}return void 0!==t?t:""}function tt(t,e,i){const n=Number.parseInt(t,e);return n>=0&&n<=1114111?String.fromCodePoint(n):i+t+";"}const et=S.getMetaDataSymbol();function it(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;const i={};for(const n in t)n.startsWith(e)?i[n.substring(e.length)]=t[n]:i[n]=t[n];return i}function nt(t,e,i){return st(t,e,i)}function st(t,e,i){let n;const s={};for(let r=0;r0&&(s[e.textNodeName]=n):void 0!==n&&(s[e.textNodeName]=n),s}function rt(t){const e=Object.keys(t);for(let t=0;t0&&(i="\n");const n=[];if(e.stopNodes&&Array.isArray(e.stopNodes))for(let t=0;t`,o=!1,n.pop();continue}if(l===e.commentPropName){r+=i+`\x3c!--${h[l][0][e.textNodeName]}--\x3e`,o=!0,n.pop();continue}if("?"===l[0]){const t=gt(h[":@"],e,u),s="?xml"===l?"":i;let a=h[l][0][e.textNodeName];a=0!==a.length?" "+a:"",r+=s+`<${l}${a}${t}?>`,o=!0,n.pop();continue}let c=i;""!==c&&(c+=e.indentBy);const d=i+`<${l}${gt(h[":@"],e,u)}`;let f;f=u?ct(h[l],e):pt(h[l],e,c,n,s),-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?r+=d+">":r+=d+"/>":f&&0!==f.length||!e.suppressEmptyNode?f&&f.endsWith(">")?r+=d+`>${f}${i}`:(r+=d+">",f&&""!==i&&(f.includes("/>")||f.includes("`):r+=d+"/>",o=!0,n.pop()}return r}function ut(t,e){if(!t||e.ignoreAttributes)return null;const i={};let n=!1;for(let s in t)Object.prototype.hasOwnProperty.call(t,s)&&(i[s.startsWith(e.attributeNamePrefix)?s.substr(e.attributeNamePrefix.length):s]=t[s],n=!0);return n?i:null}function ct(t,e){if(!Array.isArray(t))return null!=t?t.toString():"";let i="";for(let n=0;n${n}`:i+=`<${r}${t}/>`}}}return i}function dt(t,e){let i="";if(t&&!e.ignoreAttributes)for(let n in t){if(!Object.prototype.hasOwnProperty.call(t,n))continue;let s=t[n];!0===s&&e.suppressBooleanAttributes?i+=` ${n.substr(e.attributeNamePrefix.length)}`:i+=` ${n.substr(e.attributeNamePrefix.length)}="${s}"`}return i}function ft(t){const e=Object.keys(t);for(let i=0;i0&&e.processEntities)for(let i=0;i","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1,jPath:!0};function bt(t){if(this.options=Object.assign({},Nt,t),this.options.stopNodes&&Array.isArray(this.options.stopNodes)&&(this.options.stopNodes=this.options.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),this.stopNodeExpressions=[],this.options.stopNodes&&Array.isArray(this.options.stopNodes))for(let t=0;t{for(const i of e){if("string"==typeof i&&t===i)return!0;if(i instanceof RegExp&&i.test(t))return!0}}:()=>!1,this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=wt),this.processTextOrObjNode=Et,this.options.format?(this.indentate=yt,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function Et(t,e,i,n){const s=this.extractAttributes(t);if(n.push(e,s),this.checkStopNode(n)){const s=this.buildRawContent(t),r=this.buildAttributesForStopNode(t);return n.pop(),this.buildObjectNode(s,e,r,i)}const r=this.j2x(t,i+1,n);return n.pop(),void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,r.attrStr,i,n):this.buildObjectNode(r.val,e,r.attrStr,i)}function yt(t){return this.options.indentBy.repeat(t)}function wt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}bt.prototype.build=function(t){if(this.options.preserveOrder)return lt(t,this.options);{Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t});const e=new _;return this.j2x(t,0,e).val}},bt.prototype.j2x=function(t,e,i){let n="",s="";const r=this.options.jPath?i.toString():i,o=this.checkStopNode(i);for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a))if(void 0===t[a])this.isAttribute(a)&&(s+="");else if(null===t[a])this.isAttribute(a)||a===this.options.cdataPropName?s+="":"?"===a[0]?s+=this.indentate(e)+"<"+a+"?"+this.tagEndChar:s+=this.indentate(e)+"<"+a+"/"+this.tagEndChar;else if(t[a]instanceof Date)s+=this.buildTextValNode(t[a],a,"",e,i);else if("object"!=typeof t[a]){const h=this.isAttribute(a);if(h&&!this.ignoreAttributesFn(h,r))n+=this.buildAttrPairStr(h,""+t[a],o);else if(!h)if(a===this.options.textNodeName){let e=this.options.tagValueProcessor(a,""+t[a]);s+=this.replaceEntitiesValue(e)}else{i.push(a);const n=this.checkStopNode(i);if(i.pop(),n){const i=""+t[a];s+=""===i?this.indentate(e)+"<"+a+this.closeTag(a)+this.tagEndChar:this.indentate(e)+"<"+a+">"+i+""+t+"${t}`;else if("object"==typeof t&&null!==t){const n=this.buildRawContent(t),s=this.buildAttributesForStopNode(t);e+=""===n?`<${i}${s}/>`:`<${i}${s}>${n}`}}else if("object"==typeof n&&null!==n){const t=this.buildRawContent(n),s=this.buildAttributesForStopNode(n);e+=""===t?`<${i}${s}/>`:`<${i}${s}>${t}`}else e+=`<${i}>${n}`}return e},bt.prototype.buildAttributesForStopNode=function(t){if(!t||"object"!=typeof t)return"";let e="";if(this.options.attributesGroupName&&t[this.options.attributesGroupName]){const i=t[this.options.attributesGroupName];for(let t in i){if(!Object.prototype.hasOwnProperty.call(i,t))continue;const n=t.startsWith(this.options.attributeNamePrefix)?t.substring(this.options.attributeNamePrefix.length):t,s=i[t];!0===s&&this.options.suppressBooleanAttributes?e+=" "+n:e+=" "+n+'="'+s+'"'}}else for(let i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;const n=this.isAttribute(i);if(n){const s=t[i];!0===s&&this.options.suppressBooleanAttributes?e+=" "+n:e+=" "+n+'="'+s+'"'}}return e},bt.prototype.buildObjectNode=function(t,e,i,n){if(""===t)return"?"===e[0]?this.indentate(n)+"<"+e+i+"?"+this.tagEndChar:this.indentate(n)+"<"+e+i+this.closeTag(e)+this.tagEndChar;{let s=""+t+s}},bt.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>`+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(n)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(n)+"<"+e+i+"?"+this.tagEndChar;{let s=this.options.tagValueProcessor(e,t);return s=this.replaceEntitiesValue(s),""===s?this.indentate(n)+"<"+e+i+this.closeTag(e)+this.tagEndChar:this.indentate(n)+"<"+e+i+">"+s+"0&&this.options.processEntities)for(let e=0;e(()=>{"use strict";var t={d:(e,i)=>{for(var r in i)t.o(i,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:i[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>Tt,XMLParser:()=>lt,XMLValidator:()=>St});var i=":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",r=new RegExp("^["+i+"]["+i+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function n(t,e){for(var i=[],r=e.exec(t);r;){var n=[];n.startIndex=e.lastIndex-r[0].length;for(var s=r.length,o=0;o"!==t[s]&&" "!==t[s]&&"\t"!==t[s]&&"\n"!==t[s]&&"\r"!==t[s];s++)d+=t[s];if("/"===(d=d.trim())[d.length-1]&&(d=d.substring(0,d.length-1),s--),!b(d))return x("InvalidTag",0===d.trim().length?"Invalid space after '<'.":"Tag '"+d+"' is an invalid name.",N(t,s));var c=f(t,s);if(!1===c)return x("InvalidAttr","Attributes for '"+d+"' have open quote.",N(t,s));var v=c.value;if(s=c.index,"/"===v[v.length-1]){var E=s-v.length,y=g(v=v.substring(0,v.length-1),e);if(!0!==y)return x(y.err.code,y.err.msg,N(t,E+y.err.line));r=!0}else if(p){if(!c.tagClosed)return x("InvalidTag","Closing tag '"+d+"' doesn't have proper closing.",N(t,s));if(v.trim().length>0)return x("InvalidTag","Closing tag '"+d+"' can't have attributes or invalid starting.",N(t,a));if(0===i.length)return x("InvalidTag","Closing tag '"+d+"' has not been opened.",N(t,a));var w=i.pop();if(d!==w.tagName){var T=N(t,w.tagStartPos);return x("InvalidTag","Expected closing tag '"+w.tagName+"' (opened in line "+T.line+", col "+T.col+") instead of closing tag '"+d+"'.",N(t,a))}0==i.length&&(n=!0)}else{var S=g(v,e);if(!0!==S)return x(S.err.code,S.err.msg,N(t,s-v.length+S.err.line));if(!0===n)return x("InvalidXml","Multiple possible root nodes found.",N(t,s));-1!==e.unpairedTags.indexOf(d)||i.push({tagName:d,tagStartPos:a}),r=!0}for(s++;s0)||x("InvalidXml","Invalid '"+JSON.stringify(i.map(function(t){return t.tagName}),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):x("InvalidXml","Start tag expected.",1)}function h(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function l(t,e){for(var i=e;e5&&"xml"===r)return x("InvalidXml","XML declaration allowed only at the start of the document.",N(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function u(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var i=1;for(e+=8;e"===t[e]&&0===--i)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}var p='"',d="'";function f(t,e){for(var i="",r="",n=!1;e"===t[e]&&""===r){n=!0;break}i+=t[e]}return""===r&&{value:i,index:e,tagClosed:n}}var c=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function g(t,e){for(var i=n(t,c),r={},s=0;s0?this.child.push(((i={})[t.tagname]=t.child,i[":@"]=t[":@"],i)):this.child.push(((r={})[t.tagname]=t.child,r)),void 0!==e&&(this.child[this.child.length-1][T]={startIndex:e})},t.getMetaDataSymbol=function(){return T},t}(),A=function(){function t(t){this.suppressValidationErr=!t,this.options=t}var e=t.prototype;return e.readDocType=function(t,e){var i=Object.create(null),r=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var n=1,s=!1,o=!1;e"===t[e]){if(o?"-"===t[e-1]&&"-"===t[e-2]&&(o=!1,n--):n--,0===n)break}else"["===t[e]?s=!0:t[e];else{if(s&&C(t,"!ENTITY",e)){e+=7;var a=void 0,h=void 0,l=this.readEntityExp(t,e+1,this.suppressValidationErr);if(a=l[0],h=l[1],e=l[2],-1===h.indexOf("&")){if(!1!==this.options.enabled&&this.options.maxEntityCount&&r>=this.options.maxEntityCount)throw new Error("Entity count ("+(r+1)+") exceeds maximum allowed ("+this.options.maxEntityCount+")");var u=a.replace(/[.\-+*:]/g,"\\.");i[a]={regx:RegExp("&"+u+";","g"),val:h},r++}}else if(s&&C(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(s&&C(t,"!ATTLIST",e))e+=8;else if(s&&C(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!C(t,"!--",e))throw new Error("Invalid DOCTYPE");o=!0}n++}if(0!==n)throw new Error("Unclosed DOCTYPE");return{entities:i,i:e}},e.readEntityExp=function(t,e){e=O(t,e);for(var i="";ethis.options.maxEntitySize)throw new Error('Entity "'+i+'" size ('+r.length+") exceeds maximum allowed size ("+this.options.maxEntitySize+")");return[i,r,--e]},e.readNotationExp=function(t,e){e=O(t,e);for(var i="";et.length)&&(e=t.length);for(var i=0,r=Array(e);i"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let i=0,r="";for(;i0&&(this.path[this.path.length-1].values=void 0);const r=this.path.length;this.siblingStacks[r]||(this.siblingStacks[r]=new Map);const n=this.siblingStacks[r],s=i?`${i}:${t}`:t,o=n.get(s)||0;let a=0;for(const t of n.values())a+=t;n.set(s,o+1);const h={tag:t,position:a,counter:o};null!=i&&(h.namespace=i),null!=e&&(h.values=e),this.path.push(h)}pop(){if(0===this.path.length)return;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0===this.path.length)return;const e=this.path[this.path.length-1];return e.values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const i=t||this.separator;return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(i)}toArray(){return this.path.map(t=>t.tag)}reset(){this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const r=t[i];if("deep-wildcard"===r.type){if(i--,i<0)return!0;const r=t[i];let n=!1;for(let t=e;t>=0;t--){const s=t===this.path.length-1;if(this._matchSegment(r,this.path[t],s)){e=t-1,i--,n=!0;break}}if(!n)return!1}else{const t=e===this.path.length-1;if(!this._matchSegment(r,this.path[e],t))return!1;e--,i--}}return i<0}_matchSegment(t,e,i){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!i)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue){const i=e.values[t.attrName];if(String(i)!==String(t.attrValue))return!1}}if(void 0!==t.position){if(!i)return!1;const r=e.counter??0;if("first"===t.position&&0!==r)return!1;if("odd"===t.position&&r%2!=1)return!1;if("even"===t.position&&r%2!=0)return!1;if("nth"===t.position&&r!==t.positionValue)return!1}return!0}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}}function M(t,e){if(!t)return{};var i=e.attributesGroupName?t[e.attributesGroupName]:t;if(!i)return{};var r={};for(var n in i)n.startsWith(e.attributeNamePrefix)?r[n.substring(e.attributeNamePrefix.length)]=i[n]:r[n]=i[n];return r}function L(t){if(t&&"string"==typeof t){var e=t.indexOf(":");if(-1!==e&&e>0){var i=t.substring(0,e);if("xmlns"!==i)return i}}}var R=function(t){var e;if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/&#([0-9]{1,7});/g,val:function(t,e){return et(e,10,"&#")}},num_hex:{regex:/&#x([0-9a-fA-F]{1,6});/g,val:function(t,e){return et(e,16,"&#x")}}},this.addExternalEntities=G,this.parseXml=X,this.parseTextData=U,this.resolveNameSpace=B,this.buildAttributesMap=Y,this.isItStopNode=K,this.replaceEntitiesValue=q,this.readStopNodeData=H,this.saveTextToParentTag=Z,this.addChild=z,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?function(t){for(var i,r=function(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(i)return(i=i.call(t)).next.bind(i);if(Array.isArray(t)||(i=function(t,e){if(t){if("string"==typeof t)return _(t,e);var i={}.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?_(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){i&&(t=i);var r=0;return function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(i=r()).done;){var n=i.value;if("string"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:function(){return!1},this.entityExpansionCount=0,this.currentExpandedLength=0,this.matcher=new F,this.isCurrentNodeStopNode=!1,this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodeExpressions=[];for(var i=0;i0)){o||(t=this.replaceEntitiesValue(t,e,i));var a=this.options.jPath?i.toString():i,h=this.options.tagValueProcessor(e,t,a,n,s);return null==h?t:typeof h!=typeof t||h!==t?h:this.options.trimValues||t.trim()===t?tt(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function B(t){if(this.options.removeNSPrefix){var e=t.split(":"),i="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=i+e[1])}return t}var W=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function Y(t,e,i){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){for(var r=n(t,W),s=r.length,o={},a={},h=0;h0&&"object"==typeof e&&e.updateCurrent&&e.updateCurrent(a);for(var d=0;d",s,"Closing Tag is not closed."),a=t.substring(s+2,o).trim();if(this.options.removeNSPrefix){var h=a.indexOf(":");-1!==h&&(a=a.substr(h+1))}this.options.transformTagName&&(a=this.options.transformTagName(a)),i&&(r=this.saveTextToParentTag(r,i,this.matcher));var l=this.matcher.getCurrentTag();if(a&&-1!==this.options.unpairedTags.indexOf(a))throw new Error("Unpaired tag can not be used as closing tag: ");l&&-1!==this.options.unpairedTags.indexOf(l)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,i=this.tagsNodeStack.pop(),r="",s=o}else if("?"===t[s+1]){var u=J(t,s,!1,"?>");if(!u)throw new Error("Pi Tag is not closed.");if(r=this.saveTextToParentTag(r,i,this.matcher),this.options.ignoreDeclaration&&"?xml"===u.tagName||this.options.ignorePiTags);else{var p=new P(u.tagName);p.add(this.options.textNodeName,""),u.tagName!==u.tagExp&&u.attrExpPresent&&(p[":@"]=this.buildAttributesMap(u.tagExp,this.matcher,u.tagName)),this.addChild(i,p,this.matcher,s)}s=u.closeIndex+1}else if("!--"===t.substr(s+1,3)){var d=Q(t,"--\x3e",s+4,"Comment is not closed.");if(this.options.commentPropName){var f,c=t.substring(s+4,d-2);r=this.saveTextToParentTag(r,i,this.matcher),i.add(this.options.commentPropName,[(f={},f[this.options.textNodeName]=c,f)])}s=d}else if("!D"===t.substr(s+1,2)){var g=n.readDocType(t,s);this.docTypeEntities=g.entities,s=g.i}else if("!["===t.substr(s+1,2)){var m=Q(t,"]]>",s,"CDATA is not closed.")-2,x=t.substring(s+9,m);r=this.saveTextToParentTag(r,i,this.matcher);var v,b=this.parseTextData(x,i.tagname,this.matcher,!0,!1,!0,!0);null==b&&(b=""),this.options.cdataPropName?i.add(this.options.cdataPropName,[(v={},v[this.options.textNodeName]=x,v)]):i.add(this.options.textNodeName,b),s=m+2}else{var N=J(t,s,this.options.removeNSPrefix);if(!N){var E=t.substring(Math.max(0,s-50),Math.min(t.length,s+50));throw new Error("readTagExp returned undefined at position "+s+'. Context: "'+E+'"')}var y=N.tagName,w=N.rawTagName,T=N.tagExp,S=N.attrExpPresent,O=N.closeIndex;if(this.options.transformTagName){var C=this.options.transformTagName(y);T===y&&(T=C),y=C}if(this.options.strictReservedNames&&(y===this.options.commentPropName||y===this.options.cdataPropName))throw new Error("Invalid tag name: "+y);i&&r&&"!xml"!==i.tagname&&(r=this.saveTextToParentTag(r,i,this.matcher,!1));var I=i;I&&-1!==this.options.unpairedTags.indexOf(I.tagname)&&(i=this.tagsNodeStack.pop(),this.matcher.pop());var j=!1;T.length>0&&T.lastIndexOf("/")===T.length-1&&(j=!0,T="/"===y[y.length-1]?y=y.substr(0,y.length-1):T.substr(0,T.length-1),S=y!==T);var $,V=null;$=L(w),y!==e.tagname&&this.matcher.push(y,{},$),y!==T&&S&&(V=this.buildAttributesMap(T,this.matcher,y))&&M(V,this.options),y!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode(this.stopNodeExpressions,this.matcher));var D=s;if(this.isCurrentNodeStopNode){var _="";if(j)s=N.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(y))s=N.closeIndex;else{var k=this.readStopNodeData(t,w,O+1);if(!k)throw new Error("Unexpected end of "+w);s=k.i,_=k.tagContent}var F=new P(y);V&&(F[":@"]=V),F.add(this.options.textNodeName,_),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(i,F,this.matcher,D)}else{if(j){if(this.options.transformTagName){var R=this.options.transformTagName(y);T===y&&(T=R),y=R}var G=new P(y);V&&(G[":@"]=V),this.addChild(i,G,this.matcher,D),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(-1!==this.options.unpairedTags.indexOf(y)){var U=new P(y);V&&(U[":@"]=V),this.addChild(i,U,this.matcher,D),this.matcher.pop(),this.isCurrentNodeStopNode=!1,s=N.closeIndex;continue}var B=new P(y);if(this.tagsNodeStack.length>this.options.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(i),V&&(B[":@"]=V),this.addChild(i,B,this.matcher,D),i=B}r="",s=O}}else r+=t[s];return e.child};function z(t,e,i,r){this.options.captureMetaData||(r=void 0);var n=this.options.jPath?i.toString():i,s=this.options.updateTag(e.tagname,n,e[":@"]);!1===s||("string"==typeof s?(e.tagname=s,t.addChild(e,r)):t.addChild(e,r))}function q(t,e,i){var r=this.options.processEntities;if(!r||!r.enabled)return t;if(r.allowedTags){var n=this.options.jPath?i.toString():i;if(!(Array.isArray(r.allowedTags)?r.allowedTags.includes(e):r.allowedTags(e,n)))return t}if(r.tagFilter){var s=this.options.jPath?i.toString():i;if(!r.tagFilter(e,s))return t}for(var o in this.docTypeEntities){var a=this.docTypeEntities[o],h=t.match(a.regx);if(h){if(this.entityExpansionCount+=h.length,r.maxTotalExpansions&&this.entityExpansionCount>r.maxTotalExpansions)throw new Error("Entity expansion limit exceeded: "+this.entityExpansionCount+" > "+r.maxTotalExpansions);var l=t.length;if(t=t.replace(a.regx,a.val),r.maxExpandedLength&&(this.currentExpandedLength+=t.length-l,this.currentExpandedLength>r.maxExpandedLength))throw new Error("Total expanded content size exceeded: "+this.currentExpandedLength+" > "+r.maxExpandedLength)}}if(-1===t.indexOf("&"))return t;for(var u in this.lastEntities){var p=this.lastEntities[u];t=t.replace(p.regex,p.val)}if(-1===t.indexOf("&"))return t;if(this.options.htmlEntities)for(var d in this.htmlEntities){var f=this.htmlEntities[d];t=t.replace(f.regex,f.val)}return t.replace(this.ampEntity.regex,this.ampEntity.val)}function Z(t,e,i,r){return t&&(void 0===r&&(r=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,i,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,r))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function K(t,e){if(!t||0===t.length)return!1;for(var i=0;i");var n=function(t,e,i){var r;void 0===i&&(i=">");for(var n="",s=e;s",i,e+" is not closed");if(t.substring(i+2,s).trim()===e&&0===--n)return{tagContent:t.substring(r,i),i:s};i=s}else if("?"===t[i+1])i=Q(t,"?>",i+1,"StopNode is not closed.");else if("!--"===t.substr(i+1,3))i=Q(t,"--\x3e",i+3,"StopNode is not closed.");else if("!["===t.substr(i+1,2))i=Q(t,"]]>",i,"StopNode is not closed.")-2;else{var o=J(t,i,">");o&&((o&&o.tagName)===e&&"/"!==o.tagExp[o.tagExp.length-1]&&n++,i=o.closeIndex)}}function tt(t,e,i){if(e&&"string"==typeof t){var r=t.trim();return"true"===r||"false"!==r&&function(t,e={}){if(e=Object.assign({},V,e),!t||"string"!=typeof t)return t;let i=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(i))return t;if("0"===t)return 0;if(e.hex&&j.test(i))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(i);if(i.includes("e")||i.includes("E"))return function(t,e,i){if(!i.eNotation)return t;const r=e.match(D);if(r){let n=r[1]||"";const s=-1===r[3].indexOf("e")?"E":"e",o=r[2],a=n?t[o.length+1]===s:t[o.length]===s;return o.length>1&&a?t:1!==o.length||!r[3].startsWith(`.${s}`)&&r[3][0]!==s?i.leadingZeros&&!a?(e=(r[1]||"")+r[3],Number(e)):t:Number(e)}return t}(t,i,e);{const n=$.exec(i);if(n){const s=n[1]||"",o=n[2];let a=(r=n[3])&&-1!==r.indexOf(".")?("."===(r=r.replace(/0+$/,""))?r="0":"."===r[0]?r="0"+r:"."===r[r.length-1]&&(r=r.substring(0,r.length-1)),r):r;const h=s?"."===t[o.length+1]:"."===t[o.length];if(!e.leadingZeros&&(o.length>1||1===o.length&&!h))return t;{const r=Number(i),n=String(r);if(0===r)return r;if(-1!==n.search(/[eE]/))return e.eNotation?r:t;if(-1!==i.indexOf("."))return"0"===n||n===a||n===`${s}${a}`?r:t;let h=o?a:i;return o?h===n||s+h===n?r:t:h===n||h===s+n?r:t}}return t}var r}(t,i)}return void 0!==t?t:""}function et(t,e,i){var r=Number.parseInt(t,e);return r>=0&&r<=1114111?String.fromCodePoint(r):i+t+";"}var it=P.getMetaDataSymbol();function rt(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;var i={};for(var r in t)r.startsWith(e)?i[r.substring(e.length)]=t[r]:i[r]=t[r];return i}function nt(t,e,i){return st(t,e,i)}function st(t,e,i){for(var r,n={},s=0;s0&&(n[e.textNodeName]=r):void 0!==r&&(n[e.textNodeName]=r),n}function ot(t){for(var e=Object.keys(t),i=0;i0&&(i="\n");const r=[];if(e.stopNodes&&Array.isArray(e.stopNodes))for(let t=0;t`,o=!1,r.pop();continue}if(l===e.commentPropName){s+=i+`\x3c!--${h[l][0][e.textNodeName]}--\x3e`,o=!0,r.pop();continue}if("?"===l[0]){const t=mt(h[":@"],e,p),n="?xml"===l?"":i;let a=h[l][0][e.textNodeName];a=0!==a.length?" "+a:"",s+=n+`<${l}${a}${t}?>`,o=!0,r.pop();continue}let d=i;""!==d&&(d+=e.indentBy);const f=i+`<${l}${mt(h[":@"],e,p)}`;let c;c=p?ft(h[l],e):pt(h[l],e,d,r,n),-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?s+=f+">":s+=f+"/>":c&&0!==c.length||!e.suppressEmptyNode?c&&c.endsWith(">")?s+=f+`>${c}${i}`:(s+=f+">",c&&""!==i&&(c.includes("/>")||c.includes("`):s+=f+"/>",o=!0,r.pop()}return s}function dt(t,e){if(!t||e.ignoreAttributes)return null;const i={};let r=!1;for(let n in t)Object.prototype.hasOwnProperty.call(t,n)&&(i[n.startsWith(e.attributeNamePrefix)?n.substr(e.attributeNamePrefix.length):n]=t[n],r=!0);return r?i:null}function ft(t,e){if(!Array.isArray(t))return null!=t?t.toString():"";let i="";for(let r=0;r${r}`:i+=`<${s}${t}/>`}}}return i}function ct(t,e){let i="";if(t&&!e.ignoreAttributes)for(let r in t){if(!Object.prototype.hasOwnProperty.call(t,r))continue;let n=t[r];!0===n&&e.suppressBooleanAttributes?i+=` ${r.substr(e.attributeNamePrefix.length)}`:i+=` ${r.substr(e.attributeNamePrefix.length)}="${n}"`}return i}function gt(t){const e=Object.keys(t);for(let i=0;i0&&e.processEntities)for(let i=0;i","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1,jPath:!0};function Nt(t){if(this.options=Object.assign({},bt,t),this.options.stopNodes&&Array.isArray(this.options.stopNodes)&&(this.options.stopNodes=this.options.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),this.stopNodeExpressions=[],this.options.stopNodes&&Array.isArray(this.options.stopNodes))for(let t=0;t{for(const i of e){if("string"==typeof i&&t===i)return!0;if(i instanceof RegExp&&i.test(t))return!0}}:()=>!1,this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=wt),this.processTextOrObjNode=Et,this.options.format?(this.indentate=yt,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function Et(t,e,i,r){const n=this.extractAttributes(t);if(r.push(e,n),this.checkStopNode(r)){const n=this.buildRawContent(t),s=this.buildAttributesForStopNode(t);return r.pop(),this.buildObjectNode(n,e,s,i)}const s=this.j2x(t,i+1,r);return r.pop(),void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,s.attrStr,i,r):this.buildObjectNode(s.val,e,s.attrStr,i)}function yt(t){return this.options.indentBy.repeat(t)}function wt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}Nt.prototype.build=function(t){if(this.options.preserveOrder)return ut(t,this.options);{Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t});const e=new F;return this.j2x(t,0,e).val}},Nt.prototype.j2x=function(t,e,i){let r="",n="";const s=this.options.jPath?i.toString():i,o=this.checkStopNode(i);for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a))if(void 0===t[a])this.isAttribute(a)&&(n+="");else if(null===t[a])this.isAttribute(a)||a===this.options.cdataPropName?n+="":"?"===a[0]?n+=this.indentate(e)+"<"+a+"?"+this.tagEndChar:n+=this.indentate(e)+"<"+a+"/"+this.tagEndChar;else if(t[a]instanceof Date)n+=this.buildTextValNode(t[a],a,"",e,i);else if("object"!=typeof t[a]){const h=this.isAttribute(a);if(h&&!this.ignoreAttributesFn(h,s))r+=this.buildAttrPairStr(h,""+t[a],o);else if(!h)if(a===this.options.textNodeName){let e=this.options.tagValueProcessor(a,""+t[a]);n+=this.replaceEntitiesValue(e)}else{i.push(a);const r=this.checkStopNode(i);if(i.pop(),r){const i=""+t[a];n+=""===i?this.indentate(e)+"<"+a+this.closeTag(a)+this.tagEndChar:this.indentate(e)+"<"+a+">"+i+""+t+"${t}`;else if("object"==typeof t&&null!==t){const r=this.buildRawContent(t),n=this.buildAttributesForStopNode(t);e+=""===r?`<${i}${n}/>`:`<${i}${n}>${r}`}}else if("object"==typeof r&&null!==r){const t=this.buildRawContent(r),n=this.buildAttributesForStopNode(r);e+=""===t?`<${i}${n}/>`:`<${i}${n}>${t}`}else e+=`<${i}>${r}`}return e},Nt.prototype.buildAttributesForStopNode=function(t){if(!t||"object"!=typeof t)return"";let e="";if(this.options.attributesGroupName&&t[this.options.attributesGroupName]){const i=t[this.options.attributesGroupName];for(let t in i){if(!Object.prototype.hasOwnProperty.call(i,t))continue;const r=t.startsWith(this.options.attributeNamePrefix)?t.substring(this.options.attributeNamePrefix.length):t,n=i[t];!0===n&&this.options.suppressBooleanAttributes?e+=" "+r:e+=" "+r+'="'+n+'"'}}else for(let i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;const r=this.isAttribute(i);if(r){const n=t[i];!0===n&&this.options.suppressBooleanAttributes?e+=" "+r:e+=" "+r+'="'+n+'"'}}return e},Nt.prototype.buildObjectNode=function(t,e,i,r){if(""===t)return"?"===e[0]?this.indentate(r)+"<"+e+i+"?"+this.tagEndChar:this.indentate(r)+"<"+e+i+this.closeTag(e)+this.tagEndChar;{let n=""+t+n}},Nt.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>`+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(r)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(r)+"<"+e+i+"?"+this.tagEndChar;{let n=this.options.tagValueProcessor(e,t);return n=this.replaceEntitiesValue(n),""===n?this.indentate(r)+"<"+e+i+this.closeTag(e)+this.tagEndChar:this.indentate(r)+"<"+e+i+">"+n+"0&&this.options.processEntities)for(let e=0;e(()=>{"use strict";var t={d:(e,i)=>{for(var r in i)t.o(i,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:i[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>Tt,XMLParser:()=>lt,XMLValidator:()=>St});var i=":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",r=new RegExp("^["+i+"]["+i+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function n(t,e){for(var i=[],r=e.exec(t);r;){var n=[];n.startIndex=e.lastIndex-r[0].length;for(var s=r.length,o=0;o"!==t[s]&&" "!==t[s]&&"\t"!==t[s]&&"\n"!==t[s]&&"\r"!==t[s];s++)d+=t[s];if("/"===(d=d.trim())[d.length-1]&&(d=d.substring(0,d.length-1),s--),!b(d))return x("InvalidTag",0===d.trim().length?"Invalid space after '<'.":"Tag '"+d+"' is an invalid name.",N(t,s));var c=f(t,s);if(!1===c)return x("InvalidAttr","Attributes for '"+d+"' have open quote.",N(t,s));var v=c.value;if(s=c.index,"/"===v[v.length-1]){var E=s-v.length,y=g(v=v.substring(0,v.length-1),e);if(!0!==y)return x(y.err.code,y.err.msg,N(t,E+y.err.line));r=!0}else if(p){if(!c.tagClosed)return x("InvalidTag","Closing tag '"+d+"' doesn't have proper closing.",N(t,s));if(v.trim().length>0)return x("InvalidTag","Closing tag '"+d+"' can't have attributes or invalid starting.",N(t,a));if(0===i.length)return x("InvalidTag","Closing tag '"+d+"' has not been opened.",N(t,a));var w=i.pop();if(d!==w.tagName){var T=N(t,w.tagStartPos);return x("InvalidTag","Expected closing tag '"+w.tagName+"' (opened in line "+T.line+", col "+T.col+") instead of closing tag '"+d+"'.",N(t,a))}0==i.length&&(n=!0)}else{var S=g(v,e);if(!0!==S)return x(S.err.code,S.err.msg,N(t,s-v.length+S.err.line));if(!0===n)return x("InvalidXml","Multiple possible root nodes found.",N(t,s));-1!==e.unpairedTags.indexOf(d)||i.push({tagName:d,tagStartPos:a}),r=!0}for(s++;s0)||x("InvalidXml","Invalid '"+JSON.stringify(i.map(function(t){return t.tagName}),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):x("InvalidXml","Start tag expected.",1)}function h(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function l(t,e){for(var i=e;e5&&"xml"===r)return x("InvalidXml","XML declaration allowed only at the start of the document.",N(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function u(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var i=1;for(e+=8;e"===t[e]&&0===--i)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}var p='"',d="'";function f(t,e){for(var i="",r="",n=!1;e"===t[e]&&""===r){n=!0;break}i+=t[e]}return""===r&&{value:i,index:e,tagClosed:n}}var c=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function g(t,e){for(var i=n(t,c),r={},s=0;s0?this.child.push(((i={})[t.tagname]=t.child,i[":@"]=t[":@"],i)):this.child.push(((r={})[t.tagname]=t.child,r)),void 0!==e&&(this.child[this.child.length-1][T]={startIndex:e})},t.getMetaDataSymbol=function(){return T},t}(),A=function(){function t(t){this.suppressValidationErr=!t,this.options=t}var e=t.prototype;return e.readDocType=function(t,e){var i=Object.create(null),r=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var n=1,s=!1,o=!1;e"===t[e]){if(o?"-"===t[e-1]&&"-"===t[e-2]&&(o=!1,n--):n--,0===n)break}else"["===t[e]?s=!0:t[e];else{if(s&&C(t,"!ENTITY",e)){e+=7;var a=void 0,h=void 0,l=this.readEntityExp(t,e+1,this.suppressValidationErr);if(a=l[0],h=l[1],e=l[2],-1===h.indexOf("&")){if(!1!==this.options.enabled&&this.options.maxEntityCount&&r>=this.options.maxEntityCount)throw new Error("Entity count ("+(r+1)+") exceeds maximum allowed ("+this.options.maxEntityCount+")");var u=a.replace(/[.\-+*:]/g,"\\.");i[a]={regx:RegExp("&"+u+";","g"),val:h},r++}}else if(s&&C(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(s&&C(t,"!ATTLIST",e))e+=8;else if(s&&C(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!C(t,"!--",e))throw new Error("Invalid DOCTYPE");o=!0}n++}if(0!==n)throw new Error("Unclosed DOCTYPE");return{entities:i,i:e}},e.readEntityExp=function(t,e){e=O(t,e);for(var i="";ethis.options.maxEntitySize)throw new Error('Entity "'+i+'" size ('+r.length+") exceeds maximum allowed size ("+this.options.maxEntitySize+")");return[i,r,--e]},e.readNotationExp=function(t,e){e=O(t,e);for(var i="";et.length)&&(e=t.length);for(var i=0,r=Array(e);i0&&(this.path[this.path.length-1].values=void 0);const r=this.path.length;this.siblingStacks[r]||(this.siblingStacks[r]=new Map);const n=this.siblingStacks[r],s=i?`${i}:${t}`:t,o=n.get(s)||0;let a=0;for(const t of n.values())a+=t;n.set(s,o+1);const h={tag:t,position:a,counter:o};null!=i&&(h.namespace=i),null!=e&&(h.values=e),this.path.push(h)}pop(){if(0===this.path.length)return;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0===this.path.length)return;const e=this.path[this.path.length-1];return e.values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const i=t||this.separator;return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(i)}toArray(){return this.path.map(t=>t.tag)}reset(){this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const r=t[i];if("deep-wildcard"===r.type){if(i--,i<0)return!0;const r=t[i];let n=!1;for(let t=e;t>=0;t--){const s=t===this.path.length-1;if(this._matchSegment(r,this.path[t],s)){e=t-1,i--,n=!0;break}}if(!n)return!1}else{const t=e===this.path.length-1;if(!this._matchSegment(r,this.path[e],t))return!1;e--,i--}}return i<0}_matchSegment(t,e,i){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!i)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue){const i=e.values[t.attrName];if(String(i)!==String(t.attrValue))return!1}}if(void 0!==t.position){if(!i)return!1;const r=e.counter??0;if("first"===t.position&&0!==r)return!1;if("odd"===t.position&&r%2!=1)return!1;if("even"===t.position&&r%2!=0)return!1;if("nth"===t.position&&r!==t.positionValue)return!1}return!0}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}}class F{constructor(t,e={}){this.pattern=t,this.separator=e.separator||".",this.segments=this._parse(t),this._hasDeepWildcard=this.segments.some(t=>"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let i=0,r="";for(;i0){var i=t.substring(0,e);if("xmlns"!==i)return i}}}var R=function(t){var e;if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/&#([0-9]{1,7});/g,val:function(t,e){return et(e,10,"&#")}},num_hex:{regex:/&#x([0-9a-fA-F]{1,6});/g,val:function(t,e){return et(e,16,"&#x")}}},this.addExternalEntities=G,this.parseXml=X,this.parseTextData=U,this.resolveNameSpace=B,this.buildAttributesMap=Y,this.isItStopNode=K,this.replaceEntitiesValue=q,this.readStopNodeData=H,this.saveTextToParentTag=Z,this.addChild=z,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?function(t){for(var i,r=function(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(i)return(i=i.call(t)).next.bind(i);if(Array.isArray(t)||(i=function(t,e){if(t){if("string"==typeof t)return _(t,e);var i={}.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?_(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){i&&(t=i);var r=0;return function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(i=r()).done;){var n=i.value;if("string"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:function(){return!1},this.entityExpansionCount=0,this.currentExpandedLength=0,this.matcher=new k,this.isCurrentNodeStopNode=!1,this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodeExpressions=[];for(var i=0;i0)){o||(t=this.replaceEntitiesValue(t,e,i));var a=this.options.jPath?i.toString():i,h=this.options.tagValueProcessor(e,t,a,n,s);return null==h?t:typeof h!=typeof t||h!==t?h:this.options.trimValues||t.trim()===t?tt(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function B(t){if(this.options.removeNSPrefix){var e=t.split(":"),i="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=i+e[1])}return t}var W=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function Y(t,e,i){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){for(var r=n(t,W),s=r.length,o={},a={},h=0;h0&&"object"==typeof e&&e.updateCurrent&&e.updateCurrent(a);for(var d=0;d",s,"Closing Tag is not closed."),a=t.substring(s+2,o).trim();if(this.options.removeNSPrefix){var h=a.indexOf(":");-1!==h&&(a=a.substr(h+1))}this.options.transformTagName&&(a=this.options.transformTagName(a)),i&&(r=this.saveTextToParentTag(r,i,this.matcher));var l=this.matcher.getCurrentTag();if(a&&-1!==this.options.unpairedTags.indexOf(a))throw new Error("Unpaired tag can not be used as closing tag: ");l&&-1!==this.options.unpairedTags.indexOf(l)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,i=this.tagsNodeStack.pop(),r="",s=o}else if("?"===t[s+1]){var u=J(t,s,!1,"?>");if(!u)throw new Error("Pi Tag is not closed.");if(r=this.saveTextToParentTag(r,i,this.matcher),this.options.ignoreDeclaration&&"?xml"===u.tagName||this.options.ignorePiTags);else{var p=new P(u.tagName);p.add(this.options.textNodeName,""),u.tagName!==u.tagExp&&u.attrExpPresent&&(p[":@"]=this.buildAttributesMap(u.tagExp,this.matcher,u.tagName)),this.addChild(i,p,this.matcher,s)}s=u.closeIndex+1}else if("!--"===t.substr(s+1,3)){var d=Q(t,"--\x3e",s+4,"Comment is not closed.");if(this.options.commentPropName){var f,c=t.substring(s+4,d-2);r=this.saveTextToParentTag(r,i,this.matcher),i.add(this.options.commentPropName,[(f={},f[this.options.textNodeName]=c,f)])}s=d}else if("!D"===t.substr(s+1,2)){var g=n.readDocType(t,s);this.docTypeEntities=g.entities,s=g.i}else if("!["===t.substr(s+1,2)){var m=Q(t,"]]>",s,"CDATA is not closed.")-2,x=t.substring(s+9,m);r=this.saveTextToParentTag(r,i,this.matcher);var v,b=this.parseTextData(x,i.tagname,this.matcher,!0,!1,!0,!0);null==b&&(b=""),this.options.cdataPropName?i.add(this.options.cdataPropName,[(v={},v[this.options.textNodeName]=x,v)]):i.add(this.options.textNodeName,b),s=m+2}else{var N=J(t,s,this.options.removeNSPrefix);if(!N){var E=t.substring(Math.max(0,s-50),Math.min(t.length,s+50));throw new Error("readTagExp returned undefined at position "+s+'. Context: "'+E+'"')}var y=N.tagName,w=N.rawTagName,T=N.tagExp,S=N.attrExpPresent,O=N.closeIndex;if(this.options.transformTagName){var C=this.options.transformTagName(y);T===y&&(T=C),y=C}if(this.options.strictReservedNames&&(y===this.options.commentPropName||y===this.options.cdataPropName))throw new Error("Invalid tag name: "+y);i&&r&&"!xml"!==i.tagname&&(r=this.saveTextToParentTag(r,i,this.matcher,!1));var I=i;I&&-1!==this.options.unpairedTags.indexOf(I.tagname)&&(i=this.tagsNodeStack.pop(),this.matcher.pop());var j=!1;T.length>0&&T.lastIndexOf("/")===T.length-1&&(j=!0,T="/"===y[y.length-1]?y=y.substr(0,y.length-1):T.substr(0,T.length-1),S=y!==T);var $,V=null;$=L(w),y!==e.tagname&&this.matcher.push(y,{},$),y!==T&&S&&(V=this.buildAttributesMap(T,this.matcher,y))&&M(V,this.options),y!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode(this.stopNodeExpressions,this.matcher));var D=s;if(this.isCurrentNodeStopNode){var _="";if(j)s=N.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(y))s=N.closeIndex;else{var k=this.readStopNodeData(t,w,O+1);if(!k)throw new Error("Unexpected end of "+w);s=k.i,_=k.tagContent}var F=new P(y);V&&(F[":@"]=V),F.add(this.options.textNodeName,_),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(i,F,this.matcher,D)}else{if(j){if(this.options.transformTagName){var R=this.options.transformTagName(y);T===y&&(T=R),y=R}var G=new P(y);V&&(G[":@"]=V),this.addChild(i,G,this.matcher,D),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(-1!==this.options.unpairedTags.indexOf(y)){var U=new P(y);V&&(U[":@"]=V),this.addChild(i,U,this.matcher,D),this.matcher.pop(),this.isCurrentNodeStopNode=!1,s=N.closeIndex;continue}var B=new P(y);if(this.tagsNodeStack.length>this.options.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(i),V&&(B[":@"]=V),this.addChild(i,B,this.matcher,D),i=B}r="",s=O}}else r+=t[s];return e.child};function z(t,e,i,r){this.options.captureMetaData||(r=void 0);var n=this.options.jPath?i.toString():i,s=this.options.updateTag(e.tagname,n,e[":@"]);!1===s||("string"==typeof s?(e.tagname=s,t.addChild(e,r)):t.addChild(e,r))}function q(t,e,i){var r=this.options.processEntities;if(!r||!r.enabled)return t;if(r.allowedTags){var n=this.options.jPath?i.toString():i;if(!(Array.isArray(r.allowedTags)?r.allowedTags.includes(e):r.allowedTags(e,n)))return t}if(r.tagFilter){var s=this.options.jPath?i.toString():i;if(!r.tagFilter(e,s))return t}for(var o in this.docTypeEntities){var a=this.docTypeEntities[o],h=t.match(a.regx);if(h){if(this.entityExpansionCount+=h.length,r.maxTotalExpansions&&this.entityExpansionCount>r.maxTotalExpansions)throw new Error("Entity expansion limit exceeded: "+this.entityExpansionCount+" > "+r.maxTotalExpansions);var l=t.length;if(t=t.replace(a.regx,a.val),r.maxExpandedLength&&(this.currentExpandedLength+=t.length-l,this.currentExpandedLength>r.maxExpandedLength))throw new Error("Total expanded content size exceeded: "+this.currentExpandedLength+" > "+r.maxExpandedLength)}}if(-1===t.indexOf("&"))return t;for(var u in this.lastEntities){var p=this.lastEntities[u];t=t.replace(p.regex,p.val)}if(-1===t.indexOf("&"))return t;if(this.options.htmlEntities)for(var d in this.htmlEntities){var f=this.htmlEntities[d];t=t.replace(f.regex,f.val)}return t.replace(this.ampEntity.regex,this.ampEntity.val)}function Z(t,e,i,r){return t&&(void 0===r&&(r=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,i,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,r))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function K(t,e){if(!t||0===t.length)return!1;for(var i=0;i");var n=function(t,e,i){var r;void 0===i&&(i=">");for(var n="",s=e;s",i,e+" is not closed");if(t.substring(i+2,s).trim()===e&&0===--n)return{tagContent:t.substring(r,i),i:s};i=s}else if("?"===t[i+1])i=Q(t,"?>",i+1,"StopNode is not closed.");else if("!--"===t.substr(i+1,3))i=Q(t,"--\x3e",i+3,"StopNode is not closed.");else if("!["===t.substr(i+1,2))i=Q(t,"]]>",i,"StopNode is not closed.")-2;else{var o=J(t,i,">");o&&((o&&o.tagName)===e&&"/"!==o.tagExp[o.tagExp.length-1]&&n++,i=o.closeIndex)}}function tt(t,e,i){if(e&&"string"==typeof t){var r=t.trim();return"true"===r||"false"!==r&&function(t,e={}){if(e=Object.assign({},V,e),!t||"string"!=typeof t)return t;let i=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(i))return t;if("0"===t)return 0;if(e.hex&&j.test(i))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(i);if(i.includes("e")||i.includes("E"))return function(t,e,i){if(!i.eNotation)return t;const r=e.match(D);if(r){let n=r[1]||"";const s=-1===r[3].indexOf("e")?"E":"e",o=r[2],a=n?t[o.length+1]===s:t[o.length]===s;return o.length>1&&a?t:1!==o.length||!r[3].startsWith(`.${s}`)&&r[3][0]!==s?i.leadingZeros&&!a?(e=(r[1]||"")+r[3],Number(e)):t:Number(e)}return t}(t,i,e);{const n=$.exec(i);if(n){const s=n[1]||"",o=n[2];let a=(r=n[3])&&-1!==r.indexOf(".")?("."===(r=r.replace(/0+$/,""))?r="0":"."===r[0]?r="0"+r:"."===r[r.length-1]&&(r=r.substring(0,r.length-1)),r):r;const h=s?"."===t[o.length+1]:"."===t[o.length];if(!e.leadingZeros&&(o.length>1||1===o.length&&!h))return t;{const r=Number(i),n=String(r);if(0===r)return r;if(-1!==n.search(/[eE]/))return e.eNotation?r:t;if(-1!==i.indexOf("."))return"0"===n||n===a||n===`${s}${a}`?r:t;let h=o?a:i;return o?h===n||s+h===n?r:t:h===n||h===s+n?r:t}}return t}var r}(t,i)}return void 0!==t?t:""}function et(t,e,i){var r=Number.parseInt(t,e);return r>=0&&r<=1114111?String.fromCodePoint(r):i+t+";"}var it=P.getMetaDataSymbol();function rt(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;var i={};for(var r in t)r.startsWith(e)?i[r.substring(e.length)]=t[r]:i[r]=t[r];return i}function nt(t,e,i){return st(t,e,i)}function st(t,e,i){for(var r,n={},s=0;s0&&(n[e.textNodeName]=r):void 0!==r&&(n[e.textNodeName]=r),n}function ot(t){for(var e=Object.keys(t),i=0;i0&&(i="\n");const r=[];if(e.stopNodes&&Array.isArray(e.stopNodes))for(let t=0;t`,o=!1,r.pop();continue}if(l===e.commentPropName){s+=i+`\x3c!--${h[l][0][e.textNodeName]}--\x3e`,o=!0,r.pop();continue}if("?"===l[0]){const t=mt(h[":@"],e,p),n="?xml"===l?"":i;let a=h[l][0][e.textNodeName];a=0!==a.length?" "+a:"",s+=n+`<${l}${a}${t}?>`,o=!0,r.pop();continue}let d=i;""!==d&&(d+=e.indentBy);const f=i+`<${l}${mt(h[":@"],e,p)}`;let c;c=p?ft(h[l],e):pt(h[l],e,d,r,n),-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?s+=f+">":s+=f+"/>":c&&0!==c.length||!e.suppressEmptyNode?c&&c.endsWith(">")?s+=f+`>${c}${i}`:(s+=f+">",c&&""!==i&&(c.includes("/>")||c.includes("`):s+=f+"/>",o=!0,r.pop()}return s}function dt(t,e){if(!t||e.ignoreAttributes)return null;const i={};let r=!1;for(let n in t)Object.prototype.hasOwnProperty.call(t,n)&&(i[n.startsWith(e.attributeNamePrefix)?n.substr(e.attributeNamePrefix.length):n]=t[n],r=!0);return r?i:null}function ft(t,e){if(!Array.isArray(t))return null!=t?t.toString():"";let i="";for(let r=0;r${r}`:i+=`<${s}${t}/>`}}}return i}function ct(t,e){let i="";if(t&&!e.ignoreAttributes)for(let r in t){if(!Object.prototype.hasOwnProperty.call(t,r))continue;let n=t[r];!0===n&&e.suppressBooleanAttributes?i+=` ${r.substr(e.attributeNamePrefix.length)}`:i+=` ${r.substr(e.attributeNamePrefix.length)}="${n}"`}return i}function gt(t){const e=Object.keys(t);for(let i=0;i0&&e.processEntities)for(let i=0;i","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1,jPath:!0};function Nt(t){if(this.options=Object.assign({},bt,t),this.options.stopNodes&&Array.isArray(this.options.stopNodes)&&(this.options.stopNodes=this.options.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),this.stopNodeExpressions=[],this.options.stopNodes&&Array.isArray(this.options.stopNodes))for(let t=0;t{for(const i of e){if("string"==typeof i&&t===i)return!0;if(i instanceof RegExp&&i.test(t))return!0}}:()=>!1,this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=wt),this.processTextOrObjNode=Et,this.options.format?(this.indentate=yt,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function Et(t,e,i,r){const n=this.extractAttributes(t);if(r.push(e,n),this.checkStopNode(r)){const n=this.buildRawContent(t),s=this.buildAttributesForStopNode(t);return r.pop(),this.buildObjectNode(n,e,s,i)}const s=this.j2x(t,i+1,r);return r.pop(),void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,s.attrStr,i,r):this.buildObjectNode(s.val,e,s.attrStr,i)}function yt(t){return this.options.indentBy.repeat(t)}function wt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}Nt.prototype.build=function(t){if(this.options.preserveOrder)return ut(t,this.options);{Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t});const e=new k;return this.j2x(t,0,e).val}},Nt.prototype.j2x=function(t,e,i){let r="",n="";const s=this.options.jPath?i.toString():i,o=this.checkStopNode(i);for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a))if(void 0===t[a])this.isAttribute(a)&&(n+="");else if(null===t[a])this.isAttribute(a)||a===this.options.cdataPropName?n+="":"?"===a[0]?n+=this.indentate(e)+"<"+a+"?"+this.tagEndChar:n+=this.indentate(e)+"<"+a+"/"+this.tagEndChar;else if(t[a]instanceof Date)n+=this.buildTextValNode(t[a],a,"",e,i);else if("object"!=typeof t[a]){const h=this.isAttribute(a);if(h&&!this.ignoreAttributesFn(h,s))r+=this.buildAttrPairStr(h,""+t[a],o);else if(!h)if(a===this.options.textNodeName){let e=this.options.tagValueProcessor(a,""+t[a]);n+=this.replaceEntitiesValue(e)}else{i.push(a);const r=this.checkStopNode(i);if(i.pop(),r){const i=""+t[a];n+=""===i?this.indentate(e)+"<"+a+this.closeTag(a)+this.tagEndChar:this.indentate(e)+"<"+a+">"+i+""+t+"${t}`;else if("object"==typeof t&&null!==t){const r=this.buildRawContent(t),n=this.buildAttributesForStopNode(t);e+=""===r?`<${i}${n}/>`:`<${i}${n}>${r}`}}else if("object"==typeof r&&null!==r){const t=this.buildRawContent(r),n=this.buildAttributesForStopNode(r);e+=""===t?`<${i}${n}/>`:`<${i}${n}>${t}`}else e+=`<${i}>${r}`}return e},Nt.prototype.buildAttributesForStopNode=function(t){if(!t||"object"!=typeof t)return"";let e="";if(this.options.attributesGroupName&&t[this.options.attributesGroupName]){const i=t[this.options.attributesGroupName];for(let t in i){if(!Object.prototype.hasOwnProperty.call(i,t))continue;const r=t.startsWith(this.options.attributeNamePrefix)?t.substring(this.options.attributeNamePrefix.length):t,n=i[t];!0===n&&this.options.suppressBooleanAttributes?e+=" "+r:e+=" "+r+'="'+n+'"'}}else for(let i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;const r=this.isAttribute(i);if(r){const n=t[i];!0===n&&this.options.suppressBooleanAttributes?e+=" "+r:e+=" "+r+'="'+n+'"'}}return e},Nt.prototype.buildObjectNode=function(t,e,i,r){if(""===t)return"?"===e[0]?this.indentate(r)+"<"+e+i+"?"+this.tagEndChar:this.indentate(r)+"<"+e+i+this.closeTag(e)+this.tagEndChar;{let n=""+t+n}},Nt.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>`+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(r)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(r)+"<"+e+i+"?"+this.tagEndChar;{let n=this.options.tagValueProcessor(e,t);return n=this.replaceEntitiesValue(n),""===n?this.indentate(r)+"<"+e+i+this.closeTag(e)+this.tagEndChar:this.indentate(r)+"<"+e+i+">"+n+"0&&this.options.processEntities)for(let e=0;e {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\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';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(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\nexport const isName = function (string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n","'use strict';\n\nimport { getAllMatches, isName } from './util.js';\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\");\nexport function validate(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 if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' has not been opened.\", 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 = 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 (!Object.prototype.hasOwnProperty.call(attrNames, 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 isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return 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","export const 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 eNotation: 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 ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function (tagName, jPath, attrs) {\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n maxNestedTags: 100,\n strictReservedNames: true,\n jPath: true, // if true, pass jPath string to callbacks; if false, pass matcher instance\n};\n\n/**\n * Normalizes processEntities option for backward compatibility\n * @param {boolean|object} value \n * @returns {object} Always returns normalized object\n */\nfunction normalizeProcessEntities(value) {\n // Boolean backward compatibility\n if (typeof value === 'boolean') {\n return {\n enabled: value, // true or false\n maxEntitySize: 10000,\n maxExpansionDepth: 10,\n maxTotalExpansions: 1000,\n maxExpandedLength: 100000,\n maxEntityCount: 100,\n allowedTags: null,\n tagFilter: null\n };\n }\n\n // Object config - merge with defaults\n if (typeof value === 'object' && value !== null) {\n return {\n enabled: value.enabled !== false, // default true if not specified\n maxEntitySize: value.maxEntitySize ?? 10000,\n maxExpansionDepth: value.maxExpansionDepth ?? 10,\n maxTotalExpansions: value.maxTotalExpansions ?? 1000,\n maxExpandedLength: value.maxExpandedLength ?? 100000,\n maxEntityCount: value.maxEntityCount ?? 100,\n allowedTags: value.allowedTags ?? null,\n tagFilter: value.tagFilter ?? null\n };\n }\n\n // Default to enabled with limits\n return normalizeProcessEntities(true);\n}\n\nexport const buildOptions = function (options) {\n const built = Object.assign({}, defaultOptions, options);\n\n // Always normalize processEntities for backward compatibility and validation\n built.processEntities = normalizeProcessEntities(built.processEntities);\n\n // Convert old-style stopNodes for backward compatibility\n if (built.stopNodes && Array.isArray(built.stopNodes)) {\n built.stopNodes = built.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Old syntax: *.tagname meant \"tagname anywhere\"\n // Convert to new syntax: ..tagname\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n //console.debug(built.processEntities)\n return built;\n};","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = Object.create(null); //attributes map\n }\n add(key, val) {\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if (key === \"__proto__\") key = \"#__proto__\";\n this.child.push({ [key]: val });\n }\n addChild(node, startIndex) {\n if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\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 // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import { isName } from '../util.js';\n\nexport default class DocTypeReader {\n constructor(options) {\n this.suppressValidationErr = !options;\n this.options = options;\n }\n\n readDocType(xmlData, i) {\n const entities = Object.create(null);\n let entityCount = 0;\n\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 i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === '<' && !comment) { //Determine the tag type\n if (hasBody && hasSeq(xmlData, \"!ENTITY\", i)) {\n i += 7;\n let entityName, val;\n [entityName, val, i] = this.readEntityExp(xmlData, i + 1, this.suppressValidationErr);\n if (val.indexOf(\"&\") === -1) { //Parameter entities are not supported\n if (this.options.enabled !== false &&\n this.options.maxEntityCount &&\n entityCount >= this.options.maxEntityCount) {\n throw new Error(\n `Entity count (${entityCount + 1}) exceeds maximum allowed (${this.options.maxEntityCount})`\n );\n }\n const escaped = entityName.replace(/[.\\-+*:]/g, '\\\\.');\n entities[entityName] = {\n regx: RegExp(`&${escaped};`, \"g\"),\n val: val\n };\n entityCount++;\n }\n }\n else if (hasBody && hasSeq(xmlData, \"!ELEMENT\", i)) {\n i += 8;//Not supported\n const { index } = this.readElementExp(xmlData, i + 1);\n i = index;\n } else if (hasBody && hasSeq(xmlData, \"!ATTLIST\", i)) {\n i += 8;//Not supported\n // const {index} = this.readAttlistExp(xmlData,i+1);\n // i = index;\n } else if (hasBody && hasSeq(xmlData, \"!NOTATION\", i)) {\n i += 9;//Not supported\n const { index } = this.readNotationExp(xmlData, i + 1, this.suppressValidationErr);\n i = index;\n } else if (hasSeq(xmlData, \"!--\", i)) comment = true;\n else throw new Error(`Invalid DOCTYPE`);\n\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === '>') { //Read tag content\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\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 readEntityExp(xmlData, i) {\n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after this.options.maxEntitySize) {\n throw new Error(\n `Entity \"${entityName}\" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`\n );\n }\n\n i--;\n return [entityName, entityValue, i];\n }\n\n readNotationExp(xmlData, i) {\n // Skip leading whitespace after \n // \n // \n // \n // \n\n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq, i) {\n for (let j = 0; j < seq.length; j++) {\n if (seq[j] !== data[i + j + 1]) return false;\n }\n return true;\n}\n\nfunction validateEntityName(name) {\n if (isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/;\n// const octRegex = /^0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n \nconst consider = {\n hex : true,\n // oct: false,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true,\n //skipLike: /regex/\n};\n\nexport default function toNumber(str, options = {}){\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n \n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if(str===\"0\") return 0;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return parse_int(trimmedStr, 16);\n // }else if (options.oct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n }else if (trimmedStr.includes('e') || trimmedStr.includes('E')) { //eNotation\n return resolveEnotation(str,trimmedStr,options);\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 // +00.123 => [ , '+', '00', '.123', ..\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 const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length+1] === \".\" \n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if(!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1 \n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))){\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if( num === 0) return num;\n if(parsedStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n if(parsedStr === \"0\") return num; //0.0\n else if(parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n \n let n = leadingZeros? numTrimmedByZeros : trimmedStr;\n if(leadingZeros){\n // -009 => -9\n return (n === parsedStr) || (sign+n === parsedStr) ? num : str\n }else {\n // +9\n return (n === parsedStr) || (n === sign+parsedStr) ? num : str\n }\n }\n }else{ //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str,trimmedStr,options){\n if(!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx); \n if(notation){\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length+1] === eChar \n : str[leadingZeros.length] === eChar;\n\n if(leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if(leadingZeros.length === 1 \n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)){\n return Number(trimmedStr);\n }else if(options.leadingZeros && !eAdjacentToLeadingZeros){ //accept with leading zeros\n //remove leading 0s\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n }else return str;\n }else{\n return str;\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.substring(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base){\n //polyfill\n if(parseInt) return parseInt(numStr, base);\n else if(Number.parseInt) return Number.parseInt(numStr, base);\n else if(window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}","/**\n * Expression - Parses and stores a tag pattern expression\n * \n * Patterns are parsed once and stored in an optimized structure for fast matching.\n * \n * @example\n * const expr = new Expression(\"root.users.user\");\n * const expr2 = new Expression(\"..user[id]:first\");\n * const expr3 = new Expression(\"root/users/user\", { separator: '/' });\n */\nexport default class Expression {\n /**\n * Create a new Expression\n * @param {string} pattern - Pattern string (e.g., \"root.users.user\", \"..user[id]\")\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Path separator (default: '.')\n */\n constructor(pattern, options = {}) {\n this.pattern = pattern;\n this.separator = options.separator || '.';\n this.segments = this._parse(pattern);\n\n // Cache expensive checks for performance (O(1) instead of O(n))\n this._hasDeepWildcard = this.segments.some(seg => seg.type === 'deep-wildcard');\n this._hasAttributeCondition = this.segments.some(seg => seg.attrName !== undefined);\n this._hasPositionSelector = this.segments.some(seg => seg.position !== undefined);\n }\n\n /**\n * Parse pattern string into segments\n * @private\n * @param {string} pattern - Pattern to parse\n * @returns {Array} Array of segment objects\n */\n _parse(pattern) {\n const segments = [];\n\n // Split by separator but handle \"..\" specially\n let i = 0;\n let currentPart = '';\n\n while (i < pattern.length) {\n if (pattern[i] === this.separator) {\n // Check if next char is also separator (deep wildcard)\n if (i + 1 < pattern.length && pattern[i + 1] === this.separator) {\n // Flush current part if any\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n currentPart = '';\n }\n // Add deep wildcard\n segments.push({ type: 'deep-wildcard' });\n i += 2; // Skip both separators\n } else {\n // Regular separator\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n currentPart = '';\n i++;\n }\n } else {\n currentPart += pattern[i];\n i++;\n }\n }\n\n // Flush remaining part\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n\n return segments;\n }\n\n /**\n * Parse a single segment\n * @private\n * @param {string} part - Segment string (e.g., \"user\", \"ns::user\", \"user[id]\", \"ns::user:first\")\n * @returns {Object} Segment object\n */\n _parseSegment(part) {\n const segment = { type: 'tag' };\n\n // NEW NAMESPACE SYNTAX (v2.0):\n // ============================\n // Namespace uses DOUBLE colon (::)\n // Position uses SINGLE colon (:)\n // \n // Examples:\n // \"user\" → tag\n // \"user:first\" → tag + position\n // \"user[id]\" → tag + attribute\n // \"user[id]:first\" → tag + attribute + position\n // \"ns::user\" → namespace + tag\n // \"ns::user:first\" → namespace + tag + position\n // \"ns::user[id]\" → namespace + tag + attribute\n // \"ns::user[id]:first\" → namespace + tag + attribute + position\n // \"ns::first\" → namespace + tag named \"first\" (NO ambiguity!)\n //\n // This eliminates all ambiguity:\n // :: = namespace separator\n // : = position selector\n // [] = attributes\n\n // Step 1: Extract brackets [attr] or [attr=value]\n let bracketContent = null;\n let withoutBrackets = part;\n\n const bracketMatch = part.match(/^([^\\[]+)(\\[[^\\]]*\\])(.*)$/);\n if (bracketMatch) {\n withoutBrackets = bracketMatch[1] + bracketMatch[3];\n if (bracketMatch[2]) {\n const content = bracketMatch[2].slice(1, -1);\n if (content) {\n bracketContent = content;\n }\n }\n }\n\n // Step 2: Check for namespace (double colon ::)\n let namespace = undefined;\n let tagAndPosition = withoutBrackets;\n\n if (withoutBrackets.includes('::')) {\n const nsIndex = withoutBrackets.indexOf('::');\n namespace = withoutBrackets.substring(0, nsIndex).trim();\n tagAndPosition = withoutBrackets.substring(nsIndex + 2).trim(); // Skip ::\n\n if (!namespace) {\n throw new Error(`Invalid namespace in pattern: ${part}`);\n }\n }\n\n // Step 3: Parse tag and position (single colon :)\n let tag = undefined;\n let positionMatch = null;\n\n if (tagAndPosition.includes(':')) {\n const colonIndex = tagAndPosition.lastIndexOf(':'); // Use last colon for position\n const tagPart = tagAndPosition.substring(0, colonIndex).trim();\n const posPart = tagAndPosition.substring(colonIndex + 1).trim();\n\n // Verify position is a valid keyword\n const isPositionKeyword = ['first', 'last', 'odd', 'even'].includes(posPart) ||\n /^nth\\(\\d+\\)$/.test(posPart);\n\n if (isPositionKeyword) {\n tag = tagPart;\n positionMatch = posPart;\n } else {\n // Not a valid position keyword, treat whole thing as tag\n tag = tagAndPosition;\n }\n } else {\n tag = tagAndPosition;\n }\n\n if (!tag) {\n throw new Error(`Invalid segment pattern: ${part}`);\n }\n\n segment.tag = tag;\n if (namespace) {\n segment.namespace = namespace;\n }\n\n // Step 4: Parse attributes\n if (bracketContent) {\n if (bracketContent.includes('=')) {\n const eqIndex = bracketContent.indexOf('=');\n segment.attrName = bracketContent.substring(0, eqIndex).trim();\n segment.attrValue = bracketContent.substring(eqIndex + 1).trim();\n } else {\n segment.attrName = bracketContent.trim();\n }\n }\n\n // Step 5: Parse position selector\n if (positionMatch) {\n const nthMatch = positionMatch.match(/^nth\\((\\d+)\\)$/);\n if (nthMatch) {\n segment.position = 'nth';\n segment.positionValue = parseInt(nthMatch[1], 10);\n } else {\n segment.position = positionMatch;\n }\n }\n\n return segment;\n }\n\n /**\n * Get the number of segments\n * @returns {number}\n */\n get length() {\n return this.segments.length;\n }\n\n /**\n * Check if expression contains deep wildcard\n * @returns {boolean}\n */\n hasDeepWildcard() {\n return this._hasDeepWildcard;\n }\n\n /**\n * Check if expression has attribute conditions\n * @returns {boolean}\n */\n hasAttributeCondition() {\n return this._hasAttributeCondition;\n }\n\n /**\n * Check if expression has position selectors\n * @returns {boolean}\n */\n hasPositionSelector() {\n return this._hasPositionSelector;\n }\n\n /**\n * Get string representation\n * @returns {string}\n */\n toString() {\n return this.pattern;\n }\n}","/**\n * Matcher - Tracks current path in XML/JSON tree and matches against Expressions\n * \n * The matcher maintains a stack of nodes representing the current path from root to\n * current tag. It only stores attribute values for the current (top) node to minimize\n * memory usage. Sibling tracking is used to auto-calculate position and counter.\n * \n * @example\n * const matcher = new Matcher();\n * matcher.push(\"root\", {});\n * matcher.push(\"users\", {});\n * matcher.push(\"user\", { id: \"123\", type: \"admin\" });\n * \n * const expr = new Expression(\"root.users.user\");\n * matcher.matches(expr); // true\n */\nexport default class Matcher {\n /**\n * Create a new Matcher\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Default path separator (default: '.')\n */\n constructor(options = {}) {\n this.separator = options.separator || '.';\n this.path = [];\n this.siblingStacks = [];\n // Each path node: { tag: string, values: object, position: number, counter: number }\n // values only present for current (last) node\n // Each siblingStacks entry: Map tracking occurrences at each level\n }\n\n /**\n * Push a new tag onto the path\n * @param {string} tagName - Name of the tag\n * @param {Object} attrValues - Attribute key-value pairs for current node (optional)\n * @param {string} namespace - Namespace for the tag (optional)\n */\n push(tagName, attrValues = null, namespace = null) {\n // Remove values from previous current node (now becoming ancestor)\n if (this.path.length > 0) {\n const prev = this.path[this.path.length - 1];\n prev.values = undefined;\n }\n\n // Get or create sibling tracking for current level\n const currentLevel = this.path.length;\n if (!this.siblingStacks[currentLevel]) {\n this.siblingStacks[currentLevel] = new Map();\n }\n\n const siblings = this.siblingStacks[currentLevel];\n\n // Create a unique key for sibling tracking that includes namespace\n const siblingKey = namespace ? `${namespace}:${tagName}` : tagName;\n\n // Calculate counter (how many times this tag appeared at this level)\n const counter = siblings.get(siblingKey) || 0;\n\n // Calculate position (total children at this level so far)\n let position = 0;\n for (const count of siblings.values()) {\n position += count;\n }\n\n // Update sibling count for this tag\n siblings.set(siblingKey, counter + 1);\n\n // Create new node\n const node = {\n tag: tagName,\n position: position,\n counter: counter\n };\n\n // Store namespace if provided\n if (namespace !== null && namespace !== undefined) {\n node.namespace = namespace;\n }\n\n // Store values only for current node\n if (attrValues !== null && attrValues !== undefined) {\n node.values = attrValues;\n }\n\n this.path.push(node);\n }\n\n /**\n * Pop the last tag from the path\n * @returns {Object|undefined} The popped node\n */\n pop() {\n if (this.path.length === 0) {\n return undefined;\n }\n\n const node = this.path.pop();\n\n // Clean up sibling tracking for levels deeper than current\n // After pop, path.length is the new depth\n // We need to clean up siblingStacks[path.length + 1] and beyond\n if (this.siblingStacks.length > this.path.length + 1) {\n this.siblingStacks.length = this.path.length + 1;\n }\n\n return node;\n }\n\n /**\n * Update current node's attribute values\n * Useful when attributes are parsed after push\n * @param {Object} attrValues - Attribute values\n */\n updateCurrent(attrValues) {\n if (this.path.length > 0) {\n const current = this.path[this.path.length - 1];\n if (attrValues !== null && attrValues !== undefined) {\n current.values = attrValues;\n }\n }\n }\n\n /**\n * Get current tag name\n * @returns {string|undefined}\n */\n getCurrentTag() {\n return this.path.length > 0 ? this.path[this.path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n return this.path.length > 0 ? this.path[this.path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value\n * @param {string} attrName - Attribute name\n * @returns {*} Attribute value or undefined\n */\n getAttrValue(attrName) {\n if (this.path.length === 0) return undefined;\n const current = this.path[this.path.length - 1];\n return current.values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute\n * @param {string} attrName - Attribute name\n * @returns {boolean}\n */\n hasAttr(attrName) {\n if (this.path.length === 0) return false;\n const current = this.path[this.path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent)\n * @returns {number}\n */\n getPosition() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name)\n * @returns {number}\n */\n getCounter() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition for backward compatibility)\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth\n * @returns {number}\n */\n getDepth() {\n return this.path.length;\n }\n\n /**\n * Get path as string\n * @param {string} separator - Optional separator (uses default if not provided)\n * @param {boolean} includeNamespace - Whether to include namespace in output (default: true)\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n const sep = separator || this.separator;\n return this.path.map(n => {\n if (includeNamespace && n.namespace) {\n return `${n.namespace}:${n.tag}`;\n }\n return n.tag;\n }).join(sep);\n }\n\n /**\n * Get path as array of tag names\n * @returns {string[]}\n */\n toArray() {\n return this.path.map(n => n.tag);\n }\n\n /**\n * Reset the path to empty\n */\n reset() {\n this.path = [];\n this.siblingStacks = [];\n }\n\n /**\n * Match current path against an Expression\n * @param {Expression} expression - The expression to match against\n * @returns {boolean} True if current path matches the expression\n */\n matches(expression) {\n const segments = expression.segments;\n\n if (segments.length === 0) {\n return false;\n }\n\n // Handle deep wildcard patterns\n if (expression.hasDeepWildcard()) {\n return this._matchWithDeepWildcard(segments);\n }\n\n // Simple path matching (no deep wildcards)\n return this._matchSimple(segments);\n }\n\n /**\n * Match simple path (no deep wildcards)\n * @private\n */\n _matchSimple(segments) {\n // Path must be same length as segments\n if (this.path.length !== segments.length) {\n return false;\n }\n\n // Match each segment bottom-to-top\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const node = this.path[i];\n const isCurrentNode = (i === this.path.length - 1);\n\n if (!this._matchSegment(segment, node, isCurrentNode)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Match path with deep wildcards\n * @private\n */\n _matchWithDeepWildcard(segments) {\n let pathIdx = this.path.length - 1; // Start from current node (bottom)\n let segIdx = segments.length - 1; // Start from last segment\n\n while (segIdx >= 0 && pathIdx >= 0) {\n const segment = segments[segIdx];\n\n if (segment.type === 'deep-wildcard') {\n // \"..\" matches zero or more levels\n segIdx--;\n\n if (segIdx < 0) {\n // Pattern ends with \"..\", always matches\n return true;\n }\n\n // Find where next segment matches in the path\n const nextSeg = segments[segIdx];\n let found = false;\n\n for (let i = pathIdx; i >= 0; i--) {\n const isCurrentNode = (i === this.path.length - 1);\n if (this._matchSegment(nextSeg, this.path[i], isCurrentNode)) {\n pathIdx = i - 1;\n segIdx--;\n found = true;\n break;\n }\n }\n\n if (!found) {\n return false;\n }\n } else {\n // Regular segment\n const isCurrentNode = (pathIdx === this.path.length - 1);\n if (!this._matchSegment(segment, this.path[pathIdx], isCurrentNode)) {\n return false;\n }\n pathIdx--;\n segIdx--;\n }\n }\n\n // All segments must be consumed\n return segIdx < 0;\n }\n\n /**\n * Match a single segment against a node\n * @private\n * @param {Object} segment - Segment from Expression\n * @param {Object} node - Node from path\n * @param {boolean} isCurrentNode - Whether this is the current (last) node\n * @returns {boolean}\n */\n _matchSegment(segment, node, isCurrentNode) {\n // Match tag name (* is wildcard)\n if (segment.tag !== '*' && segment.tag !== node.tag) {\n return false;\n }\n\n // Match namespace if specified in segment\n if (segment.namespace !== undefined) {\n // Segment has namespace - node must match it\n if (segment.namespace !== '*' && segment.namespace !== node.namespace) {\n return false;\n }\n }\n // If segment has no namespace, it matches nodes with or without namespace\n\n // Match attribute name (check if node has this attribute)\n // Can only check for current node since ancestors don't have values\n if (segment.attrName !== undefined) {\n if (!isCurrentNode) {\n // Can't check attributes for ancestor nodes (values not stored)\n return false;\n }\n\n if (!node.values || !(segment.attrName in node.values)) {\n return false;\n }\n\n // Match attribute value (only possible for current node)\n if (segment.attrValue !== undefined) {\n const actualValue = node.values[segment.attrName];\n // Both should be strings\n if (String(actualValue) !== String(segment.attrValue)) {\n return false;\n }\n }\n }\n\n // Match position (only for current node)\n if (segment.position !== undefined) {\n if (!isCurrentNode) {\n // Can't check position for ancestor nodes\n return false;\n }\n\n const counter = node.counter ?? 0;\n\n if (segment.position === 'first' && counter !== 0) {\n return false;\n } else if (segment.position === 'odd' && counter % 2 !== 1) {\n return false;\n } else if (segment.position === 'even' && counter % 2 !== 0) {\n return false;\n } else if (segment.position === 'nth') {\n if (counter !== segment.positionValue) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Create a snapshot of current state\n * @returns {Object} State snapshot\n */\n snapshot() {\n return {\n path: this.path.map(node => ({ ...node })),\n siblingStacks: this.siblingStacks.map(map => new Map(map))\n };\n }\n\n /**\n * Restore state from snapshot\n * @param {Object} snapshot - State snapshot\n */\n restore(snapshot) {\n this.path = snapshot.path.map(node => ({ ...node }));\n this.siblingStacks = snapshot.siblingStacks.map(map => new Map(map));\n }\n}","'use strict';\n///@ts-check\n\nimport { getAllMatches, isExist } from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\n\n\n// const 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\n// Helper functions for attribute and namespace handling\n\n/**\n * Extract raw attributes (without prefix) from prefixed attribute map\n * @param {object} prefixedAttrs - Attributes with prefix from buildAttributesMap\n * @param {object} options - Parser options containing attributeNamePrefix\n * @returns {object} Raw attributes for matcher\n */\nfunction extractRawAttributes(prefixedAttrs, options) {\n if (!prefixedAttrs) return {};\n\n // Handle attributesGroupName option\n const attrs = options.attributesGroupName\n ? prefixedAttrs[options.attributesGroupName]\n : prefixedAttrs;\n\n if (!attrs) return {};\n\n const rawAttrs = {};\n for (const key in attrs) {\n // Remove the attribute prefix to get raw name\n if (key.startsWith(options.attributeNamePrefix)) {\n const rawName = key.substring(options.attributeNamePrefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * Extract namespace from raw tag name\n * @param {string} rawTagName - Tag name possibly with namespace (e.g., \"soap:Envelope\")\n * @returns {string|undefined} Namespace or undefined\n */\nfunction extractNamespace(rawTagName) {\n if (!rawTagName || typeof rawTagName !== 'string') return undefined;\n\n const colonIndex = rawTagName.indexOf(':');\n if (colonIndex !== -1 && colonIndex > 0) {\n const ns = rawTagName.substring(0, colonIndex);\n // Don't treat xmlns as a namespace\n if (ns !== 'xmlns') {\n return ns;\n }\n }\n return undefined;\n}\n\nexport default class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\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.ampEntity = { regex: /&(amp|#38|#x26);/g, val: \"&\" };\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 \"num_dec\": { regex: /&#([0-9]{1,7});/g, val: (_, str) => fromCodePoint(str, 10, \"&#\") },\n \"num_hex\": { regex: /&#x([0-9a-fA-F]{1,6});/g, val: (_, str) => fromCodePoint(str, 16, \"&#x\") },\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 this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n // Initialize path matcher for path-expression-matcher\n this.matcher = new Matcher();\n\n // Flag to track if current node is a stop node (optimization)\n this.isCurrentNodeStopNode = false;\n\n // Pre-compile stopNodes expressions\n if (this.options.stopNodes && this.options.stopNodes.length > 0) {\n this.stopNodeExpressions = [];\n for (let i = 0; i < this.options.stopNodes.length; i++) {\n const stopNodeExp = this.options.stopNodes[i];\n if (typeof stopNodeExp === 'string') {\n // Convert string to Expression object\n this.stopNodeExpressions.push(new Expression(stopNodeExp));\n } else if (stopNodeExp instanceof Expression) {\n // Already an Expression object\n this.stopNodeExpressions.push(stopNodeExp);\n }\n }\n }\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 const escaped = ent.replace(/[.\\-+*:]/g, '\\\\.');\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\" + escaped + \";\", \"g\"),\n val: externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.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, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const newval = this.options.tagValueProcessor(tagName, val, jPathOrMatcher, 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, tagName) {\n if (this.options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n\n // First pass: parse all attributes and update matcher with raw values\n // This ensures the matcher has all attribute values when processors run\n const rawAttrsForMatcher = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n const oldVal = matches[i][4];\n\n if (attrName.length && oldVal !== undefined) {\n let parsedVal = oldVal;\n if (this.options.trimValues) {\n parsedVal = parsedVal.trim();\n }\n parsedVal = this.replaceEntitiesValue(parsedVal, tagName, jPath);\n rawAttrsForMatcher[attrName] = parsedVal;\n }\n }\n\n // Update matcher with raw attribute values BEFORE running processors\n if (Object.keys(rawAttrsForMatcher).length > 0 && typeof jPath === 'object' && jPath.updateCurrent) {\n jPath.updateCurrent(rawAttrsForMatcher);\n }\n\n // Second pass: now process attributes with matcher having full attribute context\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n\n // Convert jPath to string if needed for ignoreAttributesFn\n const jPathStr = this.options.jPath ? jPath.toString() : jPath;\n if (this.ignoreAttributesFn(attrName, jPathStr)) {\n continue\n }\n\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if (aName === \"__proto__\") aName = \"#__proto__\";\n\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPathOrMatcher);\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\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\n // Reset matcher for new document\n this.matcher.reset();\n\n // Reset entity expansion counters for this document\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n const docTypeReader = new DocTypeReader(this.options.processEntities);\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 (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, this.matcher);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = this.matcher.getCurrentTag();\n if (tagName && this.options.unpairedTags.indexOf(tagName) !== -1) {\n throw new Error(`Unpaired tag can not be used as closing tag: `);\n }\n if (lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1) {\n // Pop the unpaired tag\n this.matcher.pop();\n this.tagsNodeStack.pop();\n }\n // Pop the closing tag\n this.matcher.pop();\n this.isCurrentNodeStopNode = false; // Reset flag when closing tag\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if (xmlData[i + 1] === '?') {\n\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, this.matcher);\n if ((this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags) {\n //do nothing\n } else {\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, this.matcher, tagData.tagName);\n }\n this.addChild(currentNode, childNode, this.matcher, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if (xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"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, this.matcher);\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 = docTypeReader.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, this.matcher);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, this.matcher, true, false, true, true);\n if (val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if (this.options.cdataPropName) {\n currentNode.add(this.options.cdataPropName, [{ [this.options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(this.options.textNodeName, val);\n }\n\n i = closeIndex + 2;\n } else {//Opening tag\n let result = readTagExp(xmlData, i, this.options.removeNSPrefix);\n\n // Safety check: readTagExp can return undefined\n if (!result) {\n // Log context for debugging\n const context = xmlData.substring(Math.max(0, i - 50), Math.min(xmlData.length, i + 50));\n throw new Error(`readTagExp returned undefined at position ${i}. Context: \"${context}\"`);\n }\n\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n //console.log(tagExp, tagName)\n const newTagName = this.options.transformTagName(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n if (this.options.strictReservedNames &&\n (tagName === this.options.commentPropName\n || tagName === this.options.cdataPropName\n )) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\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, this.matcher, false);\n }\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 this.matcher.pop();\n }\n\n // Clean up self-closing syntax BEFORE processing attributes\n // This is where tagExp gets the trailing / removed\n let isSelfClosing = false;\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n isSelfClosing = true;\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n // Re-check attrExpPresent after cleaning\n attrExpPresent = (tagName !== tagExp);\n }\n\n // Now process attributes with CLEAN tagExp (no trailing /)\n let prefixedAttrs = null;\n let rawAttrs = {};\n let namespace = undefined;\n\n // Extract namespace from rawTagName\n namespace = extractNamespace(rawTagName);\n\n // Push tag to matcher FIRST (with empty attrs for now) so callbacks see correct path\n if (tagName !== xmlObj.tagname) {\n this.matcher.push(tagName, {}, namespace);\n }\n\n // Now build attributes - callbacks will see correct matcher state\n if (tagName !== tagExp && attrExpPresent) {\n // Build attributes (returns prefixed attributes for the tree)\n // Note: buildAttributesMap now internally updates the matcher with raw attributes\n prefixedAttrs = this.buildAttributesMap(tagExp, this.matcher, tagName);\n\n if (prefixedAttrs) {\n // Extract raw attributes (without prefix) for our use\n rawAttrs = extractRawAttributes(prefixedAttrs, this.options);\n }\n }\n\n // Now check if this is a stop node (after attributes are set)\n if (tagName !== xmlObj.tagname) {\n this.isCurrentNodeStopNode = this.isItStopNode(this.stopNodeExpressions, this.matcher);\n }\n\n const startIndex = i;\n if (this.isCurrentNodeStopNode) {\n let tagContent = \"\";\n\n // For self-closing tags, content is empty\n if (isSelfClosing) {\n i = result.closeIndex;\n }\n //unpaired tag\n else if (this.options.unpairedTags.indexOf(tagName) !== -1) {\n i = result.closeIndex;\n }\n //normal tag\n else {\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n\n // For stop nodes, store raw content as-is without any processing\n childNode.add(this.options.textNodeName, tagContent);\n\n this.matcher.pop(); // Pop the stop node tag\n this.isCurrentNodeStopNode = false; // Reset flag\n\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n } else {\n //selfClosing tag\n if (isSelfClosing) {\n if (this.options.transformTagName) {\n const newTagName = this.options.transformTagName(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n this.matcher.pop(); // Pop self-closing tag\n this.isCurrentNodeStopNode = false; // Reset flag\n }\n else if (this.options.unpairedTags.indexOf(tagName) !== -1) {//unpaired tag\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n this.matcher.pop(); // Pop unpaired tag\n this.isCurrentNodeStopNode = false; // Reset flag\n i = result.closeIndex;\n // Continue to next iteration without changing currentNode\n continue;\n }\n //opening tag\n else {\n const childNode = new xmlNode(tagName);\n if (this.tagsNodeStack.length > this.options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n this.tagsNodeStack.push(currentNode);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\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\nfunction addChild(currentNode, childNode, matcher, startIndex) {\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? matcher.toString() : matcher;\n const result = this.options.updateTag(childNode.tagname, jPathOrMatcher, childNode[\":@\"])\n if (result === false) {\n //do nothing\n } else if (typeof result === \"string\") {\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n } else {\n currentNode.addChild(childNode, startIndex);\n }\n}\n\n/**\n * @param {object} val - Entity object with regex and val properties\n * @param {string} tagName - Tag name\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n */\nfunction replaceEntitiesValue(val, tagName, jPath) {\n const entityConfig = this.options.processEntities;\n\n if (!entityConfig || !entityConfig.enabled) {\n return val;\n }\n\n // Check if tag is allowed to contain entities\n if (entityConfig.allowedTags) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const allowed = Array.isArray(entityConfig.allowedTags)\n ? entityConfig.allowedTags.includes(tagName)\n : entityConfig.allowedTags(tagName, jPathOrMatcher);\n\n if (!allowed) {\n return val;\n }\n }\n\n // Apply custom tag filter if provided\n if (entityConfig.tagFilter) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n if (!entityConfig.tagFilter(tagName, jPathOrMatcher)) {\n return val; // Skip based on custom filter\n }\n }\n\n // Replace DOCTYPE entities\n for (let entityName in this.docTypeEntities) {\n const entity = this.docTypeEntities[entityName];\n const matches = val.match(entity.regx);\n\n if (matches) {\n // Track expansions\n this.entityExpansionCount += matches.length;\n\n // Check expansion limit\n if (entityConfig.maxTotalExpansions &&\n this.entityExpansionCount > entityConfig.maxTotalExpansions) {\n throw new Error(\n `Entity expansion limit exceeded: ${this.entityExpansionCount} > ${entityConfig.maxTotalExpansions}`\n );\n }\n\n // Store length before replacement\n const lengthBefore = val.length;\n val = val.replace(entity.regx, entity.val);\n\n // Check expanded length immediately after replacement\n if (entityConfig.maxExpandedLength) {\n this.currentExpandedLength += (val.length - lengthBefore);\n\n if (this.currentExpandedLength > entityConfig.maxExpandedLength) {\n throw new Error(\n `Total expanded content size exceeded: ${this.currentExpandedLength} > ${entityConfig.maxExpandedLength}`\n );\n }\n }\n }\n }\n if (val.indexOf('&') === -1) return val; // Early exit\n\n // Replace standard entities\n for (let entityName in this.lastEntities) {\n const entity = this.lastEntities[entityName];\n val = val.replace(entity.regex, entity.val);\n }\n if (val.indexOf('&') === -1) return val; // Early exit\n\n // Replace HTML entities if enabled\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 // Replace ampersand entity last\n val = val.replace(this.ampEntity.regex, this.ampEntity.val);\n\n return val;\n}\n\n\nfunction saveTextToParentTag(textData, parentNode, matcher, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if (isLeafNode === undefined) isLeafNode = parentNode.child.length === 0\n\n textData = this.parseTextData(textData,\n parentNode.tagname,\n matcher,\n false,\n parentNode[\":@\"] ? Object.keys(parentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n parentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * @param {Array} stopNodeExpressions - Array of compiled Expression objects\n * @param {Matcher} matcher - Current path matcher\n */\nfunction isItStopNode(stopNodeExpressions, matcher) {\n if (!stopNodeExpressions || stopNodeExpressions.length === 0) return false;\n\n for (let i = 0; i < stopNodeExpressions.length; i++) {\n if (matcher.matches(stopNodeExpressions[i])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double 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.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\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 rawTagName: rawTagName,\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 // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n if (xmlData[i + 1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n }\n }\n }\n i = closeIndex;\n } else if (xmlData[i + 1] === '?') {\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 3) === '!--') {\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\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 (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix) {\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix + str + \";\";\n }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\nimport { Matcher } from 'path-expression-matcher';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * Helper function to strip attribute prefix from attribute map\n * @param {object} attrs - Attributes with prefix (e.g., {\"@_class\": \"code\"})\n * @param {string} prefix - Attribute prefix to remove (e.g., \"@_\")\n * @returns {object} Attributes without prefix (e.g., {\"class\": \"code\"})\n */\nfunction stripAttributePrefix(attrs, prefix) {\n if (!attrs || typeof attrs !== 'object') return {};\n if (!prefix) return attrs;\n\n const rawAttrs = {};\n for (const key in attrs) {\n if (key.startsWith(prefix)) {\n const rawName = key.substring(prefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns \n */\nexport default function prettify(node, options, matcher) {\n return compress(node, options, matcher);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns object\n */\nfunction compress(arr, options, matcher) {\n let text;\n const compressedObj = {}; //This is intended to be a plain object\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n\n // Push current property to matcher WITH RAW ATTRIBUTES (no prefix)\n if (property !== undefined && property !== options.textNodeName) {\n const rawAttrs = stripAttributePrefix(\n tagObj[\":@\"] || {},\n options.attributeNamePrefix\n );\n matcher.push(property, rawAttrs);\n }\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, matcher);\n const isLeaf = isLeafTag(val, options);\n\n if (tagObj[\":@\"]) {\n assignAttributes(val, tagObj[\":@\"], matcher, 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 (tagObj[METADATA_SYMBOL] !== undefined && typeof val === \"object\" && val !== null) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n\n if (compressedObj[property] !== undefined && Object.prototype.hasOwnProperty.call(compressedObj, property)) {\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\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? matcher.toString() : matcher;\n if (options.isArray(property, jPathOrMatcher, isLeaf)) {\n compressedObj[property] = [val];\n } else {\n compressedObj[property] = val;\n }\n }\n\n // Pop property from matcher after processing\n if (property !== undefined && property !== options.textNodeName) {\n matcher.pop();\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\n\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, matcher, 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]; // This is the PREFIXED name (e.g., \"@_class\")\n\n // Strip prefix for matcher path (for isArray callback)\n const rawAttrName = atrrName.startsWith(options.attributeNamePrefix)\n ? atrrName.substring(options.attributeNamePrefix.length)\n : atrrName;\n\n // For attributes, we need to create a temporary path\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath\n ? matcher.toString() + \".\" + rawAttrName\n : matcher;\n\n if (options.isArray(atrrName, jPathOrMatcher, 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 { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n\n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}","import { buildOptions } from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport { validate } from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class 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|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData !== \"string\" && xmlData.toString) {\n xmlData = xmlData.toString();\n } else if (typeof xmlData !== \"string\") {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n\n if (validationOption) {\n if (validationOption === true) validationOption = {}; //validate with default options\n\n const result = 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, orderedObjParser.matcher);\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 if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}\n","import { Expression, Matcher } from 'path-expression-matcher';\n\nconst EOL = \"\\n\";\n\n/**\n * \n * @param {array} jArray \n * @param {any} options \n * @returns \n */\nexport default function toXml(jArray, options) {\n let indentation = \"\";\n if (options.format && options.indentBy.length > 0) {\n indentation = EOL;\n }\n\n // Pre-compile stopNode expressions for pattern matching\n const stopNodeExpressions = [];\n if (options.stopNodes && Array.isArray(options.stopNodes)) {\n for (let i = 0; i < options.stopNodes.length; i++) {\n const node = options.stopNodes[i];\n if (typeof node === 'string') {\n stopNodeExpressions.push(new Expression(node));\n } else if (node instanceof Expression) {\n stopNodeExpressions.push(node);\n }\n }\n }\n\n // Initialize matcher for path tracking\n const matcher = new Matcher();\n\n return arrToStr(jArray, options, indentation, matcher, stopNodeExpressions);\n}\n\nfunction arrToStr(arr, options, indentation, matcher, stopNodeExpressions) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n\n\n if (!Array.isArray(arr)) {\n // Non-array values (e.g. string tag values) should be treated as text content\n if (arr !== undefined && arr !== null) {\n let text = arr.toString();\n text = replaceEntitiesValue(text, options);\n return text;\n }\n return \"\";\n }\n\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n if (tagName === undefined) continue;\n\n // Extract attributes from \":@\" property\n const attrValues = extractAttributeValues(tagObj[\":@\"], options);\n\n // Push tag to matcher WITH attributes\n matcher.push(tagName, attrValues);\n\n // Check if this is a stop node using Expression matching\n const isStopNode = checkStopNode(matcher, stopNodeExpressions);\n\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n matcher.pop();\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += ``;\n isPreviousElementTag = false;\n matcher.pop();\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + ``;\n isPreviousElementTag = true;\n matcher.pop();\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr = attr_to_str(tagObj[\":@\"], options, isStopNode);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\"; //remove extra spacing\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr}?>`;\n isPreviousElementTag = true;\n matcher.pop();\n continue;\n }\n\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n\n // Pass isStopNode to attr_to_str so attributes are also not processed for stopNodes\n const attStr = attr_to_str(tagObj[\":@\"], options, isStopNode);\n const tagStart = indentation + `<${tagName}${attStr}`;\n\n // If this is a stopNode, get raw content without processing\n let tagValue;\n if (isStopNode) {\n tagValue = getRawContent(tagObj[tagName], options);\n } else {\n tagValue = arrToStr(tagObj[tagName], options, newIdentation, matcher, stopNodeExpressions);\n }\n\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n else xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"`;\n }\n isPreviousElementTag = true;\n\n // Pop tag from matcher\n matcher.pop();\n }\n\n return xmlStr;\n}\n\n/**\n * Extract attribute values from the \":@\" object and return as plain object\n * for passing to matcher.push()\n */\nfunction extractAttributeValues(attrMap, options) {\n if (!attrMap || options.ignoreAttributes) return null;\n\n const attrValues = {};\n let hasAttrs = false;\n\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n // Remove the attribute prefix to get clean attribute name\n const cleanAttrName = attr.startsWith(options.attributeNamePrefix)\n ? attr.substr(options.attributeNamePrefix.length)\n : attr;\n attrValues[cleanAttrName] = attrMap[attr];\n hasAttrs = true;\n }\n\n return hasAttrs ? attrValues : null;\n}\n\n/**\n * Extract raw content from a stopNode without any processing\n * This preserves the content exactly as-is, including special characters\n */\nfunction getRawContent(arr, options) {\n if (!Array.isArray(arr)) {\n // Non-array values return as-is\n if (arr !== undefined && arr !== null) {\n return arr.toString();\n }\n return \"\";\n }\n\n let content = \"\";\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n const tagName = propName(item);\n\n if (tagName === options.textNodeName) {\n // Raw text content - NO processing, NO entity replacement\n content += item[tagName];\n } else if (tagName === options.cdataPropName) {\n // CDATA content\n content += item[tagName][0][options.textNodeName];\n } else if (tagName === options.commentPropName) {\n // Comment content\n content += item[tagName][0][options.textNodeName];\n } else if (tagName && tagName[0] === \"?\") {\n // Processing instruction - skip for stopNodes\n continue;\n } else if (tagName) {\n // Nested tags within stopNode\n // Recursively get raw content and reconstruct the tag\n // For stopNodes, we don't process attributes either\n const attStr = attr_to_str_raw(item[\":@\"], options);\n const nestedContent = getRawContent(item[tagName], options);\n\n if (!nestedContent || nestedContent.length === 0) {\n content += `<${tagName}${attStr}/>`;\n } else {\n content += `<${tagName}${attStr}>${nestedContent}`;\n }\n }\n }\n return content;\n}\n\n/**\n * Build attribute string for stopNodes - NO entity replacement\n */\nfunction attr_to_str_raw(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n // For stopNodes, use raw value without processing\n let attrVal = attrMap[attr];\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 propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n if (key !== \":@\") return key;\n }\n}\n\nfunction attr_to_str(attrMap, options, isStopNode) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n let attrVal;\n\n if (isStopNode) {\n // For stopNodes, use raw value without any processing\n attrVal = attrMap[attr];\n } else {\n // Normal processing: apply attributeValueProcessor and entity replacement\n attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n }\n\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 checkStopNode(matcher, stopNodeExpressions) {\n if (!stopNodeExpressions || stopNodeExpressions.length === 0) return false;\n\n for (let i = 0; i < stopNodeExpressions.length; i++) {\n if (matcher.matches(stopNodeExpressions[i])) {\n return true;\n }\n }\n return false;\n}\n\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}","'use strict';\n//parse Empty Node as self closing node\nimport buildFromOrderedJs from './orderedJs2Xml.js';\nimport getIgnoreAttributesFn from \"./ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\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 suppressUnpairedNode: true,\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: \"&\" },//it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \">\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"<\" },\n { regex: new RegExp(\"\\'\", \"g\"), val: \"'\" },\n { regex: new RegExp(\"\\\"\", \"g\"), val: \""\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false,\n jPath: true // When true, callbacks receive string jPath; when false, receive Matcher instance\n};\n\nexport default function Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n\n // Convert old-style stopNodes for backward compatibility\n // Old syntax: \"*.tag\" meant \"tag anywhere in tree\"\n // New syntax: \"..tag\" means \"tag anywhere in tree\"\n if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {\n this.options.stopNodes = this.options.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Convert old wildcard syntax to deep wildcard\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n\n // Pre-compile stopNode expressions for pattern matching\n this.stopNodeExpressions = [];\n if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {\n for (let i = 0; i < this.options.stopNodes.length; i++) {\n const node = this.options.stopNodes[i];\n if (typeof node === 'string') {\n this.stopNodeExpressions.push(new Expression(node));\n } else if (node instanceof Expression) {\n this.stopNodeExpressions.push(node);\n }\n }\n }\n\n if (this.options.ignoreAttributes === true || this.options.attributesGroupName) {\n this.isAttribute = function (/*a*/) {\n return false;\n };\n } else {\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\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\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 // Initialize matcher for path tracking\n const matcher = new Matcher();\n return this.j2x(jObj, 0, matcher).val;\n }\n};\n\nBuilder.prototype.j2x = function (jObj, level, matcher) {\n let attrStr = '';\n let val = '';\n\n // Get jPath based on option: string for backward compatibility, or Matcher for new features\n const jPath = this.options.jPath ? matcher.toString() : matcher;\n\n // Check if current node is a stopNode (will be used for attribute encoding)\n const isCurrentStopNode = this.checkStopNode(matcher);\n\n for (let key in jObj) {\n if (!Object.prototype.hasOwnProperty.call(jObj, key)) continue;\n if (typeof jObj[key] === 'undefined') {\n // supress undefined node only if it is not an attribute\n if (this.isAttribute(key)) {\n val += '';\n }\n } else if (jObj[key] === null) {\n // null attribute should be ignored by the attribute list, but should not cause the tag closing\n if (this.isAttribute(key)) {\n val += '';\n } else if (key === this.options.cdataPropName) {\n val += '';\n } else if (key[0] === '?') {\n val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n } else {\n val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n }\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (jObj[key] instanceof Date) {\n val += this.buildTextValNode(jObj[key], key, '', level, matcher);\n } else if (typeof jObj[key] !== 'object') {\n //premitive type\n const attr = this.isAttribute(key);\n if (attr && !this.ignoreAttributesFn(attr, jPath)) {\n attrStr += this.buildAttrPairStr(attr, '' + jObj[key], isCurrentStopNode);\n } else if (!attr) {\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 // Check if this is a stopNode before building\n matcher.push(key);\n const isStopNode = this.checkStopNode(matcher);\n matcher.pop();\n\n if (isStopNode) {\n // Build as raw content without encoding\n const textValue = '' + jObj[key];\n if (textValue === '') {\n val += this.indentate(level) + '<' + key + this.closeTag(key) + this.tagEndChar;\n } else {\n val += this.indentate(level) + '<' + key + '>' + textValue + '' + textValue + '${item}`;\n } else if (typeof item === 'object' && item !== null) {\n const nestedContent = this.buildRawContent(item);\n const nestedAttrs = this.buildAttributesForStopNode(item);\n if (nestedContent === '') {\n content += `<${key}${nestedAttrs}/>`;\n } else {\n content += `<${key}${nestedAttrs}>${nestedContent}`;\n }\n }\n }\n } else if (typeof value === 'object' && value !== null) {\n // Nested object\n const nestedContent = this.buildRawContent(value);\n const nestedAttrs = this.buildAttributesForStopNode(value);\n if (nestedContent === '') {\n content += `<${key}${nestedAttrs}/>`;\n } else {\n content += `<${key}${nestedAttrs}>${nestedContent}`;\n }\n } else {\n // Primitive value\n content += `<${key}>${value}`;\n }\n }\n\n return content;\n};\n\n// Build attribute string for stopNode (no entity encoding)\nBuilder.prototype.buildAttributesForStopNode = function (obj) {\n if (!obj || typeof obj !== 'object') return '';\n\n let attrStr = '';\n\n // Check for attributesGroupName (when attributes are grouped)\n if (this.options.attributesGroupName && obj[this.options.attributesGroupName]) {\n const attrGroup = obj[this.options.attributesGroupName];\n for (let attrKey in attrGroup) {\n if (!Object.prototype.hasOwnProperty.call(attrGroup, attrKey)) continue;\n const cleanKey = attrKey.startsWith(this.options.attributeNamePrefix)\n ? attrKey.substring(this.options.attributeNamePrefix.length)\n : attrKey;\n const val = attrGroup[attrKey];\n if (val === true && this.options.suppressBooleanAttributes) {\n attrStr += ' ' + cleanKey;\n } else {\n attrStr += ' ' + cleanKey + '=\"' + val + '\"'; // No encoding for stopNode\n }\n }\n } else {\n // Look for individual attributes\n for (let key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n const attr = this.isAttribute(key);\n if (attr) {\n const val = obj[key];\n if (val === true && this.options.suppressBooleanAttributes) {\n attrStr += ' ' + attr;\n } else {\n attrStr += ' ' + attr + '=\"' + val + '\"'; // No encoding for stopNode\n }\n }\n }\n }\n\n return attrStr;\n};\n\nBuilder.prototype.buildObjectNode = function (val, key, attrStr, level) {\n if (val === \"\") {\n if (key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;\n else {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n } else {\n\n let tagEndExp = '' + val + tagEndExp);\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `` + this.newLine;\n } else {\n return (\n this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar +\n val +\n this.indentate(level) + tagEndExp);\n }\n }\n}\n\nBuilder.prototype.closeTag = function (key) {\n let closeTag = \"\";\n if (this.options.unpairedTags.indexOf(key) !== -1) { //unpaired\n if (!this.options.suppressUnpairedNode) closeTag = \"/\"\n } else if (this.options.suppressEmptyNode) { //empty\n closeTag = \"/\";\n } else {\n closeTag = `>` + this.newLine;\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `` + this.newLine;\n } else if (key[0] === \"?\") {//PI tag\n return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;\n } else {\n // Normal processing: apply tagValueProcessor and entity replacement\n let textValue = this.options.tagValueProcessor(key, val);\n textValue = this.replaceEntitiesValue(textValue);\n\n if (textValue === '') {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n } else {\n return this.indentate(level) + '<' + key + attrStr + '>' +\n textValue +\n ' 0 && this.options.processEntities) {\n for (let i = 0; i < this.options.entities.length; i++) {\n const entity = this.options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\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) && name !== this.options.textNodeName) {\n return name.substr(this.attrPrefixLen);\n } else {\n return false;\n }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","// Re-export from fast-xml-builder for backward compatibility\nimport XMLBuilder from 'fast-xml-builder';\nexport default XMLBuilder;\n\n// If there are any named exports you also want to re-export:\nexport * from 'fast-xml-builder';","'use strict';\n\nimport { validate } from './validator.js';\nimport XMLParser from './xmlparser/XMLParser.js';\nimport XMLBuilder from './xmlbuilder/json2xml.js';\n\nconst XMLValidator = {\n validate: validate\n}\nexport {\n XMLParser,\n XMLValidator,\n XMLBuilder\n};"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","isName","defaultOptions","allowBooleanAttributes","unpairedTags","validate","xmlData","options","assign","tags","tagFound","reachedRoot","substr","i","readPI","err","isWhiteSpace","getErrorObject","getLineNumberForPosition","tagStartPos","readCommentAndCDATA","closingTag","tagName","trim","substring","validateTagName","result","readAttributeStr","attrStr","attrStrStart","isValid","validateAttributeString","code","msg","line","tagClosed","otg","pop","openPos","col","indexOf","afterAmp","validateAmpersand","JSON","stringify","map","t","replace","char","start","tagname","angleBracketsCount","doubleQuote","singleQuote","startChar","validAttrStrRegxp","attrNames","getPositionFromMatch","undefined","attrName","validateAttrName","re","validateNumberAmpersand","count","message","lineNumber","lines","split","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","val","attributeValueProcessor","stopNodes","alwaysCreateTextNode","isArray","commentPropName","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","maxNestedTags","strictReservedNames","normalizeProcessEntities","enabled","maxEntitySize","maxExpansionDepth","maxTotalExpansions","maxExpandedLength","maxEntityCount","allowedTags","tagFilter","_value$maxEntitySize","_value$maxExpansionDe","_value$maxTotalExpans","_value$maxExpandedLen","_value$maxEntityCount","_value$allowedTags","_value$tagFilter","METADATA_SYMBOL","buildOptions","built","Array","node","startsWith","XmlNode","child","create","_proto","add","_this$child$push","addChild","_this$child$push2","_this$child$push3","keys","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","entities","entityCount","Error","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","escaped","regx","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","toUpperCase","entityValue","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","elementName","contentModel","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","includes","defaultValue","_this$readIdentifierV5","data","seq","j","name","hexRegex","numRegex","consider","decimalPoint","eNotationRegx","Expression","constructor","pattern","separator","segments","_parse","_hasDeepWildcard","some","seg","_hasAttributeCondition","_hasPositionSelector","position","currentPart","_parseSegment","part","segment","bracketContent","withoutBrackets","bracketMatch","content","slice","namespace","tag","tagAndPosition","nsIndex","positionMatch","colonIndex","lastIndexOf","tagPart","posPart","eqIndex","attrValue","nthMatch","positionValue","parseInt","hasDeepWildcard","hasAttributeCondition","hasPositionSelector","toString","Matcher","path","siblingStacks","attrValues","values","currentLevel","Map","siblings","siblingKey","counter","set","updateCurrent","current","getCurrentTag","getCurrentNamespace","getAttrValue","hasAttr","getPosition","getCounter","getIndex","getDepth","includeNamespace","sep","n","toArray","reset","expression","_matchWithDeepWildcard","_matchSimple","isCurrentNode","_matchSegment","pathIdx","segIdx","nextSeg","found","actualValue","String","snapshot","restore","extractRawAttributes","prefixedAttrs","rawAttrs","extractNamespace","rawTagName","ns","OrderedObjParser","currentNode","tagsNodeStack","docTypeEntities","lastEntities","ampEntity","_","str","fromCodePoint","addExternalEntities","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","_step","_iterator","_createForOfIteratorHelperLoose","done","entityExpansionCount","currentExpandedLength","matcher","isCurrentNodeStopNode","stopNodeExpressions","stopNodeExp","externalEntities","entKeys","ent","dontTrim","hasAttributes","isLeafNode","escapeEntities","jPathOrMatcher","newval","parseValue","prefix","charAt","attrsRegx","rawAttrsForMatcher","oldVal","parsedVal","jPathStr","aName","newVal","attrCollection","xmlObj","xmlNode","textData","docTypeReader","closeIndex","findClosingIndex","lastTagName","tagData","readTagExp","childNode","tagExp","attrExpPresent","endIndex","_ref","_ref2","context","Math","max","min","newTagName","lastTag","isSelfClosing","tagContent","entityConfig","entity","lengthBefore","parentNode","errMsg","closingIndex","closingChar","attrBoundary","ch","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","shouldParse","trimmedStr","skipLike","numStr","Number","window","parse_int","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","toNumber","base","codePoint","stripAttributePrefix","prettify","compress","arr","text","compressedObj","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","atrrName","rawAttrName","propCount","XMLParser","parse","validationOption","orderedObjParser","orderedResult","addEntity","toXml","jArray","indentation","format","indentBy","arrToStr","xmlStr","isPreviousElementTag","extractAttributeValues","isStopNode","checkStopNode","tagText","attStr","attr_to_str","tempInd","piTextNodeName","newIdentation","tagStart","tagValue","getRawContent","suppressUnpairedNode","suppressEmptyNode","endsWith","hasAttrs","attr","item","attr_to_str_raw","nestedContent","attrVal","suppressBooleanAttributes","textValue","a","oneListGroup","Builder","isAttribute","attrPrefixLen","processTextOrObjNode","indentate","tagEndChar","newLine","object","level","extractAttributes","rawContent","buildRawContent","buildAttributesForStopNode","buildObjectNode","j2x","buildTextValNode","repeat","build","jObj","buildFromOrderedJs","arrayNodeName","isCurrentStopNode","Date","buildAttrPairStr","closeTag","arrLen","listTagVal","listTagAttr","Ks","L","attrGroup","attrKey","nestedAttrs","cleanKey","tagEndExp","piClosingChar","XMLValidator"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./lib/fxp.min.js","mappings":"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","sources":["webpack://fxp/webpack/universalModuleDefinition","webpack://fxp/webpack/bootstrap","webpack://fxp/webpack/runtime/define property getters","webpack://fxp/webpack/runtime/hasOwnProperty shorthand","webpack://fxp/webpack/runtime/make namespace object","webpack://fxp/./src/util.js","webpack://fxp/./src/validator.js","webpack://fxp/./src/xmlparser/OptionsBuilder.js","webpack://fxp/./src/xmlparser/xmlNode.js","webpack://fxp/./src/xmlparser/DocTypeReader.js","webpack://fxp/./node_modules/strnum/strnum.js","webpack://fxp/./node_modules/path-expression-matcher/src/Matcher.js","webpack://fxp/./node_modules/path-expression-matcher/src/Expression.js","webpack://fxp/./src/xmlparser/OrderedObjParser.js","webpack://fxp/./src/ignoreAttributes.js","webpack://fxp/./src/xmlparser/node2json.js","webpack://fxp/./src/xmlparser/XMLParser.js","webpack://fxp/./node_modules/fast-xml-builder/src/orderedJs2Xml.js","webpack://fxp/./node_modules/fast-xml-builder/src/fxb.js","webpack://fxp/./node_modules/fast-xml-builder/src/ignoreAttributes.js","webpack://fxp/./src/xmlbuilder/json2xml.js","webpack://fxp/./src/fxp.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"fxp\"] = factory();\n\telse\n\t\troot[\"fxp\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\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';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(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\nexport const isName = function (string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n","'use strict';\n\nimport { getAllMatches, isName } from './util.js';\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\");\nexport function validate(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 if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' has not been opened.\", 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 = 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 (!Object.prototype.hasOwnProperty.call(attrNames, 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 isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return 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","export const 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 eNotation: 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 ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function (tagName, jPath, attrs) {\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n maxNestedTags: 100,\n strictReservedNames: true,\n jPath: true, // if true, pass jPath string to callbacks; if false, pass matcher instance\n};\n\n/**\n * Normalizes processEntities option for backward compatibility\n * @param {boolean|object} value \n * @returns {object} Always returns normalized object\n */\nfunction normalizeProcessEntities(value) {\n // Boolean backward compatibility\n if (typeof value === 'boolean') {\n return {\n enabled: value, // true or false\n maxEntitySize: 10000,\n maxExpansionDepth: 10,\n maxTotalExpansions: 1000,\n maxExpandedLength: 100000,\n maxEntityCount: 100,\n allowedTags: null,\n tagFilter: null\n };\n }\n\n // Object config - merge with defaults\n if (typeof value === 'object' && value !== null) {\n return {\n enabled: value.enabled !== false, // default true if not specified\n maxEntitySize: value.maxEntitySize ?? 10000,\n maxExpansionDepth: value.maxExpansionDepth ?? 10,\n maxTotalExpansions: value.maxTotalExpansions ?? 1000,\n maxExpandedLength: value.maxExpandedLength ?? 100000,\n maxEntityCount: value.maxEntityCount ?? 100,\n allowedTags: value.allowedTags ?? null,\n tagFilter: value.tagFilter ?? null\n };\n }\n\n // Default to enabled with limits\n return normalizeProcessEntities(true);\n}\n\nexport const buildOptions = function (options) {\n const built = Object.assign({}, defaultOptions, options);\n\n // Always normalize processEntities for backward compatibility and validation\n built.processEntities = normalizeProcessEntities(built.processEntities);\n\n // Convert old-style stopNodes for backward compatibility\n if (built.stopNodes && Array.isArray(built.stopNodes)) {\n built.stopNodes = built.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Old syntax: *.tagname meant \"tagname anywhere\"\n // Convert to new syntax: ..tagname\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n //console.debug(built.processEntities)\n return built;\n};","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = Object.create(null); //attributes map\n }\n add(key, val) {\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if (key === \"__proto__\") key = \"#__proto__\";\n this.child.push({ [key]: val });\n }\n addChild(node, startIndex) {\n if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\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 // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import { isName } from '../util.js';\n\nexport default class DocTypeReader {\n constructor(options) {\n this.suppressValidationErr = !options;\n this.options = options;\n }\n\n readDocType(xmlData, i) {\n const entities = Object.create(null);\n let entityCount = 0;\n\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 i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === '<' && !comment) { //Determine the tag type\n if (hasBody && hasSeq(xmlData, \"!ENTITY\", i)) {\n i += 7;\n let entityName, val;\n [entityName, val, i] = this.readEntityExp(xmlData, i + 1, this.suppressValidationErr);\n if (val.indexOf(\"&\") === -1) { //Parameter entities are not supported\n if (this.options.enabled !== false &&\n this.options.maxEntityCount &&\n entityCount >= this.options.maxEntityCount) {\n throw new Error(\n `Entity count (${entityCount + 1}) exceeds maximum allowed (${this.options.maxEntityCount})`\n );\n }\n const escaped = entityName.replace(/[.\\-+*:]/g, '\\\\.');\n entities[entityName] = {\n regx: RegExp(`&${escaped};`, \"g\"),\n val: val\n };\n entityCount++;\n }\n }\n else if (hasBody && hasSeq(xmlData, \"!ELEMENT\", i)) {\n i += 8;//Not supported\n const { index } = this.readElementExp(xmlData, i + 1);\n i = index;\n } else if (hasBody && hasSeq(xmlData, \"!ATTLIST\", i)) {\n i += 8;//Not supported\n // const {index} = this.readAttlistExp(xmlData,i+1);\n // i = index;\n } else if (hasBody && hasSeq(xmlData, \"!NOTATION\", i)) {\n i += 9;//Not supported\n const { index } = this.readNotationExp(xmlData, i + 1, this.suppressValidationErr);\n i = index;\n } else if (hasSeq(xmlData, \"!--\", i)) comment = true;\n else throw new Error(`Invalid DOCTYPE`);\n\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === '>') { //Read tag content\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\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 readEntityExp(xmlData, i) {\n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after this.options.maxEntitySize) {\n throw new Error(\n `Entity \"${entityName}\" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`\n );\n }\n\n i--;\n return [entityName, entityValue, i];\n }\n\n readNotationExp(xmlData, i) {\n // Skip leading whitespace after \n // \n // \n // \n // \n\n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq, i) {\n for (let j = 0; j < seq.length; j++) {\n if (seq[j] !== data[i + j + 1]) return false;\n }\n return true;\n}\n\nfunction validateEntityName(name) {\n if (isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/;\n// const octRegex = /^0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n \nconst consider = {\n hex : true,\n // oct: false,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true,\n //skipLike: /regex/\n};\n\nexport default function toNumber(str, options = {}){\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n \n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if(str===\"0\") return 0;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return parse_int(trimmedStr, 16);\n // }else if (options.oct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n }else if (trimmedStr.includes('e') || trimmedStr.includes('E')) { //eNotation\n return resolveEnotation(str,trimmedStr,options);\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 // +00.123 => [ , '+', '00', '.123', ..\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 const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length+1] === \".\" \n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if(!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1 \n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))){\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if( num === 0) return num;\n if(parsedStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n if(parsedStr === \"0\") return num; //0.0\n else if(parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n \n let n = leadingZeros? numTrimmedByZeros : trimmedStr;\n if(leadingZeros){\n // -009 => -9\n return (n === parsedStr) || (sign+n === parsedStr) ? num : str\n }else {\n // +9\n return (n === parsedStr) || (n === sign+parsedStr) ? num : str\n }\n }\n }else{ //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str,trimmedStr,options){\n if(!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx); \n if(notation){\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length+1] === eChar \n : str[leadingZeros.length] === eChar;\n\n if(leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if(leadingZeros.length === 1 \n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)){\n return Number(trimmedStr);\n }else if(options.leadingZeros && !eAdjacentToLeadingZeros){ //accept with leading zeros\n //remove leading 0s\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n }else return str;\n }else{\n return str;\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.substring(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base){\n //polyfill\n if(parseInt) return parseInt(numStr, base);\n else if(Number.parseInt) return Number.parseInt(numStr, base);\n else if(window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}","/**\n * Matcher - Tracks current path in XML/JSON tree and matches against Expressions\n * \n * The matcher maintains a stack of nodes representing the current path from root to\n * current tag. It only stores attribute values for the current (top) node to minimize\n * memory usage. Sibling tracking is used to auto-calculate position and counter.\n * \n * @example\n * const matcher = new Matcher();\n * matcher.push(\"root\", {});\n * matcher.push(\"users\", {});\n * matcher.push(\"user\", { id: \"123\", type: \"admin\" });\n * \n * const expr = new Expression(\"root.users.user\");\n * matcher.matches(expr); // true\n */\nexport default class Matcher {\n /**\n * Create a new Matcher\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Default path separator (default: '.')\n */\n constructor(options = {}) {\n this.separator = options.separator || '.';\n this.path = [];\n this.siblingStacks = [];\n // Each path node: { tag: string, values: object, position: number, counter: number }\n // values only present for current (last) node\n // Each siblingStacks entry: Map tracking occurrences at each level\n }\n\n /**\n * Push a new tag onto the path\n * @param {string} tagName - Name of the tag\n * @param {Object} attrValues - Attribute key-value pairs for current node (optional)\n * @param {string} namespace - Namespace for the tag (optional)\n */\n push(tagName, attrValues = null, namespace = null) {\n // Remove values from previous current node (now becoming ancestor)\n if (this.path.length > 0) {\n const prev = this.path[this.path.length - 1];\n prev.values = undefined;\n }\n\n // Get or create sibling tracking for current level\n const currentLevel = this.path.length;\n if (!this.siblingStacks[currentLevel]) {\n this.siblingStacks[currentLevel] = new Map();\n }\n\n const siblings = this.siblingStacks[currentLevel];\n\n // Create a unique key for sibling tracking that includes namespace\n const siblingKey = namespace ? `${namespace}:${tagName}` : tagName;\n\n // Calculate counter (how many times this tag appeared at this level)\n const counter = siblings.get(siblingKey) || 0;\n\n // Calculate position (total children at this level so far)\n let position = 0;\n for (const count of siblings.values()) {\n position += count;\n }\n\n // Update sibling count for this tag\n siblings.set(siblingKey, counter + 1);\n\n // Create new node\n const node = {\n tag: tagName,\n position: position,\n counter: counter\n };\n\n // Store namespace if provided\n if (namespace !== null && namespace !== undefined) {\n node.namespace = namespace;\n }\n\n // Store values only for current node\n if (attrValues !== null && attrValues !== undefined) {\n node.values = attrValues;\n }\n\n this.path.push(node);\n }\n\n /**\n * Pop the last tag from the path\n * @returns {Object|undefined} The popped node\n */\n pop() {\n if (this.path.length === 0) {\n return undefined;\n }\n\n const node = this.path.pop();\n\n // Clean up sibling tracking for levels deeper than current\n // After pop, path.length is the new depth\n // We need to clean up siblingStacks[path.length + 1] and beyond\n if (this.siblingStacks.length > this.path.length + 1) {\n this.siblingStacks.length = this.path.length + 1;\n }\n\n return node;\n }\n\n /**\n * Update current node's attribute values\n * Useful when attributes are parsed after push\n * @param {Object} attrValues - Attribute values\n */\n updateCurrent(attrValues) {\n if (this.path.length > 0) {\n const current = this.path[this.path.length - 1];\n if (attrValues !== null && attrValues !== undefined) {\n current.values = attrValues;\n }\n }\n }\n\n /**\n * Get current tag name\n * @returns {string|undefined}\n */\n getCurrentTag() {\n return this.path.length > 0 ? this.path[this.path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n return this.path.length > 0 ? this.path[this.path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value\n * @param {string} attrName - Attribute name\n * @returns {*} Attribute value or undefined\n */\n getAttrValue(attrName) {\n if (this.path.length === 0) return undefined;\n const current = this.path[this.path.length - 1];\n return current.values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute\n * @param {string} attrName - Attribute name\n * @returns {boolean}\n */\n hasAttr(attrName) {\n if (this.path.length === 0) return false;\n const current = this.path[this.path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent)\n * @returns {number}\n */\n getPosition() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name)\n * @returns {number}\n */\n getCounter() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition for backward compatibility)\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth\n * @returns {number}\n */\n getDepth() {\n return this.path.length;\n }\n\n /**\n * Get path as string\n * @param {string} separator - Optional separator (uses default if not provided)\n * @param {boolean} includeNamespace - Whether to include namespace in output (default: true)\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n const sep = separator || this.separator;\n return this.path.map(n => {\n if (includeNamespace && n.namespace) {\n return `${n.namespace}:${n.tag}`;\n }\n return n.tag;\n }).join(sep);\n }\n\n /**\n * Get path as array of tag names\n * @returns {string[]}\n */\n toArray() {\n return this.path.map(n => n.tag);\n }\n\n /**\n * Reset the path to empty\n */\n reset() {\n this.path = [];\n this.siblingStacks = [];\n }\n\n /**\n * Match current path against an Expression\n * @param {Expression} expression - The expression to match against\n * @returns {boolean} True if current path matches the expression\n */\n matches(expression) {\n const segments = expression.segments;\n\n if (segments.length === 0) {\n return false;\n }\n\n // Handle deep wildcard patterns\n if (expression.hasDeepWildcard()) {\n return this._matchWithDeepWildcard(segments);\n }\n\n // Simple path matching (no deep wildcards)\n return this._matchSimple(segments);\n }\n\n /**\n * Match simple path (no deep wildcards)\n * @private\n */\n _matchSimple(segments) {\n // Path must be same length as segments\n if (this.path.length !== segments.length) {\n return false;\n }\n\n // Match each segment bottom-to-top\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const node = this.path[i];\n const isCurrentNode = (i === this.path.length - 1);\n\n if (!this._matchSegment(segment, node, isCurrentNode)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Match path with deep wildcards\n * @private\n */\n _matchWithDeepWildcard(segments) {\n let pathIdx = this.path.length - 1; // Start from current node (bottom)\n let segIdx = segments.length - 1; // Start from last segment\n\n while (segIdx >= 0 && pathIdx >= 0) {\n const segment = segments[segIdx];\n\n if (segment.type === 'deep-wildcard') {\n // \"..\" matches zero or more levels\n segIdx--;\n\n if (segIdx < 0) {\n // Pattern ends with \"..\", always matches\n return true;\n }\n\n // Find where next segment matches in the path\n const nextSeg = segments[segIdx];\n let found = false;\n\n for (let i = pathIdx; i >= 0; i--) {\n const isCurrentNode = (i === this.path.length - 1);\n if (this._matchSegment(nextSeg, this.path[i], isCurrentNode)) {\n pathIdx = i - 1;\n segIdx--;\n found = true;\n break;\n }\n }\n\n if (!found) {\n return false;\n }\n } else {\n // Regular segment\n const isCurrentNode = (pathIdx === this.path.length - 1);\n if (!this._matchSegment(segment, this.path[pathIdx], isCurrentNode)) {\n return false;\n }\n pathIdx--;\n segIdx--;\n }\n }\n\n // All segments must be consumed\n return segIdx < 0;\n }\n\n /**\n * Match a single segment against a node\n * @private\n * @param {Object} segment - Segment from Expression\n * @param {Object} node - Node from path\n * @param {boolean} isCurrentNode - Whether this is the current (last) node\n * @returns {boolean}\n */\n _matchSegment(segment, node, isCurrentNode) {\n // Match tag name (* is wildcard)\n if (segment.tag !== '*' && segment.tag !== node.tag) {\n return false;\n }\n\n // Match namespace if specified in segment\n if (segment.namespace !== undefined) {\n // Segment has namespace - node must match it\n if (segment.namespace !== '*' && segment.namespace !== node.namespace) {\n return false;\n }\n }\n // If segment has no namespace, it matches nodes with or without namespace\n\n // Match attribute name (check if node has this attribute)\n // Can only check for current node since ancestors don't have values\n if (segment.attrName !== undefined) {\n if (!isCurrentNode) {\n // Can't check attributes for ancestor nodes (values not stored)\n return false;\n }\n\n if (!node.values || !(segment.attrName in node.values)) {\n return false;\n }\n\n // Match attribute value (only possible for current node)\n if (segment.attrValue !== undefined) {\n const actualValue = node.values[segment.attrName];\n // Both should be strings\n if (String(actualValue) !== String(segment.attrValue)) {\n return false;\n }\n }\n }\n\n // Match position (only for current node)\n if (segment.position !== undefined) {\n if (!isCurrentNode) {\n // Can't check position for ancestor nodes\n return false;\n }\n\n const counter = node.counter ?? 0;\n\n if (segment.position === 'first' && counter !== 0) {\n return false;\n } else if (segment.position === 'odd' && counter % 2 !== 1) {\n return false;\n } else if (segment.position === 'even' && counter % 2 !== 0) {\n return false;\n } else if (segment.position === 'nth') {\n if (counter !== segment.positionValue) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Create a snapshot of current state\n * @returns {Object} State snapshot\n */\n snapshot() {\n return {\n path: this.path.map(node => ({ ...node })),\n siblingStacks: this.siblingStacks.map(map => new Map(map))\n };\n }\n\n /**\n * Restore state from snapshot\n * @param {Object} snapshot - State snapshot\n */\n restore(snapshot) {\n this.path = snapshot.path.map(node => ({ ...node }));\n this.siblingStacks = snapshot.siblingStacks.map(map => new Map(map));\n }\n}","/**\n * Expression - Parses and stores a tag pattern expression\n * \n * Patterns are parsed once and stored in an optimized structure for fast matching.\n * \n * @example\n * const expr = new Expression(\"root.users.user\");\n * const expr2 = new Expression(\"..user[id]:first\");\n * const expr3 = new Expression(\"root/users/user\", { separator: '/' });\n */\nexport default class Expression {\n /**\n * Create a new Expression\n * @param {string} pattern - Pattern string (e.g., \"root.users.user\", \"..user[id]\")\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Path separator (default: '.')\n */\n constructor(pattern, options = {}) {\n this.pattern = pattern;\n this.separator = options.separator || '.';\n this.segments = this._parse(pattern);\n\n // Cache expensive checks for performance (O(1) instead of O(n))\n this._hasDeepWildcard = this.segments.some(seg => seg.type === 'deep-wildcard');\n this._hasAttributeCondition = this.segments.some(seg => seg.attrName !== undefined);\n this._hasPositionSelector = this.segments.some(seg => seg.position !== undefined);\n }\n\n /**\n * Parse pattern string into segments\n * @private\n * @param {string} pattern - Pattern to parse\n * @returns {Array} Array of segment objects\n */\n _parse(pattern) {\n const segments = [];\n\n // Split by separator but handle \"..\" specially\n let i = 0;\n let currentPart = '';\n\n while (i < pattern.length) {\n if (pattern[i] === this.separator) {\n // Check if next char is also separator (deep wildcard)\n if (i + 1 < pattern.length && pattern[i + 1] === this.separator) {\n // Flush current part if any\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n currentPart = '';\n }\n // Add deep wildcard\n segments.push({ type: 'deep-wildcard' });\n i += 2; // Skip both separators\n } else {\n // Regular separator\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n currentPart = '';\n i++;\n }\n } else {\n currentPart += pattern[i];\n i++;\n }\n }\n\n // Flush remaining part\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n\n return segments;\n }\n\n /**\n * Parse a single segment\n * @private\n * @param {string} part - Segment string (e.g., \"user\", \"ns::user\", \"user[id]\", \"ns::user:first\")\n * @returns {Object} Segment object\n */\n _parseSegment(part) {\n const segment = { type: 'tag' };\n\n // NEW NAMESPACE SYNTAX (v2.0):\n // ============================\n // Namespace uses DOUBLE colon (::)\n // Position uses SINGLE colon (:)\n // \n // Examples:\n // \"user\" → tag\n // \"user:first\" → tag + position\n // \"user[id]\" → tag + attribute\n // \"user[id]:first\" → tag + attribute + position\n // \"ns::user\" → namespace + tag\n // \"ns::user:first\" → namespace + tag + position\n // \"ns::user[id]\" → namespace + tag + attribute\n // \"ns::user[id]:first\" → namespace + tag + attribute + position\n // \"ns::first\" → namespace + tag named \"first\" (NO ambiguity!)\n //\n // This eliminates all ambiguity:\n // :: = namespace separator\n // : = position selector\n // [] = attributes\n\n // Step 1: Extract brackets [attr] or [attr=value]\n let bracketContent = null;\n let withoutBrackets = part;\n\n const bracketMatch = part.match(/^([^\\[]+)(\\[[^\\]]*\\])(.*)$/);\n if (bracketMatch) {\n withoutBrackets = bracketMatch[1] + bracketMatch[3];\n if (bracketMatch[2]) {\n const content = bracketMatch[2].slice(1, -1);\n if (content) {\n bracketContent = content;\n }\n }\n }\n\n // Step 2: Check for namespace (double colon ::)\n let namespace = undefined;\n let tagAndPosition = withoutBrackets;\n\n if (withoutBrackets.includes('::')) {\n const nsIndex = withoutBrackets.indexOf('::');\n namespace = withoutBrackets.substring(0, nsIndex).trim();\n tagAndPosition = withoutBrackets.substring(nsIndex + 2).trim(); // Skip ::\n\n if (!namespace) {\n throw new Error(`Invalid namespace in pattern: ${part}`);\n }\n }\n\n // Step 3: Parse tag and position (single colon :)\n let tag = undefined;\n let positionMatch = null;\n\n if (tagAndPosition.includes(':')) {\n const colonIndex = tagAndPosition.lastIndexOf(':'); // Use last colon for position\n const tagPart = tagAndPosition.substring(0, colonIndex).trim();\n const posPart = tagAndPosition.substring(colonIndex + 1).trim();\n\n // Verify position is a valid keyword\n const isPositionKeyword = ['first', 'last', 'odd', 'even'].includes(posPart) ||\n /^nth\\(\\d+\\)$/.test(posPart);\n\n if (isPositionKeyword) {\n tag = tagPart;\n positionMatch = posPart;\n } else {\n // Not a valid position keyword, treat whole thing as tag\n tag = tagAndPosition;\n }\n } else {\n tag = tagAndPosition;\n }\n\n if (!tag) {\n throw new Error(`Invalid segment pattern: ${part}`);\n }\n\n segment.tag = tag;\n if (namespace) {\n segment.namespace = namespace;\n }\n\n // Step 4: Parse attributes\n if (bracketContent) {\n if (bracketContent.includes('=')) {\n const eqIndex = bracketContent.indexOf('=');\n segment.attrName = bracketContent.substring(0, eqIndex).trim();\n segment.attrValue = bracketContent.substring(eqIndex + 1).trim();\n } else {\n segment.attrName = bracketContent.trim();\n }\n }\n\n // Step 5: Parse position selector\n if (positionMatch) {\n const nthMatch = positionMatch.match(/^nth\\((\\d+)\\)$/);\n if (nthMatch) {\n segment.position = 'nth';\n segment.positionValue = parseInt(nthMatch[1], 10);\n } else {\n segment.position = positionMatch;\n }\n }\n\n return segment;\n }\n\n /**\n * Get the number of segments\n * @returns {number}\n */\n get length() {\n return this.segments.length;\n }\n\n /**\n * Check if expression contains deep wildcard\n * @returns {boolean}\n */\n hasDeepWildcard() {\n return this._hasDeepWildcard;\n }\n\n /**\n * Check if expression has attribute conditions\n * @returns {boolean}\n */\n hasAttributeCondition() {\n return this._hasAttributeCondition;\n }\n\n /**\n * Check if expression has position selectors\n * @returns {boolean}\n */\n hasPositionSelector() {\n return this._hasPositionSelector;\n }\n\n /**\n * Get string representation\n * @returns {string}\n */\n toString() {\n return this.pattern;\n }\n}","'use strict';\n///@ts-check\n\nimport { getAllMatches, isExist } from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\n\n\n// const 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\n// Helper functions for attribute and namespace handling\n\n/**\n * Extract raw attributes (without prefix) from prefixed attribute map\n * @param {object} prefixedAttrs - Attributes with prefix from buildAttributesMap\n * @param {object} options - Parser options containing attributeNamePrefix\n * @returns {object} Raw attributes for matcher\n */\nfunction extractRawAttributes(prefixedAttrs, options) {\n if (!prefixedAttrs) return {};\n\n // Handle attributesGroupName option\n const attrs = options.attributesGroupName\n ? prefixedAttrs[options.attributesGroupName]\n : prefixedAttrs;\n\n if (!attrs) return {};\n\n const rawAttrs = {};\n for (const key in attrs) {\n // Remove the attribute prefix to get raw name\n if (key.startsWith(options.attributeNamePrefix)) {\n const rawName = key.substring(options.attributeNamePrefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * Extract namespace from raw tag name\n * @param {string} rawTagName - Tag name possibly with namespace (e.g., \"soap:Envelope\")\n * @returns {string|undefined} Namespace or undefined\n */\nfunction extractNamespace(rawTagName) {\n if (!rawTagName || typeof rawTagName !== 'string') return undefined;\n\n const colonIndex = rawTagName.indexOf(':');\n if (colonIndex !== -1 && colonIndex > 0) {\n const ns = rawTagName.substring(0, colonIndex);\n // Don't treat xmlns as a namespace\n if (ns !== 'xmlns') {\n return ns;\n }\n }\n return undefined;\n}\n\nexport default class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\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.ampEntity = { regex: /&(amp|#38|#x26);/g, val: \"&\" };\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 \"num_dec\": { regex: /&#([0-9]{1,7});/g, val: (_, str) => fromCodePoint(str, 10, \"&#\") },\n \"num_hex\": { regex: /&#x([0-9a-fA-F]{1,6});/g, val: (_, str) => fromCodePoint(str, 16, \"&#x\") },\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 this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n // Initialize path matcher for path-expression-matcher\n this.matcher = new Matcher();\n\n // Flag to track if current node is a stop node (optimization)\n this.isCurrentNodeStopNode = false;\n\n // Pre-compile stopNodes expressions\n if (this.options.stopNodes && this.options.stopNodes.length > 0) {\n this.stopNodeExpressions = [];\n for (let i = 0; i < this.options.stopNodes.length; i++) {\n const stopNodeExp = this.options.stopNodes[i];\n if (typeof stopNodeExp === 'string') {\n // Convert string to Expression object\n this.stopNodeExpressions.push(new Expression(stopNodeExp));\n } else if (stopNodeExp instanceof Expression) {\n // Already an Expression object\n this.stopNodeExpressions.push(stopNodeExp);\n }\n }\n }\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 const escaped = ent.replace(/[.\\-+*:]/g, '\\\\.');\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\" + escaped + \";\", \"g\"),\n val: externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.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, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const newval = this.options.tagValueProcessor(tagName, val, jPathOrMatcher, 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, tagName) {\n if (this.options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n\n // First pass: parse all attributes and update matcher with raw values\n // This ensures the matcher has all attribute values when processors run\n const rawAttrsForMatcher = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n const oldVal = matches[i][4];\n\n if (attrName.length && oldVal !== undefined) {\n let parsedVal = oldVal;\n if (this.options.trimValues) {\n parsedVal = parsedVal.trim();\n }\n parsedVal = this.replaceEntitiesValue(parsedVal, tagName, jPath);\n rawAttrsForMatcher[attrName] = parsedVal;\n }\n }\n\n // Update matcher with raw attribute values BEFORE running processors\n if (Object.keys(rawAttrsForMatcher).length > 0 && typeof jPath === 'object' && jPath.updateCurrent) {\n jPath.updateCurrent(rawAttrsForMatcher);\n }\n\n // Second pass: now process attributes with matcher having full attribute context\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n\n // Convert jPath to string if needed for ignoreAttributesFn\n const jPathStr = this.options.jPath ? jPath.toString() : jPath;\n if (this.ignoreAttributesFn(attrName, jPathStr)) {\n continue\n }\n\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if (aName === \"__proto__\") aName = \"#__proto__\";\n\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPathOrMatcher);\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\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\n // Reset matcher for new document\n this.matcher.reset();\n\n // Reset entity expansion counters for this document\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n const docTypeReader = new DocTypeReader(this.options.processEntities);\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 (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, this.matcher);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = this.matcher.getCurrentTag();\n if (tagName && this.options.unpairedTags.indexOf(tagName) !== -1) {\n throw new Error(`Unpaired tag can not be used as closing tag: `);\n }\n if (lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1) {\n // Pop the unpaired tag\n this.matcher.pop();\n this.tagsNodeStack.pop();\n }\n // Pop the closing tag\n this.matcher.pop();\n this.isCurrentNodeStopNode = false; // Reset flag when closing tag\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if (xmlData[i + 1] === '?') {\n\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, this.matcher);\n if ((this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags) {\n //do nothing\n } else {\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, this.matcher, tagData.tagName);\n }\n this.addChild(currentNode, childNode, this.matcher, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if (xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"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, this.matcher);\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 = docTypeReader.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, this.matcher);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, this.matcher, true, false, true, true);\n if (val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if (this.options.cdataPropName) {\n currentNode.add(this.options.cdataPropName, [{ [this.options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(this.options.textNodeName, val);\n }\n\n i = closeIndex + 2;\n } else {//Opening tag\n let result = readTagExp(xmlData, i, this.options.removeNSPrefix);\n\n // Safety check: readTagExp can return undefined\n if (!result) {\n // Log context for debugging\n const context = xmlData.substring(Math.max(0, i - 50), Math.min(xmlData.length, i + 50));\n throw new Error(`readTagExp returned undefined at position ${i}. Context: \"${context}\"`);\n }\n\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n //console.log(tagExp, tagName)\n const newTagName = this.options.transformTagName(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n if (this.options.strictReservedNames &&\n (tagName === this.options.commentPropName\n || tagName === this.options.cdataPropName\n )) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\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, this.matcher, false);\n }\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 this.matcher.pop();\n }\n\n // Clean up self-closing syntax BEFORE processing attributes\n // This is where tagExp gets the trailing / removed\n let isSelfClosing = false;\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n isSelfClosing = true;\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n // Re-check attrExpPresent after cleaning\n attrExpPresent = (tagName !== tagExp);\n }\n\n // Now process attributes with CLEAN tagExp (no trailing /)\n let prefixedAttrs = null;\n let rawAttrs = {};\n let namespace = undefined;\n\n // Extract namespace from rawTagName\n namespace = extractNamespace(rawTagName);\n\n // Push tag to matcher FIRST (with empty attrs for now) so callbacks see correct path\n if (tagName !== xmlObj.tagname) {\n this.matcher.push(tagName, {}, namespace);\n }\n\n // Now build attributes - callbacks will see correct matcher state\n if (tagName !== tagExp && attrExpPresent) {\n // Build attributes (returns prefixed attributes for the tree)\n // Note: buildAttributesMap now internally updates the matcher with raw attributes\n prefixedAttrs = this.buildAttributesMap(tagExp, this.matcher, tagName);\n\n if (prefixedAttrs) {\n // Extract raw attributes (without prefix) for our use\n rawAttrs = extractRawAttributes(prefixedAttrs, this.options);\n }\n }\n\n // Now check if this is a stop node (after attributes are set)\n if (tagName !== xmlObj.tagname) {\n this.isCurrentNodeStopNode = this.isItStopNode(this.stopNodeExpressions, this.matcher);\n }\n\n const startIndex = i;\n if (this.isCurrentNodeStopNode) {\n let tagContent = \"\";\n\n // For self-closing tags, content is empty\n if (isSelfClosing) {\n i = result.closeIndex;\n }\n //unpaired tag\n else if (this.options.unpairedTags.indexOf(tagName) !== -1) {\n i = result.closeIndex;\n }\n //normal tag\n else {\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n\n // For stop nodes, store raw content as-is without any processing\n childNode.add(this.options.textNodeName, tagContent);\n\n this.matcher.pop(); // Pop the stop node tag\n this.isCurrentNodeStopNode = false; // Reset flag\n\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n } else {\n //selfClosing tag\n if (isSelfClosing) {\n if (this.options.transformTagName) {\n const newTagName = this.options.transformTagName(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n this.matcher.pop(); // Pop self-closing tag\n this.isCurrentNodeStopNode = false; // Reset flag\n }\n else if (this.options.unpairedTags.indexOf(tagName) !== -1) {//unpaired tag\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n this.matcher.pop(); // Pop unpaired tag\n this.isCurrentNodeStopNode = false; // Reset flag\n i = result.closeIndex;\n // Continue to next iteration without changing currentNode\n continue;\n }\n //opening tag\n else {\n const childNode = new xmlNode(tagName);\n if (this.tagsNodeStack.length > this.options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n this.tagsNodeStack.push(currentNode);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\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\nfunction addChild(currentNode, childNode, matcher, startIndex) {\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? matcher.toString() : matcher;\n const result = this.options.updateTag(childNode.tagname, jPathOrMatcher, childNode[\":@\"])\n if (result === false) {\n //do nothing\n } else if (typeof result === \"string\") {\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n } else {\n currentNode.addChild(childNode, startIndex);\n }\n}\n\n/**\n * @param {object} val - Entity object with regex and val properties\n * @param {string} tagName - Tag name\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n */\nfunction replaceEntitiesValue(val, tagName, jPath) {\n const entityConfig = this.options.processEntities;\n\n if (!entityConfig || !entityConfig.enabled) {\n return val;\n }\n\n // Check if tag is allowed to contain entities\n if (entityConfig.allowedTags) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const allowed = Array.isArray(entityConfig.allowedTags)\n ? entityConfig.allowedTags.includes(tagName)\n : entityConfig.allowedTags(tagName, jPathOrMatcher);\n\n if (!allowed) {\n return val;\n }\n }\n\n // Apply custom tag filter if provided\n if (entityConfig.tagFilter) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n if (!entityConfig.tagFilter(tagName, jPathOrMatcher)) {\n return val; // Skip based on custom filter\n }\n }\n\n // Replace DOCTYPE entities\n for (let entityName in this.docTypeEntities) {\n const entity = this.docTypeEntities[entityName];\n const matches = val.match(entity.regx);\n\n if (matches) {\n // Track expansions\n this.entityExpansionCount += matches.length;\n\n // Check expansion limit\n if (entityConfig.maxTotalExpansions &&\n this.entityExpansionCount > entityConfig.maxTotalExpansions) {\n throw new Error(\n `Entity expansion limit exceeded: ${this.entityExpansionCount} > ${entityConfig.maxTotalExpansions}`\n );\n }\n\n // Store length before replacement\n const lengthBefore = val.length;\n val = val.replace(entity.regx, entity.val);\n\n // Check expanded length immediately after replacement\n if (entityConfig.maxExpandedLength) {\n this.currentExpandedLength += (val.length - lengthBefore);\n\n if (this.currentExpandedLength > entityConfig.maxExpandedLength) {\n throw new Error(\n `Total expanded content size exceeded: ${this.currentExpandedLength} > ${entityConfig.maxExpandedLength}`\n );\n }\n }\n }\n }\n if (val.indexOf('&') === -1) return val; // Early exit\n\n // Replace standard entities\n for (let entityName in this.lastEntities) {\n const entity = this.lastEntities[entityName];\n val = val.replace(entity.regex, entity.val);\n }\n if (val.indexOf('&') === -1) return val; // Early exit\n\n // Replace HTML entities if enabled\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 // Replace ampersand entity last\n val = val.replace(this.ampEntity.regex, this.ampEntity.val);\n\n return val;\n}\n\n\nfunction saveTextToParentTag(textData, parentNode, matcher, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if (isLeafNode === undefined) isLeafNode = parentNode.child.length === 0\n\n textData = this.parseTextData(textData,\n parentNode.tagname,\n matcher,\n false,\n parentNode[\":@\"] ? Object.keys(parentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n parentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * @param {Array} stopNodeExpressions - Array of compiled Expression objects\n * @param {Matcher} matcher - Current path matcher\n */\nfunction isItStopNode(stopNodeExpressions, matcher) {\n if (!stopNodeExpressions || stopNodeExpressions.length === 0) return false;\n\n for (let i = 0; i < stopNodeExpressions.length; i++) {\n if (matcher.matches(stopNodeExpressions[i])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double 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.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\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 rawTagName: rawTagName,\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 // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n if (xmlData[i + 1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n }\n }\n }\n i = closeIndex;\n } else if (xmlData[i + 1] === '?') {\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 3) === '!--') {\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\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 (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix) {\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix + str + \";\";\n }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\nimport { Matcher } from 'path-expression-matcher';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * Helper function to strip attribute prefix from attribute map\n * @param {object} attrs - Attributes with prefix (e.g., {\"@_class\": \"code\"})\n * @param {string} prefix - Attribute prefix to remove (e.g., \"@_\")\n * @returns {object} Attributes without prefix (e.g., {\"class\": \"code\"})\n */\nfunction stripAttributePrefix(attrs, prefix) {\n if (!attrs || typeof attrs !== 'object') return {};\n if (!prefix) return attrs;\n\n const rawAttrs = {};\n for (const key in attrs) {\n if (key.startsWith(prefix)) {\n const rawName = key.substring(prefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns \n */\nexport default function prettify(node, options, matcher) {\n return compress(node, options, matcher);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns object\n */\nfunction compress(arr, options, matcher) {\n let text;\n const compressedObj = {}; //This is intended to be a plain object\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n\n // Push current property to matcher WITH RAW ATTRIBUTES (no prefix)\n if (property !== undefined && property !== options.textNodeName) {\n const rawAttrs = stripAttributePrefix(\n tagObj[\":@\"] || {},\n options.attributeNamePrefix\n );\n matcher.push(property, rawAttrs);\n }\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, matcher);\n const isLeaf = isLeafTag(val, options);\n\n if (tagObj[\":@\"]) {\n assignAttributes(val, tagObj[\":@\"], matcher, 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 (tagObj[METADATA_SYMBOL] !== undefined && typeof val === \"object\" && val !== null) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n\n if (compressedObj[property] !== undefined && Object.prototype.hasOwnProperty.call(compressedObj, property)) {\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\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? matcher.toString() : matcher;\n if (options.isArray(property, jPathOrMatcher, isLeaf)) {\n compressedObj[property] = [val];\n } else {\n compressedObj[property] = val;\n }\n }\n\n // Pop property from matcher after processing\n if (property !== undefined && property !== options.textNodeName) {\n matcher.pop();\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\n\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, matcher, 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]; // This is the PREFIXED name (e.g., \"@_class\")\n\n // Strip prefix for matcher path (for isArray callback)\n const rawAttrName = atrrName.startsWith(options.attributeNamePrefix)\n ? atrrName.substring(options.attributeNamePrefix.length)\n : atrrName;\n\n // For attributes, we need to create a temporary path\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath\n ? matcher.toString() + \".\" + rawAttrName\n : matcher;\n\n if (options.isArray(atrrName, jPathOrMatcher, 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 { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n\n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}","import { buildOptions } from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport { validate } from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class 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|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData !== \"string\" && xmlData.toString) {\n xmlData = xmlData.toString();\n } else if (typeof xmlData !== \"string\") {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n\n if (validationOption) {\n if (validationOption === true) validationOption = {}; //validate with default options\n\n const result = 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, orderedObjParser.matcher);\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 if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}\n","import { Expression, Matcher } from 'path-expression-matcher';\n\nconst EOL = \"\\n\";\n\n/**\n * \n * @param {array} jArray \n * @param {any} options \n * @returns \n */\nexport default function toXml(jArray, options) {\n let indentation = \"\";\n if (options.format && options.indentBy.length > 0) {\n indentation = EOL;\n }\n\n // Pre-compile stopNode expressions for pattern matching\n const stopNodeExpressions = [];\n if (options.stopNodes && Array.isArray(options.stopNodes)) {\n for (let i = 0; i < options.stopNodes.length; i++) {\n const node = options.stopNodes[i];\n if (typeof node === 'string') {\n stopNodeExpressions.push(new Expression(node));\n } else if (node instanceof Expression) {\n stopNodeExpressions.push(node);\n }\n }\n }\n\n // Initialize matcher for path tracking\n const matcher = new Matcher();\n\n return arrToStr(jArray, options, indentation, matcher, stopNodeExpressions);\n}\n\nfunction arrToStr(arr, options, indentation, matcher, stopNodeExpressions) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n\n\n if (!Array.isArray(arr)) {\n // Non-array values (e.g. string tag values) should be treated as text content\n if (arr !== undefined && arr !== null) {\n let text = arr.toString();\n text = replaceEntitiesValue(text, options);\n return text;\n }\n return \"\";\n }\n\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n if (tagName === undefined) continue;\n\n // Extract attributes from \":@\" property\n const attrValues = extractAttributeValues(tagObj[\":@\"], options);\n\n // Push tag to matcher WITH attributes\n matcher.push(tagName, attrValues);\n\n // Check if this is a stop node using Expression matching\n const isStopNode = checkStopNode(matcher, stopNodeExpressions);\n\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n matcher.pop();\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += ``;\n isPreviousElementTag = false;\n matcher.pop();\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + ``;\n isPreviousElementTag = true;\n matcher.pop();\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr = attr_to_str(tagObj[\":@\"], options, isStopNode);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\"; //remove extra spacing\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr}?>`;\n isPreviousElementTag = true;\n matcher.pop();\n continue;\n }\n\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n\n // Pass isStopNode to attr_to_str so attributes are also not processed for stopNodes\n const attStr = attr_to_str(tagObj[\":@\"], options, isStopNode);\n const tagStart = indentation + `<${tagName}${attStr}`;\n\n // If this is a stopNode, get raw content without processing\n let tagValue;\n if (isStopNode) {\n tagValue = getRawContent(tagObj[tagName], options);\n } else {\n tagValue = arrToStr(tagObj[tagName], options, newIdentation, matcher, stopNodeExpressions);\n }\n\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n else xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"`;\n }\n isPreviousElementTag = true;\n\n // Pop tag from matcher\n matcher.pop();\n }\n\n return xmlStr;\n}\n\n/**\n * Extract attribute values from the \":@\" object and return as plain object\n * for passing to matcher.push()\n */\nfunction extractAttributeValues(attrMap, options) {\n if (!attrMap || options.ignoreAttributes) return null;\n\n const attrValues = {};\n let hasAttrs = false;\n\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n // Remove the attribute prefix to get clean attribute name\n const cleanAttrName = attr.startsWith(options.attributeNamePrefix)\n ? attr.substr(options.attributeNamePrefix.length)\n : attr;\n attrValues[cleanAttrName] = attrMap[attr];\n hasAttrs = true;\n }\n\n return hasAttrs ? attrValues : null;\n}\n\n/**\n * Extract raw content from a stopNode without any processing\n * This preserves the content exactly as-is, including special characters\n */\nfunction getRawContent(arr, options) {\n if (!Array.isArray(arr)) {\n // Non-array values return as-is\n if (arr !== undefined && arr !== null) {\n return arr.toString();\n }\n return \"\";\n }\n\n let content = \"\";\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n const tagName = propName(item);\n\n if (tagName === options.textNodeName) {\n // Raw text content - NO processing, NO entity replacement\n content += item[tagName];\n } else if (tagName === options.cdataPropName) {\n // CDATA content\n content += item[tagName][0][options.textNodeName];\n } else if (tagName === options.commentPropName) {\n // Comment content\n content += item[tagName][0][options.textNodeName];\n } else if (tagName && tagName[0] === \"?\") {\n // Processing instruction - skip for stopNodes\n continue;\n } else if (tagName) {\n // Nested tags within stopNode\n // Recursively get raw content and reconstruct the tag\n // For stopNodes, we don't process attributes either\n const attStr = attr_to_str_raw(item[\":@\"], options);\n const nestedContent = getRawContent(item[tagName], options);\n\n if (!nestedContent || nestedContent.length === 0) {\n content += `<${tagName}${attStr}/>`;\n } else {\n content += `<${tagName}${attStr}>${nestedContent}`;\n }\n }\n }\n return content;\n}\n\n/**\n * Build attribute string for stopNodes - NO entity replacement\n */\nfunction attr_to_str_raw(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n // For stopNodes, use raw value without processing\n let attrVal = attrMap[attr];\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 propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n if (key !== \":@\") return key;\n }\n}\n\nfunction attr_to_str(attrMap, options, isStopNode) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n let attrVal;\n\n if (isStopNode) {\n // For stopNodes, use raw value without any processing\n attrVal = attrMap[attr];\n } else {\n // Normal processing: apply attributeValueProcessor and entity replacement\n attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n }\n\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 checkStopNode(matcher, stopNodeExpressions) {\n if (!stopNodeExpressions || stopNodeExpressions.length === 0) return false;\n\n for (let i = 0; i < stopNodeExpressions.length; i++) {\n if (matcher.matches(stopNodeExpressions[i])) {\n return true;\n }\n }\n return false;\n}\n\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}","'use strict';\n//parse Empty Node as self closing node\nimport buildFromOrderedJs from './orderedJs2Xml.js';\nimport getIgnoreAttributesFn from \"./ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\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 suppressUnpairedNode: true,\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: \"&\" },//it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \">\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"<\" },\n { regex: new RegExp(\"\\'\", \"g\"), val: \"'\" },\n { regex: new RegExp(\"\\\"\", \"g\"), val: \""\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false,\n jPath: true // When true, callbacks receive string jPath; when false, receive Matcher instance\n};\n\nexport default function Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n\n // Convert old-style stopNodes for backward compatibility\n // Old syntax: \"*.tag\" meant \"tag anywhere in tree\"\n // New syntax: \"..tag\" means \"tag anywhere in tree\"\n if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {\n this.options.stopNodes = this.options.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Convert old wildcard syntax to deep wildcard\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n\n // Pre-compile stopNode expressions for pattern matching\n this.stopNodeExpressions = [];\n if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {\n for (let i = 0; i < this.options.stopNodes.length; i++) {\n const node = this.options.stopNodes[i];\n if (typeof node === 'string') {\n this.stopNodeExpressions.push(new Expression(node));\n } else if (node instanceof Expression) {\n this.stopNodeExpressions.push(node);\n }\n }\n }\n\n if (this.options.ignoreAttributes === true || this.options.attributesGroupName) {\n this.isAttribute = function (/*a*/) {\n return false;\n };\n } else {\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\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\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 // Initialize matcher for path tracking\n const matcher = new Matcher();\n return this.j2x(jObj, 0, matcher).val;\n }\n};\n\nBuilder.prototype.j2x = function (jObj, level, matcher) {\n let attrStr = '';\n let val = '';\n\n // Get jPath based on option: string for backward compatibility, or Matcher for new features\n const jPath = this.options.jPath ? matcher.toString() : matcher;\n\n // Check if current node is a stopNode (will be used for attribute encoding)\n const isCurrentStopNode = this.checkStopNode(matcher);\n\n for (let key in jObj) {\n if (!Object.prototype.hasOwnProperty.call(jObj, key)) continue;\n if (typeof jObj[key] === 'undefined') {\n // supress undefined node only if it is not an attribute\n if (this.isAttribute(key)) {\n val += '';\n }\n } else if (jObj[key] === null) {\n // null attribute should be ignored by the attribute list, but should not cause the tag closing\n if (this.isAttribute(key)) {\n val += '';\n } else if (key === this.options.cdataPropName) {\n val += '';\n } else if (key[0] === '?') {\n val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n } else {\n val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n }\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (jObj[key] instanceof Date) {\n val += this.buildTextValNode(jObj[key], key, '', level, matcher);\n } else if (typeof jObj[key] !== 'object') {\n //premitive type\n const attr = this.isAttribute(key);\n if (attr && !this.ignoreAttributesFn(attr, jPath)) {\n attrStr += this.buildAttrPairStr(attr, '' + jObj[key], isCurrentStopNode);\n } else if (!attr) {\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 // Check if this is a stopNode before building\n matcher.push(key);\n const isStopNode = this.checkStopNode(matcher);\n matcher.pop();\n\n if (isStopNode) {\n // Build as raw content without encoding\n const textValue = '' + jObj[key];\n if (textValue === '') {\n val += this.indentate(level) + '<' + key + this.closeTag(key) + this.tagEndChar;\n } else {\n val += this.indentate(level) + '<' + key + '>' + textValue + '' + textValue + '${item}`;\n } else if (typeof item === 'object' && item !== null) {\n const nestedContent = this.buildRawContent(item);\n const nestedAttrs = this.buildAttributesForStopNode(item);\n if (nestedContent === '') {\n content += `<${key}${nestedAttrs}/>`;\n } else {\n content += `<${key}${nestedAttrs}>${nestedContent}`;\n }\n }\n }\n } else if (typeof value === 'object' && value !== null) {\n // Nested object\n const nestedContent = this.buildRawContent(value);\n const nestedAttrs = this.buildAttributesForStopNode(value);\n if (nestedContent === '') {\n content += `<${key}${nestedAttrs}/>`;\n } else {\n content += `<${key}${nestedAttrs}>${nestedContent}`;\n }\n } else {\n // Primitive value\n content += `<${key}>${value}`;\n }\n }\n\n return content;\n};\n\n// Build attribute string for stopNode (no entity encoding)\nBuilder.prototype.buildAttributesForStopNode = function (obj) {\n if (!obj || typeof obj !== 'object') return '';\n\n let attrStr = '';\n\n // Check for attributesGroupName (when attributes are grouped)\n if (this.options.attributesGroupName && obj[this.options.attributesGroupName]) {\n const attrGroup = obj[this.options.attributesGroupName];\n for (let attrKey in attrGroup) {\n if (!Object.prototype.hasOwnProperty.call(attrGroup, attrKey)) continue;\n const cleanKey = attrKey.startsWith(this.options.attributeNamePrefix)\n ? attrKey.substring(this.options.attributeNamePrefix.length)\n : attrKey;\n const val = attrGroup[attrKey];\n if (val === true && this.options.suppressBooleanAttributes) {\n attrStr += ' ' + cleanKey;\n } else {\n attrStr += ' ' + cleanKey + '=\"' + val + '\"'; // No encoding for stopNode\n }\n }\n } else {\n // Look for individual attributes\n for (let key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n const attr = this.isAttribute(key);\n if (attr) {\n const val = obj[key];\n if (val === true && this.options.suppressBooleanAttributes) {\n attrStr += ' ' + attr;\n } else {\n attrStr += ' ' + attr + '=\"' + val + '\"'; // No encoding for stopNode\n }\n }\n }\n }\n\n return attrStr;\n};\n\nBuilder.prototype.buildObjectNode = function (val, key, attrStr, level) {\n if (val === \"\") {\n if (key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;\n else {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n } else {\n\n let tagEndExp = '' + val + tagEndExp);\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `` + this.newLine;\n } else {\n return (\n this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar +\n val +\n this.indentate(level) + tagEndExp);\n }\n }\n}\n\nBuilder.prototype.closeTag = function (key) {\n let closeTag = \"\";\n if (this.options.unpairedTags.indexOf(key) !== -1) { //unpaired\n if (!this.options.suppressUnpairedNode) closeTag = \"/\"\n } else if (this.options.suppressEmptyNode) { //empty\n closeTag = \"/\";\n } else {\n closeTag = `>` + this.newLine;\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `` + this.newLine;\n } else if (key[0] === \"?\") {//PI tag\n return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;\n } else {\n // Normal processing: apply tagValueProcessor and entity replacement\n let textValue = this.options.tagValueProcessor(key, val);\n textValue = this.replaceEntitiesValue(textValue);\n\n if (textValue === '') {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n } else {\n return this.indentate(level) + '<' + key + attrStr + '>' +\n textValue +\n ' 0 && this.options.processEntities) {\n for (let i = 0; i < this.options.entities.length; i++) {\n const entity = this.options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\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) && name !== this.options.textNodeName) {\n return name.substr(this.attrPrefixLen);\n } else {\n return false;\n }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","// Re-export from fast-xml-builder for backward compatibility\nimport XMLBuilder from 'fast-xml-builder';\nexport default XMLBuilder;\n\n// If there are any named exports you also want to re-export:\nexport * from 'fast-xml-builder';","'use strict';\n\nimport { validate } from './validator.js';\nimport XMLParser from './xmlparser/XMLParser.js';\nimport XMLBuilder from './xmlbuilder/json2xml.js';\n\nconst XMLValidator = {\n validate: validate\n}\nexport {\n XMLParser,\n XMLValidator,\n XMLBuilder\n};"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","isName","defaultOptions","allowBooleanAttributes","unpairedTags","validate","xmlData","options","assign","tags","tagFound","reachedRoot","substr","i","readPI","err","isWhiteSpace","getErrorObject","getLineNumberForPosition","tagStartPos","readCommentAndCDATA","closingTag","tagName","trim","substring","validateTagName","result","readAttributeStr","attrStr","attrStrStart","isValid","validateAttributeString","code","msg","line","tagClosed","otg","pop","openPos","col","indexOf","afterAmp","validateAmpersand","JSON","stringify","map","t","replace","char","start","tagname","angleBracketsCount","doubleQuote","singleQuote","startChar","validAttrStrRegxp","attrNames","getPositionFromMatch","undefined","attrName","validateAttrName","re","validateNumberAmpersand","count","message","lineNumber","lines","split","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","val","attributeValueProcessor","stopNodes","alwaysCreateTextNode","isArray","commentPropName","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","maxNestedTags","strictReservedNames","normalizeProcessEntities","enabled","maxEntitySize","maxExpansionDepth","maxTotalExpansions","maxExpandedLength","maxEntityCount","allowedTags","tagFilter","_value$maxEntitySize","_value$maxExpansionDe","_value$maxTotalExpans","_value$maxExpandedLen","_value$maxEntityCount","_value$allowedTags","_value$tagFilter","METADATA_SYMBOL","buildOptions","built","Array","node","startsWith","XmlNode","child","create","_proto","add","_this$child$push","addChild","_this$child$push2","_this$child$push3","keys","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","entities","entityCount","Error","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","escaped","regx","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","toUpperCase","entityValue","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","elementName","contentModel","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","includes","defaultValue","_this$readIdentifierV5","data","seq","j","name","hexRegex","numRegex","consider","decimalPoint","eNotationRegx","Matcher","constructor","separator","path","siblingStacks","attrValues","namespace","values","currentLevel","Map","siblings","siblingKey","counter","position","set","tag","updateCurrent","current","getCurrentTag","getCurrentNamespace","getAttrValue","hasAttr","getPosition","getCounter","getIndex","getDepth","toString","includeNamespace","sep","n","toArray","reset","expression","segments","hasDeepWildcard","_matchWithDeepWildcard","_matchSimple","segment","isCurrentNode","_matchSegment","pathIdx","segIdx","nextSeg","found","attrValue","actualValue","String","positionValue","snapshot","restore","Expression","pattern","_parse","_hasDeepWildcard","some","seg","_hasAttributeCondition","_hasPositionSelector","currentPart","_parseSegment","part","bracketContent","withoutBrackets","bracketMatch","content","slice","tagAndPosition","nsIndex","positionMatch","colonIndex","lastIndexOf","tagPart","posPart","eqIndex","nthMatch","parseInt","hasAttributeCondition","hasPositionSelector","extractRawAttributes","prefixedAttrs","rawAttrs","extractNamespace","rawTagName","ns","OrderedObjParser","currentNode","tagsNodeStack","docTypeEntities","lastEntities","ampEntity","_","str","fromCodePoint","addExternalEntities","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","_step","_iterator","_createForOfIteratorHelperLoose","done","entityExpansionCount","currentExpandedLength","matcher","isCurrentNodeStopNode","stopNodeExpressions","stopNodeExp","externalEntities","entKeys","ent","dontTrim","hasAttributes","isLeafNode","escapeEntities","jPathOrMatcher","newval","parseValue","prefix","charAt","attrsRegx","rawAttrsForMatcher","oldVal","parsedVal","jPathStr","aName","newVal","attrCollection","xmlObj","xmlNode","textData","docTypeReader","closeIndex","findClosingIndex","lastTagName","tagData","readTagExp","childNode","tagExp","attrExpPresent","endIndex","_ref","_ref2","context","Math","max","min","newTagName","lastTag","isSelfClosing","tagContent","entityConfig","entity","lengthBefore","parentNode","errMsg","closingIndex","closingChar","attrBoundary","ch","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","shouldParse","trimmedStr","skipLike","numStr","Number","window","parse_int","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","toNumber","base","codePoint","stripAttributePrefix","prettify","compress","arr","text","compressedObj","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","atrrName","rawAttrName","propCount","XMLParser","parse","validationOption","orderedObjParser","orderedResult","addEntity","toXml","jArray","indentation","format","indentBy","arrToStr","xmlStr","isPreviousElementTag","extractAttributeValues","isStopNode","checkStopNode","tagText","attStr","attr_to_str","tempInd","piTextNodeName","newIdentation","tagStart","tagValue","getRawContent","suppressUnpairedNode","suppressEmptyNode","endsWith","hasAttrs","attr","item","attr_to_str_raw","nestedContent","attrVal","suppressBooleanAttributes","textValue","a","oneListGroup","Builder","isAttribute","attrPrefixLen","processTextOrObjNode","indentate","tagEndChar","newLine","object","level","extractAttributes","rawContent","buildRawContent","buildAttributesForStopNode","buildObjectNode","j2x","buildTextValNode","repeat","build","jObj","buildFromOrderedJs","arrayNodeName","isCurrentStopNode","Date","buildAttrPairStr","closeTag","arrLen","listTagVal","listTagAttr","Ks","L","attrGroup","attrKey","nestedAttrs","cleanKey","tagEndExp","piClosingChar","XMLValidator"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/fxparser.min.js b/lib/fxparser.min.js index 808b2c7c..065d774d 100644 --- a/lib/fxparser.min.js +++ b/lib/fxparser.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.XMLParser=e():t.XMLParser=e()}(this,()=>(()=>{"use strict";var t={d:(e,r)=>{for(var i in r)t.o(r,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:r[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{default:()=>st});var r={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0},tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},stopNodes:[],alwaysCreateTextNode:!1,isArray:function(){return!1},commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,r){return t},captureMetaData:!1,maxNestedTags:100,strictReservedNames:!0,jPath:!0};function i(t){return"boolean"==typeof t?{enabled:t,maxEntitySize:1e4,maxExpansionDepth:10,maxTotalExpansions:1e3,maxExpandedLength:1e5,maxEntityCount:100,allowedTags:null,tagFilter:null}:"object"==typeof t&&null!==t?{enabled:!1!==t.enabled,maxEntitySize:null!=(e=t.maxEntitySize)?e:1e4,maxExpansionDepth:null!=(r=t.maxExpansionDepth)?r:10,maxTotalExpansions:null!=(n=t.maxTotalExpansions)?n:1e3,maxExpandedLength:null!=(a=t.maxExpandedLength)?a:1e5,maxEntityCount:null!=(s=t.maxEntityCount)?s:100,allowedTags:null!=(o=t.allowedTags)?o:null,tagFilter:null!=(h=t.tagFilter)?h:null}:i(!0);var e,r,n,a,s,o,h}var n=function(t){var e=Object.assign({},r,t);return e.processEntities=i(e.processEntities),e.stopNodes&&Array.isArray(e.stopNodes)&&(e.stopNodes=e.stopNodes.map(function(t){return"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t})),e},a=":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",s=new RegExp("^["+a+"]["+a+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function o(t,e){for(var r=[],i=e.exec(t);i;){var n=[];n.startIndex=e.lastIndex-i[0].length;for(var a=i.length,s=0;s0?this.child.push(((r={})[t.tagname]=t.child,r[":@"]=t[":@"],r)):this.child.push(((i={})[t.tagname]=t.child,i)),void 0!==e&&(this.child[this.child.length-1][h]={startIndex:e})},t.getMetaDataSymbol=function(){return h},t}(),p=function(){function t(t){this.suppressValidationErr=!t,this.options=t}var e=t.prototype;return e.readDocType=function(t,e){var r=Object.create(null),i=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var n=1,a=!1,s=!1;e"===t[e]){if(s?"-"===t[e-1]&&"-"===t[e-2]&&(s=!1,n--):n--,0===n)break}else"["===t[e]?a=!0:t[e];else{if(a&&f(t,"!ENTITY",e)){e+=7;var o=void 0,h=void 0,l=this.readEntityExp(t,e+1,this.suppressValidationErr);if(o=l[0],h=l[1],e=l[2],-1===h.indexOf("&")){if(!1!==this.options.enabled&&this.options.maxEntityCount&&i>=this.options.maxEntityCount)throw new Error("Entity count ("+(i+1)+") exceeds maximum allowed ("+this.options.maxEntityCount+")");var u=o.replace(/[.\-+*:]/g,"\\.");r[o]={regx:RegExp("&"+u+";","g"),val:h},i++}}else if(a&&f(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(a&&f(t,"!ATTLIST",e))e+=8;else if(a&&f(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!f(t,"!--",e))throw new Error("Invalid DOCTYPE");s=!0}n++}if(0!==n)throw new Error("Unclosed DOCTYPE");return{entities:r,i:e}},e.readEntityExp=function(t,e){e=d(t,e);for(var r="";ethis.options.maxEntitySize)throw new Error('Entity "'+r+'" size ('+i.length+") exceeds maximum allowed size ("+this.options.maxEntitySize+")");return[r,i,--e]},e.readNotationExp=function(t,e){e=d(t,e);for(var r="";et.length)&&(e=t.length);for(var r=0,i=Array(e);r"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let r=0,i="";for(;r0&&(this.path[this.path.length-1].values=void 0);const i=this.path.length;this.siblingStacks[i]||(this.siblingStacks[i]=new Map);const n=this.siblingStacks[i],a=r?`${r}:${t}`:t,s=n.get(a)||0;let o=0;for(const t of n.values())o+=t;n.set(a,s+1);const h={tag:t,position:o,counter:s};null!=r&&(h.namespace=r),null!=e&&(h.values=e),this.path.push(h)}pop(){if(0===this.path.length)return;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0===this.path.length)return;const e=this.path[this.path.length-1];return e.values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const r=t||this.separator;return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(r)}toArray(){return this.path.map(t=>t.tag)}reset(){this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const i=t[r];if("deep-wildcard"===i.type){if(r--,r<0)return!0;const i=t[r];let n=!1;for(let t=e;t>=0;t--){const a=t===this.path.length-1;if(this._matchSegment(i,this.path[t],a)){e=t-1,r--,n=!0;break}}if(!n)return!1}else{const t=e===this.path.length-1;if(!this._matchSegment(i,this.path[e],t))return!1;e--,r--}}return r<0}_matchSegment(t,e,r){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!r)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue){const r=e.values[t.attrName];if(String(r)!==String(t.attrValue))return!1}}if(void 0!==t.position){if(!r)return!1;const i=e.counter??0;if("first"===t.position&&0!==i)return!1;if("odd"===t.position&&i%2!=1)return!1;if("even"===t.position&&i%2!=0)return!1;if("nth"===t.position&&i!==t.positionValue)return!1}return!0}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}}function y(t,e){if(!t)return{};var r=e.attributesGroupName?t[e.attributesGroupName]:t;if(!r)return{};var i={};for(var n in r)n.startsWith(e.attributeNamePrefix)?i[n.substring(e.attributeNamePrefix.length)]=r[n]:i[n]=r[n];return i}function w(t){if(t&&"string"==typeof t){var e=t.indexOf(":");if(-1!==e&&e>0){var r=t.substring(0,e);if("xmlns"!==r)return r}}}var T=function(t){var e;if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/&#([0-9]{1,7});/g,val:function(t,e){return U(e,10,"&#")}},num_hex:{regex:/&#x([0-9a-fA-F]{1,6});/g,val:function(t,e){return U(e,16,"&#x")}}},this.addExternalEntities=S,this.parseXml=O,this.parseTextData=I,this.resolveNameSpace=P,this.buildAttributesMap=A,this.isItStopNode=k,this.replaceEntitiesValue=_,this.readStopNodeData=F,this.saveTextToParentTag=j,this.addChild=D,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?function(t){for(var r,i=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return E(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?E(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var i=0;return function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(r=i()).done;){var n=r.value;if("string"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:function(){return!1},this.entityExpansionCount=0,this.currentExpandedLength=0,this.matcher=new N,this.isCurrentNodeStopNode=!1,this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodeExpressions=[];for(var r=0;r0)){s||(t=this.replaceEntitiesValue(t,e,r));var o=this.options.jPath?r.toString():r,h=this.options.tagValueProcessor(e,t,o,n,a);return null==h?t:typeof h!=typeof t||h!==t?h:this.options.trimValues||t.trim()===t?L(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function P(t){if(this.options.removeNSPrefix){var e=t.split(":"),r="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=r+e[1])}return t}var C=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function A(t,e,r){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){for(var i=o(t,C),n=i.length,a={},s={},h=0;h0&&"object"==typeof e&&e.updateCurrent&&e.updateCurrent(s);for(var d=0;d",a,"Closing Tag is not closed."),o=t.substring(a+2,s).trim();if(this.options.removeNSPrefix){var h=o.indexOf(":");-1!==h&&(o=o.substr(h+1))}this.options.transformTagName&&(o=this.options.transformTagName(o)),r&&(i=this.saveTextToParentTag(i,r,this.matcher));var l=this.matcher.getCurrentTag();if(o&&-1!==this.options.unpairedTags.indexOf(o))throw new Error("Unpaired tag can not be used as closing tag: ");l&&-1!==this.options.unpairedTags.indexOf(l)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,r=this.tagsNodeStack.pop(),i="",a=s}else if("?"===t[a+1]){var d=M(t,a,!1,"?>");if(!d)throw new Error("Pi Tag is not closed.");if(i=this.saveTextToParentTag(i,r,this.matcher),this.options.ignoreDeclaration&&"?xml"===d.tagName||this.options.ignorePiTags);else{var f=new u(d.tagName);f.add(this.options.textNodeName,""),d.tagName!==d.tagExp&&d.attrExpPresent&&(f[":@"]=this.buildAttributesMap(d.tagExp,this.matcher,d.tagName)),this.addChild(r,f,this.matcher,a)}a=d.closeIndex+1}else if("!--"===t.substr(a+1,3)){var g=V(t,"--\x3e",a+4,"Comment is not closed.");if(this.options.commentPropName){var c,m=t.substring(a+4,g-2);i=this.saveTextToParentTag(i,r,this.matcher),r.add(this.options.commentPropName,[(c={},c[this.options.textNodeName]=m,c)])}a=g}else if("!D"===t.substr(a+1,2)){var v=n.readDocType(t,a);this.docTypeEntities=v.entities,a=v.i}else if("!["===t.substr(a+1,2)){var x=V(t,"]]>",a,"CDATA is not closed.")-2,E=t.substring(a+9,x);i=this.saveTextToParentTag(i,r,this.matcher);var b,N=this.parseTextData(E,r.tagname,this.matcher,!0,!1,!0,!0);null==N&&(N=""),this.options.cdataPropName?r.add(this.options.cdataPropName,[(b={},b[this.options.textNodeName]=E,b)]):r.add(this.options.textNodeName,N),a=x+2}else{var T=M(t,a,this.options.removeNSPrefix);if(!T){var S=t.substring(Math.max(0,a-50),Math.min(t.length,a+50));throw new Error("readTagExp returned undefined at position "+a+'. Context: "'+S+'"')}var I=T.tagName,P=T.rawTagName,C=T.tagExp,A=T.attrExpPresent,O=T.closeIndex;if(this.options.transformTagName){var D=this.options.transformTagName(I);C===I&&(C=D),I=D}if(this.options.strictReservedNames&&(I===this.options.commentPropName||I===this.options.cdataPropName))throw new Error("Invalid tag name: "+I);r&&i&&"!xml"!==r.tagname&&(i=this.saveTextToParentTag(i,r,this.matcher,!1));var _=r;_&&-1!==this.options.unpairedTags.indexOf(_.tagname)&&(r=this.tagsNodeStack.pop(),this.matcher.pop());var j=!1;C.length>0&&C.lastIndexOf("/")===C.length-1&&(j=!0,C="/"===I[I.length-1]?I=I.substr(0,I.length-1):C.substr(0,C.length-1),A=I!==C);var k,F=null;k=w(P),I!==e.tagname&&this.matcher.push(I,{},k),I!==C&&A&&(F=this.buildAttributesMap(C,this.matcher,I))&&y(F,this.options),I!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode(this.stopNodeExpressions,this.matcher));var L=a;if(this.isCurrentNodeStopNode){var U="";if(j)a=T.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(I))a=T.closeIndex;else{var $=this.readStopNodeData(t,P,O+1);if(!$)throw new Error("Unexpected end of "+P);a=$.i,U=$.tagContent}var R=new u(I);F&&(R[":@"]=F),R.add(this.options.textNodeName,U),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(r,R,this.matcher,L)}else{if(j){if(this.options.transformTagName){var Y=this.options.transformTagName(I);C===I&&(C=Y),I=Y}var W=new u(I);F&&(W[":@"]=F),this.addChild(r,W,this.matcher,L),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(-1!==this.options.unpairedTags.indexOf(I)){var X=new u(I);F&&(X[":@"]=F),this.addChild(r,X,this.matcher,L),this.matcher.pop(),this.isCurrentNodeStopNode=!1,a=T.closeIndex;continue}var z=new u(I);if(this.tagsNodeStack.length>this.options.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(r),F&&(z[":@"]=F),this.addChild(r,z,this.matcher,L),r=z}i="",a=O}}else i+=t[a];return e.child};function D(t,e,r,i){this.options.captureMetaData||(i=void 0);var n=this.options.jPath?r.toString():r,a=this.options.updateTag(e.tagname,n,e[":@"]);!1===a||("string"==typeof a?(e.tagname=a,t.addChild(e,i)):t.addChild(e,i))}function _(t,e,r){var i=this.options.processEntities;if(!i||!i.enabled)return t;if(i.allowedTags){var n=this.options.jPath?r.toString():r;if(!(Array.isArray(i.allowedTags)?i.allowedTags.includes(e):i.allowedTags(e,n)))return t}if(i.tagFilter){var a=this.options.jPath?r.toString():r;if(!i.tagFilter(e,a))return t}for(var s in this.docTypeEntities){var o=this.docTypeEntities[s],h=t.match(o.regx);if(h){if(this.entityExpansionCount+=h.length,i.maxTotalExpansions&&this.entityExpansionCount>i.maxTotalExpansions)throw new Error("Entity expansion limit exceeded: "+this.entityExpansionCount+" > "+i.maxTotalExpansions);var l=t.length;if(t=t.replace(o.regx,o.val),i.maxExpandedLength&&(this.currentExpandedLength+=t.length-l,this.currentExpandedLength>i.maxExpandedLength))throw new Error("Total expanded content size exceeded: "+this.currentExpandedLength+" > "+i.maxExpandedLength)}}if(-1===t.indexOf("&"))return t;for(var u in this.lastEntities){var p=this.lastEntities[u];t=t.replace(p.regex,p.val)}if(-1===t.indexOf("&"))return t;if(this.options.htmlEntities)for(var d in this.htmlEntities){var f=this.htmlEntities[d];t=t.replace(f.regex,f.val)}return t.replace(this.ampEntity.regex,this.ampEntity.val)}function j(t,e,r,i){return t&&(void 0===i&&(i=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,r,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,i))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function k(t,e){if(!t||0===t.length)return!1;for(var r=0;r");var n=function(t,e,r){var i;void 0===r&&(r=">");for(var n="",a=e;a",r,e+" is not closed");if(t.substring(r+2,a).trim()===e&&0===--n)return{tagContent:t.substring(i,r),i:a};r=a}else if("?"===t[r+1])r=V(t,"?>",r+1,"StopNode is not closed.");else if("!--"===t.substr(r+1,3))r=V(t,"--\x3e",r+3,"StopNode is not closed.");else if("!["===t.substr(r+1,2))r=V(t,"]]>",r,"StopNode is not closed.")-2;else{var s=M(t,r,">");s&&((s&&s.tagName)===e&&"/"!==s.tagExp[s.tagExp.length-1]&&n++,r=s.closeIndex)}}function L(t,e,r){if(e&&"string"==typeof t){var i=t.trim();return"true"===i||"false"!==i&&function(t,e={}){if(e=Object.assign({},v,e),!t||"string"!=typeof t)return t;let r=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(r))return t;if("0"===t)return 0;if(e.hex&&c.test(r))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(r);if(r.includes("e")||r.includes("E"))return function(t,e,r){if(!r.eNotation)return t;const i=e.match(x);if(i){let n=i[1]||"";const a=-1===i[3].indexOf("e")?"E":"e",s=i[2],o=n?t[s.length+1]===a:t[s.length]===a;return s.length>1&&o?t:1!==s.length||!i[3].startsWith(`.${a}`)&&i[3][0]!==a?r.leadingZeros&&!o?(e=(i[1]||"")+i[3],Number(e)):t:Number(e)}return t}(t,r,e);{const n=m.exec(r);if(n){const a=n[1]||"",s=n[2];let o=(i=n[3])&&-1!==i.indexOf(".")?("."===(i=i.replace(/0+$/,""))?i="0":"."===i[0]?i="0"+i:"."===i[i.length-1]&&(i=i.substring(0,i.length-1)),i):i;const h=a?"."===t[s.length+1]:"."===t[s.length];if(!e.leadingZeros&&(s.length>1||1===s.length&&!h))return t;{const i=Number(r),n=String(i);if(0===i)return i;if(-1!==n.search(/[eE]/))return e.eNotation?i:t;if(-1!==r.indexOf("."))return"0"===n||n===o||n===`${a}${o}`?i:t;let h=s?o:r;return s?h===n||a+h===n?i:t:h===n||h===a+n?i:t}}return t}var i}(t,r)}return void 0!==t?t:""}function U(t,e,r){var i=Number.parseInt(t,e);return i>=0&&i<=1114111?String.fromCodePoint(i):r+t+";"}var $=u.getMetaDataSymbol();function R(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;var r={};for(var i in t)i.startsWith(e)?r[i.substring(e.length)]=t[i]:r[i]=t[i];return r}function Y(t,e,r){return W(t,e,r)}function W(t,e,r){for(var i,n={},a=0;a0&&(n[e.textNodeName]=i):void 0!==i&&(n[e.textNodeName]=i),n}function X(t){for(var e=Object.keys(t),r=0;r5&&"xml"===i)return et("InvalidXml","XML declaration allowed only at the start of the document.",nt(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function K(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var r=1;for(e+=8;e"===t[e]&&0===--r)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}function Q(t,e){for(var r="",i="",n=!1;e"===t[e]&&""===i){n=!0;break}r+=t[e]}return""===i&&{value:r,index:e,tagClosed:n}}var J=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function H(t,e){for(var r=o(t,J),i={},n=0;n"!==t[a]&&" "!==t[a]&&"\t"!==t[a]&&"\n"!==t[a]&&"\r"!==t[a];a++)h+=t[a];if("/"===(h=h.trim())[h.length-1]&&(h=h.substring(0,h.length-1),a--),!it(h))return et("InvalidTag",0===h.trim().length?"Invalid space after '<'.":"Tag '"+h+"' is an invalid name.",nt(t,a));var l=Q(t,a);if(!1===l)return et("InvalidAttr","Attributes for '"+h+"' have open quote.",nt(t,a));var u=l.value;if(a=l.index,"/"===u[u.length-1]){var p=a-u.length,d=H(u=u.substring(0,u.length-1),e);if(!0!==d)return et(d.err.code,d.err.msg,nt(t,p+d.err.line));i=!0}else if(o){if(!l.tagClosed)return et("InvalidTag","Closing tag '"+h+"' doesn't have proper closing.",nt(t,a));if(u.trim().length>0)return et("InvalidTag","Closing tag '"+h+"' can't have attributes or invalid starting.",nt(t,s));if(0===r.length)return et("InvalidTag","Closing tag '"+h+"' has not been opened.",nt(t,s));var f=r.pop();if(h!==f.tagName){var g=nt(t,f.tagStartPos);return et("InvalidTag","Expected closing tag '"+f.tagName+"' (opened in line "+g.line+", col "+g.col+") instead of closing tag '"+h+"'.",nt(t,s))}0==r.length&&(n=!0)}else{var c=H(u,e);if(!0!==c)return et(c.err.code,c.err.msg,nt(t,a-u.length+c.err.line));if(!0===n)return et("InvalidXml","Multiple possible root nodes found.",nt(t,a));-1!==e.unpairedTags.indexOf(h)||r.push({tagName:h,tagStartPos:s}),i=!0}for(a++;a0)||et("InvalidXml","Invalid '"+JSON.stringify(r.map(function(t){return t.tagName}),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):et("InvalidXml","Start tag expected.",1)}(t,e);if(!0!==r)throw Error(r.err.msg+":"+r.err.line+":"+r.err.col)}var i=new T(this.options);i.addExternalEntities(this.externalEntities);var n=i.parseXml(t);return this.options.preserveOrder||void 0===n?n:Y(n,this.options,i.matcher)},e.addEntity=function(t,e){if(-1!==e.indexOf("&"))throw new Error("Entity value can't have '&'");if(-1!==t.indexOf("&")||-1!==t.indexOf(";"))throw new Error("An entity must be set without '&' and ';'. Eg. use '#xD' for ' '");if("&"===e)throw new Error("An entity with value '&' is not permitted");this.externalEntities[t]=e},t.getMetaDataSymbol=function(){return u.getMetaDataSymbol()},t}();return e})()); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.XMLParser=e():t.XMLParser=e()}(this,()=>(()=>{"use strict";var t={d:(e,r)=>{for(var i in r)t.o(r,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:r[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{default:()=>st});var r={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0},tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},stopNodes:[],alwaysCreateTextNode:!1,isArray:function(){return!1},commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,r){return t},captureMetaData:!1,maxNestedTags:100,strictReservedNames:!0,jPath:!0};function i(t){return"boolean"==typeof t?{enabled:t,maxEntitySize:1e4,maxExpansionDepth:10,maxTotalExpansions:1e3,maxExpandedLength:1e5,maxEntityCount:100,allowedTags:null,tagFilter:null}:"object"==typeof t&&null!==t?{enabled:!1!==t.enabled,maxEntitySize:null!=(e=t.maxEntitySize)?e:1e4,maxExpansionDepth:null!=(r=t.maxExpansionDepth)?r:10,maxTotalExpansions:null!=(n=t.maxTotalExpansions)?n:1e3,maxExpandedLength:null!=(a=t.maxExpandedLength)?a:1e5,maxEntityCount:null!=(s=t.maxEntityCount)?s:100,allowedTags:null!=(o=t.allowedTags)?o:null,tagFilter:null!=(h=t.tagFilter)?h:null}:i(!0);var e,r,n,a,s,o,h}var n=function(t){var e=Object.assign({},r,t);return e.processEntities=i(e.processEntities),e.stopNodes&&Array.isArray(e.stopNodes)&&(e.stopNodes=e.stopNodes.map(function(t){return"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t})),e},a=":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",s=new RegExp("^["+a+"]["+a+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function o(t,e){for(var r=[],i=e.exec(t);i;){var n=[];n.startIndex=e.lastIndex-i[0].length;for(var a=i.length,s=0;s0?this.child.push(((r={})[t.tagname]=t.child,r[":@"]=t[":@"],r)):this.child.push(((i={})[t.tagname]=t.child,i)),void 0!==e&&(this.child[this.child.length-1][h]={startIndex:e})},t.getMetaDataSymbol=function(){return h},t}(),p=function(){function t(t){this.suppressValidationErr=!t,this.options=t}var e=t.prototype;return e.readDocType=function(t,e){var r=Object.create(null),i=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var n=1,a=!1,s=!1;e"===t[e]){if(s?"-"===t[e-1]&&"-"===t[e-2]&&(s=!1,n--):n--,0===n)break}else"["===t[e]?a=!0:t[e];else{if(a&&f(t,"!ENTITY",e)){e+=7;var o=void 0,h=void 0,l=this.readEntityExp(t,e+1,this.suppressValidationErr);if(o=l[0],h=l[1],e=l[2],-1===h.indexOf("&")){if(!1!==this.options.enabled&&this.options.maxEntityCount&&i>=this.options.maxEntityCount)throw new Error("Entity count ("+(i+1)+") exceeds maximum allowed ("+this.options.maxEntityCount+")");var u=o.replace(/[.\-+*:]/g,"\\.");r[o]={regx:RegExp("&"+u+";","g"),val:h},i++}}else if(a&&f(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(a&&f(t,"!ATTLIST",e))e+=8;else if(a&&f(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!f(t,"!--",e))throw new Error("Invalid DOCTYPE");s=!0}n++}if(0!==n)throw new Error("Unclosed DOCTYPE");return{entities:r,i:e}},e.readEntityExp=function(t,e){e=d(t,e);for(var r="";ethis.options.maxEntitySize)throw new Error('Entity "'+r+'" size ('+i.length+") exceeds maximum allowed size ("+this.options.maxEntitySize+")");return[r,i,--e]},e.readNotationExp=function(t,e){e=d(t,e);for(var r="";et.length)&&(e=t.length);for(var r=0,i=Array(e);r0&&(this.path[this.path.length-1].values=void 0);const i=this.path.length;this.siblingStacks[i]||(this.siblingStacks[i]=new Map);const n=this.siblingStacks[i],a=r?`${r}:${t}`:t,s=n.get(a)||0;let o=0;for(const t of n.values())o+=t;n.set(a,s+1);const h={tag:t,position:o,counter:s};null!=r&&(h.namespace=r),null!=e&&(h.values=e),this.path.push(h)}pop(){if(0===this.path.length)return;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0===this.path.length)return;const e=this.path[this.path.length-1];return e.values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const r=t||this.separator;return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(r)}toArray(){return this.path.map(t=>t.tag)}reset(){this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const i=t[r];if("deep-wildcard"===i.type){if(r--,r<0)return!0;const i=t[r];let n=!1;for(let t=e;t>=0;t--){const a=t===this.path.length-1;if(this._matchSegment(i,this.path[t],a)){e=t-1,r--,n=!0;break}}if(!n)return!1}else{const t=e===this.path.length-1;if(!this._matchSegment(i,this.path[e],t))return!1;e--,r--}}return r<0}_matchSegment(t,e,r){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!r)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue){const r=e.values[t.attrName];if(String(r)!==String(t.attrValue))return!1}}if(void 0!==t.position){if(!r)return!1;const i=e.counter??0;if("first"===t.position&&0!==i)return!1;if("odd"===t.position&&i%2!=1)return!1;if("even"===t.position&&i%2!=0)return!1;if("nth"===t.position&&i!==t.positionValue)return!1}return!0}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}}class N{constructor(t,e={}){this.pattern=t,this.separator=e.separator||".",this.segments=this._parse(t),this._hasDeepWildcard=this.segments.some(t=>"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let r=0,i="";for(;r0){var r=t.substring(0,e);if("xmlns"!==r)return r}}}var T=function(t){var e;if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/&#([0-9]{1,7});/g,val:function(t,e){return U(e,10,"&#")}},num_hex:{regex:/&#x([0-9a-fA-F]{1,6});/g,val:function(t,e){return U(e,16,"&#x")}}},this.addExternalEntities=S,this.parseXml=O,this.parseTextData=I,this.resolveNameSpace=P,this.buildAttributesMap=A,this.isItStopNode=k,this.replaceEntitiesValue=_,this.readStopNodeData=F,this.saveTextToParentTag=j,this.addChild=D,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?function(t){for(var r,i=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return E(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?E(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var i=0;return function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(r=i()).done;){var n=r.value;if("string"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:function(){return!1},this.entityExpansionCount=0,this.currentExpandedLength=0,this.matcher=new b,this.isCurrentNodeStopNode=!1,this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodeExpressions=[];for(var r=0;r0)){s||(t=this.replaceEntitiesValue(t,e,r));var o=this.options.jPath?r.toString():r,h=this.options.tagValueProcessor(e,t,o,n,a);return null==h?t:typeof h!=typeof t||h!==t?h:this.options.trimValues||t.trim()===t?L(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function P(t){if(this.options.removeNSPrefix){var e=t.split(":"),r="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=r+e[1])}return t}var C=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function A(t,e,r){if(!0!==this.options.ignoreAttributes&&"string"==typeof t){for(var i=o(t,C),n=i.length,a={},s={},h=0;h0&&"object"==typeof e&&e.updateCurrent&&e.updateCurrent(s);for(var d=0;d",a,"Closing Tag is not closed."),o=t.substring(a+2,s).trim();if(this.options.removeNSPrefix){var h=o.indexOf(":");-1!==h&&(o=o.substr(h+1))}this.options.transformTagName&&(o=this.options.transformTagName(o)),r&&(i=this.saveTextToParentTag(i,r,this.matcher));var l=this.matcher.getCurrentTag();if(o&&-1!==this.options.unpairedTags.indexOf(o))throw new Error("Unpaired tag can not be used as closing tag: ");l&&-1!==this.options.unpairedTags.indexOf(l)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,r=this.tagsNodeStack.pop(),i="",a=s}else if("?"===t[a+1]){var d=M(t,a,!1,"?>");if(!d)throw new Error("Pi Tag is not closed.");if(i=this.saveTextToParentTag(i,r,this.matcher),this.options.ignoreDeclaration&&"?xml"===d.tagName||this.options.ignorePiTags);else{var f=new u(d.tagName);f.add(this.options.textNodeName,""),d.tagName!==d.tagExp&&d.attrExpPresent&&(f[":@"]=this.buildAttributesMap(d.tagExp,this.matcher,d.tagName)),this.addChild(r,f,this.matcher,a)}a=d.closeIndex+1}else if("!--"===t.substr(a+1,3)){var g=V(t,"--\x3e",a+4,"Comment is not closed.");if(this.options.commentPropName){var c,m=t.substring(a+4,g-2);i=this.saveTextToParentTag(i,r,this.matcher),r.add(this.options.commentPropName,[(c={},c[this.options.textNodeName]=m,c)])}a=g}else if("!D"===t.substr(a+1,2)){var v=n.readDocType(t,a);this.docTypeEntities=v.entities,a=v.i}else if("!["===t.substr(a+1,2)){var x=V(t,"]]>",a,"CDATA is not closed.")-2,E=t.substring(a+9,x);i=this.saveTextToParentTag(i,r,this.matcher);var b,N=this.parseTextData(E,r.tagname,this.matcher,!0,!1,!0,!0);null==N&&(N=""),this.options.cdataPropName?r.add(this.options.cdataPropName,[(b={},b[this.options.textNodeName]=E,b)]):r.add(this.options.textNodeName,N),a=x+2}else{var T=M(t,a,this.options.removeNSPrefix);if(!T){var S=t.substring(Math.max(0,a-50),Math.min(t.length,a+50));throw new Error("readTagExp returned undefined at position "+a+'. Context: "'+S+'"')}var I=T.tagName,P=T.rawTagName,C=T.tagExp,A=T.attrExpPresent,O=T.closeIndex;if(this.options.transformTagName){var D=this.options.transformTagName(I);C===I&&(C=D),I=D}if(this.options.strictReservedNames&&(I===this.options.commentPropName||I===this.options.cdataPropName))throw new Error("Invalid tag name: "+I);r&&i&&"!xml"!==r.tagname&&(i=this.saveTextToParentTag(i,r,this.matcher,!1));var _=r;_&&-1!==this.options.unpairedTags.indexOf(_.tagname)&&(r=this.tagsNodeStack.pop(),this.matcher.pop());var j=!1;C.length>0&&C.lastIndexOf("/")===C.length-1&&(j=!0,C="/"===I[I.length-1]?I=I.substr(0,I.length-1):C.substr(0,C.length-1),A=I!==C);var k,F=null;k=w(P),I!==e.tagname&&this.matcher.push(I,{},k),I!==C&&A&&(F=this.buildAttributesMap(C,this.matcher,I))&&y(F,this.options),I!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode(this.stopNodeExpressions,this.matcher));var L=a;if(this.isCurrentNodeStopNode){var U="";if(j)a=T.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(I))a=T.closeIndex;else{var $=this.readStopNodeData(t,P,O+1);if(!$)throw new Error("Unexpected end of "+P);a=$.i,U=$.tagContent}var R=new u(I);F&&(R[":@"]=F),R.add(this.options.textNodeName,U),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(r,R,this.matcher,L)}else{if(j){if(this.options.transformTagName){var Y=this.options.transformTagName(I);C===I&&(C=Y),I=Y}var W=new u(I);F&&(W[":@"]=F),this.addChild(r,W,this.matcher,L),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(-1!==this.options.unpairedTags.indexOf(I)){var X=new u(I);F&&(X[":@"]=F),this.addChild(r,X,this.matcher,L),this.matcher.pop(),this.isCurrentNodeStopNode=!1,a=T.closeIndex;continue}var z=new u(I);if(this.tagsNodeStack.length>this.options.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(r),F&&(z[":@"]=F),this.addChild(r,z,this.matcher,L),r=z}i="",a=O}}else i+=t[a];return e.child};function D(t,e,r,i){this.options.captureMetaData||(i=void 0);var n=this.options.jPath?r.toString():r,a=this.options.updateTag(e.tagname,n,e[":@"]);!1===a||("string"==typeof a?(e.tagname=a,t.addChild(e,i)):t.addChild(e,i))}function _(t,e,r){var i=this.options.processEntities;if(!i||!i.enabled)return t;if(i.allowedTags){var n=this.options.jPath?r.toString():r;if(!(Array.isArray(i.allowedTags)?i.allowedTags.includes(e):i.allowedTags(e,n)))return t}if(i.tagFilter){var a=this.options.jPath?r.toString():r;if(!i.tagFilter(e,a))return t}for(var s in this.docTypeEntities){var o=this.docTypeEntities[s],h=t.match(o.regx);if(h){if(this.entityExpansionCount+=h.length,i.maxTotalExpansions&&this.entityExpansionCount>i.maxTotalExpansions)throw new Error("Entity expansion limit exceeded: "+this.entityExpansionCount+" > "+i.maxTotalExpansions);var l=t.length;if(t=t.replace(o.regx,o.val),i.maxExpandedLength&&(this.currentExpandedLength+=t.length-l,this.currentExpandedLength>i.maxExpandedLength))throw new Error("Total expanded content size exceeded: "+this.currentExpandedLength+" > "+i.maxExpandedLength)}}if(-1===t.indexOf("&"))return t;for(var u in this.lastEntities){var p=this.lastEntities[u];t=t.replace(p.regex,p.val)}if(-1===t.indexOf("&"))return t;if(this.options.htmlEntities)for(var d in this.htmlEntities){var f=this.htmlEntities[d];t=t.replace(f.regex,f.val)}return t.replace(this.ampEntity.regex,this.ampEntity.val)}function j(t,e,r,i){return t&&(void 0===i&&(i=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,r,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,i))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function k(t,e){if(!t||0===t.length)return!1;for(var r=0;r");var n=function(t,e,r){var i;void 0===r&&(r=">");for(var n="",a=e;a",r,e+" is not closed");if(t.substring(r+2,a).trim()===e&&0===--n)return{tagContent:t.substring(i,r),i:a};r=a}else if("?"===t[r+1])r=V(t,"?>",r+1,"StopNode is not closed.");else if("!--"===t.substr(r+1,3))r=V(t,"--\x3e",r+3,"StopNode is not closed.");else if("!["===t.substr(r+1,2))r=V(t,"]]>",r,"StopNode is not closed.")-2;else{var s=M(t,r,">");s&&((s&&s.tagName)===e&&"/"!==s.tagExp[s.tagExp.length-1]&&n++,r=s.closeIndex)}}function L(t,e,r){if(e&&"string"==typeof t){var i=t.trim();return"true"===i||"false"!==i&&function(t,e={}){if(e=Object.assign({},v,e),!t||"string"!=typeof t)return t;let r=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(r))return t;if("0"===t)return 0;if(e.hex&&c.test(r))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(r);if(r.includes("e")||r.includes("E"))return function(t,e,r){if(!r.eNotation)return t;const i=e.match(x);if(i){let n=i[1]||"";const a=-1===i[3].indexOf("e")?"E":"e",s=i[2],o=n?t[s.length+1]===a:t[s.length]===a;return s.length>1&&o?t:1!==s.length||!i[3].startsWith(`.${a}`)&&i[3][0]!==a?r.leadingZeros&&!o?(e=(i[1]||"")+i[3],Number(e)):t:Number(e)}return t}(t,r,e);{const n=m.exec(r);if(n){const a=n[1]||"",s=n[2];let o=(i=n[3])&&-1!==i.indexOf(".")?("."===(i=i.replace(/0+$/,""))?i="0":"."===i[0]?i="0"+i:"."===i[i.length-1]&&(i=i.substring(0,i.length-1)),i):i;const h=a?"."===t[s.length+1]:"."===t[s.length];if(!e.leadingZeros&&(s.length>1||1===s.length&&!h))return t;{const i=Number(r),n=String(i);if(0===i)return i;if(-1!==n.search(/[eE]/))return e.eNotation?i:t;if(-1!==r.indexOf("."))return"0"===n||n===o||n===`${a}${o}`?i:t;let h=s?o:r;return s?h===n||a+h===n?i:t:h===n||h===a+n?i:t}}return t}var i}(t,r)}return void 0!==t?t:""}function U(t,e,r){var i=Number.parseInt(t,e);return i>=0&&i<=1114111?String.fromCodePoint(i):r+t+";"}var $=u.getMetaDataSymbol();function R(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;var r={};for(var i in t)i.startsWith(e)?r[i.substring(e.length)]=t[i]:r[i]=t[i];return r}function Y(t,e,r){return W(t,e,r)}function W(t,e,r){for(var i,n={},a=0;a0&&(n[e.textNodeName]=i):void 0!==i&&(n[e.textNodeName]=i),n}function X(t){for(var e=Object.keys(t),r=0;r5&&"xml"===i)return et("InvalidXml","XML declaration allowed only at the start of the document.",nt(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function K(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var r=1;for(e+=8;e"===t[e]&&0===--r)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}function Q(t,e){for(var r="",i="",n=!1;e"===t[e]&&""===i){n=!0;break}r+=t[e]}return""===i&&{value:r,index:e,tagClosed:n}}var J=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function H(t,e){for(var r=o(t,J),i={},n=0;n"!==t[a]&&" "!==t[a]&&"\t"!==t[a]&&"\n"!==t[a]&&"\r"!==t[a];a++)h+=t[a];if("/"===(h=h.trim())[h.length-1]&&(h=h.substring(0,h.length-1),a--),!it(h))return et("InvalidTag",0===h.trim().length?"Invalid space after '<'.":"Tag '"+h+"' is an invalid name.",nt(t,a));var l=Q(t,a);if(!1===l)return et("InvalidAttr","Attributes for '"+h+"' have open quote.",nt(t,a));var u=l.value;if(a=l.index,"/"===u[u.length-1]){var p=a-u.length,d=H(u=u.substring(0,u.length-1),e);if(!0!==d)return et(d.err.code,d.err.msg,nt(t,p+d.err.line));i=!0}else if(o){if(!l.tagClosed)return et("InvalidTag","Closing tag '"+h+"' doesn't have proper closing.",nt(t,a));if(u.trim().length>0)return et("InvalidTag","Closing tag '"+h+"' can't have attributes or invalid starting.",nt(t,s));if(0===r.length)return et("InvalidTag","Closing tag '"+h+"' has not been opened.",nt(t,s));var f=r.pop();if(h!==f.tagName){var g=nt(t,f.tagStartPos);return et("InvalidTag","Expected closing tag '"+f.tagName+"' (opened in line "+g.line+", col "+g.col+") instead of closing tag '"+h+"'.",nt(t,s))}0==r.length&&(n=!0)}else{var c=H(u,e);if(!0!==c)return et(c.err.code,c.err.msg,nt(t,a-u.length+c.err.line));if(!0===n)return et("InvalidXml","Multiple possible root nodes found.",nt(t,a));-1!==e.unpairedTags.indexOf(h)||r.push({tagName:h,tagStartPos:s}),i=!0}for(a++;a0)||et("InvalidXml","Invalid '"+JSON.stringify(r.map(function(t){return t.tagName}),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):et("InvalidXml","Start tag expected.",1)}(t,e);if(!0!==r)throw Error(r.err.msg+":"+r.err.line+":"+r.err.col)}var i=new T(this.options);i.addExternalEntities(this.externalEntities);var n=i.parseXml(t);return this.options.preserveOrder||void 0===n?n:Y(n,this.options,i.matcher)},e.addEntity=function(t,e){if(-1!==e.indexOf("&"))throw new Error("Entity value can't have '&'");if(-1!==t.indexOf("&")||-1!==t.indexOf(";"))throw new Error("An entity must be set without '&' and ';'. Eg. use '#xD' for ' '");if("&"===e)throw new Error("An entity with value '&' is not permitted");this.externalEntities[t]=e},t.getMetaDataSymbol=function(){return u.getMetaDataSymbol()},t}();return e})()); //# sourceMappingURL=fxparser.min.js.map \ No newline at end of file diff --git a/lib/fxparser.min.js.map b/lib/fxparser.min.js.map index 828b2ea7..60b748ee 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/webpack/universalModuleDefinition","webpack://XMLParser/webpack/bootstrap","webpack://XMLParser/webpack/runtime/define property getters","webpack://XMLParser/webpack/runtime/hasOwnProperty shorthand","webpack://XMLParser/webpack/runtime/make namespace object","webpack://XMLParser/./src/xmlparser/OptionsBuilder.js","webpack://XMLParser/./src/util.js","webpack://XMLParser/./src/xmlparser/xmlNode.js","webpack://XMLParser/./src/xmlparser/DocTypeReader.js","webpack://XMLParser/./node_modules/strnum/strnum.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/Expression.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/Matcher.js","webpack://XMLParser/./src/xmlparser/OrderedObjParser.js","webpack://XMLParser/./src/ignoreAttributes.js","webpack://XMLParser/./src/xmlparser/node2json.js","webpack://XMLParser/./src/validator.js","webpack://XMLParser/./src/xmlparser/XMLParser.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"XMLParser\"] = factory();\n\telse\n\t\troot[\"XMLParser\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export const 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 eNotation: 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 ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function (tagName, jPath, attrs) {\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n maxNestedTags: 100,\n strictReservedNames: true,\n jPath: true, // if true, pass jPath string to callbacks; if false, pass matcher instance\n};\n\n/**\n * Normalizes processEntities option for backward compatibility\n * @param {boolean|object} value \n * @returns {object} Always returns normalized object\n */\nfunction normalizeProcessEntities(value) {\n // Boolean backward compatibility\n if (typeof value === 'boolean') {\n return {\n enabled: value, // true or false\n maxEntitySize: 10000,\n maxExpansionDepth: 10,\n maxTotalExpansions: 1000,\n maxExpandedLength: 100000,\n maxEntityCount: 100,\n allowedTags: null,\n tagFilter: null\n };\n }\n\n // Object config - merge with defaults\n if (typeof value === 'object' && value !== null) {\n return {\n enabled: value.enabled !== false, // default true if not specified\n maxEntitySize: value.maxEntitySize ?? 10000,\n maxExpansionDepth: value.maxExpansionDepth ?? 10,\n maxTotalExpansions: value.maxTotalExpansions ?? 1000,\n maxExpandedLength: value.maxExpandedLength ?? 100000,\n maxEntityCount: value.maxEntityCount ?? 100,\n allowedTags: value.allowedTags ?? null,\n tagFilter: value.tagFilter ?? null\n };\n }\n\n // Default to enabled with limits\n return normalizeProcessEntities(true);\n}\n\nexport const buildOptions = function (options) {\n const built = Object.assign({}, defaultOptions, options);\n\n // Always normalize processEntities for backward compatibility and validation\n built.processEntities = normalizeProcessEntities(built.processEntities);\n\n // Convert old-style stopNodes for backward compatibility\n if (built.stopNodes && Array.isArray(built.stopNodes)) {\n built.stopNodes = built.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Old syntax: *.tagname meant \"tagname anywhere\"\n // Convert to new syntax: ..tagname\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n //console.debug(built.processEntities)\n return built;\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';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(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\nexport const isName = function (string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = Object.create(null); //attributes map\n }\n add(key, val) {\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if (key === \"__proto__\") key = \"#__proto__\";\n this.child.push({ [key]: val });\n }\n addChild(node, startIndex) {\n if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\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 // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import { isName } from '../util.js';\n\nexport default class DocTypeReader {\n constructor(options) {\n this.suppressValidationErr = !options;\n this.options = options;\n }\n\n readDocType(xmlData, i) {\n const entities = Object.create(null);\n let entityCount = 0;\n\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 i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === '<' && !comment) { //Determine the tag type\n if (hasBody && hasSeq(xmlData, \"!ENTITY\", i)) {\n i += 7;\n let entityName, val;\n [entityName, val, i] = this.readEntityExp(xmlData, i + 1, this.suppressValidationErr);\n if (val.indexOf(\"&\") === -1) { //Parameter entities are not supported\n if (this.options.enabled !== false &&\n this.options.maxEntityCount &&\n entityCount >= this.options.maxEntityCount) {\n throw new Error(\n `Entity count (${entityCount + 1}) exceeds maximum allowed (${this.options.maxEntityCount})`\n );\n }\n const escaped = entityName.replace(/[.\\-+*:]/g, '\\\\.');\n entities[entityName] = {\n regx: RegExp(`&${escaped};`, \"g\"),\n val: val\n };\n entityCount++;\n }\n }\n else if (hasBody && hasSeq(xmlData, \"!ELEMENT\", i)) {\n i += 8;//Not supported\n const { index } = this.readElementExp(xmlData, i + 1);\n i = index;\n } else if (hasBody && hasSeq(xmlData, \"!ATTLIST\", i)) {\n i += 8;//Not supported\n // const {index} = this.readAttlistExp(xmlData,i+1);\n // i = index;\n } else if (hasBody && hasSeq(xmlData, \"!NOTATION\", i)) {\n i += 9;//Not supported\n const { index } = this.readNotationExp(xmlData, i + 1, this.suppressValidationErr);\n i = index;\n } else if (hasSeq(xmlData, \"!--\", i)) comment = true;\n else throw new Error(`Invalid DOCTYPE`);\n\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === '>') { //Read tag content\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\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 readEntityExp(xmlData, i) {\n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after this.options.maxEntitySize) {\n throw new Error(\n `Entity \"${entityName}\" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`\n );\n }\n\n i--;\n return [entityName, entityValue, i];\n }\n\n readNotationExp(xmlData, i) {\n // Skip leading whitespace after \n // \n // \n // \n // \n\n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq, i) {\n for (let j = 0; j < seq.length; j++) {\n if (seq[j] !== data[i + j + 1]) return false;\n }\n return true;\n}\n\nfunction validateEntityName(name) {\n if (isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/;\n// const octRegex = /^0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n \nconst consider = {\n hex : true,\n // oct: false,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true,\n //skipLike: /regex/\n};\n\nexport default function toNumber(str, options = {}){\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n \n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if(str===\"0\") return 0;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return parse_int(trimmedStr, 16);\n // }else if (options.oct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n }else if (trimmedStr.includes('e') || trimmedStr.includes('E')) { //eNotation\n return resolveEnotation(str,trimmedStr,options);\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 // +00.123 => [ , '+', '00', '.123', ..\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 const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length+1] === \".\" \n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if(!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1 \n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))){\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if( num === 0) return num;\n if(parsedStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n if(parsedStr === \"0\") return num; //0.0\n else if(parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n \n let n = leadingZeros? numTrimmedByZeros : trimmedStr;\n if(leadingZeros){\n // -009 => -9\n return (n === parsedStr) || (sign+n === parsedStr) ? num : str\n }else {\n // +9\n return (n === parsedStr) || (n === sign+parsedStr) ? num : str\n }\n }\n }else{ //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str,trimmedStr,options){\n if(!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx); \n if(notation){\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length+1] === eChar \n : str[leadingZeros.length] === eChar;\n\n if(leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if(leadingZeros.length === 1 \n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)){\n return Number(trimmedStr);\n }else if(options.leadingZeros && !eAdjacentToLeadingZeros){ //accept with leading zeros\n //remove leading 0s\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n }else return str;\n }else{\n return str;\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.substring(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base){\n //polyfill\n if(parseInt) return parseInt(numStr, base);\n else if(Number.parseInt) return Number.parseInt(numStr, base);\n else if(window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}","/**\n * Expression - Parses and stores a tag pattern expression\n * \n * Patterns are parsed once and stored in an optimized structure for fast matching.\n * \n * @example\n * const expr = new Expression(\"root.users.user\");\n * const expr2 = new Expression(\"..user[id]:first\");\n * const expr3 = new Expression(\"root/users/user\", { separator: '/' });\n */\nexport default class Expression {\n /**\n * Create a new Expression\n * @param {string} pattern - Pattern string (e.g., \"root.users.user\", \"..user[id]\")\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Path separator (default: '.')\n */\n constructor(pattern, options = {}) {\n this.pattern = pattern;\n this.separator = options.separator || '.';\n this.segments = this._parse(pattern);\n\n // Cache expensive checks for performance (O(1) instead of O(n))\n this._hasDeepWildcard = this.segments.some(seg => seg.type === 'deep-wildcard');\n this._hasAttributeCondition = this.segments.some(seg => seg.attrName !== undefined);\n this._hasPositionSelector = this.segments.some(seg => seg.position !== undefined);\n }\n\n /**\n * Parse pattern string into segments\n * @private\n * @param {string} pattern - Pattern to parse\n * @returns {Array} Array of segment objects\n */\n _parse(pattern) {\n const segments = [];\n\n // Split by separator but handle \"..\" specially\n let i = 0;\n let currentPart = '';\n\n while (i < pattern.length) {\n if (pattern[i] === this.separator) {\n // Check if next char is also separator (deep wildcard)\n if (i + 1 < pattern.length && pattern[i + 1] === this.separator) {\n // Flush current part if any\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n currentPart = '';\n }\n // Add deep wildcard\n segments.push({ type: 'deep-wildcard' });\n i += 2; // Skip both separators\n } else {\n // Regular separator\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n currentPart = '';\n i++;\n }\n } else {\n currentPart += pattern[i];\n i++;\n }\n }\n\n // Flush remaining part\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n\n return segments;\n }\n\n /**\n * Parse a single segment\n * @private\n * @param {string} part - Segment string (e.g., \"user\", \"ns::user\", \"user[id]\", \"ns::user:first\")\n * @returns {Object} Segment object\n */\n _parseSegment(part) {\n const segment = { type: 'tag' };\n\n // NEW NAMESPACE SYNTAX (v2.0):\n // ============================\n // Namespace uses DOUBLE colon (::)\n // Position uses SINGLE colon (:)\n // \n // Examples:\n // \"user\" → tag\n // \"user:first\" → tag + position\n // \"user[id]\" → tag + attribute\n // \"user[id]:first\" → tag + attribute + position\n // \"ns::user\" → namespace + tag\n // \"ns::user:first\" → namespace + tag + position\n // \"ns::user[id]\" → namespace + tag + attribute\n // \"ns::user[id]:first\" → namespace + tag + attribute + position\n // \"ns::first\" → namespace + tag named \"first\" (NO ambiguity!)\n //\n // This eliminates all ambiguity:\n // :: = namespace separator\n // : = position selector\n // [] = attributes\n\n // Step 1: Extract brackets [attr] or [attr=value]\n let bracketContent = null;\n let withoutBrackets = part;\n\n const bracketMatch = part.match(/^([^\\[]+)(\\[[^\\]]*\\])(.*)$/);\n if (bracketMatch) {\n withoutBrackets = bracketMatch[1] + bracketMatch[3];\n if (bracketMatch[2]) {\n const content = bracketMatch[2].slice(1, -1);\n if (content) {\n bracketContent = content;\n }\n }\n }\n\n // Step 2: Check for namespace (double colon ::)\n let namespace = undefined;\n let tagAndPosition = withoutBrackets;\n\n if (withoutBrackets.includes('::')) {\n const nsIndex = withoutBrackets.indexOf('::');\n namespace = withoutBrackets.substring(0, nsIndex).trim();\n tagAndPosition = withoutBrackets.substring(nsIndex + 2).trim(); // Skip ::\n\n if (!namespace) {\n throw new Error(`Invalid namespace in pattern: ${part}`);\n }\n }\n\n // Step 3: Parse tag and position (single colon :)\n let tag = undefined;\n let positionMatch = null;\n\n if (tagAndPosition.includes(':')) {\n const colonIndex = tagAndPosition.lastIndexOf(':'); // Use last colon for position\n const tagPart = tagAndPosition.substring(0, colonIndex).trim();\n const posPart = tagAndPosition.substring(colonIndex + 1).trim();\n\n // Verify position is a valid keyword\n const isPositionKeyword = ['first', 'last', 'odd', 'even'].includes(posPart) ||\n /^nth\\(\\d+\\)$/.test(posPart);\n\n if (isPositionKeyword) {\n tag = tagPart;\n positionMatch = posPart;\n } else {\n // Not a valid position keyword, treat whole thing as tag\n tag = tagAndPosition;\n }\n } else {\n tag = tagAndPosition;\n }\n\n if (!tag) {\n throw new Error(`Invalid segment pattern: ${part}`);\n }\n\n segment.tag = tag;\n if (namespace) {\n segment.namespace = namespace;\n }\n\n // Step 4: Parse attributes\n if (bracketContent) {\n if (bracketContent.includes('=')) {\n const eqIndex = bracketContent.indexOf('=');\n segment.attrName = bracketContent.substring(0, eqIndex).trim();\n segment.attrValue = bracketContent.substring(eqIndex + 1).trim();\n } else {\n segment.attrName = bracketContent.trim();\n }\n }\n\n // Step 5: Parse position selector\n if (positionMatch) {\n const nthMatch = positionMatch.match(/^nth\\((\\d+)\\)$/);\n if (nthMatch) {\n segment.position = 'nth';\n segment.positionValue = parseInt(nthMatch[1], 10);\n } else {\n segment.position = positionMatch;\n }\n }\n\n return segment;\n }\n\n /**\n * Get the number of segments\n * @returns {number}\n */\n get length() {\n return this.segments.length;\n }\n\n /**\n * Check if expression contains deep wildcard\n * @returns {boolean}\n */\n hasDeepWildcard() {\n return this._hasDeepWildcard;\n }\n\n /**\n * Check if expression has attribute conditions\n * @returns {boolean}\n */\n hasAttributeCondition() {\n return this._hasAttributeCondition;\n }\n\n /**\n * Check if expression has position selectors\n * @returns {boolean}\n */\n hasPositionSelector() {\n return this._hasPositionSelector;\n }\n\n /**\n * Get string representation\n * @returns {string}\n */\n toString() {\n return this.pattern;\n }\n}","/**\n * Matcher - Tracks current path in XML/JSON tree and matches against Expressions\n * \n * The matcher maintains a stack of nodes representing the current path from root to\n * current tag. It only stores attribute values for the current (top) node to minimize\n * memory usage. Sibling tracking is used to auto-calculate position and counter.\n * \n * @example\n * const matcher = new Matcher();\n * matcher.push(\"root\", {});\n * matcher.push(\"users\", {});\n * matcher.push(\"user\", { id: \"123\", type: \"admin\" });\n * \n * const expr = new Expression(\"root.users.user\");\n * matcher.matches(expr); // true\n */\nexport default class Matcher {\n /**\n * Create a new Matcher\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Default path separator (default: '.')\n */\n constructor(options = {}) {\n this.separator = options.separator || '.';\n this.path = [];\n this.siblingStacks = [];\n // Each path node: { tag: string, values: object, position: number, counter: number }\n // values only present for current (last) node\n // Each siblingStacks entry: Map tracking occurrences at each level\n }\n\n /**\n * Push a new tag onto the path\n * @param {string} tagName - Name of the tag\n * @param {Object} attrValues - Attribute key-value pairs for current node (optional)\n * @param {string} namespace - Namespace for the tag (optional)\n */\n push(tagName, attrValues = null, namespace = null) {\n // Remove values from previous current node (now becoming ancestor)\n if (this.path.length > 0) {\n const prev = this.path[this.path.length - 1];\n prev.values = undefined;\n }\n\n // Get or create sibling tracking for current level\n const currentLevel = this.path.length;\n if (!this.siblingStacks[currentLevel]) {\n this.siblingStacks[currentLevel] = new Map();\n }\n\n const siblings = this.siblingStacks[currentLevel];\n\n // Create a unique key for sibling tracking that includes namespace\n const siblingKey = namespace ? `${namespace}:${tagName}` : tagName;\n\n // Calculate counter (how many times this tag appeared at this level)\n const counter = siblings.get(siblingKey) || 0;\n\n // Calculate position (total children at this level so far)\n let position = 0;\n for (const count of siblings.values()) {\n position += count;\n }\n\n // Update sibling count for this tag\n siblings.set(siblingKey, counter + 1);\n\n // Create new node\n const node = {\n tag: tagName,\n position: position,\n counter: counter\n };\n\n // Store namespace if provided\n if (namespace !== null && namespace !== undefined) {\n node.namespace = namespace;\n }\n\n // Store values only for current node\n if (attrValues !== null && attrValues !== undefined) {\n node.values = attrValues;\n }\n\n this.path.push(node);\n }\n\n /**\n * Pop the last tag from the path\n * @returns {Object|undefined} The popped node\n */\n pop() {\n if (this.path.length === 0) {\n return undefined;\n }\n\n const node = this.path.pop();\n\n // Clean up sibling tracking for levels deeper than current\n // After pop, path.length is the new depth\n // We need to clean up siblingStacks[path.length + 1] and beyond\n if (this.siblingStacks.length > this.path.length + 1) {\n this.siblingStacks.length = this.path.length + 1;\n }\n\n return node;\n }\n\n /**\n * Update current node's attribute values\n * Useful when attributes are parsed after push\n * @param {Object} attrValues - Attribute values\n */\n updateCurrent(attrValues) {\n if (this.path.length > 0) {\n const current = this.path[this.path.length - 1];\n if (attrValues !== null && attrValues !== undefined) {\n current.values = attrValues;\n }\n }\n }\n\n /**\n * Get current tag name\n * @returns {string|undefined}\n */\n getCurrentTag() {\n return this.path.length > 0 ? this.path[this.path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n return this.path.length > 0 ? this.path[this.path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value\n * @param {string} attrName - Attribute name\n * @returns {*} Attribute value or undefined\n */\n getAttrValue(attrName) {\n if (this.path.length === 0) return undefined;\n const current = this.path[this.path.length - 1];\n return current.values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute\n * @param {string} attrName - Attribute name\n * @returns {boolean}\n */\n hasAttr(attrName) {\n if (this.path.length === 0) return false;\n const current = this.path[this.path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent)\n * @returns {number}\n */\n getPosition() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name)\n * @returns {number}\n */\n getCounter() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition for backward compatibility)\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth\n * @returns {number}\n */\n getDepth() {\n return this.path.length;\n }\n\n /**\n * Get path as string\n * @param {string} separator - Optional separator (uses default if not provided)\n * @param {boolean} includeNamespace - Whether to include namespace in output (default: true)\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n const sep = separator || this.separator;\n return this.path.map(n => {\n if (includeNamespace && n.namespace) {\n return `${n.namespace}:${n.tag}`;\n }\n return n.tag;\n }).join(sep);\n }\n\n /**\n * Get path as array of tag names\n * @returns {string[]}\n */\n toArray() {\n return this.path.map(n => n.tag);\n }\n\n /**\n * Reset the path to empty\n */\n reset() {\n this.path = [];\n this.siblingStacks = [];\n }\n\n /**\n * Match current path against an Expression\n * @param {Expression} expression - The expression to match against\n * @returns {boolean} True if current path matches the expression\n */\n matches(expression) {\n const segments = expression.segments;\n\n if (segments.length === 0) {\n return false;\n }\n\n // Handle deep wildcard patterns\n if (expression.hasDeepWildcard()) {\n return this._matchWithDeepWildcard(segments);\n }\n\n // Simple path matching (no deep wildcards)\n return this._matchSimple(segments);\n }\n\n /**\n * Match simple path (no deep wildcards)\n * @private\n */\n _matchSimple(segments) {\n // Path must be same length as segments\n if (this.path.length !== segments.length) {\n return false;\n }\n\n // Match each segment bottom-to-top\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const node = this.path[i];\n const isCurrentNode = (i === this.path.length - 1);\n\n if (!this._matchSegment(segment, node, isCurrentNode)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Match path with deep wildcards\n * @private\n */\n _matchWithDeepWildcard(segments) {\n let pathIdx = this.path.length - 1; // Start from current node (bottom)\n let segIdx = segments.length - 1; // Start from last segment\n\n while (segIdx >= 0 && pathIdx >= 0) {\n const segment = segments[segIdx];\n\n if (segment.type === 'deep-wildcard') {\n // \"..\" matches zero or more levels\n segIdx--;\n\n if (segIdx < 0) {\n // Pattern ends with \"..\", always matches\n return true;\n }\n\n // Find where next segment matches in the path\n const nextSeg = segments[segIdx];\n let found = false;\n\n for (let i = pathIdx; i >= 0; i--) {\n const isCurrentNode = (i === this.path.length - 1);\n if (this._matchSegment(nextSeg, this.path[i], isCurrentNode)) {\n pathIdx = i - 1;\n segIdx--;\n found = true;\n break;\n }\n }\n\n if (!found) {\n return false;\n }\n } else {\n // Regular segment\n const isCurrentNode = (pathIdx === this.path.length - 1);\n if (!this._matchSegment(segment, this.path[pathIdx], isCurrentNode)) {\n return false;\n }\n pathIdx--;\n segIdx--;\n }\n }\n\n // All segments must be consumed\n return segIdx < 0;\n }\n\n /**\n * Match a single segment against a node\n * @private\n * @param {Object} segment - Segment from Expression\n * @param {Object} node - Node from path\n * @param {boolean} isCurrentNode - Whether this is the current (last) node\n * @returns {boolean}\n */\n _matchSegment(segment, node, isCurrentNode) {\n // Match tag name (* is wildcard)\n if (segment.tag !== '*' && segment.tag !== node.tag) {\n return false;\n }\n\n // Match namespace if specified in segment\n if (segment.namespace !== undefined) {\n // Segment has namespace - node must match it\n if (segment.namespace !== '*' && segment.namespace !== node.namespace) {\n return false;\n }\n }\n // If segment has no namespace, it matches nodes with or without namespace\n\n // Match attribute name (check if node has this attribute)\n // Can only check for current node since ancestors don't have values\n if (segment.attrName !== undefined) {\n if (!isCurrentNode) {\n // Can't check attributes for ancestor nodes (values not stored)\n return false;\n }\n\n if (!node.values || !(segment.attrName in node.values)) {\n return false;\n }\n\n // Match attribute value (only possible for current node)\n if (segment.attrValue !== undefined) {\n const actualValue = node.values[segment.attrName];\n // Both should be strings\n if (String(actualValue) !== String(segment.attrValue)) {\n return false;\n }\n }\n }\n\n // Match position (only for current node)\n if (segment.position !== undefined) {\n if (!isCurrentNode) {\n // Can't check position for ancestor nodes\n return false;\n }\n\n const counter = node.counter ?? 0;\n\n if (segment.position === 'first' && counter !== 0) {\n return false;\n } else if (segment.position === 'odd' && counter % 2 !== 1) {\n return false;\n } else if (segment.position === 'even' && counter % 2 !== 0) {\n return false;\n } else if (segment.position === 'nth') {\n if (counter !== segment.positionValue) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Create a snapshot of current state\n * @returns {Object} State snapshot\n */\n snapshot() {\n return {\n path: this.path.map(node => ({ ...node })),\n siblingStacks: this.siblingStacks.map(map => new Map(map))\n };\n }\n\n /**\n * Restore state from snapshot\n * @param {Object} snapshot - State snapshot\n */\n restore(snapshot) {\n this.path = snapshot.path.map(node => ({ ...node }));\n this.siblingStacks = snapshot.siblingStacks.map(map => new Map(map));\n }\n}","'use strict';\n///@ts-check\n\nimport { getAllMatches, isExist } from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\n\n\n// const 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\n// Helper functions for attribute and namespace handling\n\n/**\n * Extract raw attributes (without prefix) from prefixed attribute map\n * @param {object} prefixedAttrs - Attributes with prefix from buildAttributesMap\n * @param {object} options - Parser options containing attributeNamePrefix\n * @returns {object} Raw attributes for matcher\n */\nfunction extractRawAttributes(prefixedAttrs, options) {\n if (!prefixedAttrs) return {};\n\n // Handle attributesGroupName option\n const attrs = options.attributesGroupName\n ? prefixedAttrs[options.attributesGroupName]\n : prefixedAttrs;\n\n if (!attrs) return {};\n\n const rawAttrs = {};\n for (const key in attrs) {\n // Remove the attribute prefix to get raw name\n if (key.startsWith(options.attributeNamePrefix)) {\n const rawName = key.substring(options.attributeNamePrefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * Extract namespace from raw tag name\n * @param {string} rawTagName - Tag name possibly with namespace (e.g., \"soap:Envelope\")\n * @returns {string|undefined} Namespace or undefined\n */\nfunction extractNamespace(rawTagName) {\n if (!rawTagName || typeof rawTagName !== 'string') return undefined;\n\n const colonIndex = rawTagName.indexOf(':');\n if (colonIndex !== -1 && colonIndex > 0) {\n const ns = rawTagName.substring(0, colonIndex);\n // Don't treat xmlns as a namespace\n if (ns !== 'xmlns') {\n return ns;\n }\n }\n return undefined;\n}\n\nexport default class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\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.ampEntity = { regex: /&(amp|#38|#x26);/g, val: \"&\" };\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 \"num_dec\": { regex: /&#([0-9]{1,7});/g, val: (_, str) => fromCodePoint(str, 10, \"&#\") },\n \"num_hex\": { regex: /&#x([0-9a-fA-F]{1,6});/g, val: (_, str) => fromCodePoint(str, 16, \"&#x\") },\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 this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n // Initialize path matcher for path-expression-matcher\n this.matcher = new Matcher();\n\n // Flag to track if current node is a stop node (optimization)\n this.isCurrentNodeStopNode = false;\n\n // Pre-compile stopNodes expressions\n if (this.options.stopNodes && this.options.stopNodes.length > 0) {\n this.stopNodeExpressions = [];\n for (let i = 0; i < this.options.stopNodes.length; i++) {\n const stopNodeExp = this.options.stopNodes[i];\n if (typeof stopNodeExp === 'string') {\n // Convert string to Expression object\n this.stopNodeExpressions.push(new Expression(stopNodeExp));\n } else if (stopNodeExp instanceof Expression) {\n // Already an Expression object\n this.stopNodeExpressions.push(stopNodeExp);\n }\n }\n }\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 const escaped = ent.replace(/[.\\-+*:]/g, '\\\\.');\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\" + escaped + \";\", \"g\"),\n val: externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.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, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const newval = this.options.tagValueProcessor(tagName, val, jPathOrMatcher, 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, tagName) {\n if (this.options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n\n // First pass: parse all attributes and update matcher with raw values\n // This ensures the matcher has all attribute values when processors run\n const rawAttrsForMatcher = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n const oldVal = matches[i][4];\n\n if (attrName.length && oldVal !== undefined) {\n let parsedVal = oldVal;\n if (this.options.trimValues) {\n parsedVal = parsedVal.trim();\n }\n parsedVal = this.replaceEntitiesValue(parsedVal, tagName, jPath);\n rawAttrsForMatcher[attrName] = parsedVal;\n }\n }\n\n // Update matcher with raw attribute values BEFORE running processors\n if (Object.keys(rawAttrsForMatcher).length > 0 && typeof jPath === 'object' && jPath.updateCurrent) {\n jPath.updateCurrent(rawAttrsForMatcher);\n }\n\n // Second pass: now process attributes with matcher having full attribute context\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n\n // Convert jPath to string if needed for ignoreAttributesFn\n const jPathStr = this.options.jPath ? jPath.toString() : jPath;\n if (this.ignoreAttributesFn(attrName, jPathStr)) {\n continue\n }\n\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if (aName === \"__proto__\") aName = \"#__proto__\";\n\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPathOrMatcher);\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\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\n // Reset matcher for new document\n this.matcher.reset();\n\n // Reset entity expansion counters for this document\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n const docTypeReader = new DocTypeReader(this.options.processEntities);\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 (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, this.matcher);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = this.matcher.getCurrentTag();\n if (tagName && this.options.unpairedTags.indexOf(tagName) !== -1) {\n throw new Error(`Unpaired tag can not be used as closing tag: `);\n }\n if (lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1) {\n // Pop the unpaired tag\n this.matcher.pop();\n this.tagsNodeStack.pop();\n }\n // Pop the closing tag\n this.matcher.pop();\n this.isCurrentNodeStopNode = false; // Reset flag when closing tag\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if (xmlData[i + 1] === '?') {\n\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, this.matcher);\n if ((this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags) {\n //do nothing\n } else {\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, this.matcher, tagData.tagName);\n }\n this.addChild(currentNode, childNode, this.matcher, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if (xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"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, this.matcher);\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 = docTypeReader.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, this.matcher);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, this.matcher, true, false, true, true);\n if (val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if (this.options.cdataPropName) {\n currentNode.add(this.options.cdataPropName, [{ [this.options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(this.options.textNodeName, val);\n }\n\n i = closeIndex + 2;\n } else {//Opening tag\n let result = readTagExp(xmlData, i, this.options.removeNSPrefix);\n\n // Safety check: readTagExp can return undefined\n if (!result) {\n // Log context for debugging\n const context = xmlData.substring(Math.max(0, i - 50), Math.min(xmlData.length, i + 50));\n throw new Error(`readTagExp returned undefined at position ${i}. Context: \"${context}\"`);\n }\n\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n //console.log(tagExp, tagName)\n const newTagName = this.options.transformTagName(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n if (this.options.strictReservedNames &&\n (tagName === this.options.commentPropName\n || tagName === this.options.cdataPropName\n )) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\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, this.matcher, false);\n }\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 this.matcher.pop();\n }\n\n // Clean up self-closing syntax BEFORE processing attributes\n // This is where tagExp gets the trailing / removed\n let isSelfClosing = false;\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n isSelfClosing = true;\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n // Re-check attrExpPresent after cleaning\n attrExpPresent = (tagName !== tagExp);\n }\n\n // Now process attributes with CLEAN tagExp (no trailing /)\n let prefixedAttrs = null;\n let rawAttrs = {};\n let namespace = undefined;\n\n // Extract namespace from rawTagName\n namespace = extractNamespace(rawTagName);\n\n // Push tag to matcher FIRST (with empty attrs for now) so callbacks see correct path\n if (tagName !== xmlObj.tagname) {\n this.matcher.push(tagName, {}, namespace);\n }\n\n // Now build attributes - callbacks will see correct matcher state\n if (tagName !== tagExp && attrExpPresent) {\n // Build attributes (returns prefixed attributes for the tree)\n // Note: buildAttributesMap now internally updates the matcher with raw attributes\n prefixedAttrs = this.buildAttributesMap(tagExp, this.matcher, tagName);\n\n if (prefixedAttrs) {\n // Extract raw attributes (without prefix) for our use\n rawAttrs = extractRawAttributes(prefixedAttrs, this.options);\n }\n }\n\n // Now check if this is a stop node (after attributes are set)\n if (tagName !== xmlObj.tagname) {\n this.isCurrentNodeStopNode = this.isItStopNode(this.stopNodeExpressions, this.matcher);\n }\n\n const startIndex = i;\n if (this.isCurrentNodeStopNode) {\n let tagContent = \"\";\n\n // For self-closing tags, content is empty\n if (isSelfClosing) {\n i = result.closeIndex;\n }\n //unpaired tag\n else if (this.options.unpairedTags.indexOf(tagName) !== -1) {\n i = result.closeIndex;\n }\n //normal tag\n else {\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n\n // For stop nodes, store raw content as-is without any processing\n childNode.add(this.options.textNodeName, tagContent);\n\n this.matcher.pop(); // Pop the stop node tag\n this.isCurrentNodeStopNode = false; // Reset flag\n\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n } else {\n //selfClosing tag\n if (isSelfClosing) {\n if (this.options.transformTagName) {\n const newTagName = this.options.transformTagName(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n this.matcher.pop(); // Pop self-closing tag\n this.isCurrentNodeStopNode = false; // Reset flag\n }\n else if (this.options.unpairedTags.indexOf(tagName) !== -1) {//unpaired tag\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n this.matcher.pop(); // Pop unpaired tag\n this.isCurrentNodeStopNode = false; // Reset flag\n i = result.closeIndex;\n // Continue to next iteration without changing currentNode\n continue;\n }\n //opening tag\n else {\n const childNode = new xmlNode(tagName);\n if (this.tagsNodeStack.length > this.options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n this.tagsNodeStack.push(currentNode);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\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\nfunction addChild(currentNode, childNode, matcher, startIndex) {\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? matcher.toString() : matcher;\n const result = this.options.updateTag(childNode.tagname, jPathOrMatcher, childNode[\":@\"])\n if (result === false) {\n //do nothing\n } else if (typeof result === \"string\") {\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n } else {\n currentNode.addChild(childNode, startIndex);\n }\n}\n\n/**\n * @param {object} val - Entity object with regex and val properties\n * @param {string} tagName - Tag name\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n */\nfunction replaceEntitiesValue(val, tagName, jPath) {\n const entityConfig = this.options.processEntities;\n\n if (!entityConfig || !entityConfig.enabled) {\n return val;\n }\n\n // Check if tag is allowed to contain entities\n if (entityConfig.allowedTags) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const allowed = Array.isArray(entityConfig.allowedTags)\n ? entityConfig.allowedTags.includes(tagName)\n : entityConfig.allowedTags(tagName, jPathOrMatcher);\n\n if (!allowed) {\n return val;\n }\n }\n\n // Apply custom tag filter if provided\n if (entityConfig.tagFilter) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n if (!entityConfig.tagFilter(tagName, jPathOrMatcher)) {\n return val; // Skip based on custom filter\n }\n }\n\n // Replace DOCTYPE entities\n for (let entityName in this.docTypeEntities) {\n const entity = this.docTypeEntities[entityName];\n const matches = val.match(entity.regx);\n\n if (matches) {\n // Track expansions\n this.entityExpansionCount += matches.length;\n\n // Check expansion limit\n if (entityConfig.maxTotalExpansions &&\n this.entityExpansionCount > entityConfig.maxTotalExpansions) {\n throw new Error(\n `Entity expansion limit exceeded: ${this.entityExpansionCount} > ${entityConfig.maxTotalExpansions}`\n );\n }\n\n // Store length before replacement\n const lengthBefore = val.length;\n val = val.replace(entity.regx, entity.val);\n\n // Check expanded length immediately after replacement\n if (entityConfig.maxExpandedLength) {\n this.currentExpandedLength += (val.length - lengthBefore);\n\n if (this.currentExpandedLength > entityConfig.maxExpandedLength) {\n throw new Error(\n `Total expanded content size exceeded: ${this.currentExpandedLength} > ${entityConfig.maxExpandedLength}`\n );\n }\n }\n }\n }\n if (val.indexOf('&') === -1) return val; // Early exit\n\n // Replace standard entities\n for (let entityName in this.lastEntities) {\n const entity = this.lastEntities[entityName];\n val = val.replace(entity.regex, entity.val);\n }\n if (val.indexOf('&') === -1) return val; // Early exit\n\n // Replace HTML entities if enabled\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 // Replace ampersand entity last\n val = val.replace(this.ampEntity.regex, this.ampEntity.val);\n\n return val;\n}\n\n\nfunction saveTextToParentTag(textData, parentNode, matcher, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if (isLeafNode === undefined) isLeafNode = parentNode.child.length === 0\n\n textData = this.parseTextData(textData,\n parentNode.tagname,\n matcher,\n false,\n parentNode[\":@\"] ? Object.keys(parentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n parentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * @param {Array} stopNodeExpressions - Array of compiled Expression objects\n * @param {Matcher} matcher - Current path matcher\n */\nfunction isItStopNode(stopNodeExpressions, matcher) {\n if (!stopNodeExpressions || stopNodeExpressions.length === 0) return false;\n\n for (let i = 0; i < stopNodeExpressions.length; i++) {\n if (matcher.matches(stopNodeExpressions[i])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double 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.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\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 rawTagName: rawTagName,\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 // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n if (xmlData[i + 1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n }\n }\n }\n i = closeIndex;\n } else if (xmlData[i + 1] === '?') {\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 3) === '!--') {\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\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 (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix) {\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix + str + \";\";\n }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\nimport { Matcher } from 'path-expression-matcher';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * Helper function to strip attribute prefix from attribute map\n * @param {object} attrs - Attributes with prefix (e.g., {\"@_class\": \"code\"})\n * @param {string} prefix - Attribute prefix to remove (e.g., \"@_\")\n * @returns {object} Attributes without prefix (e.g., {\"class\": \"code\"})\n */\nfunction stripAttributePrefix(attrs, prefix) {\n if (!attrs || typeof attrs !== 'object') return {};\n if (!prefix) return attrs;\n\n const rawAttrs = {};\n for (const key in attrs) {\n if (key.startsWith(prefix)) {\n const rawName = key.substring(prefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns \n */\nexport default function prettify(node, options, matcher) {\n return compress(node, options, matcher);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns object\n */\nfunction compress(arr, options, matcher) {\n let text;\n const compressedObj = {}; //This is intended to be a plain object\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n\n // Push current property to matcher WITH RAW ATTRIBUTES (no prefix)\n if (property !== undefined && property !== options.textNodeName) {\n const rawAttrs = stripAttributePrefix(\n tagObj[\":@\"] || {},\n options.attributeNamePrefix\n );\n matcher.push(property, rawAttrs);\n }\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, matcher);\n const isLeaf = isLeafTag(val, options);\n\n if (tagObj[\":@\"]) {\n assignAttributes(val, tagObj[\":@\"], matcher, 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 (tagObj[METADATA_SYMBOL] !== undefined && typeof val === \"object\" && val !== null) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n\n if (compressedObj[property] !== undefined && Object.prototype.hasOwnProperty.call(compressedObj, property)) {\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\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? matcher.toString() : matcher;\n if (options.isArray(property, jPathOrMatcher, isLeaf)) {\n compressedObj[property] = [val];\n } else {\n compressedObj[property] = val;\n }\n }\n\n // Pop property from matcher after processing\n if (property !== undefined && property !== options.textNodeName) {\n matcher.pop();\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\n\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, matcher, 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]; // This is the PREFIXED name (e.g., \"@_class\")\n\n // Strip prefix for matcher path (for isArray callback)\n const rawAttrName = atrrName.startsWith(options.attributeNamePrefix)\n ? atrrName.substring(options.attributeNamePrefix.length)\n : atrrName;\n\n // For attributes, we need to create a temporary path\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath\n ? matcher.toString() + \".\" + rawAttrName\n : matcher;\n\n if (options.isArray(atrrName, jPathOrMatcher, 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 { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n\n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}","'use strict';\n\nimport { getAllMatches, isName } from './util.js';\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\");\nexport function validate(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 if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' has not been opened.\", 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 = 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 (!Object.prototype.hasOwnProperty.call(attrNames, 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 isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return 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","import { buildOptions } from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport { validate } from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class 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|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData !== \"string\" && xmlData.toString) {\n xmlData = xmlData.toString();\n } else if (typeof xmlData !== \"string\") {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n\n if (validationOption) {\n if (validationOption === true) validationOption = {}; //validate with default options\n\n const result = 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, orderedObjParser.matcher);\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 if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","defaultOptions","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","allowBooleanAttributes","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","tagName","val","attributeValueProcessor","attrName","stopNodes","alwaysCreateTextNode","isArray","commentPropName","unpairedTags","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","maxNestedTags","strictReservedNames","normalizeProcessEntities","enabled","maxEntitySize","maxExpansionDepth","maxTotalExpansions","maxExpandedLength","maxEntityCount","allowedTags","tagFilter","_value$maxEntitySize","_value$maxExpansionDe","_value$maxTotalExpans","_value$maxExpandedLen","_value$maxEntityCount","_value$allowedTags","_value$tagFilter","buildOptions","options","built","assign","Array","map","node","startsWith","substring","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","METADATA_SYMBOL","isName","XmlNode","tagname","child","create","_proto","add","_this$child$push","addChild","_this$child$push2","_this$child$push3","keys","undefined","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","xmlData","i","entities","entityCount","Error","angleBracketsCount","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","indexOf","escaped","replace","regx","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","toUpperCase","entityValue","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","startChar","elementName","contentModel","trim","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","includes","defaultValue","_this$readIdentifierV5","data","seq","j","name","hexRegex","numRegex","consider","decimalPoint","eNotationRegx","Expression","constructor","pattern","separator","segments","_parse","_hasDeepWildcard","some","seg","_hasAttributeCondition","_hasPositionSelector","position","currentPart","_parseSegment","part","segment","bracketContent","withoutBrackets","bracketMatch","content","slice","namespace","tag","tagAndPosition","nsIndex","positionMatch","colonIndex","lastIndexOf","tagPart","posPart","eqIndex","attrValue","nthMatch","positionValue","parseInt","hasDeepWildcard","hasAttributeCondition","hasPositionSelector","toString","Matcher","path","siblingStacks","attrValues","values","currentLevel","Map","siblings","siblingKey","counter","count","set","pop","updateCurrent","current","getCurrentTag","getCurrentNamespace","getAttrValue","hasAttr","getPosition","getCounter","getIndex","getDepth","includeNamespace","sep","n","toArray","reset","expression","_matchWithDeepWildcard","_matchSimple","isCurrentNode","_matchSegment","pathIdx","segIdx","nextSeg","found","actualValue","String","snapshot","restore","extractRawAttributes","prefixedAttrs","rawAttrs","extractNamespace","rawTagName","ns","OrderedObjParser","currentNode","tagsNodeStack","docTypeEntities","lastEntities","ampEntity","_","str","fromCodePoint","addExternalEntities","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","_step","_iterator","_createForOfIteratorHelperLoose","done","entityExpansionCount","currentExpandedLength","matcher","isCurrentNodeStopNode","stopNodeExpressions","stopNodeExp","externalEntities","entKeys","ent","dontTrim","hasAttributes","isLeafNode","escapeEntities","jPathOrMatcher","newval","parseValue","tags","split","prefix","charAt","attrsRegx","attrStr","rawAttrsForMatcher","oldVal","parsedVal","jPathStr","aName","newVal","attrCollection","xmlObj","xmlNode","textData","docTypeReader","closeIndex","findClosingIndex","substr","lastTagName","tagData","readTagExp","childNode","tagExp","attrExpPresent","endIndex","_ref","result","_ref2","context","Math","max","min","newTagName","lastTag","isSelfClosing","tagContent","entityConfig","entity","lengthBefore","parentNode","errMsg","closingIndex","closingChar","attrBoundary","ch","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","shouldParse","trimmedStr","skipLike","numStr","Number","window","parse_int","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","toNumber","base","codePoint","stripAttributePrefix","prettify","compress","arr","text","compressedObj","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","atrrName","rawAttrName","propCount","isWhiteSpace","char","readPI","start","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","readAttributeStr","tagClosed","validAttrStrRegxp","validateAttributeString","attrNames","getPositionFromMatch","validateAttrName","validateAmpersand","re","validateNumberAmpersand","code","message","lineNumber","err","msg","line","col","validateTagName","lines","XMLParser","parse","validationOption","tagFound","reachedRoot","tagStartPos","closingTag","attrStrStart","isValid","otg","openPos","afterAmp","JSON","stringify","t","validate","orderedObjParser","orderedResult","addEntity"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./lib/fxparser.min.js","mappings":"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","sources":["webpack://XMLParser/webpack/universalModuleDefinition","webpack://XMLParser/webpack/bootstrap","webpack://XMLParser/webpack/runtime/define property getters","webpack://XMLParser/webpack/runtime/hasOwnProperty shorthand","webpack://XMLParser/webpack/runtime/make namespace object","webpack://XMLParser/./src/xmlparser/OptionsBuilder.js","webpack://XMLParser/./src/util.js","webpack://XMLParser/./src/xmlparser/xmlNode.js","webpack://XMLParser/./src/xmlparser/DocTypeReader.js","webpack://XMLParser/./node_modules/strnum/strnum.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/Matcher.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/Expression.js","webpack://XMLParser/./src/xmlparser/OrderedObjParser.js","webpack://XMLParser/./src/ignoreAttributes.js","webpack://XMLParser/./src/xmlparser/node2json.js","webpack://XMLParser/./src/validator.js","webpack://XMLParser/./src/xmlparser/XMLParser.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"XMLParser\"] = factory();\n\telse\n\t\troot[\"XMLParser\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export const 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 eNotation: 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 ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function (tagName, jPath, attrs) {\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n maxNestedTags: 100,\n strictReservedNames: true,\n jPath: true, // if true, pass jPath string to callbacks; if false, pass matcher instance\n};\n\n/**\n * Normalizes processEntities option for backward compatibility\n * @param {boolean|object} value \n * @returns {object} Always returns normalized object\n */\nfunction normalizeProcessEntities(value) {\n // Boolean backward compatibility\n if (typeof value === 'boolean') {\n return {\n enabled: value, // true or false\n maxEntitySize: 10000,\n maxExpansionDepth: 10,\n maxTotalExpansions: 1000,\n maxExpandedLength: 100000,\n maxEntityCount: 100,\n allowedTags: null,\n tagFilter: null\n };\n }\n\n // Object config - merge with defaults\n if (typeof value === 'object' && value !== null) {\n return {\n enabled: value.enabled !== false, // default true if not specified\n maxEntitySize: value.maxEntitySize ?? 10000,\n maxExpansionDepth: value.maxExpansionDepth ?? 10,\n maxTotalExpansions: value.maxTotalExpansions ?? 1000,\n maxExpandedLength: value.maxExpandedLength ?? 100000,\n maxEntityCount: value.maxEntityCount ?? 100,\n allowedTags: value.allowedTags ?? null,\n tagFilter: value.tagFilter ?? null\n };\n }\n\n // Default to enabled with limits\n return normalizeProcessEntities(true);\n}\n\nexport const buildOptions = function (options) {\n const built = Object.assign({}, defaultOptions, options);\n\n // Always normalize processEntities for backward compatibility and validation\n built.processEntities = normalizeProcessEntities(built.processEntities);\n\n // Convert old-style stopNodes for backward compatibility\n if (built.stopNodes && Array.isArray(built.stopNodes)) {\n built.stopNodes = built.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Old syntax: *.tagname meant \"tagname anywhere\"\n // Convert to new syntax: ..tagname\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n //console.debug(built.processEntities)\n return built;\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';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(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\nexport const isName = function (string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = Object.create(null); //attributes map\n }\n add(key, val) {\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if (key === \"__proto__\") key = \"#__proto__\";\n this.child.push({ [key]: val });\n }\n addChild(node, startIndex) {\n if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\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 // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import { isName } from '../util.js';\n\nexport default class DocTypeReader {\n constructor(options) {\n this.suppressValidationErr = !options;\n this.options = options;\n }\n\n readDocType(xmlData, i) {\n const entities = Object.create(null);\n let entityCount = 0;\n\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 i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === '<' && !comment) { //Determine the tag type\n if (hasBody && hasSeq(xmlData, \"!ENTITY\", i)) {\n i += 7;\n let entityName, val;\n [entityName, val, i] = this.readEntityExp(xmlData, i + 1, this.suppressValidationErr);\n if (val.indexOf(\"&\") === -1) { //Parameter entities are not supported\n if (this.options.enabled !== false &&\n this.options.maxEntityCount &&\n entityCount >= this.options.maxEntityCount) {\n throw new Error(\n `Entity count (${entityCount + 1}) exceeds maximum allowed (${this.options.maxEntityCount})`\n );\n }\n const escaped = entityName.replace(/[.\\-+*:]/g, '\\\\.');\n entities[entityName] = {\n regx: RegExp(`&${escaped};`, \"g\"),\n val: val\n };\n entityCount++;\n }\n }\n else if (hasBody && hasSeq(xmlData, \"!ELEMENT\", i)) {\n i += 8;//Not supported\n const { index } = this.readElementExp(xmlData, i + 1);\n i = index;\n } else if (hasBody && hasSeq(xmlData, \"!ATTLIST\", i)) {\n i += 8;//Not supported\n // const {index} = this.readAttlistExp(xmlData,i+1);\n // i = index;\n } else if (hasBody && hasSeq(xmlData, \"!NOTATION\", i)) {\n i += 9;//Not supported\n const { index } = this.readNotationExp(xmlData, i + 1, this.suppressValidationErr);\n i = index;\n } else if (hasSeq(xmlData, \"!--\", i)) comment = true;\n else throw new Error(`Invalid DOCTYPE`);\n\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === '>') { //Read tag content\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\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 readEntityExp(xmlData, i) {\n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after this.options.maxEntitySize) {\n throw new Error(\n `Entity \"${entityName}\" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`\n );\n }\n\n i--;\n return [entityName, entityValue, i];\n }\n\n readNotationExp(xmlData, i) {\n // Skip leading whitespace after \n // \n // \n // \n // \n\n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq, i) {\n for (let j = 0; j < seq.length; j++) {\n if (seq[j] !== data[i + j + 1]) return false;\n }\n return true;\n}\n\nfunction validateEntityName(name) {\n if (isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/;\n// const octRegex = /^0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n \nconst consider = {\n hex : true,\n // oct: false,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true,\n //skipLike: /regex/\n};\n\nexport default function toNumber(str, options = {}){\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n \n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if(str===\"0\") return 0;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return parse_int(trimmedStr, 16);\n // }else if (options.oct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n }else if (trimmedStr.includes('e') || trimmedStr.includes('E')) { //eNotation\n return resolveEnotation(str,trimmedStr,options);\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 // +00.123 => [ , '+', '00', '.123', ..\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 const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length+1] === \".\" \n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if(!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1 \n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))){\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if( num === 0) return num;\n if(parsedStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n if(parsedStr === \"0\") return num; //0.0\n else if(parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n \n let n = leadingZeros? numTrimmedByZeros : trimmedStr;\n if(leadingZeros){\n // -009 => -9\n return (n === parsedStr) || (sign+n === parsedStr) ? num : str\n }else {\n // +9\n return (n === parsedStr) || (n === sign+parsedStr) ? num : str\n }\n }\n }else{ //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str,trimmedStr,options){\n if(!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx); \n if(notation){\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length+1] === eChar \n : str[leadingZeros.length] === eChar;\n\n if(leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if(leadingZeros.length === 1 \n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)){\n return Number(trimmedStr);\n }else if(options.leadingZeros && !eAdjacentToLeadingZeros){ //accept with leading zeros\n //remove leading 0s\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n }else return str;\n }else{\n return str;\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.substring(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base){\n //polyfill\n if(parseInt) return parseInt(numStr, base);\n else if(Number.parseInt) return Number.parseInt(numStr, base);\n else if(window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}","/**\n * Matcher - Tracks current path in XML/JSON tree and matches against Expressions\n * \n * The matcher maintains a stack of nodes representing the current path from root to\n * current tag. It only stores attribute values for the current (top) node to minimize\n * memory usage. Sibling tracking is used to auto-calculate position and counter.\n * \n * @example\n * const matcher = new Matcher();\n * matcher.push(\"root\", {});\n * matcher.push(\"users\", {});\n * matcher.push(\"user\", { id: \"123\", type: \"admin\" });\n * \n * const expr = new Expression(\"root.users.user\");\n * matcher.matches(expr); // true\n */\nexport default class Matcher {\n /**\n * Create a new Matcher\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Default path separator (default: '.')\n */\n constructor(options = {}) {\n this.separator = options.separator || '.';\n this.path = [];\n this.siblingStacks = [];\n // Each path node: { tag: string, values: object, position: number, counter: number }\n // values only present for current (last) node\n // Each siblingStacks entry: Map tracking occurrences at each level\n }\n\n /**\n * Push a new tag onto the path\n * @param {string} tagName - Name of the tag\n * @param {Object} attrValues - Attribute key-value pairs for current node (optional)\n * @param {string} namespace - Namespace for the tag (optional)\n */\n push(tagName, attrValues = null, namespace = null) {\n // Remove values from previous current node (now becoming ancestor)\n if (this.path.length > 0) {\n const prev = this.path[this.path.length - 1];\n prev.values = undefined;\n }\n\n // Get or create sibling tracking for current level\n const currentLevel = this.path.length;\n if (!this.siblingStacks[currentLevel]) {\n this.siblingStacks[currentLevel] = new Map();\n }\n\n const siblings = this.siblingStacks[currentLevel];\n\n // Create a unique key for sibling tracking that includes namespace\n const siblingKey = namespace ? `${namespace}:${tagName}` : tagName;\n\n // Calculate counter (how many times this tag appeared at this level)\n const counter = siblings.get(siblingKey) || 0;\n\n // Calculate position (total children at this level so far)\n let position = 0;\n for (const count of siblings.values()) {\n position += count;\n }\n\n // Update sibling count for this tag\n siblings.set(siblingKey, counter + 1);\n\n // Create new node\n const node = {\n tag: tagName,\n position: position,\n counter: counter\n };\n\n // Store namespace if provided\n if (namespace !== null && namespace !== undefined) {\n node.namespace = namespace;\n }\n\n // Store values only for current node\n if (attrValues !== null && attrValues !== undefined) {\n node.values = attrValues;\n }\n\n this.path.push(node);\n }\n\n /**\n * Pop the last tag from the path\n * @returns {Object|undefined} The popped node\n */\n pop() {\n if (this.path.length === 0) {\n return undefined;\n }\n\n const node = this.path.pop();\n\n // Clean up sibling tracking for levels deeper than current\n // After pop, path.length is the new depth\n // We need to clean up siblingStacks[path.length + 1] and beyond\n if (this.siblingStacks.length > this.path.length + 1) {\n this.siblingStacks.length = this.path.length + 1;\n }\n\n return node;\n }\n\n /**\n * Update current node's attribute values\n * Useful when attributes are parsed after push\n * @param {Object} attrValues - Attribute values\n */\n updateCurrent(attrValues) {\n if (this.path.length > 0) {\n const current = this.path[this.path.length - 1];\n if (attrValues !== null && attrValues !== undefined) {\n current.values = attrValues;\n }\n }\n }\n\n /**\n * Get current tag name\n * @returns {string|undefined}\n */\n getCurrentTag() {\n return this.path.length > 0 ? this.path[this.path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n return this.path.length > 0 ? this.path[this.path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value\n * @param {string} attrName - Attribute name\n * @returns {*} Attribute value or undefined\n */\n getAttrValue(attrName) {\n if (this.path.length === 0) return undefined;\n const current = this.path[this.path.length - 1];\n return current.values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute\n * @param {string} attrName - Attribute name\n * @returns {boolean}\n */\n hasAttr(attrName) {\n if (this.path.length === 0) return false;\n const current = this.path[this.path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent)\n * @returns {number}\n */\n getPosition() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name)\n * @returns {number}\n */\n getCounter() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition for backward compatibility)\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth\n * @returns {number}\n */\n getDepth() {\n return this.path.length;\n }\n\n /**\n * Get path as string\n * @param {string} separator - Optional separator (uses default if not provided)\n * @param {boolean} includeNamespace - Whether to include namespace in output (default: true)\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n const sep = separator || this.separator;\n return this.path.map(n => {\n if (includeNamespace && n.namespace) {\n return `${n.namespace}:${n.tag}`;\n }\n return n.tag;\n }).join(sep);\n }\n\n /**\n * Get path as array of tag names\n * @returns {string[]}\n */\n toArray() {\n return this.path.map(n => n.tag);\n }\n\n /**\n * Reset the path to empty\n */\n reset() {\n this.path = [];\n this.siblingStacks = [];\n }\n\n /**\n * Match current path against an Expression\n * @param {Expression} expression - The expression to match against\n * @returns {boolean} True if current path matches the expression\n */\n matches(expression) {\n const segments = expression.segments;\n\n if (segments.length === 0) {\n return false;\n }\n\n // Handle deep wildcard patterns\n if (expression.hasDeepWildcard()) {\n return this._matchWithDeepWildcard(segments);\n }\n\n // Simple path matching (no deep wildcards)\n return this._matchSimple(segments);\n }\n\n /**\n * Match simple path (no deep wildcards)\n * @private\n */\n _matchSimple(segments) {\n // Path must be same length as segments\n if (this.path.length !== segments.length) {\n return false;\n }\n\n // Match each segment bottom-to-top\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const node = this.path[i];\n const isCurrentNode = (i === this.path.length - 1);\n\n if (!this._matchSegment(segment, node, isCurrentNode)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Match path with deep wildcards\n * @private\n */\n _matchWithDeepWildcard(segments) {\n let pathIdx = this.path.length - 1; // Start from current node (bottom)\n let segIdx = segments.length - 1; // Start from last segment\n\n while (segIdx >= 0 && pathIdx >= 0) {\n const segment = segments[segIdx];\n\n if (segment.type === 'deep-wildcard') {\n // \"..\" matches zero or more levels\n segIdx--;\n\n if (segIdx < 0) {\n // Pattern ends with \"..\", always matches\n return true;\n }\n\n // Find where next segment matches in the path\n const nextSeg = segments[segIdx];\n let found = false;\n\n for (let i = pathIdx; i >= 0; i--) {\n const isCurrentNode = (i === this.path.length - 1);\n if (this._matchSegment(nextSeg, this.path[i], isCurrentNode)) {\n pathIdx = i - 1;\n segIdx--;\n found = true;\n break;\n }\n }\n\n if (!found) {\n return false;\n }\n } else {\n // Regular segment\n const isCurrentNode = (pathIdx === this.path.length - 1);\n if (!this._matchSegment(segment, this.path[pathIdx], isCurrentNode)) {\n return false;\n }\n pathIdx--;\n segIdx--;\n }\n }\n\n // All segments must be consumed\n return segIdx < 0;\n }\n\n /**\n * Match a single segment against a node\n * @private\n * @param {Object} segment - Segment from Expression\n * @param {Object} node - Node from path\n * @param {boolean} isCurrentNode - Whether this is the current (last) node\n * @returns {boolean}\n */\n _matchSegment(segment, node, isCurrentNode) {\n // Match tag name (* is wildcard)\n if (segment.tag !== '*' && segment.tag !== node.tag) {\n return false;\n }\n\n // Match namespace if specified in segment\n if (segment.namespace !== undefined) {\n // Segment has namespace - node must match it\n if (segment.namespace !== '*' && segment.namespace !== node.namespace) {\n return false;\n }\n }\n // If segment has no namespace, it matches nodes with or without namespace\n\n // Match attribute name (check if node has this attribute)\n // Can only check for current node since ancestors don't have values\n if (segment.attrName !== undefined) {\n if (!isCurrentNode) {\n // Can't check attributes for ancestor nodes (values not stored)\n return false;\n }\n\n if (!node.values || !(segment.attrName in node.values)) {\n return false;\n }\n\n // Match attribute value (only possible for current node)\n if (segment.attrValue !== undefined) {\n const actualValue = node.values[segment.attrName];\n // Both should be strings\n if (String(actualValue) !== String(segment.attrValue)) {\n return false;\n }\n }\n }\n\n // Match position (only for current node)\n if (segment.position !== undefined) {\n if (!isCurrentNode) {\n // Can't check position for ancestor nodes\n return false;\n }\n\n const counter = node.counter ?? 0;\n\n if (segment.position === 'first' && counter !== 0) {\n return false;\n } else if (segment.position === 'odd' && counter % 2 !== 1) {\n return false;\n } else if (segment.position === 'even' && counter % 2 !== 0) {\n return false;\n } else if (segment.position === 'nth') {\n if (counter !== segment.positionValue) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Create a snapshot of current state\n * @returns {Object} State snapshot\n */\n snapshot() {\n return {\n path: this.path.map(node => ({ ...node })),\n siblingStacks: this.siblingStacks.map(map => new Map(map))\n };\n }\n\n /**\n * Restore state from snapshot\n * @param {Object} snapshot - State snapshot\n */\n restore(snapshot) {\n this.path = snapshot.path.map(node => ({ ...node }));\n this.siblingStacks = snapshot.siblingStacks.map(map => new Map(map));\n }\n}","/**\n * Expression - Parses and stores a tag pattern expression\n * \n * Patterns are parsed once and stored in an optimized structure for fast matching.\n * \n * @example\n * const expr = new Expression(\"root.users.user\");\n * const expr2 = new Expression(\"..user[id]:first\");\n * const expr3 = new Expression(\"root/users/user\", { separator: '/' });\n */\nexport default class Expression {\n /**\n * Create a new Expression\n * @param {string} pattern - Pattern string (e.g., \"root.users.user\", \"..user[id]\")\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Path separator (default: '.')\n */\n constructor(pattern, options = {}) {\n this.pattern = pattern;\n this.separator = options.separator || '.';\n this.segments = this._parse(pattern);\n\n // Cache expensive checks for performance (O(1) instead of O(n))\n this._hasDeepWildcard = this.segments.some(seg => seg.type === 'deep-wildcard');\n this._hasAttributeCondition = this.segments.some(seg => seg.attrName !== undefined);\n this._hasPositionSelector = this.segments.some(seg => seg.position !== undefined);\n }\n\n /**\n * Parse pattern string into segments\n * @private\n * @param {string} pattern - Pattern to parse\n * @returns {Array} Array of segment objects\n */\n _parse(pattern) {\n const segments = [];\n\n // Split by separator but handle \"..\" specially\n let i = 0;\n let currentPart = '';\n\n while (i < pattern.length) {\n if (pattern[i] === this.separator) {\n // Check if next char is also separator (deep wildcard)\n if (i + 1 < pattern.length && pattern[i + 1] === this.separator) {\n // Flush current part if any\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n currentPart = '';\n }\n // Add deep wildcard\n segments.push({ type: 'deep-wildcard' });\n i += 2; // Skip both separators\n } else {\n // Regular separator\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n currentPart = '';\n i++;\n }\n } else {\n currentPart += pattern[i];\n i++;\n }\n }\n\n // Flush remaining part\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n\n return segments;\n }\n\n /**\n * Parse a single segment\n * @private\n * @param {string} part - Segment string (e.g., \"user\", \"ns::user\", \"user[id]\", \"ns::user:first\")\n * @returns {Object} Segment object\n */\n _parseSegment(part) {\n const segment = { type: 'tag' };\n\n // NEW NAMESPACE SYNTAX (v2.0):\n // ============================\n // Namespace uses DOUBLE colon (::)\n // Position uses SINGLE colon (:)\n // \n // Examples:\n // \"user\" → tag\n // \"user:first\" → tag + position\n // \"user[id]\" → tag + attribute\n // \"user[id]:first\" → tag + attribute + position\n // \"ns::user\" → namespace + tag\n // \"ns::user:first\" → namespace + tag + position\n // \"ns::user[id]\" → namespace + tag + attribute\n // \"ns::user[id]:first\" → namespace + tag + attribute + position\n // \"ns::first\" → namespace + tag named \"first\" (NO ambiguity!)\n //\n // This eliminates all ambiguity:\n // :: = namespace separator\n // : = position selector\n // [] = attributes\n\n // Step 1: Extract brackets [attr] or [attr=value]\n let bracketContent = null;\n let withoutBrackets = part;\n\n const bracketMatch = part.match(/^([^\\[]+)(\\[[^\\]]*\\])(.*)$/);\n if (bracketMatch) {\n withoutBrackets = bracketMatch[1] + bracketMatch[3];\n if (bracketMatch[2]) {\n const content = bracketMatch[2].slice(1, -1);\n if (content) {\n bracketContent = content;\n }\n }\n }\n\n // Step 2: Check for namespace (double colon ::)\n let namespace = undefined;\n let tagAndPosition = withoutBrackets;\n\n if (withoutBrackets.includes('::')) {\n const nsIndex = withoutBrackets.indexOf('::');\n namespace = withoutBrackets.substring(0, nsIndex).trim();\n tagAndPosition = withoutBrackets.substring(nsIndex + 2).trim(); // Skip ::\n\n if (!namespace) {\n throw new Error(`Invalid namespace in pattern: ${part}`);\n }\n }\n\n // Step 3: Parse tag and position (single colon :)\n let tag = undefined;\n let positionMatch = null;\n\n if (tagAndPosition.includes(':')) {\n const colonIndex = tagAndPosition.lastIndexOf(':'); // Use last colon for position\n const tagPart = tagAndPosition.substring(0, colonIndex).trim();\n const posPart = tagAndPosition.substring(colonIndex + 1).trim();\n\n // Verify position is a valid keyword\n const isPositionKeyword = ['first', 'last', 'odd', 'even'].includes(posPart) ||\n /^nth\\(\\d+\\)$/.test(posPart);\n\n if (isPositionKeyword) {\n tag = tagPart;\n positionMatch = posPart;\n } else {\n // Not a valid position keyword, treat whole thing as tag\n tag = tagAndPosition;\n }\n } else {\n tag = tagAndPosition;\n }\n\n if (!tag) {\n throw new Error(`Invalid segment pattern: ${part}`);\n }\n\n segment.tag = tag;\n if (namespace) {\n segment.namespace = namespace;\n }\n\n // Step 4: Parse attributes\n if (bracketContent) {\n if (bracketContent.includes('=')) {\n const eqIndex = bracketContent.indexOf('=');\n segment.attrName = bracketContent.substring(0, eqIndex).trim();\n segment.attrValue = bracketContent.substring(eqIndex + 1).trim();\n } else {\n segment.attrName = bracketContent.trim();\n }\n }\n\n // Step 5: Parse position selector\n if (positionMatch) {\n const nthMatch = positionMatch.match(/^nth\\((\\d+)\\)$/);\n if (nthMatch) {\n segment.position = 'nth';\n segment.positionValue = parseInt(nthMatch[1], 10);\n } else {\n segment.position = positionMatch;\n }\n }\n\n return segment;\n }\n\n /**\n * Get the number of segments\n * @returns {number}\n */\n get length() {\n return this.segments.length;\n }\n\n /**\n * Check if expression contains deep wildcard\n * @returns {boolean}\n */\n hasDeepWildcard() {\n return this._hasDeepWildcard;\n }\n\n /**\n * Check if expression has attribute conditions\n * @returns {boolean}\n */\n hasAttributeCondition() {\n return this._hasAttributeCondition;\n }\n\n /**\n * Check if expression has position selectors\n * @returns {boolean}\n */\n hasPositionSelector() {\n return this._hasPositionSelector;\n }\n\n /**\n * Get string representation\n * @returns {string}\n */\n toString() {\n return this.pattern;\n }\n}","'use strict';\n///@ts-check\n\nimport { getAllMatches, isExist } from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\n\n\n// const 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\n// Helper functions for attribute and namespace handling\n\n/**\n * Extract raw attributes (without prefix) from prefixed attribute map\n * @param {object} prefixedAttrs - Attributes with prefix from buildAttributesMap\n * @param {object} options - Parser options containing attributeNamePrefix\n * @returns {object} Raw attributes for matcher\n */\nfunction extractRawAttributes(prefixedAttrs, options) {\n if (!prefixedAttrs) return {};\n\n // Handle attributesGroupName option\n const attrs = options.attributesGroupName\n ? prefixedAttrs[options.attributesGroupName]\n : prefixedAttrs;\n\n if (!attrs) return {};\n\n const rawAttrs = {};\n for (const key in attrs) {\n // Remove the attribute prefix to get raw name\n if (key.startsWith(options.attributeNamePrefix)) {\n const rawName = key.substring(options.attributeNamePrefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * Extract namespace from raw tag name\n * @param {string} rawTagName - Tag name possibly with namespace (e.g., \"soap:Envelope\")\n * @returns {string|undefined} Namespace or undefined\n */\nfunction extractNamespace(rawTagName) {\n if (!rawTagName || typeof rawTagName !== 'string') return undefined;\n\n const colonIndex = rawTagName.indexOf(':');\n if (colonIndex !== -1 && colonIndex > 0) {\n const ns = rawTagName.substring(0, colonIndex);\n // Don't treat xmlns as a namespace\n if (ns !== 'xmlns') {\n return ns;\n }\n }\n return undefined;\n}\n\nexport default class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\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.ampEntity = { regex: /&(amp|#38|#x26);/g, val: \"&\" };\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 \"num_dec\": { regex: /&#([0-9]{1,7});/g, val: (_, str) => fromCodePoint(str, 10, \"&#\") },\n \"num_hex\": { regex: /&#x([0-9a-fA-F]{1,6});/g, val: (_, str) => fromCodePoint(str, 16, \"&#x\") },\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 this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n // Initialize path matcher for path-expression-matcher\n this.matcher = new Matcher();\n\n // Flag to track if current node is a stop node (optimization)\n this.isCurrentNodeStopNode = false;\n\n // Pre-compile stopNodes expressions\n if (this.options.stopNodes && this.options.stopNodes.length > 0) {\n this.stopNodeExpressions = [];\n for (let i = 0; i < this.options.stopNodes.length; i++) {\n const stopNodeExp = this.options.stopNodes[i];\n if (typeof stopNodeExp === 'string') {\n // Convert string to Expression object\n this.stopNodeExpressions.push(new Expression(stopNodeExp));\n } else if (stopNodeExp instanceof Expression) {\n // Already an Expression object\n this.stopNodeExpressions.push(stopNodeExp);\n }\n }\n }\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 const escaped = ent.replace(/[.\\-+*:]/g, '\\\\.');\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\" + escaped + \";\", \"g\"),\n val: externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.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, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const newval = this.options.tagValueProcessor(tagName, val, jPathOrMatcher, 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, tagName) {\n if (this.options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n\n // First pass: parse all attributes and update matcher with raw values\n // This ensures the matcher has all attribute values when processors run\n const rawAttrsForMatcher = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n const oldVal = matches[i][4];\n\n if (attrName.length && oldVal !== undefined) {\n let parsedVal = oldVal;\n if (this.options.trimValues) {\n parsedVal = parsedVal.trim();\n }\n parsedVal = this.replaceEntitiesValue(parsedVal, tagName, jPath);\n rawAttrsForMatcher[attrName] = parsedVal;\n }\n }\n\n // Update matcher with raw attribute values BEFORE running processors\n if (Object.keys(rawAttrsForMatcher).length > 0 && typeof jPath === 'object' && jPath.updateCurrent) {\n jPath.updateCurrent(rawAttrsForMatcher);\n }\n\n // Second pass: now process attributes with matcher having full attribute context\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n\n // Convert jPath to string if needed for ignoreAttributesFn\n const jPathStr = this.options.jPath ? jPath.toString() : jPath;\n if (this.ignoreAttributesFn(attrName, jPathStr)) {\n continue\n }\n\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if (aName === \"__proto__\") aName = \"#__proto__\";\n\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPathOrMatcher);\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\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\n // Reset matcher for new document\n this.matcher.reset();\n\n // Reset entity expansion counters for this document\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n const docTypeReader = new DocTypeReader(this.options.processEntities);\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 (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, this.matcher);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = this.matcher.getCurrentTag();\n if (tagName && this.options.unpairedTags.indexOf(tagName) !== -1) {\n throw new Error(`Unpaired tag can not be used as closing tag: `);\n }\n if (lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1) {\n // Pop the unpaired tag\n this.matcher.pop();\n this.tagsNodeStack.pop();\n }\n // Pop the closing tag\n this.matcher.pop();\n this.isCurrentNodeStopNode = false; // Reset flag when closing tag\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if (xmlData[i + 1] === '?') {\n\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, this.matcher);\n if ((this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags) {\n //do nothing\n } else {\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, this.matcher, tagData.tagName);\n }\n this.addChild(currentNode, childNode, this.matcher, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if (xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"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, this.matcher);\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 = docTypeReader.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, this.matcher);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, this.matcher, true, false, true, true);\n if (val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if (this.options.cdataPropName) {\n currentNode.add(this.options.cdataPropName, [{ [this.options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(this.options.textNodeName, val);\n }\n\n i = closeIndex + 2;\n } else {//Opening tag\n let result = readTagExp(xmlData, i, this.options.removeNSPrefix);\n\n // Safety check: readTagExp can return undefined\n if (!result) {\n // Log context for debugging\n const context = xmlData.substring(Math.max(0, i - 50), Math.min(xmlData.length, i + 50));\n throw new Error(`readTagExp returned undefined at position ${i}. Context: \"${context}\"`);\n }\n\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n //console.log(tagExp, tagName)\n const newTagName = this.options.transformTagName(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n if (this.options.strictReservedNames &&\n (tagName === this.options.commentPropName\n || tagName === this.options.cdataPropName\n )) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\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, this.matcher, false);\n }\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 this.matcher.pop();\n }\n\n // Clean up self-closing syntax BEFORE processing attributes\n // This is where tagExp gets the trailing / removed\n let isSelfClosing = false;\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n isSelfClosing = true;\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n // Re-check attrExpPresent after cleaning\n attrExpPresent = (tagName !== tagExp);\n }\n\n // Now process attributes with CLEAN tagExp (no trailing /)\n let prefixedAttrs = null;\n let rawAttrs = {};\n let namespace = undefined;\n\n // Extract namespace from rawTagName\n namespace = extractNamespace(rawTagName);\n\n // Push tag to matcher FIRST (with empty attrs for now) so callbacks see correct path\n if (tagName !== xmlObj.tagname) {\n this.matcher.push(tagName, {}, namespace);\n }\n\n // Now build attributes - callbacks will see correct matcher state\n if (tagName !== tagExp && attrExpPresent) {\n // Build attributes (returns prefixed attributes for the tree)\n // Note: buildAttributesMap now internally updates the matcher with raw attributes\n prefixedAttrs = this.buildAttributesMap(tagExp, this.matcher, tagName);\n\n if (prefixedAttrs) {\n // Extract raw attributes (without prefix) for our use\n rawAttrs = extractRawAttributes(prefixedAttrs, this.options);\n }\n }\n\n // Now check if this is a stop node (after attributes are set)\n if (tagName !== xmlObj.tagname) {\n this.isCurrentNodeStopNode = this.isItStopNode(this.stopNodeExpressions, this.matcher);\n }\n\n const startIndex = i;\n if (this.isCurrentNodeStopNode) {\n let tagContent = \"\";\n\n // For self-closing tags, content is empty\n if (isSelfClosing) {\n i = result.closeIndex;\n }\n //unpaired tag\n else if (this.options.unpairedTags.indexOf(tagName) !== -1) {\n i = result.closeIndex;\n }\n //normal tag\n else {\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n\n // For stop nodes, store raw content as-is without any processing\n childNode.add(this.options.textNodeName, tagContent);\n\n this.matcher.pop(); // Pop the stop node tag\n this.isCurrentNodeStopNode = false; // Reset flag\n\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n } else {\n //selfClosing tag\n if (isSelfClosing) {\n if (this.options.transformTagName) {\n const newTagName = this.options.transformTagName(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n this.matcher.pop(); // Pop self-closing tag\n this.isCurrentNodeStopNode = false; // Reset flag\n }\n else if (this.options.unpairedTags.indexOf(tagName) !== -1) {//unpaired tag\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\n this.matcher.pop(); // Pop unpaired tag\n this.isCurrentNodeStopNode = false; // Reset flag\n i = result.closeIndex;\n // Continue to next iteration without changing currentNode\n continue;\n }\n //opening tag\n else {\n const childNode = new xmlNode(tagName);\n if (this.tagsNodeStack.length > this.options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n this.tagsNodeStack.push(currentNode);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.matcher, startIndex);\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\nfunction addChild(currentNode, childNode, matcher, startIndex) {\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? matcher.toString() : matcher;\n const result = this.options.updateTag(childNode.tagname, jPathOrMatcher, childNode[\":@\"])\n if (result === false) {\n //do nothing\n } else if (typeof result === \"string\") {\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n } else {\n currentNode.addChild(childNode, startIndex);\n }\n}\n\n/**\n * @param {object} val - Entity object with regex and val properties\n * @param {string} tagName - Tag name\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n */\nfunction replaceEntitiesValue(val, tagName, jPath) {\n const entityConfig = this.options.processEntities;\n\n if (!entityConfig || !entityConfig.enabled) {\n return val;\n }\n\n // Check if tag is allowed to contain entities\n if (entityConfig.allowedTags) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const allowed = Array.isArray(entityConfig.allowedTags)\n ? entityConfig.allowedTags.includes(tagName)\n : entityConfig.allowedTags(tagName, jPathOrMatcher);\n\n if (!allowed) {\n return val;\n }\n }\n\n // Apply custom tag filter if provided\n if (entityConfig.tagFilter) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n if (!entityConfig.tagFilter(tagName, jPathOrMatcher)) {\n return val; // Skip based on custom filter\n }\n }\n\n // Replace DOCTYPE entities\n for (let entityName in this.docTypeEntities) {\n const entity = this.docTypeEntities[entityName];\n const matches = val.match(entity.regx);\n\n if (matches) {\n // Track expansions\n this.entityExpansionCount += matches.length;\n\n // Check expansion limit\n if (entityConfig.maxTotalExpansions &&\n this.entityExpansionCount > entityConfig.maxTotalExpansions) {\n throw new Error(\n `Entity expansion limit exceeded: ${this.entityExpansionCount} > ${entityConfig.maxTotalExpansions}`\n );\n }\n\n // Store length before replacement\n const lengthBefore = val.length;\n val = val.replace(entity.regx, entity.val);\n\n // Check expanded length immediately after replacement\n if (entityConfig.maxExpandedLength) {\n this.currentExpandedLength += (val.length - lengthBefore);\n\n if (this.currentExpandedLength > entityConfig.maxExpandedLength) {\n throw new Error(\n `Total expanded content size exceeded: ${this.currentExpandedLength} > ${entityConfig.maxExpandedLength}`\n );\n }\n }\n }\n }\n if (val.indexOf('&') === -1) return val; // Early exit\n\n // Replace standard entities\n for (let entityName in this.lastEntities) {\n const entity = this.lastEntities[entityName];\n val = val.replace(entity.regex, entity.val);\n }\n if (val.indexOf('&') === -1) return val; // Early exit\n\n // Replace HTML entities if enabled\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 // Replace ampersand entity last\n val = val.replace(this.ampEntity.regex, this.ampEntity.val);\n\n return val;\n}\n\n\nfunction saveTextToParentTag(textData, parentNode, matcher, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if (isLeafNode === undefined) isLeafNode = parentNode.child.length === 0\n\n textData = this.parseTextData(textData,\n parentNode.tagname,\n matcher,\n false,\n parentNode[\":@\"] ? Object.keys(parentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n parentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * @param {Array} stopNodeExpressions - Array of compiled Expression objects\n * @param {Matcher} matcher - Current path matcher\n */\nfunction isItStopNode(stopNodeExpressions, matcher) {\n if (!stopNodeExpressions || stopNodeExpressions.length === 0) return false;\n\n for (let i = 0; i < stopNodeExpressions.length; i++) {\n if (matcher.matches(stopNodeExpressions[i])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double 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.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\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 rawTagName: rawTagName,\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 // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n if (xmlData[i + 1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n }\n }\n }\n i = closeIndex;\n } else if (xmlData[i + 1] === '?') {\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 3) === '!--') {\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\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 (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix) {\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix + str + \";\";\n }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\nimport { Matcher } from 'path-expression-matcher';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * Helper function to strip attribute prefix from attribute map\n * @param {object} attrs - Attributes with prefix (e.g., {\"@_class\": \"code\"})\n * @param {string} prefix - Attribute prefix to remove (e.g., \"@_\")\n * @returns {object} Attributes without prefix (e.g., {\"class\": \"code\"})\n */\nfunction stripAttributePrefix(attrs, prefix) {\n if (!attrs || typeof attrs !== 'object') return {};\n if (!prefix) return attrs;\n\n const rawAttrs = {};\n for (const key in attrs) {\n if (key.startsWith(prefix)) {\n const rawName = key.substring(prefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns \n */\nexport default function prettify(node, options, matcher) {\n return compress(node, options, matcher);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns object\n */\nfunction compress(arr, options, matcher) {\n let text;\n const compressedObj = {}; //This is intended to be a plain object\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n\n // Push current property to matcher WITH RAW ATTRIBUTES (no prefix)\n if (property !== undefined && property !== options.textNodeName) {\n const rawAttrs = stripAttributePrefix(\n tagObj[\":@\"] || {},\n options.attributeNamePrefix\n );\n matcher.push(property, rawAttrs);\n }\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, matcher);\n const isLeaf = isLeafTag(val, options);\n\n if (tagObj[\":@\"]) {\n assignAttributes(val, tagObj[\":@\"], matcher, 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 (tagObj[METADATA_SYMBOL] !== undefined && typeof val === \"object\" && val !== null) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n\n if (compressedObj[property] !== undefined && Object.prototype.hasOwnProperty.call(compressedObj, property)) {\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\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? matcher.toString() : matcher;\n if (options.isArray(property, jPathOrMatcher, isLeaf)) {\n compressedObj[property] = [val];\n } else {\n compressedObj[property] = val;\n }\n }\n\n // Pop property from matcher after processing\n if (property !== undefined && property !== options.textNodeName) {\n matcher.pop();\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\n\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, matcher, 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]; // This is the PREFIXED name (e.g., \"@_class\")\n\n // Strip prefix for matcher path (for isArray callback)\n const rawAttrName = atrrName.startsWith(options.attributeNamePrefix)\n ? atrrName.substring(options.attributeNamePrefix.length)\n : atrrName;\n\n // For attributes, we need to create a temporary path\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath\n ? matcher.toString() + \".\" + rawAttrName\n : matcher;\n\n if (options.isArray(atrrName, jPathOrMatcher, 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 { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n\n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}","'use strict';\n\nimport { getAllMatches, isName } from './util.js';\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\");\nexport function validate(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 if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' has not been opened.\", 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 = 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 (!Object.prototype.hasOwnProperty.call(attrNames, 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 isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return 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","import { buildOptions } from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport { validate } from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class 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|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData !== \"string\" && xmlData.toString) {\n xmlData = xmlData.toString();\n } else if (typeof xmlData !== \"string\") {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n\n if (validationOption) {\n if (validationOption === true) validationOption = {}; //validate with default options\n\n const result = 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, orderedObjParser.matcher);\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 if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","defaultOptions","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","allowBooleanAttributes","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","tagName","val","attributeValueProcessor","attrName","stopNodes","alwaysCreateTextNode","isArray","commentPropName","unpairedTags","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","maxNestedTags","strictReservedNames","normalizeProcessEntities","enabled","maxEntitySize","maxExpansionDepth","maxTotalExpansions","maxExpandedLength","maxEntityCount","allowedTags","tagFilter","_value$maxEntitySize","_value$maxExpansionDe","_value$maxTotalExpans","_value$maxExpandedLen","_value$maxEntityCount","_value$allowedTags","_value$tagFilter","buildOptions","options","built","assign","Array","map","node","startsWith","substring","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","METADATA_SYMBOL","isName","XmlNode","tagname","child","create","_proto","add","_this$child$push","addChild","_this$child$push2","_this$child$push3","keys","undefined","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","xmlData","i","entities","entityCount","Error","angleBracketsCount","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","indexOf","escaped","replace","regx","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","toUpperCase","entityValue","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","startChar","elementName","contentModel","trim","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","includes","defaultValue","_this$readIdentifierV5","data","seq","j","name","hexRegex","numRegex","consider","decimalPoint","eNotationRegx","Matcher","constructor","separator","path","siblingStacks","attrValues","namespace","values","currentLevel","Map","siblings","siblingKey","counter","position","count","set","tag","pop","updateCurrent","current","getCurrentTag","getCurrentNamespace","getAttrValue","hasAttr","getPosition","getCounter","getIndex","getDepth","toString","includeNamespace","sep","n","toArray","reset","expression","segments","hasDeepWildcard","_matchWithDeepWildcard","_matchSimple","segment","isCurrentNode","_matchSegment","pathIdx","segIdx","nextSeg","found","attrValue","actualValue","String","positionValue","snapshot","restore","Expression","pattern","_parse","_hasDeepWildcard","some","seg","_hasAttributeCondition","_hasPositionSelector","currentPart","_parseSegment","part","bracketContent","withoutBrackets","bracketMatch","content","slice","tagAndPosition","nsIndex","positionMatch","colonIndex","lastIndexOf","tagPart","posPart","eqIndex","nthMatch","parseInt","hasAttributeCondition","hasPositionSelector","extractRawAttributes","prefixedAttrs","rawAttrs","extractNamespace","rawTagName","ns","OrderedObjParser","currentNode","tagsNodeStack","docTypeEntities","lastEntities","ampEntity","_","str","fromCodePoint","addExternalEntities","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","_step","_iterator","_createForOfIteratorHelperLoose","done","entityExpansionCount","currentExpandedLength","matcher","isCurrentNodeStopNode","stopNodeExpressions","stopNodeExp","externalEntities","entKeys","ent","dontTrim","hasAttributes","isLeafNode","escapeEntities","jPathOrMatcher","newval","parseValue","tags","split","prefix","charAt","attrsRegx","attrStr","rawAttrsForMatcher","oldVal","parsedVal","jPathStr","aName","newVal","attrCollection","xmlObj","xmlNode","textData","docTypeReader","closeIndex","findClosingIndex","substr","lastTagName","tagData","readTagExp","childNode","tagExp","attrExpPresent","endIndex","_ref","result","_ref2","context","Math","max","min","newTagName","lastTag","isSelfClosing","tagContent","entityConfig","entity","lengthBefore","parentNode","errMsg","closingIndex","closingChar","attrBoundary","ch","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","shouldParse","trimmedStr","skipLike","numStr","Number","window","parse_int","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","toNumber","base","codePoint","stripAttributePrefix","prettify","compress","arr","text","compressedObj","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","atrrName","rawAttrName","propCount","isWhiteSpace","char","readPI","start","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","readAttributeStr","tagClosed","validAttrStrRegxp","validateAttributeString","attrNames","getPositionFromMatch","validateAttrName","validateAmpersand","re","validateNumberAmpersand","code","message","lineNumber","err","msg","line","col","validateTagName","lines","XMLParser","parse","validationOption","tagFound","reachedRoot","tagStartPos","closingTag","attrStrStart","isValid","otg","openPos","afterAmp","JSON","stringify","t","validate","orderedObjParser","orderedResult","addEntity"],"sourceRoot":""} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2f2ed65f..ec2f04c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "fast-xml-parser", - "version": "5.5.1", + "version": "5.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "fast-xml-parser", - "version": "5.5.1", + "version": "5.5.2", "funding": [ { "type": "github", @@ -15,8 +15,8 @@ ], "license": "MIT", "dependencies": { - "fast-xml-builder": "^1.1.0", - "path-expression-matcher": "^1.1.2", + "fast-xml-builder": "^1.1.1", + "path-expression-matcher": "^1.1.3", "strnum": "^2.1.2" }, "bin": { @@ -4015,9 +4015,9 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-builder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.0.tgz", - "integrity": "sha512-7mtITW/we2/wTUZqMyBOR2F8xP4CRxMiSEcQxPIqdRWdO2L/HZSOlzoNyghmyDwNB8BDxePooV1ZTJpkOUhdRg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.1.tgz", + "integrity": "sha512-t2IsJo7bUteacw/QxmvjAJUGRWZZJHfj1/0tP3+tm5DteIIXEJb0rcasgFD81cxk4lhzcSzTBgTKlwfcKlB5tA==", "funding": [ { "type": "github", @@ -4026,7 +4026,7 @@ ], "license": "MIT", "dependencies": { - "path-expression-matcher": "^1.1.2" + "path-expression-matcher": "^1.1.3" } }, "node_modules/fastest-levenshtein": { @@ -5769,9 +5769,9 @@ } }, "node_modules/path-expression-matcher": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.2.tgz", - "integrity": "sha512-LXWqJmcpp2BKOEmgt4CyuESFmBfPuhJlAHKJsFzuJU6CxErWk75BrO+Ni77M9OxHN6dCYKM4vj+21Z6cOL96YQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", + "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", "funding": [ { "type": "github", @@ -10626,11 +10626,11 @@ "dev": true }, "fast-xml-builder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.0.tgz", - "integrity": "sha512-7mtITW/we2/wTUZqMyBOR2F8xP4CRxMiSEcQxPIqdRWdO2L/HZSOlzoNyghmyDwNB8BDxePooV1ZTJpkOUhdRg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.1.tgz", + "integrity": "sha512-t2IsJo7bUteacw/QxmvjAJUGRWZZJHfj1/0tP3+tm5DteIIXEJb0rcasgFD81cxk4lhzcSzTBgTKlwfcKlB5tA==", "requires": { - "path-expression-matcher": "^1.1.2" + "path-expression-matcher": "^1.1.3" } }, "fastest-levenshtein": { @@ -11909,9 +11909,9 @@ "dev": true }, "path-expression-matcher": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.2.tgz", - "integrity": "sha512-LXWqJmcpp2BKOEmgt4CyuESFmBfPuhJlAHKJsFzuJU6CxErWk75BrO+Ni77M9OxHN6dCYKM4vj+21Z6cOL96YQ==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", + "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==" }, "path-is-absolute": { "version": "1.0.1", diff --git a/package.json b/package.json index 95e93f2e..39d3d823 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fast-xml-parser", - "version": "5.5.1", + "version": "5.5.2", "description": "Validate XML, Parse XML, Build XML without C/C++ based libraries", "main": "./lib/fxp.cjs", "type": "module", @@ -87,8 +87,8 @@ } ], "dependencies": { - "fast-xml-builder": "^1.1.0", - "path-expression-matcher": "^1.1.2", + "fast-xml-builder": "^1.1.1", + "path-expression-matcher": "^1.1.3", "strnum": "^2.1.2" } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 69dc2575..c7300ba1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2118,12 +2118,12 @@ fast-uri@^3.0.1: resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz" integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== -fast-xml-builder@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.0.tgz" - integrity sha512-7mtITW/we2/wTUZqMyBOR2F8xP4CRxMiSEcQxPIqdRWdO2L/HZSOlzoNyghmyDwNB8BDxePooV1ZTJpkOUhdRg== +fast-xml-builder@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.1.tgz" + integrity sha512-t2IsJo7bUteacw/QxmvjAJUGRWZZJHfj1/0tP3+tm5DteIIXEJb0rcasgFD81cxk4lhzcSzTBgTKlwfcKlB5tA== dependencies: - path-expression-matcher "^1.1.2" + path-expression-matcher "^1.1.3" fastest-levenshtein@^1.0.12: version "1.0.16" @@ -3149,10 +3149,10 @@ path-exists@^4.0.0: resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-expression-matcher@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.2.tgz" - integrity sha512-LXWqJmcpp2BKOEmgt4CyuESFmBfPuhJlAHKJsFzuJU6CxErWk75BrO+Ni77M9OxHN6dCYKM4vj+21Z6cOL96YQ== +path-expression-matcher@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz" + integrity sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ== path-is-absolute@^1.0.0: version "1.0.1"