ameliance-scripts
Version:
1 lines • 57.1 kB
Source Map (JSON)
{"version":3,"sources":["../src/_lab/index.ts","../src/constants/package-name.ts","../src/join-with.ts","../src/log.ts","../src/error-handler.ts","../src/_lab/get-local-storage.ts","../src/_lab/set-local-storage.ts","../src/legacy/index.ts","../src/legacy/join.ts","../src/legacy/return-error-1.ts","../src/legacy/return-error-2.ts","../src/add-id.ts","../src/class-name.ts","../src/clear-local-storage-and-reload.ts","../src/create-html-elem.ts","../src/detect-value-type.ts","../src/escape-html.ts","../src/get-changed-properties.ts","../src/get-common-values.ts","../src/get-current-date-in-ms.ts","../src/get-current-time-with-offset.ts","../src/get-different-values.ts","../src/get-elem-by-key.ts","../src/get-formatted-date.ts","../src/get-index-by-key.ts","../src/get-indexes-of-non-empty-elements.ts","../src/get-match-soft.ts","../src/get-match.ts","../src/get-obj-key-by-value.ts","../src/get-random-number.ts","../src/get-random-hex-color.ts","../src/get-random-rgb-color.ts","../src/get-scroll-direction.ts","../src/get-today.ts","../src/get-value-type.ts","../src/is-object.ts","../src/group-by.ts","../src/hide-email.ts","../src/interpolate.ts","../src/is-arrays-equal.ts","../src/is-client.ts","../src/is-object-empty.ts","../src/is-object-has-value.ts","../src/is-object-valid.ts","../src/is-valid-url.ts","../src/join.ts","../src/kebab-to-camel-case.ts","../src/parse-current-date-from-ms.ts","../src/remove-empty-values.ts","../src/set-interval-counts.ts","../src/shuffle-array.ts","../src/sort-array-local-compare.ts","../src/sort-array-of-obj.ts","../src/string-cut.ts","../src/to-time-format.ts","../src/trim-end-empty-values.ts","../src/trim-start-empty-values.ts","../src/write-text-to-clipboard.ts","../src/index.ts"],"sourcesContent":["export * from './get-local-storage';\nexport * from './set-local-storage';\n","export const PACKAGE_NAME = 'ameliance-scripts';\n","export function joinWith(combiner: string, ...args: unknown[]): string {\n\treturn args\n\t\t.flat(Infinity)\n\t\t.filter((element) => element)\n\t\t.map((element: unknown) => String(element).trim())\n\t\t.join(combiner);\n}\n","/* eslint-disable no-console */\ntype Args = Array<unknown> | [Array<unknown>, Array<string>];\n\ntype LogMethod = (message: string, ...args: Args) => void;\n\ntype Log = {\n\tinfo: LogMethod;\n\tsuccess: LogMethod;\n\twarn: LogMethod;\n\terror: LogMethod;\n};\n\nconst commonStyles = `\ncolor: white;\nborder-radius: 4px;\npadding: 2px 4px;\nfont-weight: bold;\nmargin-bottom: 4px;\n`;\n\nconst infoStyle = `\nbackground-color: blue;\n`;\n\nconst successStyle = `\nbackground-color: green;\n`;\n\nconst warnStyle = `\nbackground-color: darkorange;\n`;\n\nconst errorStyle = `\nbackground-color: red;\n`;\n\nfunction prepareLog(\n\ttype: 'log' | 'warn' | 'error',\n\tmessage: string,\n\tmessageStyles: string,\n\targs: Args,\n) {\n\tlet finalLog = [] as unknown[];\n\tif (Array.isArray(args[0])) {\n\t\tconst [messages, styles] = args.reduce<[string[], string[]]>(\n\t\t\t(accumulator, messageTuple) => {\n\t\t\t\tif (Array.isArray(messageTuple)) {\n\t\t\t\t\taccumulator[0].push(`%c${messageTuple[0]}`);\n\t\t\t\t\taccumulator[1].push(messageTuple[1]);\n\t\t\t\t}\n\t\t\t\treturn accumulator;\n\t\t\t},\n\t\t\t[[], []],\n\t\t);\n\t\tfinalLog = [\n\t\t\t`%c${message}${messages.join('')}`,\n\t\t\t`${commonStyles}${messageStyles} margin-right: 4px; `,\n\t\t\t...styles,\n\t\t];\n\t} else {\n\t\tfinalLog = [`%c${message}`, `${commonStyles}${messageStyles}`, args.join('\\n')];\n\t}\n\tconsole[type](...finalLog);\n}\n\nexport const log: Log = {\n\tinfo: (message, ...args) => prepareLog('log', message, infoStyle, args),\n\tsuccess: (message, ...args) => prepareLog('log', message, successStyle, args),\n\twarn: (message, ...args) => prepareLog('warn', message, warnStyle, args),\n\terror: (message, ...args) => prepareLog('error', message, errorStyle, args),\n};\n","import { joinWith } from './join-with';\nimport { log } from './log';\n\nexport type ReturnErrorHandler = {\n\tstatus?: number;\n\tcode?: string;\n\tmessage: string;\n};\n\nexport type ErrorHandler = {\n\terror: unknown;\n\tstatus?: number;\n\tcode?: string;\n\tmessage?: string;\n\ttitle?: string;\n\terrorDepth?: number;\n\tshowConsoleError?: boolean;\n\twrapperCount?: number;\n};\n\nexport function errorHandler({\n\terror,\n\tstatus,\n\tcode,\n\tmessage = 'Sorry, something went wrong ¯\\\\_(ツ)_/¯!',\n\ttitle = 'AMELIANCE SCRIPTS',\n\terrorDepth = Infinity,\n\tshowConsoleError = true,\n\twrapperCount = 0, //* WrapperCount - a parameter that sets the number of wrappers around the function to shift the error array\n}: ErrorHandler): ReturnErrorHandler {\n\tconst errorCount = 2 + wrapperCount;\n\tconst errorDeep = wrapperCount < 0 ? 0 : errorDepth;\n\n\tconst errorInfo: ReturnErrorHandler = { status, code, message };\n\n\tif (error) {\n\t\tif (error instanceof Error) {\n\t\t\terrorInfo.message = error.message;\n\t\t\terrorInfo.code = error.name;\n\t\t}\n\n\t\tif (typeof error === 'string') errorInfo.message = error;\n\n\t\tif (typeof error === 'object' && error !== null) {\n\t\t\tif ('status' in error && typeof error.status === 'number') {\n\t\t\t\terrorInfo.status = error.status;\n\t\t\t}\n\t\t\tif ('message' in error && typeof error.message === 'string') {\n\t\t\t\terrorInfo.message = error.message;\n\t\t\t}\n\t\t\tif ('code' in error && typeof error.code === 'string') {\n\t\t\t\terrorInfo.code = error.code;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (showConsoleError) {\n\t\tconst errorTitle = ` ${title} ERROR: \\n`;\n\t\tconst errorSubtitle = `${joinWith(' | ', errorInfo.status, errorInfo.code, errorInfo.message)}`;\n\n\t\tconst subtitleStyle = `\n\t\t\tbackground-color: hsla(0, 0%, 0%, 0.5);\n\t\t\tcolor: white;\n\t\t\tborder-radius: 4px;\n\t\t\tpadding: 2px 4px;\n\t\t\tmargin-bottom: 4px;\n\t\t`;\n\n\t\tlog.error(\n\t\t\terrorTitle,\n\t\t\t[errorSubtitle, subtitleStyle],\n\t\t\t[`\\n${new Error().stack?.split('\\n').splice(errorCount, errorDeep).join('\\n')}`, ''],\n\t\t);\n\t}\n\n\treturn errorInfo;\n}\n","import { PACKAGE_NAME } from '../constants/package-name';\nimport { errorHandler } from '../error-handler';\n\nexport function getLocalStorage<T>(appName: string, store: string, key: string, initValue?: T) {\n\tconst setLocalStorageItem = <K, D>(storeObj: Record<string, K>, value: D) => {\n\t\tlocalStorage.setItem(\n\t\t\tappName,\n\t\t\tJSON.stringify({\n\t\t\t\t...storeObj,\n\t\t\t\t[store]: {\n\t\t\t\t\t...storeObj[store],\n\t\t\t\t\t[key]: value,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t};\n\n\ttry {\n\t\tconst appStorage = localStorage.getItem(appName);\n\t\tconst appStorageObj = appStorage ? JSON.parse(appStorage) : {};\n\t\tif (!appStorage) {\n\t\t\tif (initValue) setLocalStorageItem(appStorageObj, initValue);\n\t\t\treturn initValue || null;\n\t\t}\n\t\tconst storageValue = appStorageObj[store][key];\n\t\tif (!storageValue) {\n\t\t\tsetLocalStorageItem(appStorageObj, initValue);\n\t\t\treturn initValue || null;\n\t\t}\n\t\treturn storageValue;\n\t} catch (error) {\n\t\terrorHandler({ error, title: PACKAGE_NAME });\n\t\treturn initValue;\n\t}\n}\n","import { PACKAGE_NAME } from '../constants/package-name';\nimport { errorHandler } from '../error-handler';\n\nexport function setLocalStorage<T>(appName: string, store: string, group: string, value: T) {\n\tconst setLocalStorageItem = <\n\t\tK extends Record<string, Record<string, string>>,\n\t\tJ extends Record<string, K>,\n\t\tD,\n\t>(\n\t\tstoreObj: J,\n\t\tlocalValue: D,\n\t) => {\n\t\tconst newStoreObj = {\n\t\t\t...storeObj,\n\t\t\t[store]: {\n\t\t\t\t...storeObj?.[store],\n\t\t\t\t[group]: {\n\t\t\t\t\t...storeObj?.[store]?.[group],\n\t\t\t\t\t...(localValue || null),\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\tlocalStorage.setItem(appName, JSON.stringify(newStoreObj));\n\t};\n\n\ttry {\n\t\tconst appStorage = localStorage.getItem(appName);\n\t\tconst appStorageObj = appStorage ? JSON.parse(appStorage) : {};\n\t\tsetLocalStorageItem(appStorageObj, value);\n\t} catch (error) {\n\t\terrorHandler({ error, title: PACKAGE_NAME });\n\t}\n}\n","export * from './join';\nexport * as returnError1 from './return-error-1';\nexport * as returnError2 from './return-error-2';\n","export function join(...args: unknown[]): string {\n\treturn args\n\t\t.flat(Infinity)\n\t\t.filter((element) => element)\n\t\t.join(' ')\n\t\t.trim();\n}\n","// wrapperCount - a parameter that sets the number of wrappers around the function to shift the error array\nexport function returnError(\n\terror: unknown,\n\tappName?: string,\n\twrapperCount = 0,\n\tdeep = Infinity,\n): string {\n\tconst errorCount = 2 + wrapperCount;\n\n\tlet message = 'Sorry, something went wrong ¯\\\\_(ツ)_/¯!';\n\tif (error) {\n\t\tif (typeof error === 'string') message = error;\n\t\tif (error instanceof Error) message = error.message;\n\t}\n\tif (appName) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(\n\t\t\t`${appName} >`,\n\t\t\t`${message}\\n`,\n\t\t\tnew Error().stack?.split('\\n').splice(errorCount, deep).join('\\n'),\n\t\t);\n\t} else {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(\n\t\t\t`${message}\\n`,\n\t\t\tnew Error().stack?.split('\\n').splice(errorCount, deep).join('\\n'),\n\t\t);\n\t}\n\treturn message;\n}\n","export type ReturnError = {\n\tstatus: number;\n\tmessage: string;\n};\n\n//* WrapperCount - a parameter that sets the number of wrappers around the function to shift the error array\nexport function returnError(\n\terror: unknown,\n\tstatus?: number,\n\tappName?: string,\n\twrapperCount = 0,\n\tdeep = Infinity,\n): ReturnError {\n\tconst errorCount = 2 + wrapperCount;\n\n\tstatus = status || -1;\n\n\tlet message = 'Sorry, something went wrong ¯\\\\_(ツ)_/¯!';\n\tif (error) {\n\t\tif (typeof error === 'string') message = error;\n\t\tif (error instanceof Error) {\n\t\t\tmessage = error.message;\n\t\t}\n\t}\n\tif (appName) {\n\t\tconsole.error(\n\t\t\t`${appName} >`,\n\t\t\t`${status} | ${message}\\n`,\n\t\t\tnew Error().stack?.split('\\n').splice(errorCount, deep).join('\\n'),\n\t\t);\n\t} else {\n\t\tconsole.error(\n\t\t\t`${status} | ${message}\\n`,\n\t\t\tnew Error().stack?.split('\\n').splice(errorCount, deep).join('\\n'),\n\t\t);\n\t}\n\treturn { status, message };\n}\n","export function addId<T>(array: T[], ids?: string[]) {\n\tif (ids && ids.length === array.length) {\n\t\treturn array.map((item, i) => ({ ...item, id: ids[i] }));\n\t}\n\treturn array.map((item, i) => ({ ...item, id: i }));\n}\n","type ClassNameReturn = {\n\tclassName: string;\n};\n\nexport function className(...args: unknown[]): ClassNameReturn {\n\treturn {\n\t\tclassName: args\n\t\t\t.flat(Infinity)\n\t\t\t.filter((element) => element)\n\t\t\t.join(' ')\n\t\t\t.trim(),\n\t};\n}\n","export function clearLocalStorageAndReload() {\n\tlocalStorage.clear();\n\twindow.location.reload();\n}\n","export function createHTMLElem(\n\tparent: HTMLElement | DocumentFragment,\n\telementType: string,\n\tparams?: {\n\t\tclass?: string;\n\t\tid?: string;\n\t\tattributes?: string[];\n\t},\n\ttext = '',\n): HTMLElement {\n\tconst element$ = document.createElement(elementType);\n\tif (params?.class) {\n\t\tconst classes: string[] = params.class.split(' ');\n\t\telement$.classList.add(...classes);\n\t}\n\tif (params?.id) {\n\t\telement$.setAttribute('id', params.id);\n\t}\n\tif (params?.attributes) {\n\t\tparams.attributes.forEach((attribute) => {\n\t\t\tconst attributeName = attribute.split('=')[0];\n\t\t\tconst attributeValue = (attribute.split('=')[1] || '').replaceAll('\"', '');\n\n\t\t\telement$.setAttribute(attributeName, attributeValue);\n\t\t});\n\t}\n\tif (text) {\n\t\telement$.innerHTML = text;\n\t}\n\tparent.append(element$);\n\n\treturn element$;\n}\n","import type { ValueType } from './get-value-type';\n\n/**\n * Determine the type of a value.\n *\n * If the value is a string, will return one of the following:\n * - 'date' if the string can be parsed as a Date\n * - 'number' if the string can be parsed as a number\n * - 'boolean' if the string is either 'true' or 'false'\n *\n * Will return one of the following for other types:\n * - 'null' if null\n * - 'undefined' if undefined\n * - 'number' if number\n * - 'boolean' if boolean\n * - 'symbol' if symbol\n * - 'bigint' if bigint\n * - 'function' if function\n * - 'array' if Array\n * - 'object' if plain object\n *\n * Otherwise will return 'string'\n *\n * @param value - the value to determine the type of\n * @returns - the type of the value\n */\nexport function detectValueType(value: unknown): ValueType {\n\tif (value === null) return 'null';\n\tif (value === undefined) return 'undefined';\n\n\tif (typeof value === 'string') {\n\t\tif (!isNaN(Date.parse(value))) return 'date';\n\t\tif (!isNaN(Number(value))) return 'number';\n\t\tif (value === 'true' || value === 'false') return 'boolean';\n\t\treturn 'string';\n\t}\n\n\tif (typeof value === 'number') return 'number';\n\tif (typeof value === 'boolean') return 'boolean';\n\tif (typeof value === 'symbol') return 'symbol';\n\tif (typeof value === 'bigint') return 'bigint';\n\tif (typeof value === 'function') return 'function';\n\n\tif (Array.isArray(value)) return 'array';\n\tif (value instanceof Date) return 'date';\n\n\tif (typeof value === 'object') return 'object';\n\n\treturn 'string';\n}\n","export function escapeHtml(unsafe: string): string {\n\treturn unsafe\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"')\n\t\t.replace(/'/g, ''');\n}\n","export const getChangedProperties = <T extends object>(\n\toriginalObject: Partial<T>,\n\tupdatedObject: Partial<T>,\n) => {\n\treturn Object.fromEntries(\n\t\tObject.entries(updatedObject).filter(([key, value]) => {\n\t\t\tconst originalValue = originalObject[key as keyof T];\n\n\t\t\tif (value instanceof Date && originalValue instanceof Date) {\n\t\t\t\treturn value.getTime() !== originalValue.getTime();\n\t\t\t}\n\n\t\t\treturn value !== originalValue;\n\t\t}),\n\t) as Partial<T>;\n};\n","type ArrItem = string | number;\n\nexport function getCommonValues(...arrays: ArrItem[][]): ArrItem[] {\n\treturn arrays.reduce((firstArray, secondArray) =>\n\t\tfirstArray.filter((element) => secondArray.includes(element)),\n\t);\n}\n","export function getCurrentDateInMs(): number {\n\treturn Date.now();\n}\n","export function getCurrentTimeWithOffset(millisecondsOffset: number) {\n\tconst currentDate = new Date();\n\tcurrentDate.setTime(currentDate.getTime() + millisecondsOffset);\n\n\tconst formattedTime = currentDate.toLocaleTimeString('en-US', { hour12: false });\n\n\treturn formattedTime;\n}\n","type ArrItem = string | number;\n\nexport function getDifferentValues(...arrays: ArrItem[][]): ArrItem[] {\n\treturn arrays.reduce((firstArray, secondArray) =>\n\t\tfirstArray.filter((element) => !secondArray.includes(element)),\n\t);\n}\n","export function getElemByKey<E, V>(array: E[], key: keyof E, value: V): E | null {\n\treturn array.find((item) => item[key] === value) || null;\n}\n","export function getFormattedDate(\n\tdateString: string,\n\tdateStyle: Intl.DateTimeFormatOptions['dateStyle'] = 'long',\n\tformat = 'en-US',\n): string {\n\treturn new Intl.DateTimeFormat(format, { dateStyle }).format(new Date(dateString));\n}\n","export function getIndexByKey<E, V>(array: E[], key: keyof E, value: V): number {\n\treturn array.findIndex((item) => item[key] === value);\n}\n","type ArrItem = string | number;\n\nexport function getIndexesOfNonEmptyElements(array: ArrItem[]): ArrItem[] {\n\treturn array.map((value, i) => (value !== '' ? i : '')).filter(String);\n}\n","/**\n * Like {@link getMatch}, but returns `null` instead of throwing if `code` is not found in `values`.\n *\n * @param code - The code to look up in `values`.\n * @param values - An object with one or more case values.\n * @returns The value associated with `code` if it exists, otherwise `values._` if it exists, otherwise `null`.\n */\nexport function getMatchSoft<C extends PropertyKey, M>(\n\tcode: C | undefined | null,\n\tvalues: Partial<Record<C, M>> & { _?: M },\n): M | null {\n\tif (code === undefined || code === null || !(code in values)) return values._ ?? null;\n\treturn values[code] ?? values._ ?? null;\n}\n","/**\n * A utility function to get a value from an object based on a given key.\n *\n * This function is useful when you need to get a value from an object based on a\n * dynamic key, while also providing a default value if the key is not present\n * in the object.\n *\n * @example\n * const options = {\n * \tapple: 'red',\n * \tbanana: 'yellow',\n * \t_: 'unknown',\n * };\n *\n * const color = getMatch('apple', options); // red\n * const unknownColor = getMatch('orange', options); // unknown\n *\n * @param code The key to look up in the object\n * @param values The object containing the values\n * @returns The value associated with the key, or the default value if the key is not present\n */\nexport function getMatch<C extends PropertyKey, M>(\n\tcode: C | undefined | null,\n\tvalues: Partial<Record<C, M>> & { _: M },\n): M {\n\tif (code == null || code === undefined || !(code in values)) return values._;\n\tconst value = values[code];\n\treturn value === undefined ? values._ : value;\n}\n","import { PACKAGE_NAME } from './constants/package-name';\nimport { errorHandler } from './error-handler';\n\nexport function getObjKeyByValue<T>(object: Record<string, T>, value: T): string | undefined {\n\ttry {\n\t\treturn Object.keys(object).find((key) => object[key] === value);\n\t} catch (error) {\n\t\terrorHandler({ error, title: PACKAGE_NAME });\n\t}\n\treturn undefined;\n}\n","export function getRandomNumber(min: number, max: number): number {\n\treturn Math.trunc(Math.random() * (max - min + 1) + min);\n}\n","import { getRandomNumber } from './get-random-number';\n\nexport function getRandomHEXColor(): string {\n\tconst r = getRandomNumber(0, 255).toString(16);\n\tconst g = getRandomNumber(0, 255).toString(16);\n\tconst b = getRandomNumber(0, 255).toString(16);\n\treturn `#${r}${g}${b}`;\n}\n","import { getRandomNumber } from './get-random-number';\n\nexport function getRandomRGBColor(): number[] {\n\tconst r = getRandomNumber(0, 255);\n\tconst g = getRandomNumber(0, 255);\n\tconst b = getRandomNumber(0, 255);\n\treturn [r, g, b];\n}\n","function wrapper() {\n\tlet oldScroll: number;\n\treturn () => {\n\t\tconst scrollDirection = oldScroll > window.scrollY ? 'UP' : 'DOWN';\n\t\toldScroll = window.scrollY;\n\t\treturn scrollDirection;\n\t};\n}\n\nexport const getScrollDirection = wrapper();\n","export function getToday(): string {\n\tconst date = new Date();\n\treturn `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;\n}\n","export type ValueType =\n\t| 'string'\n\t| 'number'\n\t| 'boolean'\n\t| 'date'\n\t| 'array'\n\t| 'object'\n\t| 'null'\n\t| 'undefined'\n\t| 'function'\n\t| 'symbol'\n\t| 'bigint';\n\n/**\n * Determine the type of a value.\n *\n * Returns one of the following:\n * - 'string' if value is a string\n * - 'number' if value is a number\n * - 'boolean' if value is a boolean\n * - 'date' if value is a Date\n * - 'array' if value is an array\n * - 'object' if value is a plain object\n * - 'null' if value is null\n * - 'undefined' if value is undefined\n * - 'function' if value is a function\n * - 'symbol' if value is a symbol\n * - 'bigint' if value is a bigint\n *\n * @param value - the value to determine the type of\n * @returns - the type of the value\n */\nexport function getValueType(value: unknown): ValueType {\n\tif (value === null) return 'null';\n\tif (value === undefined) return 'undefined';\n\tif (value instanceof Date) return 'date';\n\tif (Array.isArray(value)) return 'array';\n\treturn typeof value;\n}\n","export function isObject<T>(obj: T) {\n\treturn Boolean(typeof obj === 'object' && obj !== null && !Array.isArray(obj));\n}\n","import { isObject } from './is-object';\n\nfunction getGroupSymbol<T, K extends string | number>(item: T, key?: K, length = 0): string {\n\tif (length === 0 && typeof item === 'string') return item;\n\tif (typeof item === 'string') return item[0];\n\tif (isObject(item) && key) {\n\t\tif (length === 0) return String((item as Record<K, unknown>)[key]);\n\t\treturn String((item as Record<K, unknown>)[key]).slice(0, length);\n\t}\n\tif (Array.isArray(item) && key && typeof key === 'number') {\n\t\tif (length === 0) return String((item as unknown[])[key]);\n\t\treturn String((item as unknown[])[key]).slice(0, length);\n\t}\n\treturn '';\n}\n\nexport function groupBy<T, K extends string | number>(\n\tarray: T[],\n\tkey?: K,\n\tlength = 0,\n): [string, T[]][] {\n\tconst arrayFirstItem = array[0];\n\n\tif (\n\t\ttypeof arrayFirstItem !== 'string' &&\n\t\ttypeof arrayFirstItem !== 'number' &&\n\t\t!isObject(arrayFirstItem) &&\n\t\t!Array.isArray(arrayFirstItem)\n\t) {\n\t\tthrow new Error('Invalid value');\n\t}\n\n\tif ((isObject(arrayFirstItem) || Array.isArray(arrayFirstItem)) && !key) {\n\t\tthrow new Error('No key provided');\n\t}\n\n\tif (Array.isArray(arrayFirstItem) && typeof key === 'string') {\n\t\tthrow new Error('Key should be array index number');\n\t}\n\n\tconst group = new Map();\n\n\tarray.forEach((arrayElement) => {\n\t\tconst groupKey = getGroupSymbol(arrayElement, key || undefined, length);\n\t\tif (group.has(groupKey)) {\n\t\t\tgroup.set(groupKey, [...group.get(groupKey), arrayElement]);\n\t\t} else {\n\t\t\tgroup.set(groupKey, [arrayElement]);\n\t\t}\n\t});\n\n\treturn Array.from(group.entries());\n}\n","type HideType = 'left' | 'right' | 'middle';\n\nexport function hideEmail(email: string, hideType: HideType = 'middle'): string | null {\n\tif (email.length < 0) return null;\n\tconst [username, domain] = email.split('@');\n\tconst firstLetter = hideType === 'left' ? '*' : username.charAt(0);\n\tconst lastLetter = hideType === 'right' ? '*' : username.charAt(username.length - 1);\n\tconst hiddenLetters = '*'.repeat(username.length - 2);\n\tconst formattedEmail = `${firstLetter}${hiddenLetters}${lastLetter}@${domain}`;\n\treturn formattedEmail;\n}\n","import { escapeHtml } from './escape-html';\n\ntype Primitive = string | number | boolean;\n\ntype InterpolationValues = {\n\t[key: string]: Primitive | InterpolationValues;\n};\n\nconst templateRegexp = /{{([\\w.]+)(?:\\|([^}]*))?}}/g;\n\nfunction createValueGetter(obj: InterpolationValues) {\n\tconst cache = new Map<string, unknown>();\n\n\treturn function getValueByPath(path: string): unknown {\n\t\tif (cache.has(path)) return cache.get(path);\n\n\t\tlet value: unknown;\n\n\t\tif (!path.includes('.')) {\n\t\t\tvalue = obj[path];\n\t\t} else {\n\t\t\tconst keys = path.split('.');\n\t\t\tvalue = obj;\n\t\t\tfor (const key of keys) {\n\t\t\t\tif (typeof value === 'object' && value !== null && key in value) {\n\t\t\t\t\tvalue = (value as Record<string, unknown>)[key];\n\t\t\t\t} else {\n\t\t\t\t\tvalue = undefined;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcache.set(path, value);\n\t\treturn value;\n\t};\n}\n\nexport function interpolate(\n\ttemplate: string,\n\tvalues: InterpolationValues,\n\toptions: { throwIfMissing?: boolean; escapeValues?: boolean } = {\n\t\tthrowIfMissing: true,\n\t\tescapeValues: true,\n\t},\n): string {\n\tconst getValue = createValueGetter(values);\n\n\treturn template.replace(templateRegexp, (match, path, defaultValue) => {\n\t\tconst value = getValue(path);\n\t\tlet result: string;\n\n\t\tif (value !== undefined && value !== null) {\n\t\t\tresult = String(value);\n\t\t} else if (defaultValue !== undefined) {\n\t\t\tresult = defaultValue;\n\t\t} else if (options.throwIfMissing) {\n\t\t\tthrow new Error(`Missing value for interpolation key: \"${path}\"`);\n\t\t} else {\n\t\t\treturn match;\n\t\t}\n\n\t\treturn options.escapeValues ? escapeHtml(result) : result;\n\t});\n}\n","function isPrimitive(value: unknown): boolean {\n\treturn (\n\t\tvalue === null ||\n\t\ttypeof value === 'undefined' ||\n\t\ttypeof value === 'string' ||\n\t\ttypeof value === 'number' ||\n\t\ttypeof value === 'boolean'\n\t);\n}\n\nfunction deepEqual(item1: unknown, item2: unknown): boolean {\n\tif (item1 === item2) return true;\n\n\tif (typeof item1 !== 'object' || typeof item2 !== 'object' || item1 === null || item2 === null) {\n\t\treturn item1 === item2;\n\t}\n\n\tconst keys1 = Object.keys(item1 as object);\n\tconst keys2 = Object.keys(item2 as object);\n\n\tif (keys1.length !== keys2.length) return false;\n\n\treturn keys1.every((key) =>\n\t\tdeepEqual((item1 as Record<string, unknown>)[key], (item2 as Record<string, unknown>)[key]),\n\t);\n}\n\nexport function isArraysEqual<T>(arr1?: T[] | null, arr2?: T[] | null): boolean {\n\tif (!arr1 || !arr2) return arr1 === arr2;\n\tif (arr1.length !== arr2.length) return false;\n\n\tif (isPrimitive(arr1[0])) {\n\t\tconst sortedArr1 = [...arr1].sort();\n\t\tconst sortedArr2 = [...arr2].sort();\n\t\treturn sortedArr1.every((value, index) => value === sortedArr2[index]);\n\t}\n\n\treturn arr1.every((item, index) => deepEqual(item, arr2[index]));\n}\n","export function isClient(): boolean {\n\treturn typeof window !== 'undefined';\n}\n","export function isObjectEmpty(obj: object): boolean {\n\treturn Object.keys(obj).length === 0;\n}\n","import { isObjectEmpty } from './is-object-empty';\n\nexport function isObjectHasValue<T extends string | number>(object: Record<string, T>, value: T) {\n\tif (isObjectEmpty(object)) throw new Error('Object is empty');\n\treturn Object.values(object).includes(value);\n}\n","import { isObject } from './is-object';\nimport { isObjectEmpty } from './is-object-empty';\n\nexport function isObjectValid<T>(obj: T): boolean {\n\treturn isObject(obj) && !isObjectEmpty(obj as object);\n}\n","export function іsValidUrl(url: string): boolean {\n\ttry {\n\t\treturn Boolean(new URL(url));\n\t} catch (error) {\n\t\treturn false;\n\t}\n}\n","function flatObjectKeysToArray(obj: object): string[] | [] {\n\tconst entries = Object.entries(obj);\n\tif (entries.length > 0) {\n\t\treturn entries.map((tuple) => (tuple[1] ? tuple[0] : '')).filter((element) => element);\n\t}\n\treturn [];\n}\n\nexport function join(...args: unknown[]): string {\n\treturn args\n\t\t.flat(Infinity)\n\t\t.map((element) => {\n\t\t\tif (element && typeof element === 'object') {\n\t\t\t\tconst flatObjectKeysArray = flatObjectKeysToArray(element);\n\t\t\t\treturn flatObjectKeysArray ? flatObjectKeysArray.join(' ') : '';\n\t\t\t}\n\t\t\treturn element;\n\t\t})\n\t\t.filter((element) => element)\n\t\t.join(' ')\n\t\t.trim();\n}\n","export function kebabToCamelCase(str: string) {\n\treturn str.replace(/-./g, (match) => match[1].toUpperCase());\n}\n","export function parseCurrentDateFromMs(ms: string | number): Date {\n\treturn new Date(Number(ms));\n}\n","import { isObject } from './is-object';\n\nexport function removeEmptyValues<T, K extends string | number>(array: T[], key?: K): T[] {\n\tconst arrayCopy = array.slice();\n\tconst arrayFirstItem = arrayCopy[0];\n\n\tif (\n\t\ttypeof arrayFirstItem !== 'string' &&\n\t\ttypeof arrayFirstItem !== 'number' &&\n\t\t!isObject(arrayFirstItem) &&\n\t\t!Array.isArray(arrayFirstItem)\n\t) {\n\t\tthrow new Error('Invalid value');\n\t}\n\n\tif ((isObject(arrayFirstItem) || Array.isArray(arrayFirstItem)) && !key) {\n\t\tthrow new Error('No key provided');\n\t}\n\n\tif (Array.isArray(arrayFirstItem) && typeof key === 'string') {\n\t\tthrow new Error('Key should be array index number');\n\t}\n\n\tlet result: T[] = [];\n\n\tif (typeof arrayFirstItem === 'string' || typeof arrayFirstItem === 'number') {\n\t\tresult = arrayCopy.filter((value) => String(value).trim() !== '');\n\t}\n\n\tif (isObject(arrayFirstItem) && key) {\n\t\tresult = arrayCopy.filter((value) => {\n\t\t\tconst typedValue = String((value as Record<K, unknown>)[key]);\n\t\t\treturn typedValue.trim() !== '';\n\t\t});\n\t}\n\n\tif (Array.isArray(arrayFirstItem) && key && typeof key === 'number') {\n\t\tresult = arrayCopy.filter((value) => {\n\t\t\tconst typedValue = String((value as unknown[])[key]);\n\t\t\treturn typedValue.trim() !== '';\n\t\t});\n\t}\n\n\treturn result;\n}\n","type SetInterval = {\n\tcallback: () => void;\n\tdelay: number;\n\tcounts: number;\n};\n\nexport function setIntervalCounts({\n\tcallback,\n\tdelay,\n\tcounts,\n}: SetInterval): ReturnType<typeof setInterval> {\n\tlet counter = 0;\n\tconst interval = setInterval(() => {\n\t\tcallback();\n\t\tcounter += 1;\n\t\tif (counter === counts) {\n\t\t\tclearInterval(interval);\n\t\t}\n\t}, delay);\n\n\treturn interval;\n}\n","import { getRandomNumber } from './get-random-number';\n\nexport function shuffleArray<TYPE>(array: TYPE[]): TYPE[] {\n\tconst arrayCopy = array.slice();\n\tfor (let i = 0; i < array.length; i++) {\n\t\tconst j = getRandomNumber(0, array.length - 1);\n\t\t[arrayCopy[i], arrayCopy[j]] = [arrayCopy[j], arrayCopy[i]];\n\t}\n\treturn arrayCopy;\n}\n","import { isObject } from './is-object';\n\nexport function sortArrayLocalCompare<T, K extends string | number>(array: T[], key?: K): T[] {\n\tconst arrayCopy = array.slice();\n\tconst arrayFirstItem = arrayCopy[0];\n\n\tif (\n\t\ttypeof arrayFirstItem !== 'string' &&\n\t\ttypeof arrayFirstItem !== 'number' &&\n\t\t!isObject(arrayFirstItem) &&\n\t\t!Array.isArray(arrayFirstItem)\n\t) {\n\t\tthrow new Error('Invalid value');\n\t}\n\n\tif ((isObject(arrayFirstItem) || Array.isArray(arrayFirstItem)) && !key) {\n\t\tthrow new Error('No key provided');\n\t}\n\n\tif (Array.isArray(arrayFirstItem) && typeof key === 'string') {\n\t\tthrow new Error('Key should be array index number');\n\t}\n\n\tlet result: T[] = [];\n\n\tif (typeof arrayFirstItem === 'string' || typeof arrayFirstItem === 'number') {\n\t\tresult = arrayCopy.sort((a, b) => {\n\t\t\tconst aKey = String(a);\n\t\t\tconst bKey = String(b);\n\t\t\treturn aKey.localeCompare(bKey);\n\t\t});\n\t}\n\n\tif (isObject(arrayFirstItem) && key) {\n\t\tresult = arrayCopy.sort((a, b) => {\n\t\t\tconst aKey = String((a as Record<K, unknown>)[key]);\n\t\t\tconst bKey = String((b as Record<K, unknown>)[key]);\n\t\t\treturn aKey.localeCompare(bKey.toString());\n\t\t});\n\t}\n\n\tif (Array.isArray(arrayFirstItem) && key && typeof key === 'number') {\n\t\tresult = arrayCopy.sort((a, b) => {\n\t\t\tconst aKey = String((a as unknown[])[key]);\n\t\t\tconst bKey = String((b as unknown[])[key]);\n\t\t\treturn aKey.localeCompare(bKey);\n\t\t});\n\t}\n\n\treturn result;\n}\n","import { detectValueType } from './detect-value-type';\nimport type { ValueType } from './get-value-type';\n\nconst compareValues = <T>(a: T, b: T, valueType: ValueType): number => {\n\tswitch (valueType) {\n\t\tcase 'date':\n\t\t\treturn new Date(String(a)).getTime() - new Date(String(b)).getTime();\n\t\tcase 'number':\n\t\t\treturn Number(a) - Number(b);\n\t\tcase 'boolean':\n\t\t\treturn Number(Boolean(a)) - Number(Boolean(b));\n\t\tcase 'string':\n\t\tdefault:\n\t\t\treturn String(a).localeCompare(String(b));\n\t}\n};\n\nexport function sortArrayOfObj<T, K extends keyof T>(\n\tarray: T[],\n\tkey: K,\n\ttype?: ValueType,\n\tundefinedPosition: 'start' | 'end' = 'end',\n): T[] {\n\tconst arrayCopy = array.slice();\n\n\tif (!key || array.length === 0) return arrayCopy;\n\n\t//* Find first non empty value to define type\n\tconst firstValidValue = array.find((item) => {\n\t\tconst value = item[key];\n\t\treturn value !== undefined && value !== null && value !== '';\n\t})?.[key];\n\n\tconst valueType = type || detectValueType(firstValidValue);\n\n\tarrayCopy.sort((a: T, b: T): number => {\n\t\tconst aValue = a[key];\n\t\tconst bValue = b[key];\n\n\t\tconst isAEmpty = aValue === undefined || aValue === null || aValue === '';\n\t\tconst isBEmpty = bValue === undefined || bValue === null || bValue === '';\n\n\t\tif (isAEmpty && isBEmpty) return 0;\n\t\tif (isAEmpty) return undefinedPosition === 'start' ? -1 : 1;\n\t\tif (isBEmpty) return undefinedPosition === 'start' ? 1 : -1;\n\n\t\treturn compareValues(aValue, bValue, valueType);\n\t});\n\n\treturn arrayCopy;\n}\n","export function stringCut(string: string, limit: number, ending = '...'): string {\n\tif (string.length > limit) {\n\t\treturn `${string.substring(0, limit).trim()}${ending}`;\n\t}\n\treturn string;\n}\n","export function toTimeFormat(totalSeconds: number): string {\n\tconst totalMs = totalSeconds * 1000;\n\tconst result = new Date(totalMs).toISOString().slice(11, 19);\n\tif (result.match(/^00/)) return result.slice(3);\n\treturn result;\n}\n","import { isObject } from './is-object';\n\ntype ArrItem = string;\ntype ObjItem = Record<string, string | number>;\n\nexport function trimEndEmptyValues(\n\tarray: ArrItem[] | ObjItem[],\n\tkey?: string,\n): ArrItem[] | ObjItem[] {\n\tconst arrayCopy = array.slice();\n\tconst arrayFirstItem = arrayCopy[0];\n\tif (typeof arrayFirstItem !== 'string' && !isObject(arrayFirstItem))\n\t\tthrow new Error('Invalid value');\n\tif (isObject(arrayFirstItem) && !key) throw new Error('No key provided');\n\n\tlet lastColumnRow = 0;\n\tif (!key && typeof arrayFirstItem === 'string') {\n\t\tlastColumnRow =\n\t\t\tarray.length - (arrayCopy as ArrItem[]).reverse().findIndex((cell) => cell !== '');\n\t} else if (key && typeof arrayFirstItem !== 'string') {\n\t\tlastColumnRow =\n\t\t\tarray.length - (arrayCopy as ObjItem[]).reverse().findIndex((cell) => cell[key] !== '');\n\t}\n\treturn arrayCopy.reverse().splice(0, lastColumnRow);\n}\n","import { isObject } from './is-object';\n\ntype ArrItem = string;\ntype ObjItem = Record<string, string | number>;\n\nexport function trimStartEmptyValues(\n\tarray: ArrItem[] | ObjItem[],\n\tkey?: string,\n): ArrItem[] | ObjItem[] {\n\tconst arrayFirstItem = array[0];\n\tif (typeof arrayFirstItem !== 'string' && !isObject(arrayFirstItem))\n\t\tthrow new Error('Invalid value');\n\tif (isObject(arrayFirstItem) && !key) throw new Error('No key provided');\n\n\tconst arrayCopy = array.slice();\n\n\tlet lastColumnRow = 0;\n\tif (!key && typeof arrayFirstItem === 'string') {\n\t\tlastColumnRow = (arrayCopy as ArrItem[]).findIndex((cell) => cell !== '');\n\t} else if (key && typeof arrayFirstItem !== 'string') {\n\t\tlastColumnRow = (arrayCopy as ObjItem[]).findIndex((cell) => cell[key] !== '');\n\t}\n\treturn arrayCopy.splice(lastColumnRow);\n}\n","import { PACKAGE_NAME } from './constants/package-name';\nimport { errorHandler } from './error-handler';\n\nexport type WriteTextToClipboardReturn = boolean;\n\nexport async function writeTextToClipboard(text: string): Promise<WriteTextToClipboardReturn> {\n\tif (text) {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tconst { message } = errorHandler({ error, title: PACKAGE_NAME });\n\t\t\tthrow new Error(message);\n\t\t}\n\t}\n\treturn false;\n}\n","import * as lab from './_lab';\nimport * as legacy from './legacy';\n\nexport * from './add-id';\nexport * from './class-name';\nexport * from './clear-local-storage-and-reload';\nexport * from './create-html-elem';\nexport * from './detect-value-type';\nexport * from './error-handler';\nexport * from './escape-html';\nexport * from './get-changed-properties';\nexport * from './get-common-values';\nexport * from './get-current-date-in-ms';\nexport * from './get-current-time-with-offset';\nexport * from './get-different-values';\nexport * from './get-elem-by-key';\nexport * from './get-formatted-date';\nexport * from './get-index-by-key';\nexport * from './get-indexes-of-non-empty-elements';\nexport * from './get-match-soft';\nexport * from './get-match';\nexport * from './get-obj-key-by-value';\nexport * from './get-random-hex-color';\nexport * from './get-random-number';\nexport * from './get-random-rgb-color';\nexport * from './get-scroll-direction';\nexport * from './get-today';\nexport * from './get-value-type';\nexport * from './group-by';\nexport * from './hide-email';\nexport * from './interpolate';\nexport * from './is-arrays-equal';\nexport * from './is-client';\nexport * from './is-object-empty';\nexport * from './is-object-has-value';\nexport * from './is-object-valid';\nexport * from './is-object';\nexport * from './is-valid-url';\nexport * from './join-with';\nexport * from './join';\nexport * from './kebab-to-camel-case';\nexport * from './log';\nexport * from './parse-current-date-from-ms';\nexport * from './remove-empty-values';\nexport * from './set-interval-counts';\nexport * from './shuffle-array';\nexport * from './sort-array-local-compare';\nexport * from './sort-array-of-obj';\nexport * from './string-cut';\nexport * from './to-time-format';\nexport * from './trim-end-empty-values';\nexport * from './trim-start-empty-values';\nexport * from './write-text-to-clipboard';\n\nexport { lab, legacy };\n\nconst a = {\n\tlab,\n\tlegacy,\n};\n\nexport default a;\n"],"mappings":"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