diff --git a/src/node.spec.ts b/src/node.spec.ts index f350655e..a9d86a45 100644 --- a/src/node.spec.ts +++ b/src/node.spec.ts @@ -51,6 +51,14 @@ describe("Nodes", () => { expect(result.cloneNode(true)).toStrictEqual(result); }); + it("should preserve XML element types when cloning", () => { + const result = parse("", { xmlMode: true }); + const element = result.children[0]; + expect(element.type).toBe(ElementType.Tag); + expect(element.cloneNode().type).toBe(ElementType.Tag); + expect(result.cloneNode(true)).toStrictEqual(result); + }); + it("should not clone recursively if not asked to", () => { const result = parse("
"); expect(result.cloneNode(true)).toEqual(result); diff --git a/src/node.ts b/src/node.ts index 57669d37..5490fdfe 100644 --- a/src/node.ts +++ b/src/node.ts @@ -429,7 +429,12 @@ export function cloneNode(node: T, shouldRecurse = false): T { result = new Comment(node.data); } else if (isTag(node)) { const children = shouldRecurse ? cloneChildren(node.children) : []; - const clone = new Element(node.name, { ...node.attribs }, children); + const clone = new Element( + node.name, + { ...node.attribs }, + children, + node.type, + ); for (const child of children) { child.parent = clone; }