UNPKG

@ezbot-ai/javascript-sdk

Version:

The easiest way to interact with ezbot via JS (node and browser)

236 lines 17.7 kB
/* eslint-disable functional/no-return-void */ /* eslint-disable functional/immutable-data */ /* eslint-disable functional/prefer-immutable-types */ import { globalVisualChanges } from './constants'; import * as utils from './utils'; import { logInfo } from './utils'; function setElementText(element, text) { element.textContent = text; } function setElementInnerHTML(element, innerHTML) { element.innerHTML = innerHTML; } function setElementAttribute(element, attribute, value) { element.setAttribute(attribute, value); } function addClassesToElement(element, classes) { if (classes.length === 0) { utils.logInfo(`No classes to add to element.`); return; } classes.forEach((className) => { element.classList.add(className); }); } function removeClassesFromElement(element, classes) { if (classes.length === 0) { utils.logInfo(`No classes to remove from element.`); return; } classes.forEach((className) => { element.classList.remove(className); }); } function setElementStyle(element, value) { setElementAttribute(element, 'style', value); } function setElementHref(element, href) { setElementAttribute(element, 'href', href); } function setElementSrc(element, src) { setElementAttribute(element, 'src', src); } function hideElement(element) { element.style.display = 'none'; element.style.visibility = 'hidden'; } function showElement(element) { element.style.display = 'block'; element.style.visibility = 'visible'; } function setElementOuterHTML(element, value) { element.outerHTML = value; } function addGlobalCSS(key, value) { const head = document.head; if (!head) { logInfo('No document head found: unable to add global css'); return; } const newStyleElement = document.createElement('style'); newStyleElement.innerText = value; newStyleElement.id = 'ezbot-global-css-' + key; head.appendChild(newStyleElement); } function validateVisualPrediction(prediction) { if (prediction.config == null) { return `No config found for prediction with key: ${prediction.key}. Skipping its visual change.`; } if (prediction.config.action === 'addGlobalCSS') { return null; } if (!prediction.config.selector) { return `No selector found for prediction with key: ${prediction.key}. Skipping its visual change.`; } if (!prediction.config.action) { return `No action found for prediction with key: ${prediction.key}. Skipping its visual change.`; } return null; } function parseCommaSeparatedList(list) { // if list is empty, return an empty array if (list.length === 0) { return []; } // if list has no commas, return it as an array if (list.indexOf(',') === -1) { return [list]; } const listArray = list.split(',').map((item) => item.trim()); return listArray; } function makeGlobalVisualChange(prediction) { const action = prediction.config?.action; switch (action) { case 'addGlobalCSS': addGlobalCSS(prediction.key, prediction.value); break; default: utils.logInfo(`Unsupported action for prediction with key: ${prediction.key}. Skipping its global change.`); } } function makeVisualChange(prediction) { if (!prediction.config) { utils.logInfo(`No config found for prediction with key: ${prediction.key}. Skipping its visual change.`); return; } const selector = prediction.config.selector; if (!selector) { utils.logInfo(`No selector found for prediction with key: ${prediction.key}. Skipping its visual change.`); return; } const element = utils.safeQuerySelector(selector); if (!element || !(element instanceof HTMLElement)) { utils.logInfo(`No HTML element found for prediction with key: ${prediction.key}. Skipping its visual change.`); return; } const action = prediction.config.action; switch (action) { case 'setText': setElementText(element, prediction.value); break; case 'setInnerHTML': setElementInnerHTML(element, prediction.value); break; case 'setAttribute': if (!prediction.config.attribute) { utils.logInfo(`No attribute found for prediction with key: ${prediction.key}. Skipping its visual change.`); return; } setElementAttribute(element, prediction.config.attribute, prediction.value); break; case 'addClasses': addClassesToElement(element, parseCommaSeparatedList(prediction.value)); break; case 'removeClasses': removeClassesFromElement(element, parseCommaSeparatedList(prediction.value)); break; case 'setHref': if (element instanceof HTMLAnchorElement) { setElementHref(element, prediction.value); } else { utils.logInfo(`Element with selector: ${prediction.config.selector} is not an anchor element. Skipping its visual change.`); } break; case 'setStyle': setElementStyle(element, prediction.value); break; case 'setSrc': if (element instanceof HTMLImageElement) { setElementSrc(element, prediction.value); } else { utils.logInfo(`Element with selector: ${prediction.config.selector} is not an image element. Skipping its visual change.`); } break; case 'hide': hideElement(element); break; case 'show': showElement(element); break; case 'setFontSize': setElementStyle(element, `font-size: ${prediction.value}`); break; case 'setFontColor': setElementStyle(element, `color: ${prediction.value}`); break; case 'setBackgroundColor': setElementStyle(element, `background-color: ${prediction.value}`); break; case 'setVisibility': // eslint-disable-next-line no-case-declarations const val = prediction.value.toLowerCase(); if (val === 'hide') { hideElement(element); break; } else if (val === 'show') { showElement(element); break; } utils.logInfo("unsupported value for 'setVisibility' action", prediction.value); break; case 'setOuterHTML': setElementOuterHTML(element, prediction.value); break; default: utils.logInfo(`Unsupported action for prediction with key: ${prediction.key}. Skipping its visual change.`); } } function makeVisualChanges() { const predictions = window.ezbot?.predictions; if (!predictions) { utils.logInfo('No predictions found. Skipping visual changes.'); return; } predictions.forEach((prediction) => { if (prediction.type != 'visual') { return; } const validationError = validateVisualPrediction(prediction); if (validationError != null) { utils.logInfo(validationError); return; } if (prediction.config && globalVisualChanges.includes(prediction.config.action)) { makeGlobalVisualChange(prediction); return; } makeVisualChange(prediction); }); } const visualUtils = { validateVisualPrediction, parseCommaSeparatedList, }; const visualChanges = { setElementText, setElementInnerHTML, setElementAttribute, addGlobalCSS, setElementHref, setElementSrc, addClassesToElement, removeClassesFromElement, setElementStyle, hideElement, showElement, makeVisualChange, makeVisualChanges, makeGlobalVisualChange, }; export { visualUtils, visualChanges, setElementText, setElementInnerHTML, setElementAttribute, addGlobalCSS, setElementHref, setElementSrc, addClassesToElement, removeClassesFromElement, setElementStyle, hideElement, showElement, validateVisualPrediction, makeVisualChange, makeVisualChanges, parseCommaSeparatedList, makeGlobalVisualChange, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsQ2hhbmdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdmlzdWFsQ2hhbmdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7QUFDOUMsOENBQThDO0FBQzlDLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbEQsT0FBTyxLQUFLLEtBQUssTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVsQyxTQUFTLGNBQWMsQ0FBQyxPQUFnQixFQUFFLElBQVk7SUFDcEQsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDN0IsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsT0FBZ0IsRUFBRSxTQUFpQjtJQUM5RCxPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FDMUIsT0FBb0IsRUFDcEIsU0FBaUIsRUFDakIsS0FBYTtJQUViLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLE9BQW9CLEVBQUUsT0FBaUI7SUFDbEUsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUMvQyxPQUFPO0lBQ1QsQ0FBQztJQUNELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUM1QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFDRCxTQUFTLHdCQUF3QixDQUMvQixPQUFvQixFQUNwQixPQUFpQjtJQUVqQixJQUFJLE9BQU8s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