export const waitForElement = async ( selector: string, { parent = document.documentElement, signal }: { parent?: Element; signal?: AbortSignal } = {}, ): Promise => { const element = parent.querySelector(selector); return new Promise((resolve, reject) => { if (element) { return resolve(element); } const observer = new MutationObserver((_, obs) => { const element = parent.querySelector(selector); if (element) { obs.disconnect(); // stop observing return resolve(element); } }); observer.observe(parent, { childList: true, subtree: true, }); signal?.addEventListener('abort', () => { observer.disconnect(); reject(new DOMException('Aborted', 'AbortError')); }); }); };