UNPKG

@ezbot-ai/javascript-sdk

Version:

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

281 lines 20 kB
"use strict"; 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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