@nativerent/js-utils 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +82 -74
- package/dist/index.js +596 -650
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +139 -164
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +18 -1
- package/tests/tests.ts +129 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { FlattenableObject, Primitive, SimpleObject } from \"./types\";\n\nexport function debounce(fn: Function, delay: number): () => void {\n let timeout: ReturnType<typeof setTimeout>;\n\n return function (...args: any[]) {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn.apply(null, args), delay);\n };\n}\n\nexport function throttle(fn: Function, delay: number) {\n let lastCall = 0;\n\n return function (...args: any[]) {\n const now = new Date().getTime();\n if (now - lastCall < delay) {\n return;\n }\n lastCall = now;\n fn(...args);\n };\n}\n\nexport function isObject(value: any): value is object {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isFn(value: any): value is Function {\n return typeof value === \"function\";\n}\n\nexport function isStr(value: any): boolean {\n return typeof value === \"string\";\n}\n\nexport function isString(value: any): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Check if the given argument is a string which is not empty\n */\nexport function isNotEmptyString(value: any) {\n return isString(value) && value.length;\n}\n\nexport function isHTMLElement(value: any): value is HTMLElement {\n return value instanceof HTMLElement || value instanceof SVGElement;\n}\n\nexport function isNum(value: any): value is number {\n return typeof value === \"number\";\n}\n\nexport function isBool(value: any): value is boolean {\n return typeof value === \"boolean\";\n}\n\nexport function isUndef(value: any): value is undefined {\n return typeof value === \"undefined\";\n}\n\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || typeof value === \"undefined\";\n}\n\nexport function isDefined(value: any): boolean {\n return !isUndef(value);\n}\n\n/**\n * Returns an array containing all the elements of array1 that are not in array2 and vice-versa\n */\nexport function arrayDiff(\n array1: Array<Primitive | null | undefined>,\n array2: Array<Primitive | null | undefined>,\n): Array<Primitive | null | undefined> {\n return array1\n .filter((value) => !array2.includes(value))\n .concat(array2.filter((value: any) => !array1.includes(value)));\n}\n\n/**\n * Returns an array of elements present in array1 and array2\n */\nexport function arrayIntersect(\n array1: Array<Primitive | null | undefined>,\n array2: Array<Primitive | null | undefined>,\n) {\n return array1.filter((value) => array2.includes(value));\n}\n\nexport function deepCloneObject<Type>(object: Type): Type {\n return JSON.parse(JSON.stringify(object));\n}\n\nexport function getNumericStyleProp(prop: string, el: Element) {\n const styles: { [key: string]: any } = window.getComputedStyle(el);\n return !isNullOrUndef(styles[prop]) ? parseInt(styles[prop].slice(0, -2)) : 0;\n}\n\nexport function objectHasProp(\n obj: any,\n prop: string | number | symbol,\n): boolean {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n/**\n * Custom version of Object.keys()\n */\nexport function getObjectKeys(object: object): string[] {\n let key;\n let keys = [];\n\n for (key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n\n return keys;\n}\n\n/**\n * Convert an object to a query string\n * Works with primitive objects\n */\nexport function objectToQueryString(object: {\n [key: string | number]:\n | Primitive\n | Array<Primitive | null | undefined>\n | SimpleObject\n | { [key: string | number]: SimpleObject }\n | undefined\n | null;\n}): string {\n return Object.entries(object)\n .map(([k, v]) => {\n if (Array.isArray(v)) {\n return v\n .map((item) => `${k}[]=${encodeURIComponent(item || \"\")}`)\n .join(\"&\");\n } else if (isObject(v)) {\n return `${k}=${encodeURIComponent(JSON.stringify(v))}`;\n }\n return `${k}=${encodeURIComponent(v || \"\")}`;\n })\n .join(\"&\");\n}\n\nexport function countObjectInnerLength(object: {\n [key: string | number]: any[];\n}) {\n const obj = Object.values(object);\n const len = obj.length;\n\n if (len === 0) {\n return 0;\n } else if (len === 1) {\n return obj[0].length;\n } else {\n return obj.reduce((acc: any, cur) => {\n if (Array.isArray(acc)) {\n acc = acc.length;\n }\n if (cur) {\n acc += cur.length;\n }\n return acc;\n });\n }\n}\n\n/**\n * Check if the element is in viewport\n */\nexport function isElementVisible(element: HTMLElement, minVisiblePercent = 50) {\n const elementCoords = element.getBoundingClientRect();\n const elementHeight = elementCoords.height;\n\n if (!elementHeight) {\n return false;\n }\n\n const elementTop = elementCoords.top;\n const elementBottom = elementCoords.bottom;\n const viewPortHeight = window.innerHeight;\n\n const elementVisibleHeight =\n elementTop > 0\n ? // the element is in or below viewport\n viewPortHeight - elementTop\n : // the element is still in or above viewport\n elementBottom;\n\n return (elementVisibleHeight / elementHeight) * 100 >= minVisiblePercent;\n}\n\nexport function decodeSafeURL(url: string): string {\n try {\n return decodeURI(url);\n } catch (e) {\n return url;\n }\n}\n\nexport function getSafeURL(url?: string): string {\n url = url ? url : location.href;\n return encodeURI(decodeSafeURL(url));\n}\n\nexport function parseURL(url: string): URL {\n return new URL(url);\n}\n\nexport function encodeQueryString(url: string): string {\n if (url.length > 0) {\n const index = url.indexOf(\"?\");\n if (index >= 0) {\n return url.substring(0, index) + parseURL(url).search;\n }\n }\n\n return url;\n}\n\nexport function injectScript(filename: string): void {\n const script = document.createElement(\"script\");\n script.src = filename;\n script.async = true;\n document.head.appendChild(script);\n}\n\nexport function injectStyleLink(filename: string): void {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = filename;\n document.head.appendChild(link);\n}\n\nexport function toBinaryStr(str: string) {\n const encoder = new TextEncoder();\n // 1: split the UTF-16 string into an array of bytes\n const charCodes = encoder.encode(str);\n // 2: concatenate byte data to create a binary string\n return String.fromCharCode(...charCodes);\n}\n\n/**\n * Find a DOM element where an ad unit should be rendered to\n */\nexport function getHtmlElement(id: string) {\n return document.getElementById(id);\n}\n\n/**\n * Convert an HTML string into a list of nodes\n */\nexport function stringToHtmlElements(html: string): NodeListOf<ChildNode> {\n const template = createHtmlElement(\"div\");\n template.innerHTML = html.replace(/[\\r\\n]/gm, \"\").trim();\n return template.childNodes;\n}\n\n/**\n * Creates an HTML element and sets attributes\n */\nexport function createHtmlElement(\n type: string,\n attributes: { [key: string]: string } = {},\n): HTMLElement {\n const attrs = getObjectKeys(attributes);\n const element = document.createElement(type);\n\n if (attrs.length) {\n attrs.forEach((name) => {\n element.setAttribute(name, attributes[name]);\n });\n }\n\n return element;\n}\n\n/**\n * Insert HTML elements into DOM\n */\nexport function insertHtmlElements(\n nodes: NodeListOf<Node>,\n appendTo?: Element | ShadowRoot,\n) {\n appendTo = appendTo || document.body;\n\n const fragment = new DocumentFragment();\n\n for (let i = 0; i < nodes.length; i++) {\n // skip non tags and non text, 3 for text nodes\n if (!isHTMLElement(nodes[i]) && nodes[i].nodeType !== 3) {\n continue;\n }\n\n const node = nodes[i] as HTMLElement;\n let newNode;\n\n switch (node.nodeName.toLowerCase()) {\n case \"script\":\n const src = node.getAttribute(\"src\");\n\n if (!isNullOrUndef(src) && src.length > 0) {\n newNode = createScriptElement(\n src,\n false,\n flatHtmlAttributes(node.attributes),\n );\n } else {\n newNode = createScriptElement(\n node.innerHTML,\n true,\n flatHtmlAttributes(node.attributes),\n );\n }\n break;\n\n case \"style\":\n newNode = createStyleElement(node.textContent);\n break;\n\n case \"svg\":\n newNode = createSvgElement(\n node.innerHTML,\n flatHtmlAttributes(node.attributes),\n );\n break;\n\n case \"#text\":\n newNode = document.createTextNode(node.textContent ?? \"\");\n break;\n\n default:\n newNode = createHtmlElement(\n node.tagName,\n flatHtmlAttributes(node.attributes),\n );\n\n // recursive\n if (node.childNodes.length) {\n insertHtmlElements(node.childNodes, newNode);\n } else {\n newNode.innerHTML = node.innerHTML;\n }\n }\n\n fragment.appendChild(newNode);\n }\n\n appendTo.appendChild(fragment);\n}\n\n/**\n * Make a simple object which contains only attribute name and value\n */\nexport function flatHtmlAttributes(attributes?: NamedNodeMap) {\n let flatAttributes: { [key: string]: string } = {};\n\n if (!isNullOrUndef(attributes)) {\n for (let i = 0; i < attributes.length; i++) {\n let attr = attributes[i];\n\n if (!isUndef(attr)) {\n flatAttributes[attr.name] = attr.value;\n }\n }\n }\n\n return flatAttributes;\n}\n\n/**\n * Create a <script> element\n */\nexport function createScriptElement(\n js: string,\n inline: boolean = false,\n attributes: { [key: string]: string } = {},\n) {\n const attrs = isObject(attributes) ? getObjectKeys(attributes) : [];\n const element = createHtmlElement(\"script\") as HTMLScriptElement;\n\n if (attrs.length) {\n attrs.forEach((name) => {\n element.setAttribute(name, attributes[name]);\n });\n }\n\n if (inline) {\n element.appendChild(document.createTextNode(js));\n } else {\n element.async = true;\n element.src = js;\n }\n\n return element;\n}\n\n/**\n * Create a <style> element\n */\nexport function createStyleElement(css: string | null) {\n const element = createHtmlElement(\"style\");\n\n if (css) {\n element.appendChild(document.createTextNode(css));\n }\n\n return element;\n}\n\n/**\n * Create a <link> element\n */\nexport function createLinkElement(href: string) {\n const element = createHtmlElement(\"link\") as HTMLLinkElement;\n\n element.rel = \"stylesheet\";\n element.href = href;\n\n return element;\n}\n\n/**\n * Create svg elements\n */\nexport function createSvgElement(\n content: string,\n attributes: { [key: string]: string },\n) {\n const attrs = getObjectKeys(attributes);\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\n if (attrs.length) {\n attrs.forEach((name) => {\n element.setAttribute(name, attributes[name]);\n });\n }\n\n element.innerHTML = content;\n\n return element;\n}\n\n/**\n * Create an image element to use as a tracking pixel\n */\nexport function createPixelElement(src: string) {\n const image = document.createElement(\"img\");\n\n image.src = src;\n image.width = 1;\n image.height = 1;\n image.style.position = \"absolute\";\n image.style.left = \"-99999px\";\n\n return image;\n}\n\n/**\n * Append a new script element to the DOM head\n */\nexport function insertJs(js: string, inline = false) {\n const element = createScriptElement(js, inline);\n\n document.head.appendChild(element);\n}\n\n/**\n * Append a new style element to the DOM head\n */\nexport function insertCss(css: string, className?: string, external = false) {\n const element = external ? createLinkElement(css) : createStyleElement(css);\n\n if (className) {\n element.className = className;\n }\n\n document.head.appendChild(element);\n}\n\n/**\n * Get screen sizes\n */\nexport function getScreenSize(): { width: number; height: number } {\n let width, height;\n\n if (window.screen) {\n width = screen.width;\n height = screen.height;\n } else {\n width = window.innerWidth;\n height = window.innerHeight;\n }\n\n return {\n width: width,\n height: height,\n };\n}\n\n/**\n * Get a random integer between min and max\n */\nexport function getRandomInt(min = 0, max = 4294967295) {\n min = Math.ceil(min);\n max = Math.floor(max);\n\n return Math.floor(Math.random() * (max - min)) + min;\n}\n\n/**\n * Implementation of Java's String.hashCode() method\n */\nexport function hashCode(str: string) {\n let hash = 0,\n chr;\n\n for (let i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // convert to 32bit integer\n }\n\n return hash >>> 0;\n}\n\n/**\n * Executes a callback as soon as DOM is interactive\n */\nexport function onDOMReady(callback: Function, ...args: any[]) {\n if (\n document.readyState === \"interactive\" ||\n document.readyState === \"complete\"\n ) {\n callback(...args);\n } else {\n document.addEventListener(\"DOMContentLoaded\", () => callback(...args));\n }\n}\n\n/**\n * Calculate the percentage of two values\n *\n * @param a\n * @param b\n * @return number\n */\nexport function toPercent(a: number, b: number): number {\n return b > 0 ? (a / b) * 100 : 0;\n}\n\n/**\n * Make a camelCase string\n *\n * @param string\n * @return string\n */\nexport function toCamelCase(string: string): string {\n return string\n .split(new RegExp(/[-_.]/))\n .reduce(\n (a: string, b: string) => a + b.charAt(0).toUpperCase() + b.slice(1),\n );\n}\n\n/**\n * Make a snake_case string\n *\n * @param string\n * @return string\n */\nexport function toSnakeCase(string: string): string {\n return toCamelCase(string)\n .replace(/(^[A-Z])?([A-Z])/gm, \"$1_$2\")\n .toLowerCase();\n}\n\n/**\n * Transform the first letter of the given string to the upper case\n *\n * @param string\n * @return string\n */\nexport function capitalize(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * Registry independent string sorting\n *\n * @param first\n * @param second\n */\nexport function sortByAlphabet(first: string, second: string): number {\n return first.toLowerCase() > second.toLowerCase() ? 1 : -1;\n}\n\n/**\n * @param length\n * @return string of max length 100\n */\nexport function getRandomStr(length?: number): string {\n length = length ? (length > 100 ? 100 : length) : 10;\n\n let str = Math.random().toString(36).substring(2);\n\n while (str.length < length) {\n str += Math.random().toString(36).substring(2);\n }\n\n const result = str.slice(-length);\n return isNaN(Number(result)) ? result : getRandomStr(length);\n}\n\nexport function getRandomItem(items: any[]): any {\n return items[Math.floor(Math.random() * items.length)];\n}\n\n/**\n * Summarize elements of the given array\n *\n * @param values\n * @return number | string - a summary of all the numbers in the array or an empty string if\n * there was only NaNs\n */\nexport function sumArray(values: Array<any>): number | string {\n if (values.every((value: any) => isNaN(value))) {\n return \"\";\n } else {\n return values.reduce((sum: any, curr: any) => {\n const value = Number(curr);\n\n if (!isNaN(value)) {\n return sum + value;\n } else {\n return sum;\n }\n }, 0);\n }\n}\n\n/**\n * Returns an array of the object keys which values are not present in filter\n *\n * @param obj\n * @param values\n */\nexport function filterObjectKeysByValues(\n obj: { [key: string]: any },\n values: Array<string | number | boolean | null | undefined>,\n): string[] {\n values = Array.isArray(values) ? values : Array(values);\n\n const keys = [];\n\n for (const key in obj) {\n if (!values.includes(obj[key])) {\n keys.push(key);\n }\n }\n\n return keys;\n}\n\nexport function getFromObject(object: object, key: string): any {\n return key.split(\".\").reduce((a: any, b: any) => {\n return a[b];\n }, object);\n}\n\nexport function fireBlurEvent(\n element: string | Element | null,\n delay: number = 0,\n): void {\n fireEvent(\"blur\", element, delay);\n}\n\nexport function fireInputEvent(\n element: string | Element | null,\n delay: number = 0,\n): void {\n fireEvent(\"input\", element, delay);\n}\n\nexport function fireEvent(\n eventName: string,\n element: string | Element | null,\n delay: number = 0,\n): void {\n setTimeout(() => {\n if (isString(element)) {\n element = document.querySelector(element);\n }\n\n if (!isNullOrUndef(element)) {\n element.dispatchEvent(\n new Event(eventName, {\n bubbles: true,\n }),\n );\n }\n }, delay);\n}\n\nexport function hasObjectChanged(\n object: { [key: string]: any },\n values: any[],\n): boolean {\n let hasChanged = false;\n\n for (const key in object) {\n let oldVal = object[key];\n let [, newVal] = values.find(([newKey]) => key === newKey);\n\n if (isObject(oldVal)) {\n if (!isObject(newVal)) {\n hasChanged = true;\n } else {\n hasChanged = hasObjectChanged(oldVal, Object.entries(newVal));\n }\n } else if (Array.isArray(newVal) || Array.isArray(oldVal)) {\n newVal = Array.isArray(newVal) ? newVal : [];\n oldVal = Array.isArray(oldVal) ? oldVal : [];\n hasChanged =\n getObjectKeys(oldVal).length !== getObjectKeys(newVal).length;\n if (!hasChanged) {\n hasChanged = arrayDiff(newVal, oldVal).length > 0;\n }\n } else {\n hasChanged = areDiff(newVal, oldVal);\n }\n\n if (hasChanged) {\n break;\n }\n }\n\n return hasChanged;\n}\n\nexport function roundBigNum(number: number): number {\n const digitsNum = Math.trunc(number).toString().length;\n\n let roundTo = 0;\n switch (true) {\n case digitsNum > 2 && digitsNum < 5:\n roundTo = 100;\n break;\n case digitsNum >= 5:\n roundTo = 10000;\n break;\n }\n\n return roundTo ? Math.round(number / roundTo) * roundTo : number;\n}\n\nexport function extractNumbers(value: any): string {\n if (!isStr(value) && !isNum(value)) {\n return \"\";\n }\n return value.toString().replace(/[^0-9]/g, \"\");\n}\n\nexport function removeSpaces(value: any): string {\n if (!isStr(value) && !isNum(value)) {\n return \"\";\n }\n return value.toString().replace(/\\s/g, \"\");\n}\n\nexport function roundUp(num: number, precision: number): number {\n const multiplier = Number(\"1\".padEnd(precision + 1, \"0\"));\n return Math.ceil(num * multiplier) / multiplier;\n}\n\nexport function roundDown(num: number, precision: number): number {\n const multiplier = Number(\"1\".padEnd(precision + 1, \"0\"));\n return Math.floor(num * multiplier) / multiplier;\n}\n\nexport function areDiff(\n val1?: Primitive | null,\n val2?: Primitive | null,\n strict?: boolean,\n): boolean {\n if (strict) {\n return val1 !== val2;\n }\n\n // at least one value is not empty\n if (Boolean(val1) || Boolean(val2)) {\n return val1 != val2;\n }\n\n // both empty, but not equally empty!\n // each one may be one of: empty string, null or undefined\n return false;\n}\n\nexport function flattenObject(obj: FlattenableObject, prefix = \"\") {\n return Object.keys(obj).reduce((acc, k) => {\n const pre = prefix.length ? prefix + \".\" : \"\";\n if (\n (isObject(obj[k]) || Array.isArray(obj[k])) &&\n getObjectKeys(obj[k]).length > 0\n ) {\n Object.assign(acc, flattenObject(obj[k], pre + k));\n } else {\n acc[pre + k] = obj[k];\n }\n return acc;\n }, {} as FlattenableObject);\n}\n\nexport function flattenObjectAsArray(obj: FlattenableObject) {\n const result: FlattenableObject = {};\n const flat = flattenObject(obj);\n Object.keys(flat).forEach((key) => {\n const newKey = key.replaceAll(/\\.([^.]+)/g, \"[$1]\");\n result[newKey] = flat[key];\n });\n\n return result;\n}\n\nexport function parseObjectPathStr(pathStr: string): string[] {\n const pathParts = pathStr.replace(/\\[/g, \".\").replace(/\\]/g, \"\").split(\".\");\n\n if (pathParts.length > 1 && pathParts[1].includes(\"[\")) {\n return [pathParts[0], ...parseObjectPathStr(pathParts[1])];\n }\n\n return pathParts;\n}\n\nexport function formatNumber(\n num: number | string,\n fractionDigits?: number,\n): string {\n fractionDigits = isNullOrUndef(fractionDigits) ? 2 : fractionDigits;\n return new Intl.NumberFormat(\"ru-RU\", {\n style: \"decimal\",\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n })\n .format(Number(num))\n .replace(\",\", \".\")\n .replace(/\\u00A0/g, \" \"); // charCode 160, White-space\n}\n\nexport function formatNumberWithSign(\n num: number | string,\n fractionDigits?: number,\n): string {\n return formatWithSign(num, formatNumber(num, fractionDigits));\n}\n\nexport function formatPercent(num: number | string): string {\n return formatNumber(num) + \"%\";\n}\n\nexport function formatWithSign(\n num: number | string,\n numString?: string,\n): string {\n numString = numString ? numString : num.toString();\n return (Number(num) < 0 ? \"\" : \"+\") + numString;\n}\n\nexport function autoSizeText(\n el: HTMLElement,\n height: number,\n minFontSize: number,\n maxFontSize: number = 50,\n) {\n let attempts = 30;\n\n const resizeText = () => {\n if (getTextHeight() === 0) {\n return;\n }\n while (attempts && getTextHeight() > height) {\n attempts--;\n reduceText();\n }\n while (attempts && getTextHeight() < height) {\n attempts--;\n enlargeText();\n }\n };\n\n const reduceText = () => {\n const fontSize = getNumericStyleProp(\"fontSize\", el);\n const newFontSize = fontSize - 1;\n if (fontSize > 1 && newFontSize >= minFontSize) {\n el.style.fontSize = `${newFontSize}px`;\n }\n };\n\n const enlargeText = () => {\n const fontSize = getNumericStyleProp(\"fontSize\", el);\n const newFontSize = fontSize + 1;\n if (newFontSize <= maxFontSize) {\n el.style.fontSize = `${newFontSize}px`;\n }\n };\n\n const getTextHeight = () =>\n Math.floor(\n el.scrollHeight -\n getNumericStyleProp(\"paddingTop\", el) -\n getNumericStyleProp(\"paddingBottom\", el),\n );\n\n resizeText();\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { Primitive, SimpleObject } from \"./types\";\n\nexport function debounce(fn: Function, delay: number): () => void {\n let timeout: ReturnType<typeof setTimeout>;\n\n return function (...args: any[]) {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn.apply(null, args), delay);\n };\n}\n\nexport function throttle(fn: Function, delay: number) {\n let lastCall = 0;\n\n return function (...args: any[]) {\n const now = new Date().getTime();\n if (now - lastCall < delay) {\n return;\n }\n lastCall = now;\n fn(...args);\n };\n}\n\nexport function isObject(value: any): value is object {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isFn(value: any): value is Function {\n return typeof value === \"function\";\n}\n\nexport function isStr(value: any): boolean {\n return typeof value === \"string\";\n}\n\nexport function isString(value: any): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Check if the given argument is a string which is not empty\n */\nexport function isNotEmptyString(value: any) {\n return isString(value) && value.length > 0;\n}\n\nexport function isHTMLElement(value: any): value is HTMLElement {\n return value instanceof HTMLElement || value instanceof SVGElement;\n}\n\nexport function isNum(value: any): value is number {\n return typeof value === \"number\";\n}\n\nexport function isBool(value: any): value is boolean {\n return typeof value === \"boolean\";\n}\n\nexport function isUndef(value: any): value is undefined {\n return typeof value === \"undefined\";\n}\n\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || typeof value === \"undefined\";\n}\n\nexport function isDefined(value: any): boolean {\n return !isUndef(value);\n}\n\n/**\n * Returns an array containing all the elements of array1 that are not in array2 and vice-versa\n */\nexport function arrayDiff(\n array1: Array<Primitive | null | undefined>,\n array2: Array<Primitive | null | undefined>,\n): Array<Primitive | null | undefined> {\n return array1\n .filter((value) => !array2.includes(value))\n .concat(array2.filter((value: any) => !array1.includes(value)));\n}\n\n/**\n * Returns an array of elements present in array1 and array2\n */\nexport function arrayIntersect(\n array1: Array<Primitive | null | undefined>,\n array2: Array<Primitive | null | undefined>,\n) {\n const set = new Set(array2);\n return array1.filter((value) => set.has(value));\n}\n\nexport function deepCloneObject<Type>(object: Type): Type {\n return JSON.parse(JSON.stringify(object));\n}\n\n// todo: non-px values\nexport function getNumericStyleProp(prop: string, el: Element) {\n const styles: { [key: string]: any } = window.getComputedStyle(el);\n return !isNullOrUndef(styles[prop]) ? parseFloat(styles[prop] || 0) : 0;\n}\n\nexport function objectHasProp(\n obj: any,\n prop: string | number | symbol,\n): boolean {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n/**\n * Custom version of Object.keys()\n */\nexport function getObjectKeys(object: object): string[] {\n let key;\n let keys = [];\n\n for (key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n\n return keys;\n}\n\n/**\n * Convert an object to a query string\n * Works with primitive objects\n */\nexport function objectToQueryString(object: {\n [key: string | number]:\n | Primitive\n | Array<Primitive | null | undefined>\n | SimpleObject\n | { [key: string | number]: SimpleObject }\n | undefined\n | null;\n}): string {\n return Object.entries(object)\n .map(([k, v]) => {\n if (Array.isArray(v)) {\n return v\n .map((item) => `${k}[]=${encodeURIComponent(item || \"\")}`)\n .join(\"&\");\n } else if (isObject(v)) {\n return `${k}=${encodeURIComponent(JSON.stringify(v))}`;\n }\n return `${k}=${encodeURIComponent(v || \"\")}`;\n })\n .join(\"&\");\n}\n\nexport function countObjectInnerLength(\n object: Record<string | number, any[] | null | undefined>,\n) {\n return Object.values(object).reduce(\n (sum, arr) => sum + (arr?.length ?? 0),\n 0,\n );\n}\n\n/**\n * Check if the element is in viewport\n */\nexport function isElementVisible(\n element: HTMLElement,\n minVisiblePercent = 50,\n): boolean {\n const { top, bottom, height } = element.getBoundingClientRect();\n if (!height) return false;\n\n const viewportTop = 0;\n const viewportBottom = window.innerHeight;\n\n const visibleTop = Math.max(top, viewportTop);\n const visibleBottom = Math.min(bottom, viewportBottom);\n const visibleHeight = Math.max(0, visibleBottom - visibleTop);\n\n return (visibleHeight / height) * 100 >= minVisiblePercent;\n}\n\nexport function decodeSafeURL(url: string): string {\n try {\n return decodeURI(url);\n } catch {\n return url;\n }\n}\n\nexport function getSafeURL(url?: string): string {\n url = url ? url : location.href;\n return encodeURI(decodeSafeURL(url));\n}\n\nexport function parseURL(url: string): URL {\n return new URL(url);\n}\n\nexport function encodeQueryString(url: string): string {\n if (url.length > 0) {\n const index = url.indexOf(\"?\");\n if (index >= 0) {\n return url.substring(0, index) + parseURL(url).search;\n }\n }\n\n return url;\n}\n\nexport function injectScript(filename: string): void {\n const script = document.createElement(\"script\");\n script.src = filename;\n script.async = true;\n document.head.appendChild(script);\n}\n\nexport function injectStyleLink(filename: string): void {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = filename;\n document.head.appendChild(link);\n}\n\nexport function toBinaryStr(str: string): string {\n const CHUNK = 0x8000; // String.fromCharCode(...charCodes) can overflow the call stack with large strings\n const bytes = new TextEncoder().encode(str);\n let result = \"\";\n for (let i = 0; i < bytes.length; i += CHUNK) {\n result += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return result;\n}\n\n/**\n * Find a DOM element where an ad unit should be rendered to\n */\nexport function getHtmlElement(id: string) {\n return document.getElementById(id);\n}\n\n/**\n * Convert an HTML string into a list of nodes\n */\nexport function stringToHtmlElements(html: string): NodeListOf<ChildNode> {\n const template = createHtmlElement(\"div\");\n template.innerHTML = html.replace(/[\\r\\n]/gm, \"\").trim();\n return template.childNodes;\n}\n\n/**\n * Creates an HTML element and sets attributes\n */\nexport function createHtmlElement(\n type: string,\n attributes: Record<string, string> = {},\n): HTMLElement {\n const el = document.createElement(type);\n for (const [k, v] of Object.entries(attributes)) el.setAttribute(k, v);\n return el as HTMLElement;\n}\n\n/**\n * Insert HTML elements into DOM\n */\nexport function insertHtmlElements(\n nodes: NodeListOf<Node>,\n appendTo: Element | ShadowRoot = document.body,\n) {\n const fragment = document.createDocumentFragment();\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n // Allow elements + text nodes only\n if (!node || (!isHTMLElement(node) && node.nodeType !== Node.TEXT_NODE)) {\n continue;\n }\n\n let newNode: Node;\n\n // Text node\n if (node.nodeType === Node.TEXT_NODE) {\n newNode = document.createTextNode(node.textContent ?? \"\");\n fragment.appendChild(newNode);\n continue;\n }\n\n // Element node from here on\n const el = node as Element;\n const tag = el.tagName.toLowerCase();\n\n switch (tag) {\n case \"script\": {\n const src = el.getAttribute(\"src\");\n newNode =\n !isNullOrUndef(src) && src.length > 0\n ? createScriptElement(src, false, flatHtmlAttributes(el.attributes))\n : createScriptElement(\n el.textContent ?? \"\",\n true,\n flatHtmlAttributes(el.attributes),\n );\n break;\n }\n\n case \"style\":\n newNode = createStyleElement(el.textContent);\n break;\n\n case \"svg\":\n newNode = createSvgElement(\n el.innerHTML,\n flatHtmlAttributes(el.attributes),\n );\n break;\n\n default: {\n const created = createHtmlElement(\n el.tagName,\n flatHtmlAttributes(el.attributes),\n );\n // Recurse for children (handles mixed element/text)\n if (el.childNodes.length) {\n insertHtmlElements(el.childNodes, created);\n } else {\n created.textContent = el.textContent ?? \"\";\n }\n newNode = created;\n }\n }\n\n fragment.appendChild(newNode);\n }\n\n appendTo.appendChild(fragment);\n}\n\n/**\n * Make a simple object which contains only attribute name and value\n */\nexport function flatHtmlAttributes(\n attributes?: NamedNodeMap | null,\n): Record<string, string> {\n if (!attributes) return {};\n\n const result: Record<string, string> = {};\n\n for (let i = 0; i < attributes.length; i++) {\n const attr = attributes[i];\n if (attr) {\n result[attr.name] = attr.value;\n }\n }\n\n return result;\n}\n\n/**\n * Create a <script> element\n */\nexport function createScriptElement(\n js: string,\n inline = false,\n attributes: Record<string, string> = {},\n): HTMLScriptElement {\n const el = document.createElement(\"script\");\n\n for (const [k, v] of Object.entries(attributes)) {\n el.setAttribute(k, v);\n }\n\n if (inline) {\n el.appendChild(document.createTextNode(js));\n } else {\n el.async = true;\n el.src = js;\n }\n\n return el;\n}\n\n/**\n * Create a <style> element\n */\nexport function createStyleElement(css: string | null): HTMLStyleElement {\n const element = createHtmlElement(\"style\") as HTMLStyleElement;\n\n if (css) {\n element.appendChild(document.createTextNode(css));\n }\n\n return element;\n}\n\n/**\n * Create a <link> element\n */\nexport function createLinkElement(href: string): HTMLLinkElement {\n const element = createHtmlElement(\"link\") as HTMLLinkElement;\n\n element.rel = \"stylesheet\";\n element.href = href;\n\n return element;\n}\n\n/**\n * Create svg elements\n */\nexport function createSvgElement(\n content: string,\n attributes: Record<string, string> = {},\n): SVGSVGElement {\n const element = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"svg\",\n ) as SVGSVGElement;\n\n for (const [name, value] of Object.entries(attributes)) {\n element.setAttribute(name, value);\n }\n\n element.innerHTML = content.trim();\n\n return element;\n}\n\n/**\n * Create an image element to use as a tracking pixel\n */\nexport function createPixelElement(src: string) {\n const image = document.createElement(\"img\");\n\n image.alt = \"\";\n image.src = src;\n image.width = 1;\n image.height = 1;\n image.loading = \"eager\";\n image.setAttribute(\"aria-hidden\", \"true\");\n image.style.position = \"absolute\";\n image.style.left = \"-99999px\";\n\n return image;\n}\n\n/**\n * Append a new script element to the DOM head\n */\nexport function insertJs(js: string, inline = false) {\n const element = createScriptElement(js, inline);\n\n document.head.appendChild(element);\n}\n\n/**\n * Append a new style element to the DOM head\n */\nexport function insertCss(css: string, className?: string, external = false) {\n const element = external ? createLinkElement(css) : createStyleElement(css);\n\n if (className) {\n element.className = className;\n }\n\n document.head.appendChild(element);\n}\n\n/**\n * Get screen sizes\n */\nexport function getScreenSize(): { width: number; height: number } {\n const width = window.screen?.width ?? window.innerWidth;\n const height = window.screen?.height ?? window.innerHeight;\n\n return { width, height };\n}\n\n/**\n * Get a random integer between min and max\n */\nexport function getRandomInt(min = 0, max = 4294967295): number {\n min = Math.ceil(min);\n max = Math.floor(max);\n\n if (max <= min) {\n return min;\n }\n\n return Math.floor(Math.random() * (max - min)) + min;\n}\n\n/**\n * Implementation of Java's String.hashCode() method\n */\nexport function hashCode(str: string) {\n let hash = 0,\n chr;\n\n for (let i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // convert to 32bit integer\n }\n\n return hash >>> 0;\n}\n\n/**\n * Executes a callback as soon as DOM is interactive\n */\nexport function onDOMReady<T extends unknown[]>(\n callback: (...args: T) => void,\n ...args: T\n): void {\n if (\n document.readyState === \"interactive\" ||\n document.readyState === \"complete\"\n ) {\n callback(...args);\n } else {\n document.addEventListener(\"DOMContentLoaded\", () => callback(...args));\n }\n}\n\n/**\n * Calculate the percentage of two values\n *\n * @param a\n * @param b\n * @return number\n */\nexport function toPercent(a: number, b: number): number {\n return b > 0 ? (a / b) * 100 : 0;\n}\n\n/**\n * Make a camelCase string\n *\n * @param string\n * @return string\n */\nexport function toCamelCase(string: string): string {\n return string\n .split(new RegExp(/[-_.]/))\n .reduce(\n (a: string, b: string) => a + b.charAt(0).toUpperCase() + b.slice(1),\n );\n}\n\n/**\n * Make a snake_case string\n *\n * @param string\n * @return string\n */\nexport function toSnakeCase(string: string): string {\n return toCamelCase(string)\n .replace(/(^[A-Z])?([A-Z])/gm, \"$1_$2\")\n .toLowerCase();\n}\n\n/**\n * Transform the first letter of the given string to the upper case\n *\n * @param string\n * @return string\n */\nexport function capitalize(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * Registry independent string sorting\n *\n * @param first\n * @param second\n */\nexport function sortByAlphabet(first: string, second: string): number {\n return first.toLowerCase() > second.toLowerCase() ? 1 : -1;\n}\n\n/**\n * @param length\n * @return string of max length 100\n */\nexport function getRandomStr(length?: number): string {\n length = length ? (length > 100 ? 100 : length) : 10;\n\n let str = Math.random().toString(36).substring(2);\n\n while (str.length < length) {\n str += Math.random().toString(36).substring(2);\n }\n\n const result = str.slice(-length);\n return isNaN(Number(result)) ? result : getRandomStr(length);\n}\n\nexport function getRandomItem(items: any[]): any {\n return items[Math.floor(Math.random() * items.length)];\n}\n\n/**\n * Summarize elements of the given array\n *\n * @param values\n * @return number | string - a summary of all the numbers in the array or an empty string if\n * there was only NaNs\n */\nexport function sumArray(values: Array<any>): number | string {\n if (values.every((value: any) => isNaN(value))) {\n return \"\";\n } else {\n return values.reduce((sum: any, curr: any) => {\n const value = Number(curr);\n\n if (!isNaN(value)) {\n return sum + value;\n } else {\n return sum;\n }\n }, 0);\n }\n}\n\n/**\n * Returns an array of the object keys which values are not present in filter\n *\n * @param obj\n * @param values\n */\nexport function filterObjectKeysByValues(\n obj: { [key: string]: any },\n values: Array<string | number | boolean | null | undefined>,\n): string[] {\n values = Array.isArray(values) ? values : Array(values);\n\n const keys = [];\n\n for (const key in obj) {\n if (!values.includes(obj[key])) {\n keys.push(key);\n }\n }\n\n return keys;\n}\n\nexport function getFromObject(object: object, key: string): any {\n return key.split(\".\").reduce((a: any, b: any) => {\n return a[b];\n }, object);\n}\n\nexport function fireBlurEvent(\n element: string | Element | null,\n delay: number = 0,\n): void {\n fireEvent(\"blur\", element, delay);\n}\n\nexport function fireInputEvent(\n element: string | Element | null,\n delay: number = 0,\n): void {\n fireEvent(\"input\", element, delay);\n}\n\nexport function fireEvent(\n eventName: string,\n element: string | Element | null,\n delay = 0,\n): void {\n setTimeout(() => {\n const target = isString(element)\n ? document.querySelector(element)\n : element;\n if (target) {\n target.dispatchEvent(new Event(eventName, { bubbles: true }));\n }\n }, delay);\n}\n\nexport function hasObjectChanged(\n oldObj: Record<string, any>,\n values: [string, any][],\n checkNewKeys = false,\n): boolean {\n const newMap = new Map(values);\n\n // check keys from old\n for (const key of Object.keys(oldObj)) {\n let oldVal = oldObj[key];\n let newVal = newMap.get(key);\n\n if (isObject(oldVal)) {\n if (!isObject(newVal)) return true;\n if (hasObjectChanged(oldVal, Object.entries(newVal), checkNewKeys))\n return true;\n continue;\n }\n\n if (Array.isArray(oldVal) || Array.isArray(newVal)) {\n const oldArr = Array.isArray(oldVal) ? oldVal : [];\n const newArr = Array.isArray(newVal) ? newVal : [];\n if (arrayDiff(newArr, oldArr).length > 0) return true;\n continue;\n }\n\n if (areDiff(newVal, oldVal)) return true;\n }\n\n // optional: check keys that exist only in new\n if (checkNewKeys) {\n for (const key of newMap.keys()) {\n if (!(key in oldObj)) return true;\n }\n }\n\n return false;\n}\n\nexport function roundBigNum(number: number): number {\n const digitsNum = Math.trunc(number).toString().length;\n\n let roundTo = 0;\n switch (true) {\n case digitsNum > 2 && digitsNum < 5:\n roundTo = 100;\n break;\n case digitsNum >= 5:\n roundTo = 10000;\n break;\n }\n\n return roundTo ? Math.round(number / roundTo) * roundTo : number;\n}\n\nexport function extractNumbers(value: unknown): string {\n if (!isString(value) && !isNum(value)) {\n return \"\";\n }\n return value.toString().replace(/[^0-9]/g, \"\");\n}\n\nexport function removeSpaces(value: unknown): string {\n if (!isString(value) && !isNum(value)) {\n return \"\";\n }\n return value.toString().replace(/\\s/g, \"\");\n}\n\nexport function roundUp(num: number, precision: number): number {\n const multiplier = Number(\"1\".padEnd(precision + 1, \"0\"));\n return Math.ceil(num * multiplier) / multiplier;\n}\n\nexport function roundDown(num: number, precision: number): number {\n const multiplier = Number(\"1\".padEnd(precision + 1, \"0\"));\n return Math.floor(num * multiplier) / multiplier;\n}\n\nexport function areDiff(\n val1?: Primitive | null,\n val2?: Primitive | null,\n strict?: boolean,\n): boolean {\n if (strict) {\n return val1 !== val2;\n }\n\n // at least one value is not empty\n if (Boolean(val1) || Boolean(val2)) {\n return val1 != val2;\n }\n\n // both empty, but not equally empty!\n // each one may be one of: empty string, null or undefined\n return false;\n}\n\nexport function flattenObject(\n obj: Record<string, any>,\n prefix = \"\",\n): Record<string, any> {\n const pre = prefix ? `${prefix}.` : \"\";\n\n return Object.keys(obj).reduce<Record<string, any>>((acc, k) => {\n const val = obj[k];\n const key = `${pre}${k}`;\n\n if (\n (isObject(val) || Array.isArray(val)) &&\n getObjectKeys(obj[k]).length > 0\n ) {\n Object.assign(acc, flattenObject(val, key));\n } else {\n acc[key] = val;\n }\n return acc;\n }, {});\n}\n\nexport function flattenObjectAsArray(\n obj: Record<string, any>,\n): Record<string, any> {\n const flat = flattenObject(obj);\n const result: Record<string, any> = {};\n\n for (const key of Object.keys(flat)) {\n const newKey = key.replace(/\\.([^.]+)/g, \"[$1]\");\n result[newKey] = (flat as any)[key];\n }\n\n return result;\n}\n\nexport function parseObjectPathStr(pathStr: string): string[] {\n const pathParts = pathStr.replace(/\\[/g, \".\").replace(/\\]/g, \"\").split(\".\");\n\n const [first, second] = pathParts;\n if (isString(first) && isString(second) && second.includes(\"[\")) {\n return [first, ...parseObjectPathStr(second)];\n }\n\n return pathParts;\n}\n\nexport function formatNumber(\n num: number | string,\n fractionDigits?: number,\n): string {\n fractionDigits = isNullOrUndef(fractionDigits) ? 2 : fractionDigits;\n return new Intl.NumberFormat(\"ru-RU\", {\n style: \"decimal\",\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n })\n .format(Number(num))\n .replace(\",\", \".\")\n .replace(/\\u00A0/g, \" \"); // charCode 160, White-space\n}\n\nexport function formatNumberWithSign(\n num: number | string,\n fractionDigits?: number,\n): string {\n return formatWithSign(num, formatNumber(num, fractionDigits));\n}\n\nexport function formatPercent(num: number | string): string {\n return formatNumber(num) + \"%\";\n}\n\nexport function formatWithSign(\n num: number | string,\n numString?: string,\n): string {\n numString = numString ? numString : num.toString();\n return (Number(num) < 0 ? \"\" : \"+\") + numString;\n}\n\nexport function autoSizeText(\n el: HTMLElement,\n height: number,\n minFontSize: number,\n maxFontSize: number = 50,\n) {\n let attempts = 30;\n\n const resizeText = () => {\n if (getTextHeight() === 0) {\n return;\n }\n while (attempts && getTextHeight() > height) {\n attempts--;\n reduceText();\n }\n while (attempts && getTextHeight() < height) {\n attempts--;\n enlargeText();\n }\n };\n\n const reduceText = () => {\n const fontSize = getNumericStyleProp(\"fontSize\", el);\n const newFontSize = fontSize - 1;\n if (fontSize > 1 && newFontSize >= minFontSize) {\n el.style.fontSize = `${newFontSize}px`;\n }\n };\n\n const enlargeText = () => {\n const fontSize = getNumericStyleProp(\"fontSize\", el);\n const newFontSize = fontSize + 1;\n if (newFontSize <= maxFontSize) {\n el.style.fontSize = `${newFontSize}px`;\n }\n };\n\n const getTextHeight = () =>\n Math.floor(\n el.scrollHeight -\n getNumericStyleProp(\"paddingTop\", el) -\n getNumericStyleProp(\"paddingBottom\", el),\n );\n\n resizeText();\n}\n\nexport async function monitor(\n fn: Function,\n interval: number = 10,\n attempts: number = 100,\n): Promise<boolean> {\n for (let i = 0; i < attempts; i++) {\n if (await fn()) return true;\n if (i < attempts - 1) {\n await new Promise<void>((r) => setTimeout(r, interval));\n }\n }\n return false;\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -791,7 +791,10 @@ export function flattenObject(
|
|
|
791
791
|
const val = obj[k];
|
|
792
792
|
const key = `${pre}${k}`;
|
|
793
793
|
|
|
794
|
-
if (
|
|
794
|
+
if (
|
|
795
|
+
(isObject(val) || Array.isArray(val)) &&
|
|
796
|
+
getObjectKeys(obj[k]).length > 0
|
|
797
|
+
) {
|
|
795
798
|
Object.assign(acc, flattenObject(val, key));
|
|
796
799
|
} else {
|
|
797
800
|
acc[key] = val;
|
|
@@ -906,3 +909,17 @@ export function autoSizeText(
|
|
|
906
909
|
|
|
907
910
|
resizeText();
|
|
908
911
|
}
|
|
912
|
+
|
|
913
|
+
export async function monitor(
|
|
914
|
+
fn: Function,
|
|
915
|
+
interval: number = 10,
|
|
916
|
+
attempts: number = 100,
|
|
917
|
+
): Promise<boolean> {
|
|
918
|
+
for (let i = 0; i < attempts; i++) {
|
|
919
|
+
if (await fn()) return true;
|
|
920
|
+
if (i < attempts - 1) {
|
|
921
|
+
await new Promise<void>((r) => setTimeout(r, interval));
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
return false;
|
|
925
|
+
}
|
package/tests/tests.ts
CHANGED
|
@@ -72,6 +72,7 @@ import {
|
|
|
72
72
|
toCamelCase,
|
|
73
73
|
toPercent,
|
|
74
74
|
toSnakeCase,
|
|
75
|
+
monitor,
|
|
75
76
|
} from "../src";
|
|
76
77
|
|
|
77
78
|
test.each([
|
|
@@ -2233,6 +2234,134 @@ describe("autoSizeText (using real getNumericStyleProp)", () => {
|
|
|
2233
2234
|
});
|
|
2234
2235
|
});
|
|
2235
2236
|
|
|
2237
|
+
describe("monitor", () => {
|
|
2238
|
+
beforeEach(() => jest.useFakeTimers());
|
|
2239
|
+
|
|
2240
|
+
afterEach(() => {
|
|
2241
|
+
jest.useRealTimers();
|
|
2242
|
+
jest.restoreAllMocks();
|
|
2243
|
+
});
|
|
2244
|
+
|
|
2245
|
+
test("returns true immediately when fn resolves true on first attempt (no sleep)", async () => {
|
|
2246
|
+
const fn = jest.fn().mockResolvedValue(true);
|
|
2247
|
+
|
|
2248
|
+
const promise = monitor(fn, 10, 100);
|
|
2249
|
+
|
|
2250
|
+
// fn resolves immediately; no timers needed
|
|
2251
|
+
await expect(promise).resolves.toBe(true);
|
|
2252
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
2253
|
+
// no sleeps scheduled
|
|
2254
|
+
expect(jest.getTimerCount()).toBe(0);
|
|
2255
|
+
});
|
|
2256
|
+
|
|
2257
|
+
test("retries until fn resolves true, sleeping between attempts", async () => {
|
|
2258
|
+
const fn = jest
|
|
2259
|
+
.fn()
|
|
2260
|
+
.mockResolvedValueOnce(false)
|
|
2261
|
+
.mockResolvedValueOnce(false)
|
|
2262
|
+
.mockResolvedValueOnce(true);
|
|
2263
|
+
|
|
2264
|
+
const promise = monitor(fn, 25, 10);
|
|
2265
|
+
|
|
2266
|
+
// attempt 1 happens immediately
|
|
2267
|
+
await Promise.resolve();
|
|
2268
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
2269
|
+
|
|
2270
|
+
// sleep 25ms -> attempt 2
|
|
2271
|
+
await jest.advanceTimersByTimeAsync(25);
|
|
2272
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
2273
|
+
|
|
2274
|
+
// sleep 25ms -> attempt 3 succeeds
|
|
2275
|
+
await jest.advanceTimersByTimeAsync(25);
|
|
2276
|
+
await expect(promise).resolves.toBe(true);
|
|
2277
|
+
|
|
2278
|
+
expect(fn).toHaveBeenCalledTimes(3);
|
|
2279
|
+
});
|
|
2280
|
+
|
|
2281
|
+
test("returns false after exhausting attempts", async () => {
|
|
2282
|
+
const fn = jest.fn().mockResolvedValue(false);
|
|
2283
|
+
|
|
2284
|
+
const promise = monitor(fn, 10, 3);
|
|
2285
|
+
|
|
2286
|
+
// attempt 1
|
|
2287
|
+
await Promise.resolve();
|
|
2288
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
2289
|
+
|
|
2290
|
+
// attempt 2
|
|
2291
|
+
await jest.advanceTimersByTimeAsync(10);
|
|
2292
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
2293
|
+
|
|
2294
|
+
// attempt 3 (last) - no further sleep
|
|
2295
|
+
await jest.advanceTimersByTimeAsync(10);
|
|
2296
|
+
await expect(promise).resolves.toBe(false);
|
|
2297
|
+
|
|
2298
|
+
expect(fn).toHaveBeenCalledTimes(3);
|
|
2299
|
+
expect(jest.getTimerCount()).toBe(0);
|
|
2300
|
+
});
|
|
2301
|
+
|
|
2302
|
+
test("does not sleep after the last attempt (even if fn returns false)", async () => {
|
|
2303
|
+
const fn = jest.fn().mockResolvedValue(false);
|
|
2304
|
+
|
|
2305
|
+
const promise = monitor(fn, 50, 2);
|
|
2306
|
+
|
|
2307
|
+
// attempt 1 then one sleep scheduled
|
|
2308
|
+
await Promise.resolve();
|
|
2309
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
2310
|
+
expect(jest.getTimerCount()).toBe(1);
|
|
2311
|
+
|
|
2312
|
+
// advance once -> attempt 2 (last)
|
|
2313
|
+
await jest.advanceTimersByTimeAsync(50);
|
|
2314
|
+
await expect(promise).resolves.toBe(false);
|
|
2315
|
+
|
|
2316
|
+
// should not schedule another sleep
|
|
2317
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
2318
|
+
expect(jest.getTimerCount()).toBe(0);
|
|
2319
|
+
});
|
|
2320
|
+
|
|
2321
|
+
test("uses default interval=10 and attempts=100 when omitted", async () => {
|
|
2322
|
+
const fn = jest.fn().mockResolvedValue(false);
|
|
2323
|
+
|
|
2324
|
+
const promise = monitor(fn); // defaults
|
|
2325
|
+
|
|
2326
|
+
// attempt 1
|
|
2327
|
+
await Promise.resolve();
|
|
2328
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
2329
|
+
|
|
2330
|
+
// drive 99 more attempts with 99 sleeps of 10ms each
|
|
2331
|
+
for (let i = 0; i < 99; i++) {
|
|
2332
|
+
await jest.advanceTimersByTimeAsync(10);
|
|
2333
|
+
}
|
|
2334
|
+
|
|
2335
|
+
await expect(promise).resolves.toBe(false);
|
|
2336
|
+
expect(fn).toHaveBeenCalledTimes(100);
|
|
2337
|
+
});
|
|
2338
|
+
|
|
2339
|
+
test("awaits fn each time (supports async fn that resolves later)", async () => {
|
|
2340
|
+
const fn = jest
|
|
2341
|
+
.fn()
|
|
2342
|
+
.mockImplementationOnce(
|
|
2343
|
+
() => new Promise<boolean>((res) => setTimeout(() => res(false), 5)),
|
|
2344
|
+
)
|
|
2345
|
+
.mockImplementationOnce(
|
|
2346
|
+
() => new Promise<boolean>((res) => setTimeout(() => res(true), 5)),
|
|
2347
|
+
);
|
|
2348
|
+
|
|
2349
|
+
const promise = monitor(fn, 20, 5);
|
|
2350
|
+
|
|
2351
|
+
// attempt 1's internal 5ms
|
|
2352
|
+
await jest.advanceTimersByTimeAsync(5);
|
|
2353
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
2354
|
+
|
|
2355
|
+
// then monitor sleeps 20ms before attempt 2
|
|
2356
|
+
await jest.advanceTimersByTimeAsync(20);
|
|
2357
|
+
// attempt 2's internal 5ms
|
|
2358
|
+
await jest.advanceTimersByTimeAsync(5);
|
|
2359
|
+
|
|
2360
|
+
await expect(promise).resolves.toBe(true);
|
|
2361
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
2362
|
+
});
|
|
2363
|
+
});
|
|
2364
|
+
|
|
2236
2365
|
function mockRect(el: HTMLElement, rect: Partial<DOMRect>): void {
|
|
2237
2366
|
jest.spyOn(el, "getBoundingClientRect").mockReturnValue({
|
|
2238
2367
|
x: 0,
|