@applitools/utils
Version:
259 lines (258 loc) • 10.2 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.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;
;