@ezbot-ai/javascript-sdk
Version:
The easiest way to interact with ezbot via JS (node and browser)
236 lines • 17.7 kB
JavaScript
/* 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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