UNPKG

@applitools/utils

Version:
259 lines (258 loc) 10.2 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.zip = exports.dedupAndMap = exports.deepEqual = exports.pluralize = exports.extend = exports.wrap = exports.batchify = exports.cachify = exports.absolutizeUrl = exports.removeUndefinedProps = exports.toUriEncoding = exports.toUnAnchoredUri = exports.toString = exports.toJSON = exports.sleep = exports.jwtDecode = exports.shortid = exports.guid = exports.getEnvValue = void 0; const buffer_1 = require("buffer"); const types = __importStar(require("./types")); function getEnvValue(name, type) { if (!process) return undefined; const value = process.env[`APPLITOOLS_${name}`]; if (value === undefined || value === 'null') return undefined; if (type === 'boolean') return ['true', true, '1', 1].includes(value); if (type === 'number') return Number(value); return value; } exports.getEnvValue = getEnvValue; function guid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { const r = (Math.random() * 16) | 0; const v = c === 'x' ? r : (r & 0x3) | 0x8; return v.toString(16); }); } exports.guid = guid; function shortid() { return 'xxx'.replace(/[x]/g, () => { const r = (Math.random() * 36) | 0; return r.toString(36); }); } exports.shortid = shortid; function jwtDecode(token) { let payloadSeg = token.split('.')[1]; payloadSeg += new Array(5 - (payloadSeg.length % 4)).join('='); payloadSeg = payloadSeg.replace(/-/g, '+').replace(/_/g, '/'); return JSON.parse(buffer_1.Buffer.from(payloadSeg, 'base64').toString()); } exports.jwtDecode = jwtDecode; function sleep(ms) { if (types.isNumber(ms)) { return new Promise(resolve => setTimeout(resolve, ms)); } } exports.sleep = sleep; function toJSON(object, props) { if (!types.isObject(object)) return object; if (types.isArray(object)) { return object.map(value => (value && types.isFunction(value.toJSON) ? value.toJSON() : toJSON(value))); } const original = props ? Object.values(props) : Object.keys(object); const keys = !props || types.isArray(props) ? original : Object.keys(props); return keys.reduce((plain, key, index) => { const value = object[original[index]]; plain[key] = value && types.isFunction(value.toJSON) ? value.toJSON() : toJSON(value); return plain; }, {}); } exports.toJSON = toJSON; function toString(object) { return `${object.constructor.name} ${JSON.stringify(object, null, 2)}`; } exports.toString = toString; function toUnAnchoredUri(url) { var _a; const [, result = url] = (_a = url.match(/(^[^#]*)/)) !== null && _a !== void 0 ? _a : []; return result === null || result === void 0 ? void 0 : result.replace(/\?\s*$/, '?'); } exports.toUnAnchoredUri = toUnAnchoredUri; function toUriEncoding(url) { return url.replace(/(\\[0-9a-fA-F]{1,6}\s?)/g, s => { return String.fromCodePoint(Number.parseInt(s.substring(1).trim(), 16)); }); } exports.toUriEncoding = toUriEncoding; function removeUndefinedProps(object) { return Object.entries(object).reduce((object, [key, value]) => (value !== undefined ? Object.assign(object, { [key]: value }) : object), {}); } exports.removeUndefinedProps = removeUndefinedProps; function absolutizeUrl(url, baseUrl) { return new URL(url, baseUrl).href; } exports.absolutizeUrl = absolutizeUrl; function cachify(func, getKey) { const cache = new Map(); const funcWithCache = ((...args) => { var _a; const key = stringifyKey((_a = getKey === null || getKey === void 0 ? void 0 : getKey(args)) !== null && _a !== void 0 ? _a : args); let value = cache.get(key); if (!value) { value = func(...args); cache.set(key, value); } return value; }); funcWithCache.clearCache = () => cache.clear(); funcWithCache.getCachedValues = () => Array.from(cache.values()); funcWithCache.setCachedValue = (key, value) => cache.set(stringifyKey(key), value); return funcWithCache; function stringifyKey(key) { key = types.isPlainObject(key) ? Object.fromEntries(Object.entries(key).sort(([key1], [key2]) => (key1 > key2 ? 1 : -1))) : key; return JSON.stringify(key, (_key, value) => (typeof value === 'function' ? value.toString() : value)); } } exports.cachify = cachify; function batchify(func, { timeout, maxPending }) { const pendingInputs = new Map(); let throttleTimer = false; return function (input) { return new Promise(async (resolve, reject) => { pendingInputs.set(input, { resolve, reject }); if (!throttleTimer) { throttleTimer = setTimeout(invoke, timeout); } if (maxPending && pendingInputs.size >= maxPending) { invoke(); } }); }; function invoke() { if (pendingInputs.size) { func(Array.from(pendingInputs.entries())); pendingInputs.clear(); if (throttleTimer) clearTimeout(throttleTimer); throttleTimer = false; } } } exports.batchify = batchify; function wrap(func, wrapper) { return new Proxy(func, { apply: (func, _this, args) => wrapper(func, ...args), }); } exports.wrap = wrap; function extend(target, extension) { const result = {}; return Object.defineProperties(result, { ...Object.fromEntries(Object.entries(Object.getOwnPropertyDescriptors(target)).map(([key, descriptor]) => [ key, types.isFunction(descriptor.value) || types.isObject(descriptor.value) ? descriptor : { configurable: descriptor.configurable, enumerable: descriptor.enumerable, get: () => target[key], set: value => (target[key] = value), }, ])), ...Object.getOwnPropertyDescriptors(types.isFunction(extension) ? extension(result) : extension), }); } exports.extend = extend; function pluralize(object, config) { const count = types.isArray(object) ? object.length : object; const isMany = count > 1; let res = isMany ? 's' : ''; if (config) { res = isMany ? config[0] : config[1]; } return res; } exports.pluralize = pluralize; function deepEqual(value1, value2) { return _deepEqual(value1, value2, new Set()); } exports.deepEqual = deepEqual; function _deepEqual(value1, value2, visitedObjects) { if (value1 === value2) return true; if (visitedObjects.has(value1) && visitedObjects.has(value2)) throw new Error('circular reference'); if (typeof value1 === 'object' && typeof value2 === 'object') { visitedObjects.add(value1); visitedObjects.add(value2); } if (types.isArray(value1) && types.isArray(value2)) { if (value1.length !== value2.length) return false; for (let i = 0; i < value1.length; i++) { if (!_deepEqual(value1[i], value2[i], visitedObjects)) return false; } return true; } if (types.isObject(value1) && types.isObject(value2)) { const keys1 = Object.keys(value1); const keys2 = Object.keys(value2); if (keys1.length !== keys2.length) return false; for (const key of keys1) { if (!_deepEqual(value1[key], value2[key], visitedObjects)) return false; } return true; } return false; } /** * Deduplicates an array based on a custom equality function, applies an asynchronous transformation * to the unique values, and maps the results back to the original array structure. * * @param items - The array of items to process. * @param transform - A function that receives unique items and returns transformed results. * @param isEqual - A function that determines whether two items are considered equal. * @returns A Promise resolving to an array where each item is replaced with its transformed result. */ async function dedupAndMap(items, transform, isEqual) { // Extract unique values const firstIndecies = items.map(value => items.findIndex(v => isEqual(v, value))); const uniqueValues = items.filter((_, index) => firstIndecies.indexOf(index) === index); // Compute results for unique values const results = await transform(uniqueValues); // Map unique values to their transformed results const resultMap = new WeakMap(); uniqueValues.forEach((val, index) => resultMap.set(val, results[index])); return items.map((_, index) => resultMap.get(items[firstIndecies[index]])); } exports.dedupAndMap = dedupAndMap; /** * Zips two arrays together, yielding pairs of elements from each array. * If the arrays are of different lengths, the shorter length is used (it's the user res) */ function* zip(a, b) { const len = Math.min(a.length, b.length); for (let i = 0; i < len; i++) { yield [a[i], b[i]]; } } exports.zip = zip;