1 | const childNodes = (node) => {
|
2 | let frag = document.createDocumentFragment()
|
3 | while (node.firstChild) {
|
4 | frag.appendChild(node.firstChild)
|
5 | }
|
6 | return frag
|
7 | }
|
8 |
|
9 | export const mergeSlots = (targetNode, sourceNode) => {
|
10 | let namedSlots = sourceNode.querySelectorAll("slot[name]")
|
11 |
|
12 | namedSlots.forEach((slot) => {
|
13 | let name = slot.attributes.name.value
|
14 | let node = targetNode.querySelector(`[slot="${name}"]`)
|
15 | if (!node) {
|
16 | slot.parentNode.replaceChild(childNodes(slot), slot)
|
17 | return
|
18 | }
|
19 | node.removeAttribute("slot")
|
20 | slot.parentNode.replaceChild(node, slot)
|
21 | })
|
22 |
|
23 | let defaultSlot = sourceNode.querySelector("slot:not([name])")
|
24 |
|
25 | if (defaultSlot) {
|
26 | defaultSlot.parentNode.replaceChild(
|
27 | childNodes(targetNode.innerHTML.trim() ? targetNode : defaultSlot),
|
28 | defaultSlot
|
29 | )
|
30 | }
|
31 | }
|