• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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