1import * as assert from 'node:assert'; 2import { html, parse, parseFragment, serialize, serializeOuter, type DefaultTreeAdapterMap } from 'parse5'; 3import { generateSerializerTests } from 'parse5-test-utils/utils/generate-serializer-tests.js'; 4import { treeAdapters } from 'parse5-test-utils/utils/common.js'; 5 6generateSerializerTests('serializer', 'Serializer', serialize); 7 8describe('serializer', () => { 9 describe("Regression - Get text node's parent tagName only if it's an Element node (GH-38)", () => { 10 it('serializes correctly', () => { 11 const document = parse('<template>yo<div></div>42</template>'); 12 const treeAdapter: typeof treeAdapters.default = { 13 ...treeAdapters.default, 14 getTagName: (element: DefaultTreeAdapterMap['element']) => { 15 assert.ok(element.tagName); 16 17 return treeAdapters.default.getTagName(element); 18 }, 19 }; 20 21 serialize(document, { treeAdapter }); 22 }); 23 }); 24 25 describe('serializeOuter', () => { 26 it('serializes outerHTML correctly', () => { 27 const document = parseFragment('<div><button>Hello</button></div>'); 28 const div = document.childNodes[0]; 29 assert.ok(treeAdapters.default.isElementNode(div)); 30 const html = serializeOuter(div); 31 32 assert.equal(html, '<div><button>Hello</button></div>'); 33 }); 34 }); 35 36 it('serializes <template> elements inner content', () => { 37 const document = parseFragment('<template><button>Hello</button></template>'); 38 const template = document.childNodes[0]; 39 assert.ok(treeAdapters.default.isElementNode(template)); 40 const html = serialize(template); 41 42 assert.equal(html, '<button>Hello</button>'); 43 }); 44 45 it('serializes the children of void elements as the empty string (GH-289)', () => { 46 const br = treeAdapters.default.createElement('br', html.NS.HTML, []); 47 48 // Add child node to `br`, to make sure they are skipped. 49 treeAdapters.default.appendChild(br, treeAdapters.default.createElement('div', html.NS.HTML, [])); 50 51 assert.equal(serialize(br), ''); 52 53 // If the namespace is not HTML, the serializer should not skip the children. 54 const svgBr = treeAdapters.default.createElement('br', html.NS.SVG, []); 55 treeAdapters.default.appendChild(svgBr, treeAdapters.default.createElement('div', html.NS.HTML, [])); 56 57 assert.equal(serialize(svgBr), '<div></div>'); 58 }); 59 60 it('serializes unknown node to empty string', () => { 61 const unknown: any = {}; 62 assert.strictEqual(serialize(unknown), ''); 63 assert.strictEqual(serializeOuter(unknown), ''); 64 }); 65}); 66