xml2o
Version:
Helps you convert XML into an object for easy reading.
11 lines • 11.2 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../src/index.ts", "../src/node/index.ts"],
"sourcesContent": [
"import SAX from \"sax\";\nimport { Node, Attribute } from \"./node\";\nimport ReadableStream = NodeJS.ReadableStream;\n\ninterface CompatEvents {\n on(event: \"error\", fn: (error: Error) => void): void;\n on(event: \"text\", fn: (text: string) => void): void;\n on(event: \"doctype\", fn: (doctype: string) => void): void;\n on(event: \"processinginstruction\", fn: (processinginstruction: string) => void): void;\n on(event: \"sgmldeclaration\", fn: (sgmldeclaration: string) => void): void;\n on(event: \"opentagstart\", fn: (node: SAX.QualifiedTag) => void): void;\n on(event: \"opentag\", fn: (node: SAX.QualifiedTag) => void): void;\n on(event: \"closetag\", fn: (node: SAX.QualifiedTag) => void): void;\n on(event: \"attribute\", fn: (attribute: SAX.QualifiedAttribute) => void): void;\n on(event: \"comment\", fn: (comment: string) => void): void;\n on(event: \"opencdata\", fn: (start: string) => void): void;\n on(event: \"cdata\", fn: (cdata: string) => void): void;\n on(event: \"closecdata\", fn: (end: string) => void): void;\n on(event: \"opennamespace\", fn: (ns: string) => void): void;\n on(event: \"end\", fn: () => void): void;\n on(event: \"ready\", fn: () => void): void;\n on(event: \"noscript\", fn: () => void): void;\n}\n\nfunction convert(parser: CompatEvents, ready: () => void): Promise<Node> {\n let pointer: Node | any;\n\n parser.on(\"opentag\", (node) => {\n if (!pointer) {\n pointer = new Node(node, null);\n } else {\n pointer = Node.addNode(pointer, node);\n }\n });\n\n parser.on(\"closetag\", (_node) => (pointer.parent ? (pointer = pointer.parent) : null));\n parser.on(\"text\", (value) => pointer && Node.pushText(pointer, value));\n parser.on(\"cdata\", (value) => Node.pushText(pointer, value));\n\n return new Promise((resolve, reject) => {\n parser.on(\"end\", () => resolve(pointer));\n parser.on(\"error\", (error) => reject(error));\n ready();\n });\n}\n\nexport function convertStream(stream: ReadableStream): Promise<Node> {\n const parser = SAX.createStream(true, { xmlns: true });\n return convert(parser, () => stream.pipe(parser));\n}\n\nexport function convertString(XMLString: string): Promise<Node> {\n const parser = SAX.createStream(true, { xmlns: true });\n return convert(parser, () => parser.end(XMLString));\n}\n\nexport { Node, Attribute };\n",
"interface AttributeInput {\n name: string;\n local: string;\n value: string;\n prefix: string;\n uri: string;\n}\n\ninterface NodeInput {\n name: string;\n local: string;\n prefix: string;\n uri: string;\n attributes: { [key: string]: AttributeInput };\n}\n\nconst text = Symbol();\n\nexport class Node extends Array<Node> {\n [text]: string[];\n\n public readonly name: string;\n\n public readonly local: string;\n\n public readonly path!: string;\n\n public readonly prefix: string;\n\n public readonly uri: string;\n\n protected readonly attributes: { [key: string]: Attribute };\n\n constructor(\n opt: NodeInput,\n public parent: Node | null,\n ) {\n super();\n this.name = opt.name;\n this.local = opt.local;\n this.prefix = opt.prefix;\n this.uri = opt.uri || \"\";\n\n this.attributes = Object.assign(\n {},\n ...Object.keys(opt.attributes).map((key) => ({\n [key]: new Attribute(opt.attributes[key]),\n })),\n );\n\n this[text] = [];\n }\n\n public get root(): Node {\n return this.parent ? this.parent.root : this;\n }\n\n public get text() {\n return this[text].join(\"\");\n }\n\n public static pushText(node: Node, value: string) {\n node[text].push(value);\n if (node.parent) {\n node.parent[text].push(value);\n }\n }\n\n public static addNode(parent: Node, opt: NodeInput) {\n const node = new Node(opt, parent);\n parent.push(node);\n return node;\n }\n\n public getAttributes(uri?: string) {\n return Object.assign(\n {},\n ...Object.keys(this.attributes)\n .filter((key) => {\n const attribute = this.attributes[key];\n return (uri && attribute.uri === uri) || (!uri && !attribute.uri);\n })\n .map((key) => ({ [this.attributes[key].local]: this.attributes[key].value })),\n );\n }\n\n public getAttribute(name: string, uri?: string): string | undefined {\n const attribute = this.getAttributeNode(name, uri) || { value: undefined };\n if (attribute) {\n return attribute.value;\n }\n }\n\n public getAttributeNode(name: string, uri?: string): Attribute | undefined {\n return Object.entries(this.attributes)\n .filter(([, attribute]) => {\n if (name && uri) {\n return name === attribute.local && uri === attribute.uri;\n }\n\n return attribute.name === name;\n })\n .map(([, attribute]) => attribute)\n .shift();\n }\n\n public hasAttribute(name: string, uri?: string): boolean {\n return !!this.getAttributeNode(name, uri);\n }\n\n public query(path: string, uri?: string): Node[] {\n const result: Node[] = [];\n const searchUri = uri || \"\";\n let match: { (node: Node): Node[] };\n\n if (path === \"/\") {\n return [this];\n }\n\n if (0 === path.indexOf(\"/\")) {\n const parts = path.split(\"/\").slice(1);\n if (parts.length === 1) {\n match = (node) => (parts[0] === node.local && searchUri === node.uri ? [node] : []);\n } else if (parts.length > 1) {\n match = (node) =>\n parts[0] === node.local\n ? [...node.query(\"/\".concat(parts.slice(1).join(\"/\")), uri)]\n : [];\n } else {\n return [];\n }\n } else if (-1 !== path.indexOf(\"/\")) {\n const parts = path.split(\"/\");\n match = (node) =>\n parts[0] === node.local\n ? [...node.query(parts.slice(1).join(\"/\"), uri)]\n : [...node.query(path, uri)];\n } else {\n match = (node) =>\n path === node.local && searchUri === node.uri\n ? [node, ...node.query(path, uri)]\n : [...node.query(path, uri)];\n }\n\n for (const node of this) {\n result.push(...match(node));\n }\n\n return result;\n }\n}\n\nexport class Attribute {\n public readonly name: string;\n\n public readonly local: string;\n\n public readonly value: string;\n\n public readonly prefix: string;\n\n public readonly uri: string;\n\n constructor(opt: AttributeInput) {\n this.value = opt.value;\n this.prefix = opt.prefix;\n this.name = opt.name;\n this.local = opt.local;\n this.uri = opt.uri;\n }\n\n public toString() {\n return this.value;\n }\n}\n"
],
"mappings": "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",
"debugId": "8D31E78F3EF932FE64756E2164756E21",
"names": []
}