UNPKG

@stimulus-library/mixins

Version:

A library of useful controllers for Stimulus

38 lines (37 loc) 1.71 kB
import { useMixin } from "./use_mixin"; export function useInjectedFragment(controller, targetElement, insertPosition, fragment, options = {}) { const nodes = Array.from(fragment.childNodes); const setup = () => { const parent = targetElement.parentElement; if (["beforebegin", "afterend"].includes(insertPosition) && parent == null) { throw new Error("Cannot insert beforebegin into a node with no parent"); } switch (insertPosition) { case "beforeend": targetElement.append(fragment); break; case "afterbegin": targetElement.prepend(fragment); break; case "beforebegin": parent.insertBefore(fragment, targetElement); break; case "afterend": parent.insertBefore(fragment, targetElement); break; } }; const teardown = options.cleanup ? () => nodes.forEach(node => node.remove()) : () => void 0; useMixin(controller, setup, teardown); return [nodes, teardown]; } export function useInjectedHTML(controller, targetElement, insertPosition, html, options = {}) { const fragment = document.createRange().createContextualFragment(html); return useInjectedFragment(controller, targetElement, insertPosition, fragment, options); } export function useInjectedElement(controller, targetElement, insertPosition, element, options = {}) { const fragment = new DocumentFragment(); fragment.append(element); const [nodes, teardown] = useInjectedFragment(controller, targetElement, insertPosition, fragment, options); return [nodes[0], teardown]; }