@andrew_l/toolkit 0.2.13 → 0.2.15
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.cjs +354 -40
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +75 -2
- package/dist/index.d.mts +75 -2
- package/dist/index.d.ts +75 -2
- package/dist/index.mjs +353 -41
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/is.ts","../src/array/arrayable/arrayable.ts","../src/array/avg/avg.ts","../src/array/avgCircular/avgCircular.ts","../src/array/chunk/chunk.ts","../src/array/chunkSeries/chunkSeries.ts","../src/array/difference/difference.ts","../src/array/groupBy/groupBy.ts","../src/array/intersection/intersection.ts","../src/array/keyBy/keyBy.ts","../src/array/orderBy/compareAscending.ts","../src/array/orderBy/orderBy.ts","../src/array/shuffle/shuffle.ts","../src/array/sum/sum.ts","../src/array/uniq/uniq.ts","../src/array/union/union.ts","../src/object/get/get.ts","../src/array/uniqBy/uniqBy.ts","../src/assert/AssertionError.ts","../src/assert/assert.ts","../src/array/weightedRoundRobin/weightedRoundRobin.ts","../src/binary/base64/Base64Encoding.ts","../src/binary/base64/index.ts","../src/binary/base64ToBytes/base64ToBytes.ts","../src/binary/bigIntBytes/bigIntBytes.ts","../src/binary/bigIntFromBytes/bigIntFromBytes.ts","../src/binary/bytesToBase64/bytesToBase64.ts","../src/binary/compareBytes/compareBytes.ts","../src/binary/concatenateBytes/concatenateBytes.ts","../src/binary/uint16ToUint8/uint16ToUint8.ts","../src/binary/uint32ToUint8/uint32ToUint8.ts","../src/binary/uint8ToUint16/uint8ToUint16.ts","../src/binary/uint8ToUint32/uint8ToUint32.ts","../src/object/def/def.ts","../src/str/randomString/randomString.ts","../src/cache/createWithCache/utils.ts","../src/cache/createWithCache/createWithCache.ts","../src/cache/withCache/withCache.ts","../src/cache/FixedMap/utils.ts","../src/cache/FixedMap/FixedMap.ts","../src/cache/TimeBucket/TimeBucket.ts","../src/cache/withCacheBucket/withCacheBucket.ts","../src/cache/withCacheFixed/withCacheFixed.ts","../src/cache/LruCache/LruCache.ts","../src/cache/withCacheLRU/withCacheLRU.ts","../src/cache/dropCache/dropCache.ts","../src/cache/FixedWeakMap/FixedWeakMap.ts","../src/cache/isCached/isCached.ts","../src/cache/withCacheBucketBatch/withCacheBucketBatch.ts","../src/object/cleanEmpty/cleanEmpty.ts","../src/object/cleanObject/cleanObject.ts","../src/object/deepAssign/deepAssign.ts","../src/object/deepClone/deepClone.ts","../src/object/deepCloneWith/deepCloneWith.ts","../src/object/deepDefaults/deepDefaults.ts","../src/object/deepFreeze/deepFreeze.ts","../src/object/flagsToMap/flagsToMap.ts","../src/object/flatten/flatten.ts","../src/object/has/has.ts","../src/object/hasOwn/hasOwn.ts","../src/object/omit/omit.ts","../src/object/omitPrefixed/omitPrefixed.ts","../src/object/pick/pick.ts","../src/object/pickPrefixed/pickPrefixed.ts","../src/object/set/set.ts","../src/object/toMap/toMap.ts","../src/object/unflatten/unflatten.ts","../src/object/unset/unset.ts","../src/cache/withDeepClone/withDeepClone.ts","../src/cache/withPointerCache/withPointerCache.ts","../src/captureStackTrace.ts","../src/toError.ts","../src/catchError.ts","../src/num/clamp/clamp.ts","../src/colors/parseAlpha/parseAlpha.ts","../src/colors/hexToChannels/parseHEX.ts","../src/num/parsePercentage/parsePercentage.ts","../src/colors/utils.ts","../src/colors/hslToChannels/parseHSL.ts","../src/num/checkBitmask/checkBitmask.ts","../src/num/getRandomInt/getRandomInt.ts","../src/num/createRandomizer/createRandomizer.ts","../src/num/findMean/findMean.ts","../src/num/formatNumber/formatNumber.ts","../src/num/round2digits/round2digits.ts","../src/num/formatMoney/formatMoney.ts","../src/num/humanize/humanize.ts","../src/num/parseAllNumbers/parseAllNumbers.ts","../src/num/percentOf/percentOf.ts","../src/colors/rgbToChannels/parseRGB.ts","../src/colors/buildCssColor/buildCssColor.ts","../src/colors/hexToChannels/hexToChannels.ts","../src/colors/hslToChannels/hslToChannels.ts","../src/colors/rgbToChannels/rgbToChannels.ts","../src/colors/colorToChannels/colorToChannels.ts","../src/colors/alpha/alpha.ts","../src/colors/blendColors/blendColors.ts","../src/colors/channelsToHex/channelsToHex.ts","../src/colors/channelsToHSL/channelsToHSL.ts","../src/colors/channelsToRGB/channelsToRGB.ts","../src/colors/contrastRatio/contrastRatio.ts","../src/colors/cssVariable/cssVariable.ts","../src/colors/interpolateColor/interpolateColor.ts","../src/colors/luminance/luminance.ts","../src/colors/tintedTextColor/tintedTextColor.ts","../src/colors/index.ts","../src/crypto/crc32/crc32.ts","../src/date/isDateObject/isDateObject.ts","../src/date/createDateObject/createDateObject.ts","../src/date/isTimeObject/isTimeObject.ts","../src/date/createTimeObject/createTimeObject.ts","../src/date/createTimeSpan/TimeSpan.ts","../src/date/createTimeSpan/createTimeSpan.ts","../src/date/timestampMs/timestampMs.ts","../src/date/dateInDays/dateInDays.ts","../src/date/dateInSeconds/dateInSeconds.ts","../src/date/getRandomTime/getRandomTime.ts","../src/date/hmToSeconds/hmToSeconds.ts","../src/date/isTimeString/isTimeString.ts","../src/date/isTimeValue/isTimeValue.ts","../src/date/isValidWeekDay/isValidWeekDay.ts","../src/date/secondsToHm/secondsToHm.ts","../src/date/timeFromMinutes/timeFromMinutes.ts","../src/date/timestamp/timestamp.ts","../src/date/timestampToDate/timestampToDate.ts","../src/date/timeStringify/timeStringify.ts","../src/date/timeToMinutes/timeToMinutes.ts","../src/date/weeksInYear/weeksInYear.ts","../src/ejson/types.ts","../src/ejson/EJSON.ts","../src/ejson/createEJSON.ts","../src/ejson/EJSONStream.ts","../src/ejson/instance.ts","../src/ejson/createEJSONStream.ts","../src/env.ts","../src/errors/AppError.ts","../src/errors/BrowserAssertionError.ts","../src/files/getFileExtension/getFileExtension.ts","../src/str/hasProtocol/hasProtocol.ts","../src/files/getFileName/getFileName.ts","../src/files/getMostSpecificPaths/getMostSpecificPaths.ts","../src/files/humanFileSize/humanFileSize.ts","../src/function/debounce/debounce.ts","../src/function/execResult.ts","../src/function/typeOf/typeOf.ts","../src/function/qs/qs.ts","../src/promise/defer/defer.ts","../src/promise/fastIdle/fastIdle.ts","../src/promise/delay/delay.ts","../src/function/retryOnError/retryOnError.ts","../src/function/throttle/throttle.ts","../src/str/sprintf/sprintf.ts","../src/logger.ts","../src/promise/asyncFilter/asyncFilter.ts","../src/promise/nextTickIteration/nextTickIteration.ts","../src/promise/asyncFind/asyncFind.ts","../src/promise/asyncForEach/asyncForEach.ts","../src/promise/SimpleEventEmitter/SimpleEventEmitter.ts","../src/promise/Queue/Queue.ts","../src/promise/AsyncIterableQueue/AsyncIterableQueue.ts","../src/promise/asyncMap/asyncMap.ts","../src/promise/CancellablePromise/CancellablePromise.ts","../src/promise/fastRaf/fastRaf.ts","../src/promise/timeout/timeout.ts","../src/str/capitalize/capitalize.ts","../src/str/getWords/getWords.ts","../src/str/camelCase/camelCase.ts","../src/str/convertToUnit/convertToUnit.ts","../src/str/escapeHtml/escapeHtml.ts","../src/str/escapeNumeric/escapeNumeric.ts","../src/str/escapeRegExp/escapeRegExp.ts","../src/str/twemojiRegex/twemojiRegex.ts","../src/str/isOneEmoji/isOneEmoji.ts","../src/str/getInitials/getInitials.ts","../src/str/hex/hex.ts","../src/str/isoToFlagEmoji/isoToFlagEmoji.ts","../src/str/kebabCase/kebabCase.ts","../src/str/lowerCase/lowerCase.ts","../src/str/maskingWords/maskingWords.ts","../src/str/maskingEmail/maskingEmail.ts","../src/str/maskingPhone/maskingPhone.ts","../src/str/objectId/objectId.ts","../src/str/snakeCase/snakeCase.ts","../src/str/startCase/startCase.ts","../src/str/strAssign/strAssign.ts","../src/str/truncate/truncate.ts","../src/str/wrapText/wrapText.ts"],"sourcesContent":["import type { Primitive } from './types';\n\n/**\n * Determines if the window object is available in the global scope\n *\n * @group Predicates\n */\nexport const isClient = typeof (globalThis as any)?.window !== 'undefined';\n\n/**\n * Returns `true` when value is not `undefined`\n * @group Predicates\n */\nexport const isDef = <T = any>(val?: T): val is T => typeof val !== 'undefined';\n\nconst toString = Object.prototype.toString;\n\n/**\n * Checks if the given value is a `null` or `undefined`\n * @group Predicates\n */\nexport function isNullOrUndefined(value: unknown): value is undefined | null {\n return value === null || value === undefined;\n}\n\n/**\n * Checks if the given value is a `bigint`\n * @group Predicates\n */\nexport const isBigInt = (val: any): val is bigint => typeof val === 'bigint';\n\n/**\n * Checks if the given value is a `boolean`\n * @group Predicates\n */\nexport const isBoolean = (val: any): val is boolean => typeof val === 'boolean';\n\n/**\n * Checks if the given value is a `function`\n * @group Predicates\n */\nexport const isFunction = <T extends Function>(val: any): val is T =>\n typeof val === 'function';\n\n/**\n * Checks if the given value is a `number`\n *\n * @example\n * console.log(isNumber(123)); // true\n * console.log(isNumber('abc')); // false\n * console.log(isNumber(NaN)); // false\n *\n * @group Predicates\n */\nexport const isNumber = (val: any): val is number =>\n typeof val === 'number' && !isNaN(val);\n\n/**\n * Checks if the given value is a `Infinity` number.\n *\n * @example\n * console.log(isInfinity(123)); // false\n * console.log(isNumber(Infinity)); // true\n * console.log(isNumber(-Infinity)); // true\n *\n * @group Predicates\n */\nexport const isInfinity = (val: any): val is number =>\n val === Infinity || val === -Infinity;\n\n/**\n * Checks if the given value is a `string`\n * @group Predicates\n */\nexport const isString = (val: unknown): val is string =>\n typeof val === 'string';\n\n/**\n * Checks if the given value is a `object`\n * @group Predicates\n */\nexport const isObject = (val: any): val is object =>\n toString.call(val) === '[object Object]';\n\n/**\n * Checks if the given value is a plain `object`\n * @group Predicates\n */\nexport const isPlainObject = (val: any): val is object => {\n let ctor, prot;\n\n if (!isObject(val)) return false;\n\n // If it has modified constructor\n ctor = val.constructor;\n if (ctor === undefined) return true;\n\n // If it has modified prototype\n prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n};\n\n/**\n * Checks if the given value is valid `Date`\n * @group Predicates\n */\nexport const isDate = (val: any): val is Date =>\n val instanceof Date && !isNaN(val as any);\n\n/**\n * Function that does nothing\n * @group Utility Functions\n */\nexport const noop = () => {};\n\n/**\n * Checks if the given value is a `Error`\n * @group Predicates\n */\nexport const isError = (val: any): val is Error =>\n val instanceof Error ||\n //@ts-expect-error\n (isObject(val) && isString(val.message) && isString(val.stack));\n\n/**\n * Checks if the given value is a `symbol`\n * @group Predicates\n */\nexport const isSymbol = (val: any): val is Symbol => typeof val == 'symbol';\n\n/**\n * Checks if the given value is a `Set`.\n * @group Predicates\n */\nexport const isSet = <T = any>(val: any): val is Set<T> => val instanceof Set;\n\n/**\n * Checks if the given value is a `RegExp`.\n * @group Predicates\n */\nexport const isRegExp = (val: any): val is RegExp => val instanceof RegExp;\n\n/**\n * Checks if the given value is a `WeekSet`.\n * @group Predicates\n */\nexport const isWeakSet = <T extends WeakKey = any>(\n val: any,\n): val is WeakSet<T> => val instanceof WeakSet;\n\n/**\n * Checks if the given value is a `Map`.\n * @group Predicates\n */\nexport const isMap = <K = any, V = any>(val: any): val is Map<K, V> =>\n val instanceof Map;\n\n/**\n * Checks if the given value is a `WeakMap`.\n * @group Predicates\n */\nexport const isWeakMap = <V = any>(val: any): val is WeakMap<WeakKey, V> =>\n val instanceof WeakMap;\n\n/**\n * Checks if two values are equal, including support for `Date`, `RegExp`, and deep object comparison.\n *\n * @param {unknown} a - The first value to compare.\n * @param {unknown} b - The second value to compare.\n * @returns {boolean} `true` if the values are equal, otherwise `false`.\n *\n * @example\n * isEqual(1, 1); // true\n * isEqual({ a: 1 }, { a: 1 }); // true\n * isEqual(/abc/g, /abc/g); // true\n * isEqual(new Date('2020-01-01'), new Date('2020-01-01')); // true\n * isEqual([1, 2, 3], [1, 2, 3]); // true\n *\n * @group Predicates\n */\nexport function isEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) {\n return true;\n }\n\n if (\n typeof a !== 'object' ||\n typeof b !== 'object' ||\n a === null ||\n b === null\n ) {\n return false;\n }\n\n if (a.constructor !== b.constructor) {\n return false;\n }\n\n if (Array.isArray(a)) {\n const { length } = a;\n if (length !== (b as any[]).length) {\n return false;\n }\n\n for (let i = length; i-- !== 0; ) {\n if (!isEqual(a[i], (b as any[])[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n if (a instanceof Date) {\n return a.getTime() === (b as Date).getTime();\n }\n\n if (a instanceof RegExp) {\n return a.source === (b as RegExp).source && a.flags === (b as RegExp).flags;\n }\n\n if (a instanceof Set) {\n if (a.size !== (b as Set<any>).size) {\n return false;\n }\n\n for (const value of a) {\n if (!(b as Set<any>).has(value)) {\n return false;\n }\n }\n\n return true;\n }\n\n if (a instanceof Map) {\n if (a.size !== (b as Map<any, any>).size) {\n return false;\n }\n\n for (const entry of a) {\n if (\n !(b as Map<any, any>).has(entry[0]) ||\n !isEqual(entry[1], (b as Map<any, any>).get(entry[0]))\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n if (a instanceof DataView) {\n const { byteLength } = a;\n\n if (byteLength !== (b as DataView).byteLength) {\n return false;\n }\n\n for (let i = byteLength; i-- !== 0; ) {\n if (a.getUint8(i) !== (b as DataView).getUint8(i)) {\n return false;\n }\n }\n\n return true;\n }\n\n if (a instanceof ArrayBuffer && b instanceof ArrayBuffer) {\n a = new Uint8Array(a);\n b = new Uint8Array(b);\n }\n\n if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n const { length } = a as Uint8Array;\n if (length !== (b as Uint8Array).length) {\n return false;\n }\n\n for (let i = length; i-- !== 0; ) {\n if ((a as Uint8Array)[i] !== (b as Uint8Array)[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n const aKeys = Object.keys(a as object);\n const bKeys = Object.keys(b as object);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n let key: any;\n\n for (let i = aKeys.length; i-- !== 0; ) {\n key = aKeys[i];\n if (\n !Object.hasOwn(b as any, key) ||\n !isEqual((a as any)[key], (b as any)[key])\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if a given value is empty.\n *\n * Support for `Array`, `Object`, `string` `Map`, `Set`.\n *\n * @example\n * isEmpty(); // true\n * isEmpty(null); // true\n * isEmpty(''); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty(new Map()); // true\n * isEmpty(new Set()); // true\n * isEmpty('hello'); // false\n * isEmpty([1, 2, 3]); // false\n * isEmpty({ a: 1 }); // false\n * isEmpty(new Map([['key', 'value']])); // false\n * isEmpty(new Set([1, 2, 3])); // false\n *\n * @group Predicates\n */\nexport const isEmpty = (obj: any): boolean => {\n if (obj === null || obj === undefined) return true;\n\n switch (obj?.constructor) {\n case Object: {\n for (const _ in obj) {\n return false;\n }\n\n return true;\n }\n\n case Array: {\n for (const _ in obj) {\n return false;\n }\n\n return true;\n }\n\n case String: {\n return !obj.length;\n }\n\n case Map: {\n return !obj.size;\n }\n\n case Set: {\n return !obj.size;\n }\n }\n\n return false;\n};\n\n/**\n * Checks if the given value is a `Promise`\n * @group Predicates\n */\nexport function isPromise<T = void>(value: unknown): value is Promise<T> {\n return (\n value instanceof Promise ||\n (!!value &&\n typeof value === 'object' &&\n 'then' in value &&\n 'catch' in value &&\n typeof value.then === 'function' &&\n typeof value.catch === 'function')\n );\n}\n\nconst primitiveTypeofSet = Object.freeze(\n new Set(['string', 'number', 'boolean', 'bigint', 'symbol', 'undefined']),\n);\n\n/**\n * Checks whether a value is a JavaScript primitive.\n *\n * JavaScript primitives include null, undefined, strings, numbers, booleans, symbols, and bigints.\n * @group Predicates\n */\nexport const isPrimitive = (value: unknown): value is Primitive => {\n return value === null || primitiveTypeofSet.has(typeof value);\n};\n","import { isString } from '@/is';\n\ntype ItemType<T> =\n T extends Array<infer X>\n ? X\n : T extends string\n ? string\n : Exclude<T, null | undefined>;\n\ntype ArrayableValue<T> = T extends object ? Readonly<T> : T;\n\n/**\n * Converts a value into an array. This function handles different types of input,\n * converting them to arrays as follows:\n * - If the value is already an array, it returns it as-is.\n * - If the value is a string, it splits the string by commas and trims the elements.\n * - If the value is null or undefined, it returns an empty array.\n * - Otherwise, it wraps the value in an array.\n *\n * @example\n * arrayable(42); // [42]\n * arrayable('a, b, c'); // ['a', 'b', 'c']\n * arrayable([1, 2, 3]); // [1, 2, 3]\n * arrayable(null); // []\n * arrayable(undefined); // []\n *\n * @param value The value to convert into an array. It can be of any type.\n * @returns An array derived from the input value.\n *\n * @group Array\n */\nexport function arrayable<T>(value: ArrayableValue<T>): ItemType<T>[] {\n const result: any = Array.isArray(value)\n ? value\n : value === null\n ? []\n : value === undefined\n ? []\n : isString(value)\n ? value\n .split(',')\n .map(v => v.trim())\n .filter(Boolean)\n : [value];\n\n return result;\n}\n","import { isNumber } from '@/is';\n\n/**\n * Calculates the average value from an array of numbers.\n *\n * The function sums up all valid numbers in the array and divides by the count of those valid numbers.\n * If the array is empty or contains no valid numbers, it returns `0`.\n *\n * @example\n * avg([5, 5, 5]); // 5\n * avg([10, 20, 30]); // 20\n * avg([1, 2, 'three', 4]); // 2.33 (ignores non-numeric values)\n * avg([]); // 0\n *\n * @param values An array of numbers (could include invalid values, which will be ignored).\n * @returns The average value of the valid numbers in the array, or `0` if no valid numbers exist.\n *\n * @group Array\n */\nexport const avg = (values: readonly number[]) => {\n let sum = 0;\n let amount = 0;\n\n for (const item of values) {\n if (!isNumber(item)) continue;\n sum += item;\n amount++;\n }\n\n if (amount === 0) return 0;\n\n return sum / amount;\n};\n","/**\n * Computes the average of circular values using vector summation.\n *\n * This function calculates the circular mean of an array of values,\n * which is useful for cyclic data (e.g., time of day, angles).\n *\n * @param {readonly number[]} values - The array of numbers representing circular values.\n * @param {number} max - The maximum possible value in the cycle (e.g., 24 for hours, 360 for degrees).\n * @returns {number} - The computed circular mean, wrapped within the range [0, max).\n *\n * @example\n * // Averaging angles in degrees\n * avgCircular([350, 10, 20], 360); // Returns approximately 0\n *\n * @example\n * // Averaging times in hours (on a 24-hour clock)\n * avgCircular([23, 1, 2], 24); // Returns approximately 0\n *\n * @group Array\n */\nexport const avgCircular = (values: readonly number[], max: number) => {\n const len = values.length;\n\n if (!len) return 0;\n\n let sumX = 0;\n let sumY = 0;\n let angle: number;\n let value: number;\n\n for (value of values) {\n angle = (value / max) * 2 * Math.PI;\n sumX += Math.cos(angle);\n sumY += Math.sin(angle);\n }\n\n angle = Math.atan2(sumY / len, sumX / len);\n\n return ((angle / (2 * Math.PI)) * max + max) % max;\n};\n","/**\n * Splits an array into smaller sub-arrays (chunks) of a specified size.\n *\n * If the array can't be evenly divided, the last chunk will contain the remaining elements.\n *\n * @example\n * const data = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n * const chunkSize = 3;\n * const result = chunk(data, chunkSize);\n * console.log(result);\n * // [\n * // [1, 2, 3],\n * // [4, 5, 6],\n * // [7, 8, 9]\n * // ]\n *\n * @example\n * const data = [1, 2, 3, 4, 5];\n * const chunkSize = 2;\n * const result = chunk(data, chunkSize);\n * console.log(result);\n * // [\n * // [1, 2],\n * // [3, 4],\n * // [5]\n * // ]\n *\n * @param list The array to be split into chunks.\n * @param size The size of each chunk. Defaults to `1` if not specified.\n * @returns An array of arrays (chunks), each containing up to `size` elements from the original array.\n *\n * @group Array\n */\nexport function chunk<T>(list: readonly T[], size: number = 1): T[][] {\n return list.reduce((res, item, index) => {\n if (index % size === 0) {\n res.push([]);\n }\n res[res.length - 1].push(item);\n return res;\n }, [] as T[][]);\n}\n","/**\n * Collapses a continuous series into a tuple of two elements.\n *\n * Where the first element is the beginning of the series.\n * Where the second element is the end of the series.\n *\n * ⚠️ Tuple may consist only one element if the series not started, like: [1, 3] => [[1], [3]]\n *\n * @example\n * const numbers = [1, 2, 3, 8, 9, 10, 15];\n *\n * chunkSeries(numbers); // [[1, 3], [8, 10], [15]]\n *\n * @group Array\n */\nexport function chunkSeries(list: number[], step = 1): number[][] {\n const result: number[][] = [];\n\n if (!list.length) {\n return result;\n }\n\n const sortedList = [...list].sort();\n\n let currentRange = [list[0]];\n let currentValue: number;\n\n for (let idx = 1; idx < sortedList.length; idx++) {\n currentValue = sortedList[idx];\n\n if (currentValue - currentRange.at(-1)! > step) {\n result.push(currentRange);\n currentRange = [currentValue];\n } else {\n currentRange[1] = currentValue;\n }\n }\n\n result.push(currentRange);\n\n return result;\n}\n","/**\n * Computes the difference between arrays.\n *\n * This function takes arrays and returns a new array containing the elements\n * that are not present in any other arrays.\n *\n * @template T\n * @param arrays - The arrays from which to derive the difference.\n * @returns {T[]} A new array containing the elements that are not present in other arrays.\n *\n * @example\n * const array1 = [1, 2, 3, 4, 5];\n * const array2 = [2, 4];\n * const array3 = [1, 5];\n * const result = difference(array1, array2, array3);\n * // result will be [3] since 1, 2, 4 and 5 are in other arrays and are excluded from the result.\n */\nexport function difference<T>(...arrays: readonly T[][]): T[] {\n if (arrays.length === 0) return [];\n if (arrays.length === 1) return [...arrays[0]];\n\n const [first, ...rest] = arrays;\n const blacklist = new Set();\n const set = new Set(first);\n\n for (const items of rest) {\n for (const item of items) {\n if (blacklist.has(item)) continue;\n if (set.has(item)) {\n set.delete(item);\n blacklist.add(item);\n continue;\n }\n\n set.add(item);\n }\n }\n\n return Array.from(set);\n}\n","import { isFunction } from '@/is';\nimport type { IsPropertyKey, MaybePropertyKey } from '../keyBy/types';\n\nexport function groupBy<T, K extends MaybePropertyKey<T>>(\n array: readonly T[],\n keyBy: K,\n objectMode?: false,\n): Map<IsPropertyKey<T, K, K>, T[]>;\n\nexport function groupBy<T, K>(\n array: readonly T[],\n keyBy: (item: T) => K,\n objectMode?: false,\n): Map<K, T[]>;\n\nexport function groupBy<T, K extends MaybePropertyKey<T>>(\n array: readonly T[],\n keyBy: K,\n objectMode: true,\n): Record<K, T[]>;\n\nexport function groupBy<T, K extends PropertyKey>(\n array: readonly T[],\n keyBy: (item: T) => K,\n objectMode: true,\n): Record<K, T[]>;\n\nexport function groupBy(\n array: readonly any[],\n keyBy: unknown | ((item: any) => unknown),\n objectMode?: boolean,\n): any {\n const getItemKey = isFunction(keyBy)\n ? keyBy\n : (item: any) => item?.[keyBy as any];\n\n let key;\n\n if (objectMode === true) {\n const result: Record<any, any> = {};\n\n for (const item of array) {\n key = getItemKey(item);\n result[key] = result[key] || [];\n result[key].push(item);\n }\n\n return result as any;\n }\n\n const result = new Map();\n\n for (const item of array) {\n key = getItemKey(item);\n\n if (!result.has(key)) {\n result.set(key, [item]);\n } else {\n result.get(key).push(item);\n }\n }\n\n return result;\n}\n","/**\n * Returns the intersection of arrays.\n *\n * This function takes arrays and returns a new array containing the elements that are\n * present in all arrays.\n *\n * @template T - The type of elements in the array.\n * @returns {T[]} A new array containing the elements that are present in both arrays.\n *\n * @example\n * const array1 = [1, 2, 3, 4, 5];\n * const array2 = [3, 4, 5, 6, 7];\n * const result = intersection(array1, array2);\n * // result will be [3, 4, 5] since these elements are in both arrays.\n */\nexport function intersection<T>(...arrays: readonly T[][]): T[] {\n if (arrays.length === 0) return [];\n if (arrays.length === 1) return arrays[0];\n\n return arrays.reduce((acc, curr) => {\n const set = new Set(curr);\n return acc.filter(item => set.has(item));\n });\n}\n","import { isFunction } from '@/is';\nimport type { IsPropertyKey, MaybePropertyKey } from './types';\n\n/**\n * Maps each element of an array based on a provided key.\n *\n * @example\n * const data = [\n * { id: 1, name: 'group 1' },\n * { id: 2, name: 'group 2' },\n * { id: 1, name: 'group 2' }\n * ];\n *\n * const result = keyBy(data, 'id');\n * console.log(Object.entries(result));\n * // [\n * // [1, [{ id: 1, name: 'group 1' }, { id: 1, name: 'group 2' }],\n * // [2, { id: 2, name: 'group 2' }],\n * // ]\n *\n * @group Array\n */\nexport function keyBy<T, K extends MaybePropertyKey<T>>(\n array: readonly T[],\n keyBy: K,\n objectMode?: false,\n): Map<IsPropertyKey<T, K, K>, T>;\n\nexport function keyBy<T, K>(\n array: readonly T[],\n keyBy: (item: T) => K,\n objectMode?: false,\n): Map<K, T>;\n\nexport function keyBy<T, K extends MaybePropertyKey<T>>(\n array: readonly T[],\n keyBy: K,\n objectMode: true,\n): Record<K, T>;\n\nexport function keyBy<T, K extends PropertyKey>(\n array: readonly T[],\n keyBy: (item: T) => K,\n objectMode: true,\n): Record<K, T>;\n\nexport function keyBy(\n array: readonly any[],\n keyBy: unknown | ((item: any) => unknown),\n objectMode?: boolean,\n): any {\n const getItemKey = isFunction(keyBy)\n ? keyBy\n : (item: any) => item?.[keyBy as any];\n\n if (objectMode === true) {\n const result: Record<any, any> = {};\n\n for (const item of array) {\n result[getItemKey(item)] = item;\n }\n\n return result as any;\n }\n\n const result = new Map();\n\n for (const item of array) {\n result.set(getItemKey(item), item);\n }\n\n return result as any;\n}\n","import { isSymbol } from '@/is';\n\nexport function compareAscending(value: any, other: any) {\n if (value !== other) {\n const valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n const othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if (\n (!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol &&\n othIsDefined &&\n othIsReflexive &&\n !othIsNull &&\n !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive\n ) {\n return 1;\n }\n if (\n (!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol &&\n valIsDefined &&\n valIsReflexive &&\n !valIsNull &&\n !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive\n ) {\n return -1;\n }\n }\n return 0;\n}\n","import { isFunction } from '@/is';\nimport { compareAscending } from './compareAscending';\n\n/**\n * Sort array by multiple fields\n *\n * @example\n * // Sample data: an array of objects representing users\n * const users = [\n * { name: 'Alice', age: 30, score: 85 },\n * { name: 'Bob', age: 25, score: 90 },\n * { name: 'Charlie', age: 35, score: 90 },\n * { name: 'Dave', age: 30, score: 70 },\n * ];\n *\n * // Sort users first by score in descending order, then by age in ascending order\n * const sortedUsers = orderBy(users, ['score', 'age'], ['desc', 'asc']);\n *\n * // Output the sorted array\n * console.log(sortedUsers);\n *\n * @group Array\n */\nexport function orderBy<T>(\n array: readonly T[],\n fields: (string | ((item: T) => any))[],\n orders: ('asc' | 'desc')[],\n): readonly T[] {\n return [...array].sort((a, b) => {\n let index = -1,\n length = fields.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n const field = fields[index];\n const filedFn = isFunction(field);\n\n const objCriteria = filedFn ? field(a) : (a as any)?.[field];\n const othCriteria = filedFn ? field(b) : (b as any)?.[field];\n\n const result = compareAscending(objCriteria, othCriteria);\n\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n return result * (orders[index] === 'desc' ? -1 : 1);\n }\n }\n\n return 0;\n });\n}\n","/**\n * Randomizes the order of elements in an array using the Fisher-Yates algorithm.\n *\n * This function takes an array and returns a new array with its elements shuffled in a random order.\n *\n * @template T - The type of elements in the array.\n * @param {T[]} arr - The array to shuffle.\n * @returns {T[]} A new array with its elements shuffled in random order.\n *\n * @example\n * const array = [1, 2, 3, 4, 5];\n * const shuffledArray = shuffle(array);\n * // shuffledArray will be a new array with elements of array in random order, e.g., [3, 1, 4, 5, 2]\n */\nexport function shuffle<T>(arr: readonly T[]): T[] {\n const result = arr.slice();\n\n /**\n * https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm\n */\n for (let i = result.length - 1; i >= 1; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [result[i], result[j]] = [result[j], result[i]];\n }\n\n return result;\n}\n","import { isNumber } from '@/is';\n\n/**\n * Sums the values in an array of numbers, ignoring non-numeric values.\n *\n * This function adds all valid numbers in the array and returns the sum.\n * Non-numeric values (e.g., `null`, `undefined`, `NaN` are ignored in the sum.\n *\n * @example\n * sum([2, 2]); // 4\n * sum([1, 'a', 3, 4]); // 8 (non-numeric 'a' is ignored)\n * sum([5, null, 10]); // 15 (null is ignored)\n * sum([]); // 0 (empty array returns 0)\n *\n * @param values The array of numbers to be summed.\n * @returns The sum of the numbers in the array.\n *\n * @group Array\n */\nexport const sum = (values: readonly number[]) => {\n return values.reduce((a, b) => a + (isNumber(b) ? b : 0), 0);\n};\n","/**\n * Returns a new array with duplicates removed.\n *\n * This function creates a new array that contains only unique values,\n * preserving the order of the original elements.\n *\n * @example\n * uniq([1, 2, 3, 4, 1, 3]); // [1, 2, 3, 4]\n * uniq([5, 5, 5, 5, 5]); // [5]\n * uniq(['a', 'b', 'a', 'c']); // ['a', 'b', 'c']\n * uniq([]); // [] (returns an empty array for empty input)\n *\n * @param value The array from which duplicates will be removed.\n * @returns A new array containing only the unique values from the input array.\n *\n * @group Array\n */\nexport function uniq<T extends any[]>(value: T): T {\n if (!Array.isArray(value)) {\n return [] as any;\n }\n\n return [...new Set(value)] as T;\n}\n","import { uniq } from '../uniq';\n\n/**\n * Creates an array of unique values from all given arrays.\n *\n * This function takes two arrays, merges them into a single array, and returns a new array\n * containing only the unique values from the merged array.\n *\n * @template T - The type of elements in the array.\n * @param {T[]} arr1 - The first array to merge and filter for unique values.\n * @param {T[]} arr2 - The second array to merge and filter for unique values.\n * @returns {T[]} A new array of unique values.\n *\n * @example\n * const array1 = [1, 2, 3];\n * const array2 = [3, 4, 5];\n * const result = union(array1, array2);\n * // result will be [1, 2, 3, 4, 5]\n *\n * @group Array\n */\nexport function union<T>(...arrays: readonly T[][]): T[] {\n if (arrays.length === 0) return [];\n if (arrays.length === 1) return [...arrays[0]];\n\n const [first, ...rest] = arrays;\n return uniq(first.concat(...rest));\n}\n","import _get from 'lodash/get.js';\n\n/**\n * Get object property by dot notation\n *\n * @example\n * const user = { id: 1, data: { roles: ['admin'] } };\n * const roles = get(user, 'data.roles');\n *\n * console.log(roles) // ['admin']\n *\n * @group Object\n */\nexport const get = _get;\n","import { isFunction } from '@/is';\nimport { get } from '@/object/get';\n\n/**\n * Extracts unique elements from an array based on a comparator function or property key.\n *\n * This function allows you to determine uniqueness based on custom criteria by passing\n * a comparator function or a property key. The function will return a new array containing\n * only the first occurrence of elements that are unique according to the specified comparator.\n * If the comparator is a property key, uniqueness will be determined based on the value\n * of that property.\n *\n * @example\n * const users = [\n * { id: 1, role: 'admin' },\n * { id: 2, role: 'admin' },\n * { id: 3, role: 'user' },\n * { id: 4, role: 'user' },\n * ];\n *\n * const uniqRoles = uniqBy(users, (v) => v.role);\n * // [\n * // { id: 1, role: 'admin' },\n * // { id: 3, role: 'user' },\n * // ]\n *\n * @example\n * const products = [\n * { id: 1, category: 'electronics', name: 'Phone' },\n * { id: 2, category: 'electronics', name: 'Laptop' },\n * { id: 3, category: 'furniture', name: 'Sofa' },\n * ];\n *\n * const uniqCategories = uniqBy(products, 'category');\n * // [\n * // { id: 1, category: 'electronics', name: 'Phone' },\n * // { id: 3, category: 'furniture', name: 'Sofa' },\n * // ]\n *\n * @param array The array to extract unique elements from.\n * @param comparator A function that computes the value to determine uniqueness or a property key.\n * If a string is passed, it is treated as a property key, and uniqueness is\n * determined based on the value of that property.\n * @returns A new array containing only the first occurrence of each unique element based on the comparator.\n *\n * @group Array\n */\nexport function uniqBy<T>(\n array: T[],\n comparator: ((value: T) => any) | PropertyKey,\n): T[] {\n const seen = new Set();\n\n if (!isFunction(comparator)) {\n const key = comparator;\n comparator = value => get(value, key);\n }\n\n return array.filter(value => {\n const computed = (comparator as any)(value);\n const hasSeen = seen.has(computed);\n if (!hasSeen) {\n seen.add(computed);\n }\n return !hasSeen;\n });\n}\n","let AssertionError: any;\n\n(async () => {\n AssertionError = (globalThis as any).window\n ? await import('../errors/BrowserAssertionError').then(\n r => r.BrowserAssertionError,\n )\n : await import('node:assert').then(r => r.AssertionError);\n})();\n\nexport { AssertionError };\n","/* eslint-env node */\nimport {\n isBoolean,\n isDate,\n isEmpty,\n isError,\n isFunction,\n isNumber,\n isObject,\n isString,\n} from '../is';\n\nimport { AssertionError } from './AssertionError.js';\n\nexport function ok(value: unknown, message?: string | Error): asserts value {\n if (!value) {\n throw toError(\n ok,\n value,\n message,\n 'The expression evaluated to a falsy value.',\n );\n }\n}\n\nexport function equal<T>(\n actual: unknown,\n expected: T,\n message?: string | Error,\n): asserts actual is T {\n if (actual !== expected) {\n new AssertionError({\n actual,\n expected,\n message: isString(message)\n ? message\n : 'The actual value not as expected.',\n operator: 'equal',\n stackStartFn: equal,\n });\n }\n}\n\nexport function notEmpty(\n value: unknown,\n message?: string | Error,\n): asserts value {\n if (isEmpty(value)) {\n throw toError(notEmpty, value, message, 'Expected not empty value.');\n }\n}\n\nexport function object(\n value: unknown,\n message?: string | Error,\n): asserts value is object {\n if (!isObject(value)) {\n throw toError(object, value, message, 'Expected object value.');\n }\n}\n\nexport function string(\n value: unknown,\n message?: string | Error,\n): asserts value is string {\n if (!isString(value)) {\n throw toError(string, value, message, 'Expected string value.');\n }\n}\n\nexport function boolean(\n value: unknown,\n message?: string | Error,\n): asserts value is boolean {\n if (!isBoolean(value)) {\n throw toError(boolean, value, message, 'Expected boolean value.');\n }\n}\n\nexport function notEmptyString(\n value: unknown,\n message?: string | Error,\n): asserts value is string {\n if (!isString(value) || !(value as any).trim()) {\n throw toError(\n notEmptyString,\n value,\n message,\n 'Expected not empty string value.',\n );\n }\n}\n\nexport function number(\n value: unknown,\n message?: string | Error,\n): asserts value is number {\n if (!isNumber(value)) {\n throw toError(number, value, message, 'Expected number value.');\n }\n}\n\nexport function date(\n value: unknown,\n message?: string | Error,\n): asserts value is Date {\n if (!isDate(value)) {\n throw toError(date, value, message, 'Expected date value.');\n }\n}\n\nexport function fn(\n value: unknown,\n message?: string | Error,\n): asserts value is Function {\n if (!isFunction(value)) {\n throw toError(fn, value, message, 'Expected function value.');\n }\n}\n\nexport function greaterThan(\n value: unknown,\n target: number,\n message?: string | Error,\n): asserts value is number {\n if (!isNumber(value) || value < target) {\n throw toError(\n greaterThan,\n value,\n message,\n 'Expected number value greater then ' + target + '.',\n );\n }\n}\n\nexport function lessThan(\n value: unknown,\n target: number,\n message?: string | Error,\n): asserts value is number {\n if (!isNumber(value) || value > target) {\n throw toError(\n lessThan,\n value,\n message,\n 'Expected number value less then ' + target + '.',\n );\n }\n}\n\nexport function array(\n value: unknown,\n message?: string | Error,\n): asserts value is unknown[] {\n if (!Array.isArray(value)) {\n throw toError(array, value, message, 'Expected array value.');\n }\n}\n\nexport function arrayStrings(\n value: unknown,\n message?: string | Error,\n): asserts value is string[] {\n if (!Array.isArray(value) || !value.every(isString)) {\n throw toError(arrayStrings, value, message, 'Expected strings list value.');\n }\n}\n\nexport function arrayNumbers(\n value: unknown,\n message?: string | Error,\n): asserts value is number[] {\n if (!Array.isArray(value) || !value.every(isNumber)) {\n throw toError(arrayNumbers, value, message, 'Expected numbers list value.');\n }\n}\n\n/**\n * Transform value to error object\n */\nfunction toError(\n operator: Function,\n actual: unknown,\n message?: string | Error,\n unknownMessage: string = 'Unknown error',\n): Error {\n if (isError(message)) {\n return message as any;\n }\n\n return new AssertionError({\n actual,\n message: isString(message) ? message : unknownMessage,\n operator: operator.name,\n stackStartFn: operator,\n });\n}\n","import { assert } from '@/assert';\n\nexport type WrrItem<T> = {\n item: T;\n weight?: number;\n};\n\ntype WrrItemWeighted = {\n item: any;\n weight: number;\n};\n\n/**\n * Creates a function that returns a weighted round-robin item from the provided array.\n *\n * The input array should contain objects with an `item` property and a `weight` property.\n * The `weight` determines the relative likelihood of selecting an item.\n * Items with higher weights will appear more frequently in the selection.\n *\n * If the `weight` property is missing or falsy, it defaults to `1`.\n * An empty array will result in a function that always returns `undefined`.\n *\n * @example\n * const getItem = weightedRoundRobin([\n * { item: 'a', weight: 2 },\n * { item: 'b', weight: 3 },\n * { item: 'c' },\n * ]);\n *\n * console.log(getItem()); // 'a', 'b', or 'c'\n *\n * @group Array\n */\nexport function weightedRoundRobin<T = unknown>(arr: WrrItem<T>[]): () => T {\n assert.ok(arr.length > 0, 'Array must contain at least one item.');\n\n const instance = new WeightedRoundRobin(\n arr.map(v => ({\n item: v.item,\n weight: Math.min(v.weight ?? 1, 1),\n })),\n );\n\n return () => instance.nextItem();\n}\n\nconst gcd = (a: number, b: number): number => (!b ? a : gcd(b, a % b));\n\nclass WeightedRoundRobin {\n currentIndex = -1;\n currentWeight = 0;\n maxWeight: number;\n gcdWeight: number;\n\n constructor(public items: WrrItemWeighted[]) {\n this.maxWeight = this._calculateMaxWeight();\n this.gcdWeight = this._calculateGCD();\n }\n\n _calculateGCD(): number {\n return this.items.reduce(\n (acc, curr) => gcd(acc, curr.weight),\n this.items[0].weight,\n );\n }\n\n _calculateMaxWeight(): number {\n return Math.max(...this.items.map(s => s.weight));\n }\n\n nextItem(): any {\n const n = this.items.length;\n while (true) {\n this.currentIndex = (this.currentIndex + 1) % n;\n if (this.currentIndex === 0) {\n this.currentWeight -= this.gcdWeight;\n if (this.currentWeight <= 0) {\n this.currentWeight = this.maxWeight;\n }\n }\n if (this.items[this.currentIndex].weight >= this.currentWeight) {\n return this.items[this.currentIndex].item;\n }\n }\n }\n}\n","export class Base64Encoding {\n public alphabet: string;\n public padding: string;\n\n private decodeMap = new Map<string, number>();\n\n constructor(\n alphabet: string,\n options?: {\n padding?: string;\n },\n ) {\n if (alphabet.length !== 64) {\n throw new Error('Invalid alphabet');\n }\n this.alphabet = alphabet;\n this.padding = options?.padding ?? '=';\n if (this.alphabet.includes(this.padding) || this.padding.length !== 1) {\n throw new Error('Invalid padding');\n }\n for (let i = 0; i < alphabet.length; i++) {\n this.decodeMap.set(alphabet[i]!, i);\n }\n }\n\n public encode(\n data: Uint8Array,\n options?: {\n includePadding?: boolean;\n },\n ): string {\n let result = '';\n let buffer = 0;\n let shift = 0;\n for (let i = 0; i < data.length; i++) {\n buffer = (buffer << 8) | data[i]!;\n shift += 8;\n while (shift >= 6) {\n shift += -6;\n result += this.alphabet[(buffer >> shift) & 0x3f];\n }\n }\n if (shift > 0) {\n result += this.alphabet[(buffer << (6 - shift)) & 0x3f];\n }\n const includePadding = options?.includePadding ?? true;\n if (includePadding) {\n const padCount = (4 - (result.length % 4)) % 4;\n for (let i = 0; i < padCount; i++) {\n result += '=';\n }\n }\n return result;\n }\n\n public decode(\n data: string,\n options?: {\n strict?: boolean;\n },\n ): Uint8Array {\n const strict = options?.strict ?? true;\n const chunkCount = Math.ceil(data.length / 4);\n const result: number[] = [];\n for (let i = 0; i < chunkCount; i++) {\n let padCount = 0;\n let buffer = 0;\n for (let j = 0; j < 4; j++) {\n const encoded = data[i * 4 + j];\n if (encoded === '=') {\n if (i + 1 !== chunkCount) {\n throw new Error(`Invalid character: ${encoded}`);\n }\n padCount += 1;\n continue;\n }\n if (encoded === undefined) {\n if (strict) {\n throw new Error('Invalid data');\n }\n padCount += 1;\n continue;\n }\n const value = this.decodeMap.get(encoded) ?? null;\n if (value === null) {\n throw new Error(`Invalid character: ${encoded}`);\n }\n buffer += value << (6 * (3 - j));\n }\n result.push((buffer >> 16) & 0xff);\n if (padCount < 2) {\n result.push((buffer >> 8) & 0xff);\n }\n if (padCount < 1) {\n result.push(buffer & 0xff);\n }\n }\n return Uint8Array.from(result);\n }\n}\n","import { Base64Encoding } from './Base64Encoding';\n\nexport const base64 = new Base64Encoding(\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n);\n\nexport const base64url = new Base64Encoding(\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n);\n","import { assert } from '@/assert';\nimport { base64, base64url } from '../base64';\n\nexport type Base64ToBytesOptions = {\n /**\n * Encoding type\n */\n encoding?: 'base64' | 'base64url';\n\n /**\n * Whether to enforce strict Base64 decoding.\n */\n strict?: boolean;\n};\n\n/**\n * Decodes a Base64 or Base64URL encoded string into a `Uint8Array`.\n *\n * This function supports decoding data from both standard Base64 and Base64URL formats.\n *\n * @param {string} data - The encoded string to decode. Must be a valid Base64 or Base64URL encoded string.\n * @param {Base64ToBytesOptions} [options] - Optional configuration options for decoding.\n * @returns {Uint8Array} - The decoded byte array.\n *\n * @example\n * // Example 1: Decoding a Base64 string\n * const base64String = 'SGVsbG8gd29ybGQ='; // \"Hello world\"\n * const decodedBytes = base64ToBytes(base64String);\n * console.log(decodedBytes); // Output: Uint8Array [ 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100 ]\n *\n * @example\n * // Example 2: Decoding a Base64URL encoded string\n * const base64urlString = 'SGVsbG8gd29ybGQ'; // \"Hello world\"\n * const decodedBytes2 = base64ToBytes(base64urlString, { encoding: 'base64url' });\n * console.log(decodedBytes2); // Output: Uint8Array [ 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100 ]\n *\n * @example\n * // Example 3: Strict decoding with Base64\n * const base64StringStrict = 'SGVsbG8gd29ybGQ=';\n * const decodedStrict = base64ToBytes(base64StringStrict, { strict: true });\n * console.log(decodedStrict); // Output: Uint8Array [ 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100 ]\n *\n * @group Binary\n */\nexport function base64ToBytes(\n data: string,\n { encoding = 'base64', strict }: Base64ToBytesOptions = {},\n): Uint8Array {\n if (encoding === 'base64') {\n return base64.decode(data, { strict: strict ?? true });\n } else if (encoding === 'base64url') {\n return base64url.decode(data, { strict: strict ?? false });\n }\n\n assert.ok(false, 'Invalid encoding options: ' + encoding);\n}\n","/**\n * Converts a `bigint` value into a byte array (`Uint8Array`) in big-endian order.\n *\n * This function encodes the absolute value of the provided `bigint` into a minimal byte array,\n * ensuring that the bytes represent the value in big-endian format.\n *\n * @param {bigint} value - The input `bigint` value to convert into bytes.\n * @returns {Uint8Array} - The byte array (`Uint8Array`) representing the provided `bigint`.\n *\n * @example\n * // Example 1: Convert a positive bigint to bytes\n * const value = 1234567890123456789n;\n * const bytes = bigIntBytes(value);\n * console.log(bytes); // Output: Uint8Array representing the bytes in big-endian\n *\n * @example\n * // Example 2: Convert a negative bigint to bytes\n * const valueNegative = -1234567890123456789n;\n * const bytesNegative = bigIntBytes(valueNegative);\n * console.log(bytesNegative); // Output: Uint8Array representing the absolute value in big-endian\n *\n * @example\n * // Example 3: Handle very small bigints\n * const smallValue = 42n;\n * const bytesSmall = bigIntBytes(smallValue);\n * console.log(bytesSmall); // Output: Uint8Array [ 42 ]\n *\n * @example\n * // Example 4: Convert zero value\n * const zeroValue = 0n;\n * const bytesZero = bigIntBytes(zeroValue);\n * console.log(bytesZero); // Output: Uint8Array [ 0 ]\n *\n * @group Binary\n */\nexport function bigIntBytes(value: bigint): Uint8Array {\n if (value < 0n) {\n value = value * -1n;\n }\n let byteLength = 1;\n while (value > 2n ** BigInt(byteLength * 8) - 1n) {\n byteLength++;\n }\n const encoded = new Uint8Array(byteLength);\n for (let i = 0; i < encoded.byteLength; i++) {\n encoded[i] = Number(\n (value >> BigInt((encoded.byteLength - i - 1) * 8)) & 0xffn,\n );\n }\n return encoded;\n}\n","import { assert } from '@/assert';\n\n/**\n * Converts a byte array (`Uint8Array`) into a `bigint`. The byte array is interpreted in big-endian order.\n *\n * This function takes a byte array and decodes it into its corresponding `bigint` value by treating\n * the byte array as a big-endian encoded number.\n *\n * @param {Uint8Array} bytes - The byte array to decode into a `bigint`. Must have at least one byte.\n * @returns {bigint} - The decoded `bigint` value.\n *\n * @throws {Error} Will throw an error if the input byte array is empty.\n *\n * @example\n * // Example 1: Decode a simple byte array\n * const byteArray = new Uint8Array([0, 0, 0, 42]); // Represents the number 42 in big-endian\n * const decodedValue = bigIntFromBytes(byteArray);\n * console.log(decodedValue); // Output: 42n\n *\n * @example\n * // Example 2: Decode a multi-byte number\n * const byteArrayMulti = new Uint8Array([0x12, 0x34, 0x56, 0x78]); // Represents the number 305419896\n * const decodedMulti = bigIntFromBytes(byteArrayMulti);\n * console.log(decodedMulti); // Output: 305419896n\n *\n * @example\n * // Example 3: Decode a single byte number\n * const byteArraySingle = new Uint8Array([255]); // Represents the number 255\n * const decodedSingle = bigIntFromBytes(byteArraySingle);\n * console.log(decodedSingle); // Output: 255n\n *\n * @example\n * // Example 4: Attempt decoding an invalid empty array\n * try {\n * const emptyArray = new Uint8Array([]);\n * const decodedEmpty = bigIntFromBytes(emptyArray);\n * } catch (error) {\n * console.error(error); // Output: Error: Empty Uint8Array\n * }\n *\n * @group Binary\n */\nexport function bigIntFromBytes(bytes: Uint8Array): bigint {\n assert.ok(bytes.byteLength > 0, 'Empty Uint8Array');\n\n let decoded = 0n;\n for (let i = 0; i < bytes.byteLength; i++) {\n decoded += BigInt(bytes[i]) << BigInt((bytes.byteLength - 1 - i) * 8);\n }\n return decoded;\n}\n","import { assert } from '@/assert';\nimport { base64, base64url } from '../base64';\n\nexport type BytesToBase64Options = {\n /**\n * Specifies the encoding type.\n */\n encoding?: 'base64' | 'base64url';\n\n /**\n * Whether or not to include padding (`=`) in the encoded result. Defaults to `true` for Base64, `false` for Base64URL.\n */\n padding?: boolean;\n};\n\n/**\n * Encodes a byte array (`Uint8Array`) into a Base64 or Base64URL encoded string.\n *\n * The function can encode bytes in either the standard Base64 format or Base64URL format,\n * depending on the specified options. It also allows control over whether padding is included.\n *\n * @param {Uint8Array} data - The byte array to encode into Base64 or Base64URL.\n * @param {BytesToBase64Options} [options] - Optional configuration options.\n * @returns {string} - The encoded Base64 or Base64URL string.\n *\n * @example\n * // Example 1: Encoding with Base64 with default padding\n * const byteArray = new Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]); // \"Hello world\"\n * const encodedBase64 = bytesToBase64(byteArray);\n * console.log(encodedBase64); // Output: 'SGVsbG8gd29ybGQ='\n *\n * @example\n * // Example 2: Encoding with Base64URL without padding\n * const byteArray2 = new Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]); // \"Hello world\"\n * const encodedBase64URL = bytesToBase64(byteArray2, { encoding: 'base64url', padding: false });\n * console.log(encodedBase64URL); // Output: 'SGVsbG8gd29ybGQ'\n *\n * @example\n * // Example 3: Encoding with Base64 with no padding\n * const byteArray3 = new Uint8Array([1, 2, 3, 4]);\n * const encodedNoPadding = bytesToBase64(byteArray3, { encoding: 'base64', padding: false });\n * console.log(encodedNoPadding); // Output: 'AQIDBA'\n *\n * @example\n * // Example 4: Handling invalid encoding options\n * try {\n * const invalidEncoding = bytesToBase64(byteArray3, { encoding: 'invalid' });\n * } catch (error) {\n * console.error(error); // Output: Error: Invalid encoding options: invalid\n * }\n *\n * @group Binary\n */\nexport function bytesToBase64(\n data: Uint8Array,\n { encoding = 'base64', padding }: BytesToBase64Options = {},\n): string {\n if (encoding === 'base64') {\n return base64.encode(data, { includePadding: padding ?? true });\n } else if (encoding === 'base64url') {\n return base64url.encode(data, { includePadding: padding ?? false });\n }\n\n assert.ok(false, 'Invalid encoding options: ' + encoding);\n}\n","/**\n * Compares two `Uint8Array` instances to check if their contents are identical.\n *\n * This function compares each byte of the two provided byte arrays. It returns `true`\n * only if both byte arrays are of the same length **and** contain identical byte values\n * at every index. Otherwise, it returns `false`.\n *\n * @param {Uint8Array} a - The first byte array to compare.\n * @param {Uint8Array} b - The second byte array to compare.\n * @returns {boolean} `true` if the byte arrays are identical; otherwise, `false`.\n *\n * @example\n * // Example with identical byte arrays\n * const a = new Uint8Array([1, 2, 3]);\n * const b = new Uint8Array([1, 2, 3]);\n * console.log(compareBytes(a, b)); // Output: true\n *\n * @example\n * // Example with different contents\n * const a = new Uint8Array([1, 2, 3]);\n * const b = new Uint8Array([1, 2, 4]);\n * console.log(compareBytes(a, b)); // Output: false\n *\n * @example\n * // Example with different lengths\n * const a = new Uint8Array([1, 2]);\n * const b = new Uint8Array([1, 2, 3]);\n * console.log(compareBytes(a, b)); // Output: false\n *\n * @example\n * // Example with both arrays empty\n * const a = new Uint8Array([]);\n * const b = new Uint8Array([]);\n * console.log(compareBytes(a, b)); // Output: true\n *\n * @group Binary\n */\nexport function compareBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n for (let i = 0; i < b.byteLength; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n","/**\n * Concatenates two `Uint8Array` instances into a single new `Uint8Array`.\n *\n * This function takes two byte arrays, `a` and `b`, and creates a new `Uint8Array`\n * that combines their contents in order. The result will have a length equal to the\n * sum of the lengths of `a` and `b`.\n *\n * @param {Uint8Array} a - The first byte array to concatenate.\n * @param {Uint8Array} b - The second byte array to concatenate.\n * @returns {Uint8Array} A new `Uint8Array` containing the concatenation of `a` and `b`.\n *\n * @example\n * // Example with simple byte arrays\n * const a = new Uint8Array([1, 2, 3]);\n * const b = new Uint8Array([4, 5, 6]);\n * const result = concatenateBytes(a, b);\n * console.log(result); // Output: Uint8Array(6) [1, 2, 3, 4, 5, 6]\n *\n * @example\n * // Example with empty arrays\n * const a = new Uint8Array([]);\n * const b = new Uint8Array([1, 2, 3]);\n * const result = concatenateBytes(a, b);\n * console.log(result); // Output: Uint8Array(3) [1, 2, 3]\n *\n * @example\n * // Example with reversed order\n * const a = new Uint8Array([10, 20]);\n * const b = new Uint8Array([30, 40]);\n * const result = concatenateBytes(a, b);\n * console.log(result); // Output: Uint8Array(4) [10, 20, 30, 40]\n *\n * @group Binary\n */\nexport function concatenateBytes(a: Uint8Array, b: Uint8Array): Uint8Array {\n const result = new Uint8Array(a.byteLength + b.byteLength);\n result.set(a);\n result.set(b, a.byteLength);\n return result;\n}\n","/**\n * Converts a `Uint16Array` into a `Uint8Array`.\n *\n * @param {Uint16Array} value - The input `Uint16Array` to convert.\n * @returns {Uint8Array} - The resulting `Uint8Array`, with length twice that of the input `Uint16Array`.\n *\n * @example\n * // Example 1: Converting a valid Uint16Array into a Uint8Array\n * const uint16Array = new Uint16Array([0x1234, 0x5678]);\n * const uint8Array = uint16ToUint8(uint16Array);\n * console.log(uint8Array); // Output: Uint8Array [ 0x34, 0x12, 0x78, 0x56 ]\n *\n * @example\n * // Example 2: Another conversion example\n * const uint16Array2 = new Uint16Array([0xabcd, 0x1234, 0x5678]);\n * const uint8Array2 = uint16ToUint8(uint16Array2);\n * console.log(uint8Array2); // Output: Uint8Array [ 0xcd, 0xab, 0x34, 0x12, 0x78, 0x56 ]\n *\n * @group Binary\n */\nexport function uint16ToUint8(value: Uint16Array): Uint8Array {\n const uint8Array = new Uint8Array(value.length * 2);\n for (let i = 0; i < value.length; i++) {\n uint8Array[i * 2] = value[i] & 0xff; // Lower 8 bits\n uint8Array[i * 2 + 1] = value[i] >> 8; // Upper 8 bits\n }\n return uint8Array;\n}\n","/**\n * Converts a `Uint32Array` into a `Uint8Array`.\n *\n * @param {Uint32Array} value - The input `Uint32Array` to convert.\n * @returns {Uint8Array} - The resulting `Uint8Array`, with length four times that of the input `Uint32Array`.\n *\n * @example\n * // Example 1: Converting a valid Uint32Array into a Uint8Array\n * const uint32Array = new Uint32Array([0x12345678, 0x9abcdef0]);\n * const uint8Array = uint32ToUint8(uint32Array);\n * console.log(uint8Array); // Output: Uint8Array [ 0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a ]\n *\n * @example\n * // Example 2: Another conversion example with different numbers\n * const uint32Array2 = new Uint32Array([0xffffffff, 0x00000000]);\n * const uint8Array2 = uint32ToUint8(uint32Array2);\n * console.log(uint8Array2); // Output: Uint8Array [ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 ]\n *\n * @example\n * // Example 3: Handling edge values\n * const uint32Array3 = new Uint32Array([0x0, 0x00000001]);\n * const uint8Array3 = uint32ToUint8(uint32Array3);\n * console.log(uint8Array3); // Output: Uint8Array [ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ]\n *\n * @group Binary\n */\nexport function uint32ToUint8(value: Uint32Array): Uint8Array {\n const uint8Array = new Uint8Array(value.length * 4);\n for (let i = 0; i < value.length; i++) {\n uint8Array[i * 4] = value[i] & 0xff;\n uint8Array[i * 4 + 1] = (value[i] >> 8) & 0xff;\n uint8Array[i * 4 + 2] = (value[i] >> 16) & 0xff;\n uint8Array[i * 4 + 3] = (value[i] >> 24) & 0xff;\n }\n return uint8Array;\n}\n","import { assert } from '@/assert';\n\n/**\n * Converts a Uint8Array to a Uint16Array.\n *\n * @param {Uint8Array} value - The input byte array to convert. Must have an even length.\n * @returns {Uint16Array} - The converted Uint16Array.\n *\n * @example\n * // Example 1: Converting a valid Uint8Array into a Uint16Array\n * const uint8Array = new Uint8Array([0x12, 0x34, 0x56, 0x78]);\n * const uint16Array = uint8ToUint16(uint8Array);\n * console.log(uint16Array); // Output: Uint16Array [ 0x1234, 0x5678 ]\n *\n * @example\n * // Example 2: Another conversion example\n * const uint8Array2 = new Uint8Array([0xff, 0xee, 0xdd, 0xcc]);\n * const uint16Array2 = uint8ToUint16(uint8Array2);\n * console.log(uint16Array2); // Output: Uint16Array [ 0xffee, 0xddcc ]\n *\n * @group Binary\n */\nexport function uint8ToUint16(value: Uint8Array): Uint16Array {\n assert.ok(\n value.length % 2 === 0,\n 'Uint8Array length must be even for conversion to Uint16Array',\n );\n\n const uint16Array = new Uint16Array(value.length / 2);\n\n for (let i = 0; i < uint16Array.length; i++) {\n uint16Array[i] = (value[i * 2] << 8) | value[i * 2 + 1];\n }\n\n return uint16Array;\n}\n","import { assert } from '@/assert';\n\n/**\n * Converts a `Uint8Array` into a `Uint32Array`.\n *\n * @param {Uint8Array} value - The input byte array to convert. Length must be a multiple of 4.\n * @returns {Uint32Array} - The converted array of 32-bit unsigned integers.\n *\n * @example\n * // Example 1: Converting a valid Uint8Array into a Uint32Array\n * const uint8Array = new Uint8Array([0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0]);\n * const uint32Array = uint8ToUint32(uint8Array);\n * console.log(uint32Array); // Output: Uint32Array [ 0x78563412, 0xf0debc9a ]\n *\n * @example\n * // Example 2: Another conversion example\n * const uint8Array2 = new Uint8Array([0xff, 0xee, 0xdd, 0xcc, 0xab, 0xcd, 0xef, 0x01]);\n * const uint32Array2 = uint8ToUint32(uint8Array2);\n * console.log(uint32Array2); // Output: Uint32Array [ 0xccddeeff, 0x01abcded ]\n *\n * @group Binary\n */\nexport function uint8ToUint32(value: Uint8Array): Uint32Array {\n assert.ok(\n value.length % 4 === 0,\n 'Uint8Array length must be a multiple of 4 for conversion to Uint32Array',\n );\n\n const uint32Array = new Uint32Array(value.length / 4);\n for (let i = 0; i < uint32Array.length; i++) {\n uint32Array[i] =\n (value[i * 4] << 24) |\n (value[i * 4 + 1] << 16) |\n (value[i * 4 + 2] << 8) |\n value[i * 4 + 3];\n }\n\n return uint32Array;\n}\n","/**\n * Define not enumerable property in object.\n *\n * @example\n * const USER_SYM = Symbol();\n * const user = { id: 1, name: 'Andrew' };\n *\n * // define hidden marker\n * def(user, USER_SYM, true);\n *\n * console.log(user[USER_SYM] === true); // true\n *\n * @group Object\n */\nexport const def = (\n obj: object,\n key: string | symbol,\n value: any,\n writable = false,\n) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value,\n });\n};\n","import { isNumber } from '@/is';\n\nconst rndCharacters = 'abcdefghijklmnopqrstuvwxyz0123456789';\nconst charactersLength = rndCharacters.length;\n\n/**\n * Generates a random string of the specified length using characters from a predefined set.\n * The characters used in the generated string include lowercase letters (a-z) and digits (0-9).\n *\n * @param {number} length - The length of the random string to generate. Must be a positive integer.\n *\n * @returns {string} A random string of the specified length, composed of characters from 'a-z' and '0-9'.\n *\n * @example\n * randomString(8); // e.g. 'a1b2c3d4'\n * randomString(12); // e.g. '3f6g7h8i9j0k'\n * randomString(5); // e.g. '1a2b3'\n *\n * @group Strings\n */\nexport function randomString(length: number): string {\n let str = '';\n let num = isNumber(length) ? Math.max(0, length) : 0;\n while (num--) {\n str += rndCharacters[(charactersLength * Math.random()) | 0];\n }\n return str;\n}\n","import { isObject } from '@/is';\nimport { randomString } from '@/str/randomString';\n\nconst objectKeys = new WeakMap<object, string>();\n\nconst BSON_TYPES = Object.freeze(new Set(['ObjectID', 'ObjectId']));\n\nexport const SYM_WITH_CACHE = Symbol();\n\nexport interface ArgToKeyOptions {\n /**\n * Object key generation strategy.\n *\n * When `json` we will use `JSON.stringify` which not quite effective.\n * Also may not hit into cache when object has different key order.\n *\n * When `ref` we will use WeakMap to store object key which more effective but may produce unexpected cache hit.\n *\n * @default `ref`\n */\n objectStrategy: 'json' | 'ref';\n}\n\nexport const argToKey = /*#__PURE__*/ (\n value: unknown,\n options: Partial<ArgToKeyOptions> = { objectStrategy: 'ref' },\n): string => {\n let result = '';\n\n if (isObject(value)) {\n // edge case for mongoose objects\n if (BSON_TYPES.has((value as any)?._bsontype)) {\n return String(value);\n }\n\n let key: string;\n\n if (options.objectStrategy === 'json') {\n key = JSON.stringify(value);\n } else {\n key = objectKeys.get(value)!;\n\n if (!key) {\n key = createRadomKey();\n objectKeys.set(value, key);\n }\n }\n\n return key;\n } else if (Array.isArray(value)) {\n result += value.map(v => argToKey(v, options)).join('/');\n } else {\n result = String(value);\n }\n\n return result;\n};\n\nfunction createRadomKey() {\n return Date.now() + '_' + randomString(16);\n}\n","import { isPromise } from '@/is';\nimport { def } from '@/object/def';\nimport type { AnyFunction } from '@/types';\nimport { type ArgToKeyOptions, SYM_WITH_CACHE, argToKey } from './utils';\n\ninterface CreateWithCacheOptions<T extends AnyFunction>\n extends Partial<ArgToKeyOptions> {\n getBucket: (pointer: WithCachePointer) => WithCacheStorage;\n getPointer: () => WithCachePointer;\n fn: T;\n}\n\nexport type WithCachePointer = object | Function | symbol;\n\nexport interface WithCacheStorage {\n get(key: unknown): unknown;\n has(key: unknown): boolean;\n delete(key: unknown): void;\n set(key: unknown, value: unknown): void;\n}\n\nexport interface WithCache {\n $cache: {\n getBucket: () => WithCacheStorage;\n getPointer: () => WithCachePointer;\n argToKeyOptions: ArgToKeyOptions;\n };\n}\n\nexport type WithCacheResult<T extends AnyFunction> = T & WithCache;\n\nexport function createWithCache<T extends AnyFunction>({\n fn,\n getPointer,\n getBucket,\n objectStrategy = 'ref',\n}: CreateWithCacheOptions<T>): WithCacheResult<T> {\n const isAsync = fn.constructor.name === 'AsyncFunction';\n\n const argToKeyOptions: ArgToKeyOptions = { objectStrategy };\n\n const $cache: WithCache['$cache'] = {\n getBucket: () => getBucket(getPointer()),\n getPointer,\n argToKeyOptions,\n };\n\n const wrapFn = function (this: any, ...args: Parameters<T>) {\n const storage = getBucket(getPointer());\n const cacheKey = args.map(v => argToKey(v, argToKeyOptions)).join('_');\n\n if (storage.has(cacheKey)) {\n const value = storage.get(cacheKey);\n return isAsync ? Promise.resolve(value) : value;\n }\n\n const newValue = fn.apply(this, args);\n\n if (isPromise(newValue)) {\n // cache only success result\n return newValue.then(value => {\n storage.set(cacheKey, value);\n return value;\n });\n }\n\n storage.set(cacheKey, newValue);\n\n return newValue;\n } as T;\n\n (wrapFn as any).$cache = $cache;\n\n def(wrapFn, SYM_WITH_CACHE, true);\n\n return wrapFn as any;\n}\n\n/**\n * Returns true when function is cached\n * @group Cache\n */\nexport function isWithCache(\n value: unknown,\n): value is WithCacheResult<AnyFunction> {\n return !!value && (value as any)[SYM_WITH_CACHE] === true;\n}\n","import { isFunction, noop } from '@/is';\nimport type { AnyFunction } from '@/types';\nimport {\n type WithCachePointer,\n type WithCacheResult,\n createWithCache,\n} from '../createWithCache';\nimport type { ArgToKeyOptions } from '../createWithCache/utils';\n\nexport interface WithCacheOptions extends Partial<ArgToKeyOptions> {\n /**\n * Custom cache pointer\n */\n cachePointer?: WithCachePointer;\n}\n\nexport const cache = /*#__PURE__*/ new WeakMap<\n // @ts-expect-error\n WithCachePointer,\n Map<string, any>\n>();\n\n/**\n * Wrap a function to cache results by arguments\n *\n * @example\n * const sum = withCache((a, b) => {\n * console.log('calc?');\n * return a + b;\n * });\n *\n * sum(1, 2); // calc?\n * sum(1, 2);\n * sum(1, 3) // calc?\n *\n * @group Cache\n */\nexport function withCache<T extends AnyFunction>(fn: T): WithCacheResult<T>;\nexport function withCache<T extends AnyFunction>(\n options: WithCacheOptions,\n fn: T,\n): WithCacheResult<T>;\n\nexport function withCache(...args: any[]): WithCacheResult<AnyFunction> {\n let options: WithCacheOptions = {};\n let fn: AnyFunction = noop;\n\n if (isFunction(args[0])) {\n fn = args[0];\n } else if (isFunction(args[1])) {\n options = args[0] || {};\n fn = args[1];\n }\n\n const pointer = options.cachePointer || fn;\n\n const getPointer = () => pointer;\n\n const getBucket = (pointer: any) => {\n let fnCache = cache.get(pointer);\n\n if (!fnCache) {\n fnCache = new Map();\n cache.set(pointer, fnCache);\n }\n\n return fnCache;\n };\n\n return createWithCache({\n fn,\n getBucket,\n getPointer,\n ...options,\n });\n}\n","import { assert } from '@/assert';\n\nexport function assertCapacity(value: unknown): asserts value is number {\n assert.number(value, 'capacity must be a number');\n assert.ok(value > 0, 'capacity must be more then 0.');\n}\n","import { assertCapacity } from './utils';\n\n/**\n * A Map-like class with a fixed capacity, where entries are automatically removed\n * when the capacity is exceeded. This allows for efficient caching behavior,\n * ensuring that the map never grows beyond the specified capacity.\n *\n * When the map reaches its capacity, the oldest entries (in insertion order)\n * are removed to make room for new ones.\n *\n * @example\n * const cache = new FixedMap<string, number>(3);\n * cache.set('a', 1);\n * cache.set('b', 2);\n * cache.set('c', 3);\n * cache.set('d', 4); // 'a' will be evicted, as it's the oldest entry\n *\n * console.log(cache.get('a')); // undefined\n * console.log(cache.get('b')); // 2\n *\n * @group Cache\n */\nexport class FixedMap<K = any, V = any> extends Map<K, V> {\n private _tail: K[];\n\n constructor(private _capacity: number) {\n assertCapacity(_capacity);\n super();\n this._tail = [];\n }\n\n set(key: K, value: V): this {\n if (!super.has.call(this, key)) {\n this._tail.push(key);\n }\n\n super.set.call(this, key, value);\n this._drain();\n\n return this;\n }\n\n delete(key: K): boolean {\n const removed = super.delete.call(this, key);\n\n if (removed) {\n const idx = this._tail.findIndex(v => v === key);\n\n if (idx > -1) {\n this._tail.splice(idx, 1);\n }\n }\n\n return removed;\n }\n\n clear(): void {\n // @ts-expect-error\n delete this._tail;\n this._tail = [];\n\n super.clear.call(this);\n }\n\n get capacity(): number {\n return this._capacity;\n }\n\n set capacity(value: number) {\n assertCapacity(value);\n this._capacity = value;\n this._drain();\n }\n\n private _drain() {\n while (this._tail.length > this._capacity) {\n const key = this._tail.shift();\n\n key !== undefined && this.delete(key);\n }\n }\n}\n","import { FixedMap } from '../FixedMap';\n\nexport interface TimeBucketOptions {\n /**\n * The size of each time bucket in milliseconds. This is the interval at which\n * the records in the bucket will expire and be dropped.\n */\n sizeMs: number;\n\n /**\n * The maximum number of entries the bucket can hold. Once the capacity is\n * reached, the least recently used entry will be removed.\n * @default Infinity\n */\n capacity?: number;\n}\n\n/**\n * A time-based bucket that holds records for a specific interval defined by `sizeMs`.\n * The records in the bucket will be dropped once the interval elapses, based on the\n * current time. The `TimeBucket` is designed to avoid using timers to track expirations.\n *\n * It can be used to store data that expires over fixed time intervals (e.g., caching,\n * throttling).\n *\n * @example\n * const bucket = new TimeBucket({ sizeMs: 1000, capacity: 10 });\n * bucket.set('key1', 'value1');\n * console.log(bucket.get('key1')); // 'value1'\n *\n * // After 1 second, the bucket will drop the expired records.\n *\n * @group Cache\n */\nexport class TimeBucket<K = any, V = any> {\n private _pointer: number;\n private _sizeMs: number;\n private _bucket: FixedMap<K, V> | Map<K, V>;\n\n constructor({ capacity = Infinity, sizeMs }: TimeBucketOptions) {\n assetSizeMs(sizeMs);\n\n this._sizeMs = sizeMs;\n this._pointer = 0;\n this._bucket = capacity === Infinity ? new Map() : new FixedMap(capacity);\n }\n\n get capacity(): number {\n if (this._bucket instanceof FixedMap) {\n return this._bucket.capacity;\n }\n\n return Infinity;\n }\n\n get sizeMs(): number {\n return this.sizeMs;\n }\n\n set sizeMs(value: number) {\n assetSizeMs(value);\n\n this._sizeMs = value;\n\n this._drainBucket();\n }\n\n get size(): number {\n this._drainBucket();\n return this._bucket.size;\n }\n\n set(key: K, value: V): this {\n this._drainBucket();\n this._bucket.set(key, value);\n\n return this;\n }\n\n get(key: K): any | undefined {\n this._drainBucket();\n return this._bucket.get(key);\n }\n\n has(key: K): boolean {\n this._drainBucket();\n return this._bucket.has(key);\n }\n\n delete(key: K): boolean {\n this._drainBucket();\n return this._bucket.delete(key);\n }\n\n clear() {\n this._pointer = 0;\n this._drainBucket();\n }\n\n keys(): IterableIterator<K> {\n this._drainBucket();\n\n return this._bucket.keys();\n }\n\n values(): IterableIterator<V> {\n this._drainBucket();\n\n return this._bucket.values();\n }\n\n entries(): IterableIterator<[K, V]> {\n this._drainBucket();\n\n return this._bucket.entries();\n }\n\n forEach(\n callbackfn: (value: V, key: K, map: TimeBucket<K, V>) => void,\n thisArg?: any,\n ): void {\n this._drainBucket();\n return this._bucket.forEach((value, key) => {\n callbackfn(value, key, this);\n });\n }\n\n private _drainBucket() {\n const newPointer = bucketPointer(this._sizeMs);\n\n if (newPointer !== this._pointer) {\n const capacity =\n this._bucket instanceof FixedMap ? this._bucket.capacity : Infinity;\n\n // @ts-expect-error\n delete this._bucket;\n\n this._pointer = newPointer;\n this._bucket = capacity === Infinity ? new Map() : new FixedMap(capacity);\n }\n }\n}\n\nfunction assetSizeMs(value: unknown) {\n if (typeof value !== 'number' || isNaN(value)) {\n throw new TypeError('msSize must be a number');\n }\n\n if (value <= 0) {\n throw new TypeError('msSize must be more then 0.');\n }\n}\n\nfunction bucketPointer(size: number): number {\n return Math.floor(Date.now() / size) * size;\n}\n","import type { AnyFunction } from '@/types';\nimport {\n type WithCachePointer,\n type WithCacheResult,\n createWithCache,\n} from '../createWithCache';\nimport type { ArgToKeyOptions } from '../createWithCache/utils';\nimport { TimeBucket } from '../TimeBucket';\n\nexport interface WithCacheBucketOptions extends Partial<ArgToKeyOptions> {\n /**\n * Define cached records drops interval.\n */\n sizeMs: number;\n\n /**\n * Capacity of cached records\n */\n capacity?: number;\n\n /**\n * Custom cache pointer\n */\n cachePointer?: WithCachePointer;\n}\n\nexport const cacheBucket = /*#__PURE__*/ new WeakMap<\n // @ts-expect-error\n WithCachePointer,\n TimeBucket<string, any>\n>();\n\n/**\n * Wrap a function to cache results by arguments\n *\n * But with time and capacity limitation\n *\n * @example\n * const sum = withCacheBucket({ capacity: 1, sizeMs: 1000000 }, (a, b) => {\n * console.log('calc?');\n * return a + b;\n * });\n *\n * sum(1, 2); // calc?\n * sum(1, 2);\n * sum(1, 3) // calc?\n * sum(1, 3)\n * sum(1, 2); // calc?\n *\n * @group Cache\n */\nexport function withCacheBucket<T extends AnyFunction>(\n { capacity, sizeMs, cachePointer, ...options }: WithCacheBucketOptions,\n fn: T,\n): WithCacheResult<T> {\n const pointer = cachePointer || fn;\n\n const getPointer = () => {\n return pointer;\n };\n\n const getBucket = () => {\n let fnCache = cacheBucket.get(pointer);\n\n if (!fnCache) {\n fnCache = new TimeBucket({ sizeMs, capacity });\n cacheBucket.set(pointer, fnCache);\n }\n\n return fnCache;\n };\n\n return createWithCache({\n fn,\n getBucket,\n getPointer,\n ...options,\n });\n}\n","import type { AnyFunction } from '@/types';\nimport {\n type WithCachePointer,\n type WithCacheResult,\n createWithCache,\n} from '../createWithCache';\nimport type { ArgToKeyOptions } from '../createWithCache/utils';\nimport { FixedMap } from '../FixedMap';\n\nexport interface WithCacheFixedOptions extends Partial<ArgToKeyOptions> {\n /**\n * Capacity of cached records\n */\n capacity: number;\n\n /**\n * Custom cache pointer\n */\n cachePointer?: WithCachePointer;\n}\n\nexport const cacheFixed = /*#__PURE__*/ new WeakMap<\n // @ts-expect-error\n WithCachePointer,\n FixedMap<string, any>\n>();\n\n/**\n * Wrap a function to cache results by arguments\n *\n * But with capacity limitation\n *\n * @example\n * const sum = withCacheFixed({ capacity: 1 }, (a, b) => {\n * console.log('calc?');\n * return a + b;\n * });\n *\n * sum(1, 2); // calc?\n * sum(1, 2);\n * sum(1, 3) // calc?\n * sum(1, 3)\n * sum(1, 2); // calc?\n *\n * @group Cache\n */\nexport function withCacheFixed<T extends AnyFunction>(\n { capacity, cachePointer, ...options }: WithCacheFixedOptions,\n fn: T,\n): WithCacheResult<T> {\n const pointer = cachePointer || fn;\n\n const getPointer = () => fn;\n\n const getBucket = () => {\n let fnCache = cacheFixed.get(pointer);\n\n if (!fnCache) {\n fnCache = new FixedMap(capacity);\n cacheFixed.set(pointer, fnCache);\n }\n\n return fnCache;\n };\n\n return createWithCache({\n fn,\n getBucket,\n getPointer,\n ...options,\n });\n}\n","import { isNumber } from '@/is';\n\n/**\n * A simple implementation of a Least Recently Used (LRU) cache. This cache stores\n * key-value pairs and ensures that the most recently accessed items are kept\n * in the cache, while the least recently used items are evicted when the cache\n * reaches its capacity.\n *\n * The cache is implemented as a doubly linked list where the head represents\n * the most recently accessed item, and the tail represents the least recently\n * accessed item. When the cache is full, the least recently used item (tail)\n * is removed to make space for new items.\n *\n * @group Cache\n */\nexport class LruCache<TKey = any, TValue = any> {\n private items: Map<TKey, number>;\n private forward: Uint8Array | Uint16Array | Uint32Array;\n private backward: Uint8Array | Uint16Array | Uint32Array;\n private K: TKey[];\n private V: (TValue | undefined)[];\n\n size: number;\n private head: number;\n private tail: number;\n\n constructor(private capacity: number) {\n this.capacity = Math.max(isNumber(capacity) ? capacity : 0, 0);\n\n this.forward = pointerArray(this.capacity);\n this.backward = pointerArray(this.capacity);\n this.K = new Array(capacity);\n this.V = new Array(capacity);\n\n this.items = new Map();\n\n this.size = 0;\n this.head = 0;\n this.tail = 0;\n }\n\n /**\n * Method used to clear the structure.\n */\n clear() {\n this.size = 0;\n this.head = 0;\n this.tail = 0;\n this.items.clear();\n }\n\n set(key: TKey, value: TValue): this {\n let pointer = this.items.get(key);\n\n // The key already exists, we just need to update the value and splay on top\n if (pointer !== undefined) {\n this.splayOnTop(pointer);\n this.V[pointer] = value;\n return this;\n }\n\n // The cache is not yet full\n if (this.size < this.capacity) {\n pointer = this.size++;\n }\n\n // Cache is full, we need to drop the last value\n else {\n pointer = this.tail;\n this.tail = this.backward[pointer];\n this.items.delete(this.K[pointer]);\n }\n\n // Storing key & value\n this.items.set(key, pointer);\n this.K[pointer] = key;\n this.V[pointer] = value;\n\n // Moving the item at the front of the list\n this.forward[pointer] = this.head;\n this.backward[this.head] = pointer;\n this.head = pointer;\n\n return this;\n }\n\n has(key: TKey): boolean {\n return this.peek(key) !== undefined;\n }\n\n delete(key: TKey): void {\n const pointer = this.items.get(key);\n\n if (pointer === undefined) return;\n\n this.V[pointer] = undefined;\n }\n\n get(key: TKey): TValue | undefined {\n const pointer = this.items.get(key);\n\n if (pointer === undefined) return;\n\n this.splayOnTop(pointer);\n\n return this.V[pointer];\n }\n\n /**\n * Method used to get the value attached to the given key. Does not modify\n * the ordering of the underlying linked list.\n */\n peek(key: TKey): TValue | undefined {\n const pointer = this.items.get(key);\n\n if (pointer === undefined) return;\n\n return this.V[pointer];\n }\n\n /**\n * Method used to create an iterator over the cache's keys from most\n * recently used to least recently used.\n */\n keys(): IterableIterator<TKey> {\n let i = 0,\n l = this.size;\n\n let pointer = this.head,\n keys = this.K,\n forward = this.forward;\n\n const iterator: Iterator<TKey> = {\n next: () => {\n if (i >= l) return { done: true, value: undefined };\n\n const key = keys[pointer];\n\n i++;\n\n if (i < l) pointer = forward[pointer];\n\n // skip marked as removed\n if (this.peek(key) === undefined) return iterator.next();\n\n return {\n done: false,\n value: key,\n };\n },\n };\n\n return {\n ...iterator,\n [Symbol.iterator]() {\n return this;\n },\n };\n }\n\n /**\n * Method used to create an iterator over the cache's values from most\n * recently used to least recently used.\n *\n */\n values(): IterableIterator<TValue> {\n let i = 0,\n l = this.size;\n\n let pointer = this.head,\n values = this.V,\n forward = this.forward;\n\n const iterator: Iterator<TValue> = {\n next: () => {\n if (i >= l) return { done: true, value: undefined };\n\n const value = values[pointer];\n\n i++;\n\n if (i < l) pointer = forward[pointer];\n\n // skip marked as removed\n if (value === undefined) return iterator.next();\n\n return {\n done: false,\n value: value,\n };\n },\n };\n\n return {\n ...iterator,\n [Symbol.iterator]() {\n return this;\n },\n };\n }\n\n /**\n * Method used to create an iterator over the cache's entries from most\n * recently used to least recently used.\n *\n * @return {IterableIterator<[TKey, TValue | undefined]>}\n */\n entries() {\n let i = 0,\n l = this.size;\n\n let pointer = this.head,\n keys = this.K,\n values = this.V,\n forward = this.forward;\n\n /** @type {Iterator<[TKey, TValue | undefined]>} */\n const iterator = {\n next() {\n if (i >= l) return { done: true, value: undefined };\n\n const key = keys[pointer],\n value = values[pointer];\n\n i++;\n\n if (i < l) pointer = forward[pointer];\n\n return {\n done: false,\n value: [key, value],\n };\n },\n };\n\n return {\n ...iterator,\n [Symbol.iterator]() {\n return this;\n },\n };\n }\n\n /**\n * Method used to splay a value on top.\n *\n * @param {number} pointer - Pointer of the value to splay on top.\n */\n splayOnTop(pointer: number): this {\n const oldHead = this.head;\n\n if (this.head === pointer) return this;\n\n const previous = this.backward[pointer],\n next = this.forward[pointer];\n\n if (this.tail === pointer) {\n this.tail = previous;\n } else {\n this.backward[next] = previous;\n }\n\n this.forward[previous] = next;\n\n this.backward[oldHead] = pointer;\n this.head = pointer;\n this.forward[pointer] = oldHead;\n\n return this;\n }\n\n [Symbol.iterator]() {\n return this.entries();\n }\n}\n\nconst MAX_8BIT_INTEGER = Math.pow(2, 8) - 1,\n MAX_16BIT_INTEGER = Math.pow(2, 16) - 1,\n MAX_32BIT_INTEGER = Math.pow(2, 32) - 1;\n\nfunction pointerArray(size: number): Uint8Array | Uint16Array | Uint32Array {\n const maxIndex = size - 1;\n\n if (maxIndex <= MAX_8BIT_INTEGER) return new Uint8Array(size);\n\n if (maxIndex <= MAX_16BIT_INTEGER) return new Uint16Array(size);\n\n if (maxIndex <= MAX_32BIT_INTEGER) return new Uint32Array(size);\n\n throw new Error('Pointer Array of size > 4294967295 is not supported.');\n}\n","import type { AnyFunction } from '@/types';\nimport {\n type WithCachePointer,\n type WithCacheResult,\n createWithCache,\n} from '../createWithCache';\nimport type { ArgToKeyOptions } from '../createWithCache/utils';\nimport { LruCache } from '../LruCache';\n\nexport interface WithCacheLruOptions extends Partial<ArgToKeyOptions> {\n capacity: number;\n cachePointer?: WithCachePointer;\n}\n\nexport const cacheLRU = /*#__PURE__*/ new WeakMap<\n // @ts-expect-error\n WithCachePointer,\n LruCache<string, any>\n>();\n\n/**\n * Wrap a function to cache results by arguments\n *\n * But with LRU\n *\n * @example\n * const sum = withCacheLRU({ capacity: 100 }, (a, b) => {\n * console.log('calc?');\n * return a + b;\n * });\n *\n * sum(1, 2); // calc?\n * sum(1, 2);\n *\n * @group Cache\n */\nexport function withCacheLRU<T extends AnyFunction>(\n { capacity, cachePointer, ...options }: WithCacheLruOptions,\n fn: T,\n): WithCacheResult<T> {\n const pointer = cachePointer || fn;\n\n const getPointer = () => {\n return pointer;\n };\n\n const getBucket = () => {\n let fnCache = cacheLRU.get(pointer);\n\n if (!fnCache) {\n fnCache = new LruCache(capacity);\n cacheLRU.set(pointer, fnCache);\n }\n\n return fnCache;\n };\n\n return createWithCache({\n fn,\n getBucket,\n getPointer,\n ...options,\n });\n}\n","import { type WithCachePointer, isWithCache } from '../createWithCache';\nimport { type ArgToKeyOptions, argToKey } from '../createWithCache/utils';\nimport { cache } from '../withCache';\nimport { cacheBucket } from '../withCacheBucket';\nimport { cacheFixed } from '../withCacheFixed';\nimport { cacheLRU } from '../withCacheLRU';\n\n/**\n * Drop cached result\n *\n * @example\n * const findUser = withCache((id: number) => db.users.findById(id));\n *\n * dropCache(findUser, 100500);\n *\n * @group Cache\n */\nexport function dropCache(\n cachePointer: WithCachePointer,\n ...args: any[]\n): boolean {\n let argToKeyOptions: ArgToKeyOptions = { objectStrategy: 'ref' };\n let removed = false;\n\n if (isWithCache(cachePointer)) {\n argToKeyOptions = cachePointer.$cache.argToKeyOptions;\n }\n\n const cacheKey = args.map(v => argToKey(v, argToKeyOptions)).join('_');\n\n if (isWithCache(cachePointer)) {\n if (cachePointer.$cache.getBucket().has(cacheKey)) {\n removed = true;\n cachePointer.$cache.getBucket().delete(cacheKey);\n }\n\n cachePointer = cachePointer.$cache.getPointer();\n }\n\n [cache, cacheFixed, cacheBucket, cacheLRU].forEach(map => {\n if (map.get(cachePointer)?.has(cacheKey)) {\n removed = true;\n map.get(cachePointer)?.delete(cacheKey);\n }\n });\n\n return removed;\n}\n","import { assertCapacity } from '../FixedMap/utils';\n\n/**\n * A `WeakMap`-like class with a fixed capacity. Entries are automatically removed\n * when the map exceeds the specified capacity. Unlike a regular `WeakMap`, the\n * entries are limited to a defined size, and the oldest entries are evicted when\n * new ones are added after the capacity is reached.\n *\n * This class behaves similarly to a `WeakMap`, but with the additional constraint\n * of a fixed size. It automatically removes the least recently added key-value\n * pairs when the map grows beyond the specified capacity.\n *\n * @example\n * const cache = new FixedWeakMap<object, number>(3);\n * const obj1 = { id: 1 };\n * const obj2 = { id: 2 };\n * const obj3 = { id: 3 };\n *\n * cache.set(obj1, 1);\n * cache.set(obj2, 2);\n * cache.set(obj3, 3);\n *\n * const obj4 = { id: 4 };\n * cache.set(obj4, 4); // obj1 will be evicted as it's the oldest\n *\n * console.log(cache.get(obj1)); // undefined\n * console.log(cache.get(obj2)); // 2\n * console.log(cache.get(obj4)); // 4\n *\n * @group Cache\n */\nexport class FixedWeakMap<K extends WeakKey = WeakKey, V = any> extends WeakMap<\n K,\n V\n> {\n private _tail: K[];\n\n constructor(private _capacity: number) {\n assertCapacity(_capacity);\n super();\n this._tail = [];\n }\n\n set(key: K, value: V): this {\n if (!super.has(key)) {\n this._tail.push(key);\n }\n\n super.set(key, value);\n this._drain();\n\n return this;\n }\n\n delete(key: K): boolean {\n const removed = super.delete(key);\n\n if (removed) {\n const idx = this._tail.findIndex(v => v === key);\n\n if (idx > -1) {\n this._tail.splice(idx, 1);\n }\n }\n\n return removed;\n }\n\n clear(): void {\n for (const item of this._tail) {\n super.delete(item);\n }\n\n // @ts-expect-error\n delete this._tail;\n this._tail = [];\n }\n\n get size(): number {\n return this._tail.length;\n }\n\n get capacity(): number {\n return this._capacity;\n }\n\n set capacity(value: number) {\n assertCapacity(value);\n this._capacity = value;\n this._drain();\n }\n\n private _drain() {\n while (this._tail.length > this._capacity) {\n const key = this._tail.shift();\n\n key !== undefined && this.delete(key);\n }\n }\n}\n","import type { AnyFunction } from '@/types';\nimport { type WithCachePointer, isWithCache } from '../createWithCache';\nimport { type ArgToKeyOptions, argToKey } from '../createWithCache/utils';\nimport { cache } from '../withCache';\nimport { cacheBucket } from '../withCacheBucket';\nimport { cacheFixed } from '../withCacheFixed';\nimport { cacheLRU } from '../withCacheLRU';\n\n/**\n * Check if function has cached result\n *\n * @example\n * const findUser = withCache((id: number) => db.users.findById(id));\n *\n * const user = findUser(100500);\n *\n * isCached(findUser, 100500); // true\n *\n * @group Cache\n */\nexport function isCached<T extends AnyFunction>(\n fn: AnyFunction,\n ...args: Parameters<T>\n) {\n let argToKeyOptions: ArgToKeyOptions = { objectStrategy: 'ref' };\n let cachePointer: WithCachePointer = fn;\n let cached = false;\n\n if (isWithCache(fn)) {\n argToKeyOptions = fn.$cache.argToKeyOptions;\n }\n\n const cacheKey = args.map(v => argToKey(v, argToKeyOptions)).join('_');\n\n if (isWithCache(fn)) {\n cached = fn.$cache.getBucket().has(cacheKey);\n cachePointer = fn.$cache.getPointer();\n\n if (cached) return true;\n }\n\n return !![cache, cacheFixed, cacheBucket, cacheLRU].some(storage =>\n storage.get(cachePointer)?.has(cacheKey),\n );\n}\n","import { isObject } from '@/is';\nimport { def } from '@/object/def';\nimport type { WithCachePointer, WithCacheResult } from '../createWithCache';\nimport {\n type ArgToKeyOptions,\n SYM_WITH_CACHE,\n argToKey,\n} from '../createWithCache/utils';\nimport { TimeBucket } from '../TimeBucket';\nimport { cacheBucket } from '../withCacheBucket';\n\nconst EMPTY_SYM = Symbol('empty');\n\nexport interface WithCacheBucketBatchOptions<\n T extends object,\n K extends keyof T,\n> {\n /**\n * Define cached records drops interval.\n */\n sizeMs: number;\n\n /**\n * Cache record by object key.\n */\n key: K;\n\n /**\n * Amount of items which will handled by resolver function.\n */\n batchSize?: number;\n\n /**\n * Capacity of cached records\n */\n capacity?: number;\n\n /**\n * Custom cache pointer\n */\n cachePointer?: WithCachePointer;\n\n /**\n * Should we retry resolving for provided item key when previously we got empty result.\n */\n retryEmpty?: boolean;\n\n /**\n * Resolving item function\n */\n resolver?: (values: T[K][]) => Promise<T[]>;\n}\n\n/**\n * In this way we will cache item of resulted array by `key`.\n *\n * Useful when we need for example fetch batch of users by ids but took already cached results if it available.\n *\n * @example TODO\n *\n * @beta\n *\n * @group Cache\n */\nexport function withCacheBucketBatch<T extends object, K extends keyof T>(\n {\n capacity,\n sizeMs,\n key,\n batchSize = 10,\n cachePointer,\n retryEmpty = true,\n }: WithCacheBucketBatchOptions<T, K>,\n resolver: (values: T[K][]) => Promise<T[]>,\n): WithCacheResult<(values: T[K][]) => Promise<Map<string, Readonly<T>>>> {\n const pointer = cachePointer || resolver;\n const argToKeyOptions: ArgToKeyOptions = {\n objectStrategy: 'json',\n };\n\n const getPointer = () => {\n return pointer;\n };\n\n const getBucket = () => {\n let fnCache = cacheBucket.get(pointer);\n\n if (!fnCache) {\n fnCache = new TimeBucket({ sizeMs, capacity });\n cacheBucket.set(pointer, fnCache);\n }\n\n return fnCache;\n };\n\n const wrapFn = async function (this: any, values: any) {\n const result = new Map();\n\n let fnCache = getBucket();\n\n const batchSet = new Set<any>();\n\n const drainMaybe = async () => {\n if (!batchSet.size) return;\n\n const items = await resolver.call(this, Array.from(batchSet));\n\n for (let idx = 0; idx < items.length; idx++) {\n const item = items[idx];\n\n if (!isObject(item)) continue;\n\n const id = argToKey(item[key], argToKeyOptions);\n\n batchSet.delete(id);\n result.set(id, item);\n fnCache?.set(id, item);\n }\n\n for (const batchItem of batchSet.values()) {\n fnCache?.set(batchItem, EMPTY_SYM);\n }\n\n batchSet.clear();\n };\n\n let pos = 0;\n\n while (pos < values.length) {\n const id = argToKey(values[pos], argToKeyOptions);\n const item = fnCache.get(id);\n\n if (item) {\n if (item === EMPTY_SYM) {\n if (retryEmpty) batchSet.add(id);\n } else {\n result.set(id, item);\n }\n } else {\n batchSet.add(id);\n }\n\n if (batchSet.size >= batchSize) {\n await drainMaybe();\n }\n\n pos++;\n }\n\n await drainMaybe();\n\n return result;\n };\n\n wrapFn.$cache = { getBucket, getPointer, argToKeyOptions };\n\n def(wrapFn, SYM_WITH_CACHE, true);\n\n return wrapFn;\n}\n","import { isEmpty } from '@/is';\n\n/**\n * Removes properties with empty values from an object.\n *\n * This function iterates over the object's keys and deletes any property whose value\n * is considered \"empty\" (e.g., `null`, `undefined`, `[]`, `{}`, `''`, `false`).\n *\n * ⚠️ **Mutates the original object**: The input object is directly modified, and properties\n * are removed from it.\n *\n * @param {Record<string, any>} obj - The object to clean up, where empty fields will be removed.\n * @returns {Record<string, any>} The cleaned object with empty fields removed.\n *\n * @example\n * const user = { id: 1, name: 'Andrew', roles: [], address: null };\n * cleanEmpty(user);\n *\n * console.log(user); // Outputs: { id: 1, name: 'Andrew' }\n *\n * @example\n * const product = { name: 'Laptop', description: '', price: 1000, tags: [] };\n * cleanEmpty(product);\n *\n * console.log(product); // Outputs: { name: 'Laptop', price: 1000 }\n *\n * @group Object\n */\nexport function cleanEmpty(obj: Record<any, any>): Record<any, any> {\n let value;\n for (const key of Object.keys(obj)) {\n value = obj[key];\n\n if (isEmpty(value)) {\n delete obj[key];\n }\n }\n\n return obj;\n}\n","/**\n * Removes all properties from the given object, including symbol keys.\n *\n * This function deletes all enumerable properties, both string and symbol keys, from the\n * input object. The object is directly mutated by this operation.\n *\n * ⚠️ **Mutates the original object**: The function modifies the input object in place.\n *\n * ⚠️ **Removes symbol keys**: Symbol-based keys are also deleted, unlike typical object\n * iteration methods.\n *\n * @param {Record<string, any>} input - The object to clean up. After execution, it will be empty.\n * @returns {void} This function does not return a value, as it mutates the input object directly.\n *\n * @example\n * const user = { id: 1, name: 'Andrew', roles: [], [Symbol('unique')]: 'symbolValue' };\n * cleanObject(user);\n *\n * console.log(user); // Outputs: {}\n *\n * @example\n * const settings = { theme: 'dark', [Symbol('private')]: 'secret' };\n * cleanObject(settings);\n *\n * console.log(settings); // Outputs: {}\n *\n * @group Object\n */\nexport const cleanObject = (input: Record<string, any>) => {\n [...Object.keys(input), ...Object.getOwnPropertySymbols(input)].forEach(\n (key: any) => {\n delete input[key];\n },\n );\n};\n","import { isObject } from '@/is';\n\n/**\n * Performs a deep merge of the source object into the destination object.\n *\n * This function recursively copies properties from the source object to the destination object.\n * If a property is an object itself, it will recursively merge its properties. Otherwise,\n * the value will be directly assigned to the destination object.\n *\n * ⚠️ **Mutates the destination object**: The destination object is modified in place.\n *\n * @param {object} dest - The target object that will be modified with properties from the source.\n * @param {object} source - The source object whose properties will be copied to the destination.\n * @returns {void} This function does not return a value, as it mutates the destination object.\n *\n * @example\n * const user = {\n * id: 1,\n * name: 'Andrew',\n * data: { a: 1, b: 2 },\n * };\n *\n * deepAssign(user, { data: { c: 3 } });\n *\n * console.log(user);\n * // Outputs: '{ id: 1, name: 'Andrew', data: { a: 1, b: 2, c: 3 } }'\n *\n * @example\n * const config = { theme: { dark: true }, version: '1.0' };\n * const updates = { theme: { light: false }, version: '2.0' };\n *\n * deepAssign(config, updates);\n *\n * console.log(config);\n * // Outputs: '{ theme: { dark: true, light: false }, version: '2.0' }'\n *\n * @group Object\n */\nexport const deepAssign = (dest: object, source: object): void => {\n for (const key of Object.keys(source)) {\n const destValue = (dest as any)[key];\n const sourceValue = (source as any)[key];\n\n if (isObject(destValue) && isObject(sourceValue)) {\n deepAssign(destValue as any, sourceValue as any);\n } else {\n (dest as any)[key] = sourceValue;\n }\n }\n};\n","import _cloneDeep from 'lodash/cloneDeep.js';\n\n/**\n * Recursively clones the provided value, creating a deep copy.\n *\n * This function performs a deep clone of the provided value. Any nested objects, arrays, or other complex types will be cloned recursively,\n * ensuring that the original value and the cloned value are completely independent.\n *\n * @param {T} value - The value to recursively clone. Can be any type (object, array, primitive, etc.).\n * @returns {T} Returns a new deeply cloned instance of the original value.\n *\n * @example\n * const original = { name: 'Alice', details: { age: 25, country: 'Wonderland' } };\n * const cloned = deepClone(original);\n *\n * cloned.details.age = 30;\n * console.log(original.details.age); // 25\n * console.log(cloned.details.age); // 30\n *\n * @example\n * const arr = [1, [2, 3], 4];\n * const clonedArr = deepClone(arr);\n * clonedArr[1][0] = 99;\n * console.log(arr[1][0]); // 2\n * console.log(clonedArr[1][0]); // 99\n *\n * @group Object\n */\nexport const deepClone = <T>(value: T): T => {\n return _cloneDeep(value);\n};\n","import { arrayable } from '@/array/arrayable';\nimport { isError, isPrimitive, isString } from '@/is';\nimport type { Arrayable } from '@/types';\nimport _cloneDeepWith from 'lodash/cloneDeepWith.js';\nimport { def } from '../def';\n\nconst WITH_CUSTOMIZER_FACTORY_SYM = Symbol();\n\nexport type WithCustomizer = (\n value: any,\n key: number | string | undefined,\n) => any;\n\nexport type WithCustomizerFactory = () => WithCustomizer;\n\nexport type WithCustomizerValue = Readonly<\n Arrayable<WithCustomizer | WithCustomizerFactory>\n>;\n\n/**\n * Recursively clones the provided value with a customizer function that allows for transformation of certain values during the cloning process.\n *\n * This function deep clones the value while providing a way to customize the cloning behavior of certain properties or elements.\n * The `customizer` function will be called for each value being cloned, and if the customizer function returns a value other than `undefined`,\n * the original value will be replaced with the returned value. This allows for specific modifications to parts of the structure being cloned.\n *\n * @param {T} value - The value to recursively clone. Can be any type (object, array, primitive, etc.).\n * @param {WithCustomizerValue} customizer - A function to customize the cloning process. It receives the current value and key, and must return\n * either a modified value or `undefined` (to keep the original value).\n *\n * @returns {T} Returns a new deep clone of the original value, with customizations applied as per the `customizer` function.\n *\n * @example\n * const original = { name: 'Alice', age: 30, details: { country: 'Wonderland', city: 'London' } };\n *\n * const customizer = (value, key) => {\n * if (key === 'city') return 'Paris'; // Customizing the 'city' field to 'Paris'.\n * };\n *\n * const cloned = deepCloneWith(original, customizer);\n * console.log(cloned.details.city); // 'Paris'\n * console.log(original.details.city); // 'London' (original is unchanged)\n *\n * @example\n * const arr = [1, [2, 3], 4];\n *\n * const customizer = (value) => {\n * if (Array.isArray(value)) return value.map(item => item * 2); // Doubling the numbers inside arrays.\n * };\n *\n * const clonedArr = deepCloneWith(arr, customizer);\n * console.log(clonedArr); // [1, [4, 6], 4]\n * console.log(arr); // [1, [2, 3], 4] (original is unchanged)\n *\n * @group Object\n */\nexport function deepCloneWith<T>(value: T, customizer: WithCustomizerValue): T {\n const fns = prepareCustomizes(customizer);\n\n return _cloneDeepWith(value, (value, key) => {\n let newValue;\n let replaced = false;\n\n for (const fn of fns) {\n newValue = fn(value, key);\n\n if (newValue !== undefined) {\n value = newValue;\n replaced = true;\n }\n }\n\n if (replaced) return value;\n });\n}\n\nexport function createDeepCloneWith(\n customizer: WithCustomizerValue,\n): <T>(value: T) => T {\n return value => {\n return deepCloneWith(value, customizer);\n };\n}\n\nfunction prepareCustomizes(value: WithCustomizerValue): WithCustomizer[] {\n return arrayable(value).map(v => (isCustomizerFactory(v) ? v() : v));\n}\n\nexport function isCustomizerFactory(\n value: unknown,\n): value is WithCustomizerFactory {\n // @ts-expect-error\n return value?.[WITH_CUSTOMIZER_FACTORY_SYM] === true;\n}\n\nexport function createCustomizer(fn: WithCustomizer): WithCustomizer {\n return fn;\n}\n\nexport function createCustomizerFactory(\n fn: (...args: any[]) => WithCustomizer,\n): WithCustomizerFactory {\n def(fn, WITH_CUSTOMIZER_FACTORY_SYM, true);\n return fn;\n}\n\nexport function createSecureCustomizer(\n properties: string[],\n): WithCustomizerFactory {\n const secureLabel = `<** secure **>`;\n const circularLabel = `<** circular **>`;\n const propertiesSet = Object.freeze(\n new Set(properties.map(v => v.toLocaleLowerCase())),\n );\n\n const withCustomizer = (\n seenSet: WeakSet<any>,\n value: any,\n key?: PropertyKey,\n ): any => {\n if (isPrimitive(value)) {\n if (!isString(key)) return;\n if (!propertiesSet.has(key.toLocaleLowerCase())) return;\n\n return secureLabel;\n }\n\n if (seenSet.has(value)) {\n return circularLabel;\n }\n\n seenSet.add(value);\n\n if (isError(value)) {\n return {\n message: value.message,\n stack: value.stack,\n name: value.name,\n };\n }\n };\n\n return createCustomizerFactory(() => {\n const seenSet = new WeakSet();\n return withCustomizer.bind(null, seenSet);\n });\n}\n","import _defaultsDeep from 'lodash/defaultsDeep.js';\n\n/**\n * Recursively assigns default properties.\n * @param object The destination object.\n * @param sources The source objects.\n * @return Returns object.\n *\n * @example\n * const obj = { name: 'Alice', age: 30 };\n * const defaults = { name: 'Bob', age: 25, country: 'Wonderland' };\n *\n * deepDefaults(obj, defaults);\n * console.log(obj);\n * // Output: { name: 'Alice', age: 30, country: 'Wonderland' }\n * // The 'name' and 'age' properties are not overwritten since they already exist.\n *\n * @example\n * const obj = { user: { name: 'Alice' } };\n * const defaults = { user: { age: 25 } };\n *\n * deepDefaults(obj, defaults);\n * console.log(obj);\n * // Output: { user: { name: 'Alice', age: 25 } }\n * // The 'age' property is added to 'user', while 'name' remains unchanged.\n *\n * @group Object\n */\nexport const deepDefaults = _defaultsDeep;\n","/**\n * Recursively freezes an object or array, making it immutable at all levels.\n *\n * This function is similar to `Object.freeze()`, but instead of freezing only the top-level\n * properties of an object, it recursively freezes every nested object or array, ensuring\n * that no properties or elements can be modified at any depth.\n *\n * **Important**:\n * - Once frozen, attempting to modify any property or element of the object will result in an error in strict mode.\n * - If a property of an object or an element of an array is itself an object, it will also be frozen.\n *\n * @param {T} value - The object or array to freeze deeply.\n * @returns {T} The frozen object or array, which is also deeply immutable.\n *\n * @example\n * const config = deepFreeze({\n * db: { uri: '' },\n * });\n *\n * config.db.uri = 'test'; // Error: Cannot assign to read-only property 'uri' of object\n *\n * @example\n * const arr = deepFreeze([ { name: 'Alice' }, { name: 'Bob' } ]);\n * arr[0].name = 'Charlie'; // Error: Cannot assign to read-only property 'name' of object\n *\n * @group Object\n */\nexport function deepFreeze<T extends object | unknown[]>(value: T): T {\n let currentValue: any = value;\n\n if (!currentValue || typeof currentValue !== 'object') return currentValue;\n\n Object.freeze(currentValue);\n\n if (Array.isArray(currentValue)) {\n for (const item of currentValue) {\n deepFreeze(item);\n }\n\n return currentValue as T;\n } else {\n for (const value of Object.values(currentValue)) {\n deepFreeze(value as any);\n }\n }\n\n return currentValue;\n}\n","/**\n * @example\n * const PERMISSIONS = {\n * USER_CREATE: 1 << 0,\n * USER_UPDATE: 1 << 1,\n * USER_DELETE: 1 << 2,\n * USER_LIST: 1 << 4,\n * } as const;\n *\n * const scope = PERMISSIONS.USER_CREATE | PERMISSIONS.USER_LIST;\n *\n * // { USER_CREATE: true, USER_UPDATE: false, USER_DELETE: false, USER_LIST: true }\n * const flags = flagsToMap(scope, PERMISSIONS);\n */\nexport function flagsToMap(\n value: number,\n bitmaskMap: Record<string, number>,\n): Record<string, boolean>;\n\nexport function flagsToMap(\n value: bigint,\n bitmaskMap: Record<string, bigint>,\n): Record<string, boolean>;\n\n/**\n * Converts bitmask into mapped object with true/false values\n *\n * @group Object\n */\nexport function flagsToMap(\n value: number | bigint,\n bitmaskMap: Record<string, number | bigint>,\n): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n\n const compare = typeof value === 'bigint' ? 0n : 0;\n\n for (const [key, mask] of Object.entries(bitmaskMap)) {\n result[key] = ((value as number) & (mask as number)) !== compare;\n }\n\n return result;\n}\n","import { isObject } from '@/is';\n\ninterface FlattenOptions {\n /**\n * Character to separate the flattened keys\n */\n separator?: string;\n\n /**\n * Prefix to add to the flattened keys\n */\n initialPrefix?: string;\n\n /**\n * Whether to include arrays in the flattened result\n */\n withArrays?: boolean;\n\n /**\n * Custom function to check if a value is an object\n */\n isObjectCompare?: (value: unknown) => boolean;\n}\n\n/**\n * Flattens a nested object into a single-level object, converting nested properties\n * into key-value pairs with keys representing the property path.\n *\n * By default, nested objects are flattened with an underscore (`_`) separator.\n * Arrays can also be flattened into indexed keys. A custom function can be provided\n * to determine if a value should be treated as an object.\n *\n * **Important**:\n * - Nested objects are flattened with keys joined by the `separator` (default: `_`).\n * - Arrays are flattened by their indices (e.g., `array[0]` becomes `array_0`).\n * - A custom `isObjectCompare` function can be provided to determine whether a value\n * should be treated as an object.\n *\n * @param {Record<string, unknown>} obj - The object to flatten.\n * @param {FlattenOptions} options - Optional configuration for flattening behavior.\n * @param {string} [options.separator='_'] - Separator for flattening object keys (default is '_').\n * @param {string} [options.initialPrefix=''] - Prefix to prepend to flattened keys (default is '').\n * @param {boolean} [options.withArrays=true] - Whether to include arrays in the flattened result (default is true).\n * @param {(value: unknown) => boolean} [options.isObjectCompare=isObject] - Custom function to check if a value is an object.\n * @returns {Record<string, unknown>} - The flattened object.\n *\n * @example\n * flatten({\n * name: 'Andrew',\n * config: {\n * canReadPost: true,\n * canUpdatePost: true,\n * }\n * });\n * // Result:\n * // {\n * // 'name': 'Andrew',\n * // 'config_canReadPost': true,\n * // 'config_canUpdatePost': true,\n * // }\n *\n * @example\n * flatten(\n * { user: { name: 'Jane', profile: { age: 30 } } },\n * { separator: '-', initialPrefix: 'root-' }\n * );\n * // Returns:\n * // { 'root-user-name': 'Jane', 'root-user-profile-age': 30 }\n *\n * @group Object\n * @author lukeed\n */\nexport function flatten(\n obj: Record<string, unknown>,\n {\n separator = '_',\n initialPrefix = '',\n withArrays = true,\n isObjectCompare = isObject,\n }: FlattenOptions = {},\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const seen = new WeakSet();\n\n if (isObjectCompare(obj)) {\n iter(\n result,\n seen,\n isObjectCompare,\n separator,\n withArrays,\n obj,\n initialPrefix,\n true,\n );\n }\n\n return result;\n}\n\nfunction iter(\n output: Record<string, unknown>,\n seen: WeakSet<any>,\n isObjectCompare: Exclude<FlattenOptions['isObjectCompare'], undefined>,\n separator: string,\n withArrays: boolean,\n val: any,\n key: string,\n initial?: boolean,\n) {\n if (seen.has(val)) return;\n\n let k,\n pfx = key && !initial ? key + separator : key;\n\n if (Array.isArray(val)) {\n seen.add(val);\n\n if (!withArrays) {\n output[key] = val;\n return;\n }\n\n for (k = 0; k < val.length; k++) {\n iter(\n output,\n seen,\n isObjectCompare,\n separator,\n withArrays,\n val[k],\n pfx + k,\n );\n }\n } else if (isObjectCompare(val)) {\n seen.add(val);\n\n for (k in val) {\n iter(\n output,\n seen,\n isObjectCompare,\n separator,\n withArrays,\n val[k],\n pfx + k,\n );\n }\n } else {\n output[key] = val;\n }\n}\n","import { isObject } from '@/is';\n\n/**\n * Returns true when provided keys exists in target object\n *\n * @example\n * const user = { id: 1, name: 'Andrew' };\n *\n * has(user, ['roles']); // false\n * has(user, ['roles', 'name']); // false\n * has(user, ['name']); // true\n *\n * @group Object\n */\nexport function has<T extends PropertyKey>(\n value: any,\n keys: T[],\n): value is { [K in T]: any } {\n if (!isObject(value)) return false;\n\n for (let idx = 0; idx < keys.length; idx++) {\n const element = keys[idx];\n\n if (!(element in value)) return false;\n }\n\n return true;\n}\n","/**\n * Check if object has own property\n *\n * @group Object\n */\nexport const hasOwn = <T extends object, K extends keyof T>(\n val: T,\n key: K,\n): key is K => Object.prototype.hasOwnProperty.call(val, key);\n","import { isObject } from '@/is';\n\n/**\n * Creates a new object with specified keys omitted.\n *\n * This function takes an object and an array of keys, and returns a new object that\n * excludes the properties corresponding to the specified keys.\n *\n * @template T - The type of object.\n * @template K - The type of keys in object.\n * @param {T} obj - The object to omit keys from.\n * @param {K[]} keys - An array of keys to be omitted from the object.\n * @returns {Omit<T, K>} A new object with the specified keys omitted.\n *\n * @example\n * const obj = { a: 1, b: 2, c: 3 };\n * const result = omit(obj, ['b', 'c']);\n * // result will be { a: 1 }\n *\n * @group Object\n */\nexport function omit<T extends Record<string, any>, U extends keyof T>(\n obj: T,\n excludes: Readonly<Array<U> | Set<U> | Array<string> | Set<string>>,\n): Omit<T, U> {\n const excludesSet = Array.isArray(excludes)\n ? new Set(excludes)\n : excludes instanceof Set\n ? excludes\n : undefined;\n\n if (!excludesSet) {\n return obj;\n }\n\n const result: any = {};\n\n if (!isObject(obj)) {\n return result;\n }\n\n for (const [key, value] of Object.entries(obj)) {\n if (excludesSet.has(key)) continue;\n\n result[key] = value;\n }\n\n return result;\n}\n","/**\n * Pick object keys with excluding prefix keys\n *\n * @example\n * const record = {\n * id: 1,\n * canRead: true,\n * canWrite: true,\n * };\n *\n * omitPrefixed(record, 'can'); // { id: 1 }\n *\n * @group Object\n */\nexport function omitPrefixed(\n obj: Record<string, unknown>,\n prefix: string,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith(prefix)) continue;\n result[key] = value;\n }\n\n return result;\n}\n","import { isObject } from '@/is';\nimport { hasOwn } from '../hasOwn';\n\n/**\n * Creates a new object composed of the picked object properties.\n *\n * This function takes an object and an array of keys, and returns a new object that\n * includes only the properties corresponding to the specified keys.\n *\n * @template T - The type of object.\n * @template K - The type of keys in object.\n * @param {T} obj - The object to pick keys from.\n * @param {K[]} keys - An array of keys to be picked from the object.\n * @returns {Pick<T, K>} A new object with the specified keys picked.\n *\n * @example\n * const obj = { a: 1, b: 2, c: 3 };\n * const result = pick(obj, ['a', 'c']);\n * // result will be { a: 1, c: 3 }\n *\n * @group Object\n */\nexport function pick<T extends Record<string, any>, U extends keyof T>(\n obj: T | null | undefined,\n keys: Readonly<Array<U> | Set<U> | Array<string> | Set<string>>,\n): Pick<T, U> {\n const keysSet = Array.isArray(keys)\n ? new Set(keys)\n : keys instanceof Set\n ? keys\n : undefined;\n\n const result: any = {};\n\n if (!keysSet || !isObject(obj)) {\n return result;\n }\n\n for (const key of keysSet.values()) {\n if (hasOwn(obj, key)) {\n result[key] = (obj as any)[key];\n }\n }\n\n return result;\n}\n","interface PrefixedValuesOptions {\n /**\n * Key prefix\n */\n prefix: string;\n\n /**\n * Remove prefix from resulted object\n * @default false\n */\n prefixTrim?: boolean;\n}\n\n/**\n * Pick prefixed keys in target object\n *\n * @example\n * const record = {\n * id: 1,\n * canRead: true,\n * canWrite: true,\n * };\n *\n * // { canRead: true, canWrite: true }\n * pickPrefixed(record, 'can');\n *\n * // { Read: true, Write: true }\n * pickPrefixed(record, { prefix: 'can', prefixTrim: true });\n *\n * @group Object\n */\nexport function pickPrefixed(\n obj: object,\n options: PrefixedValuesOptions | string,\n) {\n let prefix;\n let prefixTrim = false;\n\n if (typeof options === 'string') {\n prefix = options;\n } else {\n prefix = options.prefix;\n prefixTrim = options.prefixTrim === true;\n }\n\n const result = {};\n\n for (let [key, value] of Object.entries(obj)) {\n if (!key.startsWith(prefix!)) continue;\n if (prefixTrim) key = key.substring(prefix!.length);\n\n // @ts-expect-error\n result[key] = value;\n }\n\n return result;\n}\n","import _set from 'lodash/set.js';\n\n/**\n * Same as `get` but for setting property by dot notation.\n *\n * @group Object\n */\nexport const set = _set;\n","/**\n * Converts object into Map\n *\n * @example\n * const map = toMap({ user1: 'Andrew', user2: 'John' });\n *\n * map.get('user2'); // John\n *\n * @group Object\n */\nexport const toMap = <T extends object>(obj: T): Map<keyof T, T[keyof T]> => {\n const map = new Map<any, any>(Object.entries(obj));\n\n for (const symbol of Object.getOwnPropertySymbols(obj)) {\n map.set(symbol, (obj as any)[symbol]);\n }\n\n return map;\n};\n","import { isObject } from '@/is';\n\nconst badKeys = Object.freeze(\n new Set(['constructor', '__proto__', 'prototype']),\n);\n\n/**\n * Converts a flattened object back into a nested structure.\n *\n * Takes an object with dot-separated keys and converts it into a nested object,\n * where each dot-separated part of the key represents a deeper level in the object.\n *\n * @param {Object} obj - The object to unflatten.\n * @param {string} [separator='_'] - The separator used to split the keys into their nested form. Defaults to '_'.\n * @returns {Object} The unflattened object, with nested keys restored to their original structure.\n *\n * @example\n * const obj = {\n * 'name': 'Andrew',\n * 'config_canReadPost': true,\n * 'config_canUpdatePost': true,\n * };\n *\n * unflatten(obj);\n * // Returns:\n * // {\n * // name: 'Andrew',\n * // config: {\n * // canReadPost: true,\n * // canUpdatePost: true\n * // },\n * // }\n *\n * @example\n * const flattenedObj = {\n * 'user.firstName': 'John',\n * 'user.lastName': 'Doe',\n * 'address.city': 'New York'\n * };\n *\n * unflatten(flattenedObj, '.');\n * // Returns:\n * // {\n * // user: {\n * // firstName: 'John',\n * // lastName: 'Doe'\n * // },\n * // address: {\n * // city: 'New York'\n * // }\n * // }\n *\n * @group Object\n * @author lukeed\n */\nexport function unflatten(input: object, separator = '_') {\n if (!isObject(input)) {\n return {};\n }\n\n let arr, tmp: any, output;\n let i = 0,\n k,\n key;\n\n for (k in input) {\n tmp = output;\n arr = k.split(separator);\n\n for (i = 0; i < arr.length; ) {\n key = arr[i++];\n\n if (tmp == null) {\n tmp = empty(+key);\n output = output || tmp;\n }\n\n if (badKeys.has(key)) break;\n\n if (i < arr.length) {\n if (key in tmp) {\n tmp = tmp[key];\n } else {\n tmp = tmp[key] = empty(+arr[i]);\n }\n } else {\n tmp[key] = (input as any)[k];\n }\n }\n }\n\n return output;\n}\n\nfunction empty(key: unknown): any {\n return key === key ? [] : {};\n}\n","import _unset from 'lodash/unset.js';\n\n/**\n * Same as `set` but unset by dot notation\n * @group Object\n */\nexport const unset = _unset;\n","import { isPromise } from '@/is';\nimport { deepClone } from '@/object';\nimport { def } from '@/object/def';\nimport type { AnyFunction } from '@/types';\nimport { isWithCache } from '../createWithCache';\nimport { SYM_WITH_CACHE } from '../createWithCache/utils';\n\n/**\n * Make deep cloning of function result before returning.\n *\n * @example\n * const findUser = withDeepClone(\n * withCache((id: number) => {\n * return { id, name: 'Andrew' };\n * })\n * );\n *\n * const user1 = findUser(100500);\n * const user2 = findUser(100500);\n * user1.name = 'ABC';\n *\n * console.log(user1.name); // ABC\n * console.log(user2.name); // Andrew\n *\n * @group Cache\n */\nexport function withDeepClone<T extends AnyFunction>(fn: T): T {\n const wrapFn = function (...args) {\n // @ts-expect-error\n const result = fn.apply(this, args);\n\n if (isPromise(result)) {\n return result.then(deepClone);\n }\n\n return deepClone(result);\n } as T;\n\n if (isWithCache(fn)) {\n (wrapFn as any).$cache = fn.$cache;\n }\n\n if ('$cache' in fn) {\n (wrapFn as any).$cache = fn.$cache;\n def(wrapFn, SYM_WITH_CACHE, true);\n }\n\n return wrapFn;\n}\n","import type { AnyFunction } from '@/types';\nimport { cache } from '../withCache';\n\n/**\n * @example TODO\n * @group Cache\n * @beta\n */\nexport function withPointerCache<T>(\n pointer: object,\n dependencies: string[],\n fn: () => T,\n): T {\n const cacheKey = dependencies.map(String).join('_');\n\n let fnCache = cache.get(pointer as AnyFunction);\n\n if (fnCache) {\n const cached = fnCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n } else {\n fnCache = new Map();\n cache.set(pointer as AnyFunction, fnCache);\n }\n\n const newValue = fn();\n\n fnCache.set(cacheKey, newValue);\n\n return newValue;\n}\n","import type { AnyFunction } from './types';\n\n/**\n * Capture stack trace till the function and returns as a `string`\n *\n * @example\n *\n * function main() {\n * const userId = getUserId();\n * }\n *\n * function getUserId() {\n * const stackTrace = captureStackTrace(doCoolStuff);\n * console.warn('Please, use getAccountId instead.', stackTrace);\n * }\n *\n * @group Errors\n */\nexport function captureStackTrace(till: AnyFunction): string {\n const err = new Error('');\n\n if ('captureStackTrace' in Error) {\n (Error.captureStackTrace as any)(err, till);\n }\n\n return (err.stack || '').slice(6);\n}\n","import { isError } from './is.js';\n\n/**\n * Transform value to error object\n * @group Errors\n */\nexport function toError<T>(\n value: T,\n unknownMessage = 'Unknown error',\n): T extends Error ? T : Error {\n if (isError(value)) {\n return value as any;\n }\n\n const error = new Error(unknownMessage, { cause: value });\n\n Error.captureStackTrace(error, toError);\n\n return error as any;\n}\n","import { isPromise } from './is';\nimport { toError } from './toError';\n\nexport type CatchErrorResult<T> =\n T extends Promise<unknown>\n ? Promise<OkResult<Awaited<T>> | ErrorResult>\n : OkResult<T> | ErrorResult;\n\ntype ErrorResult = [Error, undefined];\n\ntype OkResult<T> = [undefined, T];\n\n/**\n * You're tired to write `try... catch`, and so are we.\n *\n * Also supports `async/await`\n *\n * @example\n * const [err, result] = catchError(() => {\n * // danger code\n * });\n *\n * @group Errors\n */\nexport function catchError<T>(fn: () => T): CatchErrorResult<T> {\n try {\n const res = fn();\n\n if (isPromise(res)) {\n return res.then(r => [undefined, r]).catch(onError) as any;\n }\n\n return [undefined, res] as any;\n } catch (err) {\n return onError(err) as any;\n }\n}\n\nfunction onError(error: unknown): ErrorResult {\n const err = toError(error);\n return [err, undefined];\n}\n","import { isNumber } from '@/is';\n\n/**\n * Rounds the given value to a specified range. If the value is less than the minimum,\n * it returns the minimum. If the value is greater than the maximum, it returns the maximum.\n * If the value is within the range, it returns the original value.\n *\n * @param {number} num - The number to be clamped.\n * @param {number} min - The minimum value of the range.\n * @param {number} max - The maximum value of the range.\n * @returns {number} - The clamped value within the specified range.\n *\n * @example\n * const min = 5;\n * const max = 10;\n *\n * // Returns: 7 (within range)\n * clamp(7, min, max);\n *\n * // Returns: 10 (clamped to max)\n * clamp(15, min, max);\n *\n * // Returns: 5 (clamped to min)\n * clamp(3, min, max);\n *\n * @group Numbers\n */\nexport const clamp = (num: number, min: number, max: number) => {\n if (!isNumber(num)) return min;\n return Math.min(max, Math.max(min, num));\n};\n","import { isNumber, isString } from '@/is';\nimport { clamp } from '@/num/clamp';\n\n/**\n * Parse alpha channel value and normalize it from 0 to 1\n *\n * @param value Value to be parsed\n * @param fallback Value which will be used as fallback when failed to parse\n *\n * @example\n * parseAlpha('0.1'); // 0.1\n * parseAlpha('10%'); // 0.1\n * parseAlpha(0.1); // 0.1\n *\n * @group Colors\n */\nexport function parseAlpha(value: unknown, fallback: number = 1): number {\n let a: unknown = value;\n\n if (isString(value)) {\n a = value.endsWith('%') ? parseFloat(value) / 100 : parseFloat(value);\n }\n\n if (!isNumber(a)) {\n a = fallback;\n }\n\n return clamp(a as number, 0, 1);\n}\n","import { isString } from '@/is';\nimport { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\n\nconst hexReg = new RegExp(\n /^#([a-f0-9]{3,4}|[a-f0-9]{4}(?:[a-f0-9]{2}){1,2})\\b$/,\n 'i',\n);\n\nexport function parseHEX(value: unknown): Color.ColorChannels | null {\n if (!isString(value)) return null;\n\n const parsed = hexReg.exec(value);\n\n if (!parsed) return null;\n\n let a = 1;\n let hex = parsed[0].replace(/^#/, '');\n\n if (hex.length === 8) {\n a = Number.parseInt(hex.slice(6, 8), 16) / 255;\n hex = hex.slice(0, 6);\n }\n\n if (hex.length === 4) {\n a = Number.parseInt(hex.slice(3, 4).repeat(2), 16) / 255;\n hex = hex.slice(0, 3);\n }\n\n if (hex.length === 3) hex = hex + hex;\n\n return [\n parseInt(hex.slice(0, 2), 16),\n parseInt(hex.slice(2, 4), 16),\n parseInt(hex.slice(4, 6), 16),\n parseAlpha(a),\n ];\n}\n","import { isNumber } from '@/is';\nimport { clamp } from '../clamp';\n\n/**\n * Safely parses a percentage value and returns a number between 0 and 100.\n * It accepts both string and numeric input, automatically handling the '%' sign if present.\n * If the value is not a valid percentage, it returns 0.\n *\n * @param {unknown} value - The value to parse, which can be a string (e.g., '99%') or a number (e.g., 45).\n * @returns {number} A parsed percentage value, constrained between 0 and 100.\n * If the input is invalid or cannot be parsed, it returns 0.\n *\n * @example\n * parsePercentage('99%');\n * // Returns: 99\n *\n * @example\n * parsePercentage('150%');\n * // Returns: 100 (clamped to the maximum allowed value)\n *\n * @example\n * parsePercentage('50.5%');\n * // Returns: 50.5\n *\n * @example\n * parsePercentage('abc');\n * // Returns: 0 (invalid input)\n *\n * @example\n * parsePercentage(80);\n * // Returns: 80 (valid number input)\n *\n * @group Numbers\n */\nexport function parsePercentage(value: unknown): number {\n const parsed = parseFloat(value as any);\n\n if (!isNumber(parsed)) return 0;\n\n return clamp(parsed, 0, 100);\n}\n","import type { Color } from './types';\n\nexport const float = '-?\\\\d*(?:\\\\.\\\\d+)';\nexport const number = `(${float}?)`;\nexport const percentage = `(${float}?%)`;\nexport const numberOrPercentage = `(${float}?%?)`;\n\n/**\n * Check if provided value represents color channels\n * @group Colors\n */\nexport function isColorChannels(value: unknown): value is Color.ColorChannels {\n return Array.isArray(value) && value.length === 4;\n}\n","import { parsePercentage } from '@/num/parsePercentage';\nimport { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\nimport { numberOrPercentage, percentage } from '../utils';\n\nconst hsl = new RegExp(\n `^\n hsla?\\\\(\n \\\\s*(-?\\\\d*(?:\\\\.\\\\d+)?(?:deg|rad|turn)?)\\\\s*,\n \\\\s*${percentage}\\\\s*,\n \\\\s*${percentage}\\\\s*\n (?:,\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n $\n`.replace(/\\n|\\s/g, ''),\n);\n\nconst hsla = new RegExp(\n `^\n hsla?\\\\(\n \\\\s*(-?\\\\d*(?:\\\\.\\\\d+)?(?:deg|rad|turn)?)\\\\s*\n \\\\s+${percentage}\n \\\\s+${percentage}\n \\\\s*(?:\\\\s*\\\\/\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n $\n`.replace(/\\n|\\s/g, ''),\n);\n\n/**\n * Parse a string as a hsl color\n */\nexport function parseHSL(value: string): Color.HSLA | null {\n const parsed = hsla.exec(value) || hsl.exec(value);\n\n if (!parsed) return null;\n\n const [, h, s, l, a = 1] = parsed;\n\n let hh: any = h;\n if (hh.endsWith('turn')) {\n hh = (parseFloat(hh) * 360) / 1;\n } else if (hh.endsWith('rad')) {\n hh = Math.round((parseFloat(hh) * 180) / Math.PI);\n } else {\n hh = parseFloat(hh);\n }\n\n return {\n h: hh,\n s: parsePercentage(s),\n l: parsePercentage(l),\n a: parseAlpha(a === null ? 1 : a),\n };\n}\n","/**\n * Check if bits are set in `number` bitmask\n *\n * @example\n * const scope = (1 << 1 | 1 << 2 | 1 << 3);\n *\n * checkBitmask(scope, 1 << 2); // true\n * checkBitmask(scope, 1 << 5); // false\n *\n * @group Numbers\n */\nexport function checkBitmask(scope: number, flag: number): boolean;\n\n/**\n * Check if bits are set in `bigint` bitmask\n *\n * @example\n * const scope = (1n << 1n | 1n << 2n | 1n << 3n);\n *\n * checkBitmask(scope, 1n << 2n); // true\n * checkBitmask(scope, 1n << 5n); // false\n *\n * @group Numbers\n */\nexport function checkBitmask(scope: bigint, flag: bigint): boolean;\n\nexport function checkBitmask(scope: any, flag: any): boolean {\n return (scope & flag) === flag;\n}\n","/**\n * Returns a random integer between min (inclusive) and max (inclusive).\n * The value is no lower than min (or the next integer greater than min\n * if min isn't an integer) and no greater than max (or the next integer\n * lower than max if max isn't an integer).\n * Using Math.round() will give you a non-uniform distribution!\n *\n * @example\n * getRandomInt(0, 100); // random int between 0 - 100\n *\n * @group Numbers\n */\nexport function getRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","import { assert } from '@/assert';\nimport { getRandomInt } from '../getRandomInt';\n\nexport interface RandomizerOptions {\n min: number;\n max: number;\n pregenerateAmount: number;\n transform: (value: number) => number;\n}\n\nclass Randomizer {\n private _pool: number[] = [];\n private _step: number = 0;\n private _min: number;\n private _max: number;\n private _pregenerateAmount: number;\n private _transform: (value: number) => number;\n\n constructor({ min, max, pregenerateAmount, transform }: RandomizerOptions) {\n this._min = min;\n this._max = max;\n this._pregenerateAmount = pregenerateAmount;\n this._transform = transform;\n }\n\n /**\n * Returns the current step of the randomizer.\n *\n * @returns {number} The current step.\n */\n getCurrentStep(): number {\n return this._step;\n }\n\n /**\n * Sets the current step of the randomizer.\n *\n * @param {number} value - The step to set.\n * @throws {Error} If the provided value is not a valid number or less than 0.\n */\n setCurrentStep(value: number) {\n assert.number(value, 'Current step must be an number');\n assert.ok(value >= 0, 'Current step must be getter or equal 0');\n this._step = value;\n }\n\n /**\n * Retrieves a random number either from the current step or a specific step if provided.\n *\n * @param {number} [fromStep] - The step from which to retrieve the random number (optional).\n * @returns {number} The random number at the current or specified step.\n */\n get(fromStep?: number): number {\n if (fromStep === undefined) {\n return this._lookup(this._step++);\n }\n\n return this._lookup(fromStep);\n }\n\n /**\n * Resets the current step to 0.\n */\n resetStep() {\n this._step = 0;\n }\n\n /**\n * Resets the random number pool, clearing and repopulating it with new random values.\n */\n resetPool() {\n const size = this._pregenerateAmount;\n\n this._pool = Array.from({ length: size });\n\n for (let step = 0; step < size; step++) {\n this._pool[step] = this._rand();\n }\n }\n\n private _rand(): number {\n return this._transform(getRandomInt(this._min, this._max));\n }\n\n private _lookup(step: number): number {\n if (this._pool[step] === undefined) {\n this._pool[step] = this._rand();\n }\n\n return this._pool[step]!;\n }\n}\n\nconst noopTransform = (v: number) => v;\n\n/**\n * Creates a random number generator with step control and optional transformation.\n * Allows caching of generated numbers for efficiency, with optional pregeneration and transformation.\n *\n * @param {RandomizerOptions} options - Configuration for the randomizer.\n * @param {number} options.min - Minimum value for the random number.\n * @param {number} options.max - Maximum value for the random number.\n * @param {number} [options.pregenerateAmount=100] - Number of random numbers to pregenerate and cache.\n * @param {(value: number) => number} [options.transform] - A function to transform the generated random number.\n * @returns {Randomizer} - The randomizer object with step control and number generation.\n *\n *\n * @example\n * // Basic usage of the randomizer\n * const randomizer = createRandomizer({\n * min: 1,\n * max: 10,\n * pregenerateAmount: 5\n * });\n *\n * // Get the random number at the current step\n * console.log(randomizer.get()); // e.g., returns 3\n *\n * // Get the random number at a specific step\n * console.log(randomizer.get(2)); // e.g., returns 7\n *\n * // Get the current step\n * console.log(randomizer.getCurrentStep()); // returns the current step (e.g., 1)\n *\n * // Set the current step to 3\n * randomizer.setCurrentStep(3);\n *\n * // Get the random number at step 3\n * console.log(randomizer.get()); // returns the value for step 3\n *\n * @example\n * // Usage with a transformation function\n * const randomizerWithTransform = createRandomizer({\n * min: 1,\n * max: 10,\n * pregenerateAmount: 5,\n * transform: (value) => value * 2\n * });\n *\n * // Get a transformed random number at the current step\n * console.log(randomizerWithTransform.get()); // e.g., returns 6 (original value 3 transformed by multiplying by 2)\n *\n * // Reset the step to 0\n * randomizerWithTransform.resetStep();\n * console.log(randomizerWithTransform.get()); // returns the random number at step 0\n *\n * @group Numbers\n */\nexport function createRandomizer({\n min = Number.MIN_SAFE_INTEGER,\n max = Number.MAX_SAFE_INTEGER,\n pregenerateAmount = 100,\n transform = noopTransform,\n}: Partial<RandomizerOptions>): Randomizer {\n return new Randomizer({ min, max, pregenerateAmount, transform });\n}\n","/**\n * A class that allows you to calculate the running mean (average) of a set of numbers.\n * It computes the average as new numbers are added and can also reset the progress.\n *\n * @example\n * // Basic usage to calculate running mean\n * const avg = findMean();\n * avg.push(1, 2, 3);\n * console.log(avg.value); // Output: 2 (average of 1, 2, 3)\n *\n * @example\n * // Reset the calculation with an initial value\n * const avg = findMean(10);\n * avg.push(20);\n * console.log(avg.value); // Output: 15 (average of 10, 20)\n * console.log(avg.count); // Output: 2 (two values added)\n */\nexport class FindMean {\n #count: number = 0;\n #value: number = 0;\n\n constructor(initialValue?: number) {\n this.reset(initialValue);\n }\n\n /**\n * Resets the current progress of the mean calculation.\n * Optionally, you can pass an initial value to start the calculation.\n *\n * @param {number} [initialValue] - The initial value to start the mean calculation with.\n * @returns {FindMean} The current instance of the FindMean class for chaining.\n *\n * @example\n * const avg = findMean();\n * avg.push(2, 4);\n * avg.reset();\n * console.log(avg.value); // Output: 0\n */\n reset(initialValue?: number): FindMean {\n if (initialValue === undefined) {\n this.#count = 0;\n this.#value = 0;\n } else {\n this.#count = 1;\n this.#value = initialValue;\n }\n\n return this;\n }\n\n /**\n * Retrieves the current mean value (average).\n *\n * @returns {number} The current mean value.\n *\n * @example\n * const avg = findMean();\n * avg.push(5, 10);\n * console.log(avg.value); // Output: 7.5 (average of 5, 10)\n */\n get value(): number {\n return this.#value;\n }\n\n /**\n * Retrieves the count of numbers added so far.\n *\n * @returns {number} The count of numbers in the set.\n *\n * @example\n * const avg = findMean();\n * avg.push(10, 20);\n * console.log(avg.count); // Output: 2\n */\n get count(): number {\n return this.#count;\n }\n\n /**\n * Adds values to the set and updates the running mean.\n *\n * @param {...number} values - The values to add to the set.\n * @returns {FindMean} The current instance of the FindMean class for chaining.\n *\n * @example\n * const avg = findMean();\n * avg.push(1, 2, 3);\n * console.log(avg.value); // Output: 2 (average of 1, 2, 3)\n * console.log(avg.count); // Output: 3\n */\n push(...values: number[]): FindMean {\n for (const item of values) {\n this.#count++;\n this.#value += (item - this.#value) / this.#count;\n }\n\n return this;\n }\n}\n\n/**\n * Calculate the running mean (average) of a set of numbers.\n *\n * @param {number} [value] - An optional starting value for the mean calculation.\n * @returns {FindMean} A new instance of FindMean class to calculate running mean.\n *\n * @example\n * // Create a FindMean instance and add values to calculate the average\n * const avg = findMean();\n * avg.push(3, 3, 3.3);\n * console.log(avg.value); // Output: 3.1\n * console.log(avg.count); // Output: 3\n *\n * @group Numbers\n */\nexport function findMean(value?: number): FindMean {\n return new FindMean(value);\n}\n","import { isNumber, isString } from '@/is';\n\nexport interface FormatNumber {\n thousands: string;\n decimal: string;\n}\n\nconst defaultFormat: FormatNumber = {\n /**\n * Symbol to separate thousands parts\n */\n thousands: ',',\n\n /**\n * Symbol to separate decimal part\n */\n decimal: '.',\n};\n\nconst regExp = /\\B(?=(\\d{3})+(?!\\d))/g;\n\n/**\n * Formats a number (or string representing a number) into a string with thousands separators and optional decimal points.\n * The function supports customizing the formatting style using the `FormatNumber` object.\n *\n * @param {number | string} value - The number or string to format.\n * If a string is passed, it is parsed to a number before formatting.\n * @param {FormatNumber} [format=defaultFormat] - The format settings for thousands and decimal separators.\n * By default, it uses the `{ thousands: ',', decimal: '.' }`.\n *\n * @returns {string} The formatted number string with appropriate thousands separators and decimal formatting.\n *\n * @example\n * // Format a number with default thousands separator\n * formatNumber(1500);\n * // Returns: '1,500'\n *\n * @example\n * // Format a number with a custom format (e.g., using a comma as the thousands separator)\n * formatNumber(1500.75, { thousands: ' ', decimal: '.' });\n * // Returns: '1 500.75'\n *\n * @group Numbers\n */\nexport function formatNumber(\n value: number | string,\n format: FormatNumber = defaultFormat,\n): string {\n if (isString(value)) {\n return formatNumber(parseFloat(value), format);\n }\n\n if (!isNumber(value)) return '';\n\n const [integerPart, decimalPart] = value.toFixed(2).split('.');\n\n let result = String(integerPart).replace(regExp, format.thousands);\n\n if (decimalPart !== '00') {\n result += format.decimal + decimalPart;\n }\n\n return result;\n}\n","/**\n * Rounds a given number to a specified number of decimal places.\n * The rounding is done using a method that shifts the decimal point, rounds the number, and then shifts it back.\n *\n * @param {number} value - The number to be rounded.\n * @param {number} [digits=2] - The number of decimal places to round to. Defaults to 2 if not provided.\n * @returns {number} The rounded number with the specified number of decimal places.\n *\n * @example\n * round2digits(3.3333333, 1);\n * // Returns: 3.3\n *\n * @example\n * round2digits(3.3333333, 2);\n * // Returns: 3.33\n *\n * @example\n * round2digits(3.3333333, 3);\n * // Returns: 3.333\n *\n * @example\n * round2digits(3.789, 0);\n * // Returns: 4 (rounded to the nearest integer)\n *\n * @group Numbers\n */\nexport function round2digits(value: number, digits: number = 2) {\n if (digits === 0) {\n return value << 0;\n }\n\n // @ts-expect-error\n return Number(Math.round(value + 'e' + digits) + 'e-' + digits);\n}\n","import { isString } from '@/is';\nimport { type FormatNumber, formatNumber } from '../formatNumber';\nimport { round2digits } from '../round2digits';\n\nexport interface FormatMoney extends FormatNumber {\n symbol: string;\n symbolBefore?: boolean;\n}\n\nconst CURRENCY_FORMAT = new Map<string, FormatMoney>([\n ['USD', { symbol: '$', thousands: ',', decimal: '.', symbolBefore: true }],\n ['EUR', { symbol: '€', thousands: '.', decimal: ',', symbolBefore: true }],\n ['GBP', { symbol: '£', thousands: ',', decimal: '.', symbolBefore: true }],\n ['JPY', { symbol: '¥', thousands: ',', decimal: '', symbolBefore: true }],\n ['AUD', { symbol: 'A$', thousands: ',', decimal: '.', symbolBefore: true }],\n ['CAD', { symbol: 'C$', thousands: ',', decimal: '.', symbolBefore: true }],\n ['CHF', { symbol: 'CHF', thousands: \"'\", decimal: '.', symbolBefore: true }],\n ['CNY', { symbol: '¥', thousands: ',', decimal: '.', symbolBefore: true }],\n ['INR', { symbol: '₹', thousands: ',', decimal: '.', symbolBefore: true }],\n ['KRW', { symbol: '₩', thousands: ',', decimal: '', symbolBefore: true }],\n ['RUB', { symbol: '₽', thousands: ' ', decimal: ',', symbolBefore: false }],\n ['UAH', { symbol: '₴', thousands: ' ', decimal: ',', symbolBefore: false }],\n ['BRL', { symbol: 'R$', thousands: '.', decimal: ',', symbolBefore: true }],\n ['MXN', { symbol: '$', thousands: ',', decimal: '.', symbolBefore: true }],\n ['ZAR', { symbol: 'R', thousands: ' ', decimal: ',', symbolBefore: true }],\n ['UAH', { symbol: '₴', thousands: ' ', decimal: ',', symbolBefore: true }],\n]);\n\nconst DEF_FORMAT: FormatMoney = {\n decimal: ' ',\n thousands: ',',\n symbol: '',\n symbolBefore: false,\n};\n\n/**\n * Formats a given number (amount of money) as a currency string.\n * This function supports both integer and floating-point representations of money\n * and automatically applies the appropriate currency formatting for the specified currency code.\n *\n * @param {number} amount - The amount of money to format (in cents or as a floating-point value).\n * @param {string | FormatMoney} formatOrCode - The currency format or the currency code (e.g., 'USD').\n * If the format is passed as a string, the function will look up the format for that currency code.\n * @param {boolean} [intMode=false] - When set to `true`, the amount is considered to be in integer form (i.e., cents).\n * The value will be divided by 100 to convert it to a decimal format.\n *\n * @returns {string} The formatted money string, including the currency symbol and the properly formatted number.\n *\n * @example\n * // Basic formatting with USD currency\n * formatMoney(1500, 'USD');\n * // Returns: '$1,500'\n *\n * @example\n * // Formatting when the amount is in integer form (representing cents)\n * formatMoney(1599, 'USD', true);\n * // Returns: '$15.99'\n *\n * @group Numbers\n */\nexport function formatMoney(\n amount: number,\n formatOrCode: string | FormatMoney = 'USD',\n intMode = false,\n): string {\n if (intMode) {\n amount = round2digits(amount / 100, 2);\n }\n\n const format = isString(formatOrCode)\n ? CURRENCY_FORMAT.get(formatOrCode) || {\n ...DEF_FORMAT,\n symbol: formatOrCode,\n }\n : formatOrCode;\n\n const formattedNumber = formatNumber(amount, format);\n\n return format.symbolBefore\n ? format.symbol + formattedNumber\n : formattedNumber + format.symbol;\n}\n","/**\n * Humanizes large numbers into a more readable format using suffixes like K, M, B, T (thousand, million, billion, trillion).\n *\n * @param {number | string} input - The number or string to humanize.\n * If the input is a string, it will be parsed into a number.\n * @param {number} [decimals=1] - The number of decimal places to display. Default is 1.\n * @returns {string} A humanized string representation of the number.\n *\n * @example\n * humanize(1000000);\n * // Returns: '1M'\n *\n * @example\n * humanize(1234567890);\n * // Returns: '1.2B'\n *\n * @example\n * humanize(9876543210, 2);\n * // Returns: '9.88B'\n *\n * @example\n * humanize(500);\n * // Returns: '500'\n *\n * @example\n * humanize('1000000');\n * // Returns: '1M'\n *\n * @group Numbers\n */\nexport function humanize(input: number | string, decimals = 1): string {\n if (input === null || input === undefined) {\n return String(input);\n }\n\n decimals = Math.max(decimals, 0);\n\n const number = parseInt(input as string, 10);\n\n if (!Number.isFinite(number)) {\n return String(input);\n }\n\n const signString = number < 0 ? '-' : '';\n const unsignedNumber = Math.abs(number);\n const unsignedNumberString = String(unsignedNumber);\n const numberLength = unsignedNumberString.length;\n const numberLengths = [13, 10, 7, 4];\n const bigNumPrefixes = ['T', 'B', 'M', 'k'];\n\n // small numbers\n if (unsignedNumber < 1000) {\n return `${signString}${unsignedNumberString}`;\n }\n\n // huge numbers\n if (numberLength > numberLengths[0] + 3) {\n return number.toExponential(decimals).replace('e+', 'x10^');\n }\n\n // 999 < unsignedNumber < 999,999,999,999,999\n let length = 0;\n for (let i = 0; i < numberLengths.length; i++) {\n const _length = numberLengths[i];\n if (numberLength >= _length) {\n length = _length;\n break;\n }\n }\n\n const decimalIndex = numberLength - length + 1;\n const unsignedNumberCharacterArray = unsignedNumberString.split('');\n\n const wholePartArray = unsignedNumberCharacterArray.slice(0, decimalIndex);\n const decimalPartArray = unsignedNumberCharacterArray.slice(\n decimalIndex,\n decimalIndex + decimals + 1,\n );\n\n const wholePart = wholePartArray.join('');\n\n // pad decimalPart if necessary\n let decimalPart = decimalPartArray.join('');\n if (decimalPart.length < decimals) {\n decimalPart += `${Array(decimals - decimalPart.length + 1).join('0')}`;\n }\n\n if (decimalPart[0] === '0') {\n decimals = 0;\n }\n\n let output;\n if (decimals === 0) {\n output = `${signString}${wholePart}${bigNumPrefixes[numberLengths.indexOf(length)]}`;\n } else {\n const outputNumber = Number(`${wholePart}.${decimalPart}`).toFixed(\n decimals,\n );\n output = `${signString}${outputNumber}${bigNumPrefixes[numberLengths.indexOf(length)]}`;\n }\n\n return output;\n}\n","import { isNumber, isString } from '@/is';\n\n/**\n * Parses all numbers from a given string and returns them as an array of numbers.\n * Supports dot decimals and ignores commas unless they appear as part of a number format.\n * Returns an empty array when the input is invalid or no numbers are found.\n *\n * @param {unknown} input - The input value to parse numbers from.\n * @returns {number[]} - An array of parsed numbers. Returns an empty array if no numbers are found.\n *\n * @example\n * parseAllNumbers(\"The temperature is -23.5°C and humidity is 60%.\");\n * // Returns: [-23.5, 60]\n *\n * @example\n * parseAllNumbers(\"No numbers here!\");\n * // Returns: []\n *\n * @example\n * parseAllNumbers(42);\n * // Returns: [42]\n *\n * @example\n * parseAllNumbers(\"1,234 and 56.78 are numbers\");\n * // Returns: [1.234, 56.78]\n *\n * @example\n * parseAllNumbers([\"Invalid type\"]);\n * // Returns: []\n *\n * @group Numbers\n */\nexport function parseAllNumbers(value: unknown): number[] {\n if (isNumber(value)) {\n return [value];\n }\n\n if (!isString(value)) {\n return [];\n }\n\n const matches = value.replace(/,/g, '.').match(/-?\\d+(\\.\\d+)?/g);\n\n if (!matches) {\n return [];\n }\n\n return matches.map(Number).filter(isNumber);\n}\n","import { round2digits } from '../round2digits';\n\n/**\n * Calculates the specified percentage of a given value.\n * The result is the value multiplied by the percentage divided by 100.\n * Optionally rounds the result to a specified number of decimal places.\n *\n * @param {number} value - The value from which the percentage will be calculated.\n * @param {number} percent - The percentage to calculate from the value.\n * @param {number} [digits] - Optional. The number of decimal places to round the result to. If not provided, the result will not be rounded.\n * @returns {number} The calculated percentage of the value. If `digits` is provided, the result is rounded to the specified decimal places.\n *\n * @example\n * percentOf(200, 20);\n * // Returns: 40 (20% of 200)\n *\n * @example\n * percentOf(200, 20, 2);\n * // Returns: 40.00 (20% of 200 rounded to 2 decimal places)\n *\n * @example\n * percentOf(150, 15);\n * // Returns: 22.5 (15% of 150)\n *\n * @example\n * percentOf(1000, 10, 1);\n * // Returns: 100.0 (10% of 1000 rounded to 1 decimal place)\n *\n * @group Numbers\n */\nexport function percentOf(value: number, percent: number, digits?: number) {\n let result = (percent / 100) * value;\n\n if (digits) {\n result = round2digits(result, digits);\n }\n\n return result;\n}\n","import { isNumber, isString } from '@/is';\nimport { clamp } from '@/num';\nimport { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\nimport { number, numberOrPercentage, percentage } from '../utils';\n\nconst rgb3Numbers = new RegExp(\n `^\n rgba?\\\\(\n \\\\s*${number}\\\\s*,\n \\\\s*${number}\\\\s*,\n \\\\s*${number}\\\\s*\n (?:,\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n $\n`.replace(/\\n|\\s/g, ''),\n);\n\nconst rgb3Percent = new RegExp(\n `^\n rgba?\\\\(\n \\\\s*${percentage}\\\\s*,\n \\\\s*${percentage}\\\\s*,\n \\\\s*${percentage}\\\\s*\n (?:,\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n $\n`.replace(/\\n|\\s/g, ''),\n);\n\nconst rgb4Numbers = new RegExp(\n `^\n rgba?\\\\(\n \\\\s*${number}\n \\\\s+${number}\n \\\\s+${number}\n \\\\s*(?:\\\\s*\\\\/\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n$\n`.replace(/\\n|\\s/g, ''),\n);\n\nconst rgb4Percent = new RegExp(\n `^\n rgba?\\\\(\n \\\\s*${percentage}\n \\\\s+${percentage}\n \\\\s+${percentage}\n \\\\s*(?:\\\\s*\\\\/\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n$\n`.replace(/\\n|\\s/g, ''),\n);\n\nconst parseValue = (num: string | number) => {\n let n = num;\n if (!isNumber(n))\n n = n.endsWith('%') ? (parseFloat(n) * 255) / 100 : parseFloat(n);\n return clamp(Math.round(n), 0, 255);\n};\n\nexport function parseRGB(value: unknown): Color.RGBA | null {\n if (!isString(value)) return null;\n\n const rgb =\n rgb4Numbers.exec(value) ||\n rgb4Percent.exec(value) ||\n rgb3Numbers.exec(value) ||\n rgb3Percent.exec(value);\n\n if (!rgb) return null;\n\n const [, r, g, b, a] = rgb;\n\n return {\n r: parseValue(r),\n g: parseValue(g),\n b: parseValue(b),\n a: parseAlpha(a),\n };\n}\n","import type { Color } from '../types';\n\n/**\n * Build css valid color from color channels\n *\n * @example\n * const channels = [255, 255, 255, 0.5];\n *\n * buildCssColor(channels); // 'rgba(255, 255, 255, 0.5)'\n *\n * // with applied opacity factor\n * buildCssColor(channels, 0.1); // 'rgba(255, 255, 255, 0.05)'\n *\n * @group Colors\n */\nexport function buildCssColor(\n [r, g, b, a = 1]: Color.ColorChannels,\n opacity = 1,\n): string {\n return `rgba(${r}, ${g}, ${b}, ${a * opacity})`;\n}\n","import { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\nimport { parseHEX } from './parseHEX';\n\n/**\n * Parsing hex string as color channels\n *\n * @example\n * hexToChannels('#FFFFFF'); // [255, 255, 255, 1]\n * hexToChannels('#FFF'); // [255, 255, 255, 1]\n *\n * @group Colors\n */\nexport function hexToChannels(hexWithAlpha: string): Color.ColorChannels {\n const [hex, alpha] = hexWithAlpha.split('/');\n const channels = parseHEX(hex);\n\n if (!channels) return [0, 0, 0, 0];\n\n if (alpha) {\n channels[3] = parseAlpha(alpha);\n }\n\n return channels;\n}\n","import type { Color } from '../types';\nimport { parseHSL } from './parseHSL';\n\n/**\n * Parsing HSL string as color channels\n *\n * @example\n * // [128, 51, 204, 0.15]\n * hslToChannels('hsl(270 60% 50% / 15%)');\n *\n * @group Colors\n */\nexport function hslToChannels(value: string): Color.ColorChannels {\n const parsed = parseHSL(value);\n\n if (!parsed) return [0, 0, 0, 0];\n\n let { h, s, l, a } = parsed;\n\n s /= 100;\n l /= 100;\n const k = (n: number) => (n + h / 30) % 12;\n const p = s * Math.min(l, 1 - l);\n const f = (n: number) =>\n l - p * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));\n\n return [\n Math.round(255 * f(0)),\n Math.round(255 * f(8)),\n Math.round(255 * f(4)),\n a,\n ];\n}\n","import type { Color } from '../types';\nimport { parseRGB } from './parseRGB';\n\n/**\n * Parsing rgb() string as color channels\n *\n * @example\n * // [255, 0, 0, 0.2]\n * rgbToChannels('rgba(100% 0% 0% / 20%)');\n *\n * @group Colors\n */\nexport function rgbToChannels(value: string): Color.ColorChannels {\n const rgb = parseRGB(value);\n\n if (!rgb) return [0, 0, 0, 0];\n\n return [rgb.r, rgb.g, rgb.b, rgb.a];\n}\n","import { isNumber, isString } from '@/is';\nimport { hexToChannels } from '../hexToChannels';\nimport { hslToChannels } from '../hslToChannels';\nimport { rgbToChannels } from '../rgbToChannels';\nimport type { Color } from '../types';\nimport { isColorChannels } from '../utils';\n\n/**\n * Parse css color and returns color channels\n * @group Colors\n */\nexport function colorToChannels(\n color: string | Color.ColorChannels,\n): Color.ColorChannels {\n if (isColorChannels(color)) {\n return color;\n }\n\n if (isString(color)) {\n color = color.trim();\n\n if (color[0] === '#') {\n return hexToChannels(color);\n } else if (color.startsWith('rgb')) {\n return rgbToChannels(color);\n } else if (color.startsWith('rgba')) {\n return rgbToChannels(color);\n } else if (color.startsWith('hsl')) {\n return hslToChannels(color);\n } else if (color.includes(',')) {\n const channels = color\n .split(',')\n .map(v => parseFloat(v))\n .filter(isNumber)\n .slice(0, 4);\n\n while (channels.length < 3) {\n channels.push(0);\n }\n\n return [...channels, 1].slice(0, 4) as Color.ColorChannels;\n }\n }\n\n console.warn('Failed to convert color into channels', typeof color, color);\n return [0, 0, 0, 1];\n}\n","import { buildCssColor } from '../buildCssColor';\nimport { colorToChannels } from '../colorToChannels';\nimport { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\n\n/**\n * Returns css valid color with adjusted alpha channel\n *\n * @example\n * alpha('rgba(0, 0, 0, 0.87)', 1); // 'rgba(0, 0, 0, 1)'\n *\n * @group Colors\n */\nexport function alpha(\n color: string | Color.ColorChannels,\n newAlpha: number,\n): string {\n const [r, g, b] = colorToChannels(color);\n\n return buildCssColor([r, g, b, parseAlpha(newAlpha)], 1);\n}\n","import { colorToChannels } from '../colorToChannels';\nimport type { Color } from '../types';\n\n/**\n * Just mixing of two colors\n *\n * @example\n * const colorA = 'rgb(50, 100, 100)';\n * const colorB = 'rgb(150, 0, 0)';\n *\n * // [100, 50, 50, 1]\n * blendColors(colorA, colorB, 0.5);\n *\n * @group Colors\n */\nexport function blendColors(\n color1: Color.ColorChannels | string,\n color2: Color.ColorChannels | string,\n factor: number,\n): Color.ColorChannels {\n const [r1, g1, b1, a1] = colorToChannels(color1);\n const [r2, g2, b2, a2] = colorToChannels(color2);\n\n return [\n Math.round(r1 * (1 - factor) + r2 * factor),\n Math.round(g1 * (1 - factor) + g2 * factor),\n Math.round(b1 * (1 - factor) + b2 * factor),\n Math.round(a1 * (1 - factor) + a2 * factor),\n ];\n}\n","import { isNumber } from '@/is';\nimport type { Color } from '../types';\n\n/**\n * Converts color channels into hex\n *\n * @example\n * const channels = [255, 255, 255, 1];\n *\n * // with alpha channel\n * channelsToHex(channels); // '#FFFFFFFF'\n *\n * // without alpha channel\n * channelsToHex(channels, false); // '#FFFFFF'\n * @group Colors\n */\nexport function channelsToHex(\n channels: Color.ColorChannels,\n withAlpha: boolean = true,\n) {\n const [r, g, b, a] = channels;\n\n const outParts = [\n r.toString(16).toUpperCase().padStart(2, '0'),\n g.toString(16).toUpperCase().padStart(2, '0'),\n b.toString(16).toUpperCase().padStart(2, '0'),\n ];\n\n if (withAlpha && isNumber(a)) {\n outParts.push(\n Math.round(a * 255)\n .toString(16)\n .substring(0, 2)\n .toUpperCase()\n .padStart(2, '0'),\n );\n }\n\n return '#' + outParts.join('');\n}\n","import { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\n\n/**\n * Converts color channels into HSL\n * @group Colors\n */\nexport function channelsToHSL([r, g, b, a]: Color.ColorChannels): Color.HSLA {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n const l = (max + min) / 2;\n\n let h = 0;\n let s = 0;\n\n if (delta !== 0) {\n s = delta / (1 - Math.abs(2 * l - 1));\n\n if (max === r) {\n h = ((g - b) / delta) % 6;\n } else if (max === g) {\n h = (b - r) / delta + 2;\n } else if (max === b) {\n h = (r - g) / delta + 4;\n }\n\n h *= 60;\n\n if (h < 0) {\n h += 360;\n }\n }\n\n return {\n h: Math.round(h),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n a: parseAlpha(a),\n };\n}\n","import type { Color } from '../types';\n\n/**\n * Converts color channels into RGB\n * @group Colors\n */\nexport function channelsToRGB([r, g, b, a]: Color.ColorChannels): Color.RGBA {\n return {\n r,\n g,\n b,\n a,\n };\n}\n","import { round2digits } from '@/num';\n\n/**\n * Calculate WCAG 2.0 contrast ratio of two luminance\n *\n * @example\n * const l1 = luminance([255, 255, 255, 1]);\n * const l2 = luminance([0, 0, 0, 1]);\n *\n * contrastRatio(l1, l2); // 21\n *\n * @group Colors\n */\nexport function contrastRatio(l1: number, l2: number) {\n return round2digits((Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05), 4);\n}\n","import { noop } from '@/is';\n\nconst defaultWindow = (globalThis as any)?.window as Window | undefined;\n\n/**\n * Create a getter of css variable for container\n * @group Colors\n */\nexport function cssVariable(container: HTMLElement): (name: string) => string {\n if (!defaultWindow) return noop as any;\n\n const computedStyles = defaultWindow.getComputedStyle(container);\n\n return (name: string) => {\n const patterns = name.split('/', 2);\n\n if (patterns[0]?.startsWith('--')) {\n let value = computedStyles.getPropertyValue(patterns[0])?.trim();\n\n if (patterns[0].startsWith('--v')) {\n value = `rgb(${value})`;\n }\n\n patterns[0] = value;\n }\n\n return patterns.join('/');\n };\n}\n","import { colorToChannels } from '../colorToChannels';\nimport type { Color } from '../types';\n\n/**\n * Linear color interpolating\n *\n * @example\n * // 'rgba(50, 50, 50, 1)'\n * interpolateColor(\n * 'rgb(0, 0, 0)',\n * 'rgb(100, 100, 100)',\n * 0.5\n * );\n *\n * @group Colors\n */\nexport function interpolateColor(\n color1: string | Color.ColorChannels,\n color2: string | Color.ColorChannels,\n factor: number,\n): Color.ColorChannels {\n const [r1, g1, b1, a1] = colorToChannels(color1);\n const [r2, g2, b2, a2] = colorToChannels(color2);\n\n return [\n Math.round(r1 + factor * (r2 - r1)),\n Math.round(g1 + factor * (g2 - g1)),\n Math.round(b1 + factor * (b2 - b1)),\n a1 + factor * (a2 - a1),\n ];\n}\n","import type { Color } from '../types';\n\n/**\n * Calculate luminance of color\n *\n * @example\n * luminance([255, 255, 255, 1]); // 1\n * luminance([0, 0, 0, 1]); // 0\n *\n * @group Colors\n */\nexport function luminance([r, g, b]: Color.ColorChannels): number {\n const a = [r, g, b].map(function (v) {\n v /= 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;\n}\n","import { blendColors } from '../blendColors';\nimport { colorToChannels } from '../colorToChannels';\nimport { contrastRatio } from '../contrastRatio';\nimport { luminance } from '../luminance';\nimport type { Color } from '../types';\n\n/**\n * Returns a color text color that should be on background to keep good contrast\n *\n * @example\n * const bgColor = 'rgb(255, 255, 255)';\n * const tint = 1;\n *\n * // 'rgba(0, 0, 0, 1)'\n * const textColor = tintedTextColor(bgColor, tint);\n *\n * @group Colors\n */\nexport function tintedTextColor(\n background: string | Color.ColorChannels,\n tintPercentage = 0.2,\n): Color.ColorChannels {\n const bgColor = colorToChannels(background);\n const bgLuminance = luminance(bgColor);\n\n const whiteLuminance = luminance([255, 255, 255, 1]);\n const blackLuminance = luminance([0, 0, 0, 1]);\n\n const contrastWithWhite = contrastRatio(bgLuminance, whiteLuminance);\n const contrastWithBlack = contrastRatio(bgLuminance, blackLuminance);\n\n const baseTextColor: Color.ColorChannels =\n contrastWithWhite >= contrastWithBlack ? [255, 255, 255, 1] : [0, 0, 0, 1];\n\n const tintedColor = blendColors(baseTextColor, bgColor, tintPercentage);\n\n const tintedLuminance = luminance(tintedColor);\n const finalContrast = contrastRatio(bgLuminance, tintedLuminance);\n\n if (finalContrast < 4.5) {\n return baseTextColor;\n }\n\n return tintedColor;\n}\n","import { parseHEX } from './hexToChannels/parseHEX';\nimport { parseHSL } from './hslToChannels/parseHSL';\nimport { parseRGB } from './rgbToChannels/parseRGB';\nimport type { Color } from './types';\n\nexport type { Color } from './types';\n\nexport type ColorChannels = Color.ColorChannels;\n\n/**\n * General color parser api\n * @group Colors\n */\nexport const ColorParser = {\n HSL: parseHSL,\n RGB: parseRGB,\n HEX: parseHEX,\n};\n\nexport { isColorChannels } from './utils';\n\nexport * from './alpha';\nexport * from './blendColors';\nexport * from './buildCssColor';\nexport * from './channelsToHex';\nexport * from './channelsToHSL';\nexport * from './channelsToRGB';\nexport * from './colorToChannels';\nexport * from './contrastRatio';\nexport * from './cssVariable';\nexport * from './hexToChannels';\nexport * from './hslToChannels';\nexport * from './interpolateColor';\nexport * from './luminance';\nexport * from './parseAlpha';\nexport * from './rgbToChannels';\nexport * from './tintedTextColor';\n","const T0 = signed_crc_table();\n\nfunction signed_crc_table() {\n var c = 0,\n table = new Array<number>(256);\n\n for (var n = 0; n != 256; ++n) {\n c = n;\n c = c & 1 ? -2097792136 ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? -2097792136 ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? -2097792136 ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? -2097792136 ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? -2097792136 ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? -2097792136 ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? -2097792136 ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? -2097792136 ^ (c >>> 1) : c >>> 1;\n table[n] = c;\n }\n\n return Int32Array ? new Int32Array(table) : table;\n}\n\n/**\n * Calculate crc32 hash from string\n * @group Crypto\n */\nexport function crc32(str: string, seed: number = 0): number {\n var C = seed ^ -1;\n for (var i = 0, L = str.length, c = 0, d = 0; i < L; ) {\n c = str.charCodeAt(i++);\n if (c < 0x80) {\n C = (C >>> 8) ^ T0[(C ^ c) & 0xff];\n } else if (c < 0x800) {\n C = (C >>> 8) ^ T0[(C ^ (192 | ((c >> 6) & 31))) & 0xff];\n C = (C >>> 8) ^ T0[(C ^ (128 | (c & 63))) & 0xff];\n } else if (c >= 0xd800 && c < 0xe000) {\n c = (c & 1023) + 64;\n d = str.charCodeAt(i++) & 1023;\n C = (C >>> 8) ^ T0[(C ^ (240 | ((c >> 8) & 7))) & 0xff];\n C = (C >>> 8) ^ T0[(C ^ (128 | ((c >> 2) & 63))) & 0xff];\n C = (C >>> 8) ^ T0[(C ^ (128 | ((d >> 6) & 15) | ((c & 3) << 4))) & 0xff];\n C = (C >>> 8) ^ T0[(C ^ (128 | (d & 63))) & 0xff];\n } else {\n C = (C >>> 8) ^ T0[(C ^ (224 | ((c >> 12) & 15))) & 0xff];\n C = (C >>> 8) ^ T0[(C ^ (128 | ((c >> 6) & 63))) & 0xff];\n C = (C >>> 8) ^ T0[(C ^ (128 | (c & 63))) & 0xff];\n }\n }\n return ~C;\n}\n","import { isNumber } from '@/is';\nimport { has } from '@/object';\nimport type { DateObject } from '@/types';\n\n/**\n * Checks if a given value is a valid `DateObject`.\n *\n * A valid `DateObject` is an object that contains numeric `year`, `month`, and `date` properties.\n *\n * @param {unknown} value - The value to be checked.\n * @returns {value is DateObject} - Returns `true` if the value is a valid `DateObject`; otherwise, `false`.\n *\n * @example\n * // Valid DateObject\n * isDateObject({ year: 2024, month: 11, date: 8 }); // true\n *\n * @example\n * // Missing properties\n * isDateObject({ year: 2024, month: 11 }); // false\n *\n * @example\n * // Non-numeric values\n * isDateObject({ year: '2024', month: 11, date: 8 }); // false\n *\n * @example\n * // Non-object input\n * isDateObject('invalid'); // false\n *\n * @example\n * // Additional properties (still valid)\n * isDateObject({ year: 2024, month: 11, date: 8, extra: 'property' }); // true\n *\n * @group Date\n */\nexport function isDateObject(value: unknown): value is DateObject {\n return (\n has(value, ['year', 'month', 'date']) &&\n isNumber(value.year) &&\n isNumber(value.month) &&\n isNumber(value.date)\n );\n}\n","import { assert } from '@/assert';\nimport { isDate, isNumber, isString } from '@/is';\nimport type { DateObject } from '@/types';\nimport { isDateObject } from '../isDateObject';\n\nexport type DateObjectInput = Date | string | number | DateObject;\n\nexport function createDateObject(value: DateObjectInput): DateObject;\nexport function createDateObject(\n value: DateObjectInput,\n returnsNullWhenInvalid: true,\n): DateObject | null;\n\n/**\n * Converts a given input into a `DateObject` representing year, month, and date.\n *\n * The function supports inputs in various formats, including a `Date` object,\n * a `number` (timestamp), or an existing `DateObject`. If the input is invalid\n * and `returnsNullWhenInvalid` is set to `true`, the function returns `null`.\n * Otherwise, it throws an error for invalid input.\n\n * @param {DateObjectInput} value - The input to be converted into a `DateObject`.\n * @param {boolean} [returnsNullWhenInvalid=false] - If `true`, returns `null` for invalid input\n * instead of throwing an error.\n * @returns {DateObject | null} - A `DateObject` representing the date, or `null` if input is invalid\n * and `returnsNullWhenInvalid` is set to `true`.\n *\n * @throws {Error} If the input is invalid and `returnsNullWhenInvalid` is `false`.\n *\n * @example\n * // Using a valid Date object\n * createDateObject(new Date('2024-12-08')); // { year: 2024, month: 12, date: 8 }\n *\n * @example\n * // Using a valid timestamp\n * createDateObject(1702032000000); // { year: 2024, month: 12, date: 8 }\n *\n * @example\n * // Using an existing DateObject\n * createDateObject({ year: 2024, month: 12, date: 8 }); // { year: 2024, month: 12, date: 8 }\n *\n * @example\n * // Invalid input, returning null\n * createDateObject('invalid-date', true); // null\n *\n * @example\n * // Invalid input, throwing an error\n * createDateObject('invalid-date'); // Throws \"Failed to date parse: invalid-date.\"\n *\n * @group Date\n */\nexport function createDateObject(\n value: DateObjectInput,\n returnsNullWhenInvalid = false,\n): DateObject | null {\n let result: DateObject | null = null;\n let inputValue = value;\n\n if (isNumber(inputValue) || isString(inputValue)) {\n inputValue = new Date(inputValue);\n }\n\n if (isDate(inputValue)) {\n result = {\n year: inputValue.getFullYear(),\n month: inputValue.getMonth() + 1,\n date: inputValue.getDate(),\n };\n } else if (isDateObject(inputValue)) {\n result = { ...inputValue };\n }\n\n assert.ok(\n returnsNullWhenInvalid || !!result,\n `Failed to date parse: ${value}.`,\n );\n\n return result;\n}\n","import { isNumber, isPlainObject } from '@/is';\nimport type { TimeObject } from '@/types';\n\n/**\n * Checks if a given value is a valid `TimeObject`.\n *\n * @param {unknown} value - The value to check if it's a valid `TimeObject`.\n * @returns {value is TimeObject} - Returns `true` if the value is a valid `TimeObject`, otherwise `false`.\n *\n * @example\n * // Valid TimeObject\n * isTimeObject({ h: 15, m: 30 }); // true\n *\n * @example\n * // Invalid TimeObject (missing `m`)\n * isTimeObject({ h: 15 }); // false\n *\n * @example\n * // Invalid TimeObject (non-number values)\n * isTimeObject({ h: '15', m: 30 }); // false\n * isTimeObject({ h: 15, m: '30' }); // false\n *\n * @example\n * // Invalid TimeObject (out-of-range hours)\n * isTimeObject({ h: -1, m: 30 }); // false\n * isTimeObject({ h: 24, m: 30 }); // false\n *\n * @example\n * // Invalid TimeObject (out-of-range minutes)\n * isTimeObject({ h: 15, m: -1 }); // false\n * isTimeObject({ h: 15, m: 60 }); // false\n *\n * @example\n * // Invalid TimeObject (non-object input)\n * isTimeObject('string'); // false\n * isTimeObject(123); // false\n * isTimeObject([]); // false\n *\n * @group Date\n */\nexport function isTimeObject(value: unknown): value is TimeObject {\n return (\n isPlainObject(value) &&\n 'h' in value &&\n 'm' in value &&\n isNumber(value.h) &&\n Number.isInteger(value.h) &&\n isNumber(value.m) &&\n Number.isInteger(value.m) &&\n value.h >= 0 &&\n value.h < 24 &&\n value.m >= 0 &&\n value.m < 60\n );\n}\n","import { assert } from '@/assert';\nimport { isDate, isNumber, isString } from '@/is';\nimport type { TimeObject } from '@/types';\nimport { isTimeObject } from '../isTimeObject';\n\nexport type TimeObjectInput = Date | number | string | TimeObject;\n\nexport function createTimeObject(value: TimeObjectInput): TimeObject;\nexport function createTimeObject(\n value: TimeObjectInput,\n returnsNullWhenInvalid: true,\n): TimeObject | null;\n\n/**\n * Converts a given input into a `TimeObject` representing 24 hours and minutes.\n *\n * The function supports inputs in various formats, including `Date`, `number` (timestamp),\n * `string` (date string), or a pre-existing `TimeObject`. If the input is invalid and\n * `returnsNullWhenInvalid` is set to `true`, the function will return `null`; otherwise,\n * it throws an error.\n *\n * @param {TimeObjectInput} value - The input to be converted into a `TimeObject`.\n * @param {boolean} [returnsNullWhenInvalid=false] - If `true`, returns `null` for invalid input\n * instead of throwing an error.\n * @returns {TimeObject | null} - A `TimeObject` representing the time, or `null` if input is invalid\n * and `returnsNullWhenInvalid` is set to `true`.\n *\n * @throws {Error} If the input is invalid and `returnsNullWhenInvalid` is `false`.\n *\n * @example\n * // Using a valid Date object\n * createTimeObject(new Date('2024-12-08T15:30:00')); // { h: 15, m: 30 }\n *\n * @example\n * // Using a valid timestamp\n * createTimeObject(1702031400000); // { h: 15, m: 30 }\n *\n * @example\n * // Using a valid time string\n * createTimeObject('2024-12-08T15:30:00'); // { h: 15, m: 30 }\n *\n * @example\n * // Using an existing TimeObject\n * createTimeObject({ h: 10, m: 45 }); // { h: 10, m: 45 }\n *\n * @example\n * // Invalid input, returning null\n * createTimeObject('invalid-date', true); // null\n *\n * @example\n * // Invalid input, throwing an error\n * createTimeObject('invalid-date'); // Throws \"Failed to time parse: invalid-date.\"\n *\n * @group Date\n */\nexport function createTimeObject(\n value: TimeObjectInput,\n returnsNullWhenInvalid = false,\n): TimeObject | null {\n let result: TimeObject | null = null;\n let inputValue = value;\n\n if (isNumber(inputValue)) {\n inputValue = new Date(inputValue);\n } else if (isString(inputValue)) {\n // lest do inline parsing to accept HH:mm:ss\n const [h, m] = inputValue\n .split(':')\n .map(v => v.trim().padStart(2, '0'))\n .map(v => parseInt(v));\n\n inputValue = { h, m };\n }\n\n if (isDate(inputValue)) {\n result = {\n h: inputValue.getHours(),\n m: inputValue.getMinutes(),\n };\n } else if (isTimeObject(inputValue)) {\n result = { ...inputValue };\n }\n\n assert.ok(\n returnsNullWhenInvalid || !!result,\n `Failed to time parse: ${value}.`,\n );\n\n return result;\n}\n","export type TimeSpanUnit = 'ms' | 's' | 'm' | 'h' | 'd' | 'w';\n\nconst UNIT_TO_MS: Record<TimeSpanUnit, number> = {\n ms: 1,\n s: 1000,\n m: 1000 * 60,\n h: 1000 * 60 * 60,\n d: 1000 * 60 * 60 * 24,\n w: 1000 * 60 * 60 * 24 * 7,\n};\n\n/**\n * A class representing a span of time with a specific value and unit of measurement.\n * Provides methods for conversion between time units and arithmetic operations (add, subtract).\n */\nexport class TimeSpan {\n constructor(value: number, unit: TimeSpanUnit) {\n this.value = value;\n this.unit = unit;\n }\n\n /**\n * The numeric value of the time span\n */\n public value: number;\n\n /**\n * The unit of the time span.\n */\n public unit: TimeSpanUnit;\n\n /**\n * Converts the time span to milliseconds.\n *\n * @returns {number} The equivalent time span in milliseconds.\n * @example\n * const ts = new TimeSpan(2, 'h');\n * ts.milliseconds(); // Returns 7200000\n */\n public milliseconds(): number {\n const multiplier = UNIT_TO_MS[this.unit];\n return this.value * multiplier;\n }\n\n /**\n * Converts the time span to seconds.\n *\n * @returns {number} The equivalent time span in seconds.\n * @example\n * const ts = new TimeSpan(2, 'm');\n * ts.seconds(); // Returns 120\n */\n public seconds(): number {\n return this.milliseconds() / UNIT_TO_MS.s;\n }\n\n /**\n * Converts the time span to minutes.\n *\n * @returns {number} The equivalent time span in minutes.\n * @example\n * const ts = new TimeSpan(120, 's');\n * ts.minutes(); // Returns 2\n */\n public minutes(): number {\n return this.milliseconds() / UNIT_TO_MS.m;\n }\n\n /**\n * Converts the time span to hours.\n *\n * @returns {number} The equivalent time span in hours.\n * @example\n * const ts = new TimeSpan(120, 'm');\n * ts.hours(); // Returns 2\n */\n public hours(): number {\n return this.milliseconds() / UNIT_TO_MS.h;\n }\n\n /**\n * Converts the time span to days.\n *\n * @returns {number} The equivalent time span in days.\n * @example\n * const ts = new TimeSpan(48, 'h');\n * ts.days(); // Returns 2\n */\n public days(): number {\n return this.milliseconds() / UNIT_TO_MS.d;\n }\n\n /**\n * Converts the time span to weeks.\n *\n * @returns {number} The equivalent time span in weeks.\n * @example\n * const ts = new TimeSpan(14, 'd');\n * ts.weeks(); // Returns 2\n */\n public weeks(): number {\n return this.milliseconds() / UNIT_TO_MS.w;\n }\n\n /**\n * Adds a specified value and unit to the current time span.\n *\n * Returns new instance.\n *\n * @param {number} value - The value to add.\n * @param {TimeSpanUnit} [unit='ms'] - The unit of the value to add (default is milliseconds).\n * @returns {TimeSpan} A new TimeSpan instance with the added value.\n * @example\n * const ts = new TimeSpan(1, 'h');\n * ts.add(30, 'm'); // Represents 1.5 hours\n */\n public add(value: number, unit: TimeSpanUnit = 'ms'): TimeSpan {\n const multiplier = UNIT_TO_MS[unit];\n return new TimeSpan(this.milliseconds() + value * multiplier, 'ms');\n }\n\n /**\n * Subtracts a specified value and unit from the current time span.\n *\n * Returns new instance.\n *\n * @param {number} value - The value to subtract.\n * @param {TimeSpanUnit} [unit='ms'] - The unit of the value to subtract (default is milliseconds).\n * @returns {TimeSpan} A new TimeSpan instance with the subtracted value.\n * @example\n * const ts = new TimeSpan(1, 'h');\n * ts.subtract(30, 'm'); // Represents 30 minutes less than 1 hour\n */\n public subtract(value: number, unit: TimeSpanUnit = 'ms'): TimeSpan {\n const multiplier = UNIT_TO_MS[unit];\n return new TimeSpan(this.milliseconds() - value * multiplier, 'ms');\n }\n}\n","import { TimeSpan, type TimeSpanUnit } from './TimeSpan';\n\n/**\n * Creates a new instance of `TimeSpan`.\n *\n * This utility function allows you to create a `TimeSpan` object by providing a numeric value and a unit of time.\n * The default unit is `'ms'` (milliseconds).\n *\n * @param {number} value - The numeric value representing the timespan.\n * @param {TimeSpanUnit} [unit='ms'] - The unit of time for the timespan value. Options are `'ms'`, `'s'`, `'m'`, `'h'`, `'d'`, `'w'`.\n * @returns {TimeSpan} An instance of the `TimeSpan` class.\n * @example\n * // Create a TimeSpan with 500 milliseconds\n * const ts = createTimeSpan(500);\n * console.log(ts.milliseconds()); // 500\n *\n * @example\n * // Create a TimeSpan with 2 hours\n * const ts = createTimeSpan(2, 'h');\n * console.log(ts.seconds()); // 120\n *\n * @example\n * // Create a TimeSpan with 7 days\n * const ts = createTimeSpan(7, 'd');\n * console.log(ts.weeks()); // 1\n *\n * @group Date\n */\nexport function createTimeSpan(\n value: number,\n unit: TimeSpanUnit = 'ms',\n): TimeSpan {\n return new TimeSpan(value, unit);\n}\n","import { isDate, isNumber, isString } from '@/is';\n\n/**\n * The base time as a timestamp, `Date` object,\n * or a similar format that the `timestampMs` function can parse.\n */\nexport type TimestampMsInput = Date | string | number;\n\n/**\n * Returns or converts the given input into milliseconds since the Unix epoch.\n *\n * @param {TimestampMsInput} [fromValue=Date.now()] - The input value to be converted to milliseconds.\n * Can be a `Date` object, a timestamp (number), or a string representing a date.\n * Defaults to the current time.\n * @returns {number} The number of milliseconds since the Unix epoch. Returns `0` if the input is invalid.\n *\n * @example\n * // Get milliseconds from a Date object\n * timestampMs(new Date('2023-01-01T00:00:00Z')); // 1672531200000\n *\n * @example\n * // Get milliseconds from a timestamp\n * timestampMs(1672531200000); // 1672531200000\n *\n * @example\n * // Get milliseconds from a date string\n * timestampMs('2023-01-01T00:00:00Z'); // 1672531200000\n *\n * @example\n * // Handle invalid input\n * timestampMs('invalid-date'); // 0\n *\n * @example\n * // Use the default value (current time)\n * timestampMs(); // Current timestamp in milliseconds\n *\n * @group Date\n */\nexport function timestampMs(fromValue: TimestampMsInput = Date.now()): number {\n if (isDate(fromValue)) {\n fromValue = fromValue.getTime();\n } else if (isString(fromValue)) {\n const dt = new Date(fromValue);\n fromValue = isDate(dt) ? dt.getTime() : 0;\n }\n\n return isNumber(fromValue) ? fromValue : 0;\n}\n","import { type TimestampMsInput, timestampMs } from '../timestampMs';\n\n/**\n * Returns a `Date` object representing a time that is the given number of days\n * before or after a base time.\n *\n * @param {number} days - The number of days to add to or subtract from the base time.\n * Positive values move forward in time, and negative values move backward.\n * @param {TimestampMsInput} [fromValue=Date.now()] - The base time as a timestamp.\n * @returns {Date} A `Date` object representing the computed time.\n *\n * @example\n * // Get the date 7 days from now\n * dateInDays(7); // Returns a Date object 7 days in the future\n *\n * @example\n * // Get the date 5 days before a specific time\n * dateInDays(-5, new Date('2023-01-01T00:00:00Z')); // Returns 2022-12-27T00:00:00Z\n *\n * @example\n * // Use a timestamp as the base time\n * dateInDays(2, 1672531200000); // Returns a Date object 2 days after the base timestamp\n *\n * @group Date\n */\nexport function dateInDays(\n days: number,\n fromValue: TimestampMsInput = Date.now(),\n): Date {\n return new Date(timestampMs(fromValue) + days * 60 * 60 * 24 * 1000);\n}\n","import { type TimestampMsInput, timestampMs } from '../timestampMs';\n\n/**\n * Returns a `Date` object representing a time that is the given number of seconds\n * before or after a base time.\n *\n * @param {number} seconds - The number of seconds to add to or subtract from the base time.\n * Positive values move forward in time, and negative values move backward.\n * @param {TimestampMsInput} [fromValue=Date.now()] - The base time.\n * @returns {Date} A `Date` object representing the computed time.\n *\n * @example\n * // Get the date 60 seconds from now\n * dateInSeconds(60); // Returns a Date object 1 minute in the future\n *\n * @example\n * // Get the date 30 seconds before a specific time\n * dateInSeconds(-30, new Date('2023-01-01T00:00:00Z')); // Returns 2022-12-31T23:59:30Z\n *\n * @example\n * // Use a timestamp as the base time\n * dateInSeconds(10, 1672531200000); // Returns a Date object 10 seconds after the base timestamp\n *\n * @group Date\n */\nexport function dateInSeconds(\n seconds: number,\n fromValue: TimestampMsInput = Date.now(),\n): Date {\n return new Date(timestampMs(fromValue) + seconds * 1000);\n}\n","import { getRandomInt } from '@/num/getRandomInt';\nimport type { TimeObject } from '@/types';\n\n/**\n * Gets a random time within the specified range.\n *\n * Generates a random hour (`h`) and minute (`m`) between the given `startTime` and `endTime`.\n * If no range is provided, it defaults to the full day from `{ h: 0, m: 0 }` to `{ h: 23, m: 59 }`.\n *\n * @param {TimeObject} [startTime={ h: 0, m: 0 }] - The starting range for the random time.\n * @param {TimeObject} [endTime={ h: 23, m: 59 }] - The ending range for the random time.\n * @returns {TimeObject} - A random time object with `h` and `m` values within the given range.\n *\n * @example\n * // Generate a random time within the full day\n * const randomTime = getRandomTime();\n * console.log(randomTime); // e.g., { h: 12, m: 34 }\n *\n * @example\n * // Generate a random time between 9:00 and 17:00\n * const randomTime = getRandomTime({ h: 9, m: 0 }, { h: 17, m: 0 });\n * console.log(randomTime); // e.g., { h: 12, m: 15 }\n *\n * @example\n * // Generate a random time between 8:30 and 10:30\n * const randomTime = getRandomTime({ h: 8, m: 30 }, { h: 10, m: 30 });\n * console.log(randomTime); // e.g., { h: 9, m: 45 }\n *\n * @group Date\n */\nexport function getRandomTime(\n startTime: TimeObject = { h: 0, m: 0 },\n endTime: TimeObject = { h: 23, m: 59 },\n): TimeObject {\n const h = getRandomInt(startTime.h, endTime.h);\n\n if (startTime.h === endTime.h) {\n return { h, m: getRandomInt(startTime.m, endTime.m) };\n }\n\n if (h === startTime.h) {\n return { h, m: getRandomInt(startTime.m, 59) };\n }\n\n if (h === endTime.h) {\n return { h, m: getRandomInt(0, endTime.m) };\n }\n\n return { h, m: getRandomInt(0, 59) };\n}\n","import { assert } from '@/assert';\nimport { round2digits } from '@/num/round2digits';\n\n/**\n * Converts a decimal representation of hours and minutes (HH.MM) into total seconds.\n *\n * This function takes a decimal number in the format `HH.MM`, where:\n * - The integer part represents the number of hours.\n * - The fractional part represents the minutes (in decimal) and is converted accordingly.\n *\n * It returns the total time in seconds.\n *\n * @param {number} hm - The time represented in HH.MM format (e.g., 2.30 for 2 hours and 30 minutes).\n * @returns {number} - The total number of seconds equivalent to the provided HH.MM value.\n *\n * @example\n * hmToSeconds(1.00);\n * // Returns 3600 (1 hour = 3600 seconds)\n *\n * @example\n * hmToSeconds(2.30);\n * // Returns 9000 (2 hours and 30 minutes = 2 * 3600 + 30 * 60 = 9000 seconds)\n *\n * @example\n * hmToSeconds(0.15);\n * // Returns 900 (0 hours and 15 minutes = 15 minutes = 900 seconds)\n *\n * @example\n * hmToSeconds(3.45);\n * // Returns 13500 (3 hours and 45 minutes = 3 * 3600 + 45 * 60 = 13500 seconds)\n *\n * @group Date\n */\nexport function hmToSeconds(hm: number): number {\n hm = Number(hm);\n\n assert.number(hm, 'expected number value');\n\n const h = Math.floor(hm);\n const m = round2digits(hm - h) * 100;\n\n return h * 3600 + m * 60;\n}\n","import { isString } from '@/is';\nimport type { TimeString } from '@/types';\n\n/**\n * Checks if a given value is a valid `TimeString`.\n *\n * @param {unknown} value - The value to check if it's a valid `TimeString`.\n * @returns {value is TimeObject} - Returns `true` if the value is a valid `TimeString`, otherwise `false`.\n *\n * @example\n * // Valid TimeString\n * isTimeString('15:30'); // true\n *\n * @example\n * // Invalid TimeString\n * isTimeObject('15:30:00'); // false\n *\n * @example\n * // Invalid TimeString (out-of-range hours)\n * isTimeObject('26:00'); // false\n *\n * @group Date\n */\nexport function isTimeString(value: unknown): value is TimeString {\n if (!isString(value)) return false;\n const parts = value.split(':').map(Number);\n if (parts.length !== 2) return false;\n const [h, m] = parts;\n return h >= 0 && h < 24 && m >= 0 && m < 60;\n}\n","import type { TimeValue } from '@/types';\nimport { isTimeObject } from '../isTimeObject';\nimport { isTimeString } from '../isTimeString';\n\n/**\n * Checks if a given value is a valid `TimeValue`.\n *\n * @param {unknown} value - The value to check if it's a valid `TimeValue`.\n * @returns {value is TimeObject} - Returns `true` if the value is a valid `TimeValue`, otherwise `false`.\n *\n * @example\n * // Valid TimeObject\n * isTimeValue({ h: 15, m: 30 }); // true\n *\n * @example\n * // Valid TimeString\n * isTimeValue('15:30'); // true\n *\n * @group Date\n */\nexport function isTimeValue(value: unknown): value is TimeValue {\n return isTimeString(value) || isTimeObject(value);\n}\n","import { isNumber } from '@/is';\n\n/**\n * Checks if a given value is a valid weekday number.\n *\n * A valid weekday number is a number between 1 (Monday) and 7 (Sunday), inclusive.\n *\n * @param {unknown} value - The value to check if it's a valid weekday number.\n * @returns {value is number} - Returns `true` if the value is a number and represents a valid weekday, otherwise `false`.\n *\n * @example\n * // Valid weekday numbers\n * isValidWeekDay(1); // true\n * isValidWeekDay(7); // true\n *\n * @example\n * // Invalid weekday numbers\n * isValidWeekDay(0); // false\n * isValidWeekDay(8); // false\n * isValidWeekDay(-1); // false\n * isValidWeekDay('3'); // false\n * isValidWeekDay(null); // false\n * isValidWeekDay(undefined); // false\n *\n * @group Date\n */\nexport function isValidWeekDay(value: unknown): value is number {\n return isNumber(value) && Number.isInteger(value) && value >= 1 && value <= 7;\n}\n","import { assert } from '@/assert';\nimport { round2digits } from '@/num/round2digits';\n\n/**\n * Converts seconds to a decimal representation of hours and minutes (HH.MM) rounded to two decimal places.\n *\n * This function takes a number of seconds, calculates the number of whole hours and minutes,\n * and converts them into a two-decimal representation where:\n * - The integer part represents the hours.\n * - The fractional part represents the minutes (rounded to 2 digits).\n *\n * @param {number} seconds - The total number of seconds to convert into hours and minutes.\n * @returns {number} - A decimal number in the format HH.MM representing the converted time.\n *\n * @example\n * secondsToHm(3661);\n * // Returns 1.01 (1 hour and 1 minute)\n *\n * @example\n * secondsToHm(7322);\n * // Returns 2.02 (2 hours and 2 minutes)\n *\n * @example\n * secondsToHm(59);\n * // Returns 0.59 (0 hours and 59 minutes)\n *\n * @example\n * secondsToHm(3600);\n * // Returns 1.00 (exactly 1 hour)\n *\n * @group Date\n */\nexport function secondsToHm(seconds: number): number {\n const value = Number(seconds);\n\n assert.number(value, 'expected number value');\n\n const h = Math.floor(value / 3600);\n const m = Math.floor((value % 3600) / 60);\n\n return round2digits(h + m / 100, 2);\n}\n","import { assert } from '@/assert';\nimport { isNumber } from '@/is';\nimport type { TimeObject } from '@/types';\n\nexport function timeFromMinutes(value: number): TimeObject;\nexport function timeFromMinutes(\n value: number,\n returnsNullWhenInvalid: true,\n): TimeObject | null;\n\n/**\n * Converts a total number of minutes into a time object with hours and minutes.\n *\n * @param {number} value - The total number of minutes to be converted.\n * Can be positive, negative, or zero.\n * @param {boolean} [returnsNullWhenInvalid=false] - If `true`, the function returns `null`\n * instead of throwing an error when the input is invalid.\n * Defaults to `false`.\n * @returns {TimeObject | null} An object representing the time in `{ h: hours, m: minutes }` format,\n * or `null` if `returnsNullWhenInvalid` is `true` and the input is invalid.\n *\n * @throws {Error} If the input is not a number and `returnsNullWhenInvalid` is `false`.\n *\n * @example\n * // Convert 150 minutes to time\n * timeFromMinutes(150); // { h: 2, m: 30 }\n *\n * @example\n * // Handle invalid input with `returnsNullWhenInvalid` set to `true`\n * timeFromMinutes('invalid', true); // null\n *\n * @example\n * // Handle negative minutes\n * timeFromMinutes(-90); // { h: 22, m: 30 }\n *\n * @group Date\n */\nexport function timeFromMinutes(\n value: number,\n returnsNullWhenInvalid = false,\n): TimeObject | null {\n if (!isNumber(value)) {\n assert.ok(\n returnsNullWhenInvalid,\n 'Failed to time parse from minutes: ' + value,\n );\n return null;\n }\n\n if (value === 0) {\n return { h: 0, m: 0 };\n }\n\n value = value % 1440;\n\n if (value < 0) {\n value += 1440;\n }\n\n const h = Math.floor(value / 60);\n const m = value % 60;\n\n return { h, m };\n}\n","import { isDate } from '@/is';\n\n/**\n * Returns the number of seconds since the Unix epoch (January 1, 1970).\n *\n * This function accepts either a `Date` object or a timestamp in milliseconds (number).\n * If no argument is provided, it defaults to the current timestamp in seconds.\n *\n * @param {Date | number} [fromValue=Date.now()] - The date or timestamp to convert.\n * If not provided, the current date and time will be used.\n *\n * @returns {number} The number of seconds since the Unix epoch for the provided date or timestamp.\n *\n * @example\n * // Using a Date object\n * const date = new Date('2020-01-01T00:00:00Z');\n * console.log(timestamp(date)); // Returns 1577836800 (seconds since Unix epoch)\n *\n * // Using a timestamp in milliseconds\n * const timestampInMs = 1609459200000;\n * console.log(timestamp(timestampInMs)); // Returns 1609459200 (seconds since Unix epoch)\n *\n * // Using the current time\n * console.log(timestamp()); // Returns current seconds since Unix epoch\n *\n * @group Date\n */\nexport function timestamp(fromValue: Date | number = Date.now()) {\n if (isDate(fromValue)) {\n fromValue = fromValue.getTime();\n }\n\n return Math.floor(fromValue / 1000);\n}\n","import { isNumber } from '@/is';\n\n/**\n * Converts a Unix timestamp (in seconds) to a `Date` object.\n *\n * This function accepts a timestamp in seconds (number) and returns a `Date` object\n * corresponding to that timestamp. If an invalid number is passed (non-numeric or NaN),\n * it returns `null`.\n *\n * @param {number} value - The Unix timestamp (in seconds) to convert into a `Date` object.\n * @returns {Date | null} The `Date` object corresponding to the provided timestamp, or `null`\n * if the value is not a valid number.\n *\n * @example\n * const date = timestampToDate(1609459200);\n * console.log(date); // Outputs: Thu Jan 01 2021 00:00:00 GMT+0000 (UTC)\n *\n * // Invalid input\n * console.log(timestampToDate('invalid')); // Outputs: null\n * console.log(timestampToDate(NaN)); // Outputs: null\n * console.log(timestampToDate(null)); // Outputs: null\n *\n * @group Date\n */\nexport function timestampToDate(value: number): Date | null {\n if (!isNumber(value)) return null;\n return new Date(value * 1000);\n}\n","import { assert } from '@/assert';\nimport type { TimeValue } from '@/types';\nimport { createTimeObject } from '../createTimeObject';\n\nexport function timeStringify(value: TimeValue): string;\nexport function timeStringify(\n value: TimeValue,\n returnsNullWhenInvalid: true,\n): string | null;\n\n/**\n * Converts a time value into a string formatted as \"HH:MM\".\n *\n * @param {TimeValue} value - A time value.\n * @param {boolean} [returnsNullWhenInvalid=false] - If `true`, the function returns `null`\n * instead of throwing an error when the input is invalid.\n * Defaults to `false`.\n * @returns {string | null} A string representing the time in \"HH:MM\" format, or `null`\n * if the input is invalid and `returnsNullWhenInvalid` is `true`.\n *\n * @throws {Error} If the input is invalid and `returnsNullWhenInvalid` is `false`.\n *\n * @example\n * // Convert a time object to a string\n * timeStringify({ h: 9, m: 5 }); // \"09:05\"\n *\n * @example\n * // Convert a string time value to a formatted string\n * timeStringify(\"7:30\"); // \"07:30\"\n *\n * @example\n * // Handle invalid input gracefully\n * timeStringify(\"invalid\", true); // null\n *\n * @example\n * // Handle invalid input with exception\n * timeStringify(\"invalid\"); // Throws Error\n *\n * @group Date\n */\nexport function timeStringify(\n value: TimeValue,\n returnsNullWhenInvalid = false,\n): string | null {\n const timeObject = createTimeObject(value, true);\n\n if (!timeObject) {\n assert.ok(\n returnsNullWhenInvalid,\n 'Failed to stringify time from: ' + JSON.stringify(value),\n );\n return null;\n }\n\n let { h, m } = timeObject;\n\n const hStr = Math.ceil(h).toString().padStart(2, '0').slice(-2);\n const mStr = Math.ceil(m).toString().padStart(2, '0').slice(-2);\n\n return `${hStr}:${mStr}`;\n}\n","import type { TimeValue } from '@/types';\nimport { createTimeObject } from '../createTimeObject';\n\n/**\n * Converts a time value into the total number of minutes.\n *\n * @param {TimeValue} value - A time value\n *\n * @returns {number} The total number of minutes represented by the time value.\n *\n * @example\n * // Assuming createTimeObject(\"2:30\") returns { h: 2, m: 30 }\n * timeToMinutes(\"2:30\"); // 150\n *\n * // Assuming createTimeObject({ h: 1, m: 45 }) returns { h: 1, m: 45 }\n * timeToMinutes({ h: 1, m: 45 }); // 105\n *\n * @group Date\n */\nexport function timeToMinutes(value: TimeValue): number {\n const time = createTimeObject(value);\n return time.h * 60 + time.m;\n}\n","/**\n * Determines the number of ISO weeks in a given year.\n *\n * The ISO week numbering system defines a year as having 52 or 53 full weeks.\n *\n * @param {number} year - The year for which to calculate the number of ISO weeks.\n * @returns {number} - Returns 52 or 53 based on the ISO 8601 standard.\n *\n * @example\n * // Common year with 52 weeks\n * weeksInYear(2023); // 52\n *\n * @example\n * // Leap year with 53 weeks\n * weeksInYear(2020); // 53\n *\n * @group Date\n */\nexport function weeksInYear(year: number): number {\n const target = new Date(Date.UTC(year + 1, 0, 1));\n const dayNumber = target.getDay();\n\n return dayNumber < 4 ? 52 : 53;\n}\n","import { base64 } from '@/binary/base64';\nimport { bigIntBytes } from '@/binary/bigIntBytes';\nimport { bigIntFromBytes } from '@/binary/bigIntFromBytes';\nimport { uint16ToUint8 } from '@/binary/uint16ToUint8';\nimport { uint32ToUint8 } from '@/binary/uint32ToUint8';\nimport { uint8ToUint16 } from '@/binary/uint8ToUint16';\nimport { uint8ToUint32 } from '@/binary/uint8ToUint32';\nimport type { EJSONType } from './EJSON';\n\nexport const DateType: EJSONType = {\n placeholder: '$date',\n encode: value => {\n if (value instanceof Date) {\n return value.getTime();\n }\n },\n decode(value) {\n return new Date(value);\n },\n};\n\nexport const BinaryType: EJSONType = {\n placeholder: '$binary',\n encode: value => {\n if (value instanceof Uint8Array) {\n return base64.encode(value, { includePadding: true });\n } else if (value instanceof Uint16Array) {\n return {\n value: base64.encode(uint16ToUint8(value), { includePadding: true }),\n bit: 16,\n };\n } else if (value instanceof Uint32Array) {\n return {\n value: base64.encode(uint32ToUint8(value), { includePadding: true }),\n bit: 32,\n };\n }\n },\n decode(value) {\n if (typeof value === 'string') {\n return base64.decode(value, { strict: true });\n } else if (value.bit === 16) {\n return uint8ToUint16(base64.decode(value.value, { strict: true }));\n } else if (value.bit === 32) {\n return uint8ToUint32(base64.decode(value.value, { strict: true }));\n }\n\n throw new Error('Unexpected $binary bit value: ' + value.bit);\n },\n};\n\nexport const BigIntType: EJSONType = {\n placeholder: '$bigint',\n encode: value => {\n if (typeof value === 'bigint') {\n return base64.encode(bigIntBytes(value), { includePadding: false });\n }\n },\n decode(value) {\n return bigIntFromBytes(base64.decode(value, { strict: false }));\n },\n};\n\nexport const MapType: EJSONType = {\n placeholder: '$map',\n encode: (value, encode) => {\n if (value instanceof Map) {\n return encode(Array.from(value.entries()));\n }\n },\n decode(value) {\n return new Map(value);\n },\n};\n\nexport const SetType: EJSONType = {\n placeholder: '$set',\n encode: (value, encode) => {\n if (value instanceof Set) {\n return encode(Array.from(value.values()));\n }\n },\n decode(value) {\n return new Set(value);\n },\n};\n\nexport const RegexType: EJSONType = {\n placeholder: '$regex',\n encode: (value, encode) => {\n if (value instanceof RegExp) {\n const regStr = value.toString();\n const patternStart = regStr.lastIndexOf('/');\n\n return {\n pattern: value.toString().slice(1, patternStart),\n flags: regStr.slice(patternStart + 1),\n };\n }\n },\n decode(value) {\n return new RegExp(value.pattern, value.flags);\n },\n};\n\nexport const InfinityType: EJSONType = {\n placeholder: '$inf',\n encode: (value, encode) => {\n if (value === Infinity) {\n return 1;\n } else if (value === -Infinity) {\n return -1;\n }\n },\n decode(value) {\n if (value === 1) return Infinity;\n if (value === -1) return -Infinity;\n\n throw new Error('Unexpected $inf value: ' + value);\n },\n};\n","import { assert } from '@/assert';\nimport {\n isBigInt,\n isInfinity,\n isObject,\n isPlainObject,\n isPrimitive,\n} from '@/is';\nimport { deepCloneWith } from '@/object/deepCloneWith';\nimport {\n BigIntType,\n BinaryType,\n DateType,\n InfinityType,\n MapType,\n RegexType,\n SetType,\n} from './types';\n\nexport type EJSONType = {\n /**\n * The string placeholder (must start with `$`) that represents the custom type.\n */\n placeholder: string;\n\n /**\n * Should encoded value inlined to original key\n */\n encodeInline?: boolean;\n\n /**\n * Function to encode a value into a custom representation using a custom type handler.\n *\n * If the function returns `undefined`, it signals that encoding for this value should\n * be delegated to another type handler or encoding logic.\n *\n * @param {any} value - The value to be encoded.\n * @param {(value: any) => any} encode - A reference to the general encoding function\n * (useful for recursive encoding logic if necessary).\n * @returns {any} - The custom-encoded value or `undefined` to delegate encoding to another type handler.\n */\n encode: (value: any, encode: (value: any) => any) => any;\n\n /**\n * A function to decode a custom representation back into a valid JavaScript value.\n */\n decode: (value: any) => any;\n};\n\n/**\n * EJSON - Extended JSON handler class for custom encoding and decoding with vendor support.\n * This class provides methods to encode, decode, stringify, and parse JSON with custom type handlers.\n */\nexport class EJSON {\n /** @internal */\n protected typeHandlers: Map<string, Readonly<EJSONType>> = new Map();\n\n /** @internal */\n protected replacerReady: (value: any, key: string) => any;\n\n /** @internal */\n protected encode: (value: any) => any;\n\n /** @internal */\n protected reviewerReady: (_: string, value: any) => any;\n\n /** @internal */\n protected pure: boolean = true;\n\n protected _vendorName: string | null = null;\n\n /**\n * MIME type based on the provided vendor name or defaults to 'application/json'.\n */\n public mimetype: string = 'application/json';\n\n public readonly Type = {\n Date: DateType,\n Map: MapType,\n Set: SetType,\n RegExp: RegexType,\n Infinity: InfinityType,\n BigInt: BigIntType,\n Binary: BinaryType,\n } as const;\n\n constructor() {\n this.replacerReady = this._replacer.bind(this);\n this.reviewerReady = this._reviewer.bind(this);\n this.encode = (value: any) => {\n return deepCloneWith(value, this.replacerReady);\n };\n }\n\n /**\n * The vendor name used for the custom MIME type definition.\n * If null, defaults to 'application/json'.\n */\n get vendorName(): string | null {\n return this._vendorName;\n }\n\n set vendorName(value: string | null) {\n this._vendorName = value;\n\n if (!value) {\n this.mimetype = 'application/json';\n } else {\n const vendorName = value\n .split(' ')\n .map(v => v.toLowerCase())\n .join('.')\n .replace(/\\.\\.+/g, '.')\n .replace(/\\.$/, '');\n\n this.mimetype = `application/vnd.${vendorName}+json`;\n }\n }\n\n /**\n * Adds a custom type handler for encoding/decoding logic.\n * Ensures type placeholders are unique and adhere to conventions.\n */\n addType(type: Readonly<EJSONType>): this {\n assert.ok(\n !this.typeHandlers.has(type.placeholder),\n `type with ${type.placeholder} already taken.`,\n );\n\n assert.ok(\n type.placeholder.startsWith('$'),\n 'type placeholder must starts with $ symbol.',\n );\n\n this.pure = false;\n this.typeHandlers.set(type.placeholder, type);\n return this;\n }\n\n /**\n * Stringifies a JavaScript value using custom encoding logic.\n * @param {any} value - The value to encode and stringify.\n * @param {string | number} [space] - Optional space for pretty-printing.\n * @returns {string} - The JSON stringified value.\n */\n stringify(value: any, space?: string | number): string {\n if (this.pure) {\n return JSON.stringify(value, undefined, space);\n }\n\n return JSON.stringify(this.encode(value), undefined, space);\n }\n\n /**\n * Parses a JSON string using custom decoding logic.\n * @param {string} value - The JSON string to parse.\n * @returns {any} - The decoded JavaScript object.\n */\n parse(value: string): any {\n if (this.pure) {\n return JSON.parse(value);\n }\n\n return JSON.parse(value, this.reviewerReady);\n }\n\n /** @internal */\n protected _replacer(value: any, key: string) {\n // deep object check\n if (isPlainObject(value)) return;\n // deep array check\n if (Array.isArray(value)) return;\n // exclude primitive\n if (!isInfinity(value) && !isBigInt(value)) {\n if (isPrimitive(value)) return;\n }\n\n for (const type of this.typeHandlers.values()) {\n const res = type.encode(value, this.encode);\n\n if (res !== undefined) {\n return type.encodeInline ? res : { [type.placeholder]: res };\n }\n }\n\n return value;\n }\n\n /** @internal */\n protected _reviewer(_: string, value: any) {\n const key = firstKey(value);\n\n if (!key || key[0] !== '$') return value;\n\n const type = this.typeHandlers.get(key);\n\n if (type) {\n return type.decode(value[key]);\n }\n\n return value;\n }\n}\n\nfunction firstKey(value: unknown): string | null {\n if (!isObject(value)) return null;\n\n for (const key in value) {\n return key;\n }\n\n return null;\n}\n","import { EJSON } from './EJSON';\nimport {\n BigIntType,\n BinaryType,\n DateType,\n InfinityType,\n MapType,\n RegexType,\n SetType,\n} from './types';\n\n/**\n * Creates a new instance of the `EJSON` (Extensible JSON) with optional basic types pre-registered.\n *\n * This function allows you to initialize an `EJSON` instance with commonly used types like `Map`, `Set`,\n * `Date`, `RegExp`, `Infinity`, `BigInt` and `Uint8Array`. These types are added to the type handlers only when `withBasicTypes` is set to `true`.\n *\n * | Type | Placeholder | Alias |\n * |-------------|-------------|----------------|\n * | Date | $date | EJSON.Date |\n * | Map | $map | EJSON.Map |\n * | Set | $set | EJSON.Set |\n * | Infinity | $inf | EJSON.Infinity |\n * | BigInt | $bigint | EJSON.BigInt |\n * | RegExp | $regexp | EJSON.RegExp |\n * | Uint8Array | $binary | EJSON.Binary |\n * | Uint16Array | $binary | EJSON.Binary |\n * | Uint32Array | $binary | EJSON.Binary |\n *\n * @param {boolean} [withBasicTypes=false] - Indicates whether to include basic types like Map, Set, Date, and BigInt.\n * @returns {EJSON} - A new instance of the `EJSON` class configured with optional basic types.\n *\n * @example\n * // Instance with basic types (Map, Set, Date, BigInt, Uint8Array)\n * import { EJSON } from '@andrew_l/toolkit';\n *\n * EJSON.stringify({ value: new Date(0) });\n * // {\"value\":{\"$date\": 0}}\n *\n * @example\n * // Create an EJSON instance without any additional types\n * const ejson = createEJSON();\n *\n * ejson.stringify({ value: new Date(0) });\n * // {\"value\":\"1970-01-01T00:00:00.000Z\"}\n *\n * @example\n * // Custom type\n * import { EJSON, createEJSON } from '@andrew_l/toolkit';\n *\n * const ejson = createEJSON();\n *\n * ejson.vendorName = 'Andrew';\n *\n * // Add pre-build date type\n * ejson.addType(EJSON.Date);\n *\n * // Add custom buffer type\n * ejson.addType({\n * placeholder: '$buffer',\n * encode(value) {\n * if (Buffer.isBuffer(value)) {\n * return value.toString('hex');\n * }\n * },\n * decode(value) {\n * return Buffer.from(value, 'hex');\n * }\n * });\n *\n * ejson.stringify({\n * value: [\n * Buffer.from('Hello World', 'utf8'),\n * new Date(0)\n * ]\n * });\n * // {\"value\":[{\"$buffer\":\"48656c6c6f20576f726c64\"},{\"$date\":0}]}\n *\n * console.log(ejson.mimetype); // application/vnd.andrew+json\n *\n * @group EJSON\n */\nexport function createEJSON(withBasicTypes: boolean = false): EJSON {\n const ejson = new EJSON();\n\n if (withBasicTypes) {\n ejson.addType(MapType);\n ejson.addType(SetType);\n ejson.addType(DateType);\n ejson.addType(InfinityType);\n ejson.addType(BigIntType);\n ejson.addType(BinaryType);\n ejson.addType(RegexType);\n }\n\n return ejson;\n}\n","import type { EJSON } from './EJSON';\n\nexport interface EJSONStreamOptions {\n /**\n * EJSON Instance\n */\n ejson: EJSON;\n\n /**\n * Starting encoding symbol\n */\n op: string;\n\n /**\n * Separator symbol\n */\n sep: string;\n\n /**\n * Ending symbol\n */\n cl: string;\n\n /** @internal */\n onStart?: (controller: TransformStreamDefaultController) => Promise<void>;\n\n /** @internal */\n onFlush?: (controller: TransformStreamDefaultController) => Promise<void>;\n}\n\nexport class EJSONStream extends TransformStream<any, string> {\n protected ejson: EJSON;\n\n constructor({ ejson, cl, op, sep, onFlush, onStart }: EJSONStreamOptions) {\n let firstChunk = true;\n\n super({\n async start(controller) {\n if (onStart) {\n await onStart(controller);\n }\n\n controller.enqueue(op);\n },\n transform(chunk, controller) {\n const jsonString = ejson.stringify(chunk);\n\n if (firstChunk) {\n firstChunk = false;\n } else {\n controller.enqueue(sep);\n }\n\n controller.enqueue(jsonString);\n },\n flush(controller) {\n controller.enqueue(cl);\n\n if (onFlush) {\n return onFlush(controller);\n }\n },\n });\n\n this.ejson = ejson;\n }\n\n /**\n * The vendor name used for the custom MIME type definition.\n * If null, defaults to 'application/json'.\n */\n get vendorName(): string | null {\n return this.ejson.vendorName;\n }\n\n /**\n * MIME type based on the provided vendor name or defaults to 'application/json'.\n */\n get mimetype(): string {\n return this.ejson.mimetype;\n }\n}\n","import { createEJSON } from './createEJSON';\n\nexport const instance = createEJSON(true);\n","import { assert } from '@/assert';\nimport { isPlainObject } from '@/is';\nimport type { Awaitable } from '@/types';\nimport { EJSONStream, type EJSONStreamOptions } from './EJSONStream';\nimport { instance } from './instance';\n\nexport interface EJSONStreamOptionsWithPayload\n extends Partial<EJSONStreamOptions> {\n prepend?: () => Awaitable<object | null | undefined>;\n append?: () => Awaitable<object | null | undefined>;\n resultKey: string;\n}\n\n/**\n * Creates an instance of `EJSONStream`. This function provides flexibility to create a simple stream\n * or one with custom payload transformations, such as appending or prepending data.\n *\n * The function has overloads to handle either basic streaming options or more advanced use cases\n * with payload functions (`append`, `prepend`, `resultKey`) to modify how JSON payloads are streamed.\n *\n * @function\n * @param {Partial<EJSONStreamOptions> | EJSONStreamOptionsWithPayload} [options] - Options to configure the EJSONStream.\n * @returns {EJSONStream} An instance of the `EJSONStream`.\n *\n * @example\n * // Example 1: Create a simple EJSONStream without custom payload transformations\n * const stream = createEJSONStream();\n *\n * @example\n * // Example 2: Create EJSONStream with specific options\n * const stream = createEJSONStream({\n * cl: ']',\n * op: '[',\n * sep: ',',\n * ejson: someInstance\n * });\n *\n * @example\n * // Example 3: Using prepend and append payloads\n * const streamWithPayloads = createEJSONStream({\n * prepend: async () => ({ key1: 'value1' }),\n * append: async () => ({ key2: 'value2' }),\n * resultKey: 'payload'\n * });\n *\n * // {\"key1\":\"value1\",\"payload\": [...data],\"key2\":\"value2\"}\n *\n * @group EJSON\n */\nexport function createEJSONStream(\n options?: Partial<EJSONStreamOptions>,\n): EJSONStream;\n\nexport function createEJSONStream(\n options: EJSONStreamOptionsWithPayload,\n): EJSONStream;\n\nexport function createEJSONStream(\n options: Partial<EJSONStreamOptionsWithPayload> = {},\n): EJSONStream {\n if (options.resultKey || options.append || options.prepend) {\n return createEJSONStreamPayload(options);\n }\n\n return new EJSONStream(getOptions(options));\n}\n\nfunction createEJSONStreamPayload(\n options: Partial<EJSONStreamOptionsWithPayload>,\n): EJSONStream {\n let { cl, ejson, op, sep } = getOptions(options);\n const { append, prepend, resultKey } = options;\n\n assert.notEmptyString(resultKey, 'resultKey required.');\n\n const stream = new EJSONStream({\n ejson,\n cl,\n op,\n sep,\n async onStart(controller) {\n if (!prepend) {\n controller.enqueue(`{\"${resultKey}\":`);\n return;\n }\n\n const data = await prepend();\n\n if (data === null || data === undefined) {\n controller.enqueue(`{\"${resultKey}\":`);\n return;\n }\n\n assert.ok(\n isPlainObject(data),\n 'prepend result expected to be plain object',\n );\n\n const dataPart = instance.stringify(data).slice(0, -1);\n\n // Empty prepend object\n if (dataPart === '{') {\n controller.enqueue(`{\"${resultKey}\":`);\n return;\n }\n\n controller.enqueue(`${dataPart}${sep}\"${resultKey}\":`);\n },\n async onFlush(controller) {\n if (!append) {\n controller.enqueue('}');\n return;\n }\n\n const data = await append();\n\n if (data === null || data === undefined) {\n controller.enqueue('}');\n return;\n }\n\n assert.ok(\n isPlainObject(data),\n 'prepend result expected to be plain object',\n );\n\n const dataPart = instance.stringify(data).slice(1);\n\n // Empty append object\n if (dataPart === '}') {\n controller.enqueue(`}`);\n return;\n }\n\n controller.enqueue(`${sep}${dataPart}`);\n },\n });\n\n return stream;\n}\n\nfunction getOptions(options: Partial<EJSONStreamOptions>): EJSONStreamOptions {\n const { ejson = instance, cl = ']', op = '[', sep = ',' } = options;\n\n return {\n cl,\n ejson,\n op,\n sep,\n };\n}\n","import { isNumber } from './is';\nimport { round2digits } from './num/round2digits';\n\ntype Dict<T> = { [key: string]: T | undefined };\n\ntype ListTypeName = 'bool' | 'int' | 'decimal' | 'string';\n\ntype ListTypeNameToType<T extends ListTypeName> = T extends 'bool'\n ? boolean\n : T extends 'int'\n ? number\n : T extends 'decimal'\n ? number\n : T extends 'string'\n ? string\n : never;\n\n/**\n * Environment variable parser\n *\n * @group Environment\n */\nexport interface EnvParser {\n /**\n * NODE_ENV is `development`\n */\n isDevelopment: boolean;\n\n /**\n * NODE_ENV is `production`\n */\n isProduction: boolean;\n\n /**\n * NODE_ENV is `stage`\n */\n isStage: boolean;\n\n /**\n * NODE_ENV is `test`\n */\n isTest: boolean;\n\n /**\n * Returns `true` when environment key has set to `\"true\"`\n *\n * Returns `defaultValue` when key is not defined\n */\n bool(key: string, defaultValue?: boolean): boolean;\n\n /**\n * Returns `number` when environment key has correct number value.\n *\n * Returns `defaultValue` when environment key is not defined or has invalid number value\n */\n int(key: string, defaultValue?: number): number;\n\n /**\n * Returns `number` when environment key has correct number value.\n *\n * Returns `defaultValue` when environment key is not defined or has invalid number value\n */\n decimal(key: string, dights?: number, defaultValue?: number): number;\n\n /**\n * Returns `string` when environment key has defined.\n *\n * Returns `defaultValue` when environment key is not defined\n */\n string(key: string, defaultValue?: string): string;\n\n /**\n * Returns `array` of parsed environment value.\n *\n * Returns `defaultValue` when key is not defined\n */\n list<T extends ListTypeName>(\n key: string,\n itemType: T,\n defaultValue?: ListTypeNameToType<T>[],\n ): ListTypeNameToType<T>[];\n\n /**\n * Returns parsed json value.\n *\n * Returns `defaultValue` when key is not defined or invalid json value\n */\n json<T = any>(key: string, defaultValue?: T | null): T | null;\n}\n\n/**\n * Ready-to-use environment parser.\n *\n * Target: `process.env`\n *\n * Fallback: `import.meta.env`\n *\n * @example\n *\n * // env.string\n * const API_KEY = env.string('API_KEY', 'test_key');\n *\n * // env.bool\n * const TEST_FEATURE = env.bool('TEST_FEATURE', false);\n *\n * // env.int\n * const RETRY_ATTEMPTS = env.int('RETRY_ATTEMPTS', 5);\n *\n * // env.decimal\n * const DELAY_SECONDS = env.decimal('DELAY_SECONDS', 2, 5); // round to 2 dights\n *\n * // env.list\n * const TARGET_ROLES = env.list('TARGET_ROLES', 'string', ['ADMIN']);\n *\n * // env.json\n * const GOOGLE_CREDS = env.json<{ projectId: string; token: string; }>('GOOGLE_CREDS');\n *\n * @group Environment\n */\nexport const env: Readonly<EnvParser> = (() => {\n if ((globalThis as any)?.process) {\n return createEnvParser(process.env);\n } else {\n return createEnvParser((import.meta as any).env);\n }\n})();\n\n/**\n * @example\n * const env = createEnvParser(process.env);\n * // const env = createEnvParser(import.meta.env);\n *\n * const API_KEY = env.string('API_KEY', 'test_key');\n *\n * @group Environment\n */\nexport function createEnvParser(\n targetObject: Record<string, string> | Dict<string>,\n): Readonly<EnvParser> {\n return Object.freeze({\n isDevelopment: targetObject.NODE_ENV === 'development',\n\n isProduction: targetObject.NODE_ENV === 'production',\n\n isStage: targetObject.NODE_ENV === 'state',\n\n isTest: targetObject.NODE_ENV === 'test',\n\n bool(key: string, defaultValue: boolean = false): boolean {\n if (!(key in targetObject)) {\n return defaultValue;\n }\n\n return parseBoolean(targetObject[key]) ?? defaultValue;\n },\n\n int(key: string, defaultValue: number = 0): number {\n if (!(key in targetObject)) {\n return defaultValue;\n }\n\n return _parseInt(targetObject[key]) ?? defaultValue;\n },\n\n decimal(key: string, dights = undefined, defaultValue: number = 0): number {\n if (!(key in targetObject)) {\n return isNumber(dights)\n ? round2digits(defaultValue, dights)\n : defaultValue;\n }\n\n return parseDecimal(targetObject[key], dights) ?? defaultValue;\n },\n\n string(key: string, defaultValue: string = ''): string {\n return targetObject[key] ?? defaultValue;\n },\n\n list<T extends ListTypeName>(\n key: string,\n type: T,\n defaultValue: ListTypeNameToType<T>[] = [],\n ): ListTypeNameToType<T>[] {\n if (!(key in targetObject)) {\n return defaultValue;\n }\n\n const parsers: Record<ListTypeName, (value: unknown) => any> = {\n int: _parseInt,\n bool: parseBoolean,\n decimal: v => parseDecimal(v, 2),\n string: v => v,\n };\n\n return ((targetObject as any)[key] as string)\n .split(',')\n .map((value, idx) => {\n const parsedValue = parsers[type](value.trim());\n\n if (parsedValue === undefined) {\n console.warn('Warn! Failed to parse list item as ' + type, {\n key,\n idx,\n type,\n value,\n });\n }\n\n return parsedValue;\n })\n .filter(v => v !== undefined);\n },\n\n json<T = any>(key: string, defaultValue: T | null = null): T | null {\n if (!(key in targetObject)) {\n return defaultValue;\n }\n\n try {\n // @ts-expect-error\n return JSON.parse(targetObject[key]);\n } catch (err) {\n console.warn('Failed to parse json env variable', key);\n return defaultValue;\n }\n },\n });\n}\n\nfunction parseBoolean(value: unknown): boolean | undefined {\n if (value === 'true') return true;\n if (value === 'false') return false;\n\n return undefined;\n}\n\nfunction _parseInt(value: unknown): number | undefined {\n const parsed = parseInt(value as any);\n\n return isNumber(parsed) ? parsed : undefined;\n}\n\nfunction parseDecimal(value: unknown, dights?: number): number | undefined {\n const parsed = parseFloat(value as any);\n\n return isNumber(parsed)\n ? isNumber(dights)\n ? round2digits(parsed, dights)\n : parsed\n : undefined;\n}\n","import { isNumber } from '../is.js';\n\nconst CODE_TO_MESSAGE: Record<number, string> = Object.freeze({\n 100: 'Continue',\n 101: 'Switching Protocols',\n 102: 'Processing',\n 103: 'Early Hints',\n\n 200: 'OK',\n 201: 'Created',\n 202: 'Accepted',\n 203: 'Non-Authoritative Information',\n 204: 'No Content',\n 205: 'Reset Content',\n 206: 'Partial Content',\n\n 300: 'Multiple Choices',\n 301: 'Moved Permanently',\n 302: 'Found',\n 303: 'See Other',\n 304: 'Not Modified',\n 305: 'Use Proxy',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 402: 'Payment Required',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 407: 'Proxy Authentication Required',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length Required',\n 412: 'Precondition Failed',\n 413: 'Payload Too Large',\n 414: 'URI Too Long',\n 415: 'Unsupported Media Type',\n 416: 'Range Not Satisfiable',\n 417: 'Expectation Failed',\n 418: \"I'm a teapot\",\n 422: 'Unprocessable Entity',\n 425: 'Too Early',\n 426: 'Upgrade Required',\n 428: 'Precondition Required',\n 429: 'Too Many Requests',\n 431: 'Request Header Fields Too Large',\n\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n 506: 'Variant Also Negotiates',\n 507: 'Insufficient Storage',\n 508: 'Loop Detected',\n 510: 'Not Extended',\n 511: 'Network Authentication Required',\n});\n\nexport interface AppErrorOptions extends ErrorOptions {\n /**\n * Custom error code\n */\n code?: string;\n}\n\n/**\n * Simple application error class with the code\n * @group Errors\n */\nexport class AppError extends Error {\n /**\n * HTTP valid status code\n */\n statusCode: number;\n\n /**\n * Custom error code\n */\n code?: string;\n\n constructor(message: string, statusCode?: number, options?: AppErrorOptions);\n\n /**\n * Message will be generated from status code\n */\n constructor(statusCode: number, options?: AppErrorOptions);\n\n constructor(...args: any[]) {\n let message = 'Unknown error';\n let statusCode = 500;\n let code = 'ERR_UNKNOWN';\n let options: AppErrorOptions | undefined;\n\n if (isNumber(args[0])) {\n statusCode = args[0];\n message = CODE_TO_MESSAGE[statusCode] || message;\n options = args[1];\n } else {\n message = args[0] || CODE_TO_MESSAGE[statusCode] || message;\n statusCode = isNumber(args[1]) ? args[1] : statusCode;\n options = args[2];\n }\n\n // Call base class constructor\n super(message, options);\n\n if (typeof Error.captureStackTrace !== 'function') {\n this.stack = new Error().stack;\n } else {\n Error.captureStackTrace(this, AppError);\n }\n\n this.statusCode = statusCode;\n this.code = options?.code ?? code;\n }\n\n get name() {\n return 'AppError';\n }\n\n static is(value: any): value is AppError {\n return value instanceof AppError || value?.name === 'AppError';\n }\n}\n","/**\n * Same as `AssertionError` but for browser env.\n * @group Errors\n */\nexport class BrowserAssertionError extends Error {\n /**\n * Set to the `actual` argument for methods such as {@link assert.strictEqual()}.\n */\n actual: unknown;\n /**\n * Set to the `expected` argument for methods such as {@link assert.strictEqual()}.\n */\n expected: unknown;\n /**\n * Set to the passed in operator value.\n */\n operator: string;\n /**\n * Indicates if the message was auto-generated (`true`) or not.\n */\n generatedMessage: boolean;\n /**\n * Value is always `ERR_ASSERTION` to show that the error is an assertion error.\n */\n code: 'ERR_ASSERTION';\n\n constructor(options?: {\n /** If provided, the error message is set to this value. */\n message?: string | undefined;\n /** The `actual` property on the error instance. */\n actual?: unknown | undefined;\n /** The `expected` property on the error instance. */\n expected?: unknown | undefined;\n /** The `operator` property on the error instance. */\n operator?: string | undefined;\n /** If provided, the generated stack trace omits frames before this function. */\n stackStartFn?: Function | undefined;\n }) {\n super(options?.message);\n this.actual = options?.actual;\n this.expected = options?.expected;\n this.operator = options?.operator ?? 'none';\n this.generatedMessage = false;\n this.code = 'ERR_ASSERTION';\n }\n}\n","import { isString } from '@/is';\n\n/**\n * Extract file extension from string\n *\n * @example\n * getFileExtension('Andrew L - CV.pdf'); // 'pdf'\n *\n * @group Files\n */\nexport function getFileExtension(name: string, withDot = true): string | null {\n if (!isString(name)) {\n return null;\n }\n\n const ext = name.split('.').at(-1)?.split('?')?.at(0);\n return ext ? (withDot ? `.${ext}` : ext) : null;\n}\n","import { isString } from '@/is';\n\nconst DEF_PROTOCOLS = ['http://', 'https://'];\n\n/**\n * Checks if the provided URL string has a protocol prefix, such as `http://` or `https://`.\n * The function checks whether the URL starts with any of the specified protocols (defaults to HTTP and HTTPS).\n *\n * This can be useful for validating URLs or ensuring a URL has a valid protocol before using it in network requests.\n *\n * @example\n * hasProtocol('https://google.com'); // true\n * hasProtocol('http://google.com'); // true\n * hasProtocol('google.com'); // false\n *\n * @param url - The URL string to check.\n * @param protocols - An array of protocol prefixes to check against (defaults to `['http://', 'https://']`).\n * @returns `true` if the URL starts with one of the provided protocols, `false` otherwise.\n *\n * @group Strings\n */\nexport function hasProtocol(url: string, protocols: string[] = DEF_PROTOCOLS) {\n if (!isString(url)) return false;\n\n return protocols.some(v => url.startsWith(v));\n}\n","import { isString } from '@/is';\nimport { hasProtocol } from '@/str/hasProtocol';\nimport { getFileExtension } from '../getFileExtension';\n\n/**\n * Extract filename from string\n *\n * @example\n * getFileName('Andrew L - CV.pdf'); // 'Andrew L - CV'\n *\n * @group Files\n */\nexport function getFileName(value: string): string | null {\n if (hasProtocol(value)) {\n return getFileName(decodeURI(value.split('/').at(-1)?.split('?')?.at(0)!));\n }\n\n if (!isString(value)) return null;\n\n const ext = getFileExtension(value, true);\n\n if (!ext) {\n return value;\n }\n\n return value.slice(0, -ext.length);\n}\n","/**\n * Filters an array of paths to retain only the most specific (deepest) paths,\n * removing any path that is a prefix of another path.\n *\n * @param {string[]} keys - An array of dot-separated string paths.\n * @returns {string[]} - A new array containing only the most specific paths.\n *\n * @example\n * const inputPaths = [\n * 'profile',\n * 'profile.basic',\n * 'profile.basic.fullName',\n * 'profile.updatedAt'\n * ];\n *\n * const result = getMostSpecificPaths(inputPaths);\n * console.log(result); // ['profile.basic.fullName', 'profile.updatedAt']\n *\n * @group Files\n */\nexport function getMostSpecificPaths(keys: string[]): string[] {\n keys = [...keys].sort();\n\n const result = [];\n\n for (let i = 0; i < keys.length; i++) {\n const currentPath = keys[i];\n const nextPath = keys[i + 1];\n\n if (currentPath === nextPath) continue;\n\n if (!nextPath || !nextPath.startsWith(currentPath + '.')) {\n result.push(currentPath);\n }\n }\n\n return result;\n}\n","/**\n * Converts bytes amount into human readably string\n *\n * @example\n * humanFileSize(1024); // 1KB\n *\n * @group Files\n */\nexport function humanFileSize(\n bytes: number,\n digits: number = 1,\n withSpace: boolean = true,\n): string {\n const thresh = 1024;\n const units = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n if (Math.abs(bytes) < thresh) {\n return (bytes / thresh).toFixed(digits) + ` ${units[0]}`;\n }\n\n let u = -1;\n const r = 10 ** digits;\n\n do {\n bytes /= thresh;\n ++u;\n } while (\n Math.round(Math.abs(bytes) * r) / r >= thresh &&\n u < units.length - 1\n );\n\n return bytes.toFixed(digits) + (withSpace ? ' ' : '') + units[u];\n}\n","interface DebounceOptions {\n /**\n * An optional AbortSignal to cancel the debounced function.\n */\n signal?: AbortSignal;\n\n /**\n * An optional array specifying whether the function should be invoked on the leading edge, trailing edge, or both.\n * If `edges` includes \"leading\", the function will be invoked at the start of the delay period.\n * If `edges` includes \"trailing\", the function will be invoked at the end of the delay period.\n * If both \"leading\" and \"trailing\" are included, the function will be invoked at both the start and end of the delay period.\n * @default [\"trailing\"]\n */\n edges?: Array<'leading' | 'trailing'>;\n}\n\nexport interface DebouncedFunction<F extends (...args: any[]) => void> {\n (...args: Parameters<F>): void;\n\n /**\n * Schedules the execution of the debounced function after the specified debounce delay.\n * This method resets any existing timer, ensuring that the function is only invoked\n * after the delay has elapsed since the last call to the debounced function.\n * It is typically called internally whenever the debounced function is invoked.\n *\n * @returns {void}\n */\n schedule: () => void;\n\n /**\n * Cancels any pending execution of the debounced function.\n * This method clears the active timer and resets any stored context or arguments.\n */\n cancel: () => void;\n\n /**\n * Immediately invokes the debounced function if there is a pending execution.\n * This method also cancels the current timer, ensuring that the function executes right away.\n */\n flush: () => void;\n}\n\n/**\n * Creates a debounced function that delays invoking the provided function until after `debounceMs` milliseconds\n * have elapsed since the last time the debounced function was invoked. The debounced function also has a `cancel`\n * method to cancel any pending execution.\n *\n * @template F - The type of function.\n * @param {F} func - The function to debounce.\n * @param {number} debounceMs - The number of milliseconds to delay.\n * @param {DebounceOptions} options - The options object\n * @param {AbortSignal} options.signal - An optional AbortSignal to cancel the debounced function.\n * @returns A new debounced function with a `cancel` method.\n *\n * @example\n * const debouncedFunction = debounce(() => {\n * console.log('Function executed');\n * }, 1000);\n *\n * // Will log 'Function executed' after 1 second if not called again in that time\n * debouncedFunction();\n *\n * // Will not log anything as the previous call is canceled\n * debouncedFunction.cancel();\n *\n * // With AbortSignal\n * const controller = new AbortController();\n * const signal = controller.signal;\n * const debouncedWithSignal = debounce(() => {\n * console.log('Function executed');\n * }, 1000, { signal });\n *\n * debouncedWithSignal();\n *\n * // Will cancel the debounced function call\n * controller.abort();\n *\n * @author es-toolkit\n * @group Utility Functions\n */\nexport function debounce<F extends (...args: any[]) => void>(\n func: F,\n debounceMs: number,\n { signal, edges }: DebounceOptions = {},\n): DebouncedFunction<F> {\n let pendingThis: any = undefined;\n let pendingArgs: Parameters<F> | null = null;\n\n const leading = edges != null && edges.includes('leading');\n const trailing = edges == null || edges.includes('trailing');\n\n const invoke = () => {\n if (pendingArgs !== null) {\n func.apply(pendingThis, pendingArgs);\n pendingThis = undefined;\n pendingArgs = null;\n }\n };\n\n const onTimerEnd = () => {\n if (trailing) {\n invoke();\n }\n\n cancel();\n };\n\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const schedule = () => {\n if (timeoutId != null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n onTimerEnd();\n }, debounceMs);\n };\n\n const cancelTimer = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n const cancel = () => {\n cancelTimer();\n pendingThis = undefined;\n pendingArgs = null;\n };\n\n const flush = () => {\n cancelTimer();\n invoke();\n };\n\n const debounced = function (this: any, ...args: Parameters<F>) {\n if (signal?.aborted) {\n return;\n }\n\n pendingThis = this;\n pendingArgs = args;\n\n const isFirstCall = timeoutId == null;\n\n schedule();\n\n if (leading && isFirstCall) {\n invoke();\n }\n };\n\n debounced.schedule = schedule;\n debounced.cancel = cancel;\n debounced.flush = flush;\n\n signal?.addEventListener('abort', cancel, { once: true });\n\n return debounced;\n}\n","import type {\n ExecResult,\n ExecResultToSkip,\n ExecResultToSuccess,\n} from '../types';\n\n/**\n * @group Utility Functions\n */\nexport function isSuccess<T extends ExecResult>(\n value: T,\n // @ts-expect-error\n): value is ExecResultToSuccess<T> {\n return value.success === true;\n}\n\n/**\n * @group Utility Functions\n */\nexport function isSkip<T extends ExecResult>(\n value: T,\n // @ts-expect-error\n): value is ExecResultToSkip<T> {\n return value.skip === true;\n}\n","import {\n isDate,\n isMap,\n isNumber,\n isObject,\n isSet,\n isWeakMap,\n isWeakSet,\n} from '@/is';\nimport type { AnyFunction } from '../../types';\n\nexport type TypeOf = keyof TypeOfMap;\n\nexport type TypeOfMap = {\n null: null;\n undefined: undefined;\n object: Record<PropertyKey, any>;\n string: string;\n number: number;\n function: AnyFunction;\n bigint: bigint;\n boolean: boolean;\n symbol: symbol;\n date: Date;\n array: any[];\n map: Map<any, any>;\n weakmap: WeakMap<WeakKey, any>;\n set: Set<any>;\n weakset: WeakSet<WeakKey>;\n unknown: unknown;\n};\n\n/**\n * Typeof that you deserve\n * @group Utility Functions\n */\nexport function typeOf(value: unknown): TypeOf {\n const type = typeof value;\n\n switch (type) {\n case 'number':\n return isNumber(value) ? 'number' : 'unknown';\n\n case 'object': {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (isSet(value)) return 'set';\n if (isWeakSet(value)) return 'weakset';\n if (isMap(value)) return 'map';\n if (isWeakMap(value)) return 'weakmap';\n if (isDate(value)) return 'date';\n if (isObject(value)) return 'object';\n return 'unknown';\n }\n\n default: {\n return type;\n }\n }\n}\n","import {\n isDate,\n isEmpty,\n isEqual,\n isFunction,\n isNumber,\n isObject,\n isString,\n} from '@/is.js';\nimport { deepAssign } from '@/object/index.js';\nimport { type TypeOf, type TypeOfMap, typeOf } from '../typeOf';\n\ntype StringifyOptions = {\n /**\n * Exclude empty values, checking by `isEmpty`\n * @default true\n */\n excludeEmpty?: boolean;\n\n /**\n * Exclude values when equals with defaults\n */\n excludeDefaults?: Record<string, any>;\n};\n\n/**\n * Simple query stringy interface that supports encoding/decoding of `Array`, `Set`, `Map`, `Object`, `BigInt`\n *\n * @example\n * // encode\n * qs.stringify({ page: 1, limit: 10 }); // 'page=1&limit=10'\n *\n * // decode\n * const defaults = { page: 1, limit: 10 };\n * const params = qs.parse('page=5&limit=abc', defaults); // { page: 5, limit: 10 }\n *\n * @group Utility Functions\n */\nexport const qs = {\n toParams,\n stringify,\n stringifyValue,\n parse,\n parseValue,\n merge,\n};\n\n/**\n * Merge first level values\n */\nfunction merge(...values: Record<string, any>[]): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const filter of values) {\n for (const [key, value] of Object.entries(filter)) {\n const currentValue = result[key];\n const currentType = typeOf(currentValue);\n const filterType = typeOf(value);\n\n // overwrite with new value when type mismatch\n if (currentType !== filterType) {\n result[key] = value;\n continue;\n }\n\n switch (currentType) {\n case 'array': {\n result[key] = Array.from(new Set([...currentValue, ...value]));\n break;\n }\n\n case 'object': {\n result[key] = {};\n deepAssign(result[key], currentValue);\n deepAssign(result[key], value);\n break;\n }\n\n case 'map': {\n result[key] = new Map([\n ...(Array.from(currentValue.entries()) as any[]),\n ...(Array.from(value.entries()) as any[]),\n ]);\n break;\n }\n\n case 'set': {\n result[key] = new Set([\n ...Array.from(currentValue),\n ...Array.from(value),\n ]);\n break;\n }\n\n default: {\n result[key] = value;\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Simple function to transform object into query string (not standards)\n */\nfunction stringify(\n obj: Record<string, any>,\n options?: StringifyOptions,\n): string {\n return new URLSearchParams(toParams(obj, options)).toString();\n}\n\n/**\n * Prepare search params object\n */\nfunction toParams(\n obj: Record<string, any>,\n options?: StringifyOptions,\n): Record<string, string> {\n const result: Record<string, string> = {};\n const excludeEmpty = options?.excludeEmpty !== false;\n const excludeDefaults = options?.excludeDefaults;\n\n for (const [key, value] of Object.entries(obj)) {\n if (excludeEmpty && isEmpty(value)) continue;\n\n if (excludeDefaults && key in excludeDefaults) {\n const defValue = excludeDefaults[key];\n if (isEqual(value, defValue)) continue;\n }\n\n const strValue = stringifyValue(value);\n\n if (excludeEmpty && strValue === '') {\n continue;\n }\n\n result[key] = strValue;\n }\n\n return result;\n}\n\n/**\n * Parse query string as is without type casting\n */\nfunction parse(value: string): Record<string, string>;\n\n/**\n * Parse query string and use default object as type cast schema\n */\nfunction parse<T extends Record<string, any>>(\n value: string,\n defaults: Partial<T>,\n): T;\n\n/**\n * Parse query params and use default object as type cast schema\n */\nfunction parse<T extends Record<string, any>>(\n value: Record<string, any>,\n defaults: T,\n): Partial<T>;\n\nfunction parse(\n value: string | Record<string, any>,\n defaults?: Record<string, any>,\n): any {\n const objValue = isString(value)\n ? Object.fromEntries(new URLSearchParams(value).entries())\n : value;\n\n if (!defaults) {\n return { ...objValue };\n }\n\n const result: Record<string, any> = {};\n\n for (const [key, defValue] of Object.entries(defaults)) {\n const defType = typeOf(defValue);\n\n let parsedValue = parseValue(objValue[key], defType);\n\n if (parsedValue !== undefined || defType === 'undefined') {\n if (defType === 'array' && defValue[0] !== undefined) {\n const itemValue = typeOf(defValue[0]);\n parsedValue = (parsedValue as any[]).map(v => parseValue(v, itemValue));\n }\n\n result[key] = parsedValue;\n } else {\n result[key] = defValue;\n }\n }\n\n return result;\n}\n\n/**\n * Stringify value to use as query parameter\n */\nfunction stringifyValue(value: unknown): string {\n const valueType = typeOf(value);\n\n switch (valueType) {\n case 'undefined': {\n return '';\n }\n\n case 'null': {\n return '';\n }\n\n case 'array': {\n let result = '';\n let sep = '';\n\n for (const item of value as any[]) {\n if (item === undefined) continue;\n\n if (\n isObject(item) ||\n Array.isArray(item) ||\n (isString(item) && item.includes(','))\n ) {\n result = JSON.stringify(value);\n break;\n } else {\n result += sep + stringifyValue(item);\n sep = ',';\n }\n }\n\n return result;\n }\n\n case 'date': {\n return (value as Date).toISOString();\n }\n\n case 'map': {\n return JSON.stringify(Array.from((value as Map<any, any>).entries()));\n }\n\n case 'set': {\n return JSON.stringify(Array.from((value as Set<any>).values()));\n }\n\n case 'boolean':\n case 'number':\n case 'string':\n case 'bigint': {\n return String(value);\n }\n\n case 'object': {\n return JSON.stringify(value);\n }\n\n case 'unknown': {\n if (isFunction(value?.toString)) {\n return value.toString();\n }\n }\n\n default: {\n throw new Error('Attempt to stringify unsupported type: ' + valueType);\n }\n }\n}\n\n/**\n * Parse string query value as a type\n */\nfunction parseValue<T extends TypeOf>(\n value: any,\n asType: T,\n): TypeOfMap[T] | undefined {\n const type = typeOf(value);\n\n if (type === asType) {\n return value;\n } else if (type !== 'string') {\n return undefined;\n }\n\n try {\n switch (asType) {\n case 'undefined': {\n return undefined;\n }\n\n case 'array': {\n if (value.startsWith('[') && value.endsWith(']')) {\n return JSON.parse(value);\n }\n\n return value.split(',') as any;\n }\n\n case 'boolean': {\n return (value === 'true') as any;\n }\n\n case 'date': {\n const parsed = new Date(value) as any;\n return (isDate(parsed) ? parsed : undefined) as any;\n }\n\n case 'map': {\n return new Map(JSON.parse(value)) as any;\n }\n\n case 'number': {\n const parsed = parseFloat(value);\n return (isNumber(parsed) ? parsed : undefined) as any;\n }\n\n case 'object': {\n return JSON.parse(value);\n }\n\n case 'set': {\n return new Set(JSON.parse(value)) as any;\n }\n\n case 'null': {\n return (value === '' || value === undefined ? null : undefined) as any;\n }\n\n case 'string': {\n return value as any;\n }\n\n case 'bigint': {\n return BigInt(value) as any;\n }\n }\n } catch (_) {}\n\n return undefined;\n}\n","export interface Defer<T = unknown> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (value: any) => void;\n}\n\n/**\n * Old known defer :)\n *\n * @example\n * function loadModule() {\n * const q = defer<void>();\n *\n * setTimeout(() => q.resolve(), 5000);\n *\n * return q.promise;\n * }\n *\n * await loadModule();\n *\n * @group Promise\n */\nexport function defer<T = void>(): Defer<T> {\n let resolve: any;\n let reject: any;\n\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n\n return {\n resolve: resolve,\n reject: reject,\n promise: promise,\n };\n}\n","import { isFunction } from '@/is';\nimport type { AnyFunction, Fn } from '@/types';\n\nconst defaultWindow = (globalThis as any)?.window as Window | undefined;\n\nconst idle: (fn: AnyFunction) => void = (() => {\n if (defaultWindow?.requestIdleCallback) {\n return defaultWindow.requestIdleCallback;\n } else if (defaultWindow?.requestAnimationFrame) {\n return defaultWindow.requestAnimationFrame;\n } else if (isFunction(process?.nextTick)) {\n return process.nextTick;\n } else {\n return fn => setTimeout(fn, 0);\n }\n})();\n\n/**\n * Executes the provided callback as soon as the event loop is idle.\n * This function allows you to run tasks at the earliest available opportunity\n * without blocking the main execution flow, making it ideal for tasks that can\n * be deferred until the browser is idle or the process is idle.\n *\n * It uses `requestIdleCallback` if available, otherwise it falls back to\n * `requestAnimationFrame`, `process.nextTick`, or `setTimeout` depending on the environment.\n *\n * @example\n * fastIdle(() => {\n * console.log('1');\n * });\n *\n * console.log('2');\n *\n * // Output:\n * // 2\n * // 1\n *\n * @param callback - The callback function to be executed when the event loop is idle.\n *\n * @group Promise\n */\nexport function fastIdle(callback: Fn) {\n return idle(callback);\n}\n\n/**\n * Same as `fastIdle` but promisified\n *\n * @example\n * fastIdlePromise().then(() => {\n * console.log('1');\n * });\n *\n * console.log('2');\n *\n * // 2\n * // 1\n *\n * @group Promise\n */\nexport function fastIdlePromise() {\n return new Promise<void>(resolve => idle(resolve));\n}\n","import { defer } from '../defer';\nimport { fastIdle } from '../fastIdle';\n\n/**\n * Returns a promise that resolves after the provided delay.\n *\n * If the delay is specified as `'tick'`, the promise resolves after the next event loop tick.\n *\n * If a numeric delay is provided, the promise resolves after the specified time in milliseconds.\n *\n * This is useful for introducing delays in asynchronous code, such as for throttling or rate-limiting,\n * or simply pausing execution between iterations.\n *\n * @param amount - The delay duration in milliseconds, or `'tick'` for a resolution after the next event loop tick.\n * @returns A promise that resolves after the specified delay.\n *\n * @example\n * let seconds = 0;\n *\n * // This will print numbers 1, 2, 3... every second\n * while (true) {\n * await delay(1000);\n * console.log(++seconds);\n * }\n *\n * @example\n * // This will wait until the next event loop tick before resolving\n * await delay('tick');\n *\n * @group Promise\n */\nexport function delay(amount: 'tick' | number = 'tick') {\n const d = defer<void>();\n\n if (amount === 'tick') {\n fastIdle(d.resolve);\n } else {\n setTimeout(d.resolve, amount);\n }\n\n return d.promise;\n}\n","import { delay } from '@/promise/delay';\nimport type { AnyFunction } from '@/types';\n\nconst noopShouldRetryBasedOnError = () => true;\n\nexport type RetryOnErrorConfig = {\n /**\n * The function to execute before retry attempt; Allows to update parameters for the main function by returning then in an array\n */\n beforeRetryCallback?: (\n attempt: number,\n lastAttempt: boolean,\n ) => Promise<unknown[] | void>;\n /**\n * Error validation function. If returns true, the main callback's considered ready to be executed again\n */\n shouldRetryBasedOnError?: (error: unknown, attempt: number) => boolean;\n /**\n * Number of retries until the execution fails\n */\n maxRetriesNumber: number;\n\n /**\n * Delay multiply factor\n */\n delayFactor?: number;\n\n /**\n * Delay min milliseconds\n */\n delayMinMs?: number;\n\n /**\n * Delay max milliseconds\n */\n delayMaxMs?: number;\n};\n\n/**\n * Wraps a function with retry logic.\n *\n * @example\n * const fn = await retryOnError({\n * maxRetriesNumber: 10,\n * delayFactor: 2,\n * delayMinMs: 1000,\n * delayMaxMs: 3000,\n * shouldRetryBasedOnError(error, attemptNumber) {\n * return error.code !== 'RECORD_EXISTS';\n * }\n * }, async () => {\n * await db.transactions.insert(doc);\n * });\n *\n * await fn();\n *\n * @group Utility Functions\n */\nexport function retryOnError<T extends AnyFunction>(\n {\n beforeRetryCallback,\n shouldRetryBasedOnError = noopShouldRetryBasedOnError,\n maxRetriesNumber,\n delayFactor = 0,\n delayMaxMs = 1000,\n delayMinMs = 100,\n }: RetryOnErrorConfig,\n fn: T,\n): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> {\n let retryCount = maxRetriesNumber;\n let delayMs = 0;\n\n delayMinMs = Math.max(delayMinMs, 1);\n delayMaxMs = Math.max(delayMaxMs, 1);\n\n const run = async (...args: any[]): Promise<any> => {\n if (delayFactor >= 1 && delayMs > 0) {\n await delay(delayMs);\n }\n\n const currentAttempt = 1 + maxRetriesNumber - retryCount;\n\n try {\n const res = await fn(...args);\n return res;\n } catch (e) {\n if (retryCount > 1 && shouldRetryBasedOnError(e, currentAttempt)) {\n retryCount--;\n delayMs = Math.floor(\n Math.min(Math.max(delayMs, delayMinMs) * delayFactor, delayMaxMs),\n );\n\n if (beforeRetryCallback) {\n const newParams = await beforeRetryCallback(\n currentAttempt,\n retryCount === 0,\n );\n if (newParams) {\n return run(newParams);\n }\n }\n return run(...args);\n }\n\n throw e;\n }\n };\n\n return run;\n}\n","import { debounce } from '../debounce';\n\ninterface ThrottleOptions {\n /**\n * An optional AbortSignal to cancel the debounced function.\n */\n signal?: AbortSignal;\n\n /**\n * An optional array specifying whether the function should be invoked on the leading edge, trailing edge, or both.\n * If `edges` includes \"leading\", the function will be invoked at the start of the delay period.\n * If `edges` includes \"trailing\", the function will be invoked at the end of the delay period.\n * If both \"leading\" and \"trailing\" are included, the function will be invoked at both the start and end of the delay period.\n * @default [\"leading\", \"trailing\"]\n */\n edges?: Array<'leading' | 'trailing'>;\n}\n\nexport interface ThrottledFunction<F extends (...args: any[]) => void> {\n (...args: Parameters<F>): void;\n cancel: () => void;\n flush: () => void;\n}\n\n/**\n * Creates a throttled function that only invokes the provided function at most once\n * per every `throttleMs` milliseconds. Subsequent calls to the throttled function\n * within the wait time will not trigger the execution of the original function.\n *\n * @template F - The type of function.\n * @param {F} func - The function to throttle.\n * @param {number} throttleMs - The number of milliseconds to throttle executions to.\n * @returns {(...args: Parameters<F>) => void} A new throttled function that accepts the same parameters as the original function.\n *\n * @example\n * const throttledFunction = throttle(() => {\n * console.log('Function executed');\n * }, 1000);\n *\n * // Will log 'Function executed' immediately\n * throttledFunction();\n *\n * // Will not log anything as it is within the throttle time\n * throttledFunction();\n *\n * // After 1 second\n * setTimeout(() => {\n * throttledFunction(); // Will log 'Function executed'\n * }, 1000);\n *\n * @author es-toolkit\n * @group Utility Functions\n */\nexport function throttle<F extends (...args: any[]) => void>(\n func: F,\n throttleMs: number,\n { signal, edges = ['leading', 'trailing'] }: ThrottleOptions = {},\n): ThrottledFunction<F> {\n let pendingAt: number | null = null;\n\n const debounced = debounce(func, throttleMs, { signal, edges });\n\n const throttled = function (...args: Parameters<F>) {\n if (pendingAt == null) {\n pendingAt = Date.now();\n } else {\n if (Date.now() - pendingAt >= throttleMs) {\n pendingAt = Date.now();\n debounced.cancel();\n debounced(...args);\n }\n }\n\n debounced(...args);\n };\n\n throttled.cancel = debounced.cancel;\n throttled.flush = debounced.flush;\n\n return throttled;\n}\n","/**\n * Formats a string by replacing format specifiers with values from the provided arguments.\n * It supports a variety of format types, including strings, numbers, and objects.\n *\n * ⚠️ This function mutates the `unusedArgs` array, which will contain any arguments\n * that were not used in the formatting process.\n *\n * @param line - The format string containing placeholders to be replaced by arguments.\n * Format specifiers are indicated by the `%` symbol, followed by a character indicating\n * the type of argument to insert (e.g., `%s` for string, `%d` for integer, `%f` for float).\n * @param args - The array of arguments to replace the format specifiers in the string.\n * The function will iterate over the arguments and substitute them into the format string\n * in the order they appear.\n * @param [unusedArgs=[]] - The array that will collect any unused arguments\n * that were not needed for formatting. This array is mutated by the function.\n *\n * @returns {string} The formatted string with placeholders replaced by corresponding arguments.\n *\n * @example\n * const unusedArgs: any[] = [];\n *\n * console.log(sprintf('Hello %s', ['World', 'Great'], unusedArgs));\n * // Output: 'Hello World'\n * console.log(unusedArgs);\n * // Output: ['Great']\n *\n * @example\n * console.log(sprintf('I have %d apples and %f.5 liters of water.', [5, 3.2], unusedArgs));\n * // Output: 'I have 5 apples and 3.2 liters of water.'\n * console.log(unusedArgs);\n * // Output: []\n *\n * @group Strings\n */\nexport function sprintf(line: string, args: any[], unusedArgs: any[] = []) {\n let result = '';\n\n const argsLen = args.length;\n const lineLen = line.length;\n\n let opened = false;\n let currentChar = -1;\n let lastPos = 0;\n let argsIndex = 0;\n\n for (let idx = 0; idx < lineLen; idx++) {\n currentChar = line.charCodeAt(idx);\n\n // \"%\" found\n if (currentChar === 37) {\n opened = true;\n continue;\n }\n\n if (!opened) continue;\n\n opened = false;\n\n switch (currentChar) {\n // 'd'\n case 100:\n // 'f'\n case 102: {\n result += line.slice(lastPos, idx - 1);\n result += Number(args[argsIndex]);\n lastPos = idx + 1;\n argsIndex++;\n break;\n }\n\n // 'i'\n case 105: {\n result += line.slice(lastPos, idx - 1);\n result += Math.floor(Number(args[argsIndex]));\n lastPos = idx + 1;\n argsIndex++;\n break;\n }\n\n // 'O'\n case 79:\n // 'o'\n case 111:\n // 'j'\n case 106: {\n result += line.slice(lastPos, idx - 1);\n result += tryStringify(args[argsIndex]);\n lastPos = idx + 1;\n argsIndex++;\n break;\n }\n\n // 's'\n case 115: {\n result += line.slice(lastPos, idx - 1);\n result += String(args[argsIndex]);\n lastPos = idx + 1;\n argsIndex++;\n break;\n }\n }\n\n if (argsIndex >= argsLen) break;\n }\n\n if (lastPos < lineLen) {\n result += line.slice(lastPos, lineLen);\n }\n\n if (argsIndex < argsLen) {\n unusedArgs.push(...args.slice(argsIndex, argsLen));\n }\n\n return result;\n}\n\nfunction tryStringify(o: unknown) {\n switch (typeof o) {\n case 'function': {\n return o.name || '<anonymous>';\n }\n\n case 'string': {\n return \"'\" + o + \"'\";\n }\n\n default: {\n try {\n return JSON.stringify(o);\n } catch (e) {\n return '\"[Circular]\"';\n }\n }\n }\n}\n","import { assert } from './assert';\nimport { isString } from './is';\nimport { sprintf } from './str/sprintf';\nimport type { Logger } from './types';\n\ntype LogLevel = Exclude<keyof Logger, 'extend'>;\n\nconst LEVEL_NUM: Record<LogLevel, number> = {\n debug: 0,\n log: 1,\n info: 2,\n warn: 3,\n error: 4,\n};\n\nlet currentLogLevel: number = LEVEL_NUM.log;\n\n/**\n * Set global log level.\n * @group Utility Functions\n */\nexport const loggerSetLevel = (level: LogLevel) => {\n assert.number(LEVEL_NUM[level], `Invalid log level: ${level}`);\n currentLogLevel = LEVEL_NUM[level];\n};\n\n/**\n * Create pretty simple `console.log` wrapper interface.\n *\n * @example\n * const log = logger('UserService');\n *\n * log.info('Create user: %s', 'user_1'); // Create user: %s\n *\n * @group Utility Functions\n */\nexport const logger = (...baseArgs: any[]): Logger => {\n // handle meta.url\n if (isString(baseArgs[0]?.url)) {\n baseArgs[0] = baseArgs[0]?.url;\n }\n\n // normalize meta.url\n if (typeof baseArgs[0] === 'string' && baseArgs[0][0] !== '[') {\n baseArgs[0] = `[${baseArgs[0].split('/')!.at(-1)!.split('?', 1)[0]!}]`;\n }\n\n const writeLog = (level: LogLevel, ...[pattern, ...args]: any[]) => {\n const levelNum = LEVEL_NUM[level];\n\n if (levelNum < currentLogLevel) {\n return;\n }\n\n if (!isString(pattern)) {\n // eslint-disable-next-line no-console\n console[level](...baseArgs, pattern, ...args);\n return;\n }\n\n const unusedArgs: any[] = [];\n const formatted = sprintf(pattern, args, unusedArgs);\n\n // eslint-disable-next-line no-console\n console[level](...baseArgs, formatted, ...unusedArgs);\n };\n\n const log = writeLog.bind(null, 'log');\n\n const info = writeLog.bind(null, 'info');\n\n const warn = writeLog.bind(null, 'warn');\n\n const error = writeLog.bind(null, 'error');\n\n const debug = writeLog.bind(null, 'debug');\n\n const extend = (...args: any[]) => {\n return logger(...baseArgs, ...args);\n };\n\n const instance = {\n log,\n info,\n warn,\n error,\n debug,\n extend,\n };\n\n return instance;\n};\n","import { nextTickIteration } from '@/promise';\n\n/**\n * Asynchronously filters an array using an async predicate function.\n *\n * This function processes an array using an async function as the predicate,\n * allowing you to avoid blocking the event loop while iterating over large arrays.\n * It ensures that the iteration happens asynchronously with minimal impact on the event loop,\n * making it useful for processing large datasets or performing async operations on each element.\n *\n * @param array - The array to be filtered.\n * @param predicate - The async predicate function.\n * It takes three arguments: the current value, the index of the current value, and the full array.\n * It should return a boolean value or a promise that resolves to a boolean indicating whether the value should be kept in the result array.\n *\n * @returns {Promise<T[]>} A promise that resolves to a new array containing the elements that satisfy the predicate.\n *\n * @example\n * const users = Array.from({ length: 100000 }).map((_, idx) => ({\n * id: idx,\n * name: 'User: ' + (idx + 1)\n * }));\n *\n * async function first100Users() {\n * return await asyncFilter(users, (user) => user.id < 100);\n * }\n *\n * Promise.all([\n * first100Users(),\n * otherUsefulTask(),\n * ]).then(console.log);\n *\n * @group Promise\n */\nexport async function asyncFilter<T>(\n array: T[],\n predicate: (\n value: T,\n index: number,\n array: Array<T>,\n ) => Promise<boolean> | boolean,\n): Promise<T[]> {\n const result: T[] = [];\n\n const cooldown = nextTickIteration(10);\n\n for (let idx = 0; idx < array.length; idx++) {\n await cooldown();\n\n const value = array[idx];\n const valid = await predicate(value, idx, array);\n\n if (valid) {\n result.push(value);\n }\n }\n\n return result;\n}\n","import { fastIdle } from '../fastIdle';\n\n/**\n * Creates a cooldown function that resolves after a specified number of executions (`amount`).\n * The cooldown can either occur on the `next` tick or after a specified delay.\n *\n * This is useful for controlling the rate of asynchronous operations, allowing you to pause\n * for a specified amount of time after a certain number of iterations in a loop.\n *\n * @example\n * // Create a cooldown function that waits 1 tick for every 10th execution\n * const cooldown = nextTickIteration(10);\n *\n * for (const item of array) {\n * await cooldown(); // Wait 1 tick for every 10th call\n * // Perform some async operation here\n * }\n *\n * @example\n * // Create a cooldown function with a 100ms delay after every 5 executions\n * const cooldownWithDelay = nextTickIteration(5, 100);\n * for (const item of array) {\n * await cooldownWithDelay(); // Wait 100ms after every 5th call\n * // Perform some async operation here\n * }\n *\n * @param amount The number of executions after which the cooldown should occur.\n * @param delay The delay type or amount. If 'tick', it uses the next idle tick.\n * If a number is provided, it specifies a delay in milliseconds.\n * @returns A function that, when called, returns a promise resolving after the specified cooldown period.\n *\n * @group Promise\n */\nexport function nextTickIteration(\n amount: number,\n delay: number | 'tick' = 'tick',\n): () => Promise<void> {\n let counter = 0;\n\n const tickInterval = delay === 'tick';\n\n return () => {\n counter++;\n\n if (counter >= amount) {\n counter = 0;\n return new Promise(resolve => {\n if (tickInterval) {\n fastIdle(resolve);\n } else {\n setTimeout(resolve, delay);\n }\n });\n }\n\n return Promise.resolve();\n };\n}\n","import { nextTickIteration } from '../nextTickIteration';\n\n/**\n * Asynchronously finds the first element in an array that satisfies the provided async predicate.\n *\n * This function iterates through an array and applies an asynchronous predicate to each element.\n * If the predicate resolves to a truthy value for any element, that element is returned immediately.\n * The function is designed to prevent blocking the event loop during iteration, making it suitable\n * for processing large arrays without impacting performance.\n *\n * @param array - The array to search through.\n * @param callbackfn - The asynchronous predicate function.\n * It takes three arguments: the current value, the index of the current value, and the full array.\n * The predicate function should return a boolean or a promise that resolves to a boolean indicating\n * whether the current value satisfies the condition.\n *\n * @returns {Promise<T | undefined>} A promise that resolves to the first element that satisfies the predicate, or `undefined` if no element matches.\n *\n * @example\n * // Example of using asyncFind to find users by ID asynchronously\n * const users = Array.from({ length: 100000 }).map((_, idx) => ({\n * id: idx,\n * name: 'User: ' + (idx + 1)\n * }));\n *\n * async function findById(userId: number) {\n * return await asyncFind(users, (user) => user.id === userId);\n * }\n *\n * Promise.all([\n * findById(5000),\n * findById(6000),\n * ]).then(console.log);\n *\n * @group Promise\n */\nexport async function asyncFind<T>(\n array: T[],\n callbackfn: (\n value: T,\n index: number,\n array: T[],\n ) => Promise<unknown> | unknown,\n) {\n const cooldown = nextTickIteration(10);\n\n let i = 0;\n\n while (i < array.length) {\n await cooldown();\n\n const result = await callbackfn(array[i], i, array);\n\n if (Boolean(result)) {\n return array[i];\n }\n\n i++;\n }\n\n return undefined;\n}\n","import { nextTickIteration } from '../nextTickIteration';\n\n/**\n * Asynchronously iterates over an array, executing the provided callback for each element with support for parallel processing.\n *\n * This function is similar to `Array.prototype.forEach()`, but it allows asynchronous operations in parallel for each array element.\n * It also prevents blocking the event loop while iterating through large arrays, improving performance for heavy tasks.\n * The function processes items in batches to manage concurrency and can be configured to process multiple items at the same time.\n *\n * **Note**: The callback function can return either a promise or a value. If it returns a promise, `asyncForEach` will wait for it to resolve before moving to the next iteration.\n *\n * @param array - The array to iterate over.\n * @param callbackfn - The async callback function to execute for each element.\n * This function takes three parameters:\n * - `value`: The current element of the array.\n * - `index`: The index of the current element in the array.\n * - `array`: The array that is being iterated over.\n * The function should either return a `void` or a `Promise` that resolves when the async operation is done.\n *\n * @param {Object} [options] - Optional settings to control the concurrency of the operation.\n * @param {number} [options.concurrency=1] - The number of items to process in parallel. Defaults to 1 (sequential processing).\n *\n * @returns {Promise<void>} A promise that resolves when all elements have been processed.\n *\n * @example\n * async function task(taskName: string) {\n * const largeArray = Array.from({ length: 100000 }).map((_, idx) => idx);\n *\n * await asyncForEach(largeArray, (value) => {\n * if (value % 100 === 0) {\n * console.log(taskName, 'handle:', value);\n * }\n * });\n * }\n *\n * Promise.all([\n * task('task 1'),\n * task('task 2'),\n * ]);\n *\n * @group Promise\n */\nexport async function asyncForEach<T>(\n array: T[],\n callbackfn: (\n value: T,\n index: number,\n array: Array<T>,\n ) => Promise<void> | void,\n { concurrency = 1 } = {},\n): Promise<void> {\n const cooldown = nextTickIteration(10);\n\n let i = 0;\n\n const handle = (value: T, index: number) => {\n return callbackfn(value, i + index, array);\n };\n\n while (i < array.length) {\n await cooldown();\n\n const batch = await Promise.all(\n array.slice(i, i + concurrency).map(handle),\n );\n\n i += batch.length;\n }\n}\n","import { isPromise } from '@/is';\nimport type { AnyFunction } from '@/types';\nimport { defer } from '../defer';\n\nexport type SimpleEventMap<T> = Record<keyof T, any[]> | SimpleDefaultEventMap;\nexport type SimpleDefaultEventMap = [never];\n\ntype Key<K, T> = T extends SimpleDefaultEventMap\n ? string | symbol\n : K | keyof T;\n\ntype Listener<K, T, F> = T extends SimpleDefaultEventMap\n ? F\n : K extends keyof T\n ? T[K] extends unknown[]\n ? (...args: T[K]) => void\n : never\n : never;\n\ntype Listener1<K, T> = Listener<K, T, (...args: any[]) => void>;\n\ntype Args<K, T> = T extends SimpleDefaultEventMap\n ? [...args: any[]]\n : K extends keyof T\n ? T[K]\n : never;\n\nconst onError = (error: unknown) => {\n console.error(error);\n};\n\n/**\n * Simplified version on nodejs `EventEmitter` but platform agnostic\n *\n * @example\n * const emitter = new SimpleEventEmitter();\n *\n * emitter.on('message', (data) => {\n * console.log('msg', data)\n * });\n *\n * emitter.once('message', (data) => {\n * console.log('once msg', data)\n * });\n *\n * emitter.emit('message', { text: 'Hello' });\n * emitter.emit('message', { text: 'Hello 2' });\n *\n * @group Promise\n */\nexport class SimpleEventEmitter<\n T extends SimpleEventMap<T> = SimpleDefaultEventMap,\n> {\n #listeners: Map<any, Set<AnyFunction>> = new Map();\n\n constructor() {\n // @ts-expect-error\n this.on('error', onError);\n }\n\n static once(\n emitter: SimpleEventEmitter,\n eventName: string | symbol,\n ): Promise<any[]> {\n const q = defer<any[]>();\n\n emitter.once(eventName, (...args: any[]) => q.resolve(args));\n\n return q.promise;\n }\n\n emit<K>(eventName: Key<K, T>, ...args: Args<K, T>): boolean {\n const set = this.#listeners.get(eventName);\n\n if (!set) return false;\n\n set.forEach(fn => {\n try {\n const result = fn();\n\n if (isPromise(result)) {\n result.catch(err => {\n // @ts-expect-error\n this.emit('error' as any, err);\n });\n }\n } catch (err) {\n // @ts-expect-error\n this.emit('error' as any, err);\n }\n });\n\n return true;\n }\n\n on<K>(eventName: Key<K, T>, listener: Listener1<K, T>): this {\n if (!this.#listeners.has(eventName)) {\n this.#listeners.set(eventName, new Set());\n }\n\n const set = this.#listeners.get(eventName)!;\n\n set.add(listener);\n\n return this;\n }\n\n once<K>(eventName: Key<K, T>, listener: Listener1<K, T>): this {\n const wrapped = (...args: any[]) => {\n // @ts-expect-error\n this.off(eventName, wrapped);\n listener(...args);\n };\n\n // @ts-expect-error\n this.on(eventName, wrapped);\n\n return this;\n }\n\n off<K>(eventName: Key<K, T>, listener: Listener1<K, T>): this {\n const set = this.#listeners.get(eventName);\n\n if (set) {\n set.delete(listener);\n\n if (set.size === 0) {\n this.#listeners.delete(eventName);\n }\n }\n\n return this;\n }\n\n removeAllListeners(eventName?: Key<unknown, T>): this {\n if (eventName === undefined) {\n this.#listeners.clear();\n return this;\n }\n\n this.#listeners.delete(eventName);\n\n return this;\n }\n}\n","import { SimpleEventEmitter } from '../SimpleEventEmitter';\n\n/**\n * A basic queue implementation with a limit and event-based synchronization.\n *\n * This class allows you to put items into a queue and retrieve them asynchronously.\n * If the queue exceeds a specified limit, the `put` operation will wait until an item is retrieved,\n * and similarly, the `get` operation will wait if there are no items available in the queue.\n *\n * @example\n * // Create a queue with a limit of 10 items\n * const sendQueue = new Queue<any>(10);\n *\n * // Add items to the queue\n * sendQueue.put({ url: '/api/message.send', params: { text: 'hello' } });\n * sendQueue.put({ url: '/api/message.send', params: { text: 'how are you?' } });\n *\n * // Retrieve and process items from the queue asynchronously\n * while (true) {\n * const req = await sendQueue.get();\n * http.post(req.url, { body: req.params });\n * }\n *\n * @param limit - Optional maximum number of items the queue can hold. If not provided, the queue has no limit.\n *\n * @group Promise\n */\nexport class Queue<T> {\n items: T[] = [];\n #limit?: number;\n #events = new SimpleEventEmitter();\n\n constructor(limit?: number) {\n this.#limit = limit;\n }\n\n async get(): Promise<T> {\n if (this.items.length === 0) {\n await SimpleEventEmitter.once(this.#events, 'put');\n }\n const item = this.items.shift()!;\n this.#events.emit('get');\n return item;\n }\n\n async put(item: T) {\n if (this.#limit && this.items.length >= this.#limit) {\n await SimpleEventEmitter.once(this.#events, 'get');\n }\n this.items.push(item);\n this.#events.emit('put');\n }\n}\n","import { Queue } from '../Queue';\n\n/**\n * An asynchronous queue implementation that can be iterated using an async iterator.\n * It allows items to be added (`put`) and consumed asynchronously, with the ability to signal when the queue is closed.\n * This class supports async iteration, enabling users to process items as they become available, and provides an end signal once the queue is closed.\n *\n * @example\n * const textStream = new AsyncIterableQueue<string>();\n *\n * const readTimer = setInterval(() => {\n * textStream.put('Hey ' + Math.random());\n * }, 100);\n *\n * setTimeout(() => {\n * textStream.close();\n * clearInterval(readTimer);\n * });\n *\n * for await (const text of textStream) {\n * console.log('text part', { text });\n * }\n *\n * @group Promise\n */\nexport class AsyncIterableQueue<T> implements AsyncIterable<T> {\n private _queue: Queue<T | typeof AsyncIterableQueue.QUEUE_END_MARKER>;\n private _closed = false;\n private static readonly QUEUE_END_MARKER = Symbol('QUEUE_END_MARKER');\n\n constructor() {\n this._queue = new Queue<T | typeof AsyncIterableQueue.QUEUE_END_MARKER>();\n }\n\n get closed(): boolean {\n return this._closed;\n }\n\n put(item: T): void {\n if (this._closed) {\n throw new Error('Queue is closed');\n }\n this._queue.put(item);\n }\n\n close(): void {\n if (this._closed) return;\n\n this._closed = true;\n this._queue.put(AsyncIterableQueue.QUEUE_END_MARKER);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: async (): Promise<IteratorResult<T>> => {\n if (this._closed && this._queue.items.length === 0) {\n return { value: undefined, done: true };\n }\n const item = await this._queue.get();\n if (item === AsyncIterableQueue.QUEUE_END_MARKER && this._closed) {\n return { value: undefined, done: true };\n }\n return { value: item as T, done: false };\n },\n };\n }\n}\n","import { nextTickIteration } from '../nextTickIteration';\n\n/**\n * Asynchronously maps over an array, applying the provided callback function to each element,\n * with support for parallel processing of array elements.\n *\n * This function is similar to `arr.map()`, but allows asynchronous operations\n * for each array element, helping to avoid blocking the event loop when processing large arrays.\n * It processes the array elements in batches, providing support for concurrency, meaning multiple\n * elements can be processed in parallel.\n *\n * **Note**: The callback function can return either a value or a `Promise`. If a `Promise` is returned,\n * `asyncMap` will wait for it to resolve before moving on to the next iteration.\n *\n * @param array - The array to iterate over.\n * @param callbackfn - The async callback function to apply to each element.\n * This function takes three parameters:\n * - `value`: The current element of the array.\n * - `index`: The index of the current element in the array.\n * - `array`: The array being processed.\n * The callback should return either a transformed value (`U`) or a `Promise<U>`.\n *\n * @param {Object} [options] - Optional configuration for controlling concurrency.\n * @param {number} [options.concurrency=1] - The number of items to process concurrently. Default is 1 (sequential processing).\n *\n * @returns {Promise<U[]>} A promise that resolves to an array of transformed elements.\n *\n * @example\n * const users = Array.from({ length: 100 }).map((_, idx) => ({\n * id: idx,\n * name: 'User: ' + (idx + 1)\n * }));\n *\n * async function withUserClients() {\n * return await asyncMap(users, async (user) => {\n * const clients = await db.clients.find({ user: user.id });\n *\n * return { ...user, clients };\n * }, { concurrency: 10 });\n * }\n *\n * Promise.all([\n * withUserClients(),\n * otherUsefulTask(),\n * ]).then(console.log);\n *\n * @group Promise\n */\nexport async function asyncMap<T, U>(\n array: T[],\n callbackfn: (value: T, index: number, array: Array<T>) => Promise<U> | U,\n { concurrency = 1 } = {},\n): Promise<Array<U>> {\n let result: U[] = [];\n\n concurrency = Math.max(concurrency, 1);\n\n const cooldown = nextTickIteration(10);\n\n let i = 0;\n\n const handle = (value: T, index: number) => {\n return callbackfn(value, i + index, array);\n };\n\n while (i < array.length) {\n await cooldown();\n\n const batch = await Promise.all(\n array.slice(i, i + concurrency).map(handle),\n );\n\n result = result.concat(batch);\n i += batch.length;\n }\n\n return result;\n}\n","import { catchError } from '@/catchError';\nimport { toError } from '@/toError';\nimport type { AnyFunction } from '@/types';\n\n/**\n * A custom promise that supports cancellation.\n * Allows users to cancel the promise operation before it completes, avoiding unnecessary execution.\n * This class provides a mechanism to perform asynchronous tasks that can be stopped midway by calling the `cancel` method.\n *\n * @example\n * const task = new CancellablePromise<void>(async (resolve, reject, onCancel) => {\n * let cancelled = false;\n * onCancel(() => {\n * cancelled = true; // Define the cancellation logic here\n * });\n *\n * while (!cancelled) {\n * await delay(1000); // Simulate async work\n * console.log('handling task...');\n * }\n * });\n *\n * // Cancel the task after 5 seconds\n * setTimeout(() => task.cancel(), 5000);\n *\n * await task; // This will be cancelled before it completes\n * console.log('Task completed or cancelled');\n *\n * @group Promise\n */\nexport class CancellablePromise<T> implements Promise<T> {\n #promise: Promise<T>;\n #cancelFns: (() => void)[];\n #isCancelled: boolean = false;\n #error: Error | null = null;\n\n constructor(\n executor: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: any) => void,\n onCancel: (cancelFn: () => void) => void,\n ) => void,\n ) {\n this.#cancelFns = [];\n this.#promise = new Promise<T>((resolve, reject) => {\n executor(\n resolve,\n reason => {\n this.#error = toError(reason, 'Unknown rejection reason.');\n reject(reason);\n },\n (fn: AnyFunction) => {\n this.#cancelFns.push(fn);\n },\n );\n });\n }\n\n get [Symbol.toStringTag](): string {\n return (\n this.#promise[Symbol.toStringTag] +\n (this.isCancelled ? ' (Cancelled)' : '')\n );\n }\n\n get isCancelled(): boolean {\n return this.#isCancelled;\n }\n\n get error(): Error | null {\n return this.#error;\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | Promise<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | Promise<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.#promise.then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | Promise<TResult>) | null,\n ): Promise<T | TResult> {\n return this.#promise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.#promise.finally(onfinally);\n }\n\n cancel(): void {\n if (this.#isCancelled) return;\n\n this.#isCancelled = true;\n\n for (const fn of this.#cancelFns) {\n catchError(fn);\n }\n }\n\n static from<T>(promise: Promise<T>): CancellablePromise<T> {\n return new CancellablePromise<T>((resolve, reject) => {\n promise.then(resolve).catch(reject);\n });\n }\n}\n","import type { AnyFunction } from '@/types';\n\ntype NoneToVoidFunction = () => void;\n\nconst FAST_RAF_TIMEOUT_FALLBACK_MS = 300;\n\nconst defaultWindow = (globalThis as any)?.window as Window | undefined;\nconst raf =\n defaultWindow?.requestAnimationFrame ||\n ((cb: AnyFunction) => setTimeout(cb, 0));\n\nlet fastRafCallbacks: Set<NoneToVoidFunction> | undefined;\nlet fastRafFallbackCallbacks: Set<NoneToVoidFunction> | undefined;\nlet fastRafFallbackTimeout: any;\n\n/**\n * Stacks callbacks for `requestAnimationFrame` into a single execution call.\n *\n * This function allows multiple `fastRaf` calls to be batched into a single animation frame callback.\n * The callbacks are executed in the same frame, one after the other. Additionally, if `withTimeoutFallback` is true,\n * the callbacks will be executed after a fallback timeout if `requestAnimationFrame` is not available.\n * If called from within another RAF callback, the execution might be immediate.\n *\n * @example\n * // Callbacks will be executed in the same `requestAnimationFrame` cycle\n * fastRaf(() => console.log(1));\n * fastRaf(() => console.log(2));\n *\n * // Output:\n * // 1\n * // 2\n *\n * @param callback The callback function to be executed in the next `requestAnimationFrame`.\n * @param [withTimeoutFallback=false] Optional flag to execute callbacks after a fallback timeout if `requestAnimationFrame` is not available.\n * @group Promise\n */\nexport function fastRaf(\n callback: NoneToVoidFunction,\n withTimeoutFallback = false,\n) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = new Set([callback]);\n\n raf(() => {\n const currentCallbacks = fastRafCallbacks!;\n\n fastRafCallbacks = undefined;\n fastRafFallbackCallbacks = undefined;\n\n if (fastRafFallbackTimeout) {\n clearTimeout(fastRafFallbackTimeout);\n fastRafFallbackTimeout = undefined;\n }\n\n currentCallbacks.forEach(cb => cb());\n });\n } else {\n fastRafCallbacks.add(callback);\n }\n\n if (withTimeoutFallback) {\n if (!fastRafFallbackCallbacks) {\n fastRafFallbackCallbacks = new Set([callback]);\n } else {\n fastRafFallbackCallbacks.add(callback);\n }\n\n if (!fastRafFallbackTimeout) {\n fastRafFallbackTimeout = setTimeout(() => {\n const currentTimeoutCallbacks = fastRafFallbackCallbacks!;\n\n if (fastRafCallbacks) {\n currentTimeoutCallbacks.forEach(\n fastRafCallbacks.delete,\n fastRafCallbacks,\n );\n }\n fastRafFallbackCallbacks = undefined;\n\n if (fastRafFallbackTimeout) {\n clearTimeout(fastRafFallbackTimeout);\n fastRafFallbackTimeout = undefined;\n }\n\n currentTimeoutCallbacks.forEach(cb => cb());\n }, FAST_RAF_TIMEOUT_FALLBACK_MS);\n }\n }\n}\n\nexport function rafPromise() {\n return new Promise<void>(resolve => {\n fastRaf(resolve);\n });\n}\n","import { AppError } from '@/errors/AppError';\nimport { isFunction, isPromise } from '@/is';\nimport type { Awaitable } from '@/types';\n\n/**\n * Throws an error if the provided promise or callback is not resolved within the specified timeout period.\n *\n * This function can be used to ensure that an asynchronous operation does not take too long to complete.\n * If the operation exceeds the specified time limit, the provided `timeoutError` is thrown.\n *\n * @example\n * // Example usage: Throw an error if no response is received within 1 second\n * await timeout(\n * 1000, // Timeout duration in milliseconds\n * (signal) => {\n * const account = await http.get('/api/users/me');\n *\n * if (signal.aborted) return; // If the timeout occurs, abort the operation\n *\n * const statistics = await http.get('/api/users/me/statistics');\n *\n * return { ...account, statistics };\n * },\n * new Error('Request account timeout') // Custom error to throw on timeout\n * );\n *\n * @param ms - The maximum time (in milliseconds) to wait for the promise or callback to resolve.\n * @param promiseOrCallback - The asynchronous operation to execute. This can either be:\n * - A `Promise` that will be awaited until completion, or\n * - A function that takes an `AbortSignal` and returns a `Promise` or a value.\n * @param timeoutError - The error that will be thrown if the timeout is reached before the promise or callback resolves.\n * (Defaults to `AppError(408)` if not provided).\n * @returns A `Promise` that resolves with the result of the provided `promiseOrCallback`, or rejects with the `timeoutError` if the timeout occurs.\n *\n * @throws {Error} - Throws the `timeoutError` if the operation exceeds the specified timeout.\n *\n * @group Promise\n */\nexport function timeout<T = any>(\n ms: number,\n promiseOrCallback: Promise<T> | ((abortSignal: AbortSignal) => Awaitable<T>),\n timeoutError: any = new AppError(408),\n): Promise<T> {\n const abortController = new AbortController();\n\n let taskResult: any;\n\n if (isFunction(promiseOrCallback)) {\n taskResult = promiseOrCallback(abortController.signal);\n } else if (isPromise(promiseOrCallback)) {\n taskResult = promiseOrCallback;\n } else {\n throw new TypeError(\n 'Expected promise or callback as second argument, received: ' +\n String(promiseOrCallback),\n );\n }\n\n if (!isPromise(taskResult)) {\n return Promise.resolve(taskResult);\n }\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n return Promise.race([\n taskResult,\n new Promise((_, reject) => {\n timer = setTimeout(() => {\n abortController.abort();\n reject(timeoutError);\n }, ms);\n }),\n ]).finally(() => {\n timer && clearTimeout(timer);\n timer = undefined;\n }) as Promise<T>;\n}\n","/**\n * Converts the first character of string to upper case and the remaining to lower case.\n *\n * @template T - Literal type of the string.\n * @param {T} str - The string to be converted to uppercase.\n * @returns {Capitalize<T>} - The capitalized string.\n *\n * @example\n * const result = capitalize('fred') // returns 'Fred'\n * const result2 = capitalize('FRED') // returns 'Fred'\n *\n * @group Strings\n */\n\nexport function capitalize<T extends string>(str: T): Capitalize<T> {\n return (str.charAt(0).toUpperCase() +\n str.slice(1).toLowerCase()) as Capitalize<T>;\n}\n\ntype Capitalize<T extends string> = T extends `${infer F}${infer R}`\n ? `${Uppercase<F>}${Lowercase<R>}`\n : T;\n","import { isString } from '@/is';\n\n/**\n * Regular expression pattern to split strings into words for various case conversions\n *\n * This pattern matches sequences of characters in a string, considering the following cases:\n * - Sequences of two or more uppercase letters followed by an uppercase letter and lowercase letters or digits (for acronyms)\n * - Sequences of one uppercase letter optionally followed by lowercase letters and digits\n * - Single uppercase letters\n * - Sequences of digits\n * - Emojis and other Unicode characters\n *\n * The resulting match can be used to convert camelCase, snake_case, kebab-case, and other mixed formats into\n * a consistent format like snake case. It also supports emojis and other Unicode characters.\n *\n * @example\n * const matches = 'camelCaseHTTPRequest🚀'.match(CASE_SPLIT_PATTERN);\n * // matches: ['camel', 'Case', 'HTTP', 'Request', '🚀']\n *\n * @group Strings\n */\nconst CASE_SPLIT_PATTERN =\n /\\p{Lu}?\\p{Ll}+|[0-9]+|\\p{Lu}+(?!\\p{Ll})|\\p{Emoji_Presentation}|\\p{Extended_Pictographic}|\\p{L}+/gu;\n\nexport function getWords(str?: string): string[] {\n if (!isString(str)) return [];\n return Array.from(str.match(CASE_SPLIT_PATTERN) ?? []);\n}\n","import { capitalize } from '../capitalize';\nimport { getWords } from '../getWords';\n\n/**\n * Converts a string to camel case.\n *\n * Camel case is the naming convention in which the first word is written in lowercase and\n * each subsequent word begins with a capital letter, concatenated without any separator characters.\n *\n * @param {string} str - The string that is to be changed to camel case.\n * @returns {string} - The converted string to camel case.\n *\n * @example\n * const convertedStr1 = camelCase('camelCase') // returns 'camelCase'\n * const convertedStr2 = camelCase('some whitespace') // returns 'someWhitespace'\n * const convertedStr3 = camelCase('hyphen-text') // returns 'hyphenText'\n * const convertedStr4 = camelCase('HTTPRequest') // returns 'httpRequest'\n * const convertedStr5 = camelCase('Keep unicode 😅') // returns 'keepUnicode😅'\n *\n * @group Strings\n */\nexport function camelCase(str: string): string {\n const words = getWords(str);\n\n if (words.length === 0) {\n return '';\n }\n\n const [first, ...rest] = words;\n\n return `${first.toLowerCase()}${rest.map(word => capitalize(word)).join('')}`;\n}\n","/**\n * Converts a value to a string and appends a specified unit to it.\n * If the value is already a string, it returns it as is, and if the value is a number,\n * it appends the specified unit (defaults to 'px'). If the value is null, undefined, or an empty string, it returns `undefined`.\n *\n * @example\n * // Adding 'px' unit to a number\n * convertToUnit(10, 'px'); // '10px';\n *\n * // Adding 'em' unit to a number\n * convertToUnit(5, 'em'); // '5em';\n *\n * // Returning a string as is if it's not a number\n * convertToUnit('100%', 'px'); // '100%';\n *\n * // Handling null, undefined, and empty string\n * convertToUnit(null); // undefined;\n * convertToUnit(''); // undefined;\n *\n * @param str - The value to convert, can be a number, string, null, or undefined.\n * @param unit - The unit to append to the value. Defaults to 'px'.\n * @returns The value with the unit appended, or `undefined` if the input is null, undefined, or an empty string.\n *\n * @group Strings\n */\nexport function convertToUnit(\n str: string | number | null | undefined,\n unit = 'px',\n): string | undefined {\n if (str == null || str === '') {\n return undefined;\n } else if (isNaN(+str!)) {\n return String(str);\n } else {\n return `${Number(str)}${unit}`;\n }\n}\n","const htmlEscapes: Record<number, string> = Object.freeze({\n 38: '&', // &\n 60: '<', // <\n 62: '>', // >\n 34: '"', // \"\n 39: ''', // '\n});\n\n/**\n * Sanitizes a string by escaping HTML syntax to prevent XSS (Cross-site scripting) attacks.\n * Converts special HTML characters like `<`, `>`, `&`, etc., into their corresponding HTML entities.\n *\n * @example\n * // Escaping HTML tags to prevent HTML injection\n * escapeHtml('<b>Strong</b> man.'); // '<b>Strong</b> man.'\n *\n * // Escaping other HTML special characters\n * escapeHtml('<script>alert(\"XSS\")</script>'); // '<script>alert("XSS")</script>'\n *\n * @param unsafe - The string to be sanitized (escaped).\n * @returns A sanitized string with HTML special characters replaced by their corresponding HTML entities.\n *\n * @group Strings\n */\nexport function escapeHtml(unsafe: string) {\n if (typeof unsafe !== 'string') {\n return '';\n }\n\n let result = '';\n let strLen = unsafe.length;\n let char: number;\n\n for (let idx = 0; idx < strLen; idx++) {\n char = unsafe.charCodeAt(idx);\n result += htmlEscapes[char] || String.fromCharCode(char);\n }\n\n return result;\n}\n","/**\n * Sanitizes a string by removing all non-numeric characters, leaving only digits.\n * Useful for extracting numeric values from strings, such as when you want to\n * extract a number from a string containing units or other non-numeric text.\n *\n * @example\n * // Extracts numeric values from a string with units\n * escapeNumeric('use 320px'); // '320'\n *\n * // Strips out non-numeric characters from a string\n * escapeNumeric('USD 1,000.50'); // '100050'\n *\n * // Returns undefined if no numeric characters are found\n * escapeNumeric('No numbers here!'); // undefined\n *\n * @param str - The input string to be sanitized.\n * @returns A string containing only the numeric characters, or `undefined` if no numbers are found.\n *\n * @group Strings\n */\nexport function escapeNumeric(str: string) {\n const result = String(str).replace(/\\D/g, '');\n\n if (!result.length) {\n return undefined;\n }\n\n return result;\n}\n","/**\n * Escapes special characters in a string to safely use it as a literal pattern in a regular expression.\n * This function ensures that any characters that would otherwise have a special meaning in a regex\n * (such as `*`, `+`, `?`, etc.) are properly escaped, allowing them to be used as normal characters\n * in the pattern.\n *\n * @example\n * // Escapes special characters in the string '[a|b]'\n * escapeRegExp('[a|b]'); // '\\\\[a\\\\|b\\\\]'\n *\n * @example\n * // Use the function to safely create a regex from user input\n * const searchTerms = 'Andrew L.';\n * const searchReg = new RegExp(escapeRegExp(searchTerms), 'i');\n * const searchResult = users.find(v => searchReg.test(v.name));\n *\n * @param str - The string to escape for use in a regular expression.\n * @returns The input string with all special regex characters escaped.\n *\n * @group Strings\n */\nexport function escapeRegExp(str: string) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version f8312f3 12.03.2022\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji: string) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0\n ? rawEmoji.replace(vs16RegExp, '')\n : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n\nexport default /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f|\\u2696\\ufe0f|\\u2708\\ufe0f|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)((?:\\ud83c[\\udffb-\\udfff]|\\ufe0f)\\u200d[\\u2640\\u2642]\\ufe0f)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f\\u200d\\u26a7\\ufe0f|\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f|\\u2764\\ufe0f\\u200d\\ud83d\\udd25|\\u2764\\ufe0f\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f|\\ud83e\\uddde\\u200d\\u2640\\ufe0f|\\ud83e\\uddde\\u200d\\u2642\\ufe0f|\\ud83e\\udddf\\u200d\\u2640\\ufe0f|\\ud83e\\udddf\\u200d\\u2642\\ufe0f|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import { TWEMOJI_REGEX } from '../twemojiRegex';\n\n/**\n * Checks if the provided text is a single emoji.\n * The function uses a regular expression to match the emoji and ensures that the entire string is a valid single emoji.\n *\n * @param {unknown} text - The input value to check.\n * @returns {boolean} - Returns `true` if the input is a single emoji, otherwise `false`.\n *\n * @example\n * isOneEmoji(\"😊\"); // Returns: true\n * isOneEmoji(\"Hello 😊\"); // Returns: false\n * isOneEmoji(\"😎\"); // Returns: true\n * isOneEmoji(\"👨👩👧👦\"); // Returns: true (family emoji with multiple characters)\n * isOneEmoji(\"not an emoji\"); // Returns: false\n *\n * @group Strings\n */\nexport function isOneEmoji(text: unknown): text is string {\n return !!(\n typeof text === 'string' &&\n text &&\n (text.match(TWEMOJI_REGEX) || [])[0]?.length === text.length\n );\n}\n","import { isString } from '@/is';\nimport { isOneEmoji } from '../isOneEmoji';\n\nconst IGNORED_TITLES = Object.freeze(\n new Set([\n 'dr.',\n 'mr.',\n 'mrs.',\n 'miss',\n 'ms.',\n 'prof.',\n 'sir',\n 'rev.',\n 'hon.',\n ]),\n);\n\n/**\n * Extracts the initials from a full name while ignoring titles or prefixes (e.g., Dr., Mr., Mrs.),\n * as well as any words starting with special characters (e.g., !, @, #).\n * Handles names with multiple words, ignores special characters, and ensures proper handling of Unicode characters.\n *\n * @param {string} fullName - The full name from which to extract initials.\n * @returns {string} - The extracted initials in uppercase, or an empty string if the input is invalid.\n *\n * @example\n * getInitials(\"John Doe\");\n * // Returns: \"JD\"\n *\n * @example\n * getInitials(\"Dr. Alice Wonderland\");\n * // Returns: \"AW\"\n *\n * @example\n * getInitials(\"José María de la Cruz\");\n * // Returns: \"JC\"\n *\n * @example\n * getInitials(\"Mr. Albert Einstein\");\n * // Returns: \"AE\"\n *\n * @example\n * getInitials(\"Invalid Name\");\n * // Returns: \"IN\"\n *\n * @example\n * getInitials(\"\");\n * // Returns: \"\"\n *\n * @group Strings\n */\nexport function getInitials(fullName: string) {\n if (!isString(fullName)) return '';\n\n let [first, ...rest] = fullName\n .replace(/\\s{2,}/g, ' ')\n .replace(/[,+/#!$@%^&*;:{}=\\-_`~()]/g, '')\n .trim()\n .split(' ')\n .filter(word => !IGNORED_TITLES.has(word.toLowerCase()))\n .map(v => v.replaceAll('.', '').trim())\n .filter(Boolean);\n\n let last = rest[rest.length - 1];\n\n if (rest.length > 1) {\n if (isOneEmoji(first)) {\n first = rest[0];\n } else if (isOneEmoji(last)) {\n last = rest[0];\n }\n }\n\n return [first, last]\n .filter(Boolean)\n .map((letter = '') => [...letter.toUpperCase()][0]) // We use the spread operator to support Unicode characters\n .join('');\n}\n","const byteToHex: string[] = [];\n\nfor (let n = 0; n <= 0xff; ++n) {\n const hexOctet = n.toString(16).padStart(2, '0');\n byteToHex.push(hexOctet);\n}\n\n/**\n * Encodes a `Uint8Array` or a number array into a hexadecimal string.\n * Each byte of the array is converted to its corresponding two-character hex representation.\n *\n * This function is useful when you need to represent binary data as a string of hexadecimal characters.\n *\n * @example\n * console.log(hex(new Uint8Array([255]))); // 'ff'\n * console.log(hex([255, 0, 128])); // 'ff0080'\n *\n * @param value - The array to be converted, either a `Uint8Array` or a number array.\n * @returns A string of hexadecimal characters representing the array's byte values.\n *\n * @group Strings\n */\nexport function hex(value: Uint8Array | number[]) {\n const buff = Array.isArray(value) ? new Uint8Array(value) : value;\n const hexOctets = new Array(buff.length);\n\n for (let i = 0; i < buff.length; ++i) {\n hexOctets[i] = byteToHex[buff[i]];\n }\n\n return hexOctets.join('');\n}\n","/**\n * Converts a two-letter ISO country code (e.g., 'US') to the corresponding flag emoji.\n * If the input is not a valid two-letter country code, it returns the original string.\n *\n * @param {string} iso - The two-letter ISO country code.\n * @returns {string} - The corresponding country flag emoji or the original input if it's invalid.\n *\n * @example\n * isoToFlagEmoji(\"US\"); // Returns: 🇺🇸\n * isoToFlagEmoji(\"GB\"); // Returns: 🇬🇧\n * isoToFlagEmoji(\"DE\"); // Returns: 🇩🇪\n * isoToFlagEmoji(\"xyz\"); // Returns: \"xyz\" (invalid code)\n *\n * @group Strings\n */\nexport function isoToFlagEmoji(iso: string) {\n const code = iso.toUpperCase();\n\n if (!/^[A-Z]{2}$/.test(code)) return iso;\n const codePoints = [...code].map(c => c.codePointAt(0)! + 127397);\n return String.fromCodePoint(...codePoints);\n}\n","import { getWords } from '../getWords';\n\n/**\n * Converts a string to kebab case.\n *\n * Kebab case is the naming convention in which each word is written in lowercase and separated by a dash (-) character.\n *\n * @param {string} str - The string that is to be changed to kebab case.\n * @returns {string} - The converted string to kebab case.\n *\n * @example\n * const convertedStr1 = kebabCase('camelCase') // returns 'camel-case'\n * const convertedStr2 = kebabCase('some whitespace') // returns 'some-whitespace'\n * const convertedStr3 = kebabCase('hyphen-text') // returns 'hyphen-text'\n * const convertedStr4 = kebabCase('HTTPRequest') // returns 'http-request'\n *\n * @group Strings\n */\nexport function kebabCase(str: string): string {\n const words = getWords(str);\n return words.map(word => word.toLowerCase()).join('-');\n}\n","import { getWords } from '../getWords';\n\n/**\n * Converts a string to lower case.\n *\n * Lower case is the naming convention in which each word is written in lowercase and separated by an space ( ) character.\n *\n * @param {string} str - The string that is to be changed to lower case.\n * @returns {string} - The converted string to lower case.\n *\n * @example\n * const convertedStr1 = lowerCase('camelCase') // returns 'camel case'\n * const convertedStr2 = lowerCase('some whitespace') // returns 'some whitespace'\n * const convertedStr3 = lowerCase('hyphen-text') // returns 'hyphen text'\n * const convertedStr4 = lowerCase('HTTPRequest') // returns 'http request'\n *\n * @group Strings\n */\nexport const lowerCase = (str?: string): string => {\n return getWords(str)\n .map(word => word.toLowerCase())\n .join(' ');\n};\n","import { getWords } from '../getWords';\n\n/**\n * Masks the middle characters of each word in the given string, leaving the first and last characters intact.\n * The characters in the middle of each word are replaced by a specified masking character (default is `*`).\n *\n * ⚠️ If the provided value is not a valid string, the function returns an empty string.\n *\n * **Note**: This function does not perform any validation or checks for non-alphabetic characters within words.\n * It simply masks all characters between the first and last character of each word.\n *\n * @param {string} value - The input string containing words to be masked.\n * @param {string} [withChar='*'] - The character used to replace the middle characters of each word. Default is `*`.\n *\n * @returns {string} The input string with middle characters of words masked, or an empty string if the input is invalid.\n *\n * @example\n * maskingWords('hello world'); // 'h**o w**d'\n * maskingWords('John Doe'); // 'J**n D**e'\n * maskingWords('a b c'); // '* * *'\n *\n * @group Strings\n */\nexport function maskingWords(value: string, withChar = '*'): string {\n return getWords(value)\n .map(word => {\n const len = word.length;\n\n if (len < 2) {\n return ''.padEnd(len, withChar);\n } else if (len < 3) {\n return word[0].padEnd(len, withChar);\n } else {\n return word[0].padEnd(len - 2, withChar) + word.at(-1);\n }\n })\n .join(' ');\n}\n","import { isString } from '@/is';\nimport { maskingWords } from '../maskingWords';\n\n/**\n * Masks part of the email address to provide a simple level of privacy.\n * The username part is partially masked with asterisks, while the domain remains intact.\n *\n * ⚠️ Returns an empty string if the provided value is invalid.\n *\n * @example\n * maskingEmail('andrew@gmail.com'); // 'a****w@gmail.com'\n * maskingEmail('user@domain.com'); // 'u***r@domain.com'\n * maskingEmail('invalidemail'); // ''\n *\n * @param value - The email address to be masked.\n * @returns The masked email address or an empty string if the value is invalid.\n *\n * @group Strings\n */\nexport function maskingEmail(value: string): string {\n if (!isString(value)) return '';\n\n const [username, host] = value.split('@', 2);\n\n if (!username || !host) return '';\n\n return `${maskingWords(username)}@${host}`;\n}\n","import { isString } from '@/is';\n\n/**\n * Masks part of a phone number to provide a simple level of privacy.\n * The function replaces digits in a specified range with a given character.\n * Supports formatted phone numbers (e.g., `(000) 000-11-11`).\n *\n * ⚠️ Returns an empty string if the provided value is invalid.\n *\n * @example\n * maskingPhone('+18000551100'); // '+18XXXXX1100'\n * maskingPhone('+18000551100', 2, 4, '*'); // '+18*****1100'\n * maskingPhone('+1 800-055-1100'); // '+1 8XX-XXX-1100'\n * maskingPhone('+1234567890', 3, 5, 'X'); // '+1XXX567890'\n *\n * @param value - The phone number to be masked.\n * @param [fromPosition=2] - The starting position from left side where masking begins (default is 2).\n * @param [toPosition=4] - The position from right side where masking ends (default is 4).\n * @param [withChar='X'] - The character used to replace digits (default is 'X').\n * @returns The masked phone number or an empty string if the value is invalid.\n *\n * @group Strings\n */\nexport function maskingPhone(\n value: string,\n fromPosition = 2,\n toPosition = 4,\n withChar = 'X',\n): string {\n if (!isString(value)) return '';\n\n const numbersAmount = value.replace(/\\D/g, '').length;\n const fromIdx = fromPosition - 1;\n\n let toIdx = numbersAmount - toPosition;\n\n if (toIdx <= 0) {\n toIdx = numbersAmount;\n }\n\n let i = -1;\n\n return value.replace(/\\d/g, char => {\n i++;\n return i > fromIdx && i < toIdx ? withChar : char;\n });\n}\n","import { timestamp } from '@/date/timestamp';\nimport { hex } from '../hex';\n\nlet index = Math.floor(Math.random() * 0xffffff);\n\nconst buffer = new Uint8Array(12);\n\n/**\n * Useful when you need to generate almost secure object id in browser\n *\n * Based on [bson](https://github.com/mongodb/js-bson/blob/main/src/objectid.ts)\n *\n * @example\n * const userId = objectId(); // '67350af7885ba34010c83859'\n *\n * @group Strings\n */\nexport function objectId(fromValue: number | Date = Date.now()): string {\n const value = timestamp(fromValue);\n const inc = getInc();\n\n buffer[0] = value >> 24;\n buffer[1] = value >> 16;\n buffer[2] = value >> 8;\n buffer[3] = value;\n\n buffer[4] = Math.floor(Math.random() * 256);\n buffer[5] = Math.floor(Math.random() * 256);\n buffer[6] = Math.floor(Math.random() * 256);\n buffer[7] = Math.floor(Math.random() * 256);\n buffer[8] = Math.floor(Math.random() * 256);\n\n buffer[11] = inc & 0xff;\n buffer[10] = (inc >> 8) & 0xff;\n buffer[9] = (inc >> 16) & 0xff;\n\n return hex(buffer);\n}\n\nfunction getInc(): number {\n return (index = (index + 1) % 0xffffff);\n}\n","import { getWords } from '../getWords';\n\n/**\n * Converts a string to snake case.\n *\n * Snake case is the naming convention in which each word is written in lowercase and separated by an underscore (_) character.\n *\n * @param {string} str - The string that is to be changed to snake case.\n * @returns {string} - The converted string to snake case.\n *\n * @example\n * const convertedStr1 = snakeCase('camelCase') // returns 'camel_case'\n * const convertedStr2 = snakeCase('some whitespace') // returns 'some_whitespace'\n * const convertedStr3 = snakeCase('hyphen-text') // returns 'hyphen_text'\n * const convertedStr4 = snakeCase('HTTPRequest') // returns 'http_request'\n *\n * @group Strings\n */\nexport const snakeCase = (str?: string): string => {\n return getWords(str)\n .map(word => word.toLowerCase())\n .join('_');\n};\n","import { capitalize } from '../capitalize';\nimport { getWords } from '../getWords';\n\n/**\n * Converts the first character of each word in a string to uppercase and the remaining characters to lowercase.\n *\n * Start case is the naming convention in which each word is written with an initial capital letter.\n * @param {string} str - The string to convert.\n * @returns {string} The converted string.\n *\n * @example\n * const result1 = startCase('hello world'); // result will be 'Hello World'\n * const result2 = startCase('HELLO WORLD'); // result will be 'Hello World'\n * const result3 = startCase('hello-world'); // result will be 'Hello World'\n * const result4 = startCase('hello_world'); // result will be 'Hello World'\n *\n * @group Strings\n */\nexport const startCase = (value?: string): string => {\n return getWords(value).map(capitalize).join(' ');\n};\n","const DEF_STR_ASSIGN_REGEXP = /\\{{([A-z-_. ]*)\\}}/g;\nconst DEF_STR_ASSIGN_METHOD = (obj: any, key: string) => obj[key];\n\n/**\n * Replaces placeholders in the input string with values from the provided object.\n * The placeholders are denoted by `{{ key }}` syntax, where `key` is a property name in the object.\n * The function optionally allows a custom method to handle how the values are retrieved from the object.\n *\n * @param {string} str - The string with placeholders to be replaced. Placeholders are in the form of `{{key}}`.\n * @param {T} obj - The object whose properties will be used to replace the placeholders in the string.\n * @param method - An optional custom method\n * to retrieve values from the object. The default method retrieves\n * the values by accessing the object property directly using the `key`.\n *\n * @returns {string} The string with placeholders replaced by the corresponding values from the object.\n *\n * @example\n * const context = { name: 'Andrew', age: 30 };\n * console.log(strAssign('Hey {{ name }}! You are {{ age }} years old.', context));\n * // Output: 'Hey Andrew! You are 30 years old.'\n *\n * @example\n * // Using a custom method\n * const context2 = { firstName: 'Andrew', lastName: 'L.' };\n * const customMethod = (obj, key) => {\n * if (key === 'name') {\n * return obj.firstName + ' ' + obj.lastName;\n * }\n * return obj[key];\n * };\n * console.log(strAssign('Hello {{ name }}!', context2, customMethod));\n * // Output: 'Hello Andrew L.!'\n *\n * @group Strings\n */\nexport function strAssign<T extends object>(\n str: string,\n obj: T,\n method: (obj: T, key: string) => any = DEF_STR_ASSIGN_METHOD,\n): string {\n return str.replace(DEF_STR_ASSIGN_REGEXP, (match, p1) => {\n const key = p1.trim();\n const value = method(obj, key);\n\n if (value === undefined || value === null) {\n return match;\n }\n\n return value;\n });\n}\n","/**\n * Truncates a string to the specified maximum length while preserving whole words\n * and appends ellipsis (`...`) if the string exceeds the maximum length.\n * Ensures that truncation does not occur if the difference is insignificant\n * (less than 5% of the original string length).\n *\n * @param {string} str - The input string to truncate.\n * @param {number} maxLength - The maximum allowed length for the string.\n * @param {number} insignificantThreshold - The insignificance threshold as a fraction of the original string length (default is 5%)\n * @returns {string} - The truncated string with ellipsis if applicable.\n *\n *\n * @example\n * // Basic truncation\n * truncate(\"This is a test string for truncation.\", 20);\n * // Returns: \"This is a test...\"\n *\n * @example\n * // No truncation needed as the string length is within the limit\n * truncate(\"Short string\", 20);\n * // Returns: \"Short string\"\n *\n * @example\n * // No truncation because the difference is insignificant\n * truncate(\"This string has an insignificant truncation.\", 40);\n * // Returns: \"This string has an insignificant truncation.\"\n *\n * @example\n * // Handles strings with no spaces gracefully\n * truncate(\"ThisStringHasNoSpacesButIsVeryLong\", 10);\n * // Returns: \"ThisString...\"\n *\n * @group Strings\n */\nexport function truncate(\n value: string,\n maxLength: number = 120,\n insignificantThreshold: number = 0.05,\n): string {\n if (!shouldTruncate(value, maxLength, insignificantThreshold)) {\n return value;\n }\n\n let truncated = value.slice(0, maxLength).trim();\n const lastSpace = truncated.lastIndexOf(' ');\n\n if (lastSpace > 0) {\n truncated = truncated.slice(0, lastSpace);\n }\n\n return `${truncated}...`;\n}\n\nfunction shouldTruncate(\n text: string,\n maxLength: number,\n insignificantThreshold: number,\n) {\n return text.length - maxLength > maxLength * insignificantThreshold;\n}\n","/**\n * Truncates the input string to the specified maximum length and appends an ellipsis (`...`)\n * if the string exceeds the maximum length. If the string is shorter than or equal to the\n * maximum length, it is returned unchanged.\n *\n * Unlike the `truncate` function, the result can be truncated in the middle of a word\n *\n * @param {string} value - The input string to truncate.\n * @param {number} maxLength - The maximum allowed length for the string (default is 30).\n * @returns {string} - The truncated string with ellipsis (`...`) if necessary.\n *\n * @example\n * wrapText(\"This is a long string\", 10); // Returns: \"This is a...\"\n * wrapText(\"Short text\", 20); // Returns: \"Short text\"\n * wrapText(\"Another long string example\", 15); // Returns: \"Another long...\"\n *\n * @group Strings\n */\nexport function wrapText(value: string, maxLength: number = 30) {\n if (value.length > maxLength) {\n return value.slice(0, maxLength) + '...';\n }\n\n return value;\n}\n"],"names":["result","keyBy","_get","toError","number","assert.ok","pointer","assert.number","_cloneDeep","_cloneDeepWith","value","_defaultsDeep","_set","_unset","onError","parseValue","defaultWindow","assert.notEmptyString"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/is.ts","../src/array/arrayable/arrayable.ts","../src/array/avg/avg.ts","../src/array/avgCircular/avgCircular.ts","../src/array/chunk/chunk.ts","../src/array/chunkSeries/chunkSeries.ts","../src/array/difference/difference.ts","../src/array/groupBy/groupBy.ts","../src/array/intersection/intersection.ts","../src/array/keyBy/keyBy.ts","../src/array/orderBy/compareAscending.ts","../src/array/orderBy/orderBy.ts","../src/array/shuffle/shuffle.ts","../src/array/SortedArray/SortedArray.ts","../src/array/sum/sum.ts","../src/array/uniq/uniq.ts","../src/array/union/union.ts","../src/object/get/get.ts","../src/array/uniqBy/uniqBy.ts","../src/assert/AssertionError.ts","../src/assert/assert.ts","../src/array/weightedRoundRobin/weightedRoundRobin.ts","../src/binary/base64/Base64Encoding.ts","../src/binary/base64/index.ts","../src/binary/base64ToBytes/base64ToBytes.ts","../src/binary/bigIntBytes/bigIntBytes.ts","../src/binary/bigIntFromBytes/bigIntFromBytes.ts","../src/binary/bytesToBase64/bytesToBase64.ts","../src/binary/compareBytes/compareBytes.ts","../src/binary/concatenateBytes/concatenateBytes.ts","../src/binary/uint16ToUint8/uint16ToUint8.ts","../src/binary/uint32ToUint8/uint32ToUint8.ts","../src/binary/uint8ToUint16/uint8ToUint16.ts","../src/binary/uint8ToUint32/uint8ToUint32.ts","../src/object/def/def.ts","../src/str/randomString/randomString.ts","../src/cache/createWithCache/utils.ts","../src/cache/createWithCache/createWithCache.ts","../src/cache/withCache/withCache.ts","../src/cache/FixedMap/utils.ts","../src/cache/FixedMap/FixedMap.ts","../src/cache/TimeBucket/TimeBucket.ts","../src/cache/withCacheBucket/withCacheBucket.ts","../src/cache/withCacheFixed/withCacheFixed.ts","../src/cache/LruCache/LruCache.ts","../src/cache/withCacheLRU/withCacheLRU.ts","../src/cache/dropCache/dropCache.ts","../src/cache/FixedWeakMap/FixedWeakMap.ts","../src/cache/isCached/isCached.ts","../src/cache/withCacheBucketBatch/withCacheBucketBatch.ts","../src/object/cleanEmpty/cleanEmpty.ts","../src/object/cleanObject/cleanObject.ts","../src/object/deepAssign/deepAssign.ts","../src/object/deepClone/deepClone.ts","../src/object/deepCloneWith/deepCloneWith.ts","../src/object/deepDefaults/deepDefaults.ts","../src/object/deepFreeze/deepFreeze.ts","../src/object/flagsToMap/flagsToMap.ts","../src/object/flatten/flatten.ts","../src/object/has/has.ts","../src/object/hasOwn/hasOwn.ts","../src/object/omit/omit.ts","../src/object/omitPrefixed/omitPrefixed.ts","../src/object/pick/pick.ts","../src/object/pickPrefixed/pickPrefixed.ts","../src/object/set/set.ts","../src/object/toMap/toMap.ts","../src/object/unflatten/unflatten.ts","../src/object/unset/unset.ts","../src/cache/withDeepClone/withDeepClone.ts","../src/cache/withPointerCache/withPointerCache.ts","../src/captureStackTrace.ts","../src/toError.ts","../src/catchError.ts","../src/num/clamp/clamp.ts","../src/colors/parseAlpha/parseAlpha.ts","../src/colors/hexToChannels/parseHEX.ts","../src/num/parsePercentage/parsePercentage.ts","../src/colors/utils.ts","../src/colors/hslToChannels/parseHSL.ts","../src/num/checkBitmask/checkBitmask.ts","../src/num/getRandomInt/getRandomInt.ts","../src/num/createRandomizer/createRandomizer.ts","../src/num/findMean/findMean.ts","../src/num/formatNumber/formatNumber.ts","../src/num/round2digits/round2digits.ts","../src/num/formatMoney/formatMoney.ts","../src/num/humanize/humanize.ts","../src/num/parseAllNumbers/parseAllNumbers.ts","../src/num/percentOf/percentOf.ts","../src/colors/rgbToChannels/parseRGB.ts","../src/colors/buildCssColor/buildCssColor.ts","../src/colors/hexToChannels/hexToChannels.ts","../src/colors/hslToChannels/hslToChannels.ts","../src/colors/rgbToChannels/rgbToChannels.ts","../src/colors/colorToChannels/colorToChannels.ts","../src/colors/alpha/alpha.ts","../src/colors/blendColors/blendColors.ts","../src/colors/channelsToHex/channelsToHex.ts","../src/colors/channelsToHSL/channelsToHSL.ts","../src/colors/channelsToRGB/channelsToRGB.ts","../src/colors/contrastRatio/contrastRatio.ts","../src/colors/cssVariable/cssVariable.ts","../src/colors/interpolateColor/interpolateColor.ts","../src/colors/luminance/luminance.ts","../src/colors/tintedTextColor/tintedTextColor.ts","../src/colors/index.ts","../src/crypto/crc32/crc32.ts","../src/date/isDateObject/isDateObject.ts","../src/date/createDateObject/createDateObject.ts","../src/date/isTimeObject/isTimeObject.ts","../src/date/createTimeObject/createTimeObject.ts","../src/date/createTimeSpan/TimeSpan.ts","../src/date/createTimeSpan/createTimeSpan.ts","../src/date/timestampMs/timestampMs.ts","../src/date/dateInDays/dateInDays.ts","../src/date/dateInSeconds/dateInSeconds.ts","../src/date/getRandomTime/getRandomTime.ts","../src/date/hmToSeconds/hmToSeconds.ts","../src/date/isTimeString/isTimeString.ts","../src/date/isTimeValue/isTimeValue.ts","../src/date/isValidWeekDay/isValidWeekDay.ts","../src/date/secondsToHm/secondsToHm.ts","../src/date/timeFromMinutes/timeFromMinutes.ts","../src/date/timestamp/timestamp.ts","../src/date/timestampToDate/timestampToDate.ts","../src/date/timeStringify/timeStringify.ts","../src/date/timeToMinutes/timeToMinutes.ts","../src/date/weeksInYear/weeksInYear.ts","../src/ejson/types.ts","../src/ejson/EJSON.ts","../src/ejson/createEJSON.ts","../src/ejson/EJSONStream.ts","../src/ejson/instance.ts","../src/ejson/createEJSONStream.ts","../src/env.ts","../src/errors/AppError.ts","../src/errors/BrowserAssertionError.ts","../src/files/getFileExtension/getFileExtension.ts","../src/str/hasProtocol/hasProtocol.ts","../src/files/getFileName/getFileName.ts","../src/files/getMostSpecificPaths/getMostSpecificPaths.ts","../src/files/humanFileSize/humanFileSize.ts","../src/function/debounce/debounce.ts","../src/function/execResult.ts","../src/function/typeOf/typeOf.ts","../src/function/qs/qs.ts","../src/promise/defer/defer.ts","../src/promise/fastIdle/fastIdle.ts","../src/promise/delay/delay.ts","../src/function/retryOnError/retryOnError.ts","../src/function/throttle/throttle.ts","../src/str/sprintf/sprintf.ts","../src/logger.ts","../src/promise/asyncFilter/asyncFilter.ts","../src/promise/nextTickIteration/nextTickIteration.ts","../src/promise/asyncFind/asyncFind.ts","../src/promise/asyncForEach/asyncForEach.ts","../src/promise/SimpleEventEmitter/SimpleEventEmitter.ts","../src/promise/Queue/Queue.ts","../src/promise/AsyncIterableQueue/AsyncIterableQueue.ts","../src/promise/asyncMap/asyncMap.ts","../src/promise/CancellablePromise/CancellablePromise.ts","../src/promise/fastRaf/fastRaf.ts","../src/promise/timeout/timeout.ts","../src/str/capitalize/capitalize.ts","../src/str/getWords/getWords.ts","../src/str/camelCase/camelCase.ts","../src/str/convertToUnit/convertToUnit.ts","../src/str/escapeHtml/escapeHtml.ts","../src/str/escapeNumeric/escapeNumeric.ts","../src/str/escapeRegExp/escapeRegExp.ts","../src/str/twemojiRegex/twemojiRegex.ts","../src/str/isOneEmoji/isOneEmoji.ts","../src/str/getInitials/getInitials.ts","../src/str/hex/hex.ts","../src/str/isoToFlagEmoji/isoToFlagEmoji.ts","../src/str/kebabCase/kebabCase.ts","../src/str/lowerCase/lowerCase.ts","../src/str/maskingWords/maskingWords.ts","../src/str/maskingEmail/maskingEmail.ts","../src/str/maskingPhone/maskingPhone.ts","../src/str/objectId/objectId.ts","../src/str/snakeCase/snakeCase.ts","../src/str/startCase/startCase.ts","../src/str/strAssign/strAssign.ts","../src/str/truncate/truncate.ts","../src/str/wrapText/wrapText.ts"],"sourcesContent":["import type { Primitive } from './types';\n\n/**\n * Determines if the window object is available in the global scope\n *\n * @group Predicates\n */\nexport const isClient = typeof (globalThis as any)?.window !== 'undefined';\n\n/**\n * Returns `true` when value is not `undefined`\n * @group Predicates\n */\nexport const isDef = <T = any>(val?: T): val is T => typeof val !== 'undefined';\n\nconst toString = Object.prototype.toString;\n\n/**\n * Checks if the given value is a `null` or `undefined`\n * @group Predicates\n */\nexport function isNullOrUndefined(value: unknown): value is undefined | null {\n return value === null || value === undefined;\n}\n\n/**\n * Checks if the given value is a `bigint`\n * @group Predicates\n */\nexport const isBigInt = (val: any): val is bigint => typeof val === 'bigint';\n\n/**\n * Checks if the given value is a `boolean`\n * @group Predicates\n */\nexport const isBoolean = (val: any): val is boolean => typeof val === 'boolean';\n\n/**\n * Checks if the given value is a `function`\n * @group Predicates\n */\nexport const isFunction = <T extends Function>(val: any): val is T =>\n typeof val === 'function';\n\n/**\n * Checks if the given value is a `number`\n *\n * @example\n * console.log(isNumber(123)); // true\n * console.log(isNumber('abc')); // false\n * console.log(isNumber(NaN)); // false\n *\n * @group Predicates\n */\nexport const isNumber = (val: any): val is number =>\n typeof val === 'number' && !isNaN(val);\n\n/**\n * Checks if the given value is a `Infinity` number.\n *\n * @example\n * console.log(isInfinity(123)); // false\n * console.log(isNumber(Infinity)); // true\n * console.log(isNumber(-Infinity)); // true\n *\n * @group Predicates\n */\nexport const isInfinity = (val: any): val is number =>\n val === Infinity || val === -Infinity;\n\n/**\n * Checks if the given value is a `string`\n * @group Predicates\n */\nexport const isString = (val: unknown): val is string =>\n typeof val === 'string';\n\n/**\n * Checks if the given value is a `object`\n * @group Predicates\n */\nexport const isObject = (val: any): val is object =>\n toString.call(val) === '[object Object]';\n\n/**\n * Checks if the given value is a plain `object`\n * @group Predicates\n */\nexport const isPlainObject = (val: any): val is object => {\n let ctor, prot;\n\n if (!isObject(val)) return false;\n\n // If it has modified constructor\n ctor = val.constructor;\n if (ctor === undefined) return true;\n\n // If it has modified prototype\n prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n};\n\n/**\n * Checks if the given value is valid `Date`\n * @group Predicates\n */\nexport const isDate = (val: any): val is Date =>\n val instanceof Date && !isNaN(val as any);\n\n/**\n * Function that does nothing\n * @group Utility Functions\n */\nexport const noop = () => {};\n\n/**\n * Checks if the given value is a `Error`\n * @group Predicates\n */\nexport const isError = (val: any): val is Error =>\n val instanceof Error ||\n //@ts-expect-error\n (isObject(val) && isString(val.message) && isString(val.stack));\n\n/**\n * Checks if the given value is a `symbol`\n * @group Predicates\n */\nexport const isSymbol = (val: any): val is Symbol => typeof val == 'symbol';\n\n/**\n * Checks if the given value is a `Set`.\n * @group Predicates\n */\nexport const isSet = <T = any>(val: any): val is Set<T> => val instanceof Set;\n\n/**\n * Checks if the given value is a `RegExp`.\n * @group Predicates\n */\nexport const isRegExp = (val: any): val is RegExp => val instanceof RegExp;\n\n/**\n * Checks if the given value is a `WeekSet`.\n * @group Predicates\n */\nexport const isWeakSet = <T extends WeakKey = any>(\n val: any,\n): val is WeakSet<T> => val instanceof WeakSet;\n\n/**\n * Checks if the given value is a `Map`.\n * @group Predicates\n */\nexport const isMap = <K = any, V = any>(val: any): val is Map<K, V> =>\n val instanceof Map;\n\n/**\n * Checks if the given value is a `WeakMap`.\n * @group Predicates\n */\nexport const isWeakMap = <V = any>(val: any): val is WeakMap<WeakKey, V> =>\n val instanceof WeakMap;\n\n/**\n * Checks if two values are equal, including support for `Date`, `RegExp`, and deep object comparison.\n *\n * @param {unknown} a - The first value to compare.\n * @param {unknown} b - The second value to compare.\n * @returns {boolean} `true` if the values are equal, otherwise `false`.\n *\n * @example\n * isEqual(1, 1); // true\n * isEqual({ a: 1 }, { a: 1 }); // true\n * isEqual(/abc/g, /abc/g); // true\n * isEqual(new Date('2020-01-01'), new Date('2020-01-01')); // true\n * isEqual([1, 2, 3], [1, 2, 3]); // true\n *\n * @group Predicates\n */\nexport function isEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) {\n return true;\n }\n\n if (\n typeof a !== 'object' ||\n typeof b !== 'object' ||\n a === null ||\n b === null\n ) {\n return false;\n }\n\n if (a.constructor !== b.constructor) {\n return false;\n }\n\n if (Array.isArray(a)) {\n const { length } = a;\n if (length !== (b as any[]).length) {\n return false;\n }\n\n for (let i = length; i-- !== 0; ) {\n if (!isEqual(a[i], (b as any[])[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n if (a instanceof Date) {\n return a.getTime() === (b as Date).getTime();\n }\n\n if (a instanceof RegExp) {\n return a.source === (b as RegExp).source && a.flags === (b as RegExp).flags;\n }\n\n if (a instanceof Set) {\n if (a.size !== (b as Set<any>).size) {\n return false;\n }\n\n for (const value of a) {\n if (!(b as Set<any>).has(value)) {\n return false;\n }\n }\n\n return true;\n }\n\n if (a instanceof Map) {\n if (a.size !== (b as Map<any, any>).size) {\n return false;\n }\n\n for (const entry of a) {\n if (\n !(b as Map<any, any>).has(entry[0]) ||\n !isEqual(entry[1], (b as Map<any, any>).get(entry[0]))\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n if (a instanceof DataView) {\n const { byteLength } = a;\n\n if (byteLength !== (b as DataView).byteLength) {\n return false;\n }\n\n for (let i = byteLength; i-- !== 0; ) {\n if (a.getUint8(i) !== (b as DataView).getUint8(i)) {\n return false;\n }\n }\n\n return true;\n }\n\n if (a instanceof ArrayBuffer && b instanceof ArrayBuffer) {\n a = new Uint8Array(a);\n b = new Uint8Array(b);\n }\n\n if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n const { length } = a as Uint8Array;\n if (length !== (b as Uint8Array).length) {\n return false;\n }\n\n for (let i = length; i-- !== 0; ) {\n if ((a as Uint8Array)[i] !== (b as Uint8Array)[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n const aKeys = Object.keys(a as object);\n const bKeys = Object.keys(b as object);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n let key: any;\n\n for (let i = aKeys.length; i-- !== 0; ) {\n key = aKeys[i];\n if (\n !Object.hasOwn(b as any, key) ||\n !isEqual((a as any)[key], (b as any)[key])\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if a given value is empty.\n *\n * Support for `Array`, `Object`, `string` `Map`, `Set`.\n *\n * @example\n * isEmpty(); // true\n * isEmpty(null); // true\n * isEmpty(''); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty(new Map()); // true\n * isEmpty(new Set()); // true\n * isEmpty('hello'); // false\n * isEmpty([1, 2, 3]); // false\n * isEmpty({ a: 1 }); // false\n * isEmpty(new Map([['key', 'value']])); // false\n * isEmpty(new Set([1, 2, 3])); // false\n *\n * @group Predicates\n */\nexport const isEmpty = (obj: any): boolean => {\n if (obj === null || obj === undefined) return true;\n\n switch (obj?.constructor) {\n case Object: {\n for (const _ in obj) {\n return false;\n }\n\n return true;\n }\n\n case Array: {\n for (const _ in obj) {\n return false;\n }\n\n return true;\n }\n\n case String: {\n return !obj.length;\n }\n\n case Map: {\n return !obj.size;\n }\n\n case Set: {\n return !obj.size;\n }\n }\n\n return false;\n};\n\n/**\n * Checks if the given value is a `Promise`\n * @group Predicates\n */\nexport function isPromise<T = void>(value: unknown): value is Promise<T> {\n return (\n value instanceof Promise ||\n (!!value &&\n typeof value === 'object' &&\n 'then' in value &&\n 'catch' in value &&\n typeof value.then === 'function' &&\n typeof value.catch === 'function')\n );\n}\n\nconst primitiveTypeofSet = Object.freeze(\n new Set(['string', 'number', 'boolean', 'bigint', 'symbol', 'undefined']),\n);\n\n/**\n * Checks whether a value is a JavaScript primitive.\n *\n * JavaScript primitives include null, undefined, strings, numbers, booleans, symbols, and bigints.\n * @group Predicates\n */\nexport const isPrimitive = (value: unknown): value is Primitive => {\n return value === null || primitiveTypeofSet.has(typeof value);\n};\n","import { isString } from '@/is';\n\ntype ItemType<T> =\n T extends Array<infer X>\n ? X\n : T extends string\n ? string\n : Exclude<T, null | undefined>;\n\ntype ArrayableValue<T> = T extends object ? Readonly<T> : T;\n\n/**\n * Converts a value into an array. This function handles different types of input,\n * converting them to arrays as follows:\n * - If the value is already an array, it returns it as-is.\n * - If the value is a string, it splits the string by commas and trims the elements.\n * - If the value is null or undefined, it returns an empty array.\n * - Otherwise, it wraps the value in an array.\n *\n * @example\n * arrayable(42); // [42]\n * arrayable('a, b, c'); // ['a', 'b', 'c']\n * arrayable([1, 2, 3]); // [1, 2, 3]\n * arrayable(null); // []\n * arrayable(undefined); // []\n *\n * @param value The value to convert into an array. It can be of any type.\n * @returns An array derived from the input value.\n *\n * @group Array\n */\nexport function arrayable<T>(value: ArrayableValue<T>): ItemType<T>[] {\n const result: any = Array.isArray(value)\n ? value\n : value === null\n ? []\n : value === undefined\n ? []\n : isString(value)\n ? value\n .split(',')\n .map(v => v.trim())\n .filter(Boolean)\n : [value];\n\n return result;\n}\n","import { isNumber } from '@/is';\n\n/**\n * Calculates the average value from an array of numbers.\n *\n * The function sums up all valid numbers in the array and divides by the count of those valid numbers.\n * If the array is empty or contains no valid numbers, it returns `0`.\n *\n * @example\n * avg([5, 5, 5]); // 5\n * avg([10, 20, 30]); // 20\n * avg([1, 2, 'three', 4]); // 2.33 (ignores non-numeric values)\n * avg([]); // 0\n *\n * @param values An array of numbers (could include invalid values, which will be ignored).\n * @returns The average value of the valid numbers in the array, or `0` if no valid numbers exist.\n *\n * @group Array\n */\nexport const avg = (values: readonly number[]) => {\n let sum = 0;\n let amount = 0;\n\n for (const item of values) {\n if (!isNumber(item)) continue;\n sum += item;\n amount++;\n }\n\n if (amount === 0) return 0;\n\n return sum / amount;\n};\n","/**\n * Computes the average of circular values using vector summation.\n *\n * This function calculates the circular mean of an array of values,\n * which is useful for cyclic data (e.g., time of day, angles).\n *\n * @param {readonly number[]} values - The array of numbers representing circular values.\n * @param {number} max - The maximum possible value in the cycle (e.g., 24 for hours, 360 for degrees).\n * @returns {number} - The computed circular mean, wrapped within the range [0, max).\n *\n * @example\n * // Averaging angles in degrees\n * avgCircular([350, 10, 20], 360); // Returns approximately 0\n *\n * @example\n * // Averaging times in hours (on a 24-hour clock)\n * avgCircular([23, 1, 2], 24); // Returns approximately 0\n *\n * @group Array\n */\nexport const avgCircular = (values: readonly number[], max: number) => {\n const len = values.length;\n\n if (!len) return 0;\n\n let sumX = 0;\n let sumY = 0;\n let angle: number;\n let value: number;\n\n for (value of values) {\n angle = (value / max) * 2 * Math.PI;\n sumX += Math.cos(angle);\n sumY += Math.sin(angle);\n }\n\n angle = Math.atan2(sumY / len, sumX / len);\n\n return ((angle / (2 * Math.PI)) * max + max) % max;\n};\n","/**\n * Splits an array into smaller sub-arrays (chunks) of a specified size.\n *\n * If the array can't be evenly divided, the last chunk will contain the remaining elements.\n *\n * @example\n * const data = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n * const chunkSize = 3;\n * const result = chunk(data, chunkSize);\n * console.log(result);\n * // [\n * // [1, 2, 3],\n * // [4, 5, 6],\n * // [7, 8, 9]\n * // ]\n *\n * @example\n * const data = [1, 2, 3, 4, 5];\n * const chunkSize = 2;\n * const result = chunk(data, chunkSize);\n * console.log(result);\n * // [\n * // [1, 2],\n * // [3, 4],\n * // [5]\n * // ]\n *\n * @param list The array to be split into chunks.\n * @param size The size of each chunk. Defaults to `1` if not specified.\n * @returns An array of arrays (chunks), each containing up to `size` elements from the original array.\n *\n * @group Array\n */\nexport function chunk<T>(list: readonly T[], size: number = 1): T[][] {\n return list.reduce((res, item, index) => {\n if (index % size === 0) {\n res.push([]);\n }\n res[res.length - 1].push(item);\n return res;\n }, [] as T[][]);\n}\n","/**\n * Collapses a continuous series into a tuple of two elements.\n *\n * Where the first element is the beginning of the series.\n * Where the second element is the end of the series.\n *\n * ⚠️ Tuple may consist only one element if the series not started, like: [1, 3] => [[1], [3]]\n *\n * @example\n * const numbers = [1, 2, 3, 8, 9, 10, 15];\n *\n * chunkSeries(numbers); // [[1, 3], [8, 10], [15]]\n *\n * @group Array\n */\nexport function chunkSeries(list: number[], step = 1): number[][] {\n const result: number[][] = [];\n\n if (!list.length) {\n return result;\n }\n\n const sortedList = [...list].sort();\n\n let currentRange = [list[0]];\n let currentValue: number;\n\n for (let idx = 1; idx < sortedList.length; idx++) {\n currentValue = sortedList[idx];\n\n if (currentValue - currentRange.at(-1)! > step) {\n result.push(currentRange);\n currentRange = [currentValue];\n } else {\n currentRange[1] = currentValue;\n }\n }\n\n result.push(currentRange);\n\n return result;\n}\n","/**\n * Computes the difference between arrays.\n *\n * This function takes arrays and returns a new array containing the elements\n * that are not present in any other arrays.\n *\n * @template T\n * @param arrays - The arrays from which to derive the difference.\n * @returns {T[]} A new array containing the elements that are not present in other arrays.\n *\n * @example\n * const array1 = [1, 2, 3, 4, 5];\n * const array2 = [2, 4];\n * const array3 = [1, 5];\n * const result = difference(array1, array2, array3);\n * // result will be [3] since 1, 2, 4 and 5 are in other arrays and are excluded from the result.\n *\n * @group Array\n */\nexport function difference<T>(...arrays: readonly T[][]): T[] {\n if (arrays.length === 0) return [];\n if (arrays.length === 1) return [...arrays[0]];\n\n const [first, ...rest] = arrays;\n const blacklist = new Set();\n const set = new Set(first);\n\n for (const items of rest) {\n for (const item of items) {\n if (blacklist.has(item)) continue;\n if (set.has(item)) {\n set.delete(item);\n blacklist.add(item);\n continue;\n }\n\n set.add(item);\n }\n }\n\n return Array.from(set);\n}\n","import { isFunction } from '@/is';\nimport type { IsPropertyKey, MaybePropertyKey } from '../keyBy/types';\n\nexport function groupBy<T, K extends MaybePropertyKey<T>>(\n array: readonly T[],\n keyBy: K,\n objectMode?: false,\n): Map<IsPropertyKey<T, K, K>, T[]>;\n\nexport function groupBy<T, K>(\n array: readonly T[],\n keyBy: (item: T) => K,\n objectMode?: false,\n): Map<K, T[]>;\n\nexport function groupBy<T, K extends MaybePropertyKey<T>>(\n array: readonly T[],\n keyBy: K,\n objectMode: true,\n): Record<K, T[]>;\n\nexport function groupBy<T, K extends PropertyKey>(\n array: readonly T[],\n keyBy: (item: T) => K,\n objectMode: true,\n): Record<K, T[]>;\n\n/**\n * @group Array\n * @example\n * const arr = [\n * { id: 1, name: 'a' },\n * { id: 2, name: 'a' },\n * { id: 3, name: 'b' },\n * ];\n * const grouped = groupBy(arr, 'name', true);\n *\n * console.log(grouped.a);\n * // [{ id: 1, name: 'a' }, { id: 2, name: 'a' }]\n */\nexport function groupBy(\n array: readonly any[],\n keyBy: unknown | ((item: any) => unknown),\n objectMode?: boolean,\n): any {\n const getItemKey = isFunction(keyBy)\n ? keyBy\n : (item: any) => item?.[keyBy as any];\n\n let key;\n\n if (objectMode === true) {\n const result: Record<any, any> = {};\n\n for (const item of array) {\n key = getItemKey(item);\n result[key] = result[key] || [];\n result[key].push(item);\n }\n\n return result as any;\n }\n\n const result = new Map();\n\n for (const item of array) {\n key = getItemKey(item);\n\n if (!result.has(key)) {\n result.set(key, [item]);\n } else {\n result.get(key).push(item);\n }\n }\n\n return result;\n}\n","/**\n * Returns the intersection of arrays.\n *\n * This function takes arrays and returns a new array containing the elements that are\n * present in all arrays.\n *\n * @template T - The type of elements in the array.\n * @returns {T[]} A new array containing the elements that are present in both arrays.\n *\n * @example\n * const array1 = [1, 2, 3, 4, 5];\n * const array2 = [3, 4, 5, 6, 7];\n * const result = intersection(array1, array2);\n * // result will be [3, 4, 5] since these elements are in both arrays.\n *\n * @group Array\n */\nexport function intersection<T>(...arrays: readonly T[][]): T[] {\n if (arrays.length === 0) return [];\n if (arrays.length === 1) return arrays[0];\n\n return arrays.reduce((acc, curr) => {\n const set = new Set(curr);\n return acc.filter(item => set.has(item));\n });\n}\n","import { isFunction } from '@/is';\nimport type { IsPropertyKey, MaybePropertyKey } from './types';\n\n/**\n * Maps each element of an array based on a provided key.\n *\n * @example\n * const data = [\n * { id: 1, name: 'group 1' },\n * { id: 2, name: 'group 2' },\n * { id: 1, name: 'group 2' }\n * ];\n *\n * const result = keyBy(data, 'id');\n * console.log(Object.entries(result));\n * // [\n * // [1, [{ id: 1, name: 'group 1' }, { id: 1, name: 'group 2' }],\n * // [2, { id: 2, name: 'group 2' }],\n * // ]\n *\n * @group Array\n */\nexport function keyBy<T, K extends MaybePropertyKey<T>>(\n array: readonly T[],\n keyBy: K,\n objectMode?: false,\n): Map<IsPropertyKey<T, K, K>, T>;\n\nexport function keyBy<T, K>(\n array: readonly T[],\n keyBy: (item: T) => K,\n objectMode?: false,\n): Map<K, T>;\n\nexport function keyBy<T, K extends MaybePropertyKey<T>>(\n array: readonly T[],\n keyBy: K,\n objectMode: true,\n): Record<K, T>;\n\nexport function keyBy<T, K extends PropertyKey>(\n array: readonly T[],\n keyBy: (item: T) => K,\n objectMode: true,\n): Record<K, T>;\n\nexport function keyBy(\n array: readonly any[],\n keyBy: unknown | ((item: any) => unknown),\n objectMode?: boolean,\n): any {\n const getItemKey = isFunction(keyBy)\n ? keyBy\n : (item: any) => item?.[keyBy as any];\n\n if (objectMode === true) {\n const result: Record<any, any> = {};\n\n for (const item of array) {\n result[getItemKey(item)] = item;\n }\n\n return result as any;\n }\n\n const result = new Map();\n\n for (const item of array) {\n result.set(getItemKey(item), item);\n }\n\n return result as any;\n}\n","import { isSymbol } from '@/is';\n\nexport function compareAscending(value: any, other: any) {\n if (value !== other) {\n const valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n const othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if (\n (!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol &&\n othIsDefined &&\n othIsReflexive &&\n !othIsNull &&\n !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive\n ) {\n return 1;\n }\n if (\n (!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol &&\n valIsDefined &&\n valIsReflexive &&\n !valIsNull &&\n !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive\n ) {\n return -1;\n }\n }\n return 0;\n}\n","import { isFunction } from '@/is';\nimport { compareAscending } from './compareAscending';\n\n/**\n * Sort array by multiple fields\n *\n * @example\n * // Sample data: an array of objects representing users\n * const users = [\n * { name: 'Alice', age: 30, score: 85 },\n * { name: 'Bob', age: 25, score: 90 },\n * { name: 'Charlie', age: 35, score: 90 },\n * { name: 'Dave', age: 30, score: 70 },\n * ];\n *\n * // Sort users first by score in descending order, then by age in ascending order\n * const sortedUsers = orderBy(users, ['score', 'age'], ['desc', 'asc']);\n *\n * // Output the sorted array\n * console.log(sortedUsers);\n *\n * @group Array\n */\nexport function orderBy<T>(\n array: readonly T[],\n fields: (string | ((item: T) => any))[],\n orders: ('asc' | 'desc')[],\n): readonly T[] {\n return [...array].sort((a, b) => {\n let index = -1,\n length = fields.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n const field = fields[index];\n const filedFn = isFunction(field);\n\n const objCriteria = filedFn ? field(a) : (a as any)?.[field];\n const othCriteria = filedFn ? field(b) : (b as any)?.[field];\n\n const result = compareAscending(objCriteria, othCriteria);\n\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n return result * (orders[index] === 'desc' ? -1 : 1);\n }\n }\n\n return 0;\n });\n}\n","/**\n * Randomizes the order of elements in an array using the Fisher-Yates algorithm.\n *\n * This function takes an array and returns a new array with its elements shuffled in a random order.\n *\n * @template T - The type of elements in the array.\n * @param {T[]} arr - The array to shuffle.\n * @returns {T[]} A new array with its elements shuffled in random order.\n *\n * @example\n * const array = [1, 2, 3, 4, 5];\n * const shuffledArray = shuffle(array);\n * // shuffledArray will be a new array with elements of array in random order, e.g., [3, 1, 4, 5, 2]\n *\n * @group Array\n */\nexport function shuffle<T>(arr: readonly T[]): T[] {\n const result = arr.slice();\n\n /**\n * https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm\n */\n for (let i = result.length - 1; i >= 1; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [result[i], result[j]] = [result[j], result[i]];\n }\n\n return result;\n}\n","/**\n * Function that compares two elements and returns a number indicating their relative order.\n * - Negative number if a < b\n * - Zero if a equals b\n * - Positive number if a > b\n *\n * @template T The type of elements in the array\n */\nexport type SortedArrayCompareFn<T> = (a: T, b: T) => number;\n\n/**\n * A self-sorting array that maintains elements in a sorted order based on a comparison function.\n * All mutating operations preserve the sorted order of elements.\n *\n * @template T The type of elements in the array\n *\n * @example\n * // Create a numerically sorted array\n * const arr = new SortedArray((a, b) => a - b);\n * arr.push(3, 2, 1);\n * console.log(arr); // [1, 2, 3]\n *\n * @example\n * // Create a sorted array with initial values\n * const names = new SortedArray((a, b) => a.localeCompare(b), [\"Charlie\", \"Alice\", \"Bob\"]);\n * console.log(names); // [\"Alice\", \"Bob\", \"Charlie\"]\n *\n * @example\n * // Create a sorted array with a custom comparator\n * const people = new SortedArray(\n * (a, b) => a.age - b.age || a.name.localeCompare(b.name),\n * [{ name: \"Alice\", age: 30 }, { name: \"Bob\", age: 25 }]\n * );\n *\n * @group Array\n */\nexport class SortedArray<T> extends Array<T> {\n #compareFn: SortedArrayCompareFn<T>;\n\n /**\n * Creates a new SortedArray instance.\n *\n * @param compareFn The comparison function to determine the sort order\n * @param items Optional initial items to add to the array (will be sorted immediately)\n */\n constructor(compareFn: SortedArrayCompareFn<T>, items: T[] = []) {\n super();\n this.#compareFn = compareFn;\n\n // Add initial items in sorted order if provided\n if (items.length > 0) {\n super.push.apply(this, items.toSorted(this.#compareFn));\n }\n }\n\n /**\n * Inserts multiple items while maintaining sort order\n * @param items The items to insert\n * @returns The new length of the array\n */\n push(...items: T[]): number {\n // For large batches, first sort the new items\n var newItems = items.toSorted(this.#compareFn);\n var newItemsLen = newItems.length;\n var originalLen = this.length;\n\n // Calculate final array size and prepare space\n var result = new Array<T>(originalLen + newItemsLen);\n\n // Merge the two sorted arrays with minimal comparisons\n var i = 0,\n j = 0,\n k = 0;\n\n // Main merge loop - stops when either array is exhausted\n while (i < originalLen && j < newItemsLen) {\n if (this.#compareFn(this[i], newItems[j]) <= 0) {\n result[k++] = this[i++];\n } else {\n result[k++] = newItems[j++];\n }\n }\n\n // Copy remaining elements (only one of these loops will execute)\n while (i < originalLen) {\n result[k++] = this[i++];\n }\n\n while (j < newItemsLen) {\n result[k++] = newItems[j++];\n }\n\n // Fastest way to replace content: clear and use super.push with spread\n this.length = 0;\n super.push.apply(this, result);\n\n return this.length;\n }\n\n /**\n * Override Array methods that would break the sorted order\n */\n unshift(...items: T[]): number {\n return this.push(...items);\n }\n\n /**\n * Creates a new SortedArray with the same comparison function\n * @returns A new SortedArray instance\n */\n slice(start?: number, end?: number): SortedArray<T> {\n var result = new SortedArray<T>(this.#compareFn);\n var sliced = super.slice(start, end);\n super.push.apply(result, sliced);\n return result;\n }\n\n /**\n * Concatenates arrays or values while maintaining sort order\n * @param items Arrays or values to concatenate\n * @returns A new SortedArray with the concatenated elements\n */\n concat(...items: (T | ConcatArray<T>)[]): SortedArray<T> {\n var result = new SortedArray<T>(this.#compareFn, this);\n\n for (const item of items) {\n if (Array.isArray(item)) {\n result.push.apply(result, item);\n } else {\n result.push(item as T);\n }\n }\n\n return result;\n }\n}\n\n// Wrap original array methods to return regular array instead of sorted array\n['map', 'filter', 'flatMap', 'flat', 'reverse', 'sort'].forEach((key: any) => {\n SortedArray.prototype[key] = function () {\n const arr = Array.prototype[key].apply(this, arguments);\n Object.setPrototypeOf(arr, Array.prototype);\n return arr;\n };\n});\n","import { isNumber } from '@/is';\n\n/**\n * Sums the values in an array of numbers, ignoring non-numeric values.\n *\n * This function adds all valid numbers in the array and returns the sum.\n * Non-numeric values (e.g., `null`, `undefined`, `NaN` are ignored in the sum.\n *\n * @example\n * sum([2, 2]); // 4\n * sum([1, 'a', 3, 4]); // 8 (non-numeric 'a' is ignored)\n * sum([5, null, 10]); // 15 (null is ignored)\n * sum([]); // 0 (empty array returns 0)\n *\n * @param values The array of numbers to be summed.\n * @returns The sum of the numbers in the array.\n *\n * @group Array\n */\nexport const sum = (values: readonly number[]) => {\n return values.reduce((a, b) => a + (isNumber(b) ? b : 0), 0);\n};\n","/**\n * Returns a new array with duplicates removed.\n *\n * This function creates a new array that contains only unique values,\n * preserving the order of the original elements.\n *\n * @example\n * uniq([1, 2, 3, 4, 1, 3]); // [1, 2, 3, 4]\n * uniq([5, 5, 5, 5, 5]); // [5]\n * uniq(['a', 'b', 'a', 'c']); // ['a', 'b', 'c']\n * uniq([]); // [] (returns an empty array for empty input)\n *\n * @param value The array from which duplicates will be removed.\n * @returns A new array containing only the unique values from the input array.\n *\n * @group Array\n */\nexport function uniq<T extends any[]>(value: T): T {\n if (!Array.isArray(value)) {\n return [] as any;\n }\n\n return [...new Set(value)] as T;\n}\n","import { uniq } from '../uniq';\n\n/**\n * Creates an array of unique values from all given arrays.\n *\n * This function takes two arrays, merges them into a single array, and returns a new array\n * containing only the unique values from the merged array.\n *\n * @template T - The type of elements in the array.\n * @param {T[]} arr1 - The first array to merge and filter for unique values.\n * @param {T[]} arr2 - The second array to merge and filter for unique values.\n * @returns {T[]} A new array of unique values.\n *\n * @example\n * const array1 = [1, 2, 3];\n * const array2 = [3, 4, 5];\n * const result = union(array1, array2);\n * // result will be [1, 2, 3, 4, 5]\n *\n * @group Array\n */\nexport function union<T>(...arrays: readonly T[][]): T[] {\n if (arrays.length === 0) return [];\n if (arrays.length === 1) return [...arrays[0]];\n\n const [first, ...rest] = arrays;\n return uniq(first.concat(...rest));\n}\n","import _get from 'lodash/get.js';\n\n/**\n * Get object property by dot notation\n *\n * @example\n * const user = { id: 1, data: { roles: ['admin'] } };\n * const roles = get(user, 'data.roles');\n *\n * console.log(roles) // ['admin']\n *\n * @group Object\n */\nexport const get = _get;\n","import { isFunction } from '@/is';\nimport { get } from '@/object/get';\n\n/**\n * Extracts unique elements from an array based on a comparator function or property key.\n *\n * This function allows you to determine uniqueness based on custom criteria by passing\n * a comparator function or a property key. The function will return a new array containing\n * only the first occurrence of elements that are unique according to the specified comparator.\n * If the comparator is a property key, uniqueness will be determined based on the value\n * of that property.\n *\n * @example\n * const users = [\n * { id: 1, role: 'admin' },\n * { id: 2, role: 'admin' },\n * { id: 3, role: 'user' },\n * { id: 4, role: 'user' },\n * ];\n *\n * const uniqRoles = uniqBy(users, (v) => v.role);\n * // [\n * // { id: 1, role: 'admin' },\n * // { id: 3, role: 'user' },\n * // ]\n *\n * @example\n * const products = [\n * { id: 1, category: 'electronics', name: 'Phone' },\n * { id: 2, category: 'electronics', name: 'Laptop' },\n * { id: 3, category: 'furniture', name: 'Sofa' },\n * ];\n *\n * const uniqCategories = uniqBy(products, 'category');\n * // [\n * // { id: 1, category: 'electronics', name: 'Phone' },\n * // { id: 3, category: 'furniture', name: 'Sofa' },\n * // ]\n *\n * @param array The array to extract unique elements from.\n * @param comparator A function that computes the value to determine uniqueness or a property key.\n * If a string is passed, it is treated as a property key, and uniqueness is\n * determined based on the value of that property.\n * @returns A new array containing only the first occurrence of each unique element based on the comparator.\n *\n * @group Array\n */\nexport function uniqBy<T>(\n array: T[],\n comparator: ((value: T) => any) | PropertyKey,\n): T[] {\n const seen = new Set();\n\n if (!isFunction(comparator)) {\n const key = comparator;\n comparator = value => get(value, key);\n }\n\n return array.filter(value => {\n const computed = (comparator as any)(value);\n const hasSeen = seen.has(computed);\n if (!hasSeen) {\n seen.add(computed);\n }\n return !hasSeen;\n });\n}\n","let AssertionError: any;\n\n(async () => {\n AssertionError = (globalThis as any).window\n ? await import('../errors/BrowserAssertionError').then(\n r => r.BrowserAssertionError,\n )\n : await import('node:assert').then(r => r.AssertionError);\n})();\n\nexport { AssertionError };\n","/* eslint-env node */\nimport {\n isBoolean,\n isDate,\n isEmpty,\n isError,\n isFunction,\n isNumber,\n isObject,\n isString,\n} from '../is';\n\nimport { AssertionError } from './AssertionError.js';\n\nexport function ok(value: unknown, message?: string | Error): asserts value {\n if (!value) {\n throw toError(\n ok,\n value,\n message,\n 'The expression evaluated to a falsy value.',\n );\n }\n}\n\nexport function equal<T>(\n actual: unknown,\n expected: T,\n message?: string | Error,\n): asserts actual is T {\n if (actual !== expected) {\n new AssertionError({\n actual,\n expected,\n message: isString(message)\n ? message\n : 'The actual value not as expected.',\n operator: 'equal',\n stackStartFn: equal,\n });\n }\n}\n\nexport function notEmpty(\n value: unknown,\n message?: string | Error,\n): asserts value {\n if (isEmpty(value)) {\n throw toError(notEmpty, value, message, 'Expected not empty value.');\n }\n}\n\nexport function object(\n value: unknown,\n message?: string | Error,\n): asserts value is object {\n if (!isObject(value)) {\n throw toError(object, value, message, 'Expected object value.');\n }\n}\n\nexport function string(\n value: unknown,\n message?: string | Error,\n): asserts value is string {\n if (!isString(value)) {\n throw toError(string, value, message, 'Expected string value.');\n }\n}\n\nexport function boolean(\n value: unknown,\n message?: string | Error,\n): asserts value is boolean {\n if (!isBoolean(value)) {\n throw toError(boolean, value, message, 'Expected boolean value.');\n }\n}\n\nexport function notEmptyString(\n value: unknown,\n message?: string | Error,\n): asserts value is string {\n if (!isString(value) || !(value as any).trim()) {\n throw toError(\n notEmptyString,\n value,\n message,\n 'Expected not empty string value.',\n );\n }\n}\n\nexport function number(\n value: unknown,\n message?: string | Error,\n): asserts value is number {\n if (!isNumber(value)) {\n throw toError(number, value, message, 'Expected number value.');\n }\n}\n\nexport function date(\n value: unknown,\n message?: string | Error,\n): asserts value is Date {\n if (!isDate(value)) {\n throw toError(date, value, message, 'Expected date value.');\n }\n}\n\nexport function fn(\n value: unknown,\n message?: string | Error,\n): asserts value is Function {\n if (!isFunction(value)) {\n throw toError(fn, value, message, 'Expected function value.');\n }\n}\n\nexport function greaterThan(\n value: unknown,\n target: number,\n message?: string | Error,\n): asserts value is number {\n if (!isNumber(value) || value < target) {\n throw toError(\n greaterThan,\n value,\n message,\n 'Expected number value greater then ' + target + '.',\n );\n }\n}\n\nexport function lessThan(\n value: unknown,\n target: number,\n message?: string | Error,\n): asserts value is number {\n if (!isNumber(value) || value > target) {\n throw toError(\n lessThan,\n value,\n message,\n 'Expected number value less then ' + target + '.',\n );\n }\n}\n\nexport function array(\n value: unknown,\n message?: string | Error,\n): asserts value is unknown[] {\n if (!Array.isArray(value)) {\n throw toError(array, value, message, 'Expected array value.');\n }\n}\n\nexport function arrayStrings(\n value: unknown,\n message?: string | Error,\n): asserts value is string[] {\n if (!Array.isArray(value) || !value.every(isString)) {\n throw toError(arrayStrings, value, message, 'Expected strings list value.');\n }\n}\n\nexport function arrayNumbers(\n value: unknown,\n message?: string | Error,\n): asserts value is number[] {\n if (!Array.isArray(value) || !value.every(isNumber)) {\n throw toError(arrayNumbers, value, message, 'Expected numbers list value.');\n }\n}\n\n/**\n * Transform value to error object\n */\nfunction toError(\n operator: Function,\n actual: unknown,\n message?: string | Error,\n unknownMessage: string = 'Unknown error',\n): Error {\n if (isError(message)) {\n return message as any;\n }\n\n return new AssertionError({\n actual,\n message: isString(message) ? message : unknownMessage,\n operator: operator.name,\n stackStartFn: operator,\n });\n}\n","import { assert } from '@/assert';\n\nexport type WrrItem<T> = {\n item: T;\n weight?: number;\n};\n\ntype WrrItemWeighted = {\n item: any;\n weight: number;\n};\n\n/**\n * Creates a function that returns a weighted round-robin item from the provided array.\n *\n * The input array should contain objects with an `item` property and a `weight` property.\n * The `weight` determines the relative likelihood of selecting an item.\n * Items with higher weights will appear more frequently in the selection.\n *\n * If the `weight` property is missing or falsy, it defaults to `1`.\n * An empty array will result in a function that always returns `undefined`.\n *\n * @example\n * const getItem = weightedRoundRobin([\n * { item: 'a', weight: 2 },\n * { item: 'b', weight: 3 },\n * { item: 'c' },\n * ]);\n *\n * console.log(getItem()); // 'a', 'b', or 'c'\n *\n * @group Array\n */\nexport function weightedRoundRobin<T = unknown>(arr: WrrItem<T>[]): () => T {\n assert.ok(arr.length > 0, 'Array must contain at least one item.');\n\n const instance = new WeightedRoundRobin(\n arr.map(v => ({\n item: v.item,\n weight: Math.min(v.weight ?? 1, 1),\n })),\n );\n\n return () => instance.nextItem();\n}\n\nconst gcd = (a: number, b: number): number => (!b ? a : gcd(b, a % b));\n\nclass WeightedRoundRobin {\n currentIndex = -1;\n currentWeight = 0;\n maxWeight: number;\n gcdWeight: number;\n\n constructor(public items: WrrItemWeighted[]) {\n this.maxWeight = this._calculateMaxWeight();\n this.gcdWeight = this._calculateGCD();\n }\n\n _calculateGCD(): number {\n return this.items.reduce(\n (acc, curr) => gcd(acc, curr.weight),\n this.items[0].weight,\n );\n }\n\n _calculateMaxWeight(): number {\n return Math.max(...this.items.map(s => s.weight));\n }\n\n nextItem(): any {\n const n = this.items.length;\n while (true) {\n this.currentIndex = (this.currentIndex + 1) % n;\n if (this.currentIndex === 0) {\n this.currentWeight -= this.gcdWeight;\n if (this.currentWeight <= 0) {\n this.currentWeight = this.maxWeight;\n }\n }\n if (this.items[this.currentIndex].weight >= this.currentWeight) {\n return this.items[this.currentIndex].item;\n }\n }\n }\n}\n","export class Base64Encoding {\n public alphabet: string;\n public padding: string;\n\n private decodeMap = new Map<string, number>();\n\n constructor(\n alphabet: string,\n options?: {\n padding?: string;\n },\n ) {\n if (alphabet.length !== 64) {\n throw new Error('Invalid alphabet');\n }\n this.alphabet = alphabet;\n this.padding = options?.padding ?? '=';\n if (this.alphabet.includes(this.padding) || this.padding.length !== 1) {\n throw new Error('Invalid padding');\n }\n for (let i = 0; i < alphabet.length; i++) {\n this.decodeMap.set(alphabet[i]!, i);\n }\n }\n\n public encode(\n data: Uint8Array,\n options?: {\n includePadding?: boolean;\n },\n ): string {\n let result = '';\n let buffer = 0;\n let shift = 0;\n for (let i = 0; i < data.length; i++) {\n buffer = (buffer << 8) | data[i]!;\n shift += 8;\n while (shift >= 6) {\n shift += -6;\n result += this.alphabet[(buffer >> shift) & 0x3f];\n }\n }\n if (shift > 0) {\n result += this.alphabet[(buffer << (6 - shift)) & 0x3f];\n }\n const includePadding = options?.includePadding ?? true;\n if (includePadding) {\n const padCount = (4 - (result.length % 4)) % 4;\n for (let i = 0; i < padCount; i++) {\n result += '=';\n }\n }\n return result;\n }\n\n public decode(\n data: string,\n options?: {\n strict?: boolean;\n },\n ): Uint8Array {\n const strict = options?.strict ?? true;\n const chunkCount = Math.ceil(data.length / 4);\n const result: number[] = [];\n for (let i = 0; i < chunkCount; i++) {\n let padCount = 0;\n let buffer = 0;\n for (let j = 0; j < 4; j++) {\n const encoded = data[i * 4 + j];\n if (encoded === '=') {\n if (i + 1 !== chunkCount) {\n throw new Error(`Invalid character: ${encoded}`);\n }\n padCount += 1;\n continue;\n }\n if (encoded === undefined) {\n if (strict) {\n throw new Error('Invalid data');\n }\n padCount += 1;\n continue;\n }\n const value = this.decodeMap.get(encoded) ?? null;\n if (value === null) {\n throw new Error(`Invalid character: ${encoded}`);\n }\n buffer += value << (6 * (3 - j));\n }\n result.push((buffer >> 16) & 0xff);\n if (padCount < 2) {\n result.push((buffer >> 8) & 0xff);\n }\n if (padCount < 1) {\n result.push(buffer & 0xff);\n }\n }\n return Uint8Array.from(result);\n }\n}\n","import { Base64Encoding } from './Base64Encoding';\n\nexport const base64 = new Base64Encoding(\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n);\n\nexport const base64url = new Base64Encoding(\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n);\n","import { assert } from '@/assert';\nimport { base64, base64url } from '../base64';\n\nexport type Base64ToBytesOptions = {\n /**\n * Encoding type\n */\n encoding?: 'base64' | 'base64url';\n\n /**\n * Whether to enforce strict Base64 decoding.\n */\n strict?: boolean;\n};\n\n/**\n * Decodes a Base64 or Base64URL encoded string into a `Uint8Array`.\n *\n * This function supports decoding data from both standard Base64 and Base64URL formats.\n *\n * @param {string} data - The encoded string to decode. Must be a valid Base64 or Base64URL encoded string.\n * @param {Base64ToBytesOptions} [options] - Optional configuration options for decoding.\n * @returns {Uint8Array} - The decoded byte array.\n *\n * @example\n * // Example 1: Decoding a Base64 string\n * const base64String = 'SGVsbG8gd29ybGQ='; // \"Hello world\"\n * const decodedBytes = base64ToBytes(base64String);\n * console.log(decodedBytes); // Output: Uint8Array [ 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100 ]\n *\n * @example\n * // Example 2: Decoding a Base64URL encoded string\n * const base64urlString = 'SGVsbG8gd29ybGQ'; // \"Hello world\"\n * const decodedBytes2 = base64ToBytes(base64urlString, { encoding: 'base64url' });\n * console.log(decodedBytes2); // Output: Uint8Array [ 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100 ]\n *\n * @example\n * // Example 3: Strict decoding with Base64\n * const base64StringStrict = 'SGVsbG8gd29ybGQ=';\n * const decodedStrict = base64ToBytes(base64StringStrict, { strict: true });\n * console.log(decodedStrict); // Output: Uint8Array [ 72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100 ]\n *\n * @group Binary\n */\nexport function base64ToBytes(\n data: string,\n { encoding = 'base64', strict }: Base64ToBytesOptions = {},\n): Uint8Array {\n if (encoding === 'base64') {\n return base64.decode(data, { strict: strict ?? true });\n } else if (encoding === 'base64url') {\n return base64url.decode(data, { strict: strict ?? false });\n }\n\n assert.ok(false, 'Invalid encoding options: ' + encoding);\n}\n","/**\n * Converts a `bigint` value into a byte array (`Uint8Array`) in big-endian order.\n *\n * This function encodes the absolute value of the provided `bigint` into a minimal byte array,\n * ensuring that the bytes represent the value in big-endian format.\n *\n * @param {bigint} value - The input `bigint` value to convert into bytes.\n * @returns {Uint8Array} - The byte array (`Uint8Array`) representing the provided `bigint`.\n *\n * @example\n * // Example 1: Convert a positive bigint to bytes\n * const value = 1234567890123456789n;\n * const bytes = bigIntBytes(value);\n * console.log(bytes); // Output: Uint8Array representing the bytes in big-endian\n *\n * @example\n * // Example 2: Convert a negative bigint to bytes\n * const valueNegative = -1234567890123456789n;\n * const bytesNegative = bigIntBytes(valueNegative);\n * console.log(bytesNegative); // Output: Uint8Array representing the absolute value in big-endian\n *\n * @example\n * // Example 3: Handle very small bigints\n * const smallValue = 42n;\n * const bytesSmall = bigIntBytes(smallValue);\n * console.log(bytesSmall); // Output: Uint8Array [ 42 ]\n *\n * @example\n * // Example 4: Convert zero value\n * const zeroValue = 0n;\n * const bytesZero = bigIntBytes(zeroValue);\n * console.log(bytesZero); // Output: Uint8Array [ 0 ]\n *\n * @group Binary\n */\nexport function bigIntBytes(value: bigint): Uint8Array {\n if (value < 0n) {\n value = value * -1n;\n }\n let byteLength = 1;\n while (value > 2n ** BigInt(byteLength * 8) - 1n) {\n byteLength++;\n }\n const encoded = new Uint8Array(byteLength);\n for (let i = 0; i < encoded.byteLength; i++) {\n encoded[i] = Number(\n (value >> BigInt((encoded.byteLength - i - 1) * 8)) & 0xffn,\n );\n }\n return encoded;\n}\n","import { assert } from '@/assert';\n\n/**\n * Converts a byte array (`Uint8Array`) into a `bigint`. The byte array is interpreted in big-endian order.\n *\n * This function takes a byte array and decodes it into its corresponding `bigint` value by treating\n * the byte array as a big-endian encoded number.\n *\n * @param {Uint8Array} bytes - The byte array to decode into a `bigint`. Must have at least one byte.\n * @returns {bigint} - The decoded `bigint` value.\n *\n * @throws {Error} Will throw an error if the input byte array is empty.\n *\n * @example\n * // Example 1: Decode a simple byte array\n * const byteArray = new Uint8Array([0, 0, 0, 42]); // Represents the number 42 in big-endian\n * const decodedValue = bigIntFromBytes(byteArray);\n * console.log(decodedValue); // Output: 42n\n *\n * @example\n * // Example 2: Decode a multi-byte number\n * const byteArrayMulti = new Uint8Array([0x12, 0x34, 0x56, 0x78]); // Represents the number 305419896\n * const decodedMulti = bigIntFromBytes(byteArrayMulti);\n * console.log(decodedMulti); // Output: 305419896n\n *\n * @example\n * // Example 3: Decode a single byte number\n * const byteArraySingle = new Uint8Array([255]); // Represents the number 255\n * const decodedSingle = bigIntFromBytes(byteArraySingle);\n * console.log(decodedSingle); // Output: 255n\n *\n * @example\n * // Example 4: Attempt decoding an invalid empty array\n * try {\n * const emptyArray = new Uint8Array([]);\n * const decodedEmpty = bigIntFromBytes(emptyArray);\n * } catch (error) {\n * console.error(error); // Output: Error: Empty Uint8Array\n * }\n *\n * @group Binary\n */\nexport function bigIntFromBytes(bytes: Uint8Array): bigint {\n assert.ok(bytes.byteLength > 0, 'Empty Uint8Array');\n\n let decoded = 0n;\n for (let i = 0; i < bytes.byteLength; i++) {\n decoded += BigInt(bytes[i]) << BigInt((bytes.byteLength - 1 - i) * 8);\n }\n return decoded;\n}\n","import { assert } from '@/assert';\nimport { base64, base64url } from '../base64';\n\nexport type BytesToBase64Options = {\n /**\n * Specifies the encoding type.\n */\n encoding?: 'base64' | 'base64url';\n\n /**\n * Whether or not to include padding (`=`) in the encoded result. Defaults to `true` for Base64, `false` for Base64URL.\n */\n padding?: boolean;\n};\n\n/**\n * Encodes a byte array (`Uint8Array`) into a Base64 or Base64URL encoded string.\n *\n * The function can encode bytes in either the standard Base64 format or Base64URL format,\n * depending on the specified options. It also allows control over whether padding is included.\n *\n * @param {Uint8Array} data - The byte array to encode into Base64 or Base64URL.\n * @param {BytesToBase64Options} [options] - Optional configuration options.\n * @returns {string} - The encoded Base64 or Base64URL string.\n *\n * @example\n * // Example 1: Encoding with Base64 with default padding\n * const byteArray = new Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]); // \"Hello world\"\n * const encodedBase64 = bytesToBase64(byteArray);\n * console.log(encodedBase64); // Output: 'SGVsbG8gd29ybGQ='\n *\n * @example\n * // Example 2: Encoding with Base64URL without padding\n * const byteArray2 = new Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]); // \"Hello world\"\n * const encodedBase64URL = bytesToBase64(byteArray2, { encoding: 'base64url', padding: false });\n * console.log(encodedBase64URL); // Output: 'SGVsbG8gd29ybGQ'\n *\n * @example\n * // Example 3: Encoding with Base64 with no padding\n * const byteArray3 = new Uint8Array([1, 2, 3, 4]);\n * const encodedNoPadding = bytesToBase64(byteArray3, { encoding: 'base64', padding: false });\n * console.log(encodedNoPadding); // Output: 'AQIDBA'\n *\n * @example\n * // Example 4: Handling invalid encoding options\n * try {\n * const invalidEncoding = bytesToBase64(byteArray3, { encoding: 'invalid' });\n * } catch (error) {\n * console.error(error); // Output: Error: Invalid encoding options: invalid\n * }\n *\n * @group Binary\n */\nexport function bytesToBase64(\n data: Uint8Array,\n { encoding = 'base64', padding }: BytesToBase64Options = {},\n): string {\n if (encoding === 'base64') {\n return base64.encode(data, { includePadding: padding ?? true });\n } else if (encoding === 'base64url') {\n return base64url.encode(data, { includePadding: padding ?? false });\n }\n\n assert.ok(false, 'Invalid encoding options: ' + encoding);\n}\n","/**\n * Compares two `Uint8Array` instances to check if their contents are identical.\n *\n * This function compares each byte of the two provided byte arrays. It returns `true`\n * only if both byte arrays are of the same length **and** contain identical byte values\n * at every index. Otherwise, it returns `false`.\n *\n * @param {Uint8Array} a - The first byte array to compare.\n * @param {Uint8Array} b - The second byte array to compare.\n * @returns {boolean} `true` if the byte arrays are identical; otherwise, `false`.\n *\n * @example\n * // Example with identical byte arrays\n * const a = new Uint8Array([1, 2, 3]);\n * const b = new Uint8Array([1, 2, 3]);\n * console.log(compareBytes(a, b)); // Output: true\n *\n * @example\n * // Example with different contents\n * const a = new Uint8Array([1, 2, 3]);\n * const b = new Uint8Array([1, 2, 4]);\n * console.log(compareBytes(a, b)); // Output: false\n *\n * @example\n * // Example with different lengths\n * const a = new Uint8Array([1, 2]);\n * const b = new Uint8Array([1, 2, 3]);\n * console.log(compareBytes(a, b)); // Output: false\n *\n * @example\n * // Example with both arrays empty\n * const a = new Uint8Array([]);\n * const b = new Uint8Array([]);\n * console.log(compareBytes(a, b)); // Output: true\n *\n * @group Binary\n */\nexport function compareBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n for (let i = 0; i < b.byteLength; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n","/**\n * Concatenates two `Uint8Array` instances into a single new `Uint8Array`.\n *\n * This function takes two byte arrays, `a` and `b`, and creates a new `Uint8Array`\n * that combines their contents in order. The result will have a length equal to the\n * sum of the lengths of `a` and `b`.\n *\n * @param {Uint8Array} a - The first byte array to concatenate.\n * @param {Uint8Array} b - The second byte array to concatenate.\n * @returns {Uint8Array} A new `Uint8Array` containing the concatenation of `a` and `b`.\n *\n * @example\n * // Example with simple byte arrays\n * const a = new Uint8Array([1, 2, 3]);\n * const b = new Uint8Array([4, 5, 6]);\n * const result = concatenateBytes(a, b);\n * console.log(result); // Output: Uint8Array(6) [1, 2, 3, 4, 5, 6]\n *\n * @example\n * // Example with empty arrays\n * const a = new Uint8Array([]);\n * const b = new Uint8Array([1, 2, 3]);\n * const result = concatenateBytes(a, b);\n * console.log(result); // Output: Uint8Array(3) [1, 2, 3]\n *\n * @example\n * // Example with reversed order\n * const a = new Uint8Array([10, 20]);\n * const b = new Uint8Array([30, 40]);\n * const result = concatenateBytes(a, b);\n * console.log(result); // Output: Uint8Array(4) [10, 20, 30, 40]\n *\n * @group Binary\n */\nexport function concatenateBytes(a: Uint8Array, b: Uint8Array): Uint8Array {\n const result = new Uint8Array(a.byteLength + b.byteLength);\n result.set(a);\n result.set(b, a.byteLength);\n return result;\n}\n","/**\n * Converts a `Uint16Array` into a `Uint8Array`.\n *\n * @param {Uint16Array} value - The input `Uint16Array` to convert.\n * @returns {Uint8Array} - The resulting `Uint8Array`, with length twice that of the input `Uint16Array`.\n *\n * @example\n * // Example 1: Converting a valid Uint16Array into a Uint8Array\n * const uint16Array = new Uint16Array([0x1234, 0x5678]);\n * const uint8Array = uint16ToUint8(uint16Array);\n * console.log(uint8Array); // Output: Uint8Array [ 0x34, 0x12, 0x78, 0x56 ]\n *\n * @example\n * // Example 2: Another conversion example\n * const uint16Array2 = new Uint16Array([0xabcd, 0x1234, 0x5678]);\n * const uint8Array2 = uint16ToUint8(uint16Array2);\n * console.log(uint8Array2); // Output: Uint8Array [ 0xcd, 0xab, 0x34, 0x12, 0x78, 0x56 ]\n *\n * @group Binary\n */\nexport function uint16ToUint8(value: Uint16Array): Uint8Array {\n const uint8Array = new Uint8Array(value.length * 2);\n for (let i = 0; i < value.length; i++) {\n uint8Array[i * 2] = value[i] & 0xff; // Lower 8 bits\n uint8Array[i * 2 + 1] = value[i] >> 8; // Upper 8 bits\n }\n return uint8Array;\n}\n","/**\n * Converts a `Uint32Array` into a `Uint8Array`.\n *\n * @param {Uint32Array} value - The input `Uint32Array` to convert.\n * @returns {Uint8Array} - The resulting `Uint8Array`, with length four times that of the input `Uint32Array`.\n *\n * @example\n * // Example 1: Converting a valid Uint32Array into a Uint8Array\n * const uint32Array = new Uint32Array([0x12345678, 0x9abcdef0]);\n * const uint8Array = uint32ToUint8(uint32Array);\n * console.log(uint8Array); // Output: Uint8Array [ 0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a ]\n *\n * @example\n * // Example 2: Another conversion example with different numbers\n * const uint32Array2 = new Uint32Array([0xffffffff, 0x00000000]);\n * const uint8Array2 = uint32ToUint8(uint32Array2);\n * console.log(uint8Array2); // Output: Uint8Array [ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 ]\n *\n * @example\n * // Example 3: Handling edge values\n * const uint32Array3 = new Uint32Array([0x0, 0x00000001]);\n * const uint8Array3 = uint32ToUint8(uint32Array3);\n * console.log(uint8Array3); // Output: Uint8Array [ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ]\n *\n * @group Binary\n */\nexport function uint32ToUint8(value: Uint32Array): Uint8Array {\n const uint8Array = new Uint8Array(value.length * 4);\n for (let i = 0; i < value.length; i++) {\n uint8Array[i * 4] = value[i] & 0xff;\n uint8Array[i * 4 + 1] = (value[i] >> 8) & 0xff;\n uint8Array[i * 4 + 2] = (value[i] >> 16) & 0xff;\n uint8Array[i * 4 + 3] = (value[i] >> 24) & 0xff;\n }\n return uint8Array;\n}\n","import { assert } from '@/assert';\n\n/**\n * Converts a Uint8Array to a Uint16Array.\n *\n * @param {Uint8Array} value - The input byte array to convert. Must have an even length.\n * @returns {Uint16Array} - The converted Uint16Array.\n *\n * @example\n * // Example 1: Converting a valid Uint8Array into a Uint16Array\n * const uint8Array = new Uint8Array([0x12, 0x34, 0x56, 0x78]);\n * const uint16Array = uint8ToUint16(uint8Array);\n * console.log(uint16Array); // Output: Uint16Array [ 0x1234, 0x5678 ]\n *\n * @example\n * // Example 2: Another conversion example\n * const uint8Array2 = new Uint8Array([0xff, 0xee, 0xdd, 0xcc]);\n * const uint16Array2 = uint8ToUint16(uint8Array2);\n * console.log(uint16Array2); // Output: Uint16Array [ 0xffee, 0xddcc ]\n *\n * @group Binary\n */\nexport function uint8ToUint16(value: Uint8Array): Uint16Array {\n assert.ok(\n value.length % 2 === 0,\n 'Uint8Array length must be even for conversion to Uint16Array',\n );\n\n const uint16Array = new Uint16Array(value.length / 2);\n\n for (let i = 0; i < uint16Array.length; i++) {\n uint16Array[i] = (value[i * 2] << 8) | value[i * 2 + 1];\n }\n\n return uint16Array;\n}\n","import { assert } from '@/assert';\n\n/**\n * Converts a `Uint8Array` into a `Uint32Array`.\n *\n * @param {Uint8Array} value - The input byte array to convert. Length must be a multiple of 4.\n * @returns {Uint32Array} - The converted array of 32-bit unsigned integers.\n *\n * @example\n * // Example 1: Converting a valid Uint8Array into a Uint32Array\n * const uint8Array = new Uint8Array([0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0]);\n * const uint32Array = uint8ToUint32(uint8Array);\n * console.log(uint32Array); // Output: Uint32Array [ 0x78563412, 0xf0debc9a ]\n *\n * @example\n * // Example 2: Another conversion example\n * const uint8Array2 = new Uint8Array([0xff, 0xee, 0xdd, 0xcc, 0xab, 0xcd, 0xef, 0x01]);\n * const uint32Array2 = uint8ToUint32(uint8Array2);\n * console.log(uint32Array2); // Output: Uint32Array [ 0xccddeeff, 0x01abcded ]\n *\n * @group Binary\n */\nexport function uint8ToUint32(value: Uint8Array): Uint32Array {\n assert.ok(\n value.length % 4 === 0,\n 'Uint8Array length must be a multiple of 4 for conversion to Uint32Array',\n );\n\n const uint32Array = new Uint32Array(value.length / 4);\n for (let i = 0; i < uint32Array.length; i++) {\n uint32Array[i] =\n (value[i * 4] << 24) |\n (value[i * 4 + 1] << 16) |\n (value[i * 4 + 2] << 8) |\n value[i * 4 + 3];\n }\n\n return uint32Array;\n}\n","/**\n * Define not enumerable property in object.\n *\n * @example\n * const USER_SYM = Symbol();\n * const user = { id: 1, name: 'Andrew' };\n *\n * // define hidden marker\n * def(user, USER_SYM, true);\n *\n * console.log(user[USER_SYM] === true); // true\n *\n * @group Object\n */\nexport const def = (\n obj: object,\n key: string | symbol,\n value: any,\n writable = false,\n) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value,\n });\n};\n","import { isNumber } from '@/is';\n\nconst rndCharacters = 'abcdefghijklmnopqrstuvwxyz0123456789';\nconst charactersLength = rndCharacters.length;\n\n/**\n * Generates a random string of the specified length using characters from a predefined set.\n * The characters used in the generated string include lowercase letters (a-z) and digits (0-9).\n *\n * @param {number} length - The length of the random string to generate. Must be a positive integer.\n *\n * @returns {string} A random string of the specified length, composed of characters from 'a-z' and '0-9'.\n *\n * @example\n * randomString(8); // e.g. 'a1b2c3d4'\n * randomString(12); // e.g. '3f6g7h8i9j0k'\n * randomString(5); // e.g. '1a2b3'\n *\n * @group Strings\n */\nexport function randomString(length: number): string {\n let str = '';\n let num = isNumber(length) ? Math.max(0, length) : 0;\n while (num--) {\n str += rndCharacters[(charactersLength * Math.random()) | 0];\n }\n return str;\n}\n","import { isObject } from '@/is';\nimport { randomString } from '@/str/randomString';\n\nconst objectKeys = new WeakMap<object, string>();\n\nconst BSON_TYPES = Object.freeze(new Set(['ObjectID', 'ObjectId']));\n\nexport const SYM_WITH_CACHE = Symbol();\n\nexport interface ArgToKeyOptions {\n /**\n * Object key generation strategy.\n *\n * When `json` we will use `JSON.stringify` which not quite effective.\n * Also may not hit into cache when object has different key order.\n *\n * When `ref` we will use WeakMap to store object key which more effective but may produce unexpected cache hit.\n *\n * @default `ref`\n */\n objectStrategy: 'json' | 'ref';\n}\n\nexport const argToKey = /*#__PURE__*/ (\n value: unknown,\n options: Partial<ArgToKeyOptions> = { objectStrategy: 'ref' },\n): string => {\n let result = '';\n\n if (isObject(value)) {\n // edge case for mongoose objects\n if (BSON_TYPES.has((value as any)?._bsontype)) {\n return String(value);\n }\n\n let key: string;\n\n if (options.objectStrategy === 'json') {\n key = JSON.stringify(value);\n } else {\n key = objectKeys.get(value)!;\n\n if (!key) {\n key = createRadomKey();\n objectKeys.set(value, key);\n }\n }\n\n return key;\n } else if (Array.isArray(value)) {\n result += value.map(v => argToKey(v, options)).join('/');\n } else {\n result = String(value);\n }\n\n return result;\n};\n\nfunction createRadomKey() {\n return Date.now() + '_' + randomString(16);\n}\n","import { isPromise } from '@/is';\nimport { def } from '@/object/def';\nimport type { AnyFunction } from '@/types';\nimport { type ArgToKeyOptions, SYM_WITH_CACHE, argToKey } from './utils';\n\ninterface CreateWithCacheOptions<T extends AnyFunction>\n extends Partial<ArgToKeyOptions> {\n getBucket: (pointer: WithCachePointer) => WithCacheStorage;\n getPointer: () => WithCachePointer;\n fn: T;\n}\n\nexport type WithCachePointer = object | Function | symbol;\n\nexport interface WithCacheStorage {\n get(key: unknown): unknown;\n has(key: unknown): boolean;\n delete(key: unknown): void;\n set(key: unknown, value: unknown): void;\n}\n\nexport interface WithCache {\n $cache: {\n getBucket: () => WithCacheStorage;\n getPointer: () => WithCachePointer;\n argToKeyOptions: ArgToKeyOptions;\n };\n}\n\nexport type WithCacheResult<T extends AnyFunction> = T & WithCache;\n\nexport function createWithCache<T extends AnyFunction>({\n fn,\n getPointer,\n getBucket,\n objectStrategy = 'ref',\n}: CreateWithCacheOptions<T>): WithCacheResult<T> {\n const isAsync = fn.constructor.name === 'AsyncFunction';\n\n const argToKeyOptions: ArgToKeyOptions = { objectStrategy };\n\n const $cache: WithCache['$cache'] = {\n getBucket: () => getBucket(getPointer()),\n getPointer,\n argToKeyOptions,\n };\n\n const wrapFn = function (this: any, ...args: Parameters<T>) {\n const storage = getBucket(getPointer());\n const cacheKey = args.map(v => argToKey(v, argToKeyOptions)).join('_');\n\n if (storage.has(cacheKey)) {\n const value = storage.get(cacheKey);\n return isAsync ? Promise.resolve(value) : value;\n }\n\n const newValue = fn.apply(this, args);\n\n if (isPromise(newValue)) {\n // cache only success result\n return newValue.then(value => {\n storage.set(cacheKey, value);\n return value;\n });\n }\n\n storage.set(cacheKey, newValue);\n\n return newValue;\n } as T;\n\n (wrapFn as any).$cache = $cache;\n\n def(wrapFn, SYM_WITH_CACHE, true);\n\n return wrapFn as any;\n}\n\n/**\n * Returns true when function is cached\n * @group Cache\n */\nexport function isWithCache(\n value: unknown,\n): value is WithCacheResult<AnyFunction> {\n return !!value && (value as any)[SYM_WITH_CACHE] === true;\n}\n","import { isFunction, noop } from '@/is';\nimport type { AnyFunction } from '@/types';\nimport {\n type WithCachePointer,\n type WithCacheResult,\n createWithCache,\n} from '../createWithCache';\nimport type { ArgToKeyOptions } from '../createWithCache/utils';\n\nexport interface WithCacheOptions extends Partial<ArgToKeyOptions> {\n /**\n * Custom cache pointer\n */\n cachePointer?: WithCachePointer;\n}\n\nexport const cache = /*#__PURE__*/ new WeakMap<\n WithCachePointer,\n Map<string, any>\n>();\n\n/**\n * Wrap a function to cache results by arguments\n *\n * @example\n * const sum = withCache((a, b) => {\n * console.log('calc?');\n * return a + b;\n * });\n *\n * sum(1, 2); // calc?\n * sum(1, 2);\n * sum(1, 3) // calc?\n *\n * @group Cache\n */\nexport function withCache<T extends AnyFunction>(fn: T): WithCacheResult<T>;\nexport function withCache<T extends AnyFunction>(\n options: WithCacheOptions,\n fn: T,\n): WithCacheResult<T>;\n\nexport function withCache(...args: any[]): WithCacheResult<AnyFunction> {\n let options: WithCacheOptions = {};\n let fn: AnyFunction = noop;\n\n if (isFunction(args[0])) {\n fn = args[0];\n } else if (isFunction(args[1])) {\n options = args[0] || {};\n fn = args[1];\n }\n\n const pointer = options.cachePointer || fn;\n\n const getPointer = () => pointer;\n\n const getBucket = (pointer: any) => {\n let fnCache = cache.get(pointer);\n\n if (!fnCache) {\n fnCache = new Map();\n cache.set(pointer, fnCache);\n }\n\n return fnCache;\n };\n\n return createWithCache({\n fn,\n getBucket,\n getPointer,\n ...options,\n });\n}\n","import { assert } from '@/assert';\n\nexport function assertCapacity(value: unknown): asserts value is number {\n assert.number(value, 'capacity must be a number');\n assert.ok(value > 0, 'capacity must be more then 0.');\n}\n","import { assertCapacity } from './utils';\n\n/**\n * A Map-like class with a fixed capacity, where entries are automatically removed\n * when the capacity is exceeded. This allows for efficient caching behavior,\n * ensuring that the map never grows beyond the specified capacity.\n *\n * When the map reaches its capacity, the oldest entries (in insertion order)\n * are removed to make room for new ones.\n *\n * @example\n * const cache = new FixedMap<string, number>(3);\n * cache.set('a', 1);\n * cache.set('b', 2);\n * cache.set('c', 3);\n * cache.set('d', 4); // 'a' will be evicted, as it's the oldest entry\n *\n * console.log(cache.get('a')); // undefined\n * console.log(cache.get('b')); // 2\n *\n * @group Cache\n */\nexport class FixedMap<K = any, V = any> extends Map<K, V> {\n private _tail: K[];\n\n constructor(private _capacity: number) {\n assertCapacity(_capacity);\n super();\n this._tail = [];\n }\n\n set(key: K, value: V): this {\n if (!super.has.call(this, key)) {\n this._tail.push(key);\n }\n\n super.set.call(this, key, value);\n this._drain();\n\n return this;\n }\n\n delete(key: K): boolean {\n const removed = super.delete.call(this, key);\n\n if (removed) {\n const idx = this._tail.findIndex(v => v === key);\n\n if (idx > -1) {\n this._tail.splice(idx, 1);\n }\n }\n\n return removed;\n }\n\n clear(): void {\n // @ts-expect-error\n delete this._tail;\n this._tail = [];\n\n super.clear.call(this);\n }\n\n get capacity(): number {\n return this._capacity;\n }\n\n set capacity(value: number) {\n assertCapacity(value);\n this._capacity = value;\n this._drain();\n }\n\n private _drain() {\n while (this._tail.length > this._capacity) {\n const key = this._tail.shift();\n\n key !== undefined && this.delete(key);\n }\n }\n}\n","import { FixedMap } from '../FixedMap';\n\nexport interface TimeBucketOptions {\n /**\n * The size of each time bucket in milliseconds. This is the interval at which\n * the records in the bucket will expire and be dropped.\n */\n sizeMs: number;\n\n /**\n * The maximum number of entries the bucket can hold. Once the capacity is\n * reached, the least recently used entry will be removed.\n * @default Infinity\n */\n capacity?: number;\n}\n\n/**\n * A time-based bucket that holds records for a specific interval defined by `sizeMs`.\n * The records in the bucket will be dropped once the interval elapses, based on the\n * current time. The `TimeBucket` is designed to avoid using timers to track expirations.\n *\n * It can be used to store data that expires over fixed time intervals (e.g., caching,\n * throttling).\n *\n * @example\n * const bucket = new TimeBucket({ sizeMs: 1000, capacity: 10 });\n * bucket.set('key1', 'value1');\n * console.log(bucket.get('key1')); // 'value1'\n *\n * // After 1 second, the bucket will drop the expired records.\n *\n * @group Cache\n */\nexport class TimeBucket<K = any, V = any> {\n private _pointer: number;\n private _sizeMs: number;\n private _bucket: FixedMap<K, V> | Map<K, V>;\n\n constructor({ capacity = Infinity, sizeMs }: TimeBucketOptions) {\n assetSizeMs(sizeMs);\n\n this._sizeMs = sizeMs;\n this._pointer = 0;\n this._bucket = capacity === Infinity ? new Map() : new FixedMap(capacity);\n }\n\n get capacity(): number {\n if (this._bucket instanceof FixedMap) {\n return this._bucket.capacity;\n }\n\n return Infinity;\n }\n\n get sizeMs(): number {\n return this.sizeMs;\n }\n\n set sizeMs(value: number) {\n assetSizeMs(value);\n\n this._sizeMs = value;\n\n this._drainBucket();\n }\n\n get size(): number {\n this._drainBucket();\n return this._bucket.size;\n }\n\n set(key: K, value: V): this {\n this._drainBucket();\n this._bucket.set(key, value);\n\n return this;\n }\n\n get(key: K): any | undefined {\n this._drainBucket();\n return this._bucket.get(key);\n }\n\n has(key: K): boolean {\n this._drainBucket();\n return this._bucket.has(key);\n }\n\n delete(key: K): boolean {\n this._drainBucket();\n return this._bucket.delete(key);\n }\n\n clear() {\n this._pointer = 0;\n this._drainBucket();\n }\n\n keys(): IterableIterator<K> {\n this._drainBucket();\n\n return this._bucket.keys();\n }\n\n values(): IterableIterator<V> {\n this._drainBucket();\n\n return this._bucket.values();\n }\n\n entries(): IterableIterator<[K, V]> {\n this._drainBucket();\n\n return this._bucket.entries();\n }\n\n forEach(\n callbackfn: (value: V, key: K, map: TimeBucket<K, V>) => void,\n thisArg?: any,\n ): void {\n this._drainBucket();\n return this._bucket.forEach((value, key) => {\n callbackfn(value, key, this);\n });\n }\n\n private _drainBucket() {\n const newPointer = bucketPointer(this._sizeMs);\n\n if (newPointer !== this._pointer) {\n const capacity =\n this._bucket instanceof FixedMap ? this._bucket.capacity : Infinity;\n\n // @ts-expect-error\n delete this._bucket;\n\n this._pointer = newPointer;\n this._bucket = capacity === Infinity ? new Map() : new FixedMap(capacity);\n }\n }\n}\n\nfunction assetSizeMs(value: unknown) {\n if (typeof value !== 'number' || isNaN(value)) {\n throw new TypeError('msSize must be a number');\n }\n\n if (value <= 0) {\n throw new TypeError('msSize must be more then 0.');\n }\n}\n\nfunction bucketPointer(size: number): number {\n return Math.floor(Date.now() / size) * size;\n}\n","import type { AnyFunction } from '@/types';\nimport {\n type WithCachePointer,\n type WithCacheResult,\n createWithCache,\n} from '../createWithCache';\nimport type { ArgToKeyOptions } from '../createWithCache/utils';\nimport { TimeBucket } from '../TimeBucket';\n\nexport interface WithCacheBucketOptions extends Partial<ArgToKeyOptions> {\n /**\n * Define cached records drops interval.\n */\n sizeMs: number;\n\n /**\n * Capacity of cached records\n */\n capacity?: number;\n\n /**\n * Custom cache pointer\n */\n cachePointer?: WithCachePointer;\n}\n\nexport const cacheBucket = /*#__PURE__*/ new WeakMap<\n WithCachePointer,\n TimeBucket<string, any>\n>();\n\n/**\n * Wrap a function to cache results by arguments\n *\n * But with time and capacity limitation\n *\n * @example\n * const sum = withCacheBucket({ capacity: 1, sizeMs: 1000000 }, (a, b) => {\n * console.log('calc?');\n * return a + b;\n * });\n *\n * sum(1, 2); // calc?\n * sum(1, 2);\n * sum(1, 3) // calc?\n * sum(1, 3)\n * sum(1, 2); // calc?\n *\n * @group Cache\n */\nexport function withCacheBucket<T extends AnyFunction>(\n { capacity, sizeMs, cachePointer, ...options }: WithCacheBucketOptions,\n fn: T,\n): WithCacheResult<T> {\n const pointer = cachePointer || fn;\n\n const getPointer = () => {\n return pointer;\n };\n\n const getBucket = () => {\n let fnCache = cacheBucket.get(pointer);\n\n if (!fnCache) {\n fnCache = new TimeBucket({ sizeMs, capacity });\n cacheBucket.set(pointer, fnCache);\n }\n\n return fnCache;\n };\n\n return createWithCache({\n fn,\n getBucket,\n getPointer,\n ...options,\n });\n}\n","import type { AnyFunction } from '@/types';\nimport {\n type WithCachePointer,\n type WithCacheResult,\n createWithCache,\n} from '../createWithCache';\nimport type { ArgToKeyOptions } from '../createWithCache/utils';\nimport { FixedMap } from '../FixedMap';\n\nexport interface WithCacheFixedOptions extends Partial<ArgToKeyOptions> {\n /**\n * Capacity of cached records\n */\n capacity: number;\n\n /**\n * Custom cache pointer\n */\n cachePointer?: WithCachePointer;\n}\n\nexport const cacheFixed = /*#__PURE__*/ new WeakMap<\n WithCachePointer,\n FixedMap<string, any>\n>();\n\n/**\n * Wrap a function to cache results by arguments\n *\n * But with capacity limitation\n *\n * @example\n * const sum = withCacheFixed({ capacity: 1 }, (a, b) => {\n * console.log('calc?');\n * return a + b;\n * });\n *\n * sum(1, 2); // calc?\n * sum(1, 2);\n * sum(1, 3) // calc?\n * sum(1, 3)\n * sum(1, 2); // calc?\n *\n * @group Cache\n */\nexport function withCacheFixed<T extends AnyFunction>(\n { capacity, cachePointer, ...options }: WithCacheFixedOptions,\n fn: T,\n): WithCacheResult<T> {\n const pointer = cachePointer || fn;\n\n const getPointer = () => fn;\n\n const getBucket = () => {\n let fnCache = cacheFixed.get(pointer);\n\n if (!fnCache) {\n fnCache = new FixedMap(capacity);\n cacheFixed.set(pointer, fnCache);\n }\n\n return fnCache;\n };\n\n return createWithCache({\n fn,\n getBucket,\n getPointer,\n ...options,\n });\n}\n","import { isNumber } from '@/is';\n\n/**\n * A simple implementation of a Least Recently Used (LRU) cache. This cache stores\n * key-value pairs and ensures that the most recently accessed items are kept\n * in the cache, while the least recently used items are evicted when the cache\n * reaches its capacity.\n *\n * The cache is implemented as a doubly linked list where the head represents\n * the most recently accessed item, and the tail represents the least recently\n * accessed item. When the cache is full, the least recently used item (tail)\n * is removed to make space for new items.\n *\n * @group Cache\n */\nexport class LruCache<TKey = any, TValue = any> {\n private items: Map<TKey, number>;\n private forward: Uint8Array | Uint16Array | Uint32Array;\n private backward: Uint8Array | Uint16Array | Uint32Array;\n private K: TKey[];\n private V: (TValue | undefined)[];\n\n size: number;\n private head: number;\n private tail: number;\n\n constructor(private capacity: number) {\n this.capacity = Math.max(isNumber(capacity) ? capacity : 0, 0);\n\n this.forward = pointerArray(this.capacity);\n this.backward = pointerArray(this.capacity);\n this.K = new Array(capacity);\n this.V = new Array(capacity);\n\n this.items = new Map();\n\n this.size = 0;\n this.head = 0;\n this.tail = 0;\n }\n\n /**\n * Method used to clear the structure.\n */\n clear() {\n this.size = 0;\n this.head = 0;\n this.tail = 0;\n this.items.clear();\n }\n\n set(key: TKey, value: TValue): this {\n let pointer = this.items.get(key);\n\n // The key already exists, we just need to update the value and splay on top\n if (pointer !== undefined) {\n this.splayOnTop(pointer);\n this.V[pointer] = value;\n return this;\n }\n\n // The cache is not yet full\n if (this.size < this.capacity) {\n pointer = this.size++;\n }\n\n // Cache is full, we need to drop the last value\n else {\n pointer = this.tail;\n this.tail = this.backward[pointer];\n this.items.delete(this.K[pointer]);\n }\n\n // Storing key & value\n this.items.set(key, pointer);\n this.K[pointer] = key;\n this.V[pointer] = value;\n\n // Moving the item at the front of the list\n this.forward[pointer] = this.head;\n this.backward[this.head] = pointer;\n this.head = pointer;\n\n return this;\n }\n\n has(key: TKey): boolean {\n return this.peek(key) !== undefined;\n }\n\n delete(key: TKey): void {\n const pointer = this.items.get(key);\n\n if (pointer === undefined) return;\n\n this.V[pointer] = undefined;\n }\n\n get(key: TKey): TValue | undefined {\n const pointer = this.items.get(key);\n\n if (pointer === undefined) return;\n\n this.splayOnTop(pointer);\n\n return this.V[pointer];\n }\n\n /**\n * Method used to get the value attached to the given key. Does not modify\n * the ordering of the underlying linked list.\n */\n peek(key: TKey): TValue | undefined {\n const pointer = this.items.get(key);\n\n if (pointer === undefined) return;\n\n return this.V[pointer];\n }\n\n /**\n * Method used to create an iterator over the cache's keys from most\n * recently used to least recently used.\n */\n keys(): IterableIterator<TKey> {\n let i = 0,\n l = this.size;\n\n let pointer = this.head,\n keys = this.K,\n forward = this.forward;\n\n const iterator: Iterator<TKey> = {\n next: () => {\n if (i >= l) return { done: true, value: undefined };\n\n const key = keys[pointer];\n\n i++;\n\n if (i < l) pointer = forward[pointer];\n\n // skip marked as removed\n if (this.peek(key) === undefined) return iterator.next();\n\n return {\n done: false,\n value: key,\n };\n },\n };\n\n return {\n ...iterator,\n [Symbol.iterator]() {\n return this;\n },\n };\n }\n\n /**\n * Method used to create an iterator over the cache's values from most\n * recently used to least recently used.\n *\n */\n values(): IterableIterator<TValue> {\n let i = 0,\n l = this.size;\n\n let pointer = this.head,\n values = this.V,\n forward = this.forward;\n\n const iterator: Iterator<TValue> = {\n next: () => {\n if (i >= l) return { done: true, value: undefined };\n\n const value = values[pointer];\n\n i++;\n\n if (i < l) pointer = forward[pointer];\n\n // skip marked as removed\n if (value === undefined) return iterator.next();\n\n return {\n done: false,\n value: value,\n };\n },\n };\n\n return {\n ...iterator,\n [Symbol.iterator]() {\n return this;\n },\n };\n }\n\n /**\n * Method used to create an iterator over the cache's entries from most\n * recently used to least recently used.\n *\n * @return {IterableIterator<[TKey, TValue | undefined]>}\n */\n entries() {\n let i = 0,\n l = this.size;\n\n let pointer = this.head,\n keys = this.K,\n values = this.V,\n forward = this.forward;\n\n /** @type {Iterator<[TKey, TValue | undefined]>} */\n const iterator = {\n next() {\n if (i >= l) return { done: true, value: undefined };\n\n const key = keys[pointer],\n value = values[pointer];\n\n i++;\n\n if (i < l) pointer = forward[pointer];\n\n return {\n done: false,\n value: [key, value],\n };\n },\n };\n\n return {\n ...iterator,\n [Symbol.iterator]() {\n return this;\n },\n };\n }\n\n /**\n * Method used to splay a value on top.\n *\n * @param {number} pointer - Pointer of the value to splay on top.\n */\n splayOnTop(pointer: number): this {\n const oldHead = this.head;\n\n if (this.head === pointer) return this;\n\n const previous = this.backward[pointer],\n next = this.forward[pointer];\n\n if (this.tail === pointer) {\n this.tail = previous;\n } else {\n this.backward[next] = previous;\n }\n\n this.forward[previous] = next;\n\n this.backward[oldHead] = pointer;\n this.head = pointer;\n this.forward[pointer] = oldHead;\n\n return this;\n }\n\n [Symbol.iterator]() {\n return this.entries();\n }\n}\n\nconst MAX_8BIT_INTEGER = Math.pow(2, 8) - 1,\n MAX_16BIT_INTEGER = Math.pow(2, 16) - 1,\n MAX_32BIT_INTEGER = Math.pow(2, 32) - 1;\n\nfunction pointerArray(size: number): Uint8Array | Uint16Array | Uint32Array {\n const maxIndex = size - 1;\n\n if (maxIndex <= MAX_8BIT_INTEGER) return new Uint8Array(size);\n\n if (maxIndex <= MAX_16BIT_INTEGER) return new Uint16Array(size);\n\n if (maxIndex <= MAX_32BIT_INTEGER) return new Uint32Array(size);\n\n throw new Error('Pointer Array of size > 4294967295 is not supported.');\n}\n","import type { AnyFunction } from '@/types';\nimport {\n type WithCachePointer,\n type WithCacheResult,\n createWithCache,\n} from '../createWithCache';\nimport type { ArgToKeyOptions } from '../createWithCache/utils';\nimport { LruCache } from '../LruCache';\n\nexport interface WithCacheLruOptions extends Partial<ArgToKeyOptions> {\n capacity: number;\n cachePointer?: WithCachePointer;\n}\n\nexport const cacheLRU = /*#__PURE__*/ new WeakMap<\n WithCachePointer,\n LruCache<string, any>\n>();\n\n/**\n * Wrap a function to cache results by arguments\n *\n * But with LRU\n *\n * @example\n * const sum = withCacheLRU({ capacity: 100 }, (a, b) => {\n * console.log('calc?');\n * return a + b;\n * });\n *\n * sum(1, 2); // calc?\n * sum(1, 2);\n *\n * @group Cache\n */\nexport function withCacheLRU<T extends AnyFunction>(\n { capacity, cachePointer, ...options }: WithCacheLruOptions,\n fn: T,\n): WithCacheResult<T> {\n const pointer = cachePointer || fn;\n\n const getPointer = () => {\n return pointer;\n };\n\n const getBucket = () => {\n let fnCache = cacheLRU.get(pointer);\n\n if (!fnCache) {\n fnCache = new LruCache(capacity);\n cacheLRU.set(pointer, fnCache);\n }\n\n return fnCache;\n };\n\n return createWithCache({\n fn,\n getBucket,\n getPointer,\n ...options,\n });\n}\n","import { type WithCachePointer, isWithCache } from '../createWithCache';\nimport { type ArgToKeyOptions, argToKey } from '../createWithCache/utils';\nimport { cache } from '../withCache';\nimport { cacheBucket } from '../withCacheBucket';\nimport { cacheFixed } from '../withCacheFixed';\nimport { cacheLRU } from '../withCacheLRU';\n\n/**\n * Drop cached result\n *\n * @example\n * const findUser = withCache((id: number) => db.users.findById(id));\n *\n * dropCache(findUser, 100500);\n *\n * @group Cache\n */\nexport function dropCache(\n cachePointer: WithCachePointer,\n ...args: any[]\n): boolean {\n let argToKeyOptions: ArgToKeyOptions = { objectStrategy: 'ref' };\n let removed = false;\n\n if (isWithCache(cachePointer)) {\n argToKeyOptions = cachePointer.$cache.argToKeyOptions;\n }\n\n const cacheKey = args.map(v => argToKey(v, argToKeyOptions)).join('_');\n\n if (isWithCache(cachePointer)) {\n if (cachePointer.$cache.getBucket().has(cacheKey)) {\n removed = true;\n cachePointer.$cache.getBucket().delete(cacheKey);\n }\n\n cachePointer = cachePointer.$cache.getPointer();\n }\n\n [cache, cacheFixed, cacheBucket, cacheLRU].forEach(map => {\n if (map.get(cachePointer)?.has(cacheKey)) {\n removed = true;\n map.get(cachePointer)?.delete(cacheKey);\n }\n });\n\n return removed;\n}\n","import { assertCapacity } from '../FixedMap/utils';\n\n/**\n * A `WeakMap`-like class with a fixed capacity. Entries are automatically removed\n * when the map exceeds the specified capacity. Unlike a regular `WeakMap`, the\n * entries are limited to a defined size, and the oldest entries are evicted when\n * new ones are added after the capacity is reached.\n *\n * This class behaves similarly to a `WeakMap`, but with the additional constraint\n * of a fixed size. It automatically removes the least recently added key-value\n * pairs when the map grows beyond the specified capacity.\n *\n * @example\n * const cache = new FixedWeakMap<object, number>(3);\n * const obj1 = { id: 1 };\n * const obj2 = { id: 2 };\n * const obj3 = { id: 3 };\n *\n * cache.set(obj1, 1);\n * cache.set(obj2, 2);\n * cache.set(obj3, 3);\n *\n * const obj4 = { id: 4 };\n * cache.set(obj4, 4); // obj1 will be evicted as it's the oldest\n *\n * console.log(cache.get(obj1)); // undefined\n * console.log(cache.get(obj2)); // 2\n * console.log(cache.get(obj4)); // 4\n *\n * @group Cache\n */\nexport class FixedWeakMap<K extends WeakKey = WeakKey, V = any> extends WeakMap<\n K,\n V\n> {\n private _tail: K[];\n\n constructor(private _capacity: number) {\n assertCapacity(_capacity);\n super();\n this._tail = [];\n }\n\n set(key: K, value: V): this {\n if (!super.has(key)) {\n this._tail.push(key);\n }\n\n super.set(key, value);\n this._drain();\n\n return this;\n }\n\n delete(key: K): boolean {\n const removed = super.delete(key);\n\n if (removed) {\n const idx = this._tail.findIndex(v => v === key);\n\n if (idx > -1) {\n this._tail.splice(idx, 1);\n }\n }\n\n return removed;\n }\n\n clear(): void {\n for (const item of this._tail) {\n super.delete(item);\n }\n\n // @ts-expect-error\n delete this._tail;\n this._tail = [];\n }\n\n get size(): number {\n return this._tail.length;\n }\n\n get capacity(): number {\n return this._capacity;\n }\n\n set capacity(value: number) {\n assertCapacity(value);\n this._capacity = value;\n this._drain();\n }\n\n private _drain() {\n while (this._tail.length > this._capacity) {\n const key = this._tail.shift();\n\n key !== undefined && this.delete(key);\n }\n }\n}\n","import type { AnyFunction } from '@/types';\nimport { type WithCachePointer, isWithCache } from '../createWithCache';\nimport { type ArgToKeyOptions, argToKey } from '../createWithCache/utils';\nimport { cache } from '../withCache';\nimport { cacheBucket } from '../withCacheBucket';\nimport { cacheFixed } from '../withCacheFixed';\nimport { cacheLRU } from '../withCacheLRU';\n\n/**\n * Check if function has cached result\n *\n * @example\n * const findUser = withCache((id: number) => db.users.findById(id));\n *\n * const user = findUser(100500);\n *\n * isCached(findUser, 100500); // true\n *\n * @group Cache\n */\nexport function isCached<T extends AnyFunction>(\n fn: AnyFunction,\n ...args: Parameters<T>\n) {\n let argToKeyOptions: ArgToKeyOptions = { objectStrategy: 'ref' };\n let cachePointer: WithCachePointer = fn;\n let cached = false;\n\n if (isWithCache(fn)) {\n argToKeyOptions = fn.$cache.argToKeyOptions;\n }\n\n const cacheKey = args.map(v => argToKey(v, argToKeyOptions)).join('_');\n\n if (isWithCache(fn)) {\n cached = fn.$cache.getBucket().has(cacheKey);\n cachePointer = fn.$cache.getPointer();\n\n if (cached) return true;\n }\n\n return !![cache, cacheFixed, cacheBucket, cacheLRU].some(storage =>\n storage.get(cachePointer)?.has(cacheKey),\n );\n}\n","import { isObject } from '@/is';\nimport { def } from '@/object/def';\nimport type { WithCachePointer, WithCacheResult } from '../createWithCache';\nimport {\n type ArgToKeyOptions,\n SYM_WITH_CACHE,\n argToKey,\n} from '../createWithCache/utils';\nimport { TimeBucket } from '../TimeBucket';\nimport { cacheBucket } from '../withCacheBucket';\n\nconst EMPTY_SYM = Symbol('empty');\n\nexport interface WithCacheBucketBatchOptions<\n T extends object,\n K extends keyof T,\n> {\n /**\n * Define cached records drops interval.\n */\n sizeMs: number;\n\n /**\n * Cache record by object key.\n */\n key: K;\n\n /**\n * Amount of items which will handled by resolver function.\n */\n batchSize?: number;\n\n /**\n * Capacity of cached records\n */\n capacity?: number;\n\n /**\n * Custom cache pointer\n */\n cachePointer?: WithCachePointer;\n\n /**\n * Should we retry resolving for provided item key when previously we got empty result.\n */\n retryEmpty?: boolean;\n\n /**\n * Resolving item function\n */\n resolver?: (values: T[K][]) => Promise<T[]>;\n}\n\n/**\n * In this way we will cache item of resulted array by `key`.\n *\n * Useful when we need for example fetch batch of users by ids but took already cached results if it available.\n *\n * @example TODO\n *\n * @beta\n *\n * @group Cache\n */\nexport function withCacheBucketBatch<T extends object, K extends keyof T>(\n {\n capacity,\n sizeMs,\n key,\n batchSize = 10,\n cachePointer,\n retryEmpty = true,\n }: WithCacheBucketBatchOptions<T, K>,\n resolver: (values: T[K][]) => Promise<T[]>,\n): WithCacheResult<(values: T[K][]) => Promise<Map<string, Readonly<T>>>> {\n const pointer = cachePointer || resolver;\n const argToKeyOptions: ArgToKeyOptions = {\n objectStrategy: 'json',\n };\n\n const getPointer = () => {\n return pointer;\n };\n\n const getBucket = () => {\n let fnCache = cacheBucket.get(pointer);\n\n if (!fnCache) {\n fnCache = new TimeBucket({ sizeMs, capacity });\n cacheBucket.set(pointer, fnCache);\n }\n\n return fnCache;\n };\n\n const wrapFn = async function (this: any, values: any) {\n const result = new Map();\n\n let fnCache = getBucket();\n\n const batchSet = new Set<any>();\n\n const drainMaybe = async () => {\n if (!batchSet.size) return;\n\n const items = await resolver.call(this, Array.from(batchSet));\n\n for (let idx = 0; idx < items.length; idx++) {\n const item = items[idx];\n\n if (!isObject(item)) continue;\n\n const id = argToKey(item[key], argToKeyOptions);\n\n batchSet.delete(id);\n result.set(id, item);\n fnCache?.set(id, item);\n }\n\n for (const batchItem of batchSet.values()) {\n fnCache?.set(batchItem, EMPTY_SYM);\n }\n\n batchSet.clear();\n };\n\n let pos = 0;\n\n while (pos < values.length) {\n const id = argToKey(values[pos], argToKeyOptions);\n const item = fnCache.get(id);\n\n if (item) {\n if (item === EMPTY_SYM) {\n if (retryEmpty) batchSet.add(id);\n } else {\n result.set(id, item);\n }\n } else {\n batchSet.add(id);\n }\n\n if (batchSet.size >= batchSize) {\n await drainMaybe();\n }\n\n pos++;\n }\n\n await drainMaybe();\n\n return result;\n };\n\n wrapFn.$cache = { getBucket, getPointer, argToKeyOptions };\n\n def(wrapFn, SYM_WITH_CACHE, true);\n\n return wrapFn;\n}\n","import { isEmpty } from '@/is';\n\n/**\n * Removes properties with empty values from an object.\n *\n * This function iterates over the object's keys and deletes any property whose value\n * is considered \"empty\" (e.g., `null`, `undefined`, `[]`, `{}`, `''`, `false`).\n *\n * ⚠️ **Mutates the original object**: The input object is directly modified, and properties\n * are removed from it.\n *\n * @param {Record<string, any>} obj - The object to clean up, where empty fields will be removed.\n * @returns {Record<string, any>} The cleaned object with empty fields removed.\n *\n * @example\n * const user = { id: 1, name: 'Andrew', roles: [], address: null };\n * cleanEmpty(user);\n *\n * console.log(user); // Outputs: { id: 1, name: 'Andrew' }\n *\n * @example\n * const product = { name: 'Laptop', description: '', price: 1000, tags: [] };\n * cleanEmpty(product);\n *\n * console.log(product); // Outputs: { name: 'Laptop', price: 1000 }\n *\n * @group Object\n */\nexport function cleanEmpty(obj: Record<any, any>): Record<any, any> {\n let value;\n for (const key of Object.keys(obj)) {\n value = obj[key];\n\n if (isEmpty(value)) {\n delete obj[key];\n }\n }\n\n return obj;\n}\n","/**\n * Removes all properties from the given object, including symbol keys.\n *\n * This function deletes all enumerable properties, both string and symbol keys, from the\n * input object. The object is directly mutated by this operation.\n *\n * ⚠️ **Mutates the original object**: The function modifies the input object in place.\n *\n * ⚠️ **Removes symbol keys**: Symbol-based keys are also deleted, unlike typical object\n * iteration methods.\n *\n * @param {Record<string, any>} input - The object to clean up. After execution, it will be empty.\n * @returns {void} This function does not return a value, as it mutates the input object directly.\n *\n * @example\n * const user = { id: 1, name: 'Andrew', roles: [], [Symbol('unique')]: 'symbolValue' };\n * cleanObject(user);\n *\n * console.log(user); // Outputs: {}\n *\n * @example\n * const settings = { theme: 'dark', [Symbol('private')]: 'secret' };\n * cleanObject(settings);\n *\n * console.log(settings); // Outputs: {}\n *\n * @group Object\n */\nexport const cleanObject = (input: Record<string, any>) => {\n [...Object.keys(input), ...Object.getOwnPropertySymbols(input)].forEach(\n (key: any) => {\n delete input[key];\n },\n );\n};\n","import { isObject } from '@/is';\n\n/**\n * Performs a deep merge of the source object into the destination object.\n *\n * This function recursively copies properties from the source object to the destination object.\n * If a property is an object itself, it will recursively merge its properties. Otherwise,\n * the value will be directly assigned to the destination object.\n *\n * ⚠️ **Mutates the destination object**: The destination object is modified in place.\n *\n * @param {object} dest - The target object that will be modified with properties from the source.\n * @param {object} source - The source object whose properties will be copied to the destination.\n * @returns {void} This function does not return a value, as it mutates the destination object.\n *\n * @example\n * const user = {\n * id: 1,\n * name: 'Andrew',\n * data: { a: 1, b: 2 },\n * };\n *\n * deepAssign(user, { data: { c: 3 } });\n *\n * console.log(user);\n * // Outputs: '{ id: 1, name: 'Andrew', data: { a: 1, b: 2, c: 3 } }'\n *\n * @example\n * const config = { theme: { dark: true }, version: '1.0' };\n * const updates = { theme: { light: false }, version: '2.0' };\n *\n * deepAssign(config, updates);\n *\n * console.log(config);\n * // Outputs: '{ theme: { dark: true, light: false }, version: '2.0' }'\n *\n * @group Object\n */\nexport const deepAssign = (dest: object, source: object): void => {\n for (const key of Object.keys(source)) {\n const destValue = (dest as any)[key];\n const sourceValue = (source as any)[key];\n\n if (isObject(destValue) && isObject(sourceValue)) {\n deepAssign(destValue as any, sourceValue as any);\n } else {\n (dest as any)[key] = sourceValue;\n }\n }\n};\n","import _cloneDeep from 'lodash/cloneDeep.js';\n\n/**\n * Recursively clones the provided value, creating a deep copy.\n *\n * This function performs a deep clone of the provided value. Any nested objects, arrays, or other complex types will be cloned recursively,\n * ensuring that the original value and the cloned value are completely independent.\n *\n * @param {T} value - The value to recursively clone. Can be any type (object, array, primitive, etc.).\n * @returns {T} Returns a new deeply cloned instance of the original value.\n *\n * @example\n * const original = { name: 'Alice', details: { age: 25, country: 'Wonderland' } };\n * const cloned = deepClone(original);\n *\n * cloned.details.age = 30;\n * console.log(original.details.age); // 25\n * console.log(cloned.details.age); // 30\n *\n * @example\n * const arr = [1, [2, 3], 4];\n * const clonedArr = deepClone(arr);\n * clonedArr[1][0] = 99;\n * console.log(arr[1][0]); // 2\n * console.log(clonedArr[1][0]); // 99\n *\n * @group Object\n */\nexport const deepClone = <T>(value: T): T => {\n return _cloneDeep(value);\n};\n","import { arrayable } from '@/array/arrayable';\nimport { isError, isPrimitive, isString } from '@/is';\nimport type { Arrayable } from '@/types';\nimport _cloneDeepWith from 'lodash/cloneDeepWith.js';\nimport { def } from '../def';\n\nconst WITH_CUSTOMIZER_FACTORY_SYM = Symbol();\n\nexport type WithCustomizer = (\n value: any,\n key: number | string | undefined,\n) => any;\n\nexport type WithCustomizerFactory = () => WithCustomizer;\n\nexport type WithCustomizerValue = Readonly<\n Arrayable<WithCustomizer | WithCustomizerFactory>\n>;\n\n/**\n * Recursively clones the provided value with a customizer function that allows for transformation of certain values during the cloning process.\n *\n * This function deep clones the value while providing a way to customize the cloning behavior of certain properties or elements.\n * The `customizer` function will be called for each value being cloned, and if the customizer function returns a value other than `undefined`,\n * the original value will be replaced with the returned value. This allows for specific modifications to parts of the structure being cloned.\n *\n * @param {T} value - The value to recursively clone. Can be any type (object, array, primitive, etc.).\n * @param {WithCustomizerValue} customizer - A function to customize the cloning process. It receives the current value and key, and must return\n * either a modified value or `undefined` (to keep the original value).\n *\n * @returns {T} Returns a new deep clone of the original value, with customizations applied as per the `customizer` function.\n *\n * @example\n * const original = { name: 'Alice', age: 30, details: { country: 'Wonderland', city: 'London' } };\n *\n * const customizer = (value, key) => {\n * if (key === 'city') return 'Paris'; // Customizing the 'city' field to 'Paris'.\n * };\n *\n * const cloned = deepCloneWith(original, customizer);\n * console.log(cloned.details.city); // 'Paris'\n * console.log(original.details.city); // 'London' (original is unchanged)\n *\n * @example\n * const arr = [1, [2, 3], 4];\n *\n * const customizer = (value) => {\n * if (Array.isArray(value)) return value.map(item => item * 2); // Doubling the numbers inside arrays.\n * };\n *\n * const clonedArr = deepCloneWith(arr, customizer);\n * console.log(clonedArr); // [1, [4, 6], 4]\n * console.log(arr); // [1, [2, 3], 4] (original is unchanged)\n *\n * @group Object\n */\nexport function deepCloneWith<T>(value: T, customizer: WithCustomizerValue): T {\n const fns = prepareCustomizes(customizer);\n\n return _cloneDeepWith(value, (value, key) => {\n let newValue;\n let replaced = false;\n\n for (const fn of fns) {\n newValue = fn(value, key);\n\n if (newValue !== undefined) {\n value = newValue;\n replaced = true;\n }\n }\n\n if (replaced) return value;\n });\n}\n\nexport function createDeepCloneWith(\n customizer: WithCustomizerValue,\n): <T>(value: T) => T {\n return value => {\n return deepCloneWith(value, customizer);\n };\n}\n\nfunction prepareCustomizes(value: WithCustomizerValue): WithCustomizer[] {\n return arrayable(value).map(v => (isCustomizerFactory(v) ? v() : v));\n}\n\nexport function isCustomizerFactory(\n value: unknown,\n): value is WithCustomizerFactory {\n // @ts-expect-error\n return value?.[WITH_CUSTOMIZER_FACTORY_SYM] === true;\n}\n\nexport function createCustomizer(fn: WithCustomizer): WithCustomizer {\n return fn;\n}\n\nexport function createCustomizerFactory(\n fn: (...args: any[]) => WithCustomizer,\n): WithCustomizerFactory {\n def(fn, WITH_CUSTOMIZER_FACTORY_SYM, true);\n return fn;\n}\n\nexport function createSecureCustomizer(\n properties: string[],\n): WithCustomizerFactory {\n const secureLabel = `<** secure **>`;\n const circularLabel = `<** circular **>`;\n const propertiesSet = Object.freeze(\n new Set(properties.map(v => v.toLocaleLowerCase())),\n );\n\n const withCustomizer = (\n seenSet: WeakSet<any>,\n value: any,\n key?: PropertyKey,\n ): any => {\n if (isPrimitive(value)) {\n if (!isString(key)) return;\n if (!propertiesSet.has(key.toLocaleLowerCase())) return;\n\n return secureLabel;\n }\n\n if (seenSet.has(value)) {\n return circularLabel;\n }\n\n seenSet.add(value);\n\n if (isError(value)) {\n return {\n message: value.message,\n stack: value.stack,\n name: value.name,\n };\n }\n };\n\n return createCustomizerFactory(() => {\n const seenSet = new WeakSet();\n return withCustomizer.bind(null, seenSet);\n });\n}\n","import _defaultsDeep from 'lodash/defaultsDeep.js';\n\n/**\n * Recursively assigns default properties.\n * @param object The destination object.\n * @param sources The source objects.\n * @return Returns object.\n *\n * @example\n * const obj = { name: 'Alice', age: 30 };\n * const defaults = { name: 'Bob', age: 25, country: 'Wonderland' };\n *\n * deepDefaults(obj, defaults);\n * console.log(obj);\n * // Output: { name: 'Alice', age: 30, country: 'Wonderland' }\n * // The 'name' and 'age' properties are not overwritten since they already exist.\n *\n * @example\n * const obj = { user: { name: 'Alice' } };\n * const defaults = { user: { age: 25 } };\n *\n * deepDefaults(obj, defaults);\n * console.log(obj);\n * // Output: { user: { name: 'Alice', age: 25 } }\n * // The 'age' property is added to 'user', while 'name' remains unchanged.\n *\n * @group Object\n */\nexport const deepDefaults = _defaultsDeep;\n","/**\n * Recursively freezes an object or array, making it immutable at all levels.\n *\n * This function is similar to `Object.freeze()`, but instead of freezing only the top-level\n * properties of an object, it recursively freezes every nested object or array, ensuring\n * that no properties or elements can be modified at any depth.\n *\n * **Important**:\n * - Once frozen, attempting to modify any property or element of the object will result in an error in strict mode.\n * - If a property of an object or an element of an array is itself an object, it will also be frozen.\n *\n * @param {T} value - The object or array to freeze deeply.\n * @returns {T} The frozen object or array, which is also deeply immutable.\n *\n * @example\n * const config = deepFreeze({\n * db: { uri: '' },\n * });\n *\n * config.db.uri = 'test'; // Error: Cannot assign to read-only property 'uri' of object\n *\n * @example\n * const arr = deepFreeze([ { name: 'Alice' }, { name: 'Bob' } ]);\n * arr[0].name = 'Charlie'; // Error: Cannot assign to read-only property 'name' of object\n *\n * @group Object\n */\nexport function deepFreeze<T extends object | unknown[]>(value: T): T {\n let currentValue: any = value;\n\n if (!currentValue || typeof currentValue !== 'object') return currentValue;\n\n Object.freeze(currentValue);\n\n if (Array.isArray(currentValue)) {\n for (const item of currentValue) {\n deepFreeze(item);\n }\n\n return currentValue as T;\n } else {\n for (const value of Object.values(currentValue)) {\n deepFreeze(value as any);\n }\n }\n\n return currentValue;\n}\n","/**\n * @example\n * const PERMISSIONS = {\n * USER_CREATE: 1 << 0,\n * USER_UPDATE: 1 << 1,\n * USER_DELETE: 1 << 2,\n * USER_LIST: 1 << 4,\n * } as const;\n *\n * const scope = PERMISSIONS.USER_CREATE | PERMISSIONS.USER_LIST;\n *\n * // { USER_CREATE: true, USER_UPDATE: false, USER_DELETE: false, USER_LIST: true }\n * const flags = flagsToMap(scope, PERMISSIONS);\n */\nexport function flagsToMap(\n value: number,\n bitmaskMap: Record<string, number>,\n): Record<string, boolean>;\n\nexport function flagsToMap(\n value: bigint,\n bitmaskMap: Record<string, bigint>,\n): Record<string, boolean>;\n\n/**\n * Converts bitmask into mapped object with true/false values\n *\n * @group Object\n */\nexport function flagsToMap(\n value: number | bigint,\n bitmaskMap: Record<string, number | bigint>,\n): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n\n const compare = typeof value === 'bigint' ? 0n : 0;\n\n for (const [key, mask] of Object.entries(bitmaskMap)) {\n result[key] = ((value as number) & (mask as number)) !== compare;\n }\n\n return result;\n}\n","import { isObject } from '@/is';\n\ninterface FlattenOptions {\n /**\n * Character to separate the flattened keys\n */\n separator?: string;\n\n /**\n * Prefix to add to the flattened keys\n */\n initialPrefix?: string;\n\n /**\n * Whether to include arrays in the flattened result\n */\n withArrays?: boolean;\n\n /**\n * Custom function to check if a value is an object\n */\n isObjectCompare?: (value: unknown) => boolean;\n}\n\n/**\n * Flattens a nested object into a single-level object, converting nested properties\n * into key-value pairs with keys representing the property path.\n *\n * By default, nested objects are flattened with an underscore (`_`) separator.\n * Arrays can also be flattened into indexed keys. A custom function can be provided\n * to determine if a value should be treated as an object.\n *\n * **Important**:\n * - Nested objects are flattened with keys joined by the `separator` (default: `_`).\n * - Arrays are flattened by their indices (e.g., `array[0]` becomes `array_0`).\n * - A custom `isObjectCompare` function can be provided to determine whether a value\n * should be treated as an object.\n *\n * @param {Record<string, unknown>} obj - The object to flatten.\n * @param {FlattenOptions} options - Optional configuration for flattening behavior.\n * @param {string} [options.separator='_'] - Separator for flattening object keys (default is '_').\n * @param {string} [options.initialPrefix=''] - Prefix to prepend to flattened keys (default is '').\n * @param {boolean} [options.withArrays=true] - Whether to include arrays in the flattened result (default is true).\n * @param {(value: unknown) => boolean} [options.isObjectCompare=isObject] - Custom function to check if a value is an object.\n * @returns {Record<string, unknown>} - The flattened object.\n *\n * @example\n * flatten({\n * name: 'Andrew',\n * config: {\n * canReadPost: true,\n * canUpdatePost: true,\n * }\n * });\n * // Result:\n * // {\n * // 'name': 'Andrew',\n * // 'config_canReadPost': true,\n * // 'config_canUpdatePost': true,\n * // }\n *\n * @example\n * flatten(\n * { user: { name: 'Jane', profile: { age: 30 } } },\n * { separator: '-', initialPrefix: 'root-' }\n * );\n * // Returns:\n * // { 'root-user-name': 'Jane', 'root-user-profile-age': 30 }\n *\n * @group Object\n * @author lukeed\n */\nexport function flatten(\n obj: Record<string, unknown>,\n {\n separator = '_',\n initialPrefix = '',\n withArrays = true,\n isObjectCompare = isObject,\n }: FlattenOptions = {},\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const seen = new WeakSet();\n\n if (isObjectCompare(obj)) {\n iter(\n result,\n seen,\n isObjectCompare,\n separator,\n withArrays,\n obj,\n initialPrefix,\n true,\n );\n }\n\n return result;\n}\n\nfunction iter(\n output: Record<string, unknown>,\n seen: WeakSet<any>,\n isObjectCompare: Exclude<FlattenOptions['isObjectCompare'], undefined>,\n separator: string,\n withArrays: boolean,\n val: any,\n key: string,\n initial?: boolean,\n) {\n if (seen.has(val)) return;\n\n let k,\n pfx = key && !initial ? key + separator : key;\n\n if (Array.isArray(val)) {\n seen.add(val);\n\n if (!withArrays) {\n output[key] = val;\n return;\n }\n\n for (k = 0; k < val.length; k++) {\n iter(\n output,\n seen,\n isObjectCompare,\n separator,\n withArrays,\n val[k],\n pfx + k,\n );\n }\n } else if (isObjectCompare(val)) {\n seen.add(val);\n\n for (k in val) {\n iter(\n output,\n seen,\n isObjectCompare,\n separator,\n withArrays,\n val[k],\n pfx + k,\n );\n }\n } else {\n output[key] = val;\n }\n}\n","import { isObject } from '@/is';\n\n/**\n * Returns true when provided keys exists in target object\n *\n * @example\n * const user = { id: 1, name: 'Andrew' };\n *\n * has(user, ['roles']); // false\n * has(user, ['roles', 'name']); // false\n * has(user, ['name']); // true\n *\n * @group Object\n */\nexport function has<T extends PropertyKey>(\n value: any,\n keys: T[],\n): value is { [K in T]: any } {\n if (!isObject(value)) return false;\n\n for (let idx = 0; idx < keys.length; idx++) {\n const element = keys[idx];\n\n if (!(element in value)) return false;\n }\n\n return true;\n}\n","/**\n * Check if object has own property\n *\n * @group Object\n */\nexport const hasOwn = <T extends object, K extends keyof T>(\n val: T,\n key: K,\n): key is K => Object.prototype.hasOwnProperty.call(val, key);\n","import { isObject } from '@/is';\n\n/**\n * Creates a new object with specified keys omitted.\n *\n * This function takes an object and an array of keys, and returns a new object that\n * excludes the properties corresponding to the specified keys.\n *\n * @template T - The type of object.\n * @template K - The type of keys in object.\n * @param {T} obj - The object to omit keys from.\n * @param {K[]} keys - An array of keys to be omitted from the object.\n * @returns {Omit<T, K>} A new object with the specified keys omitted.\n *\n * @example\n * const obj = { a: 1, b: 2, c: 3 };\n * const result = omit(obj, ['b', 'c']);\n * // result will be { a: 1 }\n *\n * @group Object\n */\nexport function omit<T extends Record<string, any>, U extends keyof T>(\n obj: T,\n excludes: Readonly<Array<U> | Set<U> | Array<string> | Set<string>>,\n): Omit<T, U> {\n const excludesSet = Array.isArray(excludes)\n ? new Set(excludes)\n : excludes instanceof Set\n ? excludes\n : undefined;\n\n if (!excludesSet) {\n return obj;\n }\n\n const result: any = {};\n\n if (!isObject(obj)) {\n return result;\n }\n\n for (const [key, value] of Object.entries(obj)) {\n if (excludesSet.has(key)) continue;\n\n result[key] = value;\n }\n\n return result;\n}\n","/**\n * Pick object keys with excluding prefix keys\n *\n * @example\n * const record = {\n * id: 1,\n * canRead: true,\n * canWrite: true,\n * };\n *\n * omitPrefixed(record, 'can'); // { id: 1 }\n *\n * @group Object\n */\nexport function omitPrefixed(\n obj: Record<string, unknown>,\n prefix: string,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith(prefix)) continue;\n result[key] = value;\n }\n\n return result;\n}\n","import { isObject } from '@/is';\nimport { hasOwn } from '../hasOwn';\n\n/**\n * Creates a new object composed of the picked object properties.\n *\n * This function takes an object and an array of keys, and returns a new object that\n * includes only the properties corresponding to the specified keys.\n *\n * @template T - The type of object.\n * @template K - The type of keys in object.\n * @param {T} obj - The object to pick keys from.\n * @param {K[]} keys - An array of keys to be picked from the object.\n * @returns {Pick<T, K>} A new object with the specified keys picked.\n *\n * @example\n * const obj = { a: 1, b: 2, c: 3 };\n * const result = pick(obj, ['a', 'c']);\n * // result will be { a: 1, c: 3 }\n *\n * @group Object\n */\nexport function pick<T extends Record<string, any>, U extends keyof T>(\n obj: T | null | undefined,\n keys: Readonly<Array<U> | Set<U> | Array<string> | Set<string>>,\n): Pick<T, U> {\n const keysSet = Array.isArray(keys)\n ? new Set(keys)\n : keys instanceof Set\n ? keys\n : undefined;\n\n const result: any = {};\n\n if (!keysSet || !isObject(obj)) {\n return result;\n }\n\n for (const key of keysSet.values()) {\n if (hasOwn(obj, key)) {\n result[key] = (obj as any)[key];\n }\n }\n\n return result;\n}\n","interface PrefixedValuesOptions {\n /**\n * Key prefix\n */\n prefix: string;\n\n /**\n * Remove prefix from resulted object\n * @default false\n */\n prefixTrim?: boolean;\n}\n\n/**\n * Pick prefixed keys in target object\n *\n * @example\n * const record = {\n * id: 1,\n * canRead: true,\n * canWrite: true,\n * };\n *\n * // { canRead: true, canWrite: true }\n * pickPrefixed(record, 'can');\n *\n * // { Read: true, Write: true }\n * pickPrefixed(record, { prefix: 'can', prefixTrim: true });\n *\n * @group Object\n */\nexport function pickPrefixed(\n obj: object,\n options: PrefixedValuesOptions | string,\n) {\n let prefix;\n let prefixTrim = false;\n\n if (typeof options === 'string') {\n prefix = options;\n } else {\n prefix = options.prefix;\n prefixTrim = options.prefixTrim === true;\n }\n\n const result = {};\n\n for (let [key, value] of Object.entries(obj)) {\n if (!key.startsWith(prefix!)) continue;\n if (prefixTrim) key = key.substring(prefix!.length);\n\n // @ts-expect-error\n result[key] = value;\n }\n\n return result;\n}\n","import _set from 'lodash/set.js';\n\n/**\n * Same as `get` but for setting property by dot notation.\n *\n * @group Object\n */\nexport const set = _set;\n","/**\n * Converts object into Map\n *\n * @example\n * const map = toMap({ user1: 'Andrew', user2: 'John' });\n *\n * map.get('user2'); // John\n *\n * @group Object\n */\nexport const toMap = <T extends object>(obj: T): Map<keyof T, T[keyof T]> => {\n const map = new Map<any, any>(Object.entries(obj));\n\n for (const symbol of Object.getOwnPropertySymbols(obj)) {\n map.set(symbol, (obj as any)[symbol]);\n }\n\n return map;\n};\n","import { isObject } from '@/is';\n\nconst badKeys = Object.freeze(\n new Set(['constructor', '__proto__', 'prototype']),\n);\n\n/**\n * Converts a flattened object back into a nested structure.\n *\n * Takes an object with dot-separated keys and converts it into a nested object,\n * where each dot-separated part of the key represents a deeper level in the object.\n *\n * @param {Object} obj - The object to unflatten.\n * @param {string} [separator='_'] - The separator used to split the keys into their nested form. Defaults to '_'.\n * @returns {Object} The unflattened object, with nested keys restored to their original structure.\n *\n * @example\n * const obj = {\n * 'name': 'Andrew',\n * 'config_canReadPost': true,\n * 'config_canUpdatePost': true,\n * };\n *\n * unflatten(obj);\n * // Returns:\n * // {\n * // name: 'Andrew',\n * // config: {\n * // canReadPost: true,\n * // canUpdatePost: true\n * // },\n * // }\n *\n * @example\n * const flattenedObj = {\n * 'user.firstName': 'John',\n * 'user.lastName': 'Doe',\n * 'address.city': 'New York'\n * };\n *\n * unflatten(flattenedObj, '.');\n * // Returns:\n * // {\n * // user: {\n * // firstName: 'John',\n * // lastName: 'Doe'\n * // },\n * // address: {\n * // city: 'New York'\n * // }\n * // }\n *\n * @group Object\n * @author lukeed\n */\nexport function unflatten(input: object, separator = '_') {\n if (!isObject(input)) {\n return {};\n }\n\n let arr, tmp: any, output;\n let i = 0,\n k,\n key;\n\n for (k in input) {\n tmp = output;\n arr = k.split(separator);\n\n for (i = 0; i < arr.length; ) {\n key = arr[i++];\n\n if (tmp == null) {\n tmp = empty(+key);\n output = output || tmp;\n }\n\n if (badKeys.has(key)) break;\n\n if (i < arr.length) {\n if (key in tmp) {\n tmp = tmp[key];\n } else {\n tmp = tmp[key] = empty(+arr[i]);\n }\n } else {\n tmp[key] = (input as any)[k];\n }\n }\n }\n\n return output;\n}\n\nfunction empty(key: unknown): any {\n return key === key ? [] : {};\n}\n","import _unset from 'lodash/unset.js';\n\n/**\n * Same as `set` but unset by dot notation\n * @group Object\n */\nexport const unset = _unset;\n","import { isPromise } from '@/is';\nimport { deepClone } from '@/object';\nimport { def } from '@/object/def';\nimport type { AnyFunction } from '@/types';\nimport { isWithCache } from '../createWithCache';\nimport { SYM_WITH_CACHE } from '../createWithCache/utils';\n\n/**\n * Make deep cloning of function result before returning.\n *\n * @example\n * const findUser = withDeepClone(\n * withCache((id: number) => {\n * return { id, name: 'Andrew' };\n * })\n * );\n *\n * const user1 = findUser(100500);\n * const user2 = findUser(100500);\n * user1.name = 'ABC';\n *\n * console.log(user1.name); // ABC\n * console.log(user2.name); // Andrew\n *\n * @group Cache\n */\nexport function withDeepClone<T extends AnyFunction>(fn: T): T {\n const wrapFn = function (...args) {\n // @ts-expect-error\n const result = fn.apply(this, args);\n\n if (isPromise(result)) {\n return result.then(deepClone);\n }\n\n return deepClone(result);\n } as T;\n\n if (isWithCache(fn)) {\n (wrapFn as any).$cache = fn.$cache;\n }\n\n if ('$cache' in fn) {\n (wrapFn as any).$cache = fn.$cache;\n def(wrapFn, SYM_WITH_CACHE, true);\n }\n\n return wrapFn;\n}\n","import type { AnyFunction } from '@/types';\nimport { cache } from '../withCache';\n\n/**\n * @example TODO\n * @group Cache\n * @beta\n */\nexport function withPointerCache<T>(\n pointer: object,\n dependencies: string[],\n fn: () => T,\n): T {\n const cacheKey = dependencies.map(String).join('_');\n\n let fnCache = cache.get(pointer as AnyFunction);\n\n if (fnCache) {\n const cached = fnCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n } else {\n fnCache = new Map();\n cache.set(pointer as AnyFunction, fnCache);\n }\n\n const newValue = fn();\n\n fnCache.set(cacheKey, newValue);\n\n return newValue;\n}\n","import type { AnyFunction } from './types';\n\n/**\n * Capture stack trace till the function and returns as a `string`\n *\n * @example\n *\n * function main() {\n * const userId = getUserId();\n * }\n *\n * function getUserId() {\n * const stackTrace = captureStackTrace(doCoolStuff);\n * console.warn('Please, use getAccountId instead.', stackTrace);\n * }\n *\n * @group Errors\n */\nexport function captureStackTrace(till: AnyFunction): string {\n const err = new Error('');\n\n if ('captureStackTrace' in Error) {\n (Error.captureStackTrace as any)(err, till);\n }\n\n return (err.stack || '').slice(6);\n}\n","import { isError } from './is.js';\n\n/**\n * Transform value to error object\n * @group Errors\n */\nexport function toError<T>(\n value: T,\n unknownMessage = 'Unknown error',\n): T extends Error ? T : Error {\n if (isError(value)) {\n return value as any;\n }\n\n const error = new Error(unknownMessage, { cause: value });\n\n Error.captureStackTrace(error, toError);\n\n return error as any;\n}\n","import { isPromise } from './is';\nimport { toError } from './toError';\n\nexport type CatchErrorResult<T> =\n T extends Promise<unknown>\n ? Promise<OkResult<Awaited<T>> | ErrorResult>\n : OkResult<T> | ErrorResult;\n\ntype ErrorResult = [Error, undefined];\n\ntype OkResult<T> = [undefined, T];\n\n/**\n * You're tired to write `try... catch`, and so are we.\n *\n * Also supports `async/await`\n *\n * @example\n * const [err, result] = catchError(() => {\n * // danger code\n * });\n *\n * @group Errors\n */\nexport function catchError<T>(fn: () => T): CatchErrorResult<T> {\n try {\n const res = fn();\n\n if (isPromise(res)) {\n return res.then(r => [undefined, r]).catch(onError) as any;\n }\n\n return [undefined, res] as any;\n } catch (err) {\n return onError(err) as any;\n }\n}\n\nfunction onError(error: unknown): ErrorResult {\n const err = toError(error);\n return [err, undefined];\n}\n","import { isNumber } from '@/is';\n\n/**\n * Rounds the given value to a specified range. If the value is less than the minimum,\n * it returns the minimum. If the value is greater than the maximum, it returns the maximum.\n * If the value is within the range, it returns the original value.\n *\n * @param {number} num - The number to be clamped.\n * @param {number} min - The minimum value of the range.\n * @param {number} max - The maximum value of the range.\n * @returns {number} - The clamped value within the specified range.\n *\n * @example\n * const min = 5;\n * const max = 10;\n *\n * // Returns: 7 (within range)\n * clamp(7, min, max);\n *\n * // Returns: 10 (clamped to max)\n * clamp(15, min, max);\n *\n * // Returns: 5 (clamped to min)\n * clamp(3, min, max);\n *\n * @group Numbers\n */\nexport const clamp = (num: number, min: number, max: number) => {\n if (!isNumber(num)) return min;\n return Math.min(max, Math.max(min, num));\n};\n","import { isNumber, isString } from '@/is';\nimport { clamp } from '@/num/clamp';\n\n/**\n * Parse alpha channel value and normalize it from 0 to 1\n *\n * @param value Value to be parsed\n * @param fallback Value which will be used as fallback when failed to parse\n *\n * @example\n * parseAlpha('0.1'); // 0.1\n * parseAlpha('10%'); // 0.1\n * parseAlpha(0.1); // 0.1\n *\n * @group Colors\n */\nexport function parseAlpha(value: unknown, fallback: number = 1): number {\n let a: unknown = value;\n\n if (isString(value)) {\n a = value.endsWith('%') ? parseFloat(value) / 100 : parseFloat(value);\n }\n\n if (!isNumber(a)) {\n a = fallback;\n }\n\n return clamp(a as number, 0, 1);\n}\n","import { isString } from '@/is';\nimport { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\n\nconst hexReg = new RegExp(\n /^#([a-f0-9]{3,4}|[a-f0-9]{4}(?:[a-f0-9]{2}){1,2})\\b$/,\n 'i',\n);\n\nexport function parseHEX(value: unknown): Color.ColorChannels | null {\n if (!isString(value)) return null;\n\n const parsed = hexReg.exec(value);\n\n if (!parsed) return null;\n\n let a = 1;\n let hex = parsed[0].replace(/^#/, '');\n\n if (hex.length === 8) {\n a = Number.parseInt(hex.slice(6, 8), 16) / 255;\n hex = hex.slice(0, 6);\n }\n\n if (hex.length === 4) {\n a = Number.parseInt(hex.slice(3, 4).repeat(2), 16) / 255;\n hex = hex.slice(0, 3);\n }\n\n if (hex.length === 3) hex = hex + hex;\n\n return [\n parseInt(hex.slice(0, 2), 16),\n parseInt(hex.slice(2, 4), 16),\n parseInt(hex.slice(4, 6), 16),\n parseAlpha(a),\n ];\n}\n","import { isNumber } from '@/is';\nimport { clamp } from '../clamp';\n\n/**\n * Safely parses a percentage value and returns a number between 0 and 100.\n * It accepts both string and numeric input, automatically handling the '%' sign if present.\n * If the value is not a valid percentage, it returns 0.\n *\n * @param {unknown} value - The value to parse, which can be a string (e.g., '99%') or a number (e.g., 45).\n * @returns {number} A parsed percentage value, constrained between 0 and 100.\n * If the input is invalid or cannot be parsed, it returns 0.\n *\n * @example\n * parsePercentage('99%');\n * // Returns: 99\n *\n * @example\n * parsePercentage('150%');\n * // Returns: 100 (clamped to the maximum allowed value)\n *\n * @example\n * parsePercentage('50.5%');\n * // Returns: 50.5\n *\n * @example\n * parsePercentage('abc');\n * // Returns: 0 (invalid input)\n *\n * @example\n * parsePercentage(80);\n * // Returns: 80 (valid number input)\n *\n * @group Numbers\n */\nexport function parsePercentage(value: unknown): number {\n const parsed = parseFloat(value as any);\n\n if (!isNumber(parsed)) return 0;\n\n return clamp(parsed, 0, 100);\n}\n","import type { Color } from './types';\n\nexport const float = '-?\\\\d*(?:\\\\.\\\\d+)';\nexport const number = `(${float}?)`;\nexport const percentage = `(${float}?%)`;\nexport const numberOrPercentage = `(${float}?%?)`;\n\n/**\n * Check if provided value represents color channels\n * @group Colors\n */\nexport function isColorChannels(value: unknown): value is Color.ColorChannels {\n return Array.isArray(value) && value.length === 4;\n}\n","import { parsePercentage } from '@/num/parsePercentage';\nimport { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\nimport { numberOrPercentage, percentage } from '../utils';\n\nconst hsl = new RegExp(\n `^\n hsla?\\\\(\n \\\\s*(-?\\\\d*(?:\\\\.\\\\d+)?(?:deg|rad|turn)?)\\\\s*,\n \\\\s*${percentage}\\\\s*,\n \\\\s*${percentage}\\\\s*\n (?:,\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n $\n`.replace(/\\n|\\s/g, ''),\n);\n\nconst hsla = new RegExp(\n `^\n hsla?\\\\(\n \\\\s*(-?\\\\d*(?:\\\\.\\\\d+)?(?:deg|rad|turn)?)\\\\s*\n \\\\s+${percentage}\n \\\\s+${percentage}\n \\\\s*(?:\\\\s*\\\\/\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n $\n`.replace(/\\n|\\s/g, ''),\n);\n\n/**\n * Parse a string as a hsl color\n */\nexport function parseHSL(value: string): Color.HSLA | null {\n const parsed = hsla.exec(value) || hsl.exec(value);\n\n if (!parsed) return null;\n\n const [, h, s, l, a = 1] = parsed;\n\n let hh: any = h;\n if (hh.endsWith('turn')) {\n hh = (parseFloat(hh) * 360) / 1;\n } else if (hh.endsWith('rad')) {\n hh = Math.round((parseFloat(hh) * 180) / Math.PI);\n } else {\n hh = parseFloat(hh);\n }\n\n return {\n h: hh,\n s: parsePercentage(s),\n l: parsePercentage(l),\n a: parseAlpha(a === null ? 1 : a),\n };\n}\n","/**\n * Check if bits are set in `number` bitmask\n *\n * @example\n * const scope = (1 << 1 | 1 << 2 | 1 << 3);\n *\n * checkBitmask(scope, 1 << 2); // true\n * checkBitmask(scope, 1 << 5); // false\n *\n * @group Numbers\n */\nexport function checkBitmask(scope: number, flag: number): boolean;\n\n/**\n * Check if bits are set in `bigint` bitmask\n *\n * @example\n * const scope = (1n << 1n | 1n << 2n | 1n << 3n);\n *\n * checkBitmask(scope, 1n << 2n); // true\n * checkBitmask(scope, 1n << 5n); // false\n *\n * @group Numbers\n */\nexport function checkBitmask(scope: bigint, flag: bigint): boolean;\n\nexport function checkBitmask(scope: any, flag: any): boolean {\n return (scope & flag) === flag;\n}\n","/**\n * Returns a random integer between min (inclusive) and max (inclusive).\n * The value is no lower than min (or the next integer greater than min\n * if min isn't an integer) and no greater than max (or the next integer\n * lower than max if max isn't an integer).\n * Using Math.round() will give you a non-uniform distribution!\n *\n * @example\n * getRandomInt(0, 100); // random int between 0 - 100\n *\n * @group Numbers\n */\nexport function getRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","import { assert } from '@/assert';\nimport { getRandomInt } from '../getRandomInt';\n\nexport interface RandomizerOptions {\n min: number;\n max: number;\n pregenerateAmount: number;\n transform: (value: number) => number;\n}\n\nclass Randomizer {\n private _pool: number[] = [];\n private _step: number = 0;\n private _min: number;\n private _max: number;\n private _pregenerateAmount: number;\n private _transform: (value: number) => number;\n\n constructor({ min, max, pregenerateAmount, transform }: RandomizerOptions) {\n this._min = min;\n this._max = max;\n this._pregenerateAmount = pregenerateAmount;\n this._transform = transform;\n }\n\n /**\n * Returns the current step of the randomizer.\n *\n * @returns {number} The current step.\n */\n getCurrentStep(): number {\n return this._step;\n }\n\n /**\n * Sets the current step of the randomizer.\n *\n * @param {number} value - The step to set.\n * @throws {Error} If the provided value is not a valid number or less than 0.\n */\n setCurrentStep(value: number) {\n assert.number(value, 'Current step must be an number');\n assert.ok(value >= 0, 'Current step must be getter or equal 0');\n this._step = value;\n }\n\n /**\n * Retrieves a random number either from the current step or a specific step if provided.\n *\n * @param {number} [fromStep] - The step from which to retrieve the random number (optional).\n * @returns {number} The random number at the current or specified step.\n */\n get(fromStep?: number): number {\n if (fromStep === undefined) {\n return this._lookup(this._step++);\n }\n\n return this._lookup(fromStep);\n }\n\n /**\n * Resets the current step to 0.\n */\n resetStep() {\n this._step = 0;\n }\n\n /**\n * Resets the random number pool, clearing and repopulating it with new random values.\n */\n resetPool() {\n const size = this._pregenerateAmount;\n\n this._pool = Array.from({ length: size });\n\n for (let step = 0; step < size; step++) {\n this._pool[step] = this._rand();\n }\n }\n\n private _rand(): number {\n return this._transform(getRandomInt(this._min, this._max));\n }\n\n private _lookup(step: number): number {\n if (this._pool[step] === undefined) {\n this._pool[step] = this._rand();\n }\n\n return this._pool[step]!;\n }\n}\n\nconst noopTransform = (v: number) => v;\n\n/**\n * Creates a random number generator with step control and optional transformation.\n * Allows caching of generated numbers for efficiency, with optional pregeneration and transformation.\n *\n * @param {RandomizerOptions} options - Configuration for the randomizer.\n * @param {number} options.min - Minimum value for the random number.\n * @param {number} options.max - Maximum value for the random number.\n * @param {number} [options.pregenerateAmount=100] - Number of random numbers to pregenerate and cache.\n * @param {(value: number) => number} [options.transform] - A function to transform the generated random number.\n * @returns {Randomizer} - The randomizer object with step control and number generation.\n *\n *\n * @example\n * // Basic usage of the randomizer\n * const randomizer = createRandomizer({\n * min: 1,\n * max: 10,\n * pregenerateAmount: 5\n * });\n *\n * // Get the random number at the current step\n * console.log(randomizer.get()); // e.g., returns 3\n *\n * // Get the random number at a specific step\n * console.log(randomizer.get(2)); // e.g., returns 7\n *\n * // Get the current step\n * console.log(randomizer.getCurrentStep()); // returns the current step (e.g., 1)\n *\n * // Set the current step to 3\n * randomizer.setCurrentStep(3);\n *\n * // Get the random number at step 3\n * console.log(randomizer.get()); // returns the value for step 3\n *\n * @example\n * // Usage with a transformation function\n * const randomizerWithTransform = createRandomizer({\n * min: 1,\n * max: 10,\n * pregenerateAmount: 5,\n * transform: (value) => value * 2\n * });\n *\n * // Get a transformed random number at the current step\n * console.log(randomizerWithTransform.get()); // e.g., returns 6 (original value 3 transformed by multiplying by 2)\n *\n * // Reset the step to 0\n * randomizerWithTransform.resetStep();\n * console.log(randomizerWithTransform.get()); // returns the random number at step 0\n *\n * @group Numbers\n */\nexport function createRandomizer({\n min = Number.MIN_SAFE_INTEGER,\n max = Number.MAX_SAFE_INTEGER,\n pregenerateAmount = 100,\n transform = noopTransform,\n}: Partial<RandomizerOptions>): Randomizer {\n return new Randomizer({ min, max, pregenerateAmount, transform });\n}\n","/**\n * A class that allows you to calculate the running mean (average) of a set of numbers.\n * It computes the average as new numbers are added and can also reset the progress.\n *\n * @example\n * // Basic usage to calculate running mean\n * const avg = findMean();\n * avg.push(1, 2, 3);\n * console.log(avg.value); // Output: 2 (average of 1, 2, 3)\n *\n * @example\n * // Reset the calculation with an initial value\n * const avg = findMean(10);\n * avg.push(20);\n * console.log(avg.value); // Output: 15 (average of 10, 20)\n * console.log(avg.count); // Output: 2 (two values added)\n */\nexport class FindMean {\n #count: number = 0;\n #value: number = 0;\n\n constructor(initialValue?: number) {\n this.reset(initialValue);\n }\n\n /**\n * Resets the current progress of the mean calculation.\n * Optionally, you can pass an initial value to start the calculation.\n *\n * @param {number} [initialValue] - The initial value to start the mean calculation with.\n * @returns {FindMean} The current instance of the FindMean class for chaining.\n *\n * @example\n * const avg = findMean();\n * avg.push(2, 4);\n * avg.reset();\n * console.log(avg.value); // Output: 0\n */\n reset(initialValue?: number): FindMean {\n if (initialValue === undefined) {\n this.#count = 0;\n this.#value = 0;\n } else {\n this.#count = 1;\n this.#value = initialValue;\n }\n\n return this;\n }\n\n /**\n * Retrieves the current mean value (average).\n *\n * @returns {number} The current mean value.\n *\n * @example\n * const avg = findMean();\n * avg.push(5, 10);\n * console.log(avg.value); // Output: 7.5 (average of 5, 10)\n */\n get value(): number {\n return this.#value;\n }\n\n /**\n * Retrieves the count of numbers added so far.\n *\n * @returns {number} The count of numbers in the set.\n *\n * @example\n * const avg = findMean();\n * avg.push(10, 20);\n * console.log(avg.count); // Output: 2\n */\n get count(): number {\n return this.#count;\n }\n\n /**\n * Adds values to the set and updates the running mean.\n *\n * @param {...number} values - The values to add to the set.\n * @returns {FindMean} The current instance of the FindMean class for chaining.\n *\n * @example\n * const avg = findMean();\n * avg.push(1, 2, 3);\n * console.log(avg.value); // Output: 2 (average of 1, 2, 3)\n * console.log(avg.count); // Output: 3\n */\n push(...values: number[]): FindMean {\n for (const item of values) {\n this.#count++;\n this.#value += (item - this.#value) / this.#count;\n }\n\n return this;\n }\n}\n\n/**\n * Calculate the running mean (average) of a set of numbers.\n *\n * @param {number} [value] - An optional starting value for the mean calculation.\n * @returns {FindMean} A new instance of FindMean class to calculate running mean.\n *\n * @example\n * // Create a FindMean instance and add values to calculate the average\n * const avg = findMean();\n * avg.push(3, 3, 3.3);\n * console.log(avg.value); // Output: 3.1\n * console.log(avg.count); // Output: 3\n *\n * @group Numbers\n */\nexport function findMean(value?: number): FindMean {\n return new FindMean(value);\n}\n","import { isNumber, isString } from '@/is';\n\nexport interface FormatNumber {\n thousands: string;\n decimal: string;\n}\n\nconst defaultFormat: FormatNumber = {\n /**\n * Symbol to separate thousands parts\n */\n thousands: ',',\n\n /**\n * Symbol to separate decimal part\n */\n decimal: '.',\n};\n\nconst regExp = /\\B(?=(\\d{3})+(?!\\d))/g;\n\n/**\n * Formats a number (or string representing a number) into a string with thousands separators and optional decimal points.\n * The function supports customizing the formatting style using the `FormatNumber` object.\n *\n * @param {number | string} value - The number or string to format.\n * If a string is passed, it is parsed to a number before formatting.\n * @param {FormatNumber} [format=defaultFormat] - The format settings for thousands and decimal separators.\n * By default, it uses the `{ thousands: ',', decimal: '.' }`.\n *\n * @returns {string} The formatted number string with appropriate thousands separators and decimal formatting.\n *\n * @example\n * // Format a number with default thousands separator\n * formatNumber(1500);\n * // Returns: '1,500'\n *\n * @example\n * // Format a number with a custom format (e.g., using a comma as the thousands separator)\n * formatNumber(1500.75, { thousands: ' ', decimal: '.' });\n * // Returns: '1 500.75'\n *\n * @group Numbers\n */\nexport function formatNumber(\n value: number | string,\n format: FormatNumber = defaultFormat,\n): string {\n if (isString(value)) {\n return formatNumber(parseFloat(value), format);\n }\n\n if (!isNumber(value)) return '';\n\n const [integerPart, decimalPart] = value.toFixed(2).split('.');\n\n let result = String(integerPart).replace(regExp, format.thousands);\n\n if (decimalPart !== '00') {\n result += format.decimal + decimalPart;\n }\n\n return result;\n}\n","/**\n * Rounds a given number to a specified number of decimal places.\n * The rounding is done using a method that shifts the decimal point, rounds the number, and then shifts it back.\n *\n * @param {number} value - The number to be rounded.\n * @param {number} [digits=2] - The number of decimal places to round to. Defaults to 2 if not provided.\n * @returns {number} The rounded number with the specified number of decimal places.\n *\n * @example\n * round2digits(3.3333333, 1);\n * // Returns: 3.3\n *\n * @example\n * round2digits(3.3333333, 2);\n * // Returns: 3.33\n *\n * @example\n * round2digits(3.3333333, 3);\n * // Returns: 3.333\n *\n * @example\n * round2digits(3.789, 0);\n * // Returns: 4 (rounded to the nearest integer)\n *\n * @group Numbers\n */\nexport function round2digits(value: number, digits: number = 2) {\n if (digits === 0) {\n return value << 0;\n }\n\n // @ts-expect-error\n return Number(Math.round(value + 'e' + digits) + 'e-' + digits);\n}\n","import { isString } from '@/is';\nimport { type FormatNumber, formatNumber } from '../formatNumber';\nimport { round2digits } from '../round2digits';\n\nexport interface FormatMoney extends FormatNumber {\n symbol: string;\n symbolBefore?: boolean;\n}\n\nconst CURRENCY_FORMAT = new Map<string, FormatMoney>([\n ['USD', { symbol: '$', thousands: ',', decimal: '.', symbolBefore: true }],\n ['EUR', { symbol: '€', thousands: '.', decimal: ',', symbolBefore: true }],\n ['GBP', { symbol: '£', thousands: ',', decimal: '.', symbolBefore: true }],\n ['JPY', { symbol: '¥', thousands: ',', decimal: '', symbolBefore: true }],\n ['AUD', { symbol: 'A$', thousands: ',', decimal: '.', symbolBefore: true }],\n ['CAD', { symbol: 'C$', thousands: ',', decimal: '.', symbolBefore: true }],\n ['CHF', { symbol: 'CHF', thousands: \"'\", decimal: '.', symbolBefore: true }],\n ['CNY', { symbol: '¥', thousands: ',', decimal: '.', symbolBefore: true }],\n ['INR', { symbol: '₹', thousands: ',', decimal: '.', symbolBefore: true }],\n ['KRW', { symbol: '₩', thousands: ',', decimal: '', symbolBefore: true }],\n ['RUB', { symbol: '₽', thousands: ' ', decimal: ',', symbolBefore: false }],\n ['UAH', { symbol: '₴', thousands: ' ', decimal: ',', symbolBefore: false }],\n ['BRL', { symbol: 'R$', thousands: '.', decimal: ',', symbolBefore: true }],\n ['MXN', { symbol: '$', thousands: ',', decimal: '.', symbolBefore: true }],\n ['ZAR', { symbol: 'R', thousands: ' ', decimal: ',', symbolBefore: true }],\n ['UAH', { symbol: '₴', thousands: ' ', decimal: ',', symbolBefore: true }],\n]);\n\nconst DEF_FORMAT: FormatMoney = {\n decimal: ' ',\n thousands: ',',\n symbol: '',\n symbolBefore: false,\n};\n\n/**\n * Formats a given number (amount of money) as a currency string.\n * This function supports both integer and floating-point representations of money\n * and automatically applies the appropriate currency formatting for the specified currency code.\n *\n * @param {number} amount - The amount of money to format (in cents or as a floating-point value).\n * @param {string | FormatMoney} formatOrCode - The currency format or the currency code (e.g., 'USD').\n * If the format is passed as a string, the function will look up the format for that currency code.\n * @param {boolean} [intMode=false] - When set to `true`, the amount is considered to be in integer form (i.e., cents).\n * The value will be divided by 100 to convert it to a decimal format.\n *\n * @returns {string} The formatted money string, including the currency symbol and the properly formatted number.\n *\n * @example\n * // Basic formatting with USD currency\n * formatMoney(1500, 'USD');\n * // Returns: '$1,500'\n *\n * @example\n * // Formatting when the amount is in integer form (representing cents)\n * formatMoney(1599, 'USD', true);\n * // Returns: '$15.99'\n *\n * @group Numbers\n */\nexport function formatMoney(\n amount: number,\n formatOrCode: string | FormatMoney = 'USD',\n intMode = false,\n): string {\n if (intMode) {\n amount = round2digits(amount / 100, 2);\n }\n\n const format = isString(formatOrCode)\n ? CURRENCY_FORMAT.get(formatOrCode) || {\n ...DEF_FORMAT,\n symbol: formatOrCode,\n }\n : formatOrCode;\n\n const formattedNumber = formatNumber(amount, format);\n\n return format.symbolBefore\n ? format.symbol + formattedNumber\n : formattedNumber + format.symbol;\n}\n","/**\n * Humanizes large numbers into a more readable format using suffixes like K, M, B, T (thousand, million, billion, trillion).\n *\n * @param {number | string} input - The number or string to humanize.\n * If the input is a string, it will be parsed into a number.\n * @param {number} [decimals=1] - The number of decimal places to display. Default is 1.\n * @returns {string} A humanized string representation of the number.\n *\n * @example\n * humanize(1000000);\n * // Returns: '1M'\n *\n * @example\n * humanize(1234567890);\n * // Returns: '1.2B'\n *\n * @example\n * humanize(9876543210, 2);\n * // Returns: '9.88B'\n *\n * @example\n * humanize(500);\n * // Returns: '500'\n *\n * @example\n * humanize('1000000');\n * // Returns: '1M'\n *\n * @group Numbers\n */\nexport function humanize(input: number | string, decimals = 1): string {\n if (input === null || input === undefined) {\n return String(input);\n }\n\n decimals = Math.max(decimals, 0);\n\n const number = parseInt(input as string, 10);\n\n if (!Number.isFinite(number)) {\n return String(input);\n }\n\n const signString = number < 0 ? '-' : '';\n const unsignedNumber = Math.abs(number);\n const unsignedNumberString = String(unsignedNumber);\n const numberLength = unsignedNumberString.length;\n const numberLengths = [13, 10, 7, 4];\n const bigNumPrefixes = ['T', 'B', 'M', 'k'];\n\n // small numbers\n if (unsignedNumber < 1000) {\n return `${signString}${unsignedNumberString}`;\n }\n\n // huge numbers\n if (numberLength > numberLengths[0] + 3) {\n return number.toExponential(decimals).replace('e+', 'x10^');\n }\n\n // 999 < unsignedNumber < 999,999,999,999,999\n let length = 0;\n for (let i = 0; i < numberLengths.length; i++) {\n const _length = numberLengths[i];\n if (numberLength >= _length) {\n length = _length;\n break;\n }\n }\n\n const decimalIndex = numberLength - length + 1;\n const unsignedNumberCharacterArray = unsignedNumberString.split('');\n\n const wholePartArray = unsignedNumberCharacterArray.slice(0, decimalIndex);\n const decimalPartArray = unsignedNumberCharacterArray.slice(\n decimalIndex,\n decimalIndex + decimals + 1,\n );\n\n const wholePart = wholePartArray.join('');\n\n // pad decimalPart if necessary\n let decimalPart = decimalPartArray.join('');\n if (decimalPart.length < decimals) {\n decimalPart += `${Array(decimals - decimalPart.length + 1).join('0')}`;\n }\n\n if (decimalPart[0] === '0') {\n decimals = 0;\n }\n\n let output;\n if (decimals === 0) {\n output = `${signString}${wholePart}${bigNumPrefixes[numberLengths.indexOf(length)]}`;\n } else {\n const outputNumber = Number(`${wholePart}.${decimalPart}`).toFixed(\n decimals,\n );\n output = `${signString}${outputNumber}${bigNumPrefixes[numberLengths.indexOf(length)]}`;\n }\n\n return output;\n}\n","import { isNumber, isString } from '@/is';\n\n/**\n * Parses all numbers from a given string and returns them as an array of numbers.\n * Supports dot decimals and ignores commas unless they appear as part of a number format.\n * Returns an empty array when the input is invalid or no numbers are found.\n *\n * @param {unknown} input - The input value to parse numbers from.\n * @returns {number[]} - An array of parsed numbers. Returns an empty array if no numbers are found.\n *\n * @example\n * parseAllNumbers(\"The temperature is -23.5°C and humidity is 60%.\");\n * // Returns: [-23.5, 60]\n *\n * @example\n * parseAllNumbers(\"No numbers here!\");\n * // Returns: []\n *\n * @example\n * parseAllNumbers(42);\n * // Returns: [42]\n *\n * @example\n * parseAllNumbers(\"1,234 and 56.78 are numbers\");\n * // Returns: [1.234, 56.78]\n *\n * @example\n * parseAllNumbers([\"Invalid type\"]);\n * // Returns: []\n *\n * @group Numbers\n */\nexport function parseAllNumbers(value: unknown): number[] {\n if (isNumber(value)) {\n return [value];\n }\n\n if (!isString(value)) {\n return [];\n }\n\n const matches = value.replace(/,/g, '.').match(/-?\\d+(\\.\\d+)?/g);\n\n if (!matches) {\n return [];\n }\n\n return matches.map(Number).filter(isNumber);\n}\n","import { round2digits } from '../round2digits';\n\n/**\n * Calculates the specified percentage of a given value.\n * The result is the value multiplied by the percentage divided by 100.\n * Optionally rounds the result to a specified number of decimal places.\n *\n * @param {number} value - The value from which the percentage will be calculated.\n * @param {number} percent - The percentage to calculate from the value.\n * @param {number} [digits] - Optional. The number of decimal places to round the result to. If not provided, the result will not be rounded.\n * @returns {number} The calculated percentage of the value. If `digits` is provided, the result is rounded to the specified decimal places.\n *\n * @example\n * percentOf(200, 20);\n * // Returns: 40 (20% of 200)\n *\n * @example\n * percentOf(200, 20, 2);\n * // Returns: 40.00 (20% of 200 rounded to 2 decimal places)\n *\n * @example\n * percentOf(150, 15);\n * // Returns: 22.5 (15% of 150)\n *\n * @example\n * percentOf(1000, 10, 1);\n * // Returns: 100.0 (10% of 1000 rounded to 1 decimal place)\n *\n * @group Numbers\n */\nexport function percentOf(value: number, percent: number, digits?: number) {\n let result = (percent / 100) * value;\n\n if (digits) {\n result = round2digits(result, digits);\n }\n\n return result;\n}\n","import { isNumber, isString } from '@/is';\nimport { clamp } from '@/num';\nimport { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\nimport { number, numberOrPercentage, percentage } from '../utils';\n\nconst rgb3Numbers = new RegExp(\n `^\n rgba?\\\\(\n \\\\s*${number}\\\\s*,\n \\\\s*${number}\\\\s*,\n \\\\s*${number}\\\\s*\n (?:,\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n $\n`.replace(/\\n|\\s/g, ''),\n);\n\nconst rgb3Percent = new RegExp(\n `^\n rgba?\\\\(\n \\\\s*${percentage}\\\\s*,\n \\\\s*${percentage}\\\\s*,\n \\\\s*${percentage}\\\\s*\n (?:,\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n $\n`.replace(/\\n|\\s/g, ''),\n);\n\nconst rgb4Numbers = new RegExp(\n `^\n rgba?\\\\(\n \\\\s*${number}\n \\\\s+${number}\n \\\\s+${number}\n \\\\s*(?:\\\\s*\\\\/\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n$\n`.replace(/\\n|\\s/g, ''),\n);\n\nconst rgb4Percent = new RegExp(\n `^\n rgba?\\\\(\n \\\\s*${percentage}\n \\\\s+${percentage}\n \\\\s+${percentage}\n \\\\s*(?:\\\\s*\\\\/\\\\s*${numberOrPercentage}\\\\s*)?\n \\\\)\n$\n`.replace(/\\n|\\s/g, ''),\n);\n\nconst parseValue = (num: string | number) => {\n let n = num;\n if (!isNumber(n))\n n = n.endsWith('%') ? (parseFloat(n) * 255) / 100 : parseFloat(n);\n return clamp(Math.round(n), 0, 255);\n};\n\nexport function parseRGB(value: unknown): Color.RGBA | null {\n if (!isString(value)) return null;\n\n const rgb =\n rgb4Numbers.exec(value) ||\n rgb4Percent.exec(value) ||\n rgb3Numbers.exec(value) ||\n rgb3Percent.exec(value);\n\n if (!rgb) return null;\n\n const [, r, g, b, a] = rgb;\n\n return {\n r: parseValue(r),\n g: parseValue(g),\n b: parseValue(b),\n a: parseAlpha(a),\n };\n}\n","import type { Color } from '../types';\n\n/**\n * Build css valid color from color channels\n *\n * @example\n * const channels = [255, 255, 255, 0.5];\n *\n * buildCssColor(channels); // 'rgba(255, 255, 255, 0.5)'\n *\n * // with applied opacity factor\n * buildCssColor(channels, 0.1); // 'rgba(255, 255, 255, 0.05)'\n *\n * @group Colors\n */\nexport function buildCssColor(\n [r, g, b, a = 1]: Color.ColorChannels,\n opacity = 1,\n): string {\n return `rgba(${r}, ${g}, ${b}, ${a * opacity})`;\n}\n","import { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\nimport { parseHEX } from './parseHEX';\n\n/**\n * Parsing hex string as color channels\n *\n * @example\n * hexToChannels('#FFFFFF'); // [255, 255, 255, 1]\n * hexToChannels('#FFF'); // [255, 255, 255, 1]\n *\n * @group Colors\n */\nexport function hexToChannels(hexWithAlpha: string): Color.ColorChannels {\n const [hex, alpha] = hexWithAlpha.split('/');\n const channels = parseHEX(hex);\n\n if (!channels) return [0, 0, 0, 0];\n\n if (alpha) {\n channels[3] = parseAlpha(alpha);\n }\n\n return channels;\n}\n","import type { Color } from '../types';\nimport { parseHSL } from './parseHSL';\n\n/**\n * Parsing HSL string as color channels\n *\n * @example\n * // [128, 51, 204, 0.15]\n * hslToChannels('hsl(270 60% 50% / 15%)');\n *\n * @group Colors\n */\nexport function hslToChannels(value: string): Color.ColorChannels {\n const parsed = parseHSL(value);\n\n if (!parsed) return [0, 0, 0, 0];\n\n let { h, s, l, a } = parsed;\n\n s /= 100;\n l /= 100;\n const k = (n: number) => (n + h / 30) % 12;\n const p = s * Math.min(l, 1 - l);\n const f = (n: number) =>\n l - p * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));\n\n return [\n Math.round(255 * f(0)),\n Math.round(255 * f(8)),\n Math.round(255 * f(4)),\n a,\n ];\n}\n","import type { Color } from '../types';\nimport { parseRGB } from './parseRGB';\n\n/**\n * Parsing rgb() string as color channels\n *\n * @example\n * // [255, 0, 0, 0.2]\n * rgbToChannels('rgba(100% 0% 0% / 20%)');\n *\n * @group Colors\n */\nexport function rgbToChannels(value: string): Color.ColorChannels {\n const rgb = parseRGB(value);\n\n if (!rgb) return [0, 0, 0, 0];\n\n return [rgb.r, rgb.g, rgb.b, rgb.a];\n}\n","import { isNumber, isString } from '@/is';\nimport { hexToChannels } from '../hexToChannels';\nimport { hslToChannels } from '../hslToChannels';\nimport { rgbToChannels } from '../rgbToChannels';\nimport type { Color } from '../types';\nimport { isColorChannels } from '../utils';\n\n/**\n * Parse css color and returns color channels\n * @group Colors\n */\nexport function colorToChannels(\n color: string | Color.ColorChannels,\n): Color.ColorChannels {\n if (isColorChannels(color)) {\n return color;\n }\n\n if (isString(color)) {\n color = color.trim();\n\n if (color[0] === '#') {\n return hexToChannels(color);\n } else if (color.startsWith('rgb')) {\n return rgbToChannels(color);\n } else if (color.startsWith('rgba')) {\n return rgbToChannels(color);\n } else if (color.startsWith('hsl')) {\n return hslToChannels(color);\n } else if (color.includes(',')) {\n const channels = color\n .split(',')\n .map(v => parseFloat(v))\n .filter(isNumber)\n .slice(0, 4);\n\n while (channels.length < 3) {\n channels.push(0);\n }\n\n return [...channels, 1].slice(0, 4) as Color.ColorChannels;\n }\n }\n\n console.warn('Failed to convert color into channels', typeof color, color);\n return [0, 0, 0, 1];\n}\n","import { buildCssColor } from '../buildCssColor';\nimport { colorToChannels } from '../colorToChannels';\nimport { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\n\n/**\n * Returns css valid color with adjusted alpha channel\n *\n * @example\n * alpha('rgba(0, 0, 0, 0.87)', 1); // 'rgba(0, 0, 0, 1)'\n *\n * @group Colors\n */\nexport function alpha(\n color: string | Color.ColorChannels,\n newAlpha: number,\n): string {\n const [r, g, b] = colorToChannels(color);\n\n return buildCssColor([r, g, b, parseAlpha(newAlpha)], 1);\n}\n","import { colorToChannels } from '../colorToChannels';\nimport type { Color } from '../types';\n\n/**\n * Just mixing of two colors\n *\n * @example\n * const colorA = 'rgb(50, 100, 100)';\n * const colorB = 'rgb(150, 0, 0)';\n *\n * // [100, 50, 50, 1]\n * blendColors(colorA, colorB, 0.5);\n *\n * @group Colors\n */\nexport function blendColors(\n color1: Color.ColorChannels | string,\n color2: Color.ColorChannels | string,\n factor: number,\n): Color.ColorChannels {\n const [r1, g1, b1, a1] = colorToChannels(color1);\n const [r2, g2, b2, a2] = colorToChannels(color2);\n\n return [\n Math.round(r1 * (1 - factor) + r2 * factor),\n Math.round(g1 * (1 - factor) + g2 * factor),\n Math.round(b1 * (1 - factor) + b2 * factor),\n Math.round(a1 * (1 - factor) + a2 * factor),\n ];\n}\n","import { isNumber } from '@/is';\nimport type { Color } from '../types';\n\n/**\n * Converts color channels into hex\n *\n * @example\n * const channels = [255, 255, 255, 1];\n *\n * // with alpha channel\n * channelsToHex(channels); // '#FFFFFFFF'\n *\n * // without alpha channel\n * channelsToHex(channels, false); // '#FFFFFF'\n * @group Colors\n */\nexport function channelsToHex(\n channels: Color.ColorChannels,\n withAlpha: boolean = true,\n) {\n const [r, g, b, a] = channels;\n\n const outParts = [\n r.toString(16).toUpperCase().padStart(2, '0'),\n g.toString(16).toUpperCase().padStart(2, '0'),\n b.toString(16).toUpperCase().padStart(2, '0'),\n ];\n\n if (withAlpha && isNumber(a)) {\n outParts.push(\n Math.round(a * 255)\n .toString(16)\n .substring(0, 2)\n .toUpperCase()\n .padStart(2, '0'),\n );\n }\n\n return '#' + outParts.join('');\n}\n","import { parseAlpha } from '../parseAlpha';\nimport type { Color } from '../types';\n\n/**\n * Converts color channels into HSL\n * @group Colors\n */\nexport function channelsToHSL([r, g, b, a]: Color.ColorChannels): Color.HSLA {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n const l = (max + min) / 2;\n\n let h = 0;\n let s = 0;\n\n if (delta !== 0) {\n s = delta / (1 - Math.abs(2 * l - 1));\n\n if (max === r) {\n h = ((g - b) / delta) % 6;\n } else if (max === g) {\n h = (b - r) / delta + 2;\n } else if (max === b) {\n h = (r - g) / delta + 4;\n }\n\n h *= 60;\n\n if (h < 0) {\n h += 360;\n }\n }\n\n return {\n h: Math.round(h),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n a: parseAlpha(a),\n };\n}\n","import type { Color } from '../types';\n\n/**\n * Converts color channels into RGB\n * @group Colors\n */\nexport function channelsToRGB([r, g, b, a]: Color.ColorChannels): Color.RGBA {\n return {\n r,\n g,\n b,\n a,\n };\n}\n","import { round2digits } from '@/num';\n\n/**\n * Calculate WCAG 2.0 contrast ratio of two luminance\n *\n * @example\n * const l1 = luminance([255, 255, 255, 1]);\n * const l2 = luminance([0, 0, 0, 1]);\n *\n * contrastRatio(l1, l2); // 21\n *\n * @group Colors\n */\nexport function contrastRatio(l1: number, l2: number) {\n return round2digits((Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05), 4);\n}\n","import { noop } from '@/is';\n\nconst defaultWindow = (globalThis as any)?.window as Window | undefined;\n\n/**\n * Create a getter of css variable for container\n * @group Colors\n */\nexport function cssVariable(container: HTMLElement): (name: string) => string {\n if (!defaultWindow) return noop as any;\n\n const computedStyles = defaultWindow.getComputedStyle(container);\n\n return (name: string) => {\n const patterns = name.split('/', 2);\n\n if (patterns[0]?.startsWith('--')) {\n let value = computedStyles.getPropertyValue(patterns[0])?.trim();\n\n if (patterns[0].startsWith('--v')) {\n value = `rgb(${value})`;\n }\n\n patterns[0] = value;\n }\n\n return patterns.join('/');\n };\n}\n","import { colorToChannels } from '../colorToChannels';\nimport type { Color } from '../types';\n\n/**\n * Linear color interpolating\n *\n * @example\n * // 'rgba(50, 50, 50, 1)'\n * interpolateColor(\n * 'rgb(0, 0, 0)',\n * 'rgb(100, 100, 100)',\n * 0.5\n * );\n *\n * @group Colors\n */\nexport function interpolateColor(\n color1: string | Color.ColorChannels,\n color2: string | Color.ColorChannels,\n factor: number,\n): Color.ColorChannels {\n const [r1, g1, b1, a1] = colorToChannels(color1);\n const [r2, g2, b2, a2] = colorToChannels(color2);\n\n return [\n Math.round(r1 + factor * (r2 - r1)),\n Math.round(g1 + factor * (g2 - g1)),\n Math.round(b1 + factor * (b2 - b1)),\n a1 + factor * (a2 - a1),\n ];\n}\n","import type { Color } from '../types';\n\n/**\n * Calculate luminance of color\n *\n * @example\n * luminance([255, 255, 255, 1]); // 1\n * luminance([0, 0, 0, 1]); // 0\n *\n * @group Colors\n */\nexport function luminance([r, g, b]: Color.ColorChannels): number {\n const a = [r, g, b].map(function (v) {\n v /= 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;\n}\n","import { blendColors } from '../blendColors';\nimport { colorToChannels } from '../colorToChannels';\nimport { contrastRatio } from '../contrastRatio';\nimport { luminance } from '../luminance';\nimport type { Color } from '../types';\n\n/**\n * Returns a color text color that should be on background to keep good contrast\n *\n * @example\n * const bgColor = 'rgb(255, 255, 255)';\n * const tint = 1;\n *\n * // 'rgba(0, 0, 0, 1)'\n * const textColor = tintedTextColor(bgColor, tint);\n *\n * @group Colors\n */\nexport function tintedTextColor(\n background: string | Color.ColorChannels,\n tintPercentage = 0.2,\n): Color.ColorChannels {\n const bgColor = colorToChannels(background);\n const bgLuminance = luminance(bgColor);\n\n const whiteLuminance = luminance([255, 255, 255, 1]);\n const blackLuminance = luminance([0, 0, 0, 1]);\n\n const contrastWithWhite = contrastRatio(bgLuminance, whiteLuminance);\n const contrastWithBlack = contrastRatio(bgLuminance, blackLuminance);\n\n const baseTextColor: Color.ColorChannels =\n contrastWithWhite >= contrastWithBlack ? [255, 255, 255, 1] : [0, 0, 0, 1];\n\n const tintedColor = blendColors(baseTextColor, bgColor, tintPercentage);\n\n const tintedLuminance = luminance(tintedColor);\n const finalContrast = contrastRatio(bgLuminance, tintedLuminance);\n\n if (finalContrast < 4.5) {\n return baseTextColor;\n }\n\n return tintedColor;\n}\n","import { parseHEX } from './hexToChannels/parseHEX';\nimport { parseHSL } from './hslToChannels/parseHSL';\nimport { parseRGB } from './rgbToChannels/parseRGB';\nimport type { Color } from './types';\n\nexport type { Color } from './types';\n\nexport type ColorChannels = Color.ColorChannels;\n\n/**\n * General color parser api\n * @group Colors\n */\nexport const ColorParser = {\n HSL: parseHSL,\n RGB: parseRGB,\n HEX: parseHEX,\n};\n\nexport { isColorChannels } from './utils';\n\nexport * from './alpha';\nexport * from './blendColors';\nexport * from './buildCssColor';\nexport * from './channelsToHex';\nexport * from './channelsToHSL';\nexport * from './channelsToRGB';\nexport * from './colorToChannels';\nexport * from './contrastRatio';\nexport * from './cssVariable';\nexport * from './hexToChannels';\nexport * from './hslToChannels';\nexport * from './interpolateColor';\nexport * from './luminance';\nexport * from './parseAlpha';\nexport * from './rgbToChannels';\nexport * from './tintedTextColor';\n","import { isString } from '@/is';\n\nvar encoder = new TextEncoder();\n\nvar TABLE = new Int32Array([\n 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,\n 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,\n 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,\n 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,\n 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,\n 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,\n 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,\n 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,\n 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,\n 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\n 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,\n 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,\n 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,\n 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,\n 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,\n 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,\n 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,\n 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,\n 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,\n 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,\n 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,\n 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,\n 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,\n 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,\n 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,\n 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,\n 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,\n 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,\n 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,\n 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,\n 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,\n 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,\n 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,\n 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,\n 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,\n 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,\n 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,\n 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,\n 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,\n 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,\n 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,\n 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,\n 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,\n]);\n\n/**\n * Calculate crc32 hash from string\n * @group Crypto\n */\nexport function crc32(current: Uint8Array | string, seed?: number): number {\n if (isString(current)) {\n return crc32(encoder.encode(current), seed);\n }\n\n var crc = seed === 0 ? 0 : ~~seed! ^ -1;\n\n for (var index = 0; index < current.length; index++) {\n crc = TABLE[(crc ^ current[index]) & 0xff] ^ (crc >>> 8);\n }\n\n return crc ^ -1;\n}\n","import { isNumber } from '@/is';\nimport { has } from '@/object';\nimport type { DateObject } from '@/types';\n\n/**\n * Checks if a given value is a valid `DateObject`.\n *\n * A valid `DateObject` is an object that contains numeric `year`, `month`, and `date` properties.\n *\n * @param {unknown} value - The value to be checked.\n * @returns {value is DateObject} - Returns `true` if the value is a valid `DateObject`; otherwise, `false`.\n *\n * @example\n * // Valid DateObject\n * isDateObject({ year: 2024, month: 11, date: 8 }); // true\n *\n * @example\n * // Missing properties\n * isDateObject({ year: 2024, month: 11 }); // false\n *\n * @example\n * // Non-numeric values\n * isDateObject({ year: '2024', month: 11, date: 8 }); // false\n *\n * @example\n * // Non-object input\n * isDateObject('invalid'); // false\n *\n * @example\n * // Additional properties (still valid)\n * isDateObject({ year: 2024, month: 11, date: 8, extra: 'property' }); // true\n *\n * @group Date\n */\nexport function isDateObject(value: unknown): value is DateObject {\n return (\n has(value, ['year', 'month', 'date']) &&\n isNumber(value.year) &&\n isNumber(value.month) &&\n isNumber(value.date)\n );\n}\n","import { assert } from '@/assert';\nimport { isDate, isNumber, isString } from '@/is';\nimport type { DateObject } from '@/types';\nimport { isDateObject } from '../isDateObject';\n\nexport type DateObjectInput = Date | string | number | DateObject;\n\nexport function createDateObject(value: DateObjectInput): DateObject;\nexport function createDateObject(\n value: DateObjectInput,\n returnsNullWhenInvalid: true,\n): DateObject | null;\n\n/**\n * Converts a given input into a `DateObject` representing year, month, and date.\n *\n * The function supports inputs in various formats, including a `Date` object,\n * a `number` (timestamp), or an existing `DateObject`. If the input is invalid\n * and `returnsNullWhenInvalid` is set to `true`, the function returns `null`.\n * Otherwise, it throws an error for invalid input.\n\n * @param {DateObjectInput} value - The input to be converted into a `DateObject`.\n * @param {boolean} [returnsNullWhenInvalid=false] - If `true`, returns `null` for invalid input\n * instead of throwing an error.\n * @returns {DateObject | null} - A `DateObject` representing the date, or `null` if input is invalid\n * and `returnsNullWhenInvalid` is set to `true`.\n *\n * @throws {Error} If the input is invalid and `returnsNullWhenInvalid` is `false`.\n *\n * @example\n * // Using a valid Date object\n * createDateObject(new Date('2024-12-08')); // { year: 2024, month: 12, date: 8 }\n *\n * @example\n * // Using a valid timestamp\n * createDateObject(1702032000000); // { year: 2024, month: 12, date: 8 }\n *\n * @example\n * // Using an existing DateObject\n * createDateObject({ year: 2024, month: 12, date: 8 }); // { year: 2024, month: 12, date: 8 }\n *\n * @example\n * // Invalid input, returning null\n * createDateObject('invalid-date', true); // null\n *\n * @example\n * // Invalid input, throwing an error\n * createDateObject('invalid-date'); // Throws \"Failed to date parse: invalid-date.\"\n *\n * @group Date\n */\nexport function createDateObject(\n value: DateObjectInput,\n returnsNullWhenInvalid = false,\n): DateObject | null {\n let result: DateObject | null = null;\n let inputValue = value;\n\n if (isNumber(inputValue) || isString(inputValue)) {\n inputValue = new Date(inputValue);\n }\n\n if (isDate(inputValue)) {\n result = {\n year: inputValue.getFullYear(),\n month: inputValue.getMonth() + 1,\n date: inputValue.getDate(),\n };\n } else if (isDateObject(inputValue)) {\n result = { ...inputValue };\n }\n\n assert.ok(\n returnsNullWhenInvalid || !!result,\n `Failed to date parse: ${value}.`,\n );\n\n return result;\n}\n","import { isNumber, isPlainObject } from '@/is';\nimport type { TimeObject } from '@/types';\n\n/**\n * Checks if a given value is a valid `TimeObject`.\n *\n * @param {unknown} value - The value to check if it's a valid `TimeObject`.\n * @returns {value is TimeObject} - Returns `true` if the value is a valid `TimeObject`, otherwise `false`.\n *\n * @example\n * // Valid TimeObject\n * isTimeObject({ h: 15, m: 30 }); // true\n *\n * @example\n * // Invalid TimeObject (missing `m`)\n * isTimeObject({ h: 15 }); // false\n *\n * @example\n * // Invalid TimeObject (non-number values)\n * isTimeObject({ h: '15', m: 30 }); // false\n * isTimeObject({ h: 15, m: '30' }); // false\n *\n * @example\n * // Invalid TimeObject (out-of-range hours)\n * isTimeObject({ h: -1, m: 30 }); // false\n * isTimeObject({ h: 24, m: 30 }); // false\n *\n * @example\n * // Invalid TimeObject (out-of-range minutes)\n * isTimeObject({ h: 15, m: -1 }); // false\n * isTimeObject({ h: 15, m: 60 }); // false\n *\n * @example\n * // Invalid TimeObject (non-object input)\n * isTimeObject('string'); // false\n * isTimeObject(123); // false\n * isTimeObject([]); // false\n *\n * @group Date\n */\nexport function isTimeObject(value: unknown): value is TimeObject {\n return (\n isPlainObject(value) &&\n 'h' in value &&\n 'm' in value &&\n isNumber(value.h) &&\n Number.isInteger(value.h) &&\n isNumber(value.m) &&\n Number.isInteger(value.m) &&\n value.h >= 0 &&\n value.h < 24 &&\n value.m >= 0 &&\n value.m < 60\n );\n}\n","import { assert } from '@/assert';\nimport { isDate, isNumber, isString } from '@/is';\nimport type { TimeObject } from '@/types';\nimport { isTimeObject } from '../isTimeObject';\n\nexport type TimeObjectInput = Date | number | string | TimeObject;\n\nexport function createTimeObject(value: TimeObjectInput): TimeObject;\nexport function createTimeObject(\n value: TimeObjectInput,\n returnsNullWhenInvalid: true,\n): TimeObject | null;\n\n/**\n * Converts a given input into a `TimeObject` representing 24 hours and minutes.\n *\n * The function supports inputs in various formats, including `Date`, `number` (timestamp),\n * `string` (date string), or a pre-existing `TimeObject`. If the input is invalid and\n * `returnsNullWhenInvalid` is set to `true`, the function will return `null`; otherwise,\n * it throws an error.\n *\n * @param {TimeObjectInput} value - The input to be converted into a `TimeObject`.\n * @param {boolean} [returnsNullWhenInvalid=false] - If `true`, returns `null` for invalid input\n * instead of throwing an error.\n * @returns {TimeObject | null} - A `TimeObject` representing the time, or `null` if input is invalid\n * and `returnsNullWhenInvalid` is set to `true`.\n *\n * @throws {Error} If the input is invalid and `returnsNullWhenInvalid` is `false`.\n *\n * @example\n * // Using a valid Date object\n * createTimeObject(new Date('2024-12-08T15:30:00')); // { h: 15, m: 30 }\n *\n * @example\n * // Using a valid timestamp\n * createTimeObject(1702031400000); // { h: 15, m: 30 }\n *\n * @example\n * // Using a valid time string\n * createTimeObject('2024-12-08T15:30:00'); // { h: 15, m: 30 }\n *\n * @example\n * // Using an existing TimeObject\n * createTimeObject({ h: 10, m: 45 }); // { h: 10, m: 45 }\n *\n * @example\n * // Invalid input, returning null\n * createTimeObject('invalid-date', true); // null\n *\n * @example\n * // Invalid input, throwing an error\n * createTimeObject('invalid-date'); // Throws \"Failed to time parse: invalid-date.\"\n *\n * @group Date\n */\nexport function createTimeObject(\n value: TimeObjectInput,\n returnsNullWhenInvalid = false,\n): TimeObject | null {\n let result: TimeObject | null = null;\n let inputValue = value;\n\n if (isNumber(inputValue)) {\n inputValue = new Date(inputValue);\n } else if (isString(inputValue)) {\n // lest do inline parsing to accept HH:mm:ss\n const [h, m] = inputValue\n .split(':')\n .map(v => v.trim().padStart(2, '0'))\n .map(v => parseInt(v));\n\n inputValue = { h, m };\n }\n\n if (isDate(inputValue)) {\n result = {\n h: inputValue.getHours(),\n m: inputValue.getMinutes(),\n };\n } else if (isTimeObject(inputValue)) {\n result = { ...inputValue };\n }\n\n assert.ok(\n returnsNullWhenInvalid || !!result,\n `Failed to time parse: ${value}.`,\n );\n\n return result;\n}\n","export type TimeSpanUnit = 'ms' | 's' | 'm' | 'h' | 'd' | 'w';\n\nconst UNIT_TO_MS: Record<TimeSpanUnit, number> = {\n ms: 1,\n s: 1000,\n m: 1000 * 60,\n h: 1000 * 60 * 60,\n d: 1000 * 60 * 60 * 24,\n w: 1000 * 60 * 60 * 24 * 7,\n};\n\n/**\n * A class representing a span of time with a specific value and unit of measurement.\n * Provides methods for conversion between time units and arithmetic operations (add, subtract).\n */\nexport class TimeSpan {\n constructor(value: number, unit: TimeSpanUnit) {\n this.value = value;\n this.unit = unit;\n }\n\n /**\n * The numeric value of the time span\n */\n public value: number;\n\n /**\n * The unit of the time span.\n */\n public unit: TimeSpanUnit;\n\n /**\n * Converts the time span to milliseconds.\n *\n * @returns {number} The equivalent time span in milliseconds.\n * @example\n * const ts = new TimeSpan(2, 'h');\n * ts.milliseconds(); // Returns 7200000\n */\n public milliseconds(): number {\n const multiplier = UNIT_TO_MS[this.unit];\n return this.value * multiplier;\n }\n\n /**\n * Converts the time span to seconds.\n *\n * @returns {number} The equivalent time span in seconds.\n * @example\n * const ts = new TimeSpan(2, 'm');\n * ts.seconds(); // Returns 120\n */\n public seconds(): number {\n return this.milliseconds() / UNIT_TO_MS.s;\n }\n\n /**\n * Converts the time span to minutes.\n *\n * @returns {number} The equivalent time span in minutes.\n * @example\n * const ts = new TimeSpan(120, 's');\n * ts.minutes(); // Returns 2\n */\n public minutes(): number {\n return this.milliseconds() / UNIT_TO_MS.m;\n }\n\n /**\n * Converts the time span to hours.\n *\n * @returns {number} The equivalent time span in hours.\n * @example\n * const ts = new TimeSpan(120, 'm');\n * ts.hours(); // Returns 2\n */\n public hours(): number {\n return this.milliseconds() / UNIT_TO_MS.h;\n }\n\n /**\n * Converts the time span to days.\n *\n * @returns {number} The equivalent time span in days.\n * @example\n * const ts = new TimeSpan(48, 'h');\n * ts.days(); // Returns 2\n */\n public days(): number {\n return this.milliseconds() / UNIT_TO_MS.d;\n }\n\n /**\n * Converts the time span to weeks.\n *\n * @returns {number} The equivalent time span in weeks.\n * @example\n * const ts = new TimeSpan(14, 'd');\n * ts.weeks(); // Returns 2\n */\n public weeks(): number {\n return this.milliseconds() / UNIT_TO_MS.w;\n }\n\n /**\n * Adds a specified value and unit to the current time span.\n *\n * Returns new instance.\n *\n * @param {number} value - The value to add.\n * @param {TimeSpanUnit} [unit='ms'] - The unit of the value to add (default is milliseconds).\n * @returns {TimeSpan} A new TimeSpan instance with the added value.\n * @example\n * const ts = new TimeSpan(1, 'h');\n * ts.add(30, 'm'); // Represents 1.5 hours\n */\n public add(value: number, unit: TimeSpanUnit = 'ms'): TimeSpan {\n const multiplier = UNIT_TO_MS[unit];\n return new TimeSpan(this.milliseconds() + value * multiplier, 'ms');\n }\n\n /**\n * Subtracts a specified value and unit from the current time span.\n *\n * Returns new instance.\n *\n * @param {number} value - The value to subtract.\n * @param {TimeSpanUnit} [unit='ms'] - The unit of the value to subtract (default is milliseconds).\n * @returns {TimeSpan} A new TimeSpan instance with the subtracted value.\n * @example\n * const ts = new TimeSpan(1, 'h');\n * ts.subtract(30, 'm'); // Represents 30 minutes less than 1 hour\n */\n public subtract(value: number, unit: TimeSpanUnit = 'ms'): TimeSpan {\n const multiplier = UNIT_TO_MS[unit];\n return new TimeSpan(this.milliseconds() - value * multiplier, 'ms');\n }\n}\n","import { TimeSpan, type TimeSpanUnit } from './TimeSpan';\n\n/**\n * Creates a new instance of `TimeSpan`.\n *\n * This utility function allows you to create a `TimeSpan` object by providing a numeric value and a unit of time.\n * The default unit is `'ms'` (milliseconds).\n *\n * @param {number} value - The numeric value representing the timespan.\n * @param {TimeSpanUnit} [unit='ms'] - The unit of time for the timespan value. Options are `'ms'`, `'s'`, `'m'`, `'h'`, `'d'`, `'w'`.\n * @returns {TimeSpan} An instance of the `TimeSpan` class.\n * @example\n * // Create a TimeSpan with 500 milliseconds\n * const ts = createTimeSpan(500);\n * console.log(ts.milliseconds()); // 500\n *\n * @example\n * // Create a TimeSpan with 2 hours\n * const ts = createTimeSpan(2, 'h');\n * console.log(ts.seconds()); // 120\n *\n * @example\n * // Create a TimeSpan with 7 days\n * const ts = createTimeSpan(7, 'd');\n * console.log(ts.weeks()); // 1\n *\n * @group Date\n */\nexport function createTimeSpan(\n value: number,\n unit: TimeSpanUnit = 'ms',\n): TimeSpan {\n return new TimeSpan(value, unit);\n}\n","import { isDate, isNumber, isString } from '@/is';\n\n/**\n * The base time as a timestamp, `Date` object,\n * or a similar format that the `timestampMs` function can parse.\n */\nexport type TimestampMsInput = Date | string | number;\n\n/**\n * Returns or converts the given input into milliseconds since the Unix epoch.\n *\n * @param {TimestampMsInput} [fromValue=Date.now()] - The input value to be converted to milliseconds.\n * Can be a `Date` object, a timestamp (number), or a string representing a date.\n * Defaults to the current time.\n * @returns {number} The number of milliseconds since the Unix epoch. Returns `0` if the input is invalid.\n *\n * @example\n * // Get milliseconds from a Date object\n * timestampMs(new Date('2023-01-01T00:00:00Z')); // 1672531200000\n *\n * @example\n * // Get milliseconds from a timestamp\n * timestampMs(1672531200000); // 1672531200000\n *\n * @example\n * // Get milliseconds from a date string\n * timestampMs('2023-01-01T00:00:00Z'); // 1672531200000\n *\n * @example\n * // Handle invalid input\n * timestampMs('invalid-date'); // 0\n *\n * @example\n * // Use the default value (current time)\n * timestampMs(); // Current timestamp in milliseconds\n *\n * @group Date\n */\nexport function timestampMs(fromValue: TimestampMsInput = Date.now()): number {\n if (isDate(fromValue)) {\n fromValue = fromValue.getTime();\n } else if (isString(fromValue)) {\n const dt = new Date(fromValue);\n fromValue = isDate(dt) ? dt.getTime() : 0;\n }\n\n return isNumber(fromValue) ? fromValue : 0;\n}\n","import { type TimestampMsInput, timestampMs } from '../timestampMs';\n\n/**\n * Returns a `Date` object representing a time that is the given number of days\n * before or after a base time.\n *\n * @param {number} days - The number of days to add to or subtract from the base time.\n * Positive values move forward in time, and negative values move backward.\n * @param {TimestampMsInput} [fromValue=Date.now()] - The base time as a timestamp.\n * @returns {Date} A `Date` object representing the computed time.\n *\n * @example\n * // Get the date 7 days from now\n * dateInDays(7); // Returns a Date object 7 days in the future\n *\n * @example\n * // Get the date 5 days before a specific time\n * dateInDays(-5, new Date('2023-01-01T00:00:00Z')); // Returns 2022-12-27T00:00:00Z\n *\n * @example\n * // Use a timestamp as the base time\n * dateInDays(2, 1672531200000); // Returns a Date object 2 days after the base timestamp\n *\n * @group Date\n */\nexport function dateInDays(\n days: number,\n fromValue: TimestampMsInput = Date.now(),\n): Date {\n return new Date(timestampMs(fromValue) + days * 60 * 60 * 24 * 1000);\n}\n","import { type TimestampMsInput, timestampMs } from '../timestampMs';\n\n/**\n * Returns a `Date` object representing a time that is the given number of seconds\n * before or after a base time.\n *\n * @param {number} seconds - The number of seconds to add to or subtract from the base time.\n * Positive values move forward in time, and negative values move backward.\n * @param {TimestampMsInput} [fromValue=Date.now()] - The base time.\n * @returns {Date} A `Date` object representing the computed time.\n *\n * @example\n * // Get the date 60 seconds from now\n * dateInSeconds(60); // Returns a Date object 1 minute in the future\n *\n * @example\n * // Get the date 30 seconds before a specific time\n * dateInSeconds(-30, new Date('2023-01-01T00:00:00Z')); // Returns 2022-12-31T23:59:30Z\n *\n * @example\n * // Use a timestamp as the base time\n * dateInSeconds(10, 1672531200000); // Returns a Date object 10 seconds after the base timestamp\n *\n * @group Date\n */\nexport function dateInSeconds(\n seconds: number,\n fromValue: TimestampMsInput = Date.now(),\n): Date {\n return new Date(timestampMs(fromValue) + seconds * 1000);\n}\n","import { getRandomInt } from '@/num/getRandomInt';\nimport type { TimeObject } from '@/types';\n\n/**\n * Gets a random time within the specified range.\n *\n * Generates a random hour (`h`) and minute (`m`) between the given `startTime` and `endTime`.\n * If no range is provided, it defaults to the full day from `{ h: 0, m: 0 }` to `{ h: 23, m: 59 }`.\n *\n * @param {TimeObject} [startTime={ h: 0, m: 0 }] - The starting range for the random time.\n * @param {TimeObject} [endTime={ h: 23, m: 59 }] - The ending range for the random time.\n * @returns {TimeObject} - A random time object with `h` and `m` values within the given range.\n *\n * @example\n * // Generate a random time within the full day\n * const randomTime = getRandomTime();\n * console.log(randomTime); // e.g., { h: 12, m: 34 }\n *\n * @example\n * // Generate a random time between 9:00 and 17:00\n * const randomTime = getRandomTime({ h: 9, m: 0 }, { h: 17, m: 0 });\n * console.log(randomTime); // e.g., { h: 12, m: 15 }\n *\n * @example\n * // Generate a random time between 8:30 and 10:30\n * const randomTime = getRandomTime({ h: 8, m: 30 }, { h: 10, m: 30 });\n * console.log(randomTime); // e.g., { h: 9, m: 45 }\n *\n * @group Date\n */\nexport function getRandomTime(\n startTime: TimeObject = { h: 0, m: 0 },\n endTime: TimeObject = { h: 23, m: 59 },\n): TimeObject {\n const h = getRandomInt(startTime.h, endTime.h);\n\n if (startTime.h === endTime.h) {\n return { h, m: getRandomInt(startTime.m, endTime.m) };\n }\n\n if (h === startTime.h) {\n return { h, m: getRandomInt(startTime.m, 59) };\n }\n\n if (h === endTime.h) {\n return { h, m: getRandomInt(0, endTime.m) };\n }\n\n return { h, m: getRandomInt(0, 59) };\n}\n","import { assert } from '@/assert';\nimport { round2digits } from '@/num/round2digits';\n\n/**\n * Converts a decimal representation of hours and minutes (HH.MM) into total seconds.\n *\n * This function takes a decimal number in the format `HH.MM`, where:\n * - The integer part represents the number of hours.\n * - The fractional part represents the minutes (in decimal) and is converted accordingly.\n *\n * It returns the total time in seconds.\n *\n * @param {number} hm - The time represented in HH.MM format (e.g., 2.30 for 2 hours and 30 minutes).\n * @returns {number} - The total number of seconds equivalent to the provided HH.MM value.\n *\n * @example\n * hmToSeconds(1.00);\n * // Returns 3600 (1 hour = 3600 seconds)\n *\n * @example\n * hmToSeconds(2.30);\n * // Returns 9000 (2 hours and 30 minutes = 2 * 3600 + 30 * 60 = 9000 seconds)\n *\n * @example\n * hmToSeconds(0.15);\n * // Returns 900 (0 hours and 15 minutes = 15 minutes = 900 seconds)\n *\n * @example\n * hmToSeconds(3.45);\n * // Returns 13500 (3 hours and 45 minutes = 3 * 3600 + 45 * 60 = 13500 seconds)\n *\n * @group Date\n */\nexport function hmToSeconds(hm: number): number {\n hm = Number(hm);\n\n assert.number(hm, 'expected number value');\n\n const h = Math.floor(hm);\n const m = round2digits(hm - h) * 100;\n\n return h * 3600 + m * 60;\n}\n","import { isString } from '@/is';\nimport type { TimeString } from '@/types';\n\n/**\n * Checks if a given value is a valid `TimeString`.\n *\n * @param {unknown} value - The value to check if it's a valid `TimeString`.\n * @returns {value is TimeObject} - Returns `true` if the value is a valid `TimeString`, otherwise `false`.\n *\n * @example\n * // Valid TimeString\n * isTimeString('15:30'); // true\n *\n * @example\n * // Invalid TimeString\n * isTimeObject('15:30:00'); // false\n *\n * @example\n * // Invalid TimeString (out-of-range hours)\n * isTimeObject('26:00'); // false\n *\n * @group Date\n */\nexport function isTimeString(value: unknown): value is TimeString {\n if (!isString(value)) return false;\n const parts = value.split(':').map(Number);\n if (parts.length !== 2) return false;\n const [h, m] = parts;\n return h >= 0 && h < 24 && m >= 0 && m < 60;\n}\n","import type { TimeValue } from '@/types';\nimport { isTimeObject } from '../isTimeObject';\nimport { isTimeString } from '../isTimeString';\n\n/**\n * Checks if a given value is a valid `TimeValue`.\n *\n * @param {unknown} value - The value to check if it's a valid `TimeValue`.\n * @returns {value is TimeObject} - Returns `true` if the value is a valid `TimeValue`, otherwise `false`.\n *\n * @example\n * // Valid TimeObject\n * isTimeValue({ h: 15, m: 30 }); // true\n *\n * @example\n * // Valid TimeString\n * isTimeValue('15:30'); // true\n *\n * @group Date\n */\nexport function isTimeValue(value: unknown): value is TimeValue {\n return isTimeString(value) || isTimeObject(value);\n}\n","import { isNumber } from '@/is';\n\n/**\n * Checks if a given value is a valid weekday number.\n *\n * A valid weekday number is a number between 1 (Monday) and 7 (Sunday), inclusive.\n *\n * @param {unknown} value - The value to check if it's a valid weekday number.\n * @returns {value is number} - Returns `true` if the value is a number and represents a valid weekday, otherwise `false`.\n *\n * @example\n * // Valid weekday numbers\n * isValidWeekDay(1); // true\n * isValidWeekDay(7); // true\n *\n * @example\n * // Invalid weekday numbers\n * isValidWeekDay(0); // false\n * isValidWeekDay(8); // false\n * isValidWeekDay(-1); // false\n * isValidWeekDay('3'); // false\n * isValidWeekDay(null); // false\n * isValidWeekDay(undefined); // false\n *\n * @group Date\n */\nexport function isValidWeekDay(value: unknown): value is number {\n return isNumber(value) && Number.isInteger(value) && value >= 1 && value <= 7;\n}\n","import { assert } from '@/assert';\nimport { round2digits } from '@/num/round2digits';\n\n/**\n * Converts seconds to a decimal representation of hours and minutes (HH.MM) rounded to two decimal places.\n *\n * This function takes a number of seconds, calculates the number of whole hours and minutes,\n * and converts them into a two-decimal representation where:\n * - The integer part represents the hours.\n * - The fractional part represents the minutes (rounded to 2 digits).\n *\n * @param {number} seconds - The total number of seconds to convert into hours and minutes.\n * @returns {number} - A decimal number in the format HH.MM representing the converted time.\n *\n * @example\n * secondsToHm(3661);\n * // Returns 1.01 (1 hour and 1 minute)\n *\n * @example\n * secondsToHm(7322);\n * // Returns 2.02 (2 hours and 2 minutes)\n *\n * @example\n * secondsToHm(59);\n * // Returns 0.59 (0 hours and 59 minutes)\n *\n * @example\n * secondsToHm(3600);\n * // Returns 1.00 (exactly 1 hour)\n *\n * @group Date\n */\nexport function secondsToHm(seconds: number): number {\n const value = Number(seconds);\n\n assert.number(value, 'expected number value');\n\n const h = Math.floor(value / 3600);\n const m = Math.floor((value % 3600) / 60);\n\n return round2digits(h + m / 100, 2);\n}\n","import { assert } from '@/assert';\nimport { isNumber } from '@/is';\nimport type { TimeObject } from '@/types';\n\nexport function timeFromMinutes(value: number): TimeObject;\nexport function timeFromMinutes(\n value: number,\n returnsNullWhenInvalid: true,\n): TimeObject | null;\n\n/**\n * Converts a total number of minutes into a time object with hours and minutes.\n *\n * @param {number} value - The total number of minutes to be converted.\n * Can be positive, negative, or zero.\n * @param {boolean} [returnsNullWhenInvalid=false] - If `true`, the function returns `null`\n * instead of throwing an error when the input is invalid.\n * Defaults to `false`.\n * @returns {TimeObject | null} An object representing the time in `{ h: hours, m: minutes }` format,\n * or `null` if `returnsNullWhenInvalid` is `true` and the input is invalid.\n *\n * @throws {Error} If the input is not a number and `returnsNullWhenInvalid` is `false`.\n *\n * @example\n * // Convert 150 minutes to time\n * timeFromMinutes(150); // { h: 2, m: 30 }\n *\n * @example\n * // Handle invalid input with `returnsNullWhenInvalid` set to `true`\n * timeFromMinutes('invalid', true); // null\n *\n * @example\n * // Handle negative minutes\n * timeFromMinutes(-90); // { h: 22, m: 30 }\n *\n * @group Date\n */\nexport function timeFromMinutes(\n value: number,\n returnsNullWhenInvalid = false,\n): TimeObject | null {\n if (!isNumber(value)) {\n assert.ok(\n returnsNullWhenInvalid,\n 'Failed to time parse from minutes: ' + value,\n );\n return null;\n }\n\n if (value === 0) {\n return { h: 0, m: 0 };\n }\n\n value = value % 1440;\n\n if (value < 0) {\n value += 1440;\n }\n\n const h = Math.floor(value / 60);\n const m = value % 60;\n\n return { h, m };\n}\n","import { isDate } from '@/is';\n\n/**\n * Returns the number of seconds since the Unix epoch (January 1, 1970).\n *\n * This function accepts either a `Date` object or a timestamp in milliseconds (number).\n * If no argument is provided, it defaults to the current timestamp in seconds.\n *\n * @param {Date | number} [fromValue=Date.now()] - The date or timestamp to convert.\n * If not provided, the current date and time will be used.\n *\n * @returns {number} The number of seconds since the Unix epoch for the provided date or timestamp.\n *\n * @example\n * // Using a Date object\n * const date = new Date('2020-01-01T00:00:00Z');\n * console.log(timestamp(date)); // Returns 1577836800 (seconds since Unix epoch)\n *\n * // Using a timestamp in milliseconds\n * const timestampInMs = 1609459200000;\n * console.log(timestamp(timestampInMs)); // Returns 1609459200 (seconds since Unix epoch)\n *\n * // Using the current time\n * console.log(timestamp()); // Returns current seconds since Unix epoch\n *\n * @group Date\n */\nexport function timestamp(fromValue: Date | number = Date.now()) {\n if (isDate(fromValue)) {\n fromValue = fromValue.getTime();\n }\n\n return Math.floor(fromValue / 1000);\n}\n","import { isNumber } from '@/is';\n\n/**\n * Converts a Unix timestamp (in seconds) to a `Date` object.\n *\n * This function accepts a timestamp in seconds (number) and returns a `Date` object\n * corresponding to that timestamp. If an invalid number is passed (non-numeric or NaN),\n * it returns `null`.\n *\n * @param {number} value - The Unix timestamp (in seconds) to convert into a `Date` object.\n * @returns {Date | null} The `Date` object corresponding to the provided timestamp, or `null`\n * if the value is not a valid number.\n *\n * @example\n * const date = timestampToDate(1609459200);\n * console.log(date); // Outputs: Thu Jan 01 2021 00:00:00 GMT+0000 (UTC)\n *\n * // Invalid input\n * console.log(timestampToDate('invalid')); // Outputs: null\n * console.log(timestampToDate(NaN)); // Outputs: null\n * console.log(timestampToDate(null)); // Outputs: null\n *\n * @group Date\n */\nexport function timestampToDate(value: number): Date | null {\n if (!isNumber(value)) return null;\n return new Date(value * 1000);\n}\n","import { assert } from '@/assert';\nimport type { TimeValue } from '@/types';\nimport { createTimeObject } from '../createTimeObject';\n\nexport function timeStringify(value: TimeValue): string;\nexport function timeStringify(\n value: TimeValue,\n returnsNullWhenInvalid: true,\n): string | null;\n\n/**\n * Converts a time value into a string formatted as \"HH:MM\".\n *\n * @param {TimeValue} value - A time value.\n * @param {boolean} [returnsNullWhenInvalid=false] - If `true`, the function returns `null`\n * instead of throwing an error when the input is invalid.\n * Defaults to `false`.\n * @returns {string | null} A string representing the time in \"HH:MM\" format, or `null`\n * if the input is invalid and `returnsNullWhenInvalid` is `true`.\n *\n * @throws {Error} If the input is invalid and `returnsNullWhenInvalid` is `false`.\n *\n * @example\n * // Convert a time object to a string\n * timeStringify({ h: 9, m: 5 }); // \"09:05\"\n *\n * @example\n * // Convert a string time value to a formatted string\n * timeStringify(\"7:30\"); // \"07:30\"\n *\n * @example\n * // Handle invalid input gracefully\n * timeStringify(\"invalid\", true); // null\n *\n * @example\n * // Handle invalid input with exception\n * timeStringify(\"invalid\"); // Throws Error\n *\n * @group Date\n */\nexport function timeStringify(\n value: TimeValue,\n returnsNullWhenInvalid = false,\n): string | null {\n const timeObject = createTimeObject(value, true);\n\n if (!timeObject) {\n assert.ok(\n returnsNullWhenInvalid,\n 'Failed to stringify time from: ' + JSON.stringify(value),\n );\n return null;\n }\n\n let { h, m } = timeObject;\n\n const hStr = Math.ceil(h).toString().padStart(2, '0').slice(-2);\n const mStr = Math.ceil(m).toString().padStart(2, '0').slice(-2);\n\n return `${hStr}:${mStr}`;\n}\n","import type { TimeValue } from '@/types';\nimport { createTimeObject } from '../createTimeObject';\n\n/**\n * Converts a time value into the total number of minutes.\n *\n * @param {TimeValue} value - A time value\n *\n * @returns {number} The total number of minutes represented by the time value.\n *\n * @example\n * // Assuming createTimeObject(\"2:30\") returns { h: 2, m: 30 }\n * timeToMinutes(\"2:30\"); // 150\n *\n * // Assuming createTimeObject({ h: 1, m: 45 }) returns { h: 1, m: 45 }\n * timeToMinutes({ h: 1, m: 45 }); // 105\n *\n * @group Date\n */\nexport function timeToMinutes(value: TimeValue): number {\n const time = createTimeObject(value);\n return time.h * 60 + time.m;\n}\n","/**\n * Determines the number of ISO weeks in a given year.\n *\n * The ISO week numbering system defines a year as having 52 or 53 full weeks.\n *\n * @param {number} year - The year for which to calculate the number of ISO weeks.\n * @returns {number} - Returns 52 or 53 based on the ISO 8601 standard.\n *\n * @example\n * // Common year with 52 weeks\n * weeksInYear(2023); // 52\n *\n * @example\n * // Leap year with 53 weeks\n * weeksInYear(2020); // 53\n *\n * @group Date\n */\nexport function weeksInYear(year: number): number {\n const target = new Date(Date.UTC(year + 1, 0, 1));\n const dayNumber = target.getDay();\n\n return dayNumber < 4 ? 52 : 53;\n}\n","import { base64 } from '@/binary/base64';\nimport { bigIntBytes } from '@/binary/bigIntBytes';\nimport { bigIntFromBytes } from '@/binary/bigIntFromBytes';\nimport { uint16ToUint8 } from '@/binary/uint16ToUint8';\nimport { uint32ToUint8 } from '@/binary/uint32ToUint8';\nimport { uint8ToUint16 } from '@/binary/uint8ToUint16';\nimport { uint8ToUint32 } from '@/binary/uint8ToUint32';\nimport type { EJSONType } from './EJSON';\n\nexport const DateType: EJSONType = {\n placeholder: '$date',\n encode: value => {\n if (value instanceof Date) {\n return value.getTime();\n }\n },\n decode(value) {\n return new Date(value);\n },\n};\n\nexport const BinaryType: EJSONType = {\n placeholder: '$binary',\n encode: value => {\n if (value instanceof Uint8Array) {\n return base64.encode(value, { includePadding: true });\n } else if (value instanceof Uint16Array) {\n return {\n value: base64.encode(uint16ToUint8(value), { includePadding: true }),\n bit: 16,\n };\n } else if (value instanceof Uint32Array) {\n return {\n value: base64.encode(uint32ToUint8(value), { includePadding: true }),\n bit: 32,\n };\n }\n },\n decode(value) {\n if (typeof value === 'string') {\n return base64.decode(value, { strict: true });\n } else if (value.bit === 16) {\n return uint8ToUint16(base64.decode(value.value, { strict: true }));\n } else if (value.bit === 32) {\n return uint8ToUint32(base64.decode(value.value, { strict: true }));\n }\n\n throw new Error('Unexpected $binary bit value: ' + value.bit);\n },\n};\n\nexport const BigIntType: EJSONType = {\n placeholder: '$bigint',\n encode: value => {\n if (typeof value === 'bigint') {\n return base64.encode(bigIntBytes(value), { includePadding: false });\n }\n },\n decode(value) {\n return bigIntFromBytes(base64.decode(value, { strict: false }));\n },\n};\n\nexport const MapType: EJSONType = {\n placeholder: '$map',\n encode: (value, encode) => {\n if (value instanceof Map) {\n return encode(Array.from(value.entries()));\n }\n },\n decode(value) {\n return new Map(value);\n },\n};\n\nexport const SetType: EJSONType = {\n placeholder: '$set',\n encode: (value, encode) => {\n if (value instanceof Set) {\n return encode(Array.from(value.values()));\n }\n },\n decode(value) {\n return new Set(value);\n },\n};\n\nexport const RegexType: EJSONType = {\n placeholder: '$regex',\n encode: (value, encode) => {\n if (value instanceof RegExp) {\n const regStr = value.toString();\n const patternStart = regStr.lastIndexOf('/');\n\n return {\n pattern: value.toString().slice(1, patternStart),\n flags: regStr.slice(patternStart + 1),\n };\n }\n },\n decode(value) {\n return new RegExp(value.pattern, value.flags);\n },\n};\n\nexport const InfinityType: EJSONType = {\n placeholder: '$inf',\n encode: (value, encode) => {\n if (value === Infinity) {\n return 1;\n } else if (value === -Infinity) {\n return -1;\n }\n },\n decode(value) {\n if (value === 1) return Infinity;\n if (value === -1) return -Infinity;\n\n throw new Error('Unexpected $inf value: ' + value);\n },\n};\n","import { assert } from '@/assert';\nimport {\n isBigInt,\n isInfinity,\n isObject,\n isPlainObject,\n isPrimitive,\n} from '@/is';\nimport { deepCloneWith } from '@/object/deepCloneWith';\nimport {\n BigIntType,\n BinaryType,\n DateType,\n InfinityType,\n MapType,\n RegexType,\n SetType,\n} from './types';\n\nexport type EJSONType = {\n /**\n * The string placeholder (must start with `$`) that represents the custom type.\n */\n placeholder: string;\n\n /**\n * Should encoded value inlined to original key\n */\n encodeInline?: boolean;\n\n /**\n * Function to encode a value into a custom representation using a custom type handler.\n *\n * If the function returns `undefined`, it signals that encoding for this value should\n * be delegated to another type handler or encoding logic.\n *\n * @param {any} value - The value to be encoded.\n * @param {(value: any) => any} encode - A reference to the general encoding function\n * (useful for recursive encoding logic if necessary).\n * @returns {any} - The custom-encoded value or `undefined` to delegate encoding to another type handler.\n */\n encode: (value: any, encode: (value: any) => any) => any;\n\n /**\n * A function to decode a custom representation back into a valid JavaScript value.\n */\n decode: (value: any) => any;\n};\n\n/**\n * EJSON - Extended JSON handler class for custom encoding and decoding with vendor support.\n * This class provides methods to encode, decode, stringify, and parse JSON with custom type handlers.\n */\nexport class EJSON {\n /** @internal */\n protected typeHandlers: Map<string, Readonly<EJSONType>> = new Map();\n\n /** @internal */\n protected replacerReady: (value: any, key: string) => any;\n\n /** @internal */\n protected encode: (value: any) => any;\n\n /** @internal */\n protected reviewerReady: (_: string, value: any) => any;\n\n /** @internal */\n protected pure: boolean = true;\n\n protected _vendorName: string | null = null;\n\n /**\n * MIME type based on the provided vendor name or defaults to 'application/json'.\n */\n public mimetype: string = 'application/json';\n\n public readonly Type = {\n Date: DateType,\n Map: MapType,\n Set: SetType,\n RegExp: RegexType,\n Infinity: InfinityType,\n BigInt: BigIntType,\n Binary: BinaryType,\n } as const;\n\n constructor() {\n this.replacerReady = this._replacer.bind(this);\n this.reviewerReady = this._reviewer.bind(this);\n this.encode = (value: any) => {\n return deepCloneWith(value, this.replacerReady);\n };\n }\n\n /**\n * The vendor name used for the custom MIME type definition.\n * If null, defaults to 'application/json'.\n */\n get vendorName(): string | null {\n return this._vendorName;\n }\n\n set vendorName(value: string | null) {\n this._vendorName = value;\n\n if (!value) {\n this.mimetype = 'application/json';\n } else {\n const vendorName = value\n .split(' ')\n .map(v => v.toLowerCase())\n .join('.')\n .replace(/\\.\\.+/g, '.')\n .replace(/\\.$/, '');\n\n this.mimetype = `application/vnd.${vendorName}+json`;\n }\n }\n\n /**\n * Adds a custom type handler for encoding/decoding logic.\n * Ensures type placeholders are unique and adhere to conventions.\n */\n addType(type: Readonly<EJSONType>): this {\n assert.ok(\n !this.typeHandlers.has(type.placeholder),\n `type with ${type.placeholder} already taken.`,\n );\n\n assert.ok(\n type.placeholder.startsWith('$'),\n 'type placeholder must starts with $ symbol.',\n );\n\n this.pure = false;\n this.typeHandlers.set(type.placeholder, type);\n return this;\n }\n\n /**\n * Stringifies a JavaScript value using custom encoding logic.\n * @param {any} value - The value to encode and stringify.\n * @param {string | number} [space] - Optional space for pretty-printing.\n * @returns {string} - The JSON stringified value.\n */\n stringify(value: any, space?: string | number): string {\n if (this.pure) {\n return JSON.stringify(value, undefined, space);\n }\n\n return JSON.stringify(this.encode(value), undefined, space);\n }\n\n /**\n * Parses a JSON string using custom decoding logic.\n * @param {string} value - The JSON string to parse.\n * @returns {any} - The decoded JavaScript object.\n */\n parse(value: string): any {\n if (this.pure) {\n return JSON.parse(value);\n }\n\n return JSON.parse(value, this.reviewerReady);\n }\n\n /** @internal */\n protected _replacer(value: any, key: string) {\n // deep object check\n if (isPlainObject(value)) return;\n // deep array check\n if (Array.isArray(value)) return;\n // exclude primitive\n if (!isInfinity(value) && !isBigInt(value)) {\n if (isPrimitive(value)) return;\n }\n\n for (const type of this.typeHandlers.values()) {\n const res = type.encode(value, this.encode);\n\n if (res !== undefined) {\n return type.encodeInline ? res : { [type.placeholder]: res };\n }\n }\n\n return value;\n }\n\n /** @internal */\n protected _reviewer(_: string, value: any) {\n const key = firstKey(value);\n\n if (!key || key[0] !== '$') return value;\n\n const type = this.typeHandlers.get(key);\n\n if (type) {\n return type.decode(value[key]);\n }\n\n return value;\n }\n}\n\nfunction firstKey(value: unknown): string | null {\n if (!isObject(value)) return null;\n\n for (const key in value) {\n return key;\n }\n\n return null;\n}\n","import { EJSON } from './EJSON';\nimport {\n BigIntType,\n BinaryType,\n DateType,\n InfinityType,\n MapType,\n RegexType,\n SetType,\n} from './types';\n\n/**\n * Creates a new instance of the `EJSON` (Extensible JSON) with optional basic types pre-registered.\n *\n * This function allows you to initialize an `EJSON` instance with commonly used types like `Map`, `Set`,\n * `Date`, `RegExp`, `Infinity`, `BigInt` and `Uint8Array`. These types are added to the type handlers only when `withBasicTypes` is set to `true`.\n *\n * | Type | Placeholder | Alias |\n * |-------------|-------------|----------------|\n * | Date | $date | EJSON.Date |\n * | Map | $map | EJSON.Map |\n * | Set | $set | EJSON.Set |\n * | Infinity | $inf | EJSON.Infinity |\n * | BigInt | $bigint | EJSON.BigInt |\n * | RegExp | $regexp | EJSON.RegExp |\n * | Uint8Array | $binary | EJSON.Binary |\n * | Uint16Array | $binary | EJSON.Binary |\n * | Uint32Array | $binary | EJSON.Binary |\n *\n * @param {boolean} [withBasicTypes=false] - Indicates whether to include basic types like Map, Set, Date, and BigInt.\n * @returns {EJSON} - A new instance of the `EJSON` class configured with optional basic types.\n *\n * @example\n * // Instance with basic types (Map, Set, Date, BigInt, Uint8Array)\n * import { EJSON } from '@andrew_l/toolkit';\n *\n * EJSON.stringify({ value: new Date(0) });\n * // {\"value\":{\"$date\": 0}}\n *\n * @example\n * // Create an EJSON instance without any additional types\n * const ejson = createEJSON();\n *\n * ejson.stringify({ value: new Date(0) });\n * // {\"value\":\"1970-01-01T00:00:00.000Z\"}\n *\n * @example\n * // Custom type\n * import { EJSON, createEJSON } from '@andrew_l/toolkit';\n *\n * const ejson = createEJSON();\n *\n * ejson.vendorName = 'Andrew';\n *\n * // Add pre-build date type\n * ejson.addType(EJSON.Date);\n *\n * // Add custom buffer type\n * ejson.addType({\n * placeholder: '$buffer',\n * encode(value) {\n * if (Buffer.isBuffer(value)) {\n * return value.toString('hex');\n * }\n * },\n * decode(value) {\n * return Buffer.from(value, 'hex');\n * }\n * });\n *\n * ejson.stringify({\n * value: [\n * Buffer.from('Hello World', 'utf8'),\n * new Date(0)\n * ]\n * });\n * // {\"value\":[{\"$buffer\":\"48656c6c6f20576f726c64\"},{\"$date\":0}]}\n *\n * console.log(ejson.mimetype); // application/vnd.andrew+json\n *\n * @group EJSON\n */\nexport function createEJSON(withBasicTypes: boolean = false): EJSON {\n const ejson = new EJSON();\n\n if (withBasicTypes) {\n ejson.addType(MapType);\n ejson.addType(SetType);\n ejson.addType(DateType);\n ejson.addType(InfinityType);\n ejson.addType(BigIntType);\n ejson.addType(BinaryType);\n ejson.addType(RegexType);\n }\n\n return ejson;\n}\n","import type { EJSON } from './EJSON';\n\nexport interface EJSONStreamOptions {\n /**\n * EJSON Instance\n */\n ejson: EJSON;\n\n /**\n * Starting encoding symbol\n */\n op: string;\n\n /**\n * Separator symbol\n */\n sep: string;\n\n /**\n * Ending symbol\n */\n cl: string;\n\n /** @internal */\n onStart?: (controller: TransformStreamDefaultController) => Promise<void>;\n\n /** @internal */\n onFlush?: (controller: TransformStreamDefaultController) => Promise<void>;\n}\n\nexport class EJSONStream extends TransformStream<any, string> {\n protected ejson: EJSON;\n\n constructor({ ejson, cl, op, sep, onFlush, onStart }: EJSONStreamOptions) {\n let firstChunk = true;\n\n super({\n async start(controller) {\n if (onStart) {\n await onStart(controller);\n }\n\n controller.enqueue(op);\n },\n transform(chunk, controller) {\n const jsonString = ejson.stringify(chunk);\n\n if (firstChunk) {\n firstChunk = false;\n } else {\n controller.enqueue(sep);\n }\n\n controller.enqueue(jsonString);\n },\n flush(controller) {\n controller.enqueue(cl);\n\n if (onFlush) {\n return onFlush(controller);\n }\n },\n });\n\n this.ejson = ejson;\n }\n\n /**\n * The vendor name used for the custom MIME type definition.\n * If null, defaults to 'application/json'.\n */\n get vendorName(): string | null {\n return this.ejson.vendorName;\n }\n\n /**\n * MIME type based on the provided vendor name or defaults to 'application/json'.\n */\n get mimetype(): string {\n return this.ejson.mimetype;\n }\n}\n","import { createEJSON } from './createEJSON';\n\nexport const instance = createEJSON(true);\n","import { assert } from '@/assert';\nimport { isPlainObject } from '@/is';\nimport type { Awaitable } from '@/types';\nimport { EJSONStream, type EJSONStreamOptions } from './EJSONStream';\nimport { instance } from './instance';\n\nexport interface EJSONStreamOptionsWithPayload\n extends Partial<EJSONStreamOptions> {\n prepend?: () => Awaitable<object | null | undefined>;\n append?: () => Awaitable<object | null | undefined>;\n resultKey: string;\n}\n\n/**\n * Creates an instance of `EJSONStream`. This function provides flexibility to create a simple stream\n * or one with custom payload transformations, such as appending or prepending data.\n *\n * The function has overloads to handle either basic streaming options or more advanced use cases\n * with payload functions (`append`, `prepend`, `resultKey`) to modify how JSON payloads are streamed.\n *\n * @function\n * @param {Partial<EJSONStreamOptions> | EJSONStreamOptionsWithPayload} [options] - Options to configure the EJSONStream.\n * @returns {EJSONStream} An instance of the `EJSONStream`.\n *\n * @example\n * // Example 1: Create a simple EJSONStream without custom payload transformations\n * const stream = createEJSONStream();\n *\n * @example\n * // Example 2: Create EJSONStream with specific options\n * const stream = createEJSONStream({\n * cl: ']',\n * op: '[',\n * sep: ',',\n * ejson: someInstance\n * });\n *\n * @example\n * // Example 3: Using prepend and append payloads\n * const streamWithPayloads = createEJSONStream({\n * prepend: async () => ({ key1: 'value1' }),\n * append: async () => ({ key2: 'value2' }),\n * resultKey: 'payload'\n * });\n *\n * // {\"key1\":\"value1\",\"payload\": [...data],\"key2\":\"value2\"}\n *\n * @group EJSON\n */\nexport function createEJSONStream(\n options?: Partial<EJSONStreamOptions>,\n): EJSONStream;\n\nexport function createEJSONStream(\n options: EJSONStreamOptionsWithPayload,\n): EJSONStream;\n\nexport function createEJSONStream(\n options: Partial<EJSONStreamOptionsWithPayload> = {},\n): EJSONStream {\n if (options.resultKey || options.append || options.prepend) {\n return createEJSONStreamPayload(options);\n }\n\n return new EJSONStream(getOptions(options));\n}\n\nfunction createEJSONStreamPayload(\n options: Partial<EJSONStreamOptionsWithPayload>,\n): EJSONStream {\n let { cl, ejson, op, sep } = getOptions(options);\n const { append, prepend, resultKey } = options;\n\n assert.notEmptyString(resultKey, 'resultKey required.');\n\n const stream = new EJSONStream({\n ejson,\n cl,\n op,\n sep,\n async onStart(controller) {\n if (!prepend) {\n controller.enqueue(`{\"${resultKey}\":`);\n return;\n }\n\n const data = await prepend();\n\n if (data === null || data === undefined) {\n controller.enqueue(`{\"${resultKey}\":`);\n return;\n }\n\n assert.ok(\n isPlainObject(data),\n 'prepend result expected to be plain object',\n );\n\n const dataPart = instance.stringify(data).slice(0, -1);\n\n // Empty prepend object\n if (dataPart === '{') {\n controller.enqueue(`{\"${resultKey}\":`);\n return;\n }\n\n controller.enqueue(`${dataPart}${sep}\"${resultKey}\":`);\n },\n async onFlush(controller) {\n if (!append) {\n controller.enqueue('}');\n return;\n }\n\n const data = await append();\n\n if (data === null || data === undefined) {\n controller.enqueue('}');\n return;\n }\n\n assert.ok(\n isPlainObject(data),\n 'prepend result expected to be plain object',\n );\n\n const dataPart = instance.stringify(data).slice(1);\n\n // Empty append object\n if (dataPart === '}') {\n controller.enqueue(`}`);\n return;\n }\n\n controller.enqueue(`${sep}${dataPart}`);\n },\n });\n\n return stream;\n}\n\nfunction getOptions(options: Partial<EJSONStreamOptions>): EJSONStreamOptions {\n const { ejson = instance, cl = ']', op = '[', sep = ',' } = options;\n\n return {\n cl,\n ejson,\n op,\n sep,\n };\n}\n","import { isNumber } from './is';\nimport { round2digits } from './num/round2digits';\n\ntype Dict<T> = { [key: string]: T | undefined };\n\ntype ListTypeName = 'bool' | 'int' | 'decimal' | 'string';\n\ntype ListTypeNameToType<T extends ListTypeName> = T extends 'bool'\n ? boolean\n : T extends 'int'\n ? number\n : T extends 'decimal'\n ? number\n : T extends 'string'\n ? string\n : never;\n\n/**\n * Environment variable parser\n *\n * @group Environment\n */\nexport interface EnvParser {\n /**\n * NODE_ENV is `development`\n */\n isDevelopment: boolean;\n\n /**\n * NODE_ENV is `production`\n */\n isProduction: boolean;\n\n /**\n * NODE_ENV is `stage`\n */\n isStage: boolean;\n\n /**\n * NODE_ENV is `test`\n */\n isTest: boolean;\n\n /**\n * Returns `true` when environment key has set to `\"true\"`\n *\n * Returns `defaultValue` when key is not defined\n */\n bool(key: string, defaultValue?: boolean): boolean;\n\n /**\n * Returns `number` when environment key has correct number value.\n *\n * Returns `defaultValue` when environment key is not defined or has invalid number value\n */\n int(key: string, defaultValue?: number): number;\n\n /**\n * Returns `number` when environment key has correct number value.\n *\n * Returns `defaultValue` when environment key is not defined or has invalid number value\n */\n decimal(key: string, dights?: number, defaultValue?: number): number;\n\n /**\n * Returns `string` when environment key has defined.\n *\n * Returns `defaultValue` when environment key is not defined\n */\n string(key: string, defaultValue?: string): string;\n\n /**\n * Returns `array` of parsed environment value.\n *\n * Returns `defaultValue` when key is not defined\n */\n list<T extends ListTypeName>(\n key: string,\n itemType: T,\n defaultValue?: ListTypeNameToType<T>[],\n ): ListTypeNameToType<T>[];\n\n /**\n * Returns parsed json value.\n *\n * Returns `defaultValue` when key is not defined or invalid json value\n */\n json<T = any>(key: string, defaultValue?: T | null): T | null;\n}\n\n/**\n * Ready-to-use environment parser.\n *\n * Target: `process.env`\n *\n * Fallback: `import.meta.env`\n *\n * @example\n *\n * // env.string\n * const API_KEY = env.string('API_KEY', 'test_key');\n *\n * // env.bool\n * const TEST_FEATURE = env.bool('TEST_FEATURE', false);\n *\n * // env.int\n * const RETRY_ATTEMPTS = env.int('RETRY_ATTEMPTS', 5);\n *\n * // env.decimal\n * const DELAY_SECONDS = env.decimal('DELAY_SECONDS', 2, 5); // round to 2 dights\n *\n * // env.list\n * const TARGET_ROLES = env.list('TARGET_ROLES', 'string', ['ADMIN']);\n *\n * // env.json\n * const GOOGLE_CREDS = env.json<{ projectId: string; token: string; }>('GOOGLE_CREDS');\n *\n * @group Environment\n */\nexport const env: Readonly<EnvParser> = (() => {\n if ((globalThis as any)?.process) {\n return createEnvParser(process.env);\n } else {\n return createEnvParser((import.meta as any).env);\n }\n})();\n\n/**\n * @example\n * const env = createEnvParser(process.env);\n * // const env = createEnvParser(import.meta.env);\n *\n * const API_KEY = env.string('API_KEY', 'test_key');\n *\n * @group Environment\n */\nexport function createEnvParser(\n targetObject: Record<string, string> | Dict<string>,\n): Readonly<EnvParser> {\n return Object.freeze({\n isDevelopment: targetObject.NODE_ENV === 'development',\n\n isProduction: targetObject.NODE_ENV === 'production',\n\n isStage: targetObject.NODE_ENV === 'state',\n\n isTest: targetObject.NODE_ENV === 'test',\n\n bool(key: string, defaultValue: boolean = false): boolean {\n if (!(key in targetObject)) {\n return defaultValue;\n }\n\n return parseBoolean(targetObject[key]) ?? defaultValue;\n },\n\n int(key: string, defaultValue: number = 0): number {\n if (!(key in targetObject)) {\n return defaultValue;\n }\n\n return _parseInt(targetObject[key]) ?? defaultValue;\n },\n\n decimal(key: string, dights = undefined, defaultValue: number = 0): number {\n if (!(key in targetObject)) {\n return isNumber(dights)\n ? round2digits(defaultValue, dights)\n : defaultValue;\n }\n\n return parseDecimal(targetObject[key], dights) ?? defaultValue;\n },\n\n string(key: string, defaultValue: string = ''): string {\n return targetObject[key] ?? defaultValue;\n },\n\n list<T extends ListTypeName>(\n key: string,\n type: T,\n defaultValue: ListTypeNameToType<T>[] = [],\n ): ListTypeNameToType<T>[] {\n if (!(key in targetObject)) {\n return defaultValue;\n }\n\n const parsers: Record<ListTypeName, (value: unknown) => any> = {\n int: _parseInt,\n bool: parseBoolean,\n decimal: v => parseDecimal(v, 2),\n string: v => v,\n };\n\n return ((targetObject as any)[key] as string)\n .split(',')\n .map((value, idx) => {\n const parsedValue = parsers[type](value.trim());\n\n if (parsedValue === undefined) {\n console.warn('Warn! Failed to parse list item as ' + type, {\n key,\n idx,\n type,\n value,\n });\n }\n\n return parsedValue;\n })\n .filter(v => v !== undefined);\n },\n\n json<T = any>(key: string, defaultValue: T | null = null): T | null {\n if (!(key in targetObject)) {\n return defaultValue;\n }\n\n try {\n // @ts-expect-error\n return JSON.parse(targetObject[key]);\n } catch (err) {\n console.warn('Failed to parse json env variable', key);\n return defaultValue;\n }\n },\n });\n}\n\nfunction parseBoolean(value: unknown): boolean | undefined {\n if (value === 'true') return true;\n if (value === 'false') return false;\n\n return undefined;\n}\n\nfunction _parseInt(value: unknown): number | undefined {\n const parsed = parseInt(value as any);\n\n return isNumber(parsed) ? parsed : undefined;\n}\n\nfunction parseDecimal(value: unknown, dights?: number): number | undefined {\n const parsed = parseFloat(value as any);\n\n return isNumber(parsed)\n ? isNumber(dights)\n ? round2digits(parsed, dights)\n : parsed\n : undefined;\n}\n","import { isNumber } from '../is.js';\n\nconst CODE_TO_MESSAGE: Record<number, string> = Object.freeze({\n 100: 'Continue',\n 101: 'Switching Protocols',\n 102: 'Processing',\n 103: 'Early Hints',\n\n 200: 'OK',\n 201: 'Created',\n 202: 'Accepted',\n 203: 'Non-Authoritative Information',\n 204: 'No Content',\n 205: 'Reset Content',\n 206: 'Partial Content',\n\n 300: 'Multiple Choices',\n 301: 'Moved Permanently',\n 302: 'Found',\n 303: 'See Other',\n 304: 'Not Modified',\n 305: 'Use Proxy',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 402: 'Payment Required',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 407: 'Proxy Authentication Required',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length Required',\n 412: 'Precondition Failed',\n 413: 'Payload Too Large',\n 414: 'URI Too Long',\n 415: 'Unsupported Media Type',\n 416: 'Range Not Satisfiable',\n 417: 'Expectation Failed',\n 418: \"I'm a teapot\",\n 422: 'Unprocessable Entity',\n 425: 'Too Early',\n 426: 'Upgrade Required',\n 428: 'Precondition Required',\n 429: 'Too Many Requests',\n 431: 'Request Header Fields Too Large',\n\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n 506: 'Variant Also Negotiates',\n 507: 'Insufficient Storage',\n 508: 'Loop Detected',\n 510: 'Not Extended',\n 511: 'Network Authentication Required',\n});\n\nexport interface AppErrorOptions extends ErrorOptions {\n /**\n * Custom error code\n */\n code?: string;\n}\n\n/**\n * Simple application error class with the code\n * @group Errors\n */\nexport class AppError extends Error {\n /**\n * HTTP valid status code\n */\n statusCode: number;\n\n /**\n * Custom error code\n */\n code?: string;\n\n constructor(message: string, statusCode?: number, options?: AppErrorOptions);\n\n /**\n * Message will be generated from status code\n */\n constructor(statusCode: number, options?: AppErrorOptions);\n\n constructor(...args: any[]) {\n let message = 'Unknown error';\n let statusCode = 500;\n let code = 'ERR_UNKNOWN';\n let options: AppErrorOptions | undefined;\n\n if (isNumber(args[0])) {\n statusCode = args[0];\n message = CODE_TO_MESSAGE[statusCode] || message;\n options = args[1];\n } else {\n message = args[0] || CODE_TO_MESSAGE[statusCode] || message;\n statusCode = isNumber(args[1]) ? args[1] : statusCode;\n options = args[2];\n }\n\n // Call base class constructor\n super(message, options);\n\n if (typeof Error.captureStackTrace !== 'function') {\n this.stack = new Error().stack;\n } else {\n Error.captureStackTrace(this, AppError);\n }\n\n this.statusCode = statusCode;\n this.code = options?.code ?? code;\n }\n\n get name() {\n return 'AppError';\n }\n\n static is(value: any): value is AppError {\n return value instanceof AppError || value?.name === 'AppError';\n }\n}\n","/**\n * Same as `AssertionError` but for browser env.\n * @group Errors\n */\nexport class BrowserAssertionError extends Error {\n /**\n * Set to the `actual` argument for methods such as {@link assert.strictEqual()}.\n */\n actual: unknown;\n /**\n * Set to the `expected` argument for methods such as {@link assert.strictEqual()}.\n */\n expected: unknown;\n /**\n * Set to the passed in operator value.\n */\n operator: string;\n /**\n * Indicates if the message was auto-generated (`true`) or not.\n */\n generatedMessage: boolean;\n /**\n * Value is always `ERR_ASSERTION` to show that the error is an assertion error.\n */\n code: 'ERR_ASSERTION';\n\n constructor(options?: {\n /** If provided, the error message is set to this value. */\n message?: string | undefined;\n /** The `actual` property on the error instance. */\n actual?: unknown | undefined;\n /** The `expected` property on the error instance. */\n expected?: unknown | undefined;\n /** The `operator` property on the error instance. */\n operator?: string | undefined;\n /** If provided, the generated stack trace omits frames before this function. */\n stackStartFn?: Function | undefined;\n }) {\n super(options?.message);\n this.actual = options?.actual;\n this.expected = options?.expected;\n this.operator = options?.operator ?? 'none';\n this.generatedMessage = false;\n this.code = 'ERR_ASSERTION';\n }\n}\n","import { isString } from '@/is';\n\n/**\n * Extract file extension from string\n *\n * @example\n * getFileExtension('Andrew L - CV.pdf'); // 'pdf'\n *\n * @group Files\n */\nexport function getFileExtension(name: string, withDot = true): string | null {\n if (!isString(name)) {\n return null;\n }\n\n const ext = name.split('.').at(-1)?.split('?')?.at(0);\n return ext ? (withDot ? `.${ext}` : ext) : null;\n}\n","import { isString } from '@/is';\n\nconst DEF_PROTOCOLS = ['http://', 'https://'];\n\n/**\n * Checks if the provided URL string has a protocol prefix, such as `http://` or `https://`.\n * The function checks whether the URL starts with any of the specified protocols (defaults to HTTP and HTTPS).\n *\n * This can be useful for validating URLs or ensuring a URL has a valid protocol before using it in network requests.\n *\n * @example\n * hasProtocol('https://google.com'); // true\n * hasProtocol('http://google.com'); // true\n * hasProtocol('google.com'); // false\n *\n * @param url - The URL string to check.\n * @param protocols - An array of protocol prefixes to check against (defaults to `['http://', 'https://']`).\n * @returns `true` if the URL starts with one of the provided protocols, `false` otherwise.\n *\n * @group Strings\n */\nexport function hasProtocol(url: string, protocols: string[] = DEF_PROTOCOLS) {\n if (!isString(url)) return false;\n\n return protocols.some(v => url.startsWith(v));\n}\n","import { isString } from '@/is';\nimport { hasProtocol } from '@/str/hasProtocol';\nimport { getFileExtension } from '../getFileExtension';\n\n/**\n * Extract filename from string\n *\n * @example\n * getFileName('Andrew L - CV.pdf'); // 'Andrew L - CV'\n *\n * @group Files\n */\nexport function getFileName(value: string): string | null {\n if (hasProtocol(value)) {\n return getFileName(decodeURI(value.split('/').at(-1)?.split('?')?.at(0)!));\n }\n\n if (!isString(value)) return null;\n\n const ext = getFileExtension(value, true);\n\n if (!ext) {\n return value;\n }\n\n return value.slice(0, -ext.length);\n}\n","/**\n * Filters an array of paths to retain only the most specific (deepest) paths,\n * removing any path that is a prefix of another path.\n *\n * @param {string[]} keys - An array of dot-separated string paths.\n * @returns {string[]} - A new array containing only the most specific paths.\n *\n * @example\n * const inputPaths = [\n * 'profile',\n * 'profile.basic',\n * 'profile.basic.fullName',\n * 'profile.updatedAt'\n * ];\n *\n * const result = getMostSpecificPaths(inputPaths);\n * console.log(result); // ['profile.basic.fullName', 'profile.updatedAt']\n *\n * @group Files\n */\nexport function getMostSpecificPaths(keys: string[]): string[] {\n keys = [...keys].sort();\n\n const result = [];\n\n for (let i = 0; i < keys.length; i++) {\n const currentPath = keys[i];\n const nextPath = keys[i + 1];\n\n if (currentPath === nextPath) continue;\n\n if (!nextPath || !nextPath.startsWith(currentPath + '.')) {\n result.push(currentPath);\n }\n }\n\n return result;\n}\n","/**\n * Converts bytes amount into human readably string\n *\n * @example\n * humanFileSize(1024); // 1KB\n *\n * @group Files\n */\nexport function humanFileSize(\n bytes: number,\n digits: number = 1,\n withSpace: boolean = true,\n): string {\n const thresh = 1024;\n const units = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n if (Math.abs(bytes) < thresh) {\n return (bytes / thresh).toFixed(digits) + ` ${units[0]}`;\n }\n\n let u = -1;\n const r = 10 ** digits;\n\n do {\n bytes /= thresh;\n ++u;\n } while (\n Math.round(Math.abs(bytes) * r) / r >= thresh &&\n u < units.length - 1\n );\n\n return bytes.toFixed(digits) + (withSpace ? ' ' : '') + units[u];\n}\n","interface DebounceOptions {\n /**\n * An optional AbortSignal to cancel the debounced function.\n */\n signal?: AbortSignal;\n\n /**\n * An optional array specifying whether the function should be invoked on the leading edge, trailing edge, or both.\n * If `edges` includes \"leading\", the function will be invoked at the start of the delay period.\n * If `edges` includes \"trailing\", the function will be invoked at the end of the delay period.\n * If both \"leading\" and \"trailing\" are included, the function will be invoked at both the start and end of the delay period.\n * @default [\"trailing\"]\n */\n edges?: Array<'leading' | 'trailing'>;\n}\n\nexport interface DebouncedFunction<F extends (...args: any[]) => void> {\n (...args: Parameters<F>): void;\n\n /**\n * Schedules the execution of the debounced function after the specified debounce delay.\n * This method resets any existing timer, ensuring that the function is only invoked\n * after the delay has elapsed since the last call to the debounced function.\n * It is typically called internally whenever the debounced function is invoked.\n *\n * @returns {void}\n */\n schedule: () => void;\n\n /**\n * Cancels any pending execution of the debounced function.\n * This method clears the active timer and resets any stored context or arguments.\n */\n cancel: () => void;\n\n /**\n * Immediately invokes the debounced function if there is a pending execution.\n * This method also cancels the current timer, ensuring that the function executes right away.\n */\n flush: () => void;\n}\n\n/**\n * Creates a debounced function that delays invoking the provided function until after `debounceMs` milliseconds\n * have elapsed since the last time the debounced function was invoked. The debounced function also has a `cancel`\n * method to cancel any pending execution.\n *\n * @template F - The type of function.\n * @param {F} func - The function to debounce.\n * @param {number} debounceMs - The number of milliseconds to delay.\n * @param {DebounceOptions} options - The options object\n * @param {AbortSignal} options.signal - An optional AbortSignal to cancel the debounced function.\n * @returns A new debounced function with a `cancel` method.\n *\n * @example\n * const debouncedFunction = debounce(() => {\n * console.log('Function executed');\n * }, 1000);\n *\n * // Will log 'Function executed' after 1 second if not called again in that time\n * debouncedFunction();\n *\n * // Will not log anything as the previous call is canceled\n * debouncedFunction.cancel();\n *\n * // With AbortSignal\n * const controller = new AbortController();\n * const signal = controller.signal;\n * const debouncedWithSignal = debounce(() => {\n * console.log('Function executed');\n * }, 1000, { signal });\n *\n * debouncedWithSignal();\n *\n * // Will cancel the debounced function call\n * controller.abort();\n *\n * @author es-toolkit\n * @group Utility Functions\n */\nexport function debounce<F extends (...args: any[]) => void>(\n func: F,\n debounceMs: number,\n { signal, edges }: DebounceOptions = {},\n): DebouncedFunction<F> {\n let pendingThis: any = undefined;\n let pendingArgs: Parameters<F> | null = null;\n\n const leading = edges != null && edges.includes('leading');\n const trailing = edges == null || edges.includes('trailing');\n\n const invoke = () => {\n if (pendingArgs !== null) {\n func.apply(pendingThis, pendingArgs);\n pendingThis = undefined;\n pendingArgs = null;\n }\n };\n\n const onTimerEnd = () => {\n if (trailing) {\n invoke();\n }\n\n cancel();\n };\n\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const schedule = () => {\n if (timeoutId != null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n onTimerEnd();\n }, debounceMs);\n };\n\n const cancelTimer = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n const cancel = () => {\n cancelTimer();\n pendingThis = undefined;\n pendingArgs = null;\n };\n\n const flush = () => {\n cancelTimer();\n invoke();\n };\n\n const debounced = function (this: any, ...args: Parameters<F>) {\n if (signal?.aborted) {\n return;\n }\n\n pendingThis = this;\n pendingArgs = args;\n\n const isFirstCall = timeoutId == null;\n\n schedule();\n\n if (leading && isFirstCall) {\n invoke();\n }\n };\n\n debounced.schedule = schedule;\n debounced.cancel = cancel;\n debounced.flush = flush;\n\n signal?.addEventListener('abort', cancel, { once: true });\n\n return debounced;\n}\n","import type {\n ExecResult,\n ExecResultToSkip,\n ExecResultToSuccess,\n} from '../types';\n\n/**\n * @group Utility Functions\n */\nexport function isSuccess<T extends ExecResult>(\n value: T,\n // @ts-expect-error\n): value is ExecResultToSuccess<T> {\n return value.success === true;\n}\n\n/**\n * @group Utility Functions\n */\nexport function isSkip<T extends ExecResult>(\n value: T,\n // @ts-expect-error\n): value is ExecResultToSkip<T> {\n return value.skip === true;\n}\n","import {\n isDate,\n isMap,\n isNumber,\n isObject,\n isSet,\n isWeakMap,\n isWeakSet,\n} from '@/is';\nimport type { AnyFunction } from '../../types';\n\nexport type TypeOf = keyof TypeOfMap;\n\nexport type TypeOfMap = {\n null: null;\n undefined: undefined;\n object: Record<PropertyKey, any>;\n string: string;\n number: number;\n function: AnyFunction;\n bigint: bigint;\n boolean: boolean;\n symbol: symbol;\n date: Date;\n array: any[];\n map: Map<any, any>;\n weakmap: WeakMap<WeakKey, any>;\n set: Set<any>;\n weakset: WeakSet<WeakKey>;\n unknown: unknown;\n};\n\n/**\n * Typeof that you deserve\n * @group Utility Functions\n */\nexport function typeOf(value: unknown): TypeOf {\n const type = typeof value;\n\n switch (type) {\n case 'number':\n return isNumber(value) ? 'number' : 'unknown';\n\n case 'object': {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (isSet(value)) return 'set';\n if (isWeakSet(value)) return 'weakset';\n if (isMap(value)) return 'map';\n if (isWeakMap(value)) return 'weakmap';\n if (isDate(value)) return 'date';\n if (isObject(value)) return 'object';\n return 'unknown';\n }\n\n default: {\n return type;\n }\n }\n}\n","import {\n isDate,\n isEmpty,\n isEqual,\n isFunction,\n isNumber,\n isObject,\n isString,\n} from '@/is.js';\nimport { deepAssign } from '@/object/index.js';\nimport { type TypeOf, type TypeOfMap, typeOf } from '../typeOf';\n\ntype StringifyOptions = {\n /**\n * Exclude empty values, checking by `isEmpty`\n * @default true\n */\n excludeEmpty?: boolean;\n\n /**\n * Exclude values when equals with defaults\n */\n excludeDefaults?: Record<string, any>;\n};\n\n/**\n * Simple query stringy interface that supports encoding/decoding of `Array`, `Set`, `Map`, `Object`, `BigInt`\n *\n * @example\n * // encode\n * qs.stringify({ page: 1, limit: 10 }); // 'page=1&limit=10'\n *\n * // decode\n * const defaults = { page: 1, limit: 10 };\n * const params = qs.parse('page=5&limit=abc', defaults); // { page: 5, limit: 10 }\n *\n * @group Utility Functions\n */\nexport const qs = {\n toParams,\n stringify,\n stringifyValue,\n parse,\n parseValue,\n merge,\n};\n\n/**\n * Merge first level values\n */\nfunction merge(...values: Record<string, any>[]): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const filter of values) {\n for (const [key, value] of Object.entries(filter)) {\n const currentValue = result[key];\n const currentType = typeOf(currentValue);\n const filterType = typeOf(value);\n\n // overwrite with new value when type mismatch\n if (currentType !== filterType) {\n result[key] = value;\n continue;\n }\n\n switch (currentType) {\n case 'array': {\n result[key] = Array.from(new Set([...currentValue, ...value]));\n break;\n }\n\n case 'object': {\n result[key] = {};\n deepAssign(result[key], currentValue);\n deepAssign(result[key], value);\n break;\n }\n\n case 'map': {\n result[key] = new Map([\n ...(Array.from(currentValue.entries()) as any[]),\n ...(Array.from(value.entries()) as any[]),\n ]);\n break;\n }\n\n case 'set': {\n result[key] = new Set([\n ...Array.from(currentValue),\n ...Array.from(value),\n ]);\n break;\n }\n\n default: {\n result[key] = value;\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Simple function to transform object into query string (not standards)\n */\nfunction stringify(\n obj: Record<string, any>,\n options?: StringifyOptions,\n): string {\n return new URLSearchParams(toParams(obj, options)).toString();\n}\n\n/**\n * Prepare search params object\n */\nfunction toParams(\n obj: Record<string, any>,\n options?: StringifyOptions,\n): Record<string, string> {\n const result: Record<string, string> = {};\n const excludeEmpty = options?.excludeEmpty !== false;\n const excludeDefaults = options?.excludeDefaults;\n\n for (const [key, value] of Object.entries(obj)) {\n if (excludeEmpty && isEmpty(value)) continue;\n\n if (excludeDefaults && key in excludeDefaults) {\n const defValue = excludeDefaults[key];\n if (isEqual(value, defValue)) continue;\n }\n\n const strValue = stringifyValue(value);\n\n if (excludeEmpty && strValue === '') {\n continue;\n }\n\n result[key] = strValue;\n }\n\n return result;\n}\n\n/**\n * Parse query string as is without type casting\n */\nfunction parse(value: string): Record<string, string>;\n\n/**\n * Parse query string and use default object as type cast schema\n */\nfunction parse<T extends Record<string, any>>(\n value: string,\n defaults: Partial<T>,\n): T;\n\n/**\n * Parse query params and use default object as type cast schema\n */\nfunction parse<T extends Record<string, any>>(\n value: Record<string, any>,\n defaults: T,\n): Partial<T>;\n\nfunction parse(\n value: string | Record<string, any>,\n defaults?: Record<string, any>,\n): any {\n const objValue = isString(value)\n ? Object.fromEntries(new URLSearchParams(value).entries())\n : value;\n\n if (!defaults) {\n return { ...objValue };\n }\n\n const result: Record<string, any> = {};\n\n for (const [key, defValue] of Object.entries(defaults)) {\n const defType = typeOf(defValue);\n\n let parsedValue = parseValue(objValue[key], defType);\n\n if (parsedValue !== undefined || defType === 'undefined') {\n if (defType === 'array' && defValue[0] !== undefined) {\n const itemValue = typeOf(defValue[0]);\n parsedValue = (parsedValue as any[]).map(v => parseValue(v, itemValue));\n }\n\n result[key] = parsedValue;\n } else {\n result[key] = defValue;\n }\n }\n\n return result;\n}\n\n/**\n * Stringify value to use as query parameter\n */\nfunction stringifyValue(value: unknown): string {\n const valueType = typeOf(value);\n\n switch (valueType) {\n case 'undefined': {\n return '';\n }\n\n case 'null': {\n return '';\n }\n\n case 'array': {\n let result = '';\n let sep = '';\n\n for (const item of value as any[]) {\n if (item === undefined) continue;\n\n if (\n isObject(item) ||\n Array.isArray(item) ||\n (isString(item) && item.includes(','))\n ) {\n result = JSON.stringify(value);\n break;\n } else {\n result += sep + stringifyValue(item);\n sep = ',';\n }\n }\n\n return result;\n }\n\n case 'date': {\n return (value as Date).toISOString();\n }\n\n case 'map': {\n return JSON.stringify(Array.from((value as Map<any, any>).entries()));\n }\n\n case 'set': {\n return JSON.stringify(Array.from((value as Set<any>).values()));\n }\n\n case 'boolean':\n case 'number':\n case 'string':\n case 'bigint': {\n return String(value);\n }\n\n case 'object': {\n return JSON.stringify(value);\n }\n\n case 'unknown': {\n if (isFunction(value?.toString)) {\n return value.toString();\n }\n }\n\n default: {\n throw new Error('Attempt to stringify unsupported type: ' + valueType);\n }\n }\n}\n\n/**\n * Parse string query value as a type\n */\nfunction parseValue<T extends TypeOf>(\n value: any,\n asType: T,\n): TypeOfMap[T] | undefined {\n const type = typeOf(value);\n\n if (type === asType) {\n return value;\n } else if (type !== 'string') {\n return undefined;\n }\n\n try {\n switch (asType) {\n case 'undefined': {\n return undefined;\n }\n\n case 'array': {\n if (value.startsWith('[') && value.endsWith(']')) {\n return JSON.parse(value);\n }\n\n return value.split(',') as any;\n }\n\n case 'boolean': {\n return (value === 'true') as any;\n }\n\n case 'date': {\n const parsed = new Date(value) as any;\n return (isDate(parsed) ? parsed : undefined) as any;\n }\n\n case 'map': {\n return new Map(JSON.parse(value)) as any;\n }\n\n case 'number': {\n const parsed = parseFloat(value);\n return (isNumber(parsed) ? parsed : undefined) as any;\n }\n\n case 'object': {\n return JSON.parse(value);\n }\n\n case 'set': {\n return new Set(JSON.parse(value)) as any;\n }\n\n case 'null': {\n return (value === '' || value === undefined ? null : undefined) as any;\n }\n\n case 'string': {\n return value as any;\n }\n\n case 'bigint': {\n return BigInt(value) as any;\n }\n }\n } catch (_) {}\n\n return undefined;\n}\n","export interface Defer<T = unknown> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (value: any) => void;\n}\n\n/**\n * Old known defer :)\n *\n * @example\n * function loadModule() {\n * const q = defer<void>();\n *\n * setTimeout(() => q.resolve(), 5000);\n *\n * return q.promise;\n * }\n *\n * await loadModule();\n *\n * @group Promise\n */\nexport function defer<T = void>(): Defer<T> {\n let resolve: any;\n let reject: any;\n\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n\n return {\n resolve: resolve,\n reject: reject,\n promise: promise,\n };\n}\n","import { isFunction } from '@/is';\nimport type { AnyFunction, Fn } from '@/types';\n\nconst defaultWindow = (globalThis as any)?.window as Window | undefined;\n\nconst idle: (fn: AnyFunction) => void = (() => {\n if (defaultWindow?.requestIdleCallback) {\n return defaultWindow.requestIdleCallback;\n } else if (defaultWindow?.requestAnimationFrame) {\n return defaultWindow.requestAnimationFrame;\n } else if (isFunction(process?.nextTick)) {\n return process.nextTick;\n } else {\n return fn => setTimeout(fn, 0);\n }\n})();\n\n/**\n * Executes the provided callback as soon as the event loop is idle.\n * This function allows you to run tasks at the earliest available opportunity\n * without blocking the main execution flow, making it ideal for tasks that can\n * be deferred until the browser is idle or the process is idle.\n *\n * It uses `requestIdleCallback` if available, otherwise it falls back to\n * `requestAnimationFrame`, `process.nextTick`, or `setTimeout` depending on the environment.\n *\n * @example\n * fastIdle(() => {\n * console.log('1');\n * });\n *\n * console.log('2');\n *\n * // Output:\n * // 2\n * // 1\n *\n * @param callback - The callback function to be executed when the event loop is idle.\n *\n * @group Promise\n */\nexport function fastIdle(callback: Fn) {\n return idle(callback);\n}\n\n/**\n * Same as `fastIdle` but promisified\n *\n * @example\n * fastIdlePromise().then(() => {\n * console.log('1');\n * });\n *\n * console.log('2');\n *\n * // 2\n * // 1\n *\n * @group Promise\n */\nexport function fastIdlePromise() {\n return new Promise<void>(resolve => idle(resolve));\n}\n","import { defer } from '../defer';\nimport { fastIdle } from '../fastIdle';\n\n/**\n * Returns a promise that resolves after the provided delay.\n *\n * If the delay is specified as `'tick'`, the promise resolves after the next event loop tick.\n *\n * If a numeric delay is provided, the promise resolves after the specified time in milliseconds.\n *\n * This is useful for introducing delays in asynchronous code, such as for throttling or rate-limiting,\n * or simply pausing execution between iterations.\n *\n * @param amount - The delay duration in milliseconds, or `'tick'` for a resolution after the next event loop tick.\n * @returns A promise that resolves after the specified delay.\n *\n * @example\n * let seconds = 0;\n *\n * // This will print numbers 1, 2, 3... every second\n * while (true) {\n * await delay(1000);\n * console.log(++seconds);\n * }\n *\n * @example\n * // This will wait until the next event loop tick before resolving\n * await delay('tick');\n *\n * @group Promise\n */\nexport function delay(amount: 'tick' | number = 'tick') {\n const d = defer<void>();\n\n if (amount === 'tick') {\n fastIdle(d.resolve);\n } else {\n setTimeout(d.resolve, amount);\n }\n\n return d.promise;\n}\n","import { delay } from '@/promise/delay';\nimport type { AnyFunction } from '@/types';\n\nconst noopShouldRetryBasedOnError = () => true;\n\nexport type RetryOnErrorConfig = {\n /**\n * The function to execute before retry attempt; Allows to update parameters for the main function by returning then in an array\n */\n beforeRetryCallback?: (\n attempt: number,\n lastAttempt: boolean,\n ) => Promise<unknown[] | void>;\n /**\n * Error validation function. If returns true, the main callback's considered ready to be executed again\n */\n shouldRetryBasedOnError?: (error: unknown, attempt: number) => boolean;\n /**\n * Number of retries until the execution fails\n */\n maxRetriesNumber: number;\n\n /**\n * Delay multiply factor\n */\n delayFactor?: number;\n\n /**\n * Delay min milliseconds\n */\n delayMinMs?: number;\n\n /**\n * Delay max milliseconds\n */\n delayMaxMs?: number;\n};\n\n/**\n * Wraps a function with retry logic.\n *\n * @example\n * const fn = await retryOnError({\n * maxRetriesNumber: 10,\n * delayFactor: 2,\n * delayMinMs: 1000,\n * delayMaxMs: 3000,\n * shouldRetryBasedOnError(error, attemptNumber) {\n * return error.code !== 'RECORD_EXISTS';\n * }\n * }, async () => {\n * await db.transactions.insert(doc);\n * });\n *\n * await fn();\n *\n * @group Utility Functions\n */\nexport function retryOnError<T extends AnyFunction>(\n {\n beforeRetryCallback,\n shouldRetryBasedOnError = noopShouldRetryBasedOnError,\n maxRetriesNumber,\n delayFactor = 0,\n delayMaxMs = 1000,\n delayMinMs = 100,\n }: RetryOnErrorConfig,\n fn: T,\n): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> {\n let retryCount = maxRetriesNumber;\n let delayMs = 0;\n\n delayMinMs = Math.max(delayMinMs, 1);\n delayMaxMs = Math.max(delayMaxMs, 1);\n\n const run = async (...args: any[]): Promise<any> => {\n if (delayFactor >= 1 && delayMs > 0) {\n await delay(delayMs);\n }\n\n const currentAttempt = 1 + maxRetriesNumber - retryCount;\n\n try {\n const res = await fn(...args);\n return res;\n } catch (e) {\n if (retryCount > 1 && shouldRetryBasedOnError(e, currentAttempt)) {\n retryCount--;\n delayMs = Math.floor(\n Math.min(Math.max(delayMs, delayMinMs) * delayFactor, delayMaxMs),\n );\n\n if (beforeRetryCallback) {\n const newParams = await beforeRetryCallback(\n currentAttempt,\n retryCount === 0,\n );\n if (newParams) {\n return run(newParams);\n }\n }\n return run(...args);\n }\n\n throw e;\n }\n };\n\n return run;\n}\n","import { debounce } from '../debounce';\n\ninterface ThrottleOptions {\n /**\n * An optional AbortSignal to cancel the debounced function.\n */\n signal?: AbortSignal;\n\n /**\n * An optional array specifying whether the function should be invoked on the leading edge, trailing edge, or both.\n * If `edges` includes \"leading\", the function will be invoked at the start of the delay period.\n * If `edges` includes \"trailing\", the function will be invoked at the end of the delay period.\n * If both \"leading\" and \"trailing\" are included, the function will be invoked at both the start and end of the delay period.\n * @default [\"leading\", \"trailing\"]\n */\n edges?: Array<'leading' | 'trailing'>;\n}\n\nexport interface ThrottledFunction<F extends (...args: any[]) => void> {\n (...args: Parameters<F>): void;\n cancel: () => void;\n flush: () => void;\n}\n\n/**\n * Creates a throttled function that only invokes the provided function at most once\n * per every `throttleMs` milliseconds. Subsequent calls to the throttled function\n * within the wait time will not trigger the execution of the original function.\n *\n * @template F - The type of function.\n * @param {F} func - The function to throttle.\n * @param {number} throttleMs - The number of milliseconds to throttle executions to.\n * @returns {(...args: Parameters<F>) => void} A new throttled function that accepts the same parameters as the original function.\n *\n * @example\n * const throttledFunction = throttle(() => {\n * console.log('Function executed');\n * }, 1000);\n *\n * // Will log 'Function executed' immediately\n * throttledFunction();\n *\n * // Will not log anything as it is within the throttle time\n * throttledFunction();\n *\n * // After 1 second\n * setTimeout(() => {\n * throttledFunction(); // Will log 'Function executed'\n * }, 1000);\n *\n * @author es-toolkit\n * @group Utility Functions\n */\nexport function throttle<F extends (...args: any[]) => void>(\n func: F,\n throttleMs: number,\n { signal, edges = ['leading', 'trailing'] }: ThrottleOptions = {},\n): ThrottledFunction<F> {\n let pendingAt: number | null = null;\n\n const debounced = debounce(func, throttleMs, { signal, edges });\n\n const throttled = function (...args: Parameters<F>) {\n if (pendingAt == null) {\n pendingAt = Date.now();\n } else {\n if (Date.now() - pendingAt >= throttleMs) {\n pendingAt = Date.now();\n debounced.cancel();\n debounced(...args);\n }\n }\n\n debounced(...args);\n };\n\n throttled.cancel = debounced.cancel;\n throttled.flush = debounced.flush;\n\n return throttled;\n}\n","/**\n * Formats a string by replacing format specifiers with values from the provided arguments.\n * It supports a variety of format types, including strings, numbers, and objects.\n *\n * ⚠️ This function mutates the `unusedArgs` array, which will contain any arguments\n * that were not used in the formatting process.\n *\n * @param line - The format string containing placeholders to be replaced by arguments.\n * Format specifiers are indicated by the `%` symbol, followed by a character indicating\n * the type of argument to insert (e.g., `%s` for string, `%d` for integer, `%f` for float).\n * @param args - The array of arguments to replace the format specifiers in the string.\n * The function will iterate over the arguments and substitute them into the format string\n * in the order they appear.\n * @param [unusedArgs=[]] - The array that will collect any unused arguments\n * that were not needed for formatting. This array is mutated by the function.\n *\n * @returns {string} The formatted string with placeholders replaced by corresponding arguments.\n *\n * @example\n * const unusedArgs: any[] = [];\n *\n * console.log(sprintf('Hello %s', ['World', 'Great'], unusedArgs));\n * // Output: 'Hello World'\n * console.log(unusedArgs);\n * // Output: ['Great']\n *\n * @example\n * console.log(sprintf('I have %d apples and %f.5 liters of water.', [5, 3.2], unusedArgs));\n * // Output: 'I have 5 apples and 3.2 liters of water.'\n * console.log(unusedArgs);\n * // Output: []\n *\n * @group Strings\n */\nexport function sprintf(line: string, args: any[], unusedArgs: any[] = []) {\n let result = '';\n\n const argsLen = args.length;\n const lineLen = line.length;\n\n let opened = false;\n let currentChar = -1;\n let lastPos = 0;\n let argsIndex = 0;\n\n for (let idx = 0; idx < lineLen; idx++) {\n currentChar = line.charCodeAt(idx);\n\n // \"%\" found\n if (currentChar === 37) {\n opened = true;\n continue;\n }\n\n if (!opened) continue;\n\n opened = false;\n\n switch (currentChar) {\n // 'd'\n case 100:\n // 'f'\n case 102: {\n result += line.slice(lastPos, idx - 1);\n result += Number(args[argsIndex]);\n lastPos = idx + 1;\n argsIndex++;\n break;\n }\n\n // 'i'\n case 105: {\n result += line.slice(lastPos, idx - 1);\n result += Math.floor(Number(args[argsIndex]));\n lastPos = idx + 1;\n argsIndex++;\n break;\n }\n\n // 'O'\n case 79:\n // 'o'\n case 111:\n // 'j'\n case 106: {\n result += line.slice(lastPos, idx - 1);\n result += tryStringify(args[argsIndex]);\n lastPos = idx + 1;\n argsIndex++;\n break;\n }\n\n // 's'\n case 115: {\n result += line.slice(lastPos, idx - 1);\n result += String(args[argsIndex]);\n lastPos = idx + 1;\n argsIndex++;\n break;\n }\n }\n\n if (argsIndex >= argsLen) break;\n }\n\n if (lastPos < lineLen) {\n result += line.slice(lastPos, lineLen);\n }\n\n if (argsIndex < argsLen) {\n unusedArgs.push(...args.slice(argsIndex, argsLen));\n }\n\n return result;\n}\n\nfunction tryStringify(o: unknown) {\n switch (typeof o) {\n case 'function': {\n return o.name || '<anonymous>';\n }\n\n case 'string': {\n return \"'\" + o + \"'\";\n }\n\n default: {\n try {\n return JSON.stringify(o);\n } catch (e) {\n return '\"[Circular]\"';\n }\n }\n }\n}\n","import { assert } from './assert';\nimport { isString } from './is';\nimport { sprintf } from './str/sprintf';\nimport type { Logger } from './types';\n\ntype LogLevel = Exclude<keyof Logger, 'extend'>;\n\nconst LEVEL_NUM: Record<LogLevel, number> = {\n debug: 0,\n log: 1,\n info: 2,\n warn: 3,\n error: 4,\n};\n\nlet currentLogLevel: number = LEVEL_NUM.log;\n\n/**\n * Set global log level.\n * @group Utility Functions\n */\nexport const loggerSetLevel = (level: LogLevel) => {\n assert.number(LEVEL_NUM[level], `Invalid log level: ${level}`);\n currentLogLevel = LEVEL_NUM[level];\n};\n\n/**\n * Create pretty simple `console.log` wrapper interface.\n *\n * @example\n * const log = logger('UserService');\n *\n * log.info('Create user: %s', 'user_1'); // Create user: %s\n *\n * @group Utility Functions\n */\nexport const logger = (...baseArgs: any[]): Logger => {\n // handle meta.url\n if (isString(baseArgs[0]?.url)) {\n baseArgs[0] = baseArgs[0]?.url;\n }\n\n // normalize meta.url\n if (typeof baseArgs[0] === 'string' && baseArgs[0][0] !== '[') {\n baseArgs[0] = `[${baseArgs[0].split('/')!.at(-1)!.split('?', 1)[0]!}]`;\n }\n\n const writeLog = (level: LogLevel, ...[pattern, ...args]: any[]) => {\n const levelNum = LEVEL_NUM[level];\n\n if (levelNum < currentLogLevel) {\n return;\n }\n\n if (!isString(pattern)) {\n // eslint-disable-next-line no-console\n console[level](...baseArgs, pattern, ...args);\n return;\n }\n\n const unusedArgs: any[] = [];\n const formatted = sprintf(pattern, args, unusedArgs);\n\n // eslint-disable-next-line no-console\n console[level](...baseArgs, formatted, ...unusedArgs);\n };\n\n const log = writeLog.bind(null, 'log');\n\n const info = writeLog.bind(null, 'info');\n\n const warn = writeLog.bind(null, 'warn');\n\n const error = writeLog.bind(null, 'error');\n\n const debug = writeLog.bind(null, 'debug');\n\n const extend = (...args: any[]) => {\n return logger(...baseArgs, ...args);\n };\n\n const instance = {\n log,\n info,\n warn,\n error,\n debug,\n extend,\n };\n\n return instance;\n};\n","import { nextTickIteration } from '@/promise';\n\n/**\n * Asynchronously filters an array using an async predicate function.\n *\n * This function processes an array using an async function as the predicate,\n * allowing you to avoid blocking the event loop while iterating over large arrays.\n * It ensures that the iteration happens asynchronously with minimal impact on the event loop,\n * making it useful for processing large datasets or performing async operations on each element.\n *\n * @param array - The array to be filtered.\n * @param predicate - The async predicate function.\n * It takes three arguments: the current value, the index of the current value, and the full array.\n * It should return a boolean value or a promise that resolves to a boolean indicating whether the value should be kept in the result array.\n *\n * @returns {Promise<T[]>} A promise that resolves to a new array containing the elements that satisfy the predicate.\n *\n * @example\n * const users = Array.from({ length: 100000 }).map((_, idx) => ({\n * id: idx,\n * name: 'User: ' + (idx + 1)\n * }));\n *\n * async function first100Users() {\n * return await asyncFilter(users, (user) => user.id < 100);\n * }\n *\n * Promise.all([\n * first100Users(),\n * otherUsefulTask(),\n * ]).then(console.log);\n *\n * @group Promise\n */\nexport async function asyncFilter<T>(\n array: T[],\n predicate: (\n value: T,\n index: number,\n array: Array<T>,\n ) => Promise<boolean> | boolean,\n): Promise<T[]> {\n const result: T[] = [];\n\n const cooldown = nextTickIteration(10);\n\n for (let idx = 0; idx < array.length; idx++) {\n await cooldown();\n\n const value = array[idx];\n const valid = await predicate(value, idx, array);\n\n if (valid) {\n result.push(value);\n }\n }\n\n return result;\n}\n","import { fastIdle } from '../fastIdle';\n\n/**\n * Creates a cooldown function that resolves after a specified number of executions (`amount`).\n * The cooldown can either occur on the `next` tick or after a specified delay.\n *\n * This is useful for controlling the rate of asynchronous operations, allowing you to pause\n * for a specified amount of time after a certain number of iterations in a loop.\n *\n * @example\n * // Create a cooldown function that waits 1 tick for every 10th execution\n * const cooldown = nextTickIteration(10);\n *\n * for (const item of array) {\n * await cooldown(); // Wait 1 tick for every 10th call\n * // Perform some async operation here\n * }\n *\n * @example\n * // Create a cooldown function with a 100ms delay after every 5 executions\n * const cooldownWithDelay = nextTickIteration(5, 100);\n * for (const item of array) {\n * await cooldownWithDelay(); // Wait 100ms after every 5th call\n * // Perform some async operation here\n * }\n *\n * @param amount The number of executions after which the cooldown should occur.\n * @param delay The delay type or amount. If 'tick', it uses the next idle tick.\n * If a number is provided, it specifies a delay in milliseconds.\n * @returns A function that, when called, returns a promise resolving after the specified cooldown period.\n *\n * @group Promise\n */\nexport function nextTickIteration(\n amount: number,\n delay: number | 'tick' = 'tick',\n): () => Promise<void> {\n let counter = 0;\n\n const tickInterval = delay === 'tick';\n\n return () => {\n counter++;\n\n if (counter >= amount) {\n counter = 0;\n return new Promise(resolve => {\n if (tickInterval) {\n fastIdle(resolve);\n } else {\n setTimeout(resolve, delay);\n }\n });\n }\n\n return Promise.resolve();\n };\n}\n","import { nextTickIteration } from '../nextTickIteration';\n\n/**\n * Asynchronously finds the first element in an array that satisfies the provided async predicate.\n *\n * This function iterates through an array and applies an asynchronous predicate to each element.\n * If the predicate resolves to a truthy value for any element, that element is returned immediately.\n * The function is designed to prevent blocking the event loop during iteration, making it suitable\n * for processing large arrays without impacting performance.\n *\n * @param array - The array to search through.\n * @param callbackfn - The asynchronous predicate function.\n * It takes three arguments: the current value, the index of the current value, and the full array.\n * The predicate function should return a boolean or a promise that resolves to a boolean indicating\n * whether the current value satisfies the condition.\n *\n * @returns {Promise<T | undefined>} A promise that resolves to the first element that satisfies the predicate, or `undefined` if no element matches.\n *\n * @example\n * // Example of using asyncFind to find users by ID asynchronously\n * const users = Array.from({ length: 100000 }).map((_, idx) => ({\n * id: idx,\n * name: 'User: ' + (idx + 1)\n * }));\n *\n * async function findById(userId: number) {\n * return await asyncFind(users, (user) => user.id === userId);\n * }\n *\n * Promise.all([\n * findById(5000),\n * findById(6000),\n * ]).then(console.log);\n *\n * @group Promise\n */\nexport async function asyncFind<T>(\n array: T[],\n callbackfn: (\n value: T,\n index: number,\n array: T[],\n ) => Promise<unknown> | unknown,\n) {\n const cooldown = nextTickIteration(10);\n\n let i = 0;\n\n while (i < array.length) {\n await cooldown();\n\n const result = await callbackfn(array[i], i, array);\n\n if (Boolean(result)) {\n return array[i];\n }\n\n i++;\n }\n\n return undefined;\n}\n","import { nextTickIteration } from '../nextTickIteration';\n\n/**\n * Asynchronously iterates over an array, executing the provided callback for each element with support for parallel processing.\n *\n * This function is similar to `Array.prototype.forEach()`, but it allows asynchronous operations in parallel for each array element.\n * It also prevents blocking the event loop while iterating through large arrays, improving performance for heavy tasks.\n * The function processes items in batches to manage concurrency and can be configured to process multiple items at the same time.\n *\n * **Note**: The callback function can return either a promise or a value. If it returns a promise, `asyncForEach` will wait for it to resolve before moving to the next iteration.\n *\n * @param array - The array to iterate over.\n * @param callbackfn - The async callback function to execute for each element.\n * This function takes three parameters:\n * - `value`: The current element of the array.\n * - `index`: The index of the current element in the array.\n * - `array`: The array that is being iterated over.\n * The function should either return a `void` or a `Promise` that resolves when the async operation is done.\n *\n * @param {Object} [options] - Optional settings to control the concurrency of the operation.\n * @param {number} [options.concurrency=1] - The number of items to process in parallel. Defaults to 1 (sequential processing).\n *\n * @returns {Promise<void>} A promise that resolves when all elements have been processed.\n *\n * @example\n * async function task(taskName: string) {\n * const largeArray = Array.from({ length: 100000 }).map((_, idx) => idx);\n *\n * await asyncForEach(largeArray, (value) => {\n * if (value % 100 === 0) {\n * console.log(taskName, 'handle:', value);\n * }\n * });\n * }\n *\n * Promise.all([\n * task('task 1'),\n * task('task 2'),\n * ]);\n *\n * @group Promise\n */\nexport async function asyncForEach<T>(\n array: T[],\n callbackfn: (\n value: T,\n index: number,\n array: Array<T>,\n ) => Promise<void> | void,\n { concurrency = 1 } = {},\n): Promise<void> {\n const cooldown = nextTickIteration(10);\n\n let i = 0;\n\n const handle = (value: T, index: number) => {\n return callbackfn(value, i + index, array);\n };\n\n while (i < array.length) {\n await cooldown();\n\n const batch = await Promise.all(\n array.slice(i, i + concurrency).map(handle),\n );\n\n i += batch.length;\n }\n}\n","import { isPromise } from '@/is';\nimport type { AnyFunction } from '@/types';\nimport { defer } from '../defer';\n\nexport type SimpleEventMap<T> = Record<keyof T, any[]> | SimpleDefaultEventMap;\nexport type SimpleDefaultEventMap = [never];\n\ntype Key<K, T> = T extends SimpleDefaultEventMap\n ? string | symbol\n : K | keyof T;\n\ntype Listener<K, T, F> = T extends SimpleDefaultEventMap\n ? F\n : K extends keyof T\n ? T[K] extends unknown[]\n ? (...args: T[K]) => void\n : never\n : never;\n\ntype Listener1<K, T> = Listener<K, T, (...args: any[]) => void>;\n\ntype Args<K, T> = T extends SimpleDefaultEventMap\n ? [...args: any[]]\n : K extends keyof T\n ? T[K]\n : never;\n\nconst onError = (error: unknown) => {\n console.error(error);\n};\n\n/**\n * Simplified version on nodejs `EventEmitter` but platform agnostic\n *\n * @example\n * const emitter = new SimpleEventEmitter();\n *\n * emitter.on('message', (data) => {\n * console.log('msg', data)\n * });\n *\n * emitter.once('message', (data) => {\n * console.log('once msg', data)\n * });\n *\n * emitter.emit('message', { text: 'Hello' });\n * emitter.emit('message', { text: 'Hello 2' });\n *\n * @group Promise\n */\nexport class SimpleEventEmitter<\n T extends SimpleEventMap<T> = SimpleDefaultEventMap,\n> {\n #listeners: Map<any, Set<AnyFunction>> = new Map();\n\n constructor() {\n // @ts-expect-error\n this.on('error', onError);\n }\n\n static once(\n emitter: SimpleEventEmitter,\n eventName: string | symbol,\n ): Promise<any[]> {\n const q = defer<any[]>();\n\n emitter.once(eventName, (...args: any[]) => q.resolve(args));\n\n return q.promise;\n }\n\n emit<K>(eventName: Key<K, T>, ...args: Args<K, T>): boolean {\n const set = this.#listeners.get(eventName);\n\n if (!set) return false;\n\n set.forEach(fn => {\n try {\n const result = fn(...args);\n\n if (isPromise(result)) {\n result.catch(err => {\n // @ts-expect-error\n this.emit('error' as any, err);\n });\n }\n } catch (err) {\n // @ts-expect-error\n this.emit('error' as any, err);\n }\n });\n\n return true;\n }\n\n on<K>(eventName: Key<K, T>, listener: Listener1<K, T>): this {\n if (!this.#listeners.has(eventName)) {\n this.#listeners.set(eventName, new Set());\n }\n\n const set = this.#listeners.get(eventName)!;\n\n set.add(listener);\n\n return this;\n }\n\n once<K>(eventName: Key<K, T>, listener: Listener1<K, T>): this {\n const wrapped = (...args: any[]) => {\n // @ts-expect-error\n this.off(eventName, wrapped);\n listener(...args);\n };\n\n // @ts-expect-error\n this.on(eventName, wrapped);\n\n return this;\n }\n\n off<K>(eventName: Key<K, T>, listener: Listener1<K, T>): this {\n const set = this.#listeners.get(eventName);\n\n if (set) {\n set.delete(listener);\n\n if (set.size === 0) {\n this.#listeners.delete(eventName);\n }\n }\n\n return this;\n }\n\n removeAllListeners(eventName?: Key<unknown, T>): this {\n if (eventName === undefined) {\n this.#listeners.clear();\n return this;\n }\n\n this.#listeners.delete(eventName);\n\n return this;\n }\n}\n","import { SimpleEventEmitter } from '../SimpleEventEmitter';\n\n/**\n * A basic queue implementation with a limit and event-based synchronization.\n *\n * This class allows you to put items into a queue and retrieve them asynchronously.\n * If the queue exceeds a specified limit, the `put` operation will wait until an item is retrieved,\n * and similarly, the `get` operation will wait if there are no items available in the queue.\n *\n * @example\n * // Create a queue with a limit of 10 items\n * const sendQueue = new Queue<any>(10);\n *\n * // Add items to the queue\n * sendQueue.put({ url: '/api/message.send', params: { text: 'hello' } });\n * sendQueue.put({ url: '/api/message.send', params: { text: 'how are you?' } });\n *\n * // Retrieve and process items from the queue asynchronously\n * while (true) {\n * const req = await sendQueue.get();\n * http.post(req.url, { body: req.params });\n * }\n *\n * @param limit - Optional maximum number of items the queue can hold. If not provided, the queue has no limit.\n *\n * @group Promise\n */\nexport class Queue<T> {\n items: T[] = [];\n #limit?: number;\n #events = new SimpleEventEmitter();\n\n constructor(limit?: number) {\n this.#limit = limit;\n }\n\n async get(): Promise<T> {\n if (this.items.length === 0) {\n await SimpleEventEmitter.once(this.#events, 'put');\n }\n const item = this.items.shift()!;\n this.#events.emit('get');\n return item;\n }\n\n async put(item: T) {\n if (this.#limit && this.items.length >= this.#limit) {\n await SimpleEventEmitter.once(this.#events, 'get');\n }\n this.items.push(item);\n this.#events.emit('put');\n }\n}\n","import { Queue } from '../Queue';\n\n/**\n * An asynchronous queue implementation that can be iterated using an async iterator.\n * It allows items to be added (`put`) and consumed asynchronously, with the ability to signal when the queue is closed.\n * This class supports async iteration, enabling users to process items as they become available, and provides an end signal once the queue is closed.\n *\n * @example\n * const textStream = new AsyncIterableQueue<string>();\n *\n * const readTimer = setInterval(() => {\n * textStream.put('Hey ' + Math.random());\n * }, 100);\n *\n * setTimeout(() => {\n * textStream.close();\n * clearInterval(readTimer);\n * });\n *\n * for await (const text of textStream) {\n * console.log('text part', { text });\n * }\n *\n * @group Promise\n */\nexport class AsyncIterableQueue<T> implements AsyncIterable<T> {\n private _queue: Queue<T | typeof AsyncIterableQueue.QUEUE_END_MARKER>;\n private _closed = false;\n private static readonly QUEUE_END_MARKER = Symbol('QUEUE_END_MARKER');\n\n constructor() {\n this._queue = new Queue<T | typeof AsyncIterableQueue.QUEUE_END_MARKER>();\n }\n\n get closed(): boolean {\n return this._closed;\n }\n\n put(item: T): void {\n if (this._closed) {\n throw new Error('Queue is closed');\n }\n this._queue.put(item);\n }\n\n close(): void {\n if (this._closed) return;\n\n this._closed = true;\n this._queue.put(AsyncIterableQueue.QUEUE_END_MARKER);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: async (): Promise<IteratorResult<T>> => {\n if (this._closed && this._queue.items.length === 0) {\n return { value: undefined, done: true };\n }\n const item = await this._queue.get();\n if (item === AsyncIterableQueue.QUEUE_END_MARKER && this._closed) {\n return { value: undefined, done: true };\n }\n return { value: item as T, done: false };\n },\n };\n }\n}\n","import { nextTickIteration } from '../nextTickIteration';\n\n/**\n * Asynchronously maps over an array, applying the provided callback function to each element,\n * with support for parallel processing of array elements.\n *\n * This function is similar to `arr.map()`, but allows asynchronous operations\n * for each array element, helping to avoid blocking the event loop when processing large arrays.\n * It processes the array elements in batches, providing support for concurrency, meaning multiple\n * elements can be processed in parallel.\n *\n * **Note**: The callback function can return either a value or a `Promise`. If a `Promise` is returned,\n * `asyncMap` will wait for it to resolve before moving on to the next iteration.\n *\n * @param array - The array to iterate over.\n * @param callbackfn - The async callback function to apply to each element.\n * This function takes three parameters:\n * - `value`: The current element of the array.\n * - `index`: The index of the current element in the array.\n * - `array`: The array being processed.\n * The callback should return either a transformed value (`U`) or a `Promise<U>`.\n *\n * @param {Object} [options] - Optional configuration for controlling concurrency.\n * @param {number} [options.concurrency=1] - The number of items to process concurrently. Default is 1 (sequential processing).\n *\n * @returns {Promise<U[]>} A promise that resolves to an array of transformed elements.\n *\n * @example\n * const users = Array.from({ length: 100 }).map((_, idx) => ({\n * id: idx,\n * name: 'User: ' + (idx + 1)\n * }));\n *\n * async function withUserClients() {\n * return await asyncMap(users, async (user) => {\n * const clients = await db.clients.find({ user: user.id });\n *\n * return { ...user, clients };\n * }, { concurrency: 10 });\n * }\n *\n * Promise.all([\n * withUserClients(),\n * otherUsefulTask(),\n * ]).then(console.log);\n *\n * @group Promise\n */\nexport async function asyncMap<T, U>(\n array: T[],\n callbackfn: (value: T, index: number, array: Array<T>) => Promise<U> | U,\n { concurrency = 1 } = {},\n): Promise<Array<U>> {\n let result: U[] = [];\n\n concurrency = Math.max(concurrency, 1);\n\n const cooldown = nextTickIteration(10);\n\n let i = 0;\n\n const handle = (value: T, index: number) => {\n return callbackfn(value, i + index, array);\n };\n\n while (i < array.length) {\n await cooldown();\n\n const batch = await Promise.all(\n array.slice(i, i + concurrency).map(handle),\n );\n\n result = result.concat(batch);\n i += batch.length;\n }\n\n return result;\n}\n","import { catchError } from '@/catchError';\nimport { toError } from '@/toError';\nimport type { AnyFunction } from '@/types';\n\n/**\n * A custom promise that supports cancellation.\n * Allows users to cancel the promise operation before it completes, avoiding unnecessary execution.\n * This class provides a mechanism to perform asynchronous tasks that can be stopped midway by calling the `cancel` method.\n *\n * @example\n * const task = new CancellablePromise<void>(async (resolve, reject, onCancel) => {\n * let cancelled = false;\n * onCancel(() => {\n * cancelled = true; // Define the cancellation logic here\n * });\n *\n * while (!cancelled) {\n * await delay(1000); // Simulate async work\n * console.log('handling task...');\n * }\n * });\n *\n * // Cancel the task after 5 seconds\n * setTimeout(() => task.cancel(), 5000);\n *\n * await task; // This will be cancelled before it completes\n * console.log('Task completed or cancelled');\n *\n * @group Promise\n */\nexport class CancellablePromise<T> implements Promise<T> {\n #promise: Promise<T>;\n #cancelFns: (() => void)[];\n #isCancelled: boolean = false;\n #error: Error | null = null;\n\n constructor(\n executor: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: any) => void,\n onCancel: (cancelFn: () => void) => void,\n ) => void,\n ) {\n this.#cancelFns = [];\n this.#promise = new Promise<T>((resolve, reject) => {\n executor(\n resolve,\n reason => {\n this.#error = toError(reason, 'Unknown rejection reason.');\n reject(reason);\n },\n (fn: AnyFunction) => {\n this.#cancelFns.push(fn);\n },\n );\n });\n }\n\n get [Symbol.toStringTag](): string {\n return (\n this.#promise[Symbol.toStringTag] +\n (this.isCancelled ? ' (Cancelled)' : '')\n );\n }\n\n get isCancelled(): boolean {\n return this.#isCancelled;\n }\n\n get error(): Error | null {\n return this.#error;\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | Promise<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | Promise<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.#promise.then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | Promise<TResult>) | null,\n ): Promise<T | TResult> {\n return this.#promise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.#promise.finally(onfinally);\n }\n\n cancel(): void {\n if (this.#isCancelled) return;\n\n this.#isCancelled = true;\n\n for (const fn of this.#cancelFns) {\n catchError(fn);\n }\n }\n\n static from<T>(promise: Promise<T>): CancellablePromise<T> {\n return new CancellablePromise<T>((resolve, reject) => {\n promise.then(resolve).catch(reject);\n });\n }\n}\n","import type { AnyFunction } from '@/types';\n\ntype NoneToVoidFunction = () => void;\n\nconst FAST_RAF_TIMEOUT_FALLBACK_MS = 300;\n\nconst defaultWindow = (globalThis as any)?.window as Window | undefined;\nconst raf =\n defaultWindow?.requestAnimationFrame ||\n ((cb: AnyFunction) => setTimeout(cb, 0));\n\nlet fastRafCallbacks: Set<NoneToVoidFunction> | undefined;\nlet fastRafFallbackCallbacks: Set<NoneToVoidFunction> | undefined;\nlet fastRafFallbackTimeout: any;\n\n/**\n * Stacks callbacks for `requestAnimationFrame` into a single execution call.\n *\n * This function allows multiple `fastRaf` calls to be batched into a single animation frame callback.\n * The callbacks are executed in the same frame, one after the other. Additionally, if `withTimeoutFallback` is true,\n * the callbacks will be executed after a fallback timeout if `requestAnimationFrame` is not available.\n * If called from within another RAF callback, the execution might be immediate.\n *\n * @example\n * // Callbacks will be executed in the same `requestAnimationFrame` cycle\n * fastRaf(() => console.log(1));\n * fastRaf(() => console.log(2));\n *\n * // Output:\n * // 1\n * // 2\n *\n * @param callback The callback function to be executed in the next `requestAnimationFrame`.\n * @param [withTimeoutFallback=false] Optional flag to execute callbacks after a fallback timeout if `requestAnimationFrame` is not available.\n * @group Promise\n */\nexport function fastRaf(\n callback: NoneToVoidFunction,\n withTimeoutFallback = false,\n) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = new Set([callback]);\n\n raf(() => {\n const currentCallbacks = fastRafCallbacks!;\n\n fastRafCallbacks = undefined;\n fastRafFallbackCallbacks = undefined;\n\n if (fastRafFallbackTimeout) {\n clearTimeout(fastRafFallbackTimeout);\n fastRafFallbackTimeout = undefined;\n }\n\n currentCallbacks.forEach(cb => cb());\n });\n } else {\n fastRafCallbacks.add(callback);\n }\n\n if (withTimeoutFallback) {\n if (!fastRafFallbackCallbacks) {\n fastRafFallbackCallbacks = new Set([callback]);\n } else {\n fastRafFallbackCallbacks.add(callback);\n }\n\n if (!fastRafFallbackTimeout) {\n fastRafFallbackTimeout = setTimeout(() => {\n const currentTimeoutCallbacks = fastRafFallbackCallbacks!;\n\n if (fastRafCallbacks) {\n currentTimeoutCallbacks.forEach(\n fastRafCallbacks.delete,\n fastRafCallbacks,\n );\n }\n fastRafFallbackCallbacks = undefined;\n\n if (fastRafFallbackTimeout) {\n clearTimeout(fastRafFallbackTimeout);\n fastRafFallbackTimeout = undefined;\n }\n\n currentTimeoutCallbacks.forEach(cb => cb());\n }, FAST_RAF_TIMEOUT_FALLBACK_MS);\n }\n }\n}\n\nexport function rafPromise() {\n return new Promise<void>(resolve => {\n fastRaf(resolve);\n });\n}\n","import { AppError } from '@/errors/AppError';\nimport { isFunction, isPromise } from '@/is';\nimport type { Awaitable } from '@/types';\n\n/**\n * Throws an error if the provided promise or callback is not resolved within the specified timeout period.\n *\n * This function can be used to ensure that an asynchronous operation does not take too long to complete.\n * If the operation exceeds the specified time limit, the provided `timeoutError` is thrown.\n *\n * @example\n * // Example usage: Throw an error if no response is received within 1 second\n * await timeout(\n * 1000, // Timeout duration in milliseconds\n * (signal) => {\n * const account = await http.get('/api/users/me');\n *\n * if (signal.aborted) return; // If the timeout occurs, abort the operation\n *\n * const statistics = await http.get('/api/users/me/statistics');\n *\n * return { ...account, statistics };\n * },\n * new Error('Request account timeout') // Custom error to throw on timeout\n * );\n *\n * @param ms - The maximum time (in milliseconds) to wait for the promise or callback to resolve.\n * @param promiseOrCallback - The asynchronous operation to execute. This can either be:\n * - A `Promise` that will be awaited until completion, or\n * - A function that takes an `AbortSignal` and returns a `Promise` or a value.\n * @param timeoutError - The error that will be thrown if the timeout is reached before the promise or callback resolves.\n * (Defaults to `AppError(408)` if not provided).\n * @returns A `Promise` that resolves with the result of the provided `promiseOrCallback`, or rejects with the `timeoutError` if the timeout occurs.\n *\n * @throws {Error} - Throws the `timeoutError` if the operation exceeds the specified timeout.\n *\n * @group Promise\n */\nexport function timeout<T = any>(\n ms: number,\n promiseOrCallback: Promise<T> | ((abortSignal: AbortSignal) => Awaitable<T>),\n timeoutError: any = new AppError(408),\n): Promise<T> {\n const abortController = new AbortController();\n\n let taskResult: any;\n\n if (isFunction(promiseOrCallback)) {\n taskResult = promiseOrCallback(abortController.signal);\n } else if (isPromise(promiseOrCallback)) {\n taskResult = promiseOrCallback;\n } else {\n throw new TypeError(\n 'Expected promise or callback as second argument, received: ' +\n String(promiseOrCallback),\n );\n }\n\n if (!isPromise(taskResult)) {\n return Promise.resolve(taskResult);\n }\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n return Promise.race([\n taskResult,\n new Promise((_, reject) => {\n timer = setTimeout(() => {\n abortController.abort();\n reject(timeoutError);\n }, ms);\n }),\n ]).finally(() => {\n timer && clearTimeout(timer);\n timer = undefined;\n }) as Promise<T>;\n}\n","/**\n * Converts the first character of string to upper case and the remaining to lower case.\n *\n * @template T - Literal type of the string.\n * @param {T} str - The string to be converted to uppercase.\n * @returns {Capitalize<T>} - The capitalized string.\n *\n * @example\n * const result = capitalize('fred') // returns 'Fred'\n * const result2 = capitalize('FRED') // returns 'Fred'\n *\n * @group Strings\n */\n\nexport function capitalize<T extends string>(str: T): Capitalize<T> {\n return (str.charAt(0).toUpperCase() +\n str.slice(1).toLowerCase()) as Capitalize<T>;\n}\n\ntype Capitalize<T extends string> = T extends `${infer F}${infer R}`\n ? `${Uppercase<F>}${Lowercase<R>}`\n : T;\n","import { isString } from '@/is';\n\n/**\n * Regular expression pattern to split strings into words for various case conversions\n *\n * This pattern matches sequences of characters in a string, considering the following cases:\n * - Sequences of two or more uppercase letters followed by an uppercase letter and lowercase letters or digits (for acronyms)\n * - Sequences of one uppercase letter optionally followed by lowercase letters and digits\n * - Single uppercase letters\n * - Sequences of digits\n * - Emojis and other Unicode characters\n *\n * The resulting match can be used to convert camelCase, snake_case, kebab-case, and other mixed formats into\n * a consistent format like snake case. It also supports emojis and other Unicode characters.\n *\n * @example\n * const matches = 'camelCaseHTTPRequest🚀'.match(CASE_SPLIT_PATTERN);\n * // matches: ['camel', 'Case', 'HTTP', 'Request', '🚀']\n *\n * @group Strings\n */\nconst CASE_SPLIT_PATTERN =\n /\\p{Lu}?\\p{Ll}+|[0-9]+|\\p{Lu}+(?!\\p{Ll})|\\p{Emoji_Presentation}|\\p{Extended_Pictographic}|\\p{L}+/gu;\n\nexport function getWords(str?: string): string[] {\n if (!isString(str)) return [];\n return Array.from(str.match(CASE_SPLIT_PATTERN) ?? []);\n}\n","import { capitalize } from '../capitalize';\nimport { getWords } from '../getWords';\n\n/**\n * Converts a string to camel case.\n *\n * Camel case is the naming convention in which the first word is written in lowercase and\n * each subsequent word begins with a capital letter, concatenated without any separator characters.\n *\n * @param {string} str - The string that is to be changed to camel case.\n * @returns {string} - The converted string to camel case.\n *\n * @example\n * const convertedStr1 = camelCase('camelCase') // returns 'camelCase'\n * const convertedStr2 = camelCase('some whitespace') // returns 'someWhitespace'\n * const convertedStr3 = camelCase('hyphen-text') // returns 'hyphenText'\n * const convertedStr4 = camelCase('HTTPRequest') // returns 'httpRequest'\n * const convertedStr5 = camelCase('Keep unicode 😅') // returns 'keepUnicode😅'\n *\n * @group Strings\n */\nexport function camelCase(str: string): string {\n const words = getWords(str);\n\n if (words.length === 0) {\n return '';\n }\n\n const [first, ...rest] = words;\n\n return `${first.toLowerCase()}${rest.map(word => capitalize(word)).join('')}`;\n}\n","/**\n * Converts a value to a string and appends a specified unit to it.\n * If the value is already a string, it returns it as is, and if the value is a number,\n * it appends the specified unit (defaults to 'px'). If the value is null, undefined, or an empty string, it returns `undefined`.\n *\n * @example\n * // Adding 'px' unit to a number\n * convertToUnit(10, 'px'); // '10px';\n *\n * // Adding 'em' unit to a number\n * convertToUnit(5, 'em'); // '5em';\n *\n * // Returning a string as is if it's not a number\n * convertToUnit('100%', 'px'); // '100%';\n *\n * // Handling null, undefined, and empty string\n * convertToUnit(null); // undefined;\n * convertToUnit(''); // undefined;\n *\n * @param str - The value to convert, can be a number, string, null, or undefined.\n * @param unit - The unit to append to the value. Defaults to 'px'.\n * @returns The value with the unit appended, or `undefined` if the input is null, undefined, or an empty string.\n *\n * @group Strings\n */\nexport function convertToUnit(\n str: string | number | null | undefined,\n unit = 'px',\n): string | undefined {\n if (str == null || str === '') {\n return undefined;\n } else if (isNaN(+str!)) {\n return String(str);\n } else {\n return `${Number(str)}${unit}`;\n }\n}\n","const htmlEscapes: Record<number, string> = Object.freeze({\n 38: '&', // &\n 60: '<', // <\n 62: '>', // >\n 34: '"', // \"\n 39: ''', // '\n});\n\n/**\n * Sanitizes a string by escaping HTML syntax to prevent XSS (Cross-site scripting) attacks.\n * Converts special HTML characters like `<`, `>`, `&`, etc., into their corresponding HTML entities.\n *\n * @example\n * // Escaping HTML tags to prevent HTML injection\n * escapeHtml('<b>Strong</b> man.'); // '<b>Strong</b> man.'\n *\n * // Escaping other HTML special characters\n * escapeHtml('<script>alert(\"XSS\")</script>'); // '<script>alert("XSS")</script>'\n *\n * @param unsafe - The string to be sanitized (escaped).\n * @returns A sanitized string with HTML special characters replaced by their corresponding HTML entities.\n *\n * @group Strings\n */\nexport function escapeHtml(unsafe: string) {\n if (typeof unsafe !== 'string') {\n return '';\n }\n\n let result = '';\n let strLen = unsafe.length;\n let char: number;\n\n for (let idx = 0; idx < strLen; idx++) {\n char = unsafe.charCodeAt(idx);\n result += htmlEscapes[char] || String.fromCharCode(char);\n }\n\n return result;\n}\n","/**\n * Sanitizes a string by removing all non-numeric characters, leaving only digits.\n * Useful for extracting numeric values from strings, such as when you want to\n * extract a number from a string containing units or other non-numeric text.\n *\n * @example\n * // Extracts numeric values from a string with units\n * escapeNumeric('use 320px'); // '320'\n *\n * // Strips out non-numeric characters from a string\n * escapeNumeric('USD 1,000.50'); // '100050'\n *\n * // Returns undefined if no numeric characters are found\n * escapeNumeric('No numbers here!'); // undefined\n *\n * @param str - The input string to be sanitized.\n * @returns A string containing only the numeric characters, or `undefined` if no numbers are found.\n *\n * @group Strings\n */\nexport function escapeNumeric(str: string) {\n const result = String(str).replace(/\\D/g, '');\n\n if (!result.length) {\n return undefined;\n }\n\n return result;\n}\n","/**\n * Escapes special characters in a string to safely use it as a literal pattern in a regular expression.\n * This function ensures that any characters that would otherwise have a special meaning in a regex\n * (such as `*`, `+`, `?`, etc.) are properly escaped, allowing them to be used as normal characters\n * in the pattern.\n *\n * @example\n * // Escapes special characters in the string '[a|b]'\n * escapeRegExp('[a|b]'); // '\\\\[a\\\\|b\\\\]'\n *\n * @example\n * // Use the function to safely create a regex from user input\n * const searchTerms = 'Andrew L.';\n * const searchReg = new RegExp(escapeRegExp(searchTerms), 'i');\n * const searchResult = users.find(v => searchReg.test(v.name));\n *\n * @param str - The string to escape for use in a regular expression.\n * @returns The input string with all special regex characters escaped.\n *\n * @group Strings\n */\nexport function escapeRegExp(str: string) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version f8312f3 12.03.2022\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji: string) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0\n ? rawEmoji.replace(vs16RegExp, '')\n : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n\nexport default /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f|\\u2696\\ufe0f|\\u2708\\ufe0f|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)((?:\\ud83c[\\udffb-\\udfff]|\\ufe0f)\\u200d[\\u2640\\u2642]\\ufe0f)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f\\u200d\\u26a7\\ufe0f|\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f|\\u2764\\ufe0f\\u200d\\ud83d\\udd25|\\u2764\\ufe0f\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f|\\ud83e\\uddde\\u200d\\u2640\\ufe0f|\\ud83e\\uddde\\u200d\\u2642\\ufe0f|\\ud83e\\udddf\\u200d\\u2640\\ufe0f|\\ud83e\\udddf\\u200d\\u2642\\ufe0f|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import { TWEMOJI_REGEX } from '../twemojiRegex';\n\n/**\n * Checks if the provided text is a single emoji.\n * The function uses a regular expression to match the emoji and ensures that the entire string is a valid single emoji.\n *\n * @param {unknown} text - The input value to check.\n * @returns {boolean} - Returns `true` if the input is a single emoji, otherwise `false`.\n *\n * @example\n * isOneEmoji(\"😊\"); // Returns: true\n * isOneEmoji(\"Hello 😊\"); // Returns: false\n * isOneEmoji(\"😎\"); // Returns: true\n * isOneEmoji(\"👨👩👧👦\"); // Returns: true (family emoji with multiple characters)\n * isOneEmoji(\"not an emoji\"); // Returns: false\n *\n * @group Strings\n */\nexport function isOneEmoji(text: unknown): text is string {\n return !!(\n typeof text === 'string' &&\n text &&\n (text.match(TWEMOJI_REGEX) || [])[0]?.length === text.length\n );\n}\n","import { isString } from '@/is';\nimport { isOneEmoji } from '../isOneEmoji';\n\nconst IGNORED_TITLES = Object.freeze(\n new Set([\n 'dr.',\n 'mr.',\n 'mrs.',\n 'miss',\n 'ms.',\n 'prof.',\n 'sir',\n 'rev.',\n 'hon.',\n ]),\n);\n\n/**\n * Extracts the initials from a full name while ignoring titles or prefixes (e.g., Dr., Mr., Mrs.),\n * as well as any words starting with special characters (e.g., !, @, #).\n * Handles names with multiple words, ignores special characters, and ensures proper handling of Unicode characters.\n *\n * @param {string} fullName - The full name from which to extract initials.\n * @returns {string} - The extracted initials in uppercase, or an empty string if the input is invalid.\n *\n * @example\n * getInitials(\"John Doe\");\n * // Returns: \"JD\"\n *\n * @example\n * getInitials(\"Dr. Alice Wonderland\");\n * // Returns: \"AW\"\n *\n * @example\n * getInitials(\"José María de la Cruz\");\n * // Returns: \"JC\"\n *\n * @example\n * getInitials(\"Mr. Albert Einstein\");\n * // Returns: \"AE\"\n *\n * @example\n * getInitials(\"Invalid Name\");\n * // Returns: \"IN\"\n *\n * @example\n * getInitials(\"\");\n * // Returns: \"\"\n *\n * @group Strings\n */\nexport function getInitials(fullName: string) {\n if (!isString(fullName)) return '';\n\n let [first, ...rest] = fullName\n .replace(/\\s{2,}/g, ' ')\n .replace(/[,+/#!$@%^&*;:{}=\\-_`~()]/g, '')\n .trim()\n .split(' ')\n .filter(word => !IGNORED_TITLES.has(word.toLowerCase()))\n .map(v => v.replaceAll('.', '').trim())\n .filter(Boolean);\n\n let last = rest[rest.length - 1];\n\n if (rest.length > 1) {\n if (isOneEmoji(first)) {\n first = rest[0];\n } else if (isOneEmoji(last)) {\n last = rest[0];\n }\n }\n\n return [first, last]\n .filter(Boolean)\n .map((letter = '') => [...letter.toUpperCase()][0]) // We use the spread operator to support Unicode characters\n .join('');\n}\n","const byteToHex: string[] = [];\n\nfor (let n = 0; n <= 0xff; ++n) {\n const hexOctet = n.toString(16).padStart(2, '0');\n byteToHex.push(hexOctet);\n}\n\n/**\n * Encodes a `Uint8Array` or a number array into a hexadecimal string.\n * Each byte of the array is converted to its corresponding two-character hex representation.\n *\n * This function is useful when you need to represent binary data as a string of hexadecimal characters.\n *\n * @example\n * console.log(hex(new Uint8Array([255]))); // 'ff'\n * console.log(hex([255, 0, 128])); // 'ff0080'\n *\n * @param value - The array to be converted, either a `Uint8Array` or a number array.\n * @returns A string of hexadecimal characters representing the array's byte values.\n *\n * @group Strings\n */\nexport function hex(value: Uint8Array | number[]) {\n const buff = Array.isArray(value) ? new Uint8Array(value) : value;\n const hexOctets = new Array(buff.length);\n\n for (let i = 0; i < buff.length; ++i) {\n hexOctets[i] = byteToHex[buff[i]];\n }\n\n return hexOctets.join('');\n}\n","/**\n * Converts a two-letter ISO country code (e.g., 'US') to the corresponding flag emoji.\n * If the input is not a valid two-letter country code, it returns the original string.\n *\n * @param {string} iso - The two-letter ISO country code.\n * @returns {string} - The corresponding country flag emoji or the original input if it's invalid.\n *\n * @example\n * isoToFlagEmoji(\"US\"); // Returns: 🇺🇸\n * isoToFlagEmoji(\"GB\"); // Returns: 🇬🇧\n * isoToFlagEmoji(\"DE\"); // Returns: 🇩🇪\n * isoToFlagEmoji(\"xyz\"); // Returns: \"xyz\" (invalid code)\n *\n * @group Strings\n */\nexport function isoToFlagEmoji(iso: string) {\n const code = iso.toUpperCase();\n\n if (!/^[A-Z]{2}$/.test(code)) return iso;\n const codePoints = [...code].map(c => c.codePointAt(0)! + 127397);\n return String.fromCodePoint(...codePoints);\n}\n","import { getWords } from '../getWords';\n\n/**\n * Converts a string to kebab case.\n *\n * Kebab case is the naming convention in which each word is written in lowercase and separated by a dash (-) character.\n *\n * @param {string} str - The string that is to be changed to kebab case.\n * @returns {string} - The converted string to kebab case.\n *\n * @example\n * const convertedStr1 = kebabCase('camelCase') // returns 'camel-case'\n * const convertedStr2 = kebabCase('some whitespace') // returns 'some-whitespace'\n * const convertedStr3 = kebabCase('hyphen-text') // returns 'hyphen-text'\n * const convertedStr4 = kebabCase('HTTPRequest') // returns 'http-request'\n *\n * @group Strings\n */\nexport function kebabCase(str: string): string {\n const words = getWords(str);\n return words.map(word => word.toLowerCase()).join('-');\n}\n","import { getWords } from '../getWords';\n\n/**\n * Converts a string to lower case.\n *\n * Lower case is the naming convention in which each word is written in lowercase and separated by an space ( ) character.\n *\n * @param {string} str - The string that is to be changed to lower case.\n * @returns {string} - The converted string to lower case.\n *\n * @example\n * const convertedStr1 = lowerCase('camelCase') // returns 'camel case'\n * const convertedStr2 = lowerCase('some whitespace') // returns 'some whitespace'\n * const convertedStr3 = lowerCase('hyphen-text') // returns 'hyphen text'\n * const convertedStr4 = lowerCase('HTTPRequest') // returns 'http request'\n *\n * @group Strings\n */\nexport const lowerCase = (str?: string): string => {\n return getWords(str)\n .map(word => word.toLowerCase())\n .join(' ');\n};\n","import { getWords } from '../getWords';\n\n/**\n * Masks the middle characters of each word in the given string, leaving the first and last characters intact.\n * The characters in the middle of each word are replaced by a specified masking character (default is `*`).\n *\n * ⚠️ If the provided value is not a valid string, the function returns an empty string.\n *\n * **Note**: This function does not perform any validation or checks for non-alphabetic characters within words.\n * It simply masks all characters between the first and last character of each word.\n *\n * @param {string} value - The input string containing words to be masked.\n * @param {string} [withChar='*'] - The character used to replace the middle characters of each word. Default is `*`.\n *\n * @returns {string} The input string with middle characters of words masked, or an empty string if the input is invalid.\n *\n * @example\n * maskingWords('hello world'); // 'h**o w**d'\n * maskingWords('John Doe'); // 'J**n D**e'\n * maskingWords('a b c'); // '* * *'\n *\n * @group Strings\n */\nexport function maskingWords(value: string, withChar = '*'): string {\n return getWords(value)\n .map(word => {\n const len = word.length;\n\n if (len < 2) {\n return ''.padEnd(len, withChar);\n } else if (len < 3) {\n return word[0].padEnd(len, withChar);\n } else {\n return word[0].padEnd(len - 2, withChar) + word.at(-1);\n }\n })\n .join(' ');\n}\n","import { isString } from '@/is';\nimport { maskingWords } from '../maskingWords';\n\n/**\n * Masks part of the email address to provide a simple level of privacy.\n * The username part is partially masked with asterisks, while the domain remains intact.\n *\n * ⚠️ Returns an empty string if the provided value is invalid.\n *\n * @example\n * maskingEmail('andrew@gmail.com'); // 'a****w@gmail.com'\n * maskingEmail('user@domain.com'); // 'u***r@domain.com'\n * maskingEmail('invalidemail'); // ''\n *\n * @param value - The email address to be masked.\n * @returns The masked email address or an empty string if the value is invalid.\n *\n * @group Strings\n */\nexport function maskingEmail(value: string): string {\n if (!isString(value)) return '';\n\n const [username, host] = value.split('@', 2);\n\n if (!username || !host) return '';\n\n return `${maskingWords(username)}@${host}`;\n}\n","import { isString } from '@/is';\n\n/**\n * Masks part of a phone number to provide a simple level of privacy.\n * The function replaces digits in a specified range with a given character.\n * Supports formatted phone numbers (e.g., `(000) 000-11-11`).\n *\n * ⚠️ Returns an empty string if the provided value is invalid.\n *\n * @example\n * maskingPhone('+18000551100'); // '+18XXXXX1100'\n * maskingPhone('+18000551100', 2, 4, '*'); // '+18*****1100'\n * maskingPhone('+1 800-055-1100'); // '+1 8XX-XXX-1100'\n * maskingPhone('+1234567890', 3, 5, 'X'); // '+1XXX567890'\n *\n * @param value - The phone number to be masked.\n * @param [fromPosition=2] - The starting position from left side where masking begins (default is 2).\n * @param [toPosition=4] - The position from right side where masking ends (default is 4).\n * @param [withChar='X'] - The character used to replace digits (default is 'X').\n * @returns The masked phone number or an empty string if the value is invalid.\n *\n * @group Strings\n */\nexport function maskingPhone(\n value: string,\n fromPosition = 2,\n toPosition = 4,\n withChar = 'X',\n): string {\n if (!isString(value)) return '';\n\n const numbersAmount = value.replace(/\\D/g, '').length;\n const fromIdx = fromPosition - 1;\n\n let toIdx = numbersAmount - toPosition;\n\n if (toIdx <= 0) {\n toIdx = numbersAmount;\n }\n\n let i = -1;\n\n return value.replace(/\\d/g, char => {\n i++;\n return i > fromIdx && i < toIdx ? withChar : char;\n });\n}\n","import { timestamp } from '@/date/timestamp';\nimport { hex } from '../hex';\n\nlet index = Math.floor(Math.random() * 0xffffff);\n\nconst buffer = new Uint8Array(12);\n\n/**\n * Useful when you need to generate almost secure object id in browser\n *\n * Based on [bson](https://github.com/mongodb/js-bson/blob/main/src/objectid.ts)\n *\n * @example\n * const userId = objectId(); // '67350af7885ba34010c83859'\n *\n * @group Strings\n */\nexport function objectId(fromValue: number | Date = Date.now()): string {\n const value = timestamp(fromValue);\n const inc = getInc();\n\n buffer[0] = value >> 24;\n buffer[1] = value >> 16;\n buffer[2] = value >> 8;\n buffer[3] = value;\n\n buffer[4] = Math.floor(Math.random() * 256);\n buffer[5] = Math.floor(Math.random() * 256);\n buffer[6] = Math.floor(Math.random() * 256);\n buffer[7] = Math.floor(Math.random() * 256);\n buffer[8] = Math.floor(Math.random() * 256);\n\n buffer[11] = inc & 0xff;\n buffer[10] = (inc >> 8) & 0xff;\n buffer[9] = (inc >> 16) & 0xff;\n\n return hex(buffer);\n}\n\nfunction getInc(): number {\n return (index = (index + 1) % 0xffffff);\n}\n","import { getWords } from '../getWords';\n\n/**\n * Converts a string to snake case.\n *\n * Snake case is the naming convention in which each word is written in lowercase and separated by an underscore (_) character.\n *\n * @param {string} str - The string that is to be changed to snake case.\n * @returns {string} - The converted string to snake case.\n *\n * @example\n * const convertedStr1 = snakeCase('camelCase') // returns 'camel_case'\n * const convertedStr2 = snakeCase('some whitespace') // returns 'some_whitespace'\n * const convertedStr3 = snakeCase('hyphen-text') // returns 'hyphen_text'\n * const convertedStr4 = snakeCase('HTTPRequest') // returns 'http_request'\n *\n * @group Strings\n */\nexport const snakeCase = (str?: string): string => {\n return getWords(str)\n .map(word => word.toLowerCase())\n .join('_');\n};\n","import { capitalize } from '../capitalize';\nimport { getWords } from '../getWords';\n\n/**\n * Converts the first character of each word in a string to uppercase and the remaining characters to lowercase.\n *\n * Start case is the naming convention in which each word is written with an initial capital letter.\n * @param {string} str - The string to convert.\n * @returns {string} The converted string.\n *\n * @example\n * const result1 = startCase('hello world'); // result will be 'Hello World'\n * const result2 = startCase('HELLO WORLD'); // result will be 'Hello World'\n * const result3 = startCase('hello-world'); // result will be 'Hello World'\n * const result4 = startCase('hello_world'); // result will be 'Hello World'\n *\n * @group Strings\n */\nexport const startCase = (value?: string): string => {\n return getWords(value).map(capitalize).join(' ');\n};\n","const DEF_STR_ASSIGN_REGEXP = /\\{{([A-z-_. ]*)\\}}/g;\nconst DEF_STR_ASSIGN_METHOD = (obj: any, key: string) => obj[key];\n\n/**\n * Replaces placeholders in the input string with values from the provided object.\n * The placeholders are denoted by `{{ key }}` syntax, where `key` is a property name in the object.\n * The function optionally allows a custom method to handle how the values are retrieved from the object.\n *\n * @param {string} str - The string with placeholders to be replaced. Placeholders are in the form of `{{key}}`.\n * @param {T} obj - The object whose properties will be used to replace the placeholders in the string.\n * @param method - An optional custom method\n * to retrieve values from the object. The default method retrieves\n * the values by accessing the object property directly using the `key`.\n *\n * @returns {string} The string with placeholders replaced by the corresponding values from the object.\n *\n * @example\n * const context = { name: 'Andrew', age: 30 };\n * console.log(strAssign('Hey {{ name }}! You are {{ age }} years old.', context));\n * // Output: 'Hey Andrew! You are 30 years old.'\n *\n * @example\n * // Using a custom method\n * const context2 = { firstName: 'Andrew', lastName: 'L.' };\n * const customMethod = (obj, key) => {\n * if (key === 'name') {\n * return obj.firstName + ' ' + obj.lastName;\n * }\n * return obj[key];\n * };\n * console.log(strAssign('Hello {{ name }}!', context2, customMethod));\n * // Output: 'Hello Andrew L.!'\n *\n * @group Strings\n */\nexport function strAssign<T extends object>(\n str: string,\n obj: T,\n method: (obj: T, key: string) => any = DEF_STR_ASSIGN_METHOD,\n): string {\n return str.replace(DEF_STR_ASSIGN_REGEXP, (match, p1) => {\n const key = p1.trim();\n const value = method(obj, key);\n\n if (value === undefined || value === null) {\n return match;\n }\n\n return value;\n });\n}\n","/**\n * Truncates a string to the specified maximum length while preserving whole words\n * and appends ellipsis (`...`) if the string exceeds the maximum length.\n * Ensures that truncation does not occur if the difference is insignificant\n * (less than 5% of the original string length).\n *\n * @param {string} str - The input string to truncate.\n * @param {number} maxLength - The maximum allowed length for the string.\n * @param {number} insignificantThreshold - The insignificance threshold as a fraction of the original string length (default is 5%)\n * @returns {string} - The truncated string with ellipsis if applicable.\n *\n *\n * @example\n * // Basic truncation\n * truncate(\"This is a test string for truncation.\", 20);\n * // Returns: \"This is a test...\"\n *\n * @example\n * // No truncation needed as the string length is within the limit\n * truncate(\"Short string\", 20);\n * // Returns: \"Short string\"\n *\n * @example\n * // No truncation because the difference is insignificant\n * truncate(\"This string has an insignificant truncation.\", 40);\n * // Returns: \"This string has an insignificant truncation.\"\n *\n * @example\n * // Handles strings with no spaces gracefully\n * truncate(\"ThisStringHasNoSpacesButIsVeryLong\", 10);\n * // Returns: \"ThisString...\"\n *\n * @group Strings\n */\nexport function truncate(\n value: string,\n maxLength: number = 120,\n insignificantThreshold: number = 0.05,\n): string {\n if (!shouldTruncate(value, maxLength, insignificantThreshold)) {\n return value;\n }\n\n let truncated = value.slice(0, maxLength).trim();\n const lastSpace = truncated.lastIndexOf(' ');\n\n if (lastSpace > 0) {\n truncated = truncated.slice(0, lastSpace);\n }\n\n return `${truncated}...`;\n}\n\nfunction shouldTruncate(\n text: string,\n maxLength: number,\n insignificantThreshold: number,\n) {\n return text.length - maxLength > maxLength * insignificantThreshold;\n}\n","/**\n * Truncates the input string to the specified maximum length and appends an ellipsis (`...`)\n * if the string exceeds the maximum length. If the string is shorter than or equal to the\n * maximum length, it is returned unchanged.\n *\n * Unlike the `truncate` function, the result can be truncated in the middle of a word\n *\n * @param {string} value - The input string to truncate.\n * @param {number} maxLength - The maximum allowed length for the string (default is 30).\n * @returns {string} - The truncated string with ellipsis (`...`) if necessary.\n *\n * @example\n * wrapText(\"This is a long string\", 10); // Returns: \"This is a...\"\n * wrapText(\"Short text\", 20); // Returns: \"Short text\"\n * wrapText(\"Another long string example\", 15); // Returns: \"Another long...\"\n *\n * @group Strings\n */\nexport function wrapText(value: string, maxLength: number = 30) {\n if (value.length > maxLength) {\n return value.slice(0, maxLength) + '...';\n }\n\n return value;\n}\n"],"names":["result","keyBy","_get","toError","number","assert.ok","pointer","assert.number","_cloneDeep","_cloneDeepWith","value","_defaultsDeep","_set","_unset","onError","parseValue","defaultWindow","assert.notEmptyString"],"mappings":"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AAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,QAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,QAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,QAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,SAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;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"}
|