xml-sax-ts 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -16
- package/dist/index.cjs +199 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -1
- package/dist/index.d.ts +35 -1
- package/dist/index.js +196 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -51,6 +51,37 @@ const root = parseXmlString("<root><a>1</a><b/></root>");
|
|
|
51
51
|
console.log(root.name); // "root"
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
+
### Project to plain objects
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import { buildObject, parseXmlString } from "xml-sax-ts";
|
|
58
|
+
|
|
59
|
+
const root = parseXmlString("<root id='1'><item>1</item><item>2</item></root>");
|
|
60
|
+
const obj = buildObject(root);
|
|
61
|
+
// { "@_id": "1", item: ["1", "2"] }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Streaming object builder
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
import { ObjectBuilder, XmlSaxParser } from "xml-sax-ts";
|
|
68
|
+
|
|
69
|
+
const builder = new ObjectBuilder();
|
|
70
|
+
const parser = new XmlSaxParser({
|
|
71
|
+
onOpenTag: builder.onOpenTag,
|
|
72
|
+
onText: builder.onText,
|
|
73
|
+
onCdata: builder.onCdata,
|
|
74
|
+
onCloseTag: builder.onCloseTag
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
parser.feed("<root><item>1</item>");
|
|
78
|
+
parser.feed("<item>2</item></root>");
|
|
79
|
+
parser.close();
|
|
80
|
+
|
|
81
|
+
const obj = builder.getResult();
|
|
82
|
+
// { item: ["1", "2"] }
|
|
83
|
+
```
|
|
84
|
+
|
|
54
85
|
### Serialize to XML
|
|
55
86
|
|
|
56
87
|
```ts
|
|
@@ -67,9 +98,7 @@ const xml = serializeXml(
|
|
|
67
98
|
// <?xml version="1.0" encoding="UTF-8"?>
|
|
68
99
|
// <root id="1">
|
|
69
100
|
// Hello
|
|
70
|
-
// <child>
|
|
71
|
-
// World
|
|
72
|
-
// </child>
|
|
101
|
+
// <child>World</child>
|
|
73
102
|
// </root>
|
|
74
103
|
```
|
|
75
104
|
|
|
@@ -81,10 +110,10 @@ const xml = serializeXml(
|
|
|
81
110
|
new XmlSaxParser(options?: ParserOptions)
|
|
82
111
|
```
|
|
83
112
|
|
|
84
|
-
| Method
|
|
85
|
-
|
|
|
86
|
-
| `feed(chunk)` | Feed a string chunk to the parser
|
|
87
|
-
| `close()` | Signal end-of-input and validate open tags
|
|
113
|
+
| Method. | Description |
|
|
114
|
+
| ------------- | ------------------------------------------ |
|
|
115
|
+
| `feed(chunk)` | Feed a string chunk to the parser |
|
|
116
|
+
| `close()` | Signal end-of-input and validate open tags |
|
|
88
117
|
|
|
89
118
|
#### `ParserOptions`
|
|
90
119
|
|
|
@@ -93,14 +122,14 @@ new XmlSaxParser(options?: ParserOptions)
|
|
|
93
122
|
| `xmlns` | `boolean` | `true` | Enable namespace resolution |
|
|
94
123
|
| `includeNamespaceAttributes` | `boolean` | `false` | Include `xmlns:*` attributes in tag output |
|
|
95
124
|
| `allowDoctype` | `boolean` | `true` | Allow `<!DOCTYPE …>` declarations |
|
|
96
|
-
| `onOpenTag` | `function` | — | Called for each opening / self-closing tag
|
|
97
|
-
| `onCloseTag` | `function` | — | Called for each closing tag
|
|
98
|
-
| `onText` | `function` | — | Called for text nodes
|
|
99
|
-
| `onCdata` | `function` | — | Called for CDATA sections
|
|
100
|
-
| `onComment` | `function` | — | Called for comments
|
|
101
|
-
| `onProcessingInstruction` | `function` | — | Called for processing instructions (`<?…?>`)
|
|
102
|
-
| `onDoctype` | `function` | — | Called for DOCTYPE declarations
|
|
103
|
-
| `onError` | `function` | — | Called on parse errors
|
|
125
|
+
| `onOpenTag` | `function` | — | Called for each opening / self-closing tag |
|
|
126
|
+
| `onCloseTag` | `function` | — | Called for each closing tag |
|
|
127
|
+
| `onText` | `function` | — | Called for text nodes |
|
|
128
|
+
| `onCdata` | `function` | — | Called for CDATA sections |
|
|
129
|
+
| `onComment` | `function` | — | Called for comments |
|
|
130
|
+
| `onProcessingInstruction` | `function` | — | Called for processing instructions (`<?…?>`) |
|
|
131
|
+
| `onDoctype` | `function` | — | Called for DOCTYPE declarations |
|
|
132
|
+
| `onError` | `function` | — | Called on parse errors |
|
|
104
133
|
|
|
105
134
|
### `parseXmlString(xml, options?)`
|
|
106
135
|
|
|
@@ -110,6 +139,24 @@ Convenience function that parses a complete XML string into an `XmlNode` tree us
|
|
|
110
139
|
|
|
111
140
|
Low-level tree builder. Attach its `onOpenTag`, `onText`, `onCdata`, and `onCloseTag` methods to a parser, then call `getRoot()` to retrieve the resulting `XmlNode`.
|
|
112
141
|
|
|
142
|
+
### `buildObject(root, options?)`
|
|
143
|
+
|
|
144
|
+
Projects an `XmlNode` tree into a plain object. Attributes are prefixed (default `@_`), text is stored under `#text`, repeated elements are arrays, and elements with only text return the text directly.
|
|
145
|
+
|
|
146
|
+
### `ObjectBuilder`
|
|
147
|
+
|
|
148
|
+
Streaming builder that produces the same object shape as `buildObject` without building a full `XmlNode` tree. Attach its `onOpenTag`, `onText`, `onCdata`, and `onCloseTag` methods to the parser.
|
|
149
|
+
|
|
150
|
+
#### `ObjectBuilderOptions`
|
|
151
|
+
|
|
152
|
+
| Option | Type | Default | Description |
|
|
153
|
+
| ------------------ | ------------------------------------------------------------ | --------- | ---------------------------------------------- |
|
|
154
|
+
| `attributePrefix` | `string` | `"@_"` | Prefix for attribute keys |
|
|
155
|
+
| `textKey` | `string` | `"#text"` | Key used for text nodes |
|
|
156
|
+
| `stripNamespaces` | `boolean` | `false` | Strip namespace prefixes from names |
|
|
157
|
+
| `arrayElements` | `Set\<string\> \| (name: string, path: string[]) => boolean` | — | Force specific elements to always be arrays |
|
|
158
|
+
| `coalesceText` | `boolean` | `true` | Merge adjacent text nodes into a single string |
|
|
159
|
+
|
|
113
160
|
### `serializeXml(node, options?)`
|
|
114
161
|
|
|
115
162
|
Serializes an `XmlNode` back to an XML string.
|
|
@@ -129,7 +176,7 @@ Custom error class thrown on parse errors. Includes `offset`, `line`, and `colum
|
|
|
129
176
|
|
|
130
177
|
### Exported types
|
|
131
178
|
|
|
132
|
-
`OpenTag` · `CloseTag` · `XmlAttribute` · `ProcessingInstruction` · `Doctype` · `XmlNode` · `XmlChild` · `XmlPosition` · `ParserOptions` · `SerializeOptions`
|
|
179
|
+
`OpenTag` · `CloseTag` · `XmlAttribute` · `ProcessingInstruction` · `Doctype` · `XmlNode` · `XmlChild` · `XmlPosition` · `ParserOptions` · `SerializeOptions` · `ObjectBuilderOptions` · `ArrayElementSelector` · `XmlObjectMap` · `XmlObjectValue`
|
|
133
180
|
|
|
134
181
|
## Features
|
|
135
182
|
|
package/dist/index.cjs
CHANGED
|
@@ -665,7 +665,10 @@ var DEFAULT_OPTIONS2 = {
|
|
|
665
665
|
};
|
|
666
666
|
function serializeXml(node, options = {}) {
|
|
667
667
|
const settings = { ...DEFAULT_OPTIONS2, ...options };
|
|
668
|
-
|
|
668
|
+
let body = serializeNode(node, settings, 0);
|
|
669
|
+
if (settings.pretty && !body.endsWith(settings.newline)) {
|
|
670
|
+
body = `${body}${settings.newline}`;
|
|
671
|
+
}
|
|
669
672
|
if (!settings.xmlDeclaration) {
|
|
670
673
|
return body;
|
|
671
674
|
}
|
|
@@ -720,10 +723,205 @@ function escapeAttribute(value) {
|
|
|
720
723
|
return escapeText(value).replace(/"/g, """);
|
|
721
724
|
}
|
|
722
725
|
|
|
726
|
+
// src/object.ts
|
|
727
|
+
var DEFAULT_OBJECT_OPTIONS = {
|
|
728
|
+
attributePrefix: "@_",
|
|
729
|
+
textKey: "#text",
|
|
730
|
+
stripNamespaces: false,
|
|
731
|
+
coalesceText: true
|
|
732
|
+
};
|
|
733
|
+
function stripNamespace(name) {
|
|
734
|
+
const index = name.indexOf(":");
|
|
735
|
+
if (index === -1) {
|
|
736
|
+
return name;
|
|
737
|
+
}
|
|
738
|
+
return name.slice(index + 1);
|
|
739
|
+
}
|
|
740
|
+
function resolveName(value) {
|
|
741
|
+
if (typeof value !== "string") {
|
|
742
|
+
return {
|
|
743
|
+
name: value.name,
|
|
744
|
+
localName: value.local,
|
|
745
|
+
prefix: value.prefix,
|
|
746
|
+
uri: value.uri
|
|
747
|
+
};
|
|
748
|
+
}
|
|
749
|
+
const index = value.indexOf(":");
|
|
750
|
+
if (index === -1) {
|
|
751
|
+
return { name: value, localName: value, prefix: "", uri: "" };
|
|
752
|
+
}
|
|
753
|
+
return {
|
|
754
|
+
name: value,
|
|
755
|
+
localName: value.slice(index + 1),
|
|
756
|
+
prefix: value.slice(0, index),
|
|
757
|
+
uri: ""
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
function buildObject(root, options = {}) {
|
|
761
|
+
const settings = buildSettings(options);
|
|
762
|
+
return buildNode(root, settings, []);
|
|
763
|
+
}
|
|
764
|
+
var ObjectBuilder = class {
|
|
765
|
+
constructor(options = {}) {
|
|
766
|
+
this.stack = [];
|
|
767
|
+
this.root = null;
|
|
768
|
+
this.rootName = null;
|
|
769
|
+
this.onOpenTag = (tag) => {
|
|
770
|
+
const name = normalizeName(tag.name, this.options);
|
|
771
|
+
const attributes = normalizeAttributes(tag.attributes, this.options);
|
|
772
|
+
const state = {
|
|
773
|
+
name,
|
|
774
|
+
attributes,
|
|
775
|
+
textParts: [],
|
|
776
|
+
children: /* @__PURE__ */ Object.create(null)
|
|
777
|
+
};
|
|
778
|
+
this.rootName ?? (this.rootName = name);
|
|
779
|
+
this.stack.push(state);
|
|
780
|
+
};
|
|
781
|
+
this.onText = (text) => {
|
|
782
|
+
if (!text) {
|
|
783
|
+
return;
|
|
784
|
+
}
|
|
785
|
+
const current = this.stack[this.stack.length - 1];
|
|
786
|
+
if (!current) {
|
|
787
|
+
return;
|
|
788
|
+
}
|
|
789
|
+
current.textParts.push(text);
|
|
790
|
+
};
|
|
791
|
+
this.onCdata = (text) => {
|
|
792
|
+
this.onText(text);
|
|
793
|
+
};
|
|
794
|
+
this.onCloseTag = () => {
|
|
795
|
+
const state = this.stack.pop();
|
|
796
|
+
if (!state) {
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
const value = finalizeElement(state, this.options);
|
|
800
|
+
const parent = this.stack[this.stack.length - 1];
|
|
801
|
+
if (!parent) {
|
|
802
|
+
this.root = value;
|
|
803
|
+
return;
|
|
804
|
+
}
|
|
805
|
+
const path = this.stack.map((entry) => entry.name);
|
|
806
|
+
addChild(parent.children, state.name, value, this.options, path);
|
|
807
|
+
};
|
|
808
|
+
this.options = buildSettings(options);
|
|
809
|
+
}
|
|
810
|
+
getResult() {
|
|
811
|
+
if (this.root === null) {
|
|
812
|
+
throw new Error("No root element found");
|
|
813
|
+
}
|
|
814
|
+
return this.root;
|
|
815
|
+
}
|
|
816
|
+
getRootName() {
|
|
817
|
+
if (!this.rootName) {
|
|
818
|
+
throw new Error("No root element found");
|
|
819
|
+
}
|
|
820
|
+
return this.rootName;
|
|
821
|
+
}
|
|
822
|
+
};
|
|
823
|
+
function buildSettings(options) {
|
|
824
|
+
return { ...DEFAULT_OBJECT_OPTIONS, ...options };
|
|
825
|
+
}
|
|
826
|
+
function buildNode(node, options, path) {
|
|
827
|
+
const name = normalizeName(node.name, options);
|
|
828
|
+
const attributes = normalizeAttributeMap(node.attributes ?? {}, options);
|
|
829
|
+
const state = {
|
|
830
|
+
attributes,
|
|
831
|
+
textParts: [],
|
|
832
|
+
children: /* @__PURE__ */ Object.create(null)
|
|
833
|
+
};
|
|
834
|
+
const children = node.children ?? [];
|
|
835
|
+
for (const child of children) {
|
|
836
|
+
if (typeof child === "string") {
|
|
837
|
+
if (child) {
|
|
838
|
+
state.textParts.push(child);
|
|
839
|
+
}
|
|
840
|
+
continue;
|
|
841
|
+
}
|
|
842
|
+
const value = buildNode(child, options, [...path, name]);
|
|
843
|
+
const childName = normalizeName(child.name, options);
|
|
844
|
+
addChild(state.children, childName, value, options, [...path, name]);
|
|
845
|
+
}
|
|
846
|
+
return finalizeElement(state, options);
|
|
847
|
+
}
|
|
848
|
+
function normalizeName(name, options) {
|
|
849
|
+
if (options.stripNamespaces) {
|
|
850
|
+
return stripNamespace(name);
|
|
851
|
+
}
|
|
852
|
+
return name;
|
|
853
|
+
}
|
|
854
|
+
function normalizeAttributes(attributes, options) {
|
|
855
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
856
|
+
for (const [key, attr] of Object.entries(attributes)) {
|
|
857
|
+
const name = normalizeName(key, options);
|
|
858
|
+
result[name] = attr.value;
|
|
859
|
+
}
|
|
860
|
+
return result;
|
|
861
|
+
}
|
|
862
|
+
function normalizeAttributeMap(attributes, options) {
|
|
863
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
864
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
865
|
+
const name = normalizeName(key, options);
|
|
866
|
+
result[name] = value;
|
|
867
|
+
}
|
|
868
|
+
return result;
|
|
869
|
+
}
|
|
870
|
+
function addChild(target, name, value, options, path) {
|
|
871
|
+
const forcedArray = shouldForceArray(name, path, options);
|
|
872
|
+
const existing = target[name];
|
|
873
|
+
if (existing === void 0) {
|
|
874
|
+
target[name] = forcedArray ? [value] : value;
|
|
875
|
+
return;
|
|
876
|
+
}
|
|
877
|
+
if (Array.isArray(existing)) {
|
|
878
|
+
existing.push(value);
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
881
|
+
target[name] = [existing, value];
|
|
882
|
+
}
|
|
883
|
+
function shouldForceArray(name, path, options) {
|
|
884
|
+
const rule = options.arrayElements;
|
|
885
|
+
if (!rule) {
|
|
886
|
+
return false;
|
|
887
|
+
}
|
|
888
|
+
if (rule instanceof Set) {
|
|
889
|
+
return rule.has(name);
|
|
890
|
+
}
|
|
891
|
+
return rule(name, path);
|
|
892
|
+
}
|
|
893
|
+
function finalizeElement(state, options) {
|
|
894
|
+
const hasAttributes = Object.keys(state.attributes).length > 0;
|
|
895
|
+
const hasChildren = Object.keys(state.children).length > 0;
|
|
896
|
+
const hasText = state.textParts.length > 0;
|
|
897
|
+
const textValue = options.coalesceText ? state.textParts.join("") : state.textParts.length <= 1 ? state.textParts[0] ?? "" : state.textParts.slice();
|
|
898
|
+
if (!hasAttributes && !hasChildren) {
|
|
899
|
+
if (!hasText) {
|
|
900
|
+
return "";
|
|
901
|
+
}
|
|
902
|
+
return textValue;
|
|
903
|
+
}
|
|
904
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
905
|
+
for (const [key, value] of Object.entries(state.attributes)) {
|
|
906
|
+
result[`${options.attributePrefix}${key}`] = value;
|
|
907
|
+
}
|
|
908
|
+
for (const [key, value] of Object.entries(state.children)) {
|
|
909
|
+
result[key] = value;
|
|
910
|
+
}
|
|
911
|
+
if (hasText) {
|
|
912
|
+
result[options.textKey] = textValue;
|
|
913
|
+
}
|
|
914
|
+
return result;
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
exports.ObjectBuilder = ObjectBuilder;
|
|
723
918
|
exports.TreeBuilder = TreeBuilder;
|
|
724
919
|
exports.XmlSaxError = XmlSaxError;
|
|
725
920
|
exports.XmlSaxParser = XmlSaxParser;
|
|
921
|
+
exports.buildObject = buildObject;
|
|
726
922
|
exports.parseXmlString = parseXmlString;
|
|
923
|
+
exports.resolveName = resolveName;
|
|
727
924
|
exports.serializeXml = serializeXml;
|
|
925
|
+
exports.stripNamespace = stripNamespace;
|
|
728
926
|
//# sourceMappingURL=index.cjs.map
|
|
729
927
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/assert.ts","../src/errors.ts","../src/entities.ts","../src/parser.ts","../src/tree.ts","../src/serializer.ts"],"names":["split","DEFAULT_OPTIONS","indent","inner"],"mappings":"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","file":"index.cjs","sourcesContent":["const DEV = typeof process !== \"undefined\" ? process.env.NODE_ENV !== \"production\" : true;\n\nexport function assert(condition: boolean, message: string): void {\n if (!DEV) {\n return;\n }\n if (!condition) {\n throw new Error(`Invariant failed: ${message}`);\n }\n}\n","export class XmlSaxError extends Error {\n readonly offset: number;\n readonly line: number;\n readonly column: number;\n\n constructor(message: string, offset: number, line: number, column: number) {\n super(`${message} at ${line}:${column}`);\n this.name = \"XmlSaxError\";\n this.offset = offset;\n this.line = line;\n this.column = column;\n }\n}\n","import { XmlSaxError } from \"./errors\";\n\nconst NAMED_ENTITIES: Record<string, string> = {\n lt: \"<\",\n gt: \">\",\n amp: \"&\",\n quot: \"\\\"\",\n apos: \"'\"\n};\n\nexport function decodeEntities(input: string, onError?: (error: Error) => void): string {\n let output = \"\";\n let i = 0;\n\n while (i < input.length) {\n const ch = input[i];\n if (ch !== \"&\") {\n output += ch;\n i += 1;\n continue;\n }\n\n const semi = input.indexOf(\";\", i + 1);\n if (semi === -1) {\n const err = new XmlSaxError(\"Unterminated entity\", i, 0, 0);\n onError?.(err);\n throw err;\n }\n\n const entity = input.slice(i + 1, semi);\n let decoded: string | undefined;\n\n if (entity.startsWith(\"#x\") || entity.startsWith(\"#X\")) {\n const codePoint = Number.parseInt(entity.slice(2), 16);\n decoded = decodeCodePoint(codePoint);\n } else if (entity.startsWith(\"#\")) {\n const codePoint = Number.parseInt(entity.slice(1), 10);\n decoded = decodeCodePoint(codePoint);\n } else {\n decoded = NAMED_ENTITIES[entity];\n }\n\n if (decoded === undefined) {\n const err = new XmlSaxError(`Unknown entity: &${entity};`, i, 0, 0);\n onError?.(err);\n throw err;\n }\n\n output += decoded;\n i = semi + 1;\n }\n\n return output;\n}\n\nfunction decodeCodePoint(codePoint: number): string | undefined {\n if (!Number.isFinite(codePoint)) {\n return undefined;\n }\n if (codePoint < 0 || codePoint > 0x10ffff) {\n return undefined;\n }\n if (codePoint >= 0xd800 && codePoint <= 0xdfff) {\n return undefined;\n }\n return String.fromCodePoint(codePoint);\n}\n\nexport function splitTextForEntities(text: string): { emit: string; carry: string } {\n const lastAmp = text.lastIndexOf(\"&\");\n if (lastAmp === -1) {\n return { emit: text, carry: \"\" };\n }\n\n const nextSemi = text.indexOf(\";\", lastAmp + 1);\n if (nextSemi === -1) {\n return {\n emit: text.slice(0, lastAmp),\n carry: text.slice(lastAmp)\n };\n }\n\n return { emit: text, carry: \"\" };\n}\n","import { assert } from \"./assert\";\nimport { decodeEntities, splitTextForEntities } from \"./entities\";\nimport { XmlSaxError } from \"./errors\";\nimport type {\n CloseTag,\n Doctype,\n OpenTag,\n ParserOptions,\n ProcessingInstruction,\n XmlAttribute\n} from \"./types\";\n\ntype NamespaceMap = Record<string, string>;\n\ninterface StackEntry {\n rawName: string;\n resolved: ResolvedName;\n ns: NamespaceMap;\n}\n\ninterface RawAttribute {\n name: string;\n value: string;\n}\n\ninterface ResolvedName {\n name: string;\n prefix: string;\n local: string;\n uri: string;\n}\n\nconst DEFAULT_OPTIONS: Required<Pick<ParserOptions, \"xmlns\" | \"includeNamespaceAttributes\" | \"allowDoctype\">> = {\n xmlns: true,\n includeNamespaceAttributes: false,\n allowDoctype: true\n};\n\nconst XML_NAMESPACE_URI = \"http://www.w3.org/XML/1998/namespace\";\nconst XMLNS_NAMESPACE_URI = \"http://www.w3.org/2000/xmlns/\";\n\nexport class XmlSaxParser {\n private options: ParserOptions;\n private buffer = \"\";\n private offset = 0;\n private line = 1;\n private column = 1;\n private elementStack: StackEntry[] = [];\n private nsStack: NamespaceMap[] = [\n Object.assign(Object.create(null) as NamespaceMap, {\n xml: XML_NAMESPACE_URI,\n xmlns: XMLNS_NAMESPACE_URI\n })\n ];\n private closed = false;\n private pendingCR = false;\n\n constructor(options: ParserOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n feed(chunk: string): void {\n if (this.closed) {\n this._error(\"Parser is closed\");\n }\n if (!chunk) {\n return;\n }\n this.buffer += chunk;\n this._parseBuffer(false);\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n this._parseBuffer(true);\n this._flushPendingCR();\n if (this.buffer.length > 0) {\n this._error(\"Unexpected end of input\");\n }\n if (this.elementStack.length > 0) {\n this._error(\"Unclosed tag(s) remaining\");\n }\n this.closed = true;\n }\n\n private _parseBuffer(final: boolean): void {\n let i = 0;\n\n while (i < this.buffer.length) {\n const lt = this.buffer.indexOf(\"<\", i);\n if (lt === -1) {\n const tail = this.buffer.slice(i);\n const split = splitTextForEntities(tail);\n if (split.emit.length > 0) {\n this._emitText(split.emit, true);\n this._advance(split.emit);\n }\n this.buffer = split.carry;\n return;\n }\n\n if (lt > i) {\n const text = this.buffer.slice(i, lt);\n if (text.length > 0) {\n this._emitText(text, false);\n this._advance(text);\n }\n i = lt;\n }\n\n const consumed = this._parseMarkupFrom(lt, final);\n if (consumed === null) {\n break;\n }\n\n const markup = this.buffer.slice(lt, lt + consumed);\n this._advance(markup);\n i = lt + consumed;\n }\n\n this.buffer = this.buffer.slice(i);\n\n if (final && this.buffer.length > 0) {\n this._error(\"Unexpected end of input\");\n }\n }\n\n private _parseMarkupFrom(start: number, final: boolean): number | null {\n assert(this.buffer[start] === \"<\", \"Markup must start with '<'\");\n\n this._flushPendingCR();\n\n if (this.buffer.startsWith(\"<!--\", start)) {\n const end = this.buffer.indexOf(\"-->\", start + 4);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated comment\");\n }\n return null;\n }\n const comment = this.buffer.slice(start + 4, end);\n this.options.onComment?.(comment);\n return end + 3 - start;\n }\n\n if (this.buffer.startsWith(\"<![CDATA[\", start)) {\n const end = this.buffer.indexOf(\"]]>\", start + 9);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated CDATA section\");\n }\n return null;\n }\n const cdata = this.buffer.slice(start + 9, end);\n const normalized = this._normalizeText(cdata, false);\n if (normalized.length > 0) {\n this.options.onCdata?.(normalized);\n }\n return end + 3 - start;\n }\n\n if (this.buffer.startsWith(\"<?\", start)) {\n const end = this.buffer.indexOf(\"?>\", start + 2);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated processing instruction\");\n }\n return null;\n }\n const body = this.buffer.slice(start + 2, end).trim();\n const split = body.search(/\\s/);\n const target = split === -1 ? body : body.slice(0, split);\n const data = split === -1 ? \"\" : body.slice(split).trim();\n const pi: ProcessingInstruction = { target, body: data };\n this.options.onProcessingInstruction?.(pi);\n return end + 2 - start;\n }\n\n if (this.buffer.startsWith(\"<!DOCTYPE\", start)) {\n const end = this._findDoctypeEnd(start + 9);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated doctype declaration\");\n }\n return null;\n }\n if (!this.options.allowDoctype) {\n this._error(\"Doctype is not allowed\");\n }\n const raw = this.buffer.slice(start + 9, end).trim();\n const doctype: Doctype = { raw };\n this.options.onDoctype?.(doctype);\n return end + 1 - start;\n }\n\n if (this.buffer.startsWith(\"</\", start)) {\n const end = this.buffer.indexOf(\">\", start + 2);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated closing tag\");\n }\n return null;\n }\n const raw = this.buffer.slice(start + 2, end).trim();\n const parsed = this._parseName(raw, 0, raw.length);\n if (raw.slice(parsed.end).trim().length > 0) {\n this._error(\"Invalid closing tag\");\n }\n this._handleCloseTag(parsed.name);\n return end + 1 - start;\n }\n\n const tagEnd = this._findTagEnd(start + 1);\n if (tagEnd === -1) {\n if (final) {\n this._error(\"Unterminated start tag\");\n }\n return null;\n }\n\n const content = this.buffer.slice(start + 1, tagEnd);\n this._handleStartTag(content);\n return tagEnd + 1 - start;\n }\n\n private _handleStartTag(content: string): void {\n const trimmed = content.trim();\n const selfClosing = trimmed.endsWith(\"/\");\n const body = selfClosing ? trimmed.slice(0, -1).trim() : trimmed;\n const parsed = this._parseTagBody(body);\n\n let ns = this._currentNs();\n if (this.options.xmlns) {\n ns = Object.create(ns) as NamespaceMap;\n for (const attr of parsed.attributes) {\n if (attr.name === \"xmlns\") {\n ns[\"\"] = attr.value;\n } else if (attr.name.startsWith(\"xmlns:\")) {\n ns[attr.name.slice(6)] = attr.value;\n }\n }\n }\n\n const resolvedName = this._resolveName(parsed.name, ns);\n const attributes: Record<string, XmlAttribute> = {};\n\n for (const attr of parsed.attributes) {\n if (this.options.xmlns && !this.options.includeNamespaceAttributes) {\n if (attr.name === \"xmlns\" || attr.name.startsWith(\"xmlns:\")) {\n continue;\n }\n }\n const resolvedAttr = this._resolveAttributeName(attr.name, ns);\n attributes[resolvedAttr.name] = {\n name: resolvedAttr.name,\n value: attr.value,\n prefix: resolvedAttr.prefix,\n local: resolvedAttr.local,\n uri: resolvedAttr.uri\n };\n }\n\n const tag: OpenTag = {\n name: resolvedName.name,\n prefix: resolvedName.prefix,\n local: resolvedName.local,\n uri: resolvedName.uri,\n attributes,\n isSelfClosing: selfClosing\n };\n\n this.options.onOpenTag?.(tag);\n\n if (selfClosing) {\n const closeTag: CloseTag = {\n name: resolvedName.name,\n prefix: resolvedName.prefix,\n local: resolvedName.local,\n uri: resolvedName.uri\n };\n this.options.onCloseTag?.(closeTag);\n return;\n }\n\n this.elementStack.push({ rawName: parsed.name, resolved: resolvedName, ns });\n this.nsStack.push(ns);\n }\n\n private _handleCloseTag(rawName: string): void {\n const entry = this.elementStack.pop();\n const ns = this.nsStack.pop();\n\n if (!entry || !ns) {\n this._error(\"Closing tag without matching start tag\");\n }\n\n if (entry.rawName !== rawName) {\n this._error(`Mismatched closing tag: expected </${entry.rawName}>`);\n }\n\n const closeTag: CloseTag = {\n name: entry.resolved.name,\n prefix: entry.resolved.prefix,\n local: entry.resolved.local,\n uri: entry.resolved.uri\n };\n\n this.options.onCloseTag?.(closeTag);\n }\n\n private _parseTagBody(body: string): { name: string; attributes: RawAttribute[] } {\n let i = 0;\n const length = body.length;\n\n i = this._skipWhitespace(body, i, length);\n const parsedName = this._parseName(body, i, length);\n i = parsedName.end;\n\n const attributes: RawAttribute[] = [];\n\n while (i < length) {\n i = this._skipWhitespace(body, i, length);\n if (i >= length) {\n break;\n }\n\n const attrName = this._parseName(body, i, length);\n i = attrName.end;\n i = this._skipWhitespace(body, i, length);\n\n if (body[i] !== \"=\") {\n this._error(\"Attribute without '='\");\n }\n i += 1;\n i = this._skipWhitespace(body, i, length);\n\n const quote = body[i];\n if (quote !== \"\\\"\" && quote !== \"'\") {\n this._error(\"Attribute value must be quoted\");\n }\n i += 1;\n\n const valueEnd = body.indexOf(quote, i);\n if (valueEnd === -1) {\n this._error(\"Unterminated attribute value\");\n }\n const rawValue = body.slice(i, valueEnd);\n const normalized = rawValue.replace(/\\r\\n?/g, \"\\n\");\n const value = decodeEntities(normalized, this.options.onError);\n attributes.push({ name: attrName.name, value });\n i = valueEnd + 1;\n }\n\n return { name: parsedName.name, attributes };\n }\n\n private _emitText(text: string, allowPendingCR: boolean): void {\n const normalized = this._normalizeText(text, allowPendingCR);\n if (normalized.length === 0) {\n return;\n }\n const decoded = decodeEntities(normalized, this.options.onError);\n if (decoded.length > 0) {\n this.options.onText?.(decoded);\n }\n }\n\n private _resolveName(rawName: string, ns: NamespaceMap): ResolvedName {\n if (!this.options.xmlns) {\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return { name: rawName, prefix: \"\", local: rawName, uri: \"\" };\n }\n return {\n name: rawName,\n prefix: rawName.slice(0, split),\n local: rawName.slice(split + 1),\n uri: \"\"\n };\n }\n\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: ns[\"\"] ?? \"\"\n };\n }\n\n const prefix = rawName.slice(0, split);\n const local = rawName.slice(split + 1);\n const uri = ns[prefix];\n if (uri === undefined) {\n this._error(`Undeclared namespace prefix: ${prefix}`);\n }\n return {\n name: rawName,\n prefix,\n local,\n uri\n };\n }\n\n private _resolveAttributeName(rawName: string, ns: NamespaceMap): ResolvedName {\n if (!this.options.xmlns) {\n return this._resolveName(rawName, ns);\n }\n\n if (rawName === \"xmlns\") {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: ns.xmlns ?? XMLNS_NAMESPACE_URI\n };\n }\n\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: \"\"\n };\n }\n\n const prefix = rawName.slice(0, split);\n const local = rawName.slice(split + 1);\n const uri = ns[prefix];\n if (uri === undefined) {\n this._error(`Undeclared namespace prefix: ${prefix}`);\n }\n\n return {\n name: rawName,\n prefix,\n local,\n uri\n };\n }\n\n private _findTagEnd(start: number): number {\n let quote: string | null = null;\n for (let i = start; i < this.buffer.length; i += 1) {\n const ch = this.buffer[i];\n if (quote) {\n if (ch === quote) {\n quote = null;\n }\n continue;\n }\n if (ch === \"\\\"\" || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \">\") {\n return i;\n }\n }\n return -1;\n }\n\n private _findDoctypeEnd(start: number): number {\n let quote: string | null = null;\n let bracketDepth = 0;\n\n for (let i = start; i < this.buffer.length; i += 1) {\n const ch = this.buffer[i];\n if (quote) {\n if (ch === quote) {\n quote = null;\n }\n continue;\n }\n if (ch === \"\\\"\" || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \"[\") {\n bracketDepth += 1;\n continue;\n }\n if (ch === \"]\") {\n bracketDepth = Math.max(0, bracketDepth - 1);\n continue;\n }\n if (ch === \">\" && bracketDepth === 0) {\n return i;\n }\n }\n\n return -1;\n }\n\n private _parseName(input: string, start: number, end: number): { name: string; end: number } {\n if (start >= end) {\n this._error(\"Expected name\");\n }\n\n const first = input[start];\n if (first === undefined) {\n this._error(\"Expected name\");\n }\n if (!this._isNameStart(first)) {\n this._error(`Invalid name start: '${first}'`);\n }\n\n let i = start + 1;\n while (i < end) {\n const ch = input[i];\n if (ch === undefined || !this._isNameChar(ch)) {\n break;\n }\n i += 1;\n }\n\n return { name: input.slice(start, i), end: i };\n }\n\n private _isNameStart(ch: string): boolean {\n return /[A-Za-z_]/.test(ch);\n }\n\n private _isNameChar(ch: string): boolean {\n return /[A-Za-z0-9_:\\-.]/.test(ch);\n }\n\n private _skipWhitespace(input: string, start: number, end: number): number {\n let i = start;\n while (i < end) {\n const ch = input[i];\n if (ch === undefined || !/\\s/.test(ch)) {\n break;\n }\n i += 1;\n }\n return i;\n }\n\n private _currentNs(): NamespaceMap {\n return this.nsStack[this.nsStack.length - 1] ?? (Object.create(null) as NamespaceMap);\n }\n\n private _advance(text: string): void {\n this.offset += text.length;\n const lastNewline = text.lastIndexOf(\"\\n\");\n if (lastNewline === -1) {\n this.column += text.length;\n return;\n }\n\n const newlineCount = text.split(\"\\n\").length - 1;\n this.line += newlineCount;\n this.column = text.length - lastNewline;\n }\n\n private _normalizeText(text: string, allowPendingCR: boolean): string {\n if (!text) {\n return \"\";\n }\n\n let value = text;\n let prefix = \"\";\n\n if (this.pendingCR) {\n prefix = \"\\n\";\n if (value.startsWith(\"\\n\")) {\n value = value.slice(1);\n }\n this.pendingCR = false;\n }\n\n if (allowPendingCR && value.endsWith(\"\\r\")) {\n this.pendingCR = true;\n value = value.slice(0, -1);\n }\n\n const normalized = value.replace(/\\r\\n?/g, \"\\n\");\n return `${prefix}${normalized}`;\n }\n\n private _flushPendingCR(): void {\n if (!this.pendingCR) {\n return;\n }\n this.pendingCR = false;\n this.options.onText?.(\"\\n\");\n }\n\n private _error(message: string): never {\n const error = new XmlSaxError(message, this.offset, this.line, this.column);\n this.options.onError?.(error);\n throw error;\n }\n}\n","import { XmlSaxParser } from \"./parser\";\nimport type { ParserOptions, XmlNode } from \"./types\";\n\nexport class TreeBuilder {\n private stack: XmlNode[] = [];\n private root: XmlNode | null = null;\n\n onOpenTag = (tag: { name: string; attributes: Record<string, { value: string }> }): void => {\n const node: XmlNode = {\n name: tag.name,\n attributes: Object.fromEntries(\n Object.entries(tag.attributes).map(([key, attr]) => [key, attr.value])\n ),\n children: []\n };\n\n const parent = this.stack[this.stack.length - 1];\n if (parent) {\n parent.children?.push(node);\n } else {\n this.root = node;\n }\n\n this.stack.push(node);\n };\n\n onText = (text: string): void => {\n if (!this.stack.length) {\n return;\n }\n const node = this.stack[this.stack.length - 1];\n if (!node) {\n return;\n }\n const children = node.children ?? [];\n const last = children[children.length - 1];\n if (typeof last === \"string\") {\n children[children.length - 1] = last + text;\n } else {\n children.push(text);\n }\n node.children = children;\n };\n\n onCdata = (text: string): void => {\n this.onText(text);\n };\n\n onCloseTag = (): void => {\n this.stack.pop();\n };\n\n getRoot(): XmlNode {\n if (!this.root) {\n throw new Error(\"No root element found\");\n }\n return this.root;\n }\n}\n\nexport function parseXmlString(xml: string, options: ParserOptions = {}): XmlNode {\n const builder = new TreeBuilder();\n const parser = new XmlSaxParser({\n ...options,\n onOpenTag: builder.onOpenTag,\n onText: builder.onText,\n onCdata: builder.onCdata,\n onCloseTag: builder.onCloseTag\n });\n\n parser.feed(xml);\n parser.close();\n return builder.getRoot();\n}\n","import type { SerializeOptions, XmlChild, XmlNode } from \"./types\";\n\nconst DEFAULT_OPTIONS: Required<Pick<SerializeOptions, \"pretty\" | \"indent\" | \"newline\" | \"xmlDeclaration\">> = {\n pretty: false,\n indent: \" \",\n newline: \"\\n\",\n xmlDeclaration: false\n};\n\nexport function serializeXml(node: XmlNode, options: SerializeOptions = {}): string {\n const settings = { ...DEFAULT_OPTIONS, ...options };\n const body = serializeNode(node, settings, 0);\n if (!settings.xmlDeclaration) {\n return body;\n }\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>${settings.newline}${body}`;\n}\n\nfunction serializeNode(node: XmlNode, options: Required<SerializeOptions>, depth: number): string {\n const attrs = serializeAttributes(node.attributes);\n const tagOpen = `<${node.name}${attrs}>`;\n const tagClose = `</${node.name}>`;\n\n const children = node.children ?? [];\n if (!children.length) {\n if (!options.pretty) {\n return `<${node.name}${attrs}/>`;\n }\n const indent = options.indent.repeat(depth);\n return `${indent}<${node.name}${attrs}/>`;\n }\n\n if (!options.pretty) {\n const inner = children.map((child) => serializeChild(child, options, depth + 1)).join(\"\");\n return `${tagOpen}${inner}${tagClose}`;\n }\n\n const indent = options.indent.repeat(depth);\n const hasOnlyTextChildren = children.every((child) => typeof child === \"string\");\n if (hasOnlyTextChildren) {\n const inlineText = children.map((child) => escapeText(child)).join(\"\");\n return `${indent}${tagOpen}${inlineText}${tagClose}`;\n }\n const innerIndent = options.indent.repeat(depth + 1);\n const prettyOpen = `${indent}${tagOpen}`;\n const prettyClose = `${indent}${tagClose}`;\n const inner = children\n .map((child) =>\n typeof child === \"string\"\n ? `${innerIndent}${escapeText(child)}`\n : serializeNode(child, options, depth + 1)\n )\n .join(options.newline);\n\n return `${prettyOpen}${options.newline}${inner}${options.newline}${prettyClose}`;\n}\n\nfunction serializeChild(child: XmlChild, options: Required<SerializeOptions>, depth: number): string {\n if (typeof child === \"string\") {\n return escapeText(child);\n }\n return serializeNode(child, options, depth);\n}\n\nfunction serializeAttributes(attrs?: Record<string, string>): string {\n if (!attrs) {\n return \"\";\n }\n return Object.entries(attrs)\n .map(([key, value]) => ` ${key}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nfunction escapeText(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \""\");\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/assert.ts","../src/errors.ts","../src/entities.ts","../src/parser.ts","../src/tree.ts","../src/serializer.ts","../src/object.ts"],"names":["split","DEFAULT_OPTIONS","indent","inner"],"mappings":"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","file":"index.cjs","sourcesContent":["const DEV = typeof process !== \"undefined\" ? process.env.NODE_ENV !== \"production\" : true;\n\nexport function assert(condition: boolean, message: string): void {\n if (!DEV) {\n return;\n }\n if (!condition) {\n throw new Error(`Invariant failed: ${message}`);\n }\n}\n","export class XmlSaxError extends Error {\n readonly offset: number;\n readonly line: number;\n readonly column: number;\n\n constructor(message: string, offset: number, line: number, column: number) {\n super(`${message} at ${line}:${column}`);\n this.name = \"XmlSaxError\";\n this.offset = offset;\n this.line = line;\n this.column = column;\n }\n}\n","import { XmlSaxError } from \"./errors\";\n\nconst NAMED_ENTITIES: Record<string, string> = {\n lt: \"<\",\n gt: \">\",\n amp: \"&\",\n quot: \"\\\"\",\n apos: \"'\"\n};\n\nexport function decodeEntities(input: string, onError?: (error: Error) => void): string {\n let output = \"\";\n let i = 0;\n\n while (i < input.length) {\n const ch = input[i];\n if (ch !== \"&\") {\n output += ch;\n i += 1;\n continue;\n }\n\n const semi = input.indexOf(\";\", i + 1);\n if (semi === -1) {\n const err = new XmlSaxError(\"Unterminated entity\", i, 0, 0);\n onError?.(err);\n throw err;\n }\n\n const entity = input.slice(i + 1, semi);\n let decoded: string | undefined;\n\n if (entity.startsWith(\"#x\") || entity.startsWith(\"#X\")) {\n const codePoint = Number.parseInt(entity.slice(2), 16);\n decoded = decodeCodePoint(codePoint);\n } else if (entity.startsWith(\"#\")) {\n const codePoint = Number.parseInt(entity.slice(1), 10);\n decoded = decodeCodePoint(codePoint);\n } else {\n decoded = NAMED_ENTITIES[entity];\n }\n\n if (decoded === undefined) {\n const err = new XmlSaxError(`Unknown entity: &${entity};`, i, 0, 0);\n onError?.(err);\n throw err;\n }\n\n output += decoded;\n i = semi + 1;\n }\n\n return output;\n}\n\nfunction decodeCodePoint(codePoint: number): string | undefined {\n if (!Number.isFinite(codePoint)) {\n return undefined;\n }\n if (codePoint < 0 || codePoint > 0x10ffff) {\n return undefined;\n }\n if (codePoint >= 0xd800 && codePoint <= 0xdfff) {\n return undefined;\n }\n return String.fromCodePoint(codePoint);\n}\n\nexport function splitTextForEntities(text: string): { emit: string; carry: string } {\n const lastAmp = text.lastIndexOf(\"&\");\n if (lastAmp === -1) {\n return { emit: text, carry: \"\" };\n }\n\n const nextSemi = text.indexOf(\";\", lastAmp + 1);\n if (nextSemi === -1) {\n return {\n emit: text.slice(0, lastAmp),\n carry: text.slice(lastAmp)\n };\n }\n\n return { emit: text, carry: \"\" };\n}\n","import { assert } from \"./assert\";\nimport { decodeEntities, splitTextForEntities } from \"./entities\";\nimport { XmlSaxError } from \"./errors\";\nimport type {\n CloseTag,\n Doctype,\n OpenTag,\n ParserOptions,\n ProcessingInstruction,\n XmlAttribute\n} from \"./types\";\n\ntype NamespaceMap = Record<string, string>;\n\ninterface StackEntry {\n rawName: string;\n resolved: ResolvedName;\n ns: NamespaceMap;\n}\n\ninterface RawAttribute {\n name: string;\n value: string;\n}\n\ninterface ResolvedName {\n name: string;\n prefix: string;\n local: string;\n uri: string;\n}\n\nconst DEFAULT_OPTIONS: Required<Pick<ParserOptions, \"xmlns\" | \"includeNamespaceAttributes\" | \"allowDoctype\">> = {\n xmlns: true,\n includeNamespaceAttributes: false,\n allowDoctype: true\n};\n\nconst XML_NAMESPACE_URI = \"http://www.w3.org/XML/1998/namespace\";\nconst XMLNS_NAMESPACE_URI = \"http://www.w3.org/2000/xmlns/\";\n\nexport class XmlSaxParser {\n private options: ParserOptions;\n private buffer = \"\";\n private offset = 0;\n private line = 1;\n private column = 1;\n private elementStack: StackEntry[] = [];\n private nsStack: NamespaceMap[] = [\n Object.assign(Object.create(null) as NamespaceMap, {\n xml: XML_NAMESPACE_URI,\n xmlns: XMLNS_NAMESPACE_URI\n })\n ];\n private closed = false;\n private pendingCR = false;\n\n constructor(options: ParserOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n feed(chunk: string): void {\n if (this.closed) {\n this._error(\"Parser is closed\");\n }\n if (!chunk) {\n return;\n }\n this.buffer += chunk;\n this._parseBuffer(false);\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n this._parseBuffer(true);\n this._flushPendingCR();\n if (this.buffer.length > 0) {\n this._error(\"Unexpected end of input\");\n }\n if (this.elementStack.length > 0) {\n this._error(\"Unclosed tag(s) remaining\");\n }\n this.closed = true;\n }\n\n private _parseBuffer(final: boolean): void {\n let i = 0;\n\n while (i < this.buffer.length) {\n const lt = this.buffer.indexOf(\"<\", i);\n if (lt === -1) {\n const tail = this.buffer.slice(i);\n const split = splitTextForEntities(tail);\n if (split.emit.length > 0) {\n this._emitText(split.emit, true);\n this._advance(split.emit);\n }\n this.buffer = split.carry;\n return;\n }\n\n if (lt > i) {\n const text = this.buffer.slice(i, lt);\n if (text.length > 0) {\n this._emitText(text, false);\n this._advance(text);\n }\n i = lt;\n }\n\n const consumed = this._parseMarkupFrom(lt, final);\n if (consumed === null) {\n break;\n }\n\n const markup = this.buffer.slice(lt, lt + consumed);\n this._advance(markup);\n i = lt + consumed;\n }\n\n this.buffer = this.buffer.slice(i);\n\n if (final && this.buffer.length > 0) {\n this._error(\"Unexpected end of input\");\n }\n }\n\n private _parseMarkupFrom(start: number, final: boolean): number | null {\n assert(this.buffer[start] === \"<\", \"Markup must start with '<'\");\n\n this._flushPendingCR();\n\n if (this.buffer.startsWith(\"<!--\", start)) {\n const end = this.buffer.indexOf(\"-->\", start + 4);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated comment\");\n }\n return null;\n }\n const comment = this.buffer.slice(start + 4, end);\n this.options.onComment?.(comment);\n return end + 3 - start;\n }\n\n if (this.buffer.startsWith(\"<![CDATA[\", start)) {\n const end = this.buffer.indexOf(\"]]>\", start + 9);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated CDATA section\");\n }\n return null;\n }\n const cdata = this.buffer.slice(start + 9, end);\n const normalized = this._normalizeText(cdata, false);\n if (normalized.length > 0) {\n this.options.onCdata?.(normalized);\n }\n return end + 3 - start;\n }\n\n if (this.buffer.startsWith(\"<?\", start)) {\n const end = this.buffer.indexOf(\"?>\", start + 2);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated processing instruction\");\n }\n return null;\n }\n const body = this.buffer.slice(start + 2, end).trim();\n const split = body.search(/\\s/);\n const target = split === -1 ? body : body.slice(0, split);\n const data = split === -1 ? \"\" : body.slice(split).trim();\n const pi: ProcessingInstruction = { target, body: data };\n this.options.onProcessingInstruction?.(pi);\n return end + 2 - start;\n }\n\n if (this.buffer.startsWith(\"<!DOCTYPE\", start)) {\n const end = this._findDoctypeEnd(start + 9);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated doctype declaration\");\n }\n return null;\n }\n if (!this.options.allowDoctype) {\n this._error(\"Doctype is not allowed\");\n }\n const raw = this.buffer.slice(start + 9, end).trim();\n const doctype: Doctype = { raw };\n this.options.onDoctype?.(doctype);\n return end + 1 - start;\n }\n\n if (this.buffer.startsWith(\"</\", start)) {\n const end = this.buffer.indexOf(\">\", start + 2);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated closing tag\");\n }\n return null;\n }\n const raw = this.buffer.slice(start + 2, end).trim();\n const parsed = this._parseName(raw, 0, raw.length);\n if (raw.slice(parsed.end).trim().length > 0) {\n this._error(\"Invalid closing tag\");\n }\n this._handleCloseTag(parsed.name);\n return end + 1 - start;\n }\n\n const tagEnd = this._findTagEnd(start + 1);\n if (tagEnd === -1) {\n if (final) {\n this._error(\"Unterminated start tag\");\n }\n return null;\n }\n\n const content = this.buffer.slice(start + 1, tagEnd);\n this._handleStartTag(content);\n return tagEnd + 1 - start;\n }\n\n private _handleStartTag(content: string): void {\n const trimmed = content.trim();\n const selfClosing = trimmed.endsWith(\"/\");\n const body = selfClosing ? trimmed.slice(0, -1).trim() : trimmed;\n const parsed = this._parseTagBody(body);\n\n let ns = this._currentNs();\n if (this.options.xmlns) {\n ns = Object.create(ns) as NamespaceMap;\n for (const attr of parsed.attributes) {\n if (attr.name === \"xmlns\") {\n ns[\"\"] = attr.value;\n } else if (attr.name.startsWith(\"xmlns:\")) {\n ns[attr.name.slice(6)] = attr.value;\n }\n }\n }\n\n const resolvedName = this._resolveName(parsed.name, ns);\n const attributes: Record<string, XmlAttribute> = {};\n\n for (const attr of parsed.attributes) {\n if (this.options.xmlns && !this.options.includeNamespaceAttributes) {\n if (attr.name === \"xmlns\" || attr.name.startsWith(\"xmlns:\")) {\n continue;\n }\n }\n const resolvedAttr = this._resolveAttributeName(attr.name, ns);\n attributes[resolvedAttr.name] = {\n name: resolvedAttr.name,\n value: attr.value,\n prefix: resolvedAttr.prefix,\n local: resolvedAttr.local,\n uri: resolvedAttr.uri\n };\n }\n\n const tag: OpenTag = {\n name: resolvedName.name,\n prefix: resolvedName.prefix,\n local: resolvedName.local,\n uri: resolvedName.uri,\n attributes,\n isSelfClosing: selfClosing\n };\n\n this.options.onOpenTag?.(tag);\n\n if (selfClosing) {\n const closeTag: CloseTag = {\n name: resolvedName.name,\n prefix: resolvedName.prefix,\n local: resolvedName.local,\n uri: resolvedName.uri\n };\n this.options.onCloseTag?.(closeTag);\n return;\n }\n\n this.elementStack.push({ rawName: parsed.name, resolved: resolvedName, ns });\n this.nsStack.push(ns);\n }\n\n private _handleCloseTag(rawName: string): void {\n const entry = this.elementStack.pop();\n const ns = this.nsStack.pop();\n\n if (!entry || !ns) {\n this._error(\"Closing tag without matching start tag\");\n }\n\n if (entry.rawName !== rawName) {\n this._error(`Mismatched closing tag: expected </${entry.rawName}>`);\n }\n\n const closeTag: CloseTag = {\n name: entry.resolved.name,\n prefix: entry.resolved.prefix,\n local: entry.resolved.local,\n uri: entry.resolved.uri\n };\n\n this.options.onCloseTag?.(closeTag);\n }\n\n private _parseTagBody(body: string): { name: string; attributes: RawAttribute[] } {\n let i = 0;\n const length = body.length;\n\n i = this._skipWhitespace(body, i, length);\n const parsedName = this._parseName(body, i, length);\n i = parsedName.end;\n\n const attributes: RawAttribute[] = [];\n\n while (i < length) {\n i = this._skipWhitespace(body, i, length);\n if (i >= length) {\n break;\n }\n\n const attrName = this._parseName(body, i, length);\n i = attrName.end;\n i = this._skipWhitespace(body, i, length);\n\n if (body[i] !== \"=\") {\n this._error(\"Attribute without '='\");\n }\n i += 1;\n i = this._skipWhitespace(body, i, length);\n\n const quote = body[i];\n if (quote !== \"\\\"\" && quote !== \"'\") {\n this._error(\"Attribute value must be quoted\");\n }\n i += 1;\n\n const valueEnd = body.indexOf(quote, i);\n if (valueEnd === -1) {\n this._error(\"Unterminated attribute value\");\n }\n const rawValue = body.slice(i, valueEnd);\n const normalized = rawValue.replace(/\\r\\n?/g, \"\\n\");\n const value = decodeEntities(normalized, this.options.onError);\n attributes.push({ name: attrName.name, value });\n i = valueEnd + 1;\n }\n\n return { name: parsedName.name, attributes };\n }\n\n private _emitText(text: string, allowPendingCR: boolean): void {\n const normalized = this._normalizeText(text, allowPendingCR);\n if (normalized.length === 0) {\n return;\n }\n const decoded = decodeEntities(normalized, this.options.onError);\n if (decoded.length > 0) {\n this.options.onText?.(decoded);\n }\n }\n\n private _resolveName(rawName: string, ns: NamespaceMap): ResolvedName {\n if (!this.options.xmlns) {\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return { name: rawName, prefix: \"\", local: rawName, uri: \"\" };\n }\n return {\n name: rawName,\n prefix: rawName.slice(0, split),\n local: rawName.slice(split + 1),\n uri: \"\"\n };\n }\n\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: ns[\"\"] ?? \"\"\n };\n }\n\n const prefix = rawName.slice(0, split);\n const local = rawName.slice(split + 1);\n const uri = ns[prefix];\n if (uri === undefined) {\n this._error(`Undeclared namespace prefix: ${prefix}`);\n }\n return {\n name: rawName,\n prefix,\n local,\n uri\n };\n }\n\n private _resolveAttributeName(rawName: string, ns: NamespaceMap): ResolvedName {\n if (!this.options.xmlns) {\n return this._resolveName(rawName, ns);\n }\n\n if (rawName === \"xmlns\") {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: ns.xmlns ?? XMLNS_NAMESPACE_URI\n };\n }\n\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: \"\"\n };\n }\n\n const prefix = rawName.slice(0, split);\n const local = rawName.slice(split + 1);\n const uri = ns[prefix];\n if (uri === undefined) {\n this._error(`Undeclared namespace prefix: ${prefix}`);\n }\n\n return {\n name: rawName,\n prefix,\n local,\n uri\n };\n }\n\n private _findTagEnd(start: number): number {\n let quote: string | null = null;\n for (let i = start; i < this.buffer.length; i += 1) {\n const ch = this.buffer[i];\n if (quote) {\n if (ch === quote) {\n quote = null;\n }\n continue;\n }\n if (ch === \"\\\"\" || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \">\") {\n return i;\n }\n }\n return -1;\n }\n\n private _findDoctypeEnd(start: number): number {\n let quote: string | null = null;\n let bracketDepth = 0;\n\n for (let i = start; i < this.buffer.length; i += 1) {\n const ch = this.buffer[i];\n if (quote) {\n if (ch === quote) {\n quote = null;\n }\n continue;\n }\n if (ch === \"\\\"\" || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \"[\") {\n bracketDepth += 1;\n continue;\n }\n if (ch === \"]\") {\n bracketDepth = Math.max(0, bracketDepth - 1);\n continue;\n }\n if (ch === \">\" && bracketDepth === 0) {\n return i;\n }\n }\n\n return -1;\n }\n\n private _parseName(input: string, start: number, end: number): { name: string; end: number } {\n if (start >= end) {\n this._error(\"Expected name\");\n }\n\n const first = input[start];\n if (first === undefined) {\n this._error(\"Expected name\");\n }\n if (!this._isNameStart(first)) {\n this._error(`Invalid name start: '${first}'`);\n }\n\n let i = start + 1;\n while (i < end) {\n const ch = input[i];\n if (ch === undefined || !this._isNameChar(ch)) {\n break;\n }\n i += 1;\n }\n\n return { name: input.slice(start, i), end: i };\n }\n\n private _isNameStart(ch: string): boolean {\n return /[A-Za-z_]/.test(ch);\n }\n\n private _isNameChar(ch: string): boolean {\n return /[A-Za-z0-9_:\\-.]/.test(ch);\n }\n\n private _skipWhitespace(input: string, start: number, end: number): number {\n let i = start;\n while (i < end) {\n const ch = input[i];\n if (ch === undefined || !/\\s/.test(ch)) {\n break;\n }\n i += 1;\n }\n return i;\n }\n\n private _currentNs(): NamespaceMap {\n return this.nsStack[this.nsStack.length - 1] ?? (Object.create(null) as NamespaceMap);\n }\n\n private _advance(text: string): void {\n this.offset += text.length;\n const lastNewline = text.lastIndexOf(\"\\n\");\n if (lastNewline === -1) {\n this.column += text.length;\n return;\n }\n\n const newlineCount = text.split(\"\\n\").length - 1;\n this.line += newlineCount;\n this.column = text.length - lastNewline;\n }\n\n private _normalizeText(text: string, allowPendingCR: boolean): string {\n if (!text) {\n return \"\";\n }\n\n let value = text;\n let prefix = \"\";\n\n if (this.pendingCR) {\n prefix = \"\\n\";\n if (value.startsWith(\"\\n\")) {\n value = value.slice(1);\n }\n this.pendingCR = false;\n }\n\n if (allowPendingCR && value.endsWith(\"\\r\")) {\n this.pendingCR = true;\n value = value.slice(0, -1);\n }\n\n const normalized = value.replace(/\\r\\n?/g, \"\\n\");\n return `${prefix}${normalized}`;\n }\n\n private _flushPendingCR(): void {\n if (!this.pendingCR) {\n return;\n }\n this.pendingCR = false;\n this.options.onText?.(\"\\n\");\n }\n\n private _error(message: string): never {\n const error = new XmlSaxError(message, this.offset, this.line, this.column);\n this.options.onError?.(error);\n throw error;\n }\n}\n","import { XmlSaxParser } from \"./parser\";\nimport type { ParserOptions, XmlNode } from \"./types\";\n\nexport class TreeBuilder {\n private stack: XmlNode[] = [];\n private root: XmlNode | null = null;\n\n onOpenTag = (tag: { name: string; attributes: Record<string, { value: string }> }): void => {\n const node: XmlNode = {\n name: tag.name,\n attributes: Object.fromEntries(\n Object.entries(tag.attributes).map(([key, attr]) => [key, attr.value])\n ),\n children: []\n };\n\n const parent = this.stack[this.stack.length - 1];\n if (parent) {\n parent.children?.push(node);\n } else {\n this.root = node;\n }\n\n this.stack.push(node);\n };\n\n onText = (text: string): void => {\n if (!this.stack.length) {\n return;\n }\n const node = this.stack[this.stack.length - 1];\n if (!node) {\n return;\n }\n const children = node.children ?? [];\n const last = children[children.length - 1];\n if (typeof last === \"string\") {\n children[children.length - 1] = last + text;\n } else {\n children.push(text);\n }\n node.children = children;\n };\n\n onCdata = (text: string): void => {\n this.onText(text);\n };\n\n onCloseTag = (): void => {\n this.stack.pop();\n };\n\n getRoot(): XmlNode {\n if (!this.root) {\n throw new Error(\"No root element found\");\n }\n return this.root;\n }\n}\n\nexport function parseXmlString(xml: string, options: ParserOptions = {}): XmlNode {\n const builder = new TreeBuilder();\n const parser = new XmlSaxParser({\n ...options,\n onOpenTag: builder.onOpenTag,\n onText: builder.onText,\n onCdata: builder.onCdata,\n onCloseTag: builder.onCloseTag\n });\n\n parser.feed(xml);\n parser.close();\n return builder.getRoot();\n}\n","import type { SerializeOptions, XmlChild, XmlNode } from \"./types\";\n\nconst DEFAULT_OPTIONS: Required<Pick<SerializeOptions, \"pretty\" | \"indent\" | \"newline\" | \"xmlDeclaration\">> = {\n pretty: false,\n indent: \" \",\n newline: \"\\n\",\n xmlDeclaration: false\n};\n\nexport function serializeXml(node: XmlNode, options: SerializeOptions = {}): string {\n const settings = { ...DEFAULT_OPTIONS, ...options };\n let body = serializeNode(node, settings, 0);\n if (settings.pretty && !body.endsWith(settings.newline)) {\n body = `${body}${settings.newline}`;\n }\n if (!settings.xmlDeclaration) {\n return body;\n }\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>${settings.newline}${body}`;\n}\n\nfunction serializeNode(node: XmlNode, options: Required<SerializeOptions>, depth: number): string {\n const attrs = serializeAttributes(node.attributes);\n const tagOpen = `<${node.name}${attrs}>`;\n const tagClose = `</${node.name}>`;\n\n const children = node.children ?? [];\n if (!children.length) {\n if (!options.pretty) {\n return `<${node.name}${attrs}/>`;\n }\n const indent = options.indent.repeat(depth);\n return `${indent}<${node.name}${attrs}/>`;\n }\n\n if (!options.pretty) {\n const inner = children.map((child) => serializeChild(child, options, depth + 1)).join(\"\");\n return `${tagOpen}${inner}${tagClose}`;\n }\n\n const indent = options.indent.repeat(depth);\n const hasOnlyTextChildren = children.every((child) => typeof child === \"string\");\n if (hasOnlyTextChildren) {\n const inlineText = children.map((child) => escapeText(child)).join(\"\");\n return `${indent}${tagOpen}${inlineText}${tagClose}`;\n }\n const innerIndent = options.indent.repeat(depth + 1);\n const prettyOpen = `${indent}${tagOpen}`;\n const prettyClose = `${indent}${tagClose}`;\n const inner = children\n .map((child) =>\n typeof child === \"string\"\n ? `${innerIndent}${escapeText(child)}`\n : serializeNode(child, options, depth + 1)\n )\n .join(options.newline);\n\n return `${prettyOpen}${options.newline}${inner}${options.newline}${prettyClose}`;\n}\n\nfunction serializeChild(child: XmlChild, options: Required<SerializeOptions>, depth: number): string {\n if (typeof child === \"string\") {\n return escapeText(child);\n }\n return serializeNode(child, options, depth);\n}\n\nfunction serializeAttributes(attrs?: Record<string, string>): string {\n if (!attrs) {\n return \"\";\n }\n return Object.entries(attrs)\n .map(([key, value]) => ` ${key}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nfunction escapeText(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \""\");\n}\n","import type {\n ObjectBuilderOptions,\n OpenTag,\n XmlAttribute,\n XmlNode,\n XmlObjectMap,\n XmlObjectValue\n} from \"./types\";\n\ninterface ElementState {\n name: string;\n attributes: Record<string, string>;\n textParts: string[];\n children: Record<string, XmlObjectValue | XmlObjectValue[]>;\n}\n\nconst DEFAULT_OBJECT_OPTIONS: Required<Omit<ObjectBuilderOptions, \"arrayElements\">> = {\n attributePrefix: \"@_\",\n textKey: \"#text\",\n stripNamespaces: false,\n coalesceText: true\n};\n\ntype ObjectBuilderSettings = Required<Omit<ObjectBuilderOptions, \"arrayElements\">> &\n Pick<ObjectBuilderOptions, \"arrayElements\">;\n\nexport function stripNamespace(name: string): string {\n const index = name.indexOf(\":\");\n if (index === -1) {\n return name;\n }\n return name.slice(index + 1);\n}\n\nexport function resolveName(\n value: string | Pick<OpenTag, \"name\" | \"prefix\" | \"local\" | \"uri\">\n): { name: string; localName: string; prefix: string; uri: string } {\n if (typeof value !== \"string\") {\n return {\n name: value.name,\n localName: value.local,\n prefix: value.prefix,\n uri: value.uri\n };\n }\n\n const index = value.indexOf(\":\");\n if (index === -1) {\n return { name: value, localName: value, prefix: \"\", uri: \"\" };\n }\n\n return {\n name: value,\n localName: value.slice(index + 1),\n prefix: value.slice(0, index),\n uri: \"\"\n };\n}\n\nexport function buildObject(root: XmlNode, options: ObjectBuilderOptions = {}): XmlObjectValue {\n const settings = buildSettings(options);\n return buildNode(root, settings, []);\n}\n\nexport class ObjectBuilder {\n private options: ObjectBuilderSettings;\n private stack: ElementState[] = [];\n private root: XmlObjectValue | null = null;\n private rootName: string | null = null;\n\n constructor(options: ObjectBuilderOptions = {}) {\n this.options = buildSettings(options);\n }\n\n onOpenTag = (tag: OpenTag): void => {\n const name = normalizeName(tag.name, this.options);\n const attributes = normalizeAttributes(tag.attributes, this.options);\n const state: ElementState = {\n name,\n attributes,\n textParts: [],\n children: Object.create(null) as Record<string, XmlObjectValue | XmlObjectValue[]>\n };\n\n this.rootName ??= name;\n\n this.stack.push(state);\n };\n\n onText = (text: string): void => {\n if (!text) {\n return;\n }\n const current = this.stack[this.stack.length - 1];\n if (!current) {\n return;\n }\n current.textParts.push(text);\n };\n\n onCdata = (text: string): void => {\n this.onText(text);\n };\n\n onCloseTag = (): void => {\n const state = this.stack.pop();\n if (!state) {\n return;\n }\n\n const value = finalizeElement(state, this.options);\n const parent = this.stack[this.stack.length - 1];\n\n if (!parent) {\n this.root = value;\n return;\n }\n\n const path = this.stack.map((entry) => entry.name);\n addChild(parent.children, state.name, value, this.options, path);\n };\n\n getResult(): XmlObjectValue {\n if (this.root === null) {\n throw new Error(\"No root element found\");\n }\n return this.root;\n }\n\n getRootName(): string {\n if (!this.rootName) {\n throw new Error(\"No root element found\");\n }\n return this.rootName;\n }\n}\n\nfunction buildSettings(options: ObjectBuilderOptions): ObjectBuilderSettings {\n return { ...DEFAULT_OBJECT_OPTIONS, ...options };\n}\n\nfunction buildNode(node: XmlNode, options: ObjectBuilderSettings, path: string[]): XmlObjectValue {\n const name = normalizeName(node.name, options);\n const attributes = normalizeAttributeMap(node.attributes ?? {}, options);\n const state: ElementState = {\n name,\n attributes,\n textParts: [],\n children: Object.create(null) as Record<string, XmlObjectValue | XmlObjectValue[]>\n };\n\n const children = node.children ?? [];\n for (const child of children) {\n if (typeof child === \"string\") {\n if (child) {\n state.textParts.push(child);\n }\n continue;\n }\n\n const value = buildNode(child, options, [...path, name]);\n const childName = normalizeName(child.name, options);\n addChild(state.children, childName, value, options, [...path, name]);\n }\n\n return finalizeElement(state, options);\n}\n\nfunction normalizeName(name: string, options: ObjectBuilderSettings): string {\n if (options.stripNamespaces) {\n return stripNamespace(name);\n }\n return name;\n}\n\nfunction normalizeAttributes(\n attributes: Record<string, XmlAttribute>,\n options: ObjectBuilderSettings\n): Record<string, string> {\n const result: Record<string, string> = Object.create(null) as Record<string, string>;\n for (const [key, attr] of Object.entries(attributes)) {\n const name = normalizeName(key, options);\n result[name] = attr.value;\n }\n return result;\n}\n\nfunction normalizeAttributeMap(\n attributes: Record<string, string>,\n options: ObjectBuilderSettings\n): Record<string, string> {\n const result: Record<string, string> = Object.create(null) as Record<string, string>;\n for (const [key, value] of Object.entries(attributes)) {\n const name = normalizeName(key, options);\n result[name] = value;\n }\n return result;\n}\n\nfunction addChild(\n target: Record<string, XmlObjectValue | XmlObjectValue[]>,\n name: string,\n value: XmlObjectValue,\n options: ObjectBuilderSettings,\n path: string[]\n): void {\n const forcedArray = shouldForceArray(name, path, options);\n const existing = target[name];\n\n if (existing === undefined) {\n target[name] = forcedArray ? [value] : value;\n return;\n }\n\n if (Array.isArray(existing)) {\n existing.push(value);\n return;\n }\n\n target[name] = [existing, value];\n}\n\nfunction shouldForceArray(name: string, path: string[], options: ObjectBuilderSettings): boolean {\n const rule = options.arrayElements;\n if (!rule) {\n return false;\n }\n if (rule instanceof Set) {\n return rule.has(name);\n }\n return rule(name, path);\n}\n\nfunction finalizeElement(state: ElementState, options: ObjectBuilderSettings): XmlObjectValue {\n const hasAttributes = Object.keys(state.attributes).length > 0;\n const hasChildren = Object.keys(state.children).length > 0;\n const hasText = state.textParts.length > 0;\n\n const textValue = options.coalesceText\n ? state.textParts.join(\"\")\n : state.textParts.length <= 1\n ? state.textParts[0] ?? \"\"\n : state.textParts.slice();\n\n if (!hasAttributes && !hasChildren) {\n if (!hasText) {\n return \"\";\n }\n return textValue as XmlObjectValue;\n }\n\n const result: XmlObjectMap = Object.create(null) as XmlObjectMap;\n\n for (const [key, value] of Object.entries(state.attributes)) {\n result[`${options.attributePrefix}${key}`] = value;\n }\n\n for (const [key, value] of Object.entries(state.children)) {\n result[key] = value;\n }\n\n if (hasText) {\n result[options.textKey] = textValue as XmlObjectValue;\n }\n\n return result;\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -56,6 +56,18 @@ interface SerializeOptions {
|
|
|
56
56
|
indent?: string;
|
|
57
57
|
newline?: string;
|
|
58
58
|
}
|
|
59
|
+
type ArrayElementSelector = Set<string> | ((name: string, path: string[]) => boolean);
|
|
60
|
+
interface ObjectBuilderOptions {
|
|
61
|
+
attributePrefix?: string;
|
|
62
|
+
textKey?: string;
|
|
63
|
+
stripNamespaces?: boolean;
|
|
64
|
+
arrayElements?: ArrayElementSelector;
|
|
65
|
+
coalesceText?: boolean;
|
|
66
|
+
}
|
|
67
|
+
type XmlObjectValue = string | XmlObjectMap | XmlObjectValue[];
|
|
68
|
+
interface XmlObjectMap {
|
|
69
|
+
[key: string]: XmlObjectValue;
|
|
70
|
+
}
|
|
59
71
|
|
|
60
72
|
declare class XmlSaxParser {
|
|
61
73
|
private options;
|
|
@@ -116,4 +128,26 @@ declare function parseXmlString(xml: string, options?: ParserOptions): XmlNode;
|
|
|
116
128
|
|
|
117
129
|
declare function serializeXml(node: XmlNode, options?: SerializeOptions): string;
|
|
118
130
|
|
|
119
|
-
|
|
131
|
+
declare function stripNamespace(name: string): string;
|
|
132
|
+
declare function resolveName(value: string | Pick<OpenTag, "name" | "prefix" | "local" | "uri">): {
|
|
133
|
+
name: string;
|
|
134
|
+
localName: string;
|
|
135
|
+
prefix: string;
|
|
136
|
+
uri: string;
|
|
137
|
+
};
|
|
138
|
+
declare function buildObject(root: XmlNode, options?: ObjectBuilderOptions): XmlObjectValue;
|
|
139
|
+
declare class ObjectBuilder {
|
|
140
|
+
private options;
|
|
141
|
+
private stack;
|
|
142
|
+
private root;
|
|
143
|
+
private rootName;
|
|
144
|
+
constructor(options?: ObjectBuilderOptions);
|
|
145
|
+
onOpenTag: (tag: OpenTag) => void;
|
|
146
|
+
onText: (text: string) => void;
|
|
147
|
+
onCdata: (text: string) => void;
|
|
148
|
+
onCloseTag: () => void;
|
|
149
|
+
getResult(): XmlObjectValue;
|
|
150
|
+
getRootName(): string;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export { type ArrayElementSelector, type CloseTag, type Doctype, ObjectBuilder, type ObjectBuilderOptions, type OpenTag, type ParserOptions, type ProcessingInstruction, type SerializeOptions, TreeBuilder, type XmlAttribute, type XmlChild, type XmlNode, type XmlObjectMap, type XmlObjectValue, type XmlPosition, XmlSaxError, XmlSaxParser, buildObject, parseXmlString, resolveName, serializeXml, stripNamespace };
|
package/dist/index.d.ts
CHANGED
|
@@ -56,6 +56,18 @@ interface SerializeOptions {
|
|
|
56
56
|
indent?: string;
|
|
57
57
|
newline?: string;
|
|
58
58
|
}
|
|
59
|
+
type ArrayElementSelector = Set<string> | ((name: string, path: string[]) => boolean);
|
|
60
|
+
interface ObjectBuilderOptions {
|
|
61
|
+
attributePrefix?: string;
|
|
62
|
+
textKey?: string;
|
|
63
|
+
stripNamespaces?: boolean;
|
|
64
|
+
arrayElements?: ArrayElementSelector;
|
|
65
|
+
coalesceText?: boolean;
|
|
66
|
+
}
|
|
67
|
+
type XmlObjectValue = string | XmlObjectMap | XmlObjectValue[];
|
|
68
|
+
interface XmlObjectMap {
|
|
69
|
+
[key: string]: XmlObjectValue;
|
|
70
|
+
}
|
|
59
71
|
|
|
60
72
|
declare class XmlSaxParser {
|
|
61
73
|
private options;
|
|
@@ -116,4 +128,26 @@ declare function parseXmlString(xml: string, options?: ParserOptions): XmlNode;
|
|
|
116
128
|
|
|
117
129
|
declare function serializeXml(node: XmlNode, options?: SerializeOptions): string;
|
|
118
130
|
|
|
119
|
-
|
|
131
|
+
declare function stripNamespace(name: string): string;
|
|
132
|
+
declare function resolveName(value: string | Pick<OpenTag, "name" | "prefix" | "local" | "uri">): {
|
|
133
|
+
name: string;
|
|
134
|
+
localName: string;
|
|
135
|
+
prefix: string;
|
|
136
|
+
uri: string;
|
|
137
|
+
};
|
|
138
|
+
declare function buildObject(root: XmlNode, options?: ObjectBuilderOptions): XmlObjectValue;
|
|
139
|
+
declare class ObjectBuilder {
|
|
140
|
+
private options;
|
|
141
|
+
private stack;
|
|
142
|
+
private root;
|
|
143
|
+
private rootName;
|
|
144
|
+
constructor(options?: ObjectBuilderOptions);
|
|
145
|
+
onOpenTag: (tag: OpenTag) => void;
|
|
146
|
+
onText: (text: string) => void;
|
|
147
|
+
onCdata: (text: string) => void;
|
|
148
|
+
onCloseTag: () => void;
|
|
149
|
+
getResult(): XmlObjectValue;
|
|
150
|
+
getRootName(): string;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export { type ArrayElementSelector, type CloseTag, type Doctype, ObjectBuilder, type ObjectBuilderOptions, type OpenTag, type ParserOptions, type ProcessingInstruction, type SerializeOptions, TreeBuilder, type XmlAttribute, type XmlChild, type XmlNode, type XmlObjectMap, type XmlObjectValue, type XmlPosition, XmlSaxError, XmlSaxParser, buildObject, parseXmlString, resolveName, serializeXml, stripNamespace };
|
package/dist/index.js
CHANGED
|
@@ -663,7 +663,10 @@ var DEFAULT_OPTIONS2 = {
|
|
|
663
663
|
};
|
|
664
664
|
function serializeXml(node, options = {}) {
|
|
665
665
|
const settings = { ...DEFAULT_OPTIONS2, ...options };
|
|
666
|
-
|
|
666
|
+
let body = serializeNode(node, settings, 0);
|
|
667
|
+
if (settings.pretty && !body.endsWith(settings.newline)) {
|
|
668
|
+
body = `${body}${settings.newline}`;
|
|
669
|
+
}
|
|
667
670
|
if (!settings.xmlDeclaration) {
|
|
668
671
|
return body;
|
|
669
672
|
}
|
|
@@ -718,6 +721,197 @@ function escapeAttribute(value) {
|
|
|
718
721
|
return escapeText(value).replace(/"/g, """);
|
|
719
722
|
}
|
|
720
723
|
|
|
721
|
-
|
|
724
|
+
// src/object.ts
|
|
725
|
+
var DEFAULT_OBJECT_OPTIONS = {
|
|
726
|
+
attributePrefix: "@_",
|
|
727
|
+
textKey: "#text",
|
|
728
|
+
stripNamespaces: false,
|
|
729
|
+
coalesceText: true
|
|
730
|
+
};
|
|
731
|
+
function stripNamespace(name) {
|
|
732
|
+
const index = name.indexOf(":");
|
|
733
|
+
if (index === -1) {
|
|
734
|
+
return name;
|
|
735
|
+
}
|
|
736
|
+
return name.slice(index + 1);
|
|
737
|
+
}
|
|
738
|
+
function resolveName(value) {
|
|
739
|
+
if (typeof value !== "string") {
|
|
740
|
+
return {
|
|
741
|
+
name: value.name,
|
|
742
|
+
localName: value.local,
|
|
743
|
+
prefix: value.prefix,
|
|
744
|
+
uri: value.uri
|
|
745
|
+
};
|
|
746
|
+
}
|
|
747
|
+
const index = value.indexOf(":");
|
|
748
|
+
if (index === -1) {
|
|
749
|
+
return { name: value, localName: value, prefix: "", uri: "" };
|
|
750
|
+
}
|
|
751
|
+
return {
|
|
752
|
+
name: value,
|
|
753
|
+
localName: value.slice(index + 1),
|
|
754
|
+
prefix: value.slice(0, index),
|
|
755
|
+
uri: ""
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
function buildObject(root, options = {}) {
|
|
759
|
+
const settings = buildSettings(options);
|
|
760
|
+
return buildNode(root, settings, []);
|
|
761
|
+
}
|
|
762
|
+
var ObjectBuilder = class {
|
|
763
|
+
constructor(options = {}) {
|
|
764
|
+
this.stack = [];
|
|
765
|
+
this.root = null;
|
|
766
|
+
this.rootName = null;
|
|
767
|
+
this.onOpenTag = (tag) => {
|
|
768
|
+
const name = normalizeName(tag.name, this.options);
|
|
769
|
+
const attributes = normalizeAttributes(tag.attributes, this.options);
|
|
770
|
+
const state = {
|
|
771
|
+
name,
|
|
772
|
+
attributes,
|
|
773
|
+
textParts: [],
|
|
774
|
+
children: /* @__PURE__ */ Object.create(null)
|
|
775
|
+
};
|
|
776
|
+
this.rootName ?? (this.rootName = name);
|
|
777
|
+
this.stack.push(state);
|
|
778
|
+
};
|
|
779
|
+
this.onText = (text) => {
|
|
780
|
+
if (!text) {
|
|
781
|
+
return;
|
|
782
|
+
}
|
|
783
|
+
const current = this.stack[this.stack.length - 1];
|
|
784
|
+
if (!current) {
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
current.textParts.push(text);
|
|
788
|
+
};
|
|
789
|
+
this.onCdata = (text) => {
|
|
790
|
+
this.onText(text);
|
|
791
|
+
};
|
|
792
|
+
this.onCloseTag = () => {
|
|
793
|
+
const state = this.stack.pop();
|
|
794
|
+
if (!state) {
|
|
795
|
+
return;
|
|
796
|
+
}
|
|
797
|
+
const value = finalizeElement(state, this.options);
|
|
798
|
+
const parent = this.stack[this.stack.length - 1];
|
|
799
|
+
if (!parent) {
|
|
800
|
+
this.root = value;
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
const path = this.stack.map((entry) => entry.name);
|
|
804
|
+
addChild(parent.children, state.name, value, this.options, path);
|
|
805
|
+
};
|
|
806
|
+
this.options = buildSettings(options);
|
|
807
|
+
}
|
|
808
|
+
getResult() {
|
|
809
|
+
if (this.root === null) {
|
|
810
|
+
throw new Error("No root element found");
|
|
811
|
+
}
|
|
812
|
+
return this.root;
|
|
813
|
+
}
|
|
814
|
+
getRootName() {
|
|
815
|
+
if (!this.rootName) {
|
|
816
|
+
throw new Error("No root element found");
|
|
817
|
+
}
|
|
818
|
+
return this.rootName;
|
|
819
|
+
}
|
|
820
|
+
};
|
|
821
|
+
function buildSettings(options) {
|
|
822
|
+
return { ...DEFAULT_OBJECT_OPTIONS, ...options };
|
|
823
|
+
}
|
|
824
|
+
function buildNode(node, options, path) {
|
|
825
|
+
const name = normalizeName(node.name, options);
|
|
826
|
+
const attributes = normalizeAttributeMap(node.attributes ?? {}, options);
|
|
827
|
+
const state = {
|
|
828
|
+
attributes,
|
|
829
|
+
textParts: [],
|
|
830
|
+
children: /* @__PURE__ */ Object.create(null)
|
|
831
|
+
};
|
|
832
|
+
const children = node.children ?? [];
|
|
833
|
+
for (const child of children) {
|
|
834
|
+
if (typeof child === "string") {
|
|
835
|
+
if (child) {
|
|
836
|
+
state.textParts.push(child);
|
|
837
|
+
}
|
|
838
|
+
continue;
|
|
839
|
+
}
|
|
840
|
+
const value = buildNode(child, options, [...path, name]);
|
|
841
|
+
const childName = normalizeName(child.name, options);
|
|
842
|
+
addChild(state.children, childName, value, options, [...path, name]);
|
|
843
|
+
}
|
|
844
|
+
return finalizeElement(state, options);
|
|
845
|
+
}
|
|
846
|
+
function normalizeName(name, options) {
|
|
847
|
+
if (options.stripNamespaces) {
|
|
848
|
+
return stripNamespace(name);
|
|
849
|
+
}
|
|
850
|
+
return name;
|
|
851
|
+
}
|
|
852
|
+
function normalizeAttributes(attributes, options) {
|
|
853
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
854
|
+
for (const [key, attr] of Object.entries(attributes)) {
|
|
855
|
+
const name = normalizeName(key, options);
|
|
856
|
+
result[name] = attr.value;
|
|
857
|
+
}
|
|
858
|
+
return result;
|
|
859
|
+
}
|
|
860
|
+
function normalizeAttributeMap(attributes, options) {
|
|
861
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
862
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
863
|
+
const name = normalizeName(key, options);
|
|
864
|
+
result[name] = value;
|
|
865
|
+
}
|
|
866
|
+
return result;
|
|
867
|
+
}
|
|
868
|
+
function addChild(target, name, value, options, path) {
|
|
869
|
+
const forcedArray = shouldForceArray(name, path, options);
|
|
870
|
+
const existing = target[name];
|
|
871
|
+
if (existing === void 0) {
|
|
872
|
+
target[name] = forcedArray ? [value] : value;
|
|
873
|
+
return;
|
|
874
|
+
}
|
|
875
|
+
if (Array.isArray(existing)) {
|
|
876
|
+
existing.push(value);
|
|
877
|
+
return;
|
|
878
|
+
}
|
|
879
|
+
target[name] = [existing, value];
|
|
880
|
+
}
|
|
881
|
+
function shouldForceArray(name, path, options) {
|
|
882
|
+
const rule = options.arrayElements;
|
|
883
|
+
if (!rule) {
|
|
884
|
+
return false;
|
|
885
|
+
}
|
|
886
|
+
if (rule instanceof Set) {
|
|
887
|
+
return rule.has(name);
|
|
888
|
+
}
|
|
889
|
+
return rule(name, path);
|
|
890
|
+
}
|
|
891
|
+
function finalizeElement(state, options) {
|
|
892
|
+
const hasAttributes = Object.keys(state.attributes).length > 0;
|
|
893
|
+
const hasChildren = Object.keys(state.children).length > 0;
|
|
894
|
+
const hasText = state.textParts.length > 0;
|
|
895
|
+
const textValue = options.coalesceText ? state.textParts.join("") : state.textParts.length <= 1 ? state.textParts[0] ?? "" : state.textParts.slice();
|
|
896
|
+
if (!hasAttributes && !hasChildren) {
|
|
897
|
+
if (!hasText) {
|
|
898
|
+
return "";
|
|
899
|
+
}
|
|
900
|
+
return textValue;
|
|
901
|
+
}
|
|
902
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
903
|
+
for (const [key, value] of Object.entries(state.attributes)) {
|
|
904
|
+
result[`${options.attributePrefix}${key}`] = value;
|
|
905
|
+
}
|
|
906
|
+
for (const [key, value] of Object.entries(state.children)) {
|
|
907
|
+
result[key] = value;
|
|
908
|
+
}
|
|
909
|
+
if (hasText) {
|
|
910
|
+
result[options.textKey] = textValue;
|
|
911
|
+
}
|
|
912
|
+
return result;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
export { ObjectBuilder, TreeBuilder, XmlSaxError, XmlSaxParser, buildObject, parseXmlString, resolveName, serializeXml, stripNamespace };
|
|
722
916
|
//# sourceMappingURL=index.js.map
|
|
723
917
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/assert.ts","../src/errors.ts","../src/entities.ts","../src/parser.ts","../src/tree.ts","../src/serializer.ts"],"names":["split","DEFAULT_OPTIONS","indent","inner"],"mappings":";AAAA,IAAM,MAAM,OAAO,OAAA,KAAY,cAAc,OAAA,CAAQ,GAAA,CAAI,aAAa,YAAA,GAAe,IAAA;AAE9E,SAAS,MAAA,CAAO,WAAoB,OAAA,EAAuB;AAChE,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,OAAO,CAAA,CAAE,CAAA;AAAA,EAChD;AACF;;;ACTO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EAKrC,WAAA,CAAY,OAAA,EAAiB,MAAA,EAAgB,IAAA,EAAc,MAAA,EAAgB;AACzE,IAAA,KAAA,CAAM,GAAG,OAAO,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;;;ACVA,IAAM,cAAA,GAAyC;AAAA,EAC7C,EAAA,EAAI,GAAA;AAAA,EACJ,EAAA,EAAI,GAAA;AAAA,EACJ,GAAA,EAAK,GAAA;AAAA,EACL,IAAA,EAAM,GAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEO,SAAS,cAAA,CAAe,OAAe,OAAA,EAA0C;AACtF,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,MAAA,IAAU,EAAA;AACV,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAC,CAAA;AACrC,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,MAAM,MAAM,IAAI,WAAA,CAAY,qBAAA,EAAuB,CAAA,EAAG,GAAG,CAAC,CAAA;AAC1D,MAAA,OAAA,GAAU,GAAG,CAAA;AACb,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,GAAI,GAAG,IAAI,CAAA;AACtC,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI,OAAO,UAAA,CAAW,IAAI,KAAK,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,EAAG;AACtD,MAAA,MAAM,YAAY,MAAA,CAAO,QAAA,CAAS,OAAO,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACrD,MAAA,OAAA,GAAU,gBAAgB,SAAS,CAAA;AAAA,IACrC,CAAA,MAAA,IAAW,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,EAAG;AACjC,MAAA,MAAM,YAAY,MAAA,CAAO,QAAA,CAAS,OAAO,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACrD,MAAA,OAAA,GAAU,gBAAgB,SAAS,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,eAAe,MAAM,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,CAAA,iBAAA,EAAoB,MAAM,CAAA,CAAA,CAAA,EAAK,CAAA,EAAG,GAAG,CAAC,CAAA;AAClE,MAAA,OAAA,GAAU,GAAG,CAAA;AACb,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,MAAA,IAAU,OAAA;AACV,IAAA,CAAA,GAAI,IAAA,GAAO,CAAA;AAAA,EACb;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAgB,SAAA,EAAuC;AAC9D,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAA,GAAY,CAAA,IAAK,SAAA,GAAY,OAAA,EAAU;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAA,IAAa,KAAA,IAAU,SAAA,IAAa,KAAA,EAAQ;AAC9C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,cAAc,SAAS,CAAA;AACvC;AAEO,SAAS,qBAAqB,IAAA,EAA+C;AAClF,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AACpC,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,EAAA,EAAG;AAAA,EACjC;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,UAAU,CAAC,CAAA;AAC9C,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA;AAAA,MAC3B,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAO;AAAA,KAC3B;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,EAAA,EAAG;AACjC;;;ACnDA,IAAM,eAAA,GAA0G;AAAA,EAC9G,KAAA,EAAO,IAAA;AAAA,EACP,0BAAA,EAA4B,KAAA;AAAA,EAC5B,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,iBAAA,GAAoB,sCAAA;AAC1B,IAAM,mBAAA,GAAsB,+BAAA;AAErB,IAAM,eAAN,MAAmB;AAAA,EAgBxB,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AAdzC,IAAA,IAAA,CAAQ,MAAA,GAAS,EAAA;AACjB,IAAA,IAAA,CAAQ,MAAA,GAAS,CAAA;AACjB,IAAA,IAAA,CAAQ,IAAA,GAAO,CAAA;AACf,IAAA,IAAA,CAAQ,MAAA,GAAS,CAAA;AACjB,IAAA,IAAA,CAAQ,eAA6B,EAAC;AACtC,IAAA,IAAA,CAAQ,OAAA,GAA0B;AAAA,MAChC,MAAA,CAAO,MAAA,iBAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAmB;AAAA,QACjD,GAAA,EAAK,iBAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACR;AAAA,KACH;AACA,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AACjB,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AAGlB,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAAA,EAClD;AAAA,EAEA,KAAK,KAAA,EAAqB;AACxB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,OAAO,kBAAkB,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAA,IAAU,KAAA;AACf,IAAA,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA,EACzB;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,aAAa,IAAI,CAAA;AACtB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC1B,MAAA,IAAA,CAAK,OAAO,yBAAyB,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,OAAO,2BAA2B,CAAA;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AAAA,EAEQ,aAAa,KAAA,EAAsB;AACzC,IAAA,IAAI,CAAA,GAAI,CAAA;AAER,IAAA,OAAO,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AAC7B,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AACrC,MAAA,IAAI,OAAO,EAAA,EAAI;AACb,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAChC,QAAA,MAAM,KAAA,GAAQ,qBAAqB,IAAI,CAAA;AACvC,QAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACzB,UAAA,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAC/B,UAAA,IAAA,CAAK,QAAA,CAAS,MAAM,IAAI,CAAA;AAAA,QAC1B;AACA,QAAA,IAAA,CAAK,SAAS,KAAA,CAAM,KAAA;AACpB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,CAAA,EAAG;AACV,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAG,EAAE,CAAA;AACpC,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAA,IAAA,CAAK,SAAA,CAAU,MAAM,KAAK,CAAA;AAC1B,UAAA,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,QACpB;AACA,QAAA,CAAA,GAAI,EAAA;AAAA,MACN;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,EAAA,EAAI,KAAK,CAAA;AAChD,MAAA,IAAI,aAAa,IAAA,EAAM;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAA,EAAI,KAAK,QAAQ,CAAA;AAClD,MAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AACpB,MAAA,CAAA,GAAI,EAAA,GAAK,QAAA;AAAA,IACX;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAEjC,IAAA,IAAI,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,OAAO,yBAAyB,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,gBAAA,CAAiB,OAAe,KAAA,EAA+B;AACrE,IAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,KAAM,KAAK,4BAA4B,CAAA;AAE/D,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA,EAAG;AACzC,MAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,QAAQ,CAAC,CAAA;AAChD,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAA,CAAK,OAAO,sBAAsB,CAAA;AAAA,QACpC;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,GAAG,GAAG,CAAA;AAChD,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,OAAO,CAAA;AAChC,MAAA,OAAO,MAAM,CAAA,GAAI,KAAA;AAAA,IACnB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,WAAA,EAAa,KAAK,CAAA,EAAG;AAC9C,MAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,QAAQ,CAAC,CAAA;AAChD,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAA,CAAK,OAAO,4BAA4B,CAAA;AAAA,QAC1C;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,GAAG,GAAG,CAAA;AAC9C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO,KAAK,CAAA;AACnD,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,UAAU,CAAA;AAAA,MACnC;AACA,MAAA,OAAO,MAAM,CAAA,GAAI,KAAA;AAAA,IACnB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA,EAAG;AACvC,MAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAC,CAAA;AAC/C,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAA,CAAK,OAAO,qCAAqC,CAAA;AAAA,QACnD;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACpD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC9B,MAAA,MAAM,SAAS,KAAA,KAAU,EAAA,GAAK,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,KAAK,CAAA;AACxD,MAAA,MAAM,IAAA,GAAO,UAAU,EAAA,GAAK,EAAA,GAAK,KAAK,KAAA,CAAM,KAAK,EAAE,IAAA,EAAK;AACxD,MAAA,MAAM,EAAA,GAA4B,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AACvD,MAAA,IAAA,CAAK,OAAA,CAAQ,0BAA0B,EAAE,CAAA;AACzC,MAAA,OAAO,MAAM,CAAA,GAAI,KAAA;AAAA,IACnB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,WAAA,EAAa,KAAK,CAAA,EAAG;AAC9C,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,eAAA,CAAgB,KAAA,GAAQ,CAAC,CAAA;AAC1C,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAA,CAAK,OAAO,kCAAkC,CAAA;AAAA,QAChD;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc;AAC9B,QAAA,IAAA,CAAK,OAAO,wBAAwB,CAAA;AAAA,MACtC;AACA,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACnD,MAAA,MAAM,OAAA,GAAmB,EAAE,GAAA,EAAI;AAC/B,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,OAAO,CAAA;AAChC,MAAA,OAAO,MAAM,CAAA,GAAI,KAAA;AAAA,IACnB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA,EAAG;AACvC,MAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAC,CAAA;AAC9C,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAA,CAAK,OAAO,0BAA0B,CAAA;AAAA,QACxC;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACnD,MAAA,MAAM,SAAS,IAAA,CAAK,UAAA,CAAW,GAAA,EAAK,CAAA,EAAG,IAAI,MAAM,CAAA;AACjD,MAAA,IAAI,GAAA,CAAI,MAAM,MAAA,CAAO,GAAG,EAAE,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAC3C,QAAA,IAAA,CAAK,OAAO,qBAAqB,CAAA;AAAA,MACnC;AACA,MAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,IAAI,CAAA;AAChC,MAAA,OAAO,MAAM,CAAA,GAAI,KAAA;AAAA,IACnB;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,KAAA,GAAQ,CAAC,CAAA;AACzC,IAAA,IAAI,WAAW,EAAA,EAAI;AACjB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAA,CAAK,OAAO,wBAAwB,CAAA;AAAA,MACtC;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,GAAG,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAC5B,IAAA,OAAO,SAAS,CAAA,GAAI,KAAA;AAAA,EACtB;AAAA,EAEQ,gBAAgB,OAAA,EAAuB;AAC7C,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,cAAc,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,MAAK,GAAI,OAAA;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAEtC,IAAA,IAAI,EAAA,GAAK,KAAK,UAAA,EAAW;AACzB,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,EAAA,GAAK,MAAA,CAAO,OAAO,EAAE,CAAA;AACrB,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,UAAA,EAAY;AACpC,QAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,UAAA,EAAA,CAAG,EAAE,IAAI,IAAA,CAAK,KAAA;AAAA,QAChB,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzC,UAAA,EAAA,CAAG,KAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,IAAI,IAAA,CAAK,KAAA;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,MAAM,EAAE,CAAA;AACtD,IAAA,MAAM,aAA2C,EAAC;AAElD,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,UAAA,EAAY;AACpC,MAAA,IAAI,KAAK,OAAA,CAAQ,KAAA,IAAS,CAAC,IAAA,CAAK,QAAQ,0BAAA,EAA4B;AAClE,QAAA,IAAI,KAAK,IAAA,KAAS,OAAA,IAAW,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3D,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,MAAM,EAAE,CAAA;AAC7D,MAAA,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA,GAAI;AAAA,QAC9B,MAAM,YAAA,CAAa,IAAA;AAAA,QACnB,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAQ,YAAA,CAAa,MAAA;AAAA,QACrB,OAAO,YAAA,CAAa,KAAA;AAAA,QACpB,KAAK,YAAA,CAAa;AAAA,OACpB;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAe;AAAA,MACnB,MAAM,YAAA,CAAa,IAAA;AAAA,MACnB,QAAQ,YAAA,CAAa,MAAA;AAAA,MACrB,OAAO,YAAA,CAAa,KAAA;AAAA,MACpB,KAAK,YAAA,CAAa,GAAA;AAAA,MAClB,UAAA;AAAA,MACA,aAAA,EAAe;AAAA,KACjB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,GAAG,CAAA;AAE5B,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,MAAM,YAAA,CAAa,IAAA;AAAA,QACnB,QAAQ,YAAA,CAAa,MAAA;AAAA,QACrB,OAAO,YAAA,CAAa,KAAA;AAAA,QACpB,KAAK,YAAA,CAAa;AAAA,OACpB;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,aAAa,QAAQ,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,EAAE,OAAA,EAAS,OAAO,IAAA,EAAM,QAAA,EAAU,YAAA,EAAc,EAAA,EAAI,CAAA;AAC3E,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,EACtB;AAAA,EAEQ,gBAAgB,OAAA,EAAuB;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,GAAA,EAAI;AACpC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI;AAE5B,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,EAAA,EAAI;AACjB,MAAA,IAAA,CAAK,OAAO,wCAAwC,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,KAAA,CAAM,YAAY,OAAA,EAAS;AAC7B,MAAA,IAAA,CAAK,MAAA,CAAO,CAAA,mCAAA,EAAsC,KAAA,CAAM,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,IAAA,EAAM,MAAM,QAAA,CAAS,IAAA;AAAA,MACrB,MAAA,EAAQ,MAAM,QAAA,CAAS,MAAA;AAAA,MACvB,KAAA,EAAO,MAAM,QAAA,CAAS,KAAA;AAAA,MACtB,GAAA,EAAK,MAAM,QAAA,CAAS;AAAA,KACtB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,aAAa,QAAQ,CAAA;AAAA,EACpC;AAAA,EAEQ,cAAc,IAAA,EAA4D;AAChF,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,IAAA,CAAA,GAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA;AACxC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,GAAG,MAAM,CAAA;AAClD,IAAA,CAAA,GAAI,UAAA,CAAW,GAAA;AAEf,IAAA,MAAM,aAA6B,EAAC;AAEpC,IAAA,OAAO,IAAI,MAAA,EAAQ;AACjB,MAAA,CAAA,GAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA;AACxC,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,GAAG,MAAM,CAAA;AAChD,MAAA,CAAA,GAAI,QAAA,CAAS,GAAA;AACb,MAAA,CAAA,GAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA;AAExC,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AACnB,QAAA,IAAA,CAAK,OAAO,uBAAuB,CAAA;AAAA,MACrC;AACA,MAAA,CAAA,IAAK,CAAA;AACL,MAAA,CAAA,GAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA;AAExC,MAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,MAAA,IAAI,KAAA,KAAU,GAAA,IAAQ,KAAA,KAAU,GAAA,EAAK;AACnC,QAAA,IAAA,CAAK,OAAO,gCAAgC,CAAA;AAAA,MAC9C;AACA,MAAA,CAAA,IAAK,CAAA;AAEL,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAA;AACtC,MAAA,IAAI,aAAa,EAAA,EAAI;AACnB,QAAA,IAAA,CAAK,OAAO,8BAA8B,CAAA;AAAA,MAC5C;AACA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AACvC,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA;AAClD,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,UAAA,EAAY,IAAA,CAAK,QAAQ,OAAO,CAAA;AAC7D,MAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAC9C,MAAA,CAAA,GAAI,QAAA,GAAW,CAAA;AAAA,IACjB;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,CAAW,IAAA,EAAM,UAAA,EAAW;AAAA,EAC7C;AAAA,EAEQ,SAAA,CAAU,MAAc,cAAA,EAA+B;AAC7D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,cAAc,CAAA;AAC3D,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,UAAA,EAAY,IAAA,CAAK,QAAQ,OAAO,CAAA;AAC/D,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,OAAO,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,YAAA,CAAa,SAAiB,EAAA,EAAgC;AACpE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AACvB,MAAA,MAAMA,MAAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACjC,MAAA,IAAIA,WAAU,EAAA,EAAI;AAChB,QAAA,OAAO,EAAE,MAAM,OAAA,EAAS,MAAA,EAAQ,IAAI,KAAA,EAAO,OAAA,EAAS,KAAK,EAAA,EAAG;AAAA,MAC9D;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAGA,MAAK,CAAA;AAAA,QAC9B,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAMA,MAAAA,GAAQ,CAAC,CAAA;AAAA,QAC9B,GAAA,EAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ,EAAA;AAAA,QACR,KAAA,EAAO,OAAA;AAAA,QACP,GAAA,EAAK,EAAA,CAAG,EAAE,CAAA,IAAK;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,GAAG,MAAM,CAAA;AACrB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA,IAAA,CAAK,MAAA,CAAO,CAAA,6BAAA,EAAgC,MAAM,CAAA,CAAE,CAAA;AAAA,IACtD;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,MAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,qBAAA,CAAsB,SAAiB,EAAA,EAAgC;AAC7E,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AACvB,MAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,EAAE,CAAA;AAAA,IACtC;AAEA,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ,EAAA;AAAA,QACR,KAAA,EAAO,OAAA;AAAA,QACP,GAAA,EAAK,GAAG,KAAA,IAAS;AAAA,OACnB;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ,EAAA;AAAA,QACR,KAAA,EAAO,OAAA;AAAA,QACP,GAAA,EAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,GAAG,MAAM,CAAA;AACrB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA,IAAA,CAAK,MAAA,CAAO,CAAA,6BAAA,EAAgC,MAAM,CAAA,CAAE,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,MAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,YAAY,KAAA,EAAuB;AACzC,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,KAAA,IAAS,IAAI,KAAA,EAAO,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AAClD,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AACxB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,KAAA,GAAQ,IAAA;AAAA,QACV;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,EAAA,KAAO,GAAA,IAAQ,EAAA,KAAO,GAAA,EAAK;AAC7B,QAAA,KAAA,GAAQ,EAAA;AACR,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEQ,gBAAgB,KAAA,EAAuB;AAC7C,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,IAAA,KAAA,IAAS,IAAI,KAAA,EAAO,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AAClD,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AACxB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,KAAA,GAAQ,IAAA;AAAA,QACV;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,EAAA,KAAO,GAAA,IAAQ,EAAA,KAAO,GAAA,EAAK;AAC7B,QAAA,KAAA,GAAQ,EAAA;AACR,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,YAAA,IAAgB,CAAA;AAChB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,GAAe,CAAC,CAAA;AAC3C,QAAA;AAAA,MACF;AACA,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,YAAA,KAAiB,CAAA,EAAG;AACpC,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEQ,UAAA,CAAW,KAAA,EAAe,KAAA,EAAe,GAAA,EAA4C;AAC3F,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,IAAA,CAAK,OAAO,eAAe,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,OAAO,eAAe,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,MAAA,CAAO,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,IAAI,KAAA,GAAQ,CAAA;AAChB,IAAA,OAAO,IAAI,GAAA,EAAK;AACd,MAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,MAAA,IAAI,OAAO,MAAA,IAAa,CAAC,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA,EAAG;AAC7C,QAAA;AAAA,MACF;AACA,MAAA,CAAA,IAAK,CAAA;AAAA,IACP;AAEA,IAAA,OAAO,EAAE,MAAM,KAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,EAAG,KAAK,CAAA,EAAE;AAAA,EAC/C;AAAA,EAEQ,aAAa,EAAA,EAAqB;AACxC,IAAA,OAAO,WAAA,CAAY,KAAK,EAAE,CAAA;AAAA,EAC5B;AAAA,EAEQ,YAAY,EAAA,EAAqB;AACvC,IAAA,OAAO,kBAAA,CAAmB,KAAK,EAAE,CAAA;AAAA,EACnC;AAAA,EAEQ,eAAA,CAAgB,KAAA,EAAe,KAAA,EAAe,GAAA,EAAqB;AACzE,IAAA,IAAI,CAAA,GAAI,KAAA;AACR,IAAA,OAAO,IAAI,GAAA,EAAK;AACd,MAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,MAAA,IAAI,OAAO,MAAA,IAAa,CAAC,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG;AACtC,QAAA;AAAA,MACF;AACA,MAAA,CAAA,IAAK,CAAA;AAAA,IACP;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEQ,UAAA,GAA2B;AACjC,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAC,CAAA,oBAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,EACrE;AAAA,EAEQ,SAAS,IAAA,EAAoB;AACnC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACzC,IAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,MAAA,GAAS,CAAA;AAC/C,IAAA,IAAA,CAAK,IAAA,IAAQ,YAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,GAAS,WAAA;AAAA,EAC9B;AAAA,EAEQ,cAAA,CAAe,MAAc,cAAA,EAAiC;AACpE,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AAC1B,QAAA,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,MACvB;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB;AAEA,IAAA,IAAI,cAAA,IAAkB,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1C,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IAC3B;AAEA,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA;AAC/C,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,UAAU,CAAA,CAAA;AAAA,EAC/B;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAI,CAAA;AAAA,EAC5B;AAAA,EAEQ,OAAO,OAAA,EAAwB;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,CAAY,OAAA,EAAS,KAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAC1E,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,KAAK,CAAA;AAC5B,IAAA,MAAM,KAAA;AAAA,EACR;AACF;;;ACplBO,IAAM,cAAN,MAAkB;AAAA,EAAlB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,QAAmB,EAAC;AAC5B,IAAA,IAAA,CAAQ,IAAA,GAAuB,IAAA;AAE/B,IAAA,IAAA,CAAA,SAAA,GAAY,CAAC,GAAA,KAA+E;AAC1F,MAAA,MAAM,IAAA,GAAgB;AAAA,QACpB,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,YAAY,MAAA,CAAO,WAAA;AAAA,UACjB,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,UAAU,EAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,IAAI,CAAA,KAAM,CAAC,GAAA,EAAK,IAAA,CAAK,KAAK,CAAC;AAAA,SACvE;AAAA,QACA,UAAU;AAAC,OACb;AAEA,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAC/C,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,QAAA,EAAU,KAAK,IAAI,CAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,MACd;AAEA,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACtB,CAAA;AAEA,IAAA,IAAA,CAAA,MAAA,GAAS,CAAC,IAAA,KAAuB;AAC/B,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ;AACtB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AACnC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACzC,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA,GAAO,IAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MACpB;AACA,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IAClB,CAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAU,CAAC,IAAA,KAAuB;AAChC,MAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,IAAA,CAAA,UAAA,GAAa,MAAY;AACvB,MAAA,IAAA,CAAK,MAAM,GAAA,EAAI;AAAA,IACjB,CAAA;AAAA,EAAA;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AACF;AAEO,SAAS,cAAA,CAAe,GAAA,EAAa,OAAA,GAAyB,EAAC,EAAY;AAChF,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa;AAAA,IAC9B,GAAG,OAAA;AAAA,IACH,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,YAAY,OAAA,CAAQ;AAAA,GACrB,CAAA;AAED,EAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AACf,EAAA,MAAA,CAAO,KAAA,EAAM;AACb,EAAA,OAAO,QAAQ,OAAA,EAAQ;AACzB;;;ACvEA,IAAMC,gBAAAA,GAAwG;AAAA,EAC5G,MAAA,EAAQ,KAAA;AAAA,EACR,MAAA,EAAQ,IAAA;AAAA,EACR,OAAA,EAAS,IAAA;AAAA,EACT,cAAA,EAAgB;AAClB,CAAA;AAEO,SAAS,YAAA,CAAa,IAAA,EAAe,OAAA,GAA4B,EAAC,EAAW;AAClF,EAAA,MAAM,QAAA,GAAW,EAAE,GAAGA,gBAAAA,EAAiB,GAAG,OAAA,EAAQ;AAClD,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,QAAA,EAAU,CAAC,CAAA;AAC5C,EAAA,IAAI,CAAC,SAAS,cAAA,EAAgB;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,sCAAA,EAAyC,QAAA,CAAS,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA;AACzE;AAEA,SAAS,aAAA,CAAc,IAAA,EAAe,OAAA,EAAqC,KAAA,EAAuB;AAChG,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,IAAA,CAAK,UAAU,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,GAAG,KAAK,CAAA,CAAA,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA;AAE/B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AACnC,EAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AAAA,IAC9B;AACA,IAAA,MAAMC,OAAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAC1C,IAAA,OAAO,GAAGA,OAAM,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,GAAG,KAAK,CAAA,EAAA,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,MAAMC,MAAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU,cAAA,CAAe,KAAA,EAAO,OAAA,EAAS,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AACxF,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAGA,MAAK,GAAG,QAAQ,CAAA,CAAA;AAAA,EACtC;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAC1C,EAAA,MAAM,sBAAsB,QAAA,CAAS,KAAA,CAAM,CAAC,KAAA,KAAU,OAAO,UAAU,QAAQ,CAAA;AAC/E,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU,WAAW,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACrE,IAAA,OAAO,GAAG,MAAM,CAAA,EAAG,OAAO,CAAA,EAAG,UAAU,GAAG,QAAQ,CAAA,CAAA;AAAA,EACpD;AACA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAC,CAAA;AACnD,EAAA,MAAM,UAAA,GAAa,CAAA,EAAG,MAAM,CAAA,EAAG,OAAO,CAAA,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,CAAA,EAAG,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAA;AACxC,EAAA,MAAM,QAAQ,QAAA,CACX,GAAA;AAAA,IAAI,CAAC,KAAA,KACJ,OAAO,KAAA,KAAU,QAAA,GACb,GAAG,WAAW,CAAA,EAAG,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA,GAClC,aAAA,CAAc,KAAA,EAAO,OAAA,EAAS,QAAQ,CAAC;AAAA,GAC7C,CACC,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAEvB,EAAA,OAAO,CAAA,EAAG,UAAU,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA;AAChF;AAEA,SAAS,cAAA,CAAe,KAAA,EAAiB,OAAA,EAAqC,KAAA,EAAuB;AACnG,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,WAAW,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,aAAA,CAAc,KAAA,EAAO,OAAA,EAAS,KAAK,CAAA;AAC5C;AAEA,SAAS,oBAAoB,KAAA,EAAwC;AACnE,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,OAAA,CAAQ,KAAK,EACxB,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,MAAM,CAAA,CAAA,EAAI,GAAG,KAAK,eAAA,CAAgB,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CAC3D,KAAK,EAAE,CAAA;AACZ;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,KAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AACzB;AAEA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,OAAO,UAAA,CAAW,KAAK,CAAA,CAAE,OAAA,CAAQ,MAAM,QAAQ,CAAA;AACjD","file":"index.js","sourcesContent":["const DEV = typeof process !== \"undefined\" ? process.env.NODE_ENV !== \"production\" : true;\n\nexport function assert(condition: boolean, message: string): void {\n if (!DEV) {\n return;\n }\n if (!condition) {\n throw new Error(`Invariant failed: ${message}`);\n }\n}\n","export class XmlSaxError extends Error {\n readonly offset: number;\n readonly line: number;\n readonly column: number;\n\n constructor(message: string, offset: number, line: number, column: number) {\n super(`${message} at ${line}:${column}`);\n this.name = \"XmlSaxError\";\n this.offset = offset;\n this.line = line;\n this.column = column;\n }\n}\n","import { XmlSaxError } from \"./errors\";\n\nconst NAMED_ENTITIES: Record<string, string> = {\n lt: \"<\",\n gt: \">\",\n amp: \"&\",\n quot: \"\\\"\",\n apos: \"'\"\n};\n\nexport function decodeEntities(input: string, onError?: (error: Error) => void): string {\n let output = \"\";\n let i = 0;\n\n while (i < input.length) {\n const ch = input[i];\n if (ch !== \"&\") {\n output += ch;\n i += 1;\n continue;\n }\n\n const semi = input.indexOf(\";\", i + 1);\n if (semi === -1) {\n const err = new XmlSaxError(\"Unterminated entity\", i, 0, 0);\n onError?.(err);\n throw err;\n }\n\n const entity = input.slice(i + 1, semi);\n let decoded: string | undefined;\n\n if (entity.startsWith(\"#x\") || entity.startsWith(\"#X\")) {\n const codePoint = Number.parseInt(entity.slice(2), 16);\n decoded = decodeCodePoint(codePoint);\n } else if (entity.startsWith(\"#\")) {\n const codePoint = Number.parseInt(entity.slice(1), 10);\n decoded = decodeCodePoint(codePoint);\n } else {\n decoded = NAMED_ENTITIES[entity];\n }\n\n if (decoded === undefined) {\n const err = new XmlSaxError(`Unknown entity: &${entity};`, i, 0, 0);\n onError?.(err);\n throw err;\n }\n\n output += decoded;\n i = semi + 1;\n }\n\n return output;\n}\n\nfunction decodeCodePoint(codePoint: number): string | undefined {\n if (!Number.isFinite(codePoint)) {\n return undefined;\n }\n if (codePoint < 0 || codePoint > 0x10ffff) {\n return undefined;\n }\n if (codePoint >= 0xd800 && codePoint <= 0xdfff) {\n return undefined;\n }\n return String.fromCodePoint(codePoint);\n}\n\nexport function splitTextForEntities(text: string): { emit: string; carry: string } {\n const lastAmp = text.lastIndexOf(\"&\");\n if (lastAmp === -1) {\n return { emit: text, carry: \"\" };\n }\n\n const nextSemi = text.indexOf(\";\", lastAmp + 1);\n if (nextSemi === -1) {\n return {\n emit: text.slice(0, lastAmp),\n carry: text.slice(lastAmp)\n };\n }\n\n return { emit: text, carry: \"\" };\n}\n","import { assert } from \"./assert\";\nimport { decodeEntities, splitTextForEntities } from \"./entities\";\nimport { XmlSaxError } from \"./errors\";\nimport type {\n CloseTag,\n Doctype,\n OpenTag,\n ParserOptions,\n ProcessingInstruction,\n XmlAttribute\n} from \"./types\";\n\ntype NamespaceMap = Record<string, string>;\n\ninterface StackEntry {\n rawName: string;\n resolved: ResolvedName;\n ns: NamespaceMap;\n}\n\ninterface RawAttribute {\n name: string;\n value: string;\n}\n\ninterface ResolvedName {\n name: string;\n prefix: string;\n local: string;\n uri: string;\n}\n\nconst DEFAULT_OPTIONS: Required<Pick<ParserOptions, \"xmlns\" | \"includeNamespaceAttributes\" | \"allowDoctype\">> = {\n xmlns: true,\n includeNamespaceAttributes: false,\n allowDoctype: true\n};\n\nconst XML_NAMESPACE_URI = \"http://www.w3.org/XML/1998/namespace\";\nconst XMLNS_NAMESPACE_URI = \"http://www.w3.org/2000/xmlns/\";\n\nexport class XmlSaxParser {\n private options: ParserOptions;\n private buffer = \"\";\n private offset = 0;\n private line = 1;\n private column = 1;\n private elementStack: StackEntry[] = [];\n private nsStack: NamespaceMap[] = [\n Object.assign(Object.create(null) as NamespaceMap, {\n xml: XML_NAMESPACE_URI,\n xmlns: XMLNS_NAMESPACE_URI\n })\n ];\n private closed = false;\n private pendingCR = false;\n\n constructor(options: ParserOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n feed(chunk: string): void {\n if (this.closed) {\n this._error(\"Parser is closed\");\n }\n if (!chunk) {\n return;\n }\n this.buffer += chunk;\n this._parseBuffer(false);\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n this._parseBuffer(true);\n this._flushPendingCR();\n if (this.buffer.length > 0) {\n this._error(\"Unexpected end of input\");\n }\n if (this.elementStack.length > 0) {\n this._error(\"Unclosed tag(s) remaining\");\n }\n this.closed = true;\n }\n\n private _parseBuffer(final: boolean): void {\n let i = 0;\n\n while (i < this.buffer.length) {\n const lt = this.buffer.indexOf(\"<\", i);\n if (lt === -1) {\n const tail = this.buffer.slice(i);\n const split = splitTextForEntities(tail);\n if (split.emit.length > 0) {\n this._emitText(split.emit, true);\n this._advance(split.emit);\n }\n this.buffer = split.carry;\n return;\n }\n\n if (lt > i) {\n const text = this.buffer.slice(i, lt);\n if (text.length > 0) {\n this._emitText(text, false);\n this._advance(text);\n }\n i = lt;\n }\n\n const consumed = this._parseMarkupFrom(lt, final);\n if (consumed === null) {\n break;\n }\n\n const markup = this.buffer.slice(lt, lt + consumed);\n this._advance(markup);\n i = lt + consumed;\n }\n\n this.buffer = this.buffer.slice(i);\n\n if (final && this.buffer.length > 0) {\n this._error(\"Unexpected end of input\");\n }\n }\n\n private _parseMarkupFrom(start: number, final: boolean): number | null {\n assert(this.buffer[start] === \"<\", \"Markup must start with '<'\");\n\n this._flushPendingCR();\n\n if (this.buffer.startsWith(\"<!--\", start)) {\n const end = this.buffer.indexOf(\"-->\", start + 4);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated comment\");\n }\n return null;\n }\n const comment = this.buffer.slice(start + 4, end);\n this.options.onComment?.(comment);\n return end + 3 - start;\n }\n\n if (this.buffer.startsWith(\"<![CDATA[\", start)) {\n const end = this.buffer.indexOf(\"]]>\", start + 9);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated CDATA section\");\n }\n return null;\n }\n const cdata = this.buffer.slice(start + 9, end);\n const normalized = this._normalizeText(cdata, false);\n if (normalized.length > 0) {\n this.options.onCdata?.(normalized);\n }\n return end + 3 - start;\n }\n\n if (this.buffer.startsWith(\"<?\", start)) {\n const end = this.buffer.indexOf(\"?>\", start + 2);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated processing instruction\");\n }\n return null;\n }\n const body = this.buffer.slice(start + 2, end).trim();\n const split = body.search(/\\s/);\n const target = split === -1 ? body : body.slice(0, split);\n const data = split === -1 ? \"\" : body.slice(split).trim();\n const pi: ProcessingInstruction = { target, body: data };\n this.options.onProcessingInstruction?.(pi);\n return end + 2 - start;\n }\n\n if (this.buffer.startsWith(\"<!DOCTYPE\", start)) {\n const end = this._findDoctypeEnd(start + 9);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated doctype declaration\");\n }\n return null;\n }\n if (!this.options.allowDoctype) {\n this._error(\"Doctype is not allowed\");\n }\n const raw = this.buffer.slice(start + 9, end).trim();\n const doctype: Doctype = { raw };\n this.options.onDoctype?.(doctype);\n return end + 1 - start;\n }\n\n if (this.buffer.startsWith(\"</\", start)) {\n const end = this.buffer.indexOf(\">\", start + 2);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated closing tag\");\n }\n return null;\n }\n const raw = this.buffer.slice(start + 2, end).trim();\n const parsed = this._parseName(raw, 0, raw.length);\n if (raw.slice(parsed.end).trim().length > 0) {\n this._error(\"Invalid closing tag\");\n }\n this._handleCloseTag(parsed.name);\n return end + 1 - start;\n }\n\n const tagEnd = this._findTagEnd(start + 1);\n if (tagEnd === -1) {\n if (final) {\n this._error(\"Unterminated start tag\");\n }\n return null;\n }\n\n const content = this.buffer.slice(start + 1, tagEnd);\n this._handleStartTag(content);\n return tagEnd + 1 - start;\n }\n\n private _handleStartTag(content: string): void {\n const trimmed = content.trim();\n const selfClosing = trimmed.endsWith(\"/\");\n const body = selfClosing ? trimmed.slice(0, -1).trim() : trimmed;\n const parsed = this._parseTagBody(body);\n\n let ns = this._currentNs();\n if (this.options.xmlns) {\n ns = Object.create(ns) as NamespaceMap;\n for (const attr of parsed.attributes) {\n if (attr.name === \"xmlns\") {\n ns[\"\"] = attr.value;\n } else if (attr.name.startsWith(\"xmlns:\")) {\n ns[attr.name.slice(6)] = attr.value;\n }\n }\n }\n\n const resolvedName = this._resolveName(parsed.name, ns);\n const attributes: Record<string, XmlAttribute> = {};\n\n for (const attr of parsed.attributes) {\n if (this.options.xmlns && !this.options.includeNamespaceAttributes) {\n if (attr.name === \"xmlns\" || attr.name.startsWith(\"xmlns:\")) {\n continue;\n }\n }\n const resolvedAttr = this._resolveAttributeName(attr.name, ns);\n attributes[resolvedAttr.name] = {\n name: resolvedAttr.name,\n value: attr.value,\n prefix: resolvedAttr.prefix,\n local: resolvedAttr.local,\n uri: resolvedAttr.uri\n };\n }\n\n const tag: OpenTag = {\n name: resolvedName.name,\n prefix: resolvedName.prefix,\n local: resolvedName.local,\n uri: resolvedName.uri,\n attributes,\n isSelfClosing: selfClosing\n };\n\n this.options.onOpenTag?.(tag);\n\n if (selfClosing) {\n const closeTag: CloseTag = {\n name: resolvedName.name,\n prefix: resolvedName.prefix,\n local: resolvedName.local,\n uri: resolvedName.uri\n };\n this.options.onCloseTag?.(closeTag);\n return;\n }\n\n this.elementStack.push({ rawName: parsed.name, resolved: resolvedName, ns });\n this.nsStack.push(ns);\n }\n\n private _handleCloseTag(rawName: string): void {\n const entry = this.elementStack.pop();\n const ns = this.nsStack.pop();\n\n if (!entry || !ns) {\n this._error(\"Closing tag without matching start tag\");\n }\n\n if (entry.rawName !== rawName) {\n this._error(`Mismatched closing tag: expected </${entry.rawName}>`);\n }\n\n const closeTag: CloseTag = {\n name: entry.resolved.name,\n prefix: entry.resolved.prefix,\n local: entry.resolved.local,\n uri: entry.resolved.uri\n };\n\n this.options.onCloseTag?.(closeTag);\n }\n\n private _parseTagBody(body: string): { name: string; attributes: RawAttribute[] } {\n let i = 0;\n const length = body.length;\n\n i = this._skipWhitespace(body, i, length);\n const parsedName = this._parseName(body, i, length);\n i = parsedName.end;\n\n const attributes: RawAttribute[] = [];\n\n while (i < length) {\n i = this._skipWhitespace(body, i, length);\n if (i >= length) {\n break;\n }\n\n const attrName = this._parseName(body, i, length);\n i = attrName.end;\n i = this._skipWhitespace(body, i, length);\n\n if (body[i] !== \"=\") {\n this._error(\"Attribute without '='\");\n }\n i += 1;\n i = this._skipWhitespace(body, i, length);\n\n const quote = body[i];\n if (quote !== \"\\\"\" && quote !== \"'\") {\n this._error(\"Attribute value must be quoted\");\n }\n i += 1;\n\n const valueEnd = body.indexOf(quote, i);\n if (valueEnd === -1) {\n this._error(\"Unterminated attribute value\");\n }\n const rawValue = body.slice(i, valueEnd);\n const normalized = rawValue.replace(/\\r\\n?/g, \"\\n\");\n const value = decodeEntities(normalized, this.options.onError);\n attributes.push({ name: attrName.name, value });\n i = valueEnd + 1;\n }\n\n return { name: parsedName.name, attributes };\n }\n\n private _emitText(text: string, allowPendingCR: boolean): void {\n const normalized = this._normalizeText(text, allowPendingCR);\n if (normalized.length === 0) {\n return;\n }\n const decoded = decodeEntities(normalized, this.options.onError);\n if (decoded.length > 0) {\n this.options.onText?.(decoded);\n }\n }\n\n private _resolveName(rawName: string, ns: NamespaceMap): ResolvedName {\n if (!this.options.xmlns) {\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return { name: rawName, prefix: \"\", local: rawName, uri: \"\" };\n }\n return {\n name: rawName,\n prefix: rawName.slice(0, split),\n local: rawName.slice(split + 1),\n uri: \"\"\n };\n }\n\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: ns[\"\"] ?? \"\"\n };\n }\n\n const prefix = rawName.slice(0, split);\n const local = rawName.slice(split + 1);\n const uri = ns[prefix];\n if (uri === undefined) {\n this._error(`Undeclared namespace prefix: ${prefix}`);\n }\n return {\n name: rawName,\n prefix,\n local,\n uri\n };\n }\n\n private _resolveAttributeName(rawName: string, ns: NamespaceMap): ResolvedName {\n if (!this.options.xmlns) {\n return this._resolveName(rawName, ns);\n }\n\n if (rawName === \"xmlns\") {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: ns.xmlns ?? XMLNS_NAMESPACE_URI\n };\n }\n\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: \"\"\n };\n }\n\n const prefix = rawName.slice(0, split);\n const local = rawName.slice(split + 1);\n const uri = ns[prefix];\n if (uri === undefined) {\n this._error(`Undeclared namespace prefix: ${prefix}`);\n }\n\n return {\n name: rawName,\n prefix,\n local,\n uri\n };\n }\n\n private _findTagEnd(start: number): number {\n let quote: string | null = null;\n for (let i = start; i < this.buffer.length; i += 1) {\n const ch = this.buffer[i];\n if (quote) {\n if (ch === quote) {\n quote = null;\n }\n continue;\n }\n if (ch === \"\\\"\" || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \">\") {\n return i;\n }\n }\n return -1;\n }\n\n private _findDoctypeEnd(start: number): number {\n let quote: string | null = null;\n let bracketDepth = 0;\n\n for (let i = start; i < this.buffer.length; i += 1) {\n const ch = this.buffer[i];\n if (quote) {\n if (ch === quote) {\n quote = null;\n }\n continue;\n }\n if (ch === \"\\\"\" || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \"[\") {\n bracketDepth += 1;\n continue;\n }\n if (ch === \"]\") {\n bracketDepth = Math.max(0, bracketDepth - 1);\n continue;\n }\n if (ch === \">\" && bracketDepth === 0) {\n return i;\n }\n }\n\n return -1;\n }\n\n private _parseName(input: string, start: number, end: number): { name: string; end: number } {\n if (start >= end) {\n this._error(\"Expected name\");\n }\n\n const first = input[start];\n if (first === undefined) {\n this._error(\"Expected name\");\n }\n if (!this._isNameStart(first)) {\n this._error(`Invalid name start: '${first}'`);\n }\n\n let i = start + 1;\n while (i < end) {\n const ch = input[i];\n if (ch === undefined || !this._isNameChar(ch)) {\n break;\n }\n i += 1;\n }\n\n return { name: input.slice(start, i), end: i };\n }\n\n private _isNameStart(ch: string): boolean {\n return /[A-Za-z_]/.test(ch);\n }\n\n private _isNameChar(ch: string): boolean {\n return /[A-Za-z0-9_:\\-.]/.test(ch);\n }\n\n private _skipWhitespace(input: string, start: number, end: number): number {\n let i = start;\n while (i < end) {\n const ch = input[i];\n if (ch === undefined || !/\\s/.test(ch)) {\n break;\n }\n i += 1;\n }\n return i;\n }\n\n private _currentNs(): NamespaceMap {\n return this.nsStack[this.nsStack.length - 1] ?? (Object.create(null) as NamespaceMap);\n }\n\n private _advance(text: string): void {\n this.offset += text.length;\n const lastNewline = text.lastIndexOf(\"\\n\");\n if (lastNewline === -1) {\n this.column += text.length;\n return;\n }\n\n const newlineCount = text.split(\"\\n\").length - 1;\n this.line += newlineCount;\n this.column = text.length - lastNewline;\n }\n\n private _normalizeText(text: string, allowPendingCR: boolean): string {\n if (!text) {\n return \"\";\n }\n\n let value = text;\n let prefix = \"\";\n\n if (this.pendingCR) {\n prefix = \"\\n\";\n if (value.startsWith(\"\\n\")) {\n value = value.slice(1);\n }\n this.pendingCR = false;\n }\n\n if (allowPendingCR && value.endsWith(\"\\r\")) {\n this.pendingCR = true;\n value = value.slice(0, -1);\n }\n\n const normalized = value.replace(/\\r\\n?/g, \"\\n\");\n return `${prefix}${normalized}`;\n }\n\n private _flushPendingCR(): void {\n if (!this.pendingCR) {\n return;\n }\n this.pendingCR = false;\n this.options.onText?.(\"\\n\");\n }\n\n private _error(message: string): never {\n const error = new XmlSaxError(message, this.offset, this.line, this.column);\n this.options.onError?.(error);\n throw error;\n }\n}\n","import { XmlSaxParser } from \"./parser\";\nimport type { ParserOptions, XmlNode } from \"./types\";\n\nexport class TreeBuilder {\n private stack: XmlNode[] = [];\n private root: XmlNode | null = null;\n\n onOpenTag = (tag: { name: string; attributes: Record<string, { value: string }> }): void => {\n const node: XmlNode = {\n name: tag.name,\n attributes: Object.fromEntries(\n Object.entries(tag.attributes).map(([key, attr]) => [key, attr.value])\n ),\n children: []\n };\n\n const parent = this.stack[this.stack.length - 1];\n if (parent) {\n parent.children?.push(node);\n } else {\n this.root = node;\n }\n\n this.stack.push(node);\n };\n\n onText = (text: string): void => {\n if (!this.stack.length) {\n return;\n }\n const node = this.stack[this.stack.length - 1];\n if (!node) {\n return;\n }\n const children = node.children ?? [];\n const last = children[children.length - 1];\n if (typeof last === \"string\") {\n children[children.length - 1] = last + text;\n } else {\n children.push(text);\n }\n node.children = children;\n };\n\n onCdata = (text: string): void => {\n this.onText(text);\n };\n\n onCloseTag = (): void => {\n this.stack.pop();\n };\n\n getRoot(): XmlNode {\n if (!this.root) {\n throw new Error(\"No root element found\");\n }\n return this.root;\n }\n}\n\nexport function parseXmlString(xml: string, options: ParserOptions = {}): XmlNode {\n const builder = new TreeBuilder();\n const parser = new XmlSaxParser({\n ...options,\n onOpenTag: builder.onOpenTag,\n onText: builder.onText,\n onCdata: builder.onCdata,\n onCloseTag: builder.onCloseTag\n });\n\n parser.feed(xml);\n parser.close();\n return builder.getRoot();\n}\n","import type { SerializeOptions, XmlChild, XmlNode } from \"./types\";\n\nconst DEFAULT_OPTIONS: Required<Pick<SerializeOptions, \"pretty\" | \"indent\" | \"newline\" | \"xmlDeclaration\">> = {\n pretty: false,\n indent: \" \",\n newline: \"\\n\",\n xmlDeclaration: false\n};\n\nexport function serializeXml(node: XmlNode, options: SerializeOptions = {}): string {\n const settings = { ...DEFAULT_OPTIONS, ...options };\n const body = serializeNode(node, settings, 0);\n if (!settings.xmlDeclaration) {\n return body;\n }\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>${settings.newline}${body}`;\n}\n\nfunction serializeNode(node: XmlNode, options: Required<SerializeOptions>, depth: number): string {\n const attrs = serializeAttributes(node.attributes);\n const tagOpen = `<${node.name}${attrs}>`;\n const tagClose = `</${node.name}>`;\n\n const children = node.children ?? [];\n if (!children.length) {\n if (!options.pretty) {\n return `<${node.name}${attrs}/>`;\n }\n const indent = options.indent.repeat(depth);\n return `${indent}<${node.name}${attrs}/>`;\n }\n\n if (!options.pretty) {\n const inner = children.map((child) => serializeChild(child, options, depth + 1)).join(\"\");\n return `${tagOpen}${inner}${tagClose}`;\n }\n\n const indent = options.indent.repeat(depth);\n const hasOnlyTextChildren = children.every((child) => typeof child === \"string\");\n if (hasOnlyTextChildren) {\n const inlineText = children.map((child) => escapeText(child)).join(\"\");\n return `${indent}${tagOpen}${inlineText}${tagClose}`;\n }\n const innerIndent = options.indent.repeat(depth + 1);\n const prettyOpen = `${indent}${tagOpen}`;\n const prettyClose = `${indent}${tagClose}`;\n const inner = children\n .map((child) =>\n typeof child === \"string\"\n ? `${innerIndent}${escapeText(child)}`\n : serializeNode(child, options, depth + 1)\n )\n .join(options.newline);\n\n return `${prettyOpen}${options.newline}${inner}${options.newline}${prettyClose}`;\n}\n\nfunction serializeChild(child: XmlChild, options: Required<SerializeOptions>, depth: number): string {\n if (typeof child === \"string\") {\n return escapeText(child);\n }\n return serializeNode(child, options, depth);\n}\n\nfunction serializeAttributes(attrs?: Record<string, string>): string {\n if (!attrs) {\n return \"\";\n }\n return Object.entries(attrs)\n .map(([key, value]) => ` ${key}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nfunction escapeText(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \""\");\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/assert.ts","../src/errors.ts","../src/entities.ts","../src/parser.ts","../src/tree.ts","../src/serializer.ts","../src/object.ts"],"names":["split","DEFAULT_OPTIONS","indent","inner"],"mappings":"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","file":"index.js","sourcesContent":["const DEV = typeof process !== \"undefined\" ? process.env.NODE_ENV !== \"production\" : true;\n\nexport function assert(condition: boolean, message: string): void {\n if (!DEV) {\n return;\n }\n if (!condition) {\n throw new Error(`Invariant failed: ${message}`);\n }\n}\n","export class XmlSaxError extends Error {\n readonly offset: number;\n readonly line: number;\n readonly column: number;\n\n constructor(message: string, offset: number, line: number, column: number) {\n super(`${message} at ${line}:${column}`);\n this.name = \"XmlSaxError\";\n this.offset = offset;\n this.line = line;\n this.column = column;\n }\n}\n","import { XmlSaxError } from \"./errors\";\n\nconst NAMED_ENTITIES: Record<string, string> = {\n lt: \"<\",\n gt: \">\",\n amp: \"&\",\n quot: \"\\\"\",\n apos: \"'\"\n};\n\nexport function decodeEntities(input: string, onError?: (error: Error) => void): string {\n let output = \"\";\n let i = 0;\n\n while (i < input.length) {\n const ch = input[i];\n if (ch !== \"&\") {\n output += ch;\n i += 1;\n continue;\n }\n\n const semi = input.indexOf(\";\", i + 1);\n if (semi === -1) {\n const err = new XmlSaxError(\"Unterminated entity\", i, 0, 0);\n onError?.(err);\n throw err;\n }\n\n const entity = input.slice(i + 1, semi);\n let decoded: string | undefined;\n\n if (entity.startsWith(\"#x\") || entity.startsWith(\"#X\")) {\n const codePoint = Number.parseInt(entity.slice(2), 16);\n decoded = decodeCodePoint(codePoint);\n } else if (entity.startsWith(\"#\")) {\n const codePoint = Number.parseInt(entity.slice(1), 10);\n decoded = decodeCodePoint(codePoint);\n } else {\n decoded = NAMED_ENTITIES[entity];\n }\n\n if (decoded === undefined) {\n const err = new XmlSaxError(`Unknown entity: &${entity};`, i, 0, 0);\n onError?.(err);\n throw err;\n }\n\n output += decoded;\n i = semi + 1;\n }\n\n return output;\n}\n\nfunction decodeCodePoint(codePoint: number): string | undefined {\n if (!Number.isFinite(codePoint)) {\n return undefined;\n }\n if (codePoint < 0 || codePoint > 0x10ffff) {\n return undefined;\n }\n if (codePoint >= 0xd800 && codePoint <= 0xdfff) {\n return undefined;\n }\n return String.fromCodePoint(codePoint);\n}\n\nexport function splitTextForEntities(text: string): { emit: string; carry: string } {\n const lastAmp = text.lastIndexOf(\"&\");\n if (lastAmp === -1) {\n return { emit: text, carry: \"\" };\n }\n\n const nextSemi = text.indexOf(\";\", lastAmp + 1);\n if (nextSemi === -1) {\n return {\n emit: text.slice(0, lastAmp),\n carry: text.slice(lastAmp)\n };\n }\n\n return { emit: text, carry: \"\" };\n}\n","import { assert } from \"./assert\";\nimport { decodeEntities, splitTextForEntities } from \"./entities\";\nimport { XmlSaxError } from \"./errors\";\nimport type {\n CloseTag,\n Doctype,\n OpenTag,\n ParserOptions,\n ProcessingInstruction,\n XmlAttribute\n} from \"./types\";\n\ntype NamespaceMap = Record<string, string>;\n\ninterface StackEntry {\n rawName: string;\n resolved: ResolvedName;\n ns: NamespaceMap;\n}\n\ninterface RawAttribute {\n name: string;\n value: string;\n}\n\ninterface ResolvedName {\n name: string;\n prefix: string;\n local: string;\n uri: string;\n}\n\nconst DEFAULT_OPTIONS: Required<Pick<ParserOptions, \"xmlns\" | \"includeNamespaceAttributes\" | \"allowDoctype\">> = {\n xmlns: true,\n includeNamespaceAttributes: false,\n allowDoctype: true\n};\n\nconst XML_NAMESPACE_URI = \"http://www.w3.org/XML/1998/namespace\";\nconst XMLNS_NAMESPACE_URI = \"http://www.w3.org/2000/xmlns/\";\n\nexport class XmlSaxParser {\n private options: ParserOptions;\n private buffer = \"\";\n private offset = 0;\n private line = 1;\n private column = 1;\n private elementStack: StackEntry[] = [];\n private nsStack: NamespaceMap[] = [\n Object.assign(Object.create(null) as NamespaceMap, {\n xml: XML_NAMESPACE_URI,\n xmlns: XMLNS_NAMESPACE_URI\n })\n ];\n private closed = false;\n private pendingCR = false;\n\n constructor(options: ParserOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n feed(chunk: string): void {\n if (this.closed) {\n this._error(\"Parser is closed\");\n }\n if (!chunk) {\n return;\n }\n this.buffer += chunk;\n this._parseBuffer(false);\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n this._parseBuffer(true);\n this._flushPendingCR();\n if (this.buffer.length > 0) {\n this._error(\"Unexpected end of input\");\n }\n if (this.elementStack.length > 0) {\n this._error(\"Unclosed tag(s) remaining\");\n }\n this.closed = true;\n }\n\n private _parseBuffer(final: boolean): void {\n let i = 0;\n\n while (i < this.buffer.length) {\n const lt = this.buffer.indexOf(\"<\", i);\n if (lt === -1) {\n const tail = this.buffer.slice(i);\n const split = splitTextForEntities(tail);\n if (split.emit.length > 0) {\n this._emitText(split.emit, true);\n this._advance(split.emit);\n }\n this.buffer = split.carry;\n return;\n }\n\n if (lt > i) {\n const text = this.buffer.slice(i, lt);\n if (text.length > 0) {\n this._emitText(text, false);\n this._advance(text);\n }\n i = lt;\n }\n\n const consumed = this._parseMarkupFrom(lt, final);\n if (consumed === null) {\n break;\n }\n\n const markup = this.buffer.slice(lt, lt + consumed);\n this._advance(markup);\n i = lt + consumed;\n }\n\n this.buffer = this.buffer.slice(i);\n\n if (final && this.buffer.length > 0) {\n this._error(\"Unexpected end of input\");\n }\n }\n\n private _parseMarkupFrom(start: number, final: boolean): number | null {\n assert(this.buffer[start] === \"<\", \"Markup must start with '<'\");\n\n this._flushPendingCR();\n\n if (this.buffer.startsWith(\"<!--\", start)) {\n const end = this.buffer.indexOf(\"-->\", start + 4);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated comment\");\n }\n return null;\n }\n const comment = this.buffer.slice(start + 4, end);\n this.options.onComment?.(comment);\n return end + 3 - start;\n }\n\n if (this.buffer.startsWith(\"<![CDATA[\", start)) {\n const end = this.buffer.indexOf(\"]]>\", start + 9);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated CDATA section\");\n }\n return null;\n }\n const cdata = this.buffer.slice(start + 9, end);\n const normalized = this._normalizeText(cdata, false);\n if (normalized.length > 0) {\n this.options.onCdata?.(normalized);\n }\n return end + 3 - start;\n }\n\n if (this.buffer.startsWith(\"<?\", start)) {\n const end = this.buffer.indexOf(\"?>\", start + 2);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated processing instruction\");\n }\n return null;\n }\n const body = this.buffer.slice(start + 2, end).trim();\n const split = body.search(/\\s/);\n const target = split === -1 ? body : body.slice(0, split);\n const data = split === -1 ? \"\" : body.slice(split).trim();\n const pi: ProcessingInstruction = { target, body: data };\n this.options.onProcessingInstruction?.(pi);\n return end + 2 - start;\n }\n\n if (this.buffer.startsWith(\"<!DOCTYPE\", start)) {\n const end = this._findDoctypeEnd(start + 9);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated doctype declaration\");\n }\n return null;\n }\n if (!this.options.allowDoctype) {\n this._error(\"Doctype is not allowed\");\n }\n const raw = this.buffer.slice(start + 9, end).trim();\n const doctype: Doctype = { raw };\n this.options.onDoctype?.(doctype);\n return end + 1 - start;\n }\n\n if (this.buffer.startsWith(\"</\", start)) {\n const end = this.buffer.indexOf(\">\", start + 2);\n if (end === -1) {\n if (final) {\n this._error(\"Unterminated closing tag\");\n }\n return null;\n }\n const raw = this.buffer.slice(start + 2, end).trim();\n const parsed = this._parseName(raw, 0, raw.length);\n if (raw.slice(parsed.end).trim().length > 0) {\n this._error(\"Invalid closing tag\");\n }\n this._handleCloseTag(parsed.name);\n return end + 1 - start;\n }\n\n const tagEnd = this._findTagEnd(start + 1);\n if (tagEnd === -1) {\n if (final) {\n this._error(\"Unterminated start tag\");\n }\n return null;\n }\n\n const content = this.buffer.slice(start + 1, tagEnd);\n this._handleStartTag(content);\n return tagEnd + 1 - start;\n }\n\n private _handleStartTag(content: string): void {\n const trimmed = content.trim();\n const selfClosing = trimmed.endsWith(\"/\");\n const body = selfClosing ? trimmed.slice(0, -1).trim() : trimmed;\n const parsed = this._parseTagBody(body);\n\n let ns = this._currentNs();\n if (this.options.xmlns) {\n ns = Object.create(ns) as NamespaceMap;\n for (const attr of parsed.attributes) {\n if (attr.name === \"xmlns\") {\n ns[\"\"] = attr.value;\n } else if (attr.name.startsWith(\"xmlns:\")) {\n ns[attr.name.slice(6)] = attr.value;\n }\n }\n }\n\n const resolvedName = this._resolveName(parsed.name, ns);\n const attributes: Record<string, XmlAttribute> = {};\n\n for (const attr of parsed.attributes) {\n if (this.options.xmlns && !this.options.includeNamespaceAttributes) {\n if (attr.name === \"xmlns\" || attr.name.startsWith(\"xmlns:\")) {\n continue;\n }\n }\n const resolvedAttr = this._resolveAttributeName(attr.name, ns);\n attributes[resolvedAttr.name] = {\n name: resolvedAttr.name,\n value: attr.value,\n prefix: resolvedAttr.prefix,\n local: resolvedAttr.local,\n uri: resolvedAttr.uri\n };\n }\n\n const tag: OpenTag = {\n name: resolvedName.name,\n prefix: resolvedName.prefix,\n local: resolvedName.local,\n uri: resolvedName.uri,\n attributes,\n isSelfClosing: selfClosing\n };\n\n this.options.onOpenTag?.(tag);\n\n if (selfClosing) {\n const closeTag: CloseTag = {\n name: resolvedName.name,\n prefix: resolvedName.prefix,\n local: resolvedName.local,\n uri: resolvedName.uri\n };\n this.options.onCloseTag?.(closeTag);\n return;\n }\n\n this.elementStack.push({ rawName: parsed.name, resolved: resolvedName, ns });\n this.nsStack.push(ns);\n }\n\n private _handleCloseTag(rawName: string): void {\n const entry = this.elementStack.pop();\n const ns = this.nsStack.pop();\n\n if (!entry || !ns) {\n this._error(\"Closing tag without matching start tag\");\n }\n\n if (entry.rawName !== rawName) {\n this._error(`Mismatched closing tag: expected </${entry.rawName}>`);\n }\n\n const closeTag: CloseTag = {\n name: entry.resolved.name,\n prefix: entry.resolved.prefix,\n local: entry.resolved.local,\n uri: entry.resolved.uri\n };\n\n this.options.onCloseTag?.(closeTag);\n }\n\n private _parseTagBody(body: string): { name: string; attributes: RawAttribute[] } {\n let i = 0;\n const length = body.length;\n\n i = this._skipWhitespace(body, i, length);\n const parsedName = this._parseName(body, i, length);\n i = parsedName.end;\n\n const attributes: RawAttribute[] = [];\n\n while (i < length) {\n i = this._skipWhitespace(body, i, length);\n if (i >= length) {\n break;\n }\n\n const attrName = this._parseName(body, i, length);\n i = attrName.end;\n i = this._skipWhitespace(body, i, length);\n\n if (body[i] !== \"=\") {\n this._error(\"Attribute without '='\");\n }\n i += 1;\n i = this._skipWhitespace(body, i, length);\n\n const quote = body[i];\n if (quote !== \"\\\"\" && quote !== \"'\") {\n this._error(\"Attribute value must be quoted\");\n }\n i += 1;\n\n const valueEnd = body.indexOf(quote, i);\n if (valueEnd === -1) {\n this._error(\"Unterminated attribute value\");\n }\n const rawValue = body.slice(i, valueEnd);\n const normalized = rawValue.replace(/\\r\\n?/g, \"\\n\");\n const value = decodeEntities(normalized, this.options.onError);\n attributes.push({ name: attrName.name, value });\n i = valueEnd + 1;\n }\n\n return { name: parsedName.name, attributes };\n }\n\n private _emitText(text: string, allowPendingCR: boolean): void {\n const normalized = this._normalizeText(text, allowPendingCR);\n if (normalized.length === 0) {\n return;\n }\n const decoded = decodeEntities(normalized, this.options.onError);\n if (decoded.length > 0) {\n this.options.onText?.(decoded);\n }\n }\n\n private _resolveName(rawName: string, ns: NamespaceMap): ResolvedName {\n if (!this.options.xmlns) {\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return { name: rawName, prefix: \"\", local: rawName, uri: \"\" };\n }\n return {\n name: rawName,\n prefix: rawName.slice(0, split),\n local: rawName.slice(split + 1),\n uri: \"\"\n };\n }\n\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: ns[\"\"] ?? \"\"\n };\n }\n\n const prefix = rawName.slice(0, split);\n const local = rawName.slice(split + 1);\n const uri = ns[prefix];\n if (uri === undefined) {\n this._error(`Undeclared namespace prefix: ${prefix}`);\n }\n return {\n name: rawName,\n prefix,\n local,\n uri\n };\n }\n\n private _resolveAttributeName(rawName: string, ns: NamespaceMap): ResolvedName {\n if (!this.options.xmlns) {\n return this._resolveName(rawName, ns);\n }\n\n if (rawName === \"xmlns\") {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: ns.xmlns ?? XMLNS_NAMESPACE_URI\n };\n }\n\n const split = rawName.indexOf(\":\");\n if (split === -1) {\n return {\n name: rawName,\n prefix: \"\",\n local: rawName,\n uri: \"\"\n };\n }\n\n const prefix = rawName.slice(0, split);\n const local = rawName.slice(split + 1);\n const uri = ns[prefix];\n if (uri === undefined) {\n this._error(`Undeclared namespace prefix: ${prefix}`);\n }\n\n return {\n name: rawName,\n prefix,\n local,\n uri\n };\n }\n\n private _findTagEnd(start: number): number {\n let quote: string | null = null;\n for (let i = start; i < this.buffer.length; i += 1) {\n const ch = this.buffer[i];\n if (quote) {\n if (ch === quote) {\n quote = null;\n }\n continue;\n }\n if (ch === \"\\\"\" || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \">\") {\n return i;\n }\n }\n return -1;\n }\n\n private _findDoctypeEnd(start: number): number {\n let quote: string | null = null;\n let bracketDepth = 0;\n\n for (let i = start; i < this.buffer.length; i += 1) {\n const ch = this.buffer[i];\n if (quote) {\n if (ch === quote) {\n quote = null;\n }\n continue;\n }\n if (ch === \"\\\"\" || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \"[\") {\n bracketDepth += 1;\n continue;\n }\n if (ch === \"]\") {\n bracketDepth = Math.max(0, bracketDepth - 1);\n continue;\n }\n if (ch === \">\" && bracketDepth === 0) {\n return i;\n }\n }\n\n return -1;\n }\n\n private _parseName(input: string, start: number, end: number): { name: string; end: number } {\n if (start >= end) {\n this._error(\"Expected name\");\n }\n\n const first = input[start];\n if (first === undefined) {\n this._error(\"Expected name\");\n }\n if (!this._isNameStart(first)) {\n this._error(`Invalid name start: '${first}'`);\n }\n\n let i = start + 1;\n while (i < end) {\n const ch = input[i];\n if (ch === undefined || !this._isNameChar(ch)) {\n break;\n }\n i += 1;\n }\n\n return { name: input.slice(start, i), end: i };\n }\n\n private _isNameStart(ch: string): boolean {\n return /[A-Za-z_]/.test(ch);\n }\n\n private _isNameChar(ch: string): boolean {\n return /[A-Za-z0-9_:\\-.]/.test(ch);\n }\n\n private _skipWhitespace(input: string, start: number, end: number): number {\n let i = start;\n while (i < end) {\n const ch = input[i];\n if (ch === undefined || !/\\s/.test(ch)) {\n break;\n }\n i += 1;\n }\n return i;\n }\n\n private _currentNs(): NamespaceMap {\n return this.nsStack[this.nsStack.length - 1] ?? (Object.create(null) as NamespaceMap);\n }\n\n private _advance(text: string): void {\n this.offset += text.length;\n const lastNewline = text.lastIndexOf(\"\\n\");\n if (lastNewline === -1) {\n this.column += text.length;\n return;\n }\n\n const newlineCount = text.split(\"\\n\").length - 1;\n this.line += newlineCount;\n this.column = text.length - lastNewline;\n }\n\n private _normalizeText(text: string, allowPendingCR: boolean): string {\n if (!text) {\n return \"\";\n }\n\n let value = text;\n let prefix = \"\";\n\n if (this.pendingCR) {\n prefix = \"\\n\";\n if (value.startsWith(\"\\n\")) {\n value = value.slice(1);\n }\n this.pendingCR = false;\n }\n\n if (allowPendingCR && value.endsWith(\"\\r\")) {\n this.pendingCR = true;\n value = value.slice(0, -1);\n }\n\n const normalized = value.replace(/\\r\\n?/g, \"\\n\");\n return `${prefix}${normalized}`;\n }\n\n private _flushPendingCR(): void {\n if (!this.pendingCR) {\n return;\n }\n this.pendingCR = false;\n this.options.onText?.(\"\\n\");\n }\n\n private _error(message: string): never {\n const error = new XmlSaxError(message, this.offset, this.line, this.column);\n this.options.onError?.(error);\n throw error;\n }\n}\n","import { XmlSaxParser } from \"./parser\";\nimport type { ParserOptions, XmlNode } from \"./types\";\n\nexport class TreeBuilder {\n private stack: XmlNode[] = [];\n private root: XmlNode | null = null;\n\n onOpenTag = (tag: { name: string; attributes: Record<string, { value: string }> }): void => {\n const node: XmlNode = {\n name: tag.name,\n attributes: Object.fromEntries(\n Object.entries(tag.attributes).map(([key, attr]) => [key, attr.value])\n ),\n children: []\n };\n\n const parent = this.stack[this.stack.length - 1];\n if (parent) {\n parent.children?.push(node);\n } else {\n this.root = node;\n }\n\n this.stack.push(node);\n };\n\n onText = (text: string): void => {\n if (!this.stack.length) {\n return;\n }\n const node = this.stack[this.stack.length - 1];\n if (!node) {\n return;\n }\n const children = node.children ?? [];\n const last = children[children.length - 1];\n if (typeof last === \"string\") {\n children[children.length - 1] = last + text;\n } else {\n children.push(text);\n }\n node.children = children;\n };\n\n onCdata = (text: string): void => {\n this.onText(text);\n };\n\n onCloseTag = (): void => {\n this.stack.pop();\n };\n\n getRoot(): XmlNode {\n if (!this.root) {\n throw new Error(\"No root element found\");\n }\n return this.root;\n }\n}\n\nexport function parseXmlString(xml: string, options: ParserOptions = {}): XmlNode {\n const builder = new TreeBuilder();\n const parser = new XmlSaxParser({\n ...options,\n onOpenTag: builder.onOpenTag,\n onText: builder.onText,\n onCdata: builder.onCdata,\n onCloseTag: builder.onCloseTag\n });\n\n parser.feed(xml);\n parser.close();\n return builder.getRoot();\n}\n","import type { SerializeOptions, XmlChild, XmlNode } from \"./types\";\n\nconst DEFAULT_OPTIONS: Required<Pick<SerializeOptions, \"pretty\" | \"indent\" | \"newline\" | \"xmlDeclaration\">> = {\n pretty: false,\n indent: \" \",\n newline: \"\\n\",\n xmlDeclaration: false\n};\n\nexport function serializeXml(node: XmlNode, options: SerializeOptions = {}): string {\n const settings = { ...DEFAULT_OPTIONS, ...options };\n let body = serializeNode(node, settings, 0);\n if (settings.pretty && !body.endsWith(settings.newline)) {\n body = `${body}${settings.newline}`;\n }\n if (!settings.xmlDeclaration) {\n return body;\n }\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>${settings.newline}${body}`;\n}\n\nfunction serializeNode(node: XmlNode, options: Required<SerializeOptions>, depth: number): string {\n const attrs = serializeAttributes(node.attributes);\n const tagOpen = `<${node.name}${attrs}>`;\n const tagClose = `</${node.name}>`;\n\n const children = node.children ?? [];\n if (!children.length) {\n if (!options.pretty) {\n return `<${node.name}${attrs}/>`;\n }\n const indent = options.indent.repeat(depth);\n return `${indent}<${node.name}${attrs}/>`;\n }\n\n if (!options.pretty) {\n const inner = children.map((child) => serializeChild(child, options, depth + 1)).join(\"\");\n return `${tagOpen}${inner}${tagClose}`;\n }\n\n const indent = options.indent.repeat(depth);\n const hasOnlyTextChildren = children.every((child) => typeof child === \"string\");\n if (hasOnlyTextChildren) {\n const inlineText = children.map((child) => escapeText(child)).join(\"\");\n return `${indent}${tagOpen}${inlineText}${tagClose}`;\n }\n const innerIndent = options.indent.repeat(depth + 1);\n const prettyOpen = `${indent}${tagOpen}`;\n const prettyClose = `${indent}${tagClose}`;\n const inner = children\n .map((child) =>\n typeof child === \"string\"\n ? `${innerIndent}${escapeText(child)}`\n : serializeNode(child, options, depth + 1)\n )\n .join(options.newline);\n\n return `${prettyOpen}${options.newline}${inner}${options.newline}${prettyClose}`;\n}\n\nfunction serializeChild(child: XmlChild, options: Required<SerializeOptions>, depth: number): string {\n if (typeof child === \"string\") {\n return escapeText(child);\n }\n return serializeNode(child, options, depth);\n}\n\nfunction serializeAttributes(attrs?: Record<string, string>): string {\n if (!attrs) {\n return \"\";\n }\n return Object.entries(attrs)\n .map(([key, value]) => ` ${key}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nfunction escapeText(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \""\");\n}\n","import type {\n ObjectBuilderOptions,\n OpenTag,\n XmlAttribute,\n XmlNode,\n XmlObjectMap,\n XmlObjectValue\n} from \"./types\";\n\ninterface ElementState {\n name: string;\n attributes: Record<string, string>;\n textParts: string[];\n children: Record<string, XmlObjectValue | XmlObjectValue[]>;\n}\n\nconst DEFAULT_OBJECT_OPTIONS: Required<Omit<ObjectBuilderOptions, \"arrayElements\">> = {\n attributePrefix: \"@_\",\n textKey: \"#text\",\n stripNamespaces: false,\n coalesceText: true\n};\n\ntype ObjectBuilderSettings = Required<Omit<ObjectBuilderOptions, \"arrayElements\">> &\n Pick<ObjectBuilderOptions, \"arrayElements\">;\n\nexport function stripNamespace(name: string): string {\n const index = name.indexOf(\":\");\n if (index === -1) {\n return name;\n }\n return name.slice(index + 1);\n}\n\nexport function resolveName(\n value: string | Pick<OpenTag, \"name\" | \"prefix\" | \"local\" | \"uri\">\n): { name: string; localName: string; prefix: string; uri: string } {\n if (typeof value !== \"string\") {\n return {\n name: value.name,\n localName: value.local,\n prefix: value.prefix,\n uri: value.uri\n };\n }\n\n const index = value.indexOf(\":\");\n if (index === -1) {\n return { name: value, localName: value, prefix: \"\", uri: \"\" };\n }\n\n return {\n name: value,\n localName: value.slice(index + 1),\n prefix: value.slice(0, index),\n uri: \"\"\n };\n}\n\nexport function buildObject(root: XmlNode, options: ObjectBuilderOptions = {}): XmlObjectValue {\n const settings = buildSettings(options);\n return buildNode(root, settings, []);\n}\n\nexport class ObjectBuilder {\n private options: ObjectBuilderSettings;\n private stack: ElementState[] = [];\n private root: XmlObjectValue | null = null;\n private rootName: string | null = null;\n\n constructor(options: ObjectBuilderOptions = {}) {\n this.options = buildSettings(options);\n }\n\n onOpenTag = (tag: OpenTag): void => {\n const name = normalizeName(tag.name, this.options);\n const attributes = normalizeAttributes(tag.attributes, this.options);\n const state: ElementState = {\n name,\n attributes,\n textParts: [],\n children: Object.create(null) as Record<string, XmlObjectValue | XmlObjectValue[]>\n };\n\n this.rootName ??= name;\n\n this.stack.push(state);\n };\n\n onText = (text: string): void => {\n if (!text) {\n return;\n }\n const current = this.stack[this.stack.length - 1];\n if (!current) {\n return;\n }\n current.textParts.push(text);\n };\n\n onCdata = (text: string): void => {\n this.onText(text);\n };\n\n onCloseTag = (): void => {\n const state = this.stack.pop();\n if (!state) {\n return;\n }\n\n const value = finalizeElement(state, this.options);\n const parent = this.stack[this.stack.length - 1];\n\n if (!parent) {\n this.root = value;\n return;\n }\n\n const path = this.stack.map((entry) => entry.name);\n addChild(parent.children, state.name, value, this.options, path);\n };\n\n getResult(): XmlObjectValue {\n if (this.root === null) {\n throw new Error(\"No root element found\");\n }\n return this.root;\n }\n\n getRootName(): string {\n if (!this.rootName) {\n throw new Error(\"No root element found\");\n }\n return this.rootName;\n }\n}\n\nfunction buildSettings(options: ObjectBuilderOptions): ObjectBuilderSettings {\n return { ...DEFAULT_OBJECT_OPTIONS, ...options };\n}\n\nfunction buildNode(node: XmlNode, options: ObjectBuilderSettings, path: string[]): XmlObjectValue {\n const name = normalizeName(node.name, options);\n const attributes = normalizeAttributeMap(node.attributes ?? {}, options);\n const state: ElementState = {\n name,\n attributes,\n textParts: [],\n children: Object.create(null) as Record<string, XmlObjectValue | XmlObjectValue[]>\n };\n\n const children = node.children ?? [];\n for (const child of children) {\n if (typeof child === \"string\") {\n if (child) {\n state.textParts.push(child);\n }\n continue;\n }\n\n const value = buildNode(child, options, [...path, name]);\n const childName = normalizeName(child.name, options);\n addChild(state.children, childName, value, options, [...path, name]);\n }\n\n return finalizeElement(state, options);\n}\n\nfunction normalizeName(name: string, options: ObjectBuilderSettings): string {\n if (options.stripNamespaces) {\n return stripNamespace(name);\n }\n return name;\n}\n\nfunction normalizeAttributes(\n attributes: Record<string, XmlAttribute>,\n options: ObjectBuilderSettings\n): Record<string, string> {\n const result: Record<string, string> = Object.create(null) as Record<string, string>;\n for (const [key, attr] of Object.entries(attributes)) {\n const name = normalizeName(key, options);\n result[name] = attr.value;\n }\n return result;\n}\n\nfunction normalizeAttributeMap(\n attributes: Record<string, string>,\n options: ObjectBuilderSettings\n): Record<string, string> {\n const result: Record<string, string> = Object.create(null) as Record<string, string>;\n for (const [key, value] of Object.entries(attributes)) {\n const name = normalizeName(key, options);\n result[name] = value;\n }\n return result;\n}\n\nfunction addChild(\n target: Record<string, XmlObjectValue | XmlObjectValue[]>,\n name: string,\n value: XmlObjectValue,\n options: ObjectBuilderSettings,\n path: string[]\n): void {\n const forcedArray = shouldForceArray(name, path, options);\n const existing = target[name];\n\n if (existing === undefined) {\n target[name] = forcedArray ? [value] : value;\n return;\n }\n\n if (Array.isArray(existing)) {\n existing.push(value);\n return;\n }\n\n target[name] = [existing, value];\n}\n\nfunction shouldForceArray(name: string, path: string[], options: ObjectBuilderSettings): boolean {\n const rule = options.arrayElements;\n if (!rule) {\n return false;\n }\n if (rule instanceof Set) {\n return rule.has(name);\n }\n return rule(name, path);\n}\n\nfunction finalizeElement(state: ElementState, options: ObjectBuilderSettings): XmlObjectValue {\n const hasAttributes = Object.keys(state.attributes).length > 0;\n const hasChildren = Object.keys(state.children).length > 0;\n const hasText = state.textParts.length > 0;\n\n const textValue = options.coalesceText\n ? state.textParts.join(\"\")\n : state.textParts.length <= 1\n ? state.textParts[0] ?? \"\"\n : state.textParts.slice();\n\n if (!hasAttributes && !hasChildren) {\n if (!hasText) {\n return \"\";\n }\n return textValue as XmlObjectValue;\n }\n\n const result: XmlObjectMap = Object.create(null) as XmlObjectMap;\n\n for (const [key, value] of Object.entries(state.attributes)) {\n result[`${options.attributePrefix}${key}`] = value;\n }\n\n for (const [key, value] of Object.entries(state.children)) {\n result[key] = value;\n }\n\n if (hasText) {\n result[options.textKey] = textValue as XmlObjectValue;\n }\n\n return result;\n}\n"]}
|