@ezbot-ai/javascript-sdk
Version:
The easiest way to interact with ezbot via JS (node and browser)
281 lines • 20 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeGlobalVisualChange = exports.parseCommaSeparatedList = exports.makeVisualChanges = exports.makeVisualChange = exports.validateVisualPrediction = exports.showElement = exports.hideElement = exports.setElementStyle = exports.removeClassesFromElement = exports.addClassesToElement = exports.setElementSrc = exports.setElementHref = exports.addGlobalCSS = exports.setElementAttribute = exports.setElementInnerHTML = exports.setElementText = exports.visualChanges = exports.visualUtils = void 0;
/* eslint-disable functional/no-return-void */
/* eslint-disable functional/immutable-data */
/* eslint-disable functional/prefer-immutable-types */
const constants_1 = require("./constants");
const utils = __importStar(require("./utils"));
const utils_1 = require("./utils");
function setElementText(element, text) {
element.textContent = text;
}
exports.setElementText = setElementText;
function setElementInnerHTML(element, innerHTML) {
element.innerHTML = innerHTML;
}
exports.setElementInnerHTML = setElementInnerHTML;
function setElementAttribute(element, attribute, value) {
element.setAttribute(attribute, value);
}
exports.setElementAttribute = setElementAttribute;
function addClassesToElement(element, classes) {
if (classes.length === 0) {
utils.logInfo(`No classes to add to element.`);
return;
}
classes.forEach((className) => {
element.classList.add(className);
});
}
exports.addClassesToElement = addClassesToElement;
function removeClassesFromElement(element, classes) {
if (classes.length === 0) {
utils.logInfo(`No classes to remove from element.`);
return;
}
classes.forEach((className) => {
element.classList.remove(className);
});
}
exports.removeClassesFromElement = removeClassesFromElement;
function setElementStyle(element, value) {
setElementAttribute(element, 'style', value);
}
exports.setElementStyle = setElementStyle;
function setElementHref(element, href) {
setElementAttribute(element, 'href', href);
}
exports.setElementHref = setElementHref;
function setElementSrc(element, src) {
setElementAttribute(element, 'src', src);
}
exports.setElementSrc = setElementSrc;
function hideElement(element) {
element.style.display = 'none';
element.style.visibility = 'hidden';
}
exports.hideElement = hideElement;
function showElement(element) {
element.style.display = 'block';
element.style.visibility = 'visible';
}
exports.showElement = showElement;
function setElementOuterHTML(element, value) {
element.outerHTML = value;
}
function addGlobalCSS(key, value) {
const head = document.head;
if (!head) {
(0, utils_1.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);
}
exports.addGlobalCSS = addGlobalCSS;
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;
}
exports.validateVisualPrediction = validateVisualPrediction;
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;
}
exports.parseCommaSeparatedList = parseCommaSeparatedList;
function makeGlobalVisualChange(prediction) {
var _a;
const action = (_a = prediction.config) === null || _a === void 0 ? void 0 : _a.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.`);
}
}
exports.makeGlobalVisualChange = makeGlobalVisualChange;
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.`);
}
}
exports.makeVisualChange = makeVisualChange;
function makeVisualChanges() {
var _a;
const predictions = (_a = window.ezbot) === null || _a === void 0 ? void 0 : _a.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 &&
constants_1.globalVisualChanges.includes(prediction.config.action)) {
makeGlobalVisualChange(prediction);
return;
}
makeVisualChange(prediction);
});
}
exports.makeVisualChanges = makeVisualChanges;
const visualUtils = {
validateVisualPrediction,
parseCommaSeparatedList,
};
exports.visualUtils = visualUtils;
const visualChanges = {
setElementText,
setElementInnerHTML,
setElementAttribute,
addGlobalCSS,
setElementHref,
setElementSrc,
addClassesToElement,
removeClassesFromElement,
setElementStyle,
hideElement,
showElement,
makeVisualChange,
makeVisualChanges,
makeGlobalVisualChange,
};
exports.visualChanges = visualChanges;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsQ2hhbmdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdmlzdWFsQ2hhbmdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUE4QztBQUM5Qyw4Q0FBOEM7QUFDOUMsc0RBQXNEO0FBQ3RELDJDQUFrRDtBQUVsRCwrQ0FBaUM7QUFDakMsbUNBQWtDO0FBRWxDLFNBQVMsY0FBYyxDQUFDLE9BQWdCLEVBQUUsSUFBWTtJQUNwRCxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUM3QixDQUFDO0FBd1JDLHdDQUFjO0FBdFJoQixTQUFTLG1CQUFtQixDQUFDLE9BQWdCLEVBQUUsU0FBaUI7SUFDOUQsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDaEMsQ0FBQztBQXFSQyxrREFBbUI7QUFuUnJCLFNBQVMsbUJBQW1CLENBQzFCLE9BQW9CLEVBQ3BCLFNBQWlCLEVBQ2pCLEtBQWE7SUFFYixPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBOFFDLGtEQUFtQjtBQTVRckIsU0FBUyxtQkFBbUIsQ0FBQyxPQUFvQixFQUFFLE9BQWlCO0lBQ2xFLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDL0MsT0FBTztJQUNULENBQUM7SUFDRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7UUFDNUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBd1FDLGtEQUFtQjtBQXZRckIsU0FBUyx3QkFBd0IsQ0FDL0IsT0FBb0IsRUFDcEIsT0FBaUI7SUFFakIsSUFBSSxP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