export const onDomReady = (resolve) => { if (document.readyState !== "loading") { resolve(); return; } const d = () => { document.removeEventListener("DOMContentLoaded", d); resolve(); }; document.addEventListener("DOMContentLoaded", d); }; const done = Promise.resolve(); const prepared = () => done; export const ComponentHelper = { waitForReady: () => { const p = new Promise((resolve) => onDomReady(resolve)); Object.defineProperty(ComponentHelper, "waitForReady", { value: () => p }); return p; }, prepareOnce(e: HTMLElement & { prepare(): Promise }) { ComponentHelper.waitForReady().then(() => { const r = e.prepare().catch(console.error); Object.defineProperty(e, "prepare", { value: prepared }); return r; } ); }, getParentAttribute(target: HTMLElement, map: (x: HTMLElement) => any) { if (!target) { return; } do { const value = map(target); if (value) { return { target, value }; } target = target.parentElement; } while(target); return {}; }, findAncestorOrSelf(target: HTMLElement, filter: (x: HTMLElement) => boolean) { while(target) { if(filter(target)) { return target; } target = target.parentElement; } } }