UNPKG

@funnelenvy-npm/fe-dev-utils

Version:

Helper function to build client side A/B tests

56 lines (55 loc) 2.29 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const on_error_1 = __importDefault(require("../on-error")); const getElement = ({ condition, activity = "", errorHandler = null, outTimer = 10000, }) => { let selectors = Array.isArray(condition) ? condition : [condition]; let results = {}; return new Promise((resolve, reject) => { const observer = new MutationObserver(() => { selectors = selectors.filter((selector) => { const els = document.querySelectorAll(selector); if (els.length > 0) { results[selector] = els; return false; // Remove from selectors to check } return true; }); if (selectors.length === 0) { observer.disconnect(); resolve(results); } }); // Initial check in case elements are already present selectors.forEach((selector) => { const els = document.querySelectorAll(selector); if (els.length > 0) { results[selector] = els; selectors = selectors.filter((s) => s !== selector); // Remove found selector } }); if (selectors.length === 0) { resolve(results); return; } // Observe mutations in the document observer.observe(document.body, { childList: true, subtree: true }); // Set a timeout to reject the promise if elements are not found within the given time setTimeout(() => { observer.disconnect(); if (selectors.length > 0) { const error = new Error(`Timeout while waiting for selectors: ${selectors.join(', ')}`); if (errorHandler && typeof errorHandler === 'function') { errorHandler({ activity, error }); } else { (0, on_error_1.default)({ activity, error }); } reject(error); } }, outTimer); }); }; exports.default = getElement;