moderndash 0.13.1 → 0.14.0
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/README.md +10 -3
- package/dist/index.cjs +11 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -12
- package/dist/index.js +11 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -56,6 +56,13 @@ arr.filter(Boolean)
|
|
|
56
56
|
npm install moderndash
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
-
##
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
## FAQ
|
|
60
|
+
|
|
61
|
+
### Why is X lodash function not included?
|
|
62
|
+
Please refer to [You-Dont-Need-Lodash](https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore) or [youmightnotneed.com/lodash](https://youmightnotneed.com/lodash) for native replacements.
|
|
63
|
+
If you still believe a function is missing, please open an issue.
|
|
64
|
+
|
|
65
|
+
### Why no pipe utility functions?
|
|
66
|
+
The upcoming [pipe operator](https://github.com/tc39/proposal-pipeline-operator) in JavaScript will provide function composition, so the framework focuses on providing other useful utility functions that are not yet available.
|
|
67
|
+
|
|
68
|
+
The pipeline operator can already be included via [babel](https://babeljs.io/docs/en/babel-plugin-proposal-pipeline-operator).
|
package/dist/index.cjs
CHANGED
|
@@ -63,7 +63,6 @@ __export(src_exports, {
|
|
|
63
63
|
sleep: () => sleep,
|
|
64
64
|
snakeCase: () => snakeCase,
|
|
65
65
|
sort: () => sort,
|
|
66
|
-
stripSpecial: () => stripSpecial,
|
|
67
66
|
sum: () => sum,
|
|
68
67
|
takeRightWhile: () => takeRightWhile,
|
|
69
68
|
takeWhile: () => takeWhile,
|
|
@@ -643,14 +642,8 @@ function timeout(promise, timeout2) {
|
|
|
643
642
|
});
|
|
644
643
|
}
|
|
645
644
|
|
|
646
|
-
// src/string/
|
|
647
|
-
function deburr(str) {
|
|
648
|
-
return str.replace(/[^\u0000-\u007E]/g, (chr) => chr.normalize("NFD").replace(/[\u0300-\u036F]/g, ""));
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
// src/helpers/stringModifiers.ts
|
|
645
|
+
// src/string/splitWords.ts
|
|
652
646
|
function splitWords(str) {
|
|
653
|
-
str = deburr(str);
|
|
654
647
|
const regex = new RegExp(
|
|
655
648
|
"[^\\dA-Za-z]|(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])"
|
|
656
649
|
// lookahead for an uppercase letter followed by a lowercase letter
|
|
@@ -658,8 +651,14 @@ function splitWords(str) {
|
|
|
658
651
|
return str.split(regex).filter(Boolean);
|
|
659
652
|
}
|
|
660
653
|
|
|
654
|
+
// src/string/deburr.ts
|
|
655
|
+
function deburr(str) {
|
|
656
|
+
return str.replace(/[^\u0000-\u007E]/g, (chr) => chr.normalize("NFD").replace(/[\u0300-\u036F]/g, ""));
|
|
657
|
+
}
|
|
658
|
+
|
|
661
659
|
// src/string/camelCase.ts
|
|
662
660
|
function camelCase(str) {
|
|
661
|
+
str = deburr(str);
|
|
663
662
|
const words = splitWords(str);
|
|
664
663
|
const camelCase2 = words.map((word, index) => {
|
|
665
664
|
if (index === 0) {
|
|
@@ -694,6 +693,7 @@ function escapeRegExp(str) {
|
|
|
694
693
|
|
|
695
694
|
// src/string/kebabCase.ts
|
|
696
695
|
function kebabCase(str) {
|
|
696
|
+
str = deburr(str);
|
|
697
697
|
const words = splitWords(str);
|
|
698
698
|
let kebabCase2 = "";
|
|
699
699
|
for (const word of words) {
|
|
@@ -704,6 +704,7 @@ function kebabCase(str) {
|
|
|
704
704
|
|
|
705
705
|
// src/string/pascalCase.ts
|
|
706
706
|
function pascalCase(str) {
|
|
707
|
+
str = deburr(str);
|
|
707
708
|
const words = splitWords(str);
|
|
708
709
|
let pascalCase2 = "";
|
|
709
710
|
for (const word of words) {
|
|
@@ -714,6 +715,7 @@ function pascalCase(str) {
|
|
|
714
715
|
|
|
715
716
|
// src/string/snakeCase.ts
|
|
716
717
|
function snakeCase(str) {
|
|
718
|
+
str = deburr(str);
|
|
717
719
|
const words = splitWords(str);
|
|
718
720
|
let snakeCase2 = "";
|
|
719
721
|
for (const word of words) {
|
|
@@ -725,14 +727,9 @@ function snakeCase(str) {
|
|
|
725
727
|
return snakeCase2;
|
|
726
728
|
}
|
|
727
729
|
|
|
728
|
-
// src/string/stripSpecial.ts
|
|
729
|
-
function stripSpecial(str) {
|
|
730
|
-
str = deburr(str);
|
|
731
|
-
return str.replace(/[^\s\w]/gi, "");
|
|
732
|
-
}
|
|
733
|
-
|
|
734
730
|
// src/string/titleCase.ts
|
|
735
731
|
function titleCase(str) {
|
|
732
|
+
str = deburr(str);
|
|
736
733
|
const words = splitWords(str);
|
|
737
734
|
let titleCase2 = "";
|
|
738
735
|
for (const word of words) {
|
|
@@ -824,7 +821,6 @@ function isUrl(str) {
|
|
|
824
821
|
sleep,
|
|
825
822
|
snakeCase,
|
|
826
823
|
sort,
|
|
827
|
-
stripSpecial,
|
|
828
824
|
sum,
|
|
829
825
|
takeRightWhile,
|
|
830
826
|
takeWhile,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/array/chunk.ts","../src/array/count.ts","../src/validate/isPlainObject.ts","../src/validate/isEqual.ts","../src/array/difference.ts","../src/array/dropRightWhile.ts","../src/array/dropWhile.ts","../src/array/group.ts","../src/array/intersection.ts","../src/array/sample.ts","../src/array/shuffle.ts","../src/array/sort.ts","../src/array/takeRightWhile.ts","../src/array/takeWhile.ts","../src/array/unique.ts","../src/decorator/toDecorator.ts","../src/function/debounce.ts","../src/decorator/decDebounce.ts","../src/function/maxCalls.ts","../src/decorator/decMaxCalls.ts","../src/function/memoize.ts","../src/decorator/decMemoize.ts","../src/function/minCalls.ts","../src/decorator/decMinCalls.ts","../src/function/throttle.ts","../src/decorator/decThrottle.ts","../src/function/times.ts","../src/number/sum.ts","../src/number/average.ts","../src/number/median.ts","../src/number/randomFloat.ts","../src/number/randomInt.ts","../src/object/merge.ts","../src/object/pick.ts","../src/object/omit.ts","../src/object/set.ts","../src/promise/queue.ts","../src/promise/races.ts","../src/promise/sleep.ts","../src/promise/retry.ts","../src/promise/timeout.ts","../src/string/deburr.ts","../src/helpers/stringModifiers.ts","../src/string/camelCase.ts","../src/string/capitalize.ts","../src/string/escapeHtml.ts","../src/string/escapeRegExp.ts","../src/string/kebabCase.ts","../src/string/pascalCase.ts","../src/string/snakeCase.ts","../src/string/stripSpecial.ts","../src/string/titleCase.ts","../src/string/unescapeHtml.ts","../src/validate/isEmpty.ts","../src/validate/isUrl.ts"],"sourcesContent":["export * from './array';\nexport * from './decorator';\nexport * from './function';\nexport * from './number';\nexport * from './object';\nexport * from './promise';\nexport * from './string';\nexport * from './type';\nexport * from './validate';\n","/**\n * Creates an array of elements split into groups the length of size. If array can't be split evenly, the final chunk will be the remaining elements.\n *\n * @example\n * chunk(['a', 'b', 'c', 'd'], 2)\n * // => [['a', 'b'], ['c', 'd']]\n *\n * chunk(['a', 'b', 'c', 'd'], 3)\n * // => [['a', 'b', 'c'], ['d']]\n * @param chunkSize The length of each chunk\n * @param array The array to chunk.\n * @template TElem The type of the array elements.\n * @returns Returns the new array of chunks.\n */\n\nexport function chunk<TElem>(array: TElem[], chunkSize: number): TElem[][] {\n const sizeInteger = Math.trunc(chunkSize);\n if (array.length === 0 || sizeInteger < 1) {\n return [];\n }\n\n const chunkedArray = [];\n let i = 0;\n\n while (i < array.length) {\n chunkedArray.push(array.slice(i, i + sizeInteger));\n i += sizeInteger;\n }\n\n return chunkedArray;\n}\n","/**\n * Creates an object with counts of occurrences of items in the array.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true, age: 36 },\n * { 'user': 'betty', 'active': false, age: 36 },\n * { 'user': 'fred', 'active': true, age: 40 }\n * ]\n *\n * count(users, value => value.active);\n * // => { 'true': 2, 'false': 1 }\n * \n * count(users, value => value.age);\n * // => { '36': 2, '40': 1 }\n * \n * @param criteria The criteria to count by.\n * @param array The array or record to iterate over.\n * @template TElem The type of the array elements.\n * @returns Returns the composed aggregate object.\n */\n\nexport function count<TElem, TKey extends PropertyKey>(array: TElem[], criteria: (value: TElem) => TKey | boolean): Record<TKey, number> {\n const result = {} as Record<TKey, number>;\n for (const value of array) {\n let key = criteria(value);\n if (typeof key === 'boolean')\n key = key.toString() as TKey;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result[key] === undefined)\n result[key] = 1;\n else\n result[key] += 1;\n }\n return result;\n}\n","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Checks if the value is a plain object.\n * \n * @example\n * isPlainObject({}) // => true\n * isPlainObject({ a: 1 }) // => true\n * isPlainObject(null) // => false\n * isPlainObject('1') // => false\n * isPlainObject([]) // => false\n * isPlainObject(new Function()) // => false\n * isPlainObject(new Date()) // => false\n * @param value - The value to check\n * @returns Boolean indicating if the value is a plain object\n */\n\nexport function isPlainObject(value: unknown): value is PlainObject {\n return value?.constructor === Object;\n}","import type { PlainObject } from '@type/PlainObject.js';\n\nimport { isPlainObject } from './isPlainObject.js';\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @example\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n * @param a - The value to compare.\n * @param b - The other value to compare.\n * @returns Returns `true` if the values are equivalent, else `false`.\n */\n\nexport function isEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n \n if (Array.isArray(a) && Array.isArray(b)) {\n return isSameArray(a, b);\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.toString() === b.toString();\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n return isSameObject(a, b);\n }\n\n return false;\n}\n\nfunction isSameObject(a: PlainObject, b: PlainObject) {\n // check if the objects have the same keys\n const keys1 = Object.keys(a);\n const keys2 = Object.keys(b);\n if (!isEqual(keys1, keys2)) return false;\n\n // check if the values of each key in the objects are equal\n for (const key of keys1) {\n if (!isEqual(a[key], b[key])) return false;\n }\n\n // the objects are deeply equal\n return true;\n}\n\nfunction isSameArray(a: unknown[], b: unknown[]) {\n if (a.length !== b.length) return false;\n\n // check if the values of each element in the arrays are equal\n for (const [i, element] of a.entries()) {\n if (!isEqual(element, b[i])) return false;\n }\n\n return true;\n}\n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Create a new array with values from the first array that are not present in the other arrays.\n * \n * Optionally, use a compare function to determine the comparison of elements (default: {@link isEqual}).\n * @example\n * difference([2, 1], [2, 3])\n * // => [1]\n *\n * // ---- Custom compare function ----\n * difference((a, b) => Math.floor(a) === Math.floor(b), [1.2, 3.1], [1.3, 2.4])\n * // => [3.1]\n *\n * // ---- Only compare by id ----\n * const arr1 = [{ id: 1, name: 'Yeet' }, { id: 3, name: 'John' }];\n * const arr2 = [{ id: 3, name: 'Carl' }, { id: 4, name: 'Max' }];\n *\n * difference((a, b) => a.id === b.id, arr1, arr2)\n * // => [{ id: 1, name: 'Yeet' }]\n * @param arrays First array is inspected, others are excluded.\n * @template TElem The type of the array elements.\n * @returns Returns the new array of filtered values.\n */\n\nexport function difference<TElem>(...arrays: ArrayMinLength<TElem[], 2>): TElem[];\nexport function difference<TElem>(arrayOrCompFn: (a: TElem, b: TElem) => boolean, ...arrays: ArrayMinLength<TElem[], 2>): TElem[];\nexport function difference<TElem>(arrayOrCompFn: TElem[] | ((a: TElem, b: TElem) => boolean), ...arrays: ArrayMinLength<TElem[], 2>): TElem[] {\n const withCompareFn = typeof arrayOrCompFn === 'function';\n const compareFN = withCompareFn ? arrayOrCompFn as (a: TElem, b: TElem) => boolean : isEqual;\n\n const [firstArray, ...restArrays] = withCompareFn ? arrays : [arrayOrCompFn, ...arrays];\n const difference: TElem[] = [];\n\n firstArray.forEach(element => {\n if (!restArrays.some(array => array.some(item => compareFN(item, element)))) {\n difference.push(element);\n }\n });\n\n return difference;\n}","/**\n * Creates a slice of `array` excluding elements dropped from the end. \n * Elements are dropped until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * dropRightWhile(users, ({ active }) => active)\n * // => objects for ['barney']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @template TElem The type of the array elements.\n * @returns Returns the slice of `array`.\n */\n\nexport function dropRightWhile<TElem>(array: TElem[], predicate: (value: TElem) => boolean) {\n let i = array.length;\n while (i > 0 && predicate(array[i - 1])) {\n i--;\n }\n return array.slice(0, i);\n}\n","/**\n * Creates a slice of `array` excluding elements dropped from the beginning. \n * Elements are dropped until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * dropWhile(users, ({ active }) => active)\n * // => objects for ['pebbles']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @template TElem The type of the array elements.\n * @returns Returns the slice of `array`.\n */\n\nexport function dropWhile<TElem>(array: TElem[], predicate: (value: TElem) => boolean): TElem[] {\n const index = array.findIndex(x => !predicate(x));\n return array.slice(index === -1 ? array.length : index);\n}\n","/**\n * Creates an object with grouped items in the array.\n *\n * @example\n * group([6.1, 4.2, 6.3], Math.floor)\n * // => { 4: [4.2], 6: [6.1, 6.3] }\n *\n * group([6.1, 4.2, 6.3], value => value > 5)\n * // => { 'false': [4.2], 'true': [6.1, 6.3] }\n * \n * @param collection The array or object to iterate over.\n * @param criteria The criteria to group by.\n * @template TElem The type of the array elements.\n * @returns An object with grouped items.\n */\n\nexport function group<TElem, TKey extends PropertyKey>(array: TElem[], criteria: (value: TElem) => TKey | boolean): Record<TKey, TElem[]> {\n const result = {} as Record<TKey, TElem[]>;\n for (const value of array) {\n let key = criteria(value);\n if (typeof key === 'boolean')\n key = key.toString() as TKey;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n result[key] = result[key] ?? [];\n result[key].push(value);\n }\n return result;\n}\n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Create an array with unique values from all input arrays, with order based on the first array. \n * \n * Optionally, use a compare function for element comparison (default: {@link isEqual}).\n * @example\n * intersection([2, 1], [2, 3])\n * // => [2]\n *\n * // ---- Custom compare function ----\n * const compareFn = (a, b) => Math.floor(a) === Math.floor(b);\n * \n * intersection(compareFn, [1.2, 1.1], [1.3, 2.4])\n * // => [1.2]\n *\n * // ---- Only compare by id ----\n * const arr1 = [{ id: 1, name: 'Yeet' }, { id: 3, name: 'John' }];\n * const arr2 = [{ id: 3, name: 'Carl' }, { id: 4, name: 'Max' }];\n *\n * intersection((a, b) => a.id === b.id, arr1, arr2)\n * // => [{ id: 3, name: 'John' }]\n * @param arrays - The arrays to inspect.\n * @returns Returns the new array of intersecting values.\n */\n\nexport function intersection<TArr>(...arrays: ArrayMinLength<TArr[], 2>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: ArrayMinLength<TArr[], 2>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: ArrayMinLength<TArr[], 2>): TArr[] {\n const withCompareFn = typeof arrayOrCompFn === 'function';\n const compareFN = withCompareFn ? arrayOrCompFn as (a: TArr, b: TArr) => boolean : isEqual;\n\n const [firstArray, ...restArrays] = withCompareFn ? arrays : [arrayOrCompFn, ...arrays];\n const intersection: TArr[] = [];\n\n firstArray.forEach(element => {\n if (restArrays.every(array => array.some(item => compareFN(item, element)))) {\n intersection.push(element);\n }\n });\n\n return intersection;\n}","/**\n * Gets a random element an array. A single element is returned by default. \n * Specify the `multi` parameter to get an array of multiple random elements.\n *\n * If the array is empty, `undefined` is returned. \n * If `multi` is defined it returns an empty array. \n * @example\n * sample([1, 2, 3, 4])\n * // => 2\n *\n * sample([1, 2, 3, 4], 2)\n * // => [3, 1]\n * @param array - The array to sample.\n * @returns Returns the random element.\n */\n\nexport function sample<TArr>(array: TArr[]): TArr | undefined;\nexport function sample<TArr>(array: TArr[], multi: number): TArr[];\nexport function sample<TArr>(array: TArr[], multi?: number): TArr | undefined | TArr[] {\n if (multi === undefined) {\n if (array.length === 0) return undefined;\n return getSingleSample(array);\n }\n\n if (multi && array.length === 0) return [];\n\n // Multiple samples\n const result = new Array<TArr>(multi);\n for (let i = 0; i < multi; i++) {\n result[i] = getSingleSample(array);\n }\n return result;\n}\n\nfunction getSingleSample<TArr>(array: TArr[]): TArr {\n const randomIndex = Math.floor(Math.random() * array.length);\n return array[randomIndex];\n}","/**\n * Creates a new array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @example\n * shuffle([1, 2, 3, 4])\n * // => [4, 1, 3, 2]\n * @param array - The array or object to shuffle.\n * @returns Returns the new shuffled array.\n */\n\nexport function shuffle<TArr>(array: TArr[]): TArr[] {\n const shuffledArray = [...array];\n let currentIndex = shuffledArray.length;\n let temporaryValue: TArr;\n let randomIndex: number;\n\n // While there remain elements to shuffle...\n while (0 !== currentIndex) {\n // Pick a remaining element...\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex -= 1;\n\n // And swap it with the current element.\n temporaryValue = shuffledArray[currentIndex];\n shuffledArray[currentIndex] = shuffledArray[randomIndex];\n shuffledArray[randomIndex] = temporaryValue;\n }\n\n return shuffledArray;\n}\n","\n/**\n * Creates a new sorted array in ascending or descending order based on one or multiple sorting criteria.\n * \n * @example\n * sort([1, 2, 3, 4], { order: 'desc' })\n * // => [4, 3, 2, 1]\n * \n * // --- Sorting by multiple properties ---\n * const array = [{ a: 2, b: 1 }, { a: 1, b: 2 }, { a: 1, b: 1 }];\n * \n * sort(array,\n * { order: 'asc', by: item => item.a },\n * { order: 'desc', by: item => item.b }\n * )\n * // => [{ a: 1, b: 2 }, { a: 1, b: 1 }, { a: 2, b: 1 }]\n * @param array - The array to sort.\n * @param orders - The sorting criteria, one or multiple objects with properties order (either 'asc' or 'desc') and by (iteratee function to sort based on a specific property).\n * @param orders.order - The order to sort in, either 'asc' or 'desc'.\n * @param orders.by - The iteratee function to sort based on a specific property.\n * @returns Returns the sorted array.\n*/\nexport function sort<TInput>(array: TInput[], ...orders: { order?: 'asc' | 'desc', by?: (item: TInput) => number | bigint | Date | string }[]): TInput[] {\n return [...array].sort((a, b) => {\n for (const { order, by } of orders) {\n const aValue = by ? by(a) : a;\n const bValue = by ? by(b) : b;\n if (aValue < bValue) {\n return order === 'desc' ? 1 : -1; \n }\n if (aValue > bValue) {\n return order === 'desc' ? -1 : 1;\n }\n }\n return 0;\n });\n}","/**\n * Creates a slice of `array` with elements taken from the end. \n * Elements are taken until `predicate` returns falsey.\n * \n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * takeRightWhile(({ active }) => active, users)\n * // => objects for ['fred', 'pebbles']\n * @param predicate - The function invoked per iteration.\n * @param array - The array to query.\n * @returns Returns the slice of `array`.\n */\n\nexport function takeRightWhile<TArr>(predicate: (elem: TArr) => boolean, array: TArr[]): TArr[] {\n const result: TArr[] = [];\n\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n result.unshift(array[i]);\n } else {\n break;\n }\n }\n\n return result;\n}\n","/**\n * Creates a slice of `array` with elements taken from the beginning. \n * Elements are taken until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * takeWhile(users, ({ active }) => active)\n * // => objects for ['barney', 'fred']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @returns Returns the slice of `array`.\n */\n\nexport function takeWhile<TArr>(array: TArr[], predicate: (elem: TArr) => boolean): TArr[] {\n const result: TArr[] = [];\n\n for (const element of array) {\n if (predicate(element)) {\n result.push(element);\n } else {\n break;\n }\n }\n\n return result;\n}\n","import { isEqual } from '@validate/isEqual';\n\n/**\n * Creates a duplicate-free version of an array, in which only the first occurrence of each element is kept. \n * The order of result values is determined by the order they occur in the array.\n *\n * An compare function is optinal to specify how the array is compared (default: {@link isEqual}).\n * \n * @example\n * unique([2, 1, 2])\n * // => [2, 1]\n *\n * const users = [\n * { id: 1, name: 'a' },\n * { id: 1, name: 'c' }\n * ]\n *\n * unique(users, (a, b) => a.id === b.id)\n * // => [{ id: 1, name: 'a' }]\n *\n *\n * @param array - The array to inspect.\n * @param iteratee - The iteratee invoked per element.\n * @returns Returns the new duplicate free array.\n */\n\nexport function unique<TInput>(array: TInput[], compareFn = (a: TInput, b: TInput) => isEqual(a, b)): TInput[] {\n return array.filter((value, index, self) => {\n return self.findIndex(otherValue => compareFn(value, otherValue)) === index;\n });\n}\n","import type { GenericFunction } from '@type/GenericFunction.js';\n\ntype Tail<T extends unknown[]> = T extends [infer _Head, ...infer Tail] ? Tail : never;\n\n/**\n * Transforms a function that takes a function as first argument into a decorator function.\n * \n * @example\n * ```typescript\n * function log(func: Function, message: string) {\n * return function (...args: unknown[]) {\n * console.log(message);\n * return func(...args);\n * };\n * }\n * \n * const logger = toDecorator(log);\n * \n * class TestClass {\n * @logger(\"Hello world!\")\n * testMethod() {\n * return 1; \n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(); \n * // => Log \"Hello World\" and return 1\n * ```\n * @param func - The function to transform.\n * @returns A decorator function that can be used to decorate a method.\n */\n\nexport function toDecorator<TFunc extends GenericFunction<TFunc>>(func: TFunc) {\n return function (...args: Tail<Parameters<TFunc>>) {\n return function (target: unknown, key: string, descriptor: PropertyDescriptor) {\n const creatorArgs = [descriptor.value, ...args] as Parameters<TFunc>;\n descriptor.value = func(...creatorArgs);\n };\n };\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a debounced version of a function. Only calling it after a specified amount of time has passed without any new calls.\n * \n * **Methods:** \n * - `cancel` will cancel the next invocation of the debounced function. \n * - `flush` will immediately invoke the debounced function and cancel any pending invocations. \n * \n * This function can be used as a decorator with {@link decDebounce}.\n * \n * @example\n * const sayHello = (name: string) => console.log(`Hello, ${name}!`);\n * const debouncedSayHello = debounce(sayHello, 200);\n * \n * debouncedSayHello(\"John\");\n * debouncedSayHello(\"Jane\");\n * // => Only the second invocation of `debouncedSayHello` is executed, after a delay of 200ms.\n * @param func - The function to debounce.\n * @param wait - The number of milliseconds to wait before invoking `func`.\n * @returns A debounced version of `func` with `cancel` and `flush` methods.\n */\n\nexport function debounce<TFunc extends GenericFunction<TFunc>>(func: TFunc, wait: number): TFunc & {\n cancel: () => void;\n flush: () => void;\n} {\n let timeoutId: NodeJS.Timeout | undefined;\n const debounced = function (this: unknown, ...args: Parameters<TFunc>) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func.apply(this, args), wait);\n };\n\n /** Cancels the next invocation of the debounced function. */\n debounced.cancel = function () {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n };\n\n /** Immediately invokes the debounced function and cancels any pending invocations. */\n debounced.flush = function (this: unknown, ...args: Parameters<TFunc>) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n func.apply(this, args);\n };\n\n return debounced as TFunc & { cancel: () => void; flush: () => void };\n}","import { toDecorator } from '@decorator/toDecorator.js';\nimport { debounce } from '@function/debounce.js';\n\n/**\n * Debouces the decorated function. Only calling it after a specified amount of time has passed without any new calls.\n * \n * Look at {@link debounce} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decDebounce(1000)\n * testMethod(str: string) {\n * console.log(\"Debounced:\", str);\n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(\"Hello\");\n * instance.testMethod(\"World\");\n * // => Only the second invocation of `debouncedSayHello` is executed, after a delay of 1000ms.\n * ```\n * @param wait - Milliseconds to wait before invoking the decorated function after the last invocation.\n */\n\nexport function decDebounce(wait: number) {\n return toDecorator(debounce)(wait);\n}\n","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a function that invokes the given function as long as it's called `<= n` times.\n * \n * Subsequent calls to the created function return the result of the last `func` invocation.\n *\n * This function can be used as a decorator with {@link decMaxCalls}.\n * @example\n * let count = 0;\n * const addCount = () => ++count;\n *\n * // Allow addCount to be invoked twice.\n * const limitAddCount = maxCalls(addCount, 2)\n *\n * limitAddCount() // => 1\n * limitAddCount() // => 2\n * limitAddCount() // => 2\n * // => `limitAddCount` is invoked twice and the result is cached.\n * @param n - The number of calls before the cached result is returned.\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function maxCalls<TFunc extends GenericFunction<TFunc>>(func: TFunc, n: number): TFunc {\n let count = 0;\n let result: ReturnType<TFunc>;\n return function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n if (count < n) {\n count += 1;\n result = func.apply(this, args);\n }\n return result;\n } as TFunc;\n}\n","import { toDecorator } from '@decorator/toDecorator.js';\nimport { maxCalls } from '@function/maxCalls.js';\n\n/**\n * Only invokes the decorated function as long as it's called `<= n` times. \n * Subsequent calls to the decorated function return the result of the last invocation.\n * \n * Look at {@link maxCalls} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * private count = 0;\n * @decMaxCalls(2)\n * testMethod() {\n * return ++this.count;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(); // => 1 \n * instance.testMethod(); // => 2\n * instance.testMethod(); // => 2\n * ```\n * @param n - The number of calls before the cached result is returned.\n */\n\nexport function decMaxCalls(n: number) {\n return toDecorator(maxCalls)(n);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\nconst defaultResolver = (...args: unknown[]) => JSON.stringify(args);\n\n/**\n * Creates a function that caches the result of `func`.\n * \n * The cache key is either determined by the provided `resolver` or by the arguments used in the cached function.\n *\n * The `cache` property is exposed on the cached function. It is an instance of `Map` and can be used to clear or inspect the cache. \n * The cache property can be replaced by a custom cache as long as it implements the `Map` interface.\n *\n * **Options:**\n * - `resolver` A function that determines the cache key for storing the result based on the arguments provided.\n * - `ttl` sets the time to live for the cache in milliseconds. After `ttl` milliseconds, the next call to the memoized function will result in a cache miss.\n * \n * This function can be used as a decorator with {@link decMemoize}.\n * \n * @example\n * ```typescript\n * function fibonacci(n: number) {\n * if (n <= 1) return n;\n * return fibonacci(n - 1) + fibonacci(n - 2);\n * }\n *\n * const memoizedFib = memoize(fibonacci, { ttl: 1000 })\n * \n * memoizedFib(40) // => 102334155\n * memoizedFib(40) // => 102334155 (cache hit)\n * setTimeout(() => memoizedFib(40), 1000) // => 102334155 (cache miss)\n * \n * // Cached values are exposed as the `cache` property.\n * memoizedFib.cache.get(\"40\") // => [value, timestamp]\n * memoizedFib.cache.set(\"40\", [1234, Date.now()])\n * memoizedFib.cache.clear()\n * \n * // This is the default way to create cache keys.\n * const defaultResolver = (...args: unknown[]) => JSON.stringify(args)\n * ```\n * @param func - The function to have its output memoized.\n * @param options - The options object with optional `resolver` and `ttl` parameters.\n * @param options.resolver - A function that determines the cache key for storing the result based on the arguments provided.\n * @param options.ttl - The time to live for the cache in milliseconds.\n * @template TFunc The type of the function to memoize.\n * @template Cache The type of the cache storage.\n * @returns Returns the new memoized function.\n */\n\nexport function memoize<TFunc extends GenericFunction<TFunc>, Cache extends Map<string, [ReturnType<TFunc>, number]>>(\n func: TFunc, options: { resolver?: (...args: Parameters<TFunc>) => string, ttl?: number; } = {}\n): TFunc & { cache: Cache } {\n const resolver = options.resolver ?? defaultResolver;\n const ttl = options.ttl;\n const cache = new Map() as Cache;\n\n const memoizedFunc = function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const key = resolver(...args);\n if (cache.has(key)) {\n const [cacheResult, cacheTime] = cache.get(key)!;\n if (ttl === undefined || (Date.now() - cacheTime < ttl)) {\n return cacheResult;\n }\n }\n const result = func.apply(this, args);\n cache.set(key, [result, Date.now()]);\n return result;\n };\n\n memoizedFunc.cache = cache;\n return memoizedFunc as TFunc & { cache: Cache };\n} ","import { toDecorator } from '@decorator/toDecorator.js';\nimport { memoize } from '@function/memoize.js';\n\n/**\n * Memoizes the decorated function. \n * The cache key is either determined by the provided resolver or by the arguments used in the memoized function.\n * \n * **Options:**\n * - `resolver` A function that determines the cache key for storing the result based on the arguments provided.\n * - `ttl` sets the time to live for the cache in milliseconds. After `ttl` milliseconds, the next call to the memoized function will result in a cache miss.\n * \n * Look at {@link memoize} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decMemoize({ ttl: 1000 })\n * testMethod(a: number, b: number) {\n * return a + b;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(1, 2); // => 3\n * instance.testMethod(1, 2); // => 3 (cached)\n * \n * // After 1 second:\n * instance.testMethod(1, 2); // => 3 (cache miss)\n * ```\n * @param options - The options object.\n * @param options.resolver - A function that determines the cache key for storing the result based on the arguments provided.\n * @param options.ttl - The time to live for the cache in milliseconds.\n */\n\nexport function decMemoize(options: Parameters<typeof memoize>[1] = {}) {\n return toDecorator(memoize)(options);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a function that invokes the given function once it's called more than `n` times. \n * Returns undefined until the minimum call count is reached.\n * \n * This function can be used as a decorator with {@link decMinCalls}.\n * @example\n * const caution = () => console.log(\"Caution!\");\n * const limitedCaution = minCalls(caution, 2);\n *\n * limitedCaution()\n * limitedCaution()\n * limitedCaution()\n * // => `caution` is invoked on the third call.\n * @param n The number of calls before the given function is invoked.\n * @param func The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function minCalls<TFunc extends GenericFunction<TFunc>>(func: TFunc, n: number) {\n let count = 1;\n return function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> | undefined {\n if (count > n) {\n return func.apply(this, args);\n }\n count += 1;\n };\n}","import { toDecorator } from '@decorator/toDecorator.js';\nimport { minCalls } from '@function/minCalls.js';\n\n/** \n * Only invokes the decorated function after it's called more than `n` times.\n * \n * Look at {@link minCalls} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * @example\n * ```typescript\n * class TestClass {\n * @decMinCalls(2)\n * testMethod() {\n * return 1;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(); // => undefined\n * instance.testMethod(); // => undefined\n * instance.testMethod(); // => 1\n * ```\n * @param n The number of calls before the decorated function is invoked.\n */\n\nexport function decMinCalls(n: number) {\n return toDecorator(minCalls)(n);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Generates a function that invokes the given function at most once per every `wait` milliseconds.\n * \n * This function can be used as a decorator with {@link decThrottle}.\n * @example\n * const throttled = throttle(() => console.log(\"Throttled!\"), 1000);\n * \n * throttled();\n * throttled();\n * // => \"Throttled!\" is logged once per second.\n * @param func - The function to throttle.\n * @param wait - The number of milliseconds to throttle invocations to.\n * @returns Returns the new throttled function.\n */\n\n\nexport function throttle<TFunc extends GenericFunction<TFunc>>(func: TFunc, wait: number): TFunc {\n let inThrottle = false;\n return function (this: unknown, ...args: Parameters<TFunc>) {\n if (!inThrottle) {\n func.apply(this, args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), wait);\n }\n } as TFunc;\n}\n \n","import { toDecorator } from '@decorator/toDecorator.js';\nimport { throttle } from '@function/throttle.js';\n\n/**\n * The decorated function is invoked at most once per every `wait` milliseconds.\n * \n * Look at {@link throttle} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decThrottle(1000)\n * testMethod() {\n * console.log(\"Throttled!\");\n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(); // => \"Throttled!\" is logged once per second.\n * instance.testMethod(); // nothing happens\n * ```\n * @param wait - The number of milliseconds to wait between invocations.\n */\n\nexport function decThrottle(wait: number) {\n return toDecorator(throttle)(wait);\n}","/**\n * Invokes a function `n` times, returning an array of the results of\n * each invocation.\n * \n * @example\n * times(index => console.log(\"Run\", index), 3)\n * // => \"Run 0\" | \"Run 1\" | \"Run 2\"\n * times(Math.random, 3)\n * // => [0.123, 0.456, 0.789]\n * times(() => 0, 4)\n * // => [0, 0, 0, 0]\n * @param n - The number of times to invoke `func`.\n * @param func - The function invoked per iteration.\n * @returns Returns an array of results.\n */\n\nexport function times<TInput>(func: (index: number) => TInput, n: number): TInput[] {\n const result: TInput[] = [];\n for (let i = 0; i < n; i++) {\n result.push(func(i));\n }\n return result;\n}","/**\n * Calculates the sum of an array of numbers.\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * sum([1, 2, 3, 4, 5]) // => 15\n * \n * @param numbers - The input array of numbers\n * @returns The sum of the input array \n */\n\nexport function sum(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n return numbers.reduce((total, current) => total + current, 0);\n}","import { sum } from '@number/sum.js';\n\n/**\n * Calculates the average of an array of numbers\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * average([1, 2, 3, 4, 5]) // => 3\n * \n * @param numbers - The input array of numbers\n * @returns The average of the input array, or NaN if the input array is empty\n */\n\nexport function average(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n return sum(numbers) / numbers.length;\n}","/**\n * Calculates the median of an array of numbers\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * median([1, 2, 3, 4, 5]) // => 3\n * median([1, 2, 3, 4, 5, 6]) // => 3.5\n * \n * @param numbers - The input array of numbers\n * @returns The median of the input array\n */\n\nexport function median(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n const sortedArray = [...numbers].sort((a, b) => a - b);\n const mid = Math.floor(sortedArray.length / 2);\n return sortedArray.length % 2 === 0 ? ((sortedArray[mid - 1] + sortedArray[mid]) / 2) : sortedArray[mid];\n}","/**\n * Generates a random float between two given numbers, including those numbers.\n * \n * It uses `crypto.getRandomValues` to generate the random number.\n * @example\n * randomFloat(1, 10) // => 1.123456789\n * \n * @param min - The smallest float that can be generated.\n * @param max - The largest float that can be generated.\n * \n * @returns A random float between `min` and `max`, including `min` and `max`.\n */\n\nexport function randomFloat(min: number, max: number): number {\n if (min > max)\n throw new Error('min must be less than or equal to max');\n const range = max - min;\n const randomBuffer = new Uint32Array(1);\n crypto.getRandomValues(randomBuffer);\n const random = randomBuffer[0] / 0xFFFFFFFF;\n return min + (random * range);\n}","\n/**\n * Generates a random integer between two given numbers, including those numbers.\n * \n * It uses `crypto.getRandomValues` to generate the random number.\n * @example\n * randomInt(1, 10) // => 5\n * \n * @param min - The smallest integer that can be generated.\n * @param max - The largest integer that can be generated.\n * \n * @returns A random integer between `min` and `max`, including `min` and `max`.\n */\n\nexport function randomInt(min: number, max: number): number {\n if (min > max)\n throw new Error('min must be less than or equal to max');\n const range = max - min + 1;\n const randomBuffer = new Uint32Array(1);\n crypto.getRandomValues(randomBuffer);\n return min + (randomBuffer[0] % range);\n}\n \n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\nimport type { PlainObject } from '@type/PlainObject.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * This function combines two or more objects into a single new object. Arrays and other types are overwritten.\n * \n * @example\n * // ---- Nested objects are merged ----\n * merge({ a: 1 }, { b: 2 }, { c: 3, d: { e: 4 } }) \n * // => { a: 1, b: 2, c: 3, d: { e: 4 } }\n *\n * // ---- Other types are overwritten ----\n * merge({ a: [1, 2] }, { a: [3, 4] })\n * // => { a: [3, 4] }\n * \n * merge({ a: 1 }, { a: \"Yes\" })\n * // => { a: \"Yes\" }\n * @param target - The target object\n * @param sources - The source objects\n * @returns A new merged object\n */\n\nexport function merge<TTarget extends PlainObject, TSources extends ArrayMinLength<PlainObject, 1>>(target: TTarget, ...sources: TSources): MergeDeepObjects<[TTarget, ...TSources]> {\n const targetCopy = { ...target };\n for (const source of sources) {\n for (const [key, value] of Object.entries(source)) {\n (targetCopy as PlainObject)[key] = isPlainObject(value) && isPlainObject(targetCopy[key]) \n ? merge(targetCopy[key] as PlainObject, value) \n : value;\n }\n }\n return targetCopy as MergeDeepObjects<[TTarget, ...TSources]>; \n}\n\ntype OptionalPropertyNames<T> =\n { [K in keyof T]-?: (PlainObject extends { [P in K]: T[K] } ? K : never) }[keyof T];\n\ntype SpreadProperties<L, R, K extends keyof L & keyof R> =\n { [P in K]: L[P] | Exclude<R[P], undefined> };\n\ntype Id<T> = T extends infer U ? { [K in keyof U]: U[K] } : never;\n\ntype SpreadTwo<L, R> = Id<\n& Pick<L, Exclude<keyof L, keyof R>>\n& Pick<R, Exclude<keyof R, OptionalPropertyNames<R>>>\n& Pick<R, Exclude<OptionalPropertyNames<R>, keyof L>>\n& SpreadProperties<L, R, OptionalPropertyNames<R> & keyof L>\n>;\n\ntype MergeDeepObjects<A extends readonly [...unknown[]]> = A extends [infer L, ...infer R] ?\n SpreadTwo<L, MergeDeepObjects<R>> : unknown;\n","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @example\n * const object = { 'a': 1, 'b': '2', 'c': 3 }\n *\n * pick(object, ['a', 'c'])\n * // => { 'a': 1, 'c': 3 }\n * @param object - The source object.\n * @param keysToPick - The property paths to pick.\n * @returns Returns the new object.\n */\n\nexport function pick<TInput extends PlainObject, Key extends keyof TInput>(object: TInput, keysToPick: Key[]): Pick<TInput, Key> {\n const result = {} as Pick<TInput, Key>;\n for (const key of keysToPick) {\n result[key] = object[key];\n }\n return result;\n}\n","import type { PlainObject } from '@type/PlainObject.js';\n\nimport { pick } from './pick.js';\n\n/**\n * Omit specified keys from an object\n *\n * @example\n * const obj = {a: 1, b: 2, c: 3};\n * omit(obj, ['a', 'b']);\n * // => {c: 3}\n *\n * @param object - The object to filter\n * @param keysToOmit - The keys to exclude from the returned object\n * @returns - An object without the specified keys\n *\n */\n\nexport function omit<TObj extends PlainObject, Key extends keyof TObj>(object: TObj, keysToOmit: Key[]): Omit<TObj, Key> {\n const keys = Object.keys(object);\n const filteredKeys = keys.filter(key => !keysToOmit.includes(key as Key)) as Exclude<keyof TObj, Key>[];\n\n return pick(object, filteredKeys);\n}","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Sets the value at path of object. If a portion of path doesn’t exist, it’s created.\n * \n * @alpha\n * @example\n * const obj = { a: { b: 2 } };\n * set(obj, 'a.c', 1);\n * // => { a: { b: 2, c: 1 } }\n * \n * @param obj - The object to modify.\n * @param path - The path of the property to set.\n * @param value - The value to set.\n * @returns The modified object.\n */\n\nexport function set<TObj extends PlainObject>(obj: TObj, path: string, value: unknown): TObj {\n const pathParts = path.split(/[.[\\]]/g).filter(x => Boolean(x.trim()));\n\n let currentObj: Record<string | number, unknown> = obj;\n for (let index = 0; index < pathParts.length; index++) {\n const key = pathParts[index];\n\n if (index === pathParts.length - 1) {\n currentObj[key] = value;\n break;\n }\n \n const nextIsNumber = !Number.isNaN(Number.parseInt(pathParts[index + 1]));\n if (currentObj[key] === undefined)\n currentObj[key] = nextIsNumber ? [] : {};\n\n currentObj = currentObj[key] as Record<string | number, unknown>;\n }\n\n return obj;\n}","/**\n * A class for managing a queue of async functions that runs a set number concurrently. \n * If for example you have 10 async functions and you want to run 3 at a time, you can use this class.\n * \n * If the queue is paused, the queue will not run any more async functions until it is resumed.\n * \n * **Methods:**\n * - `add` - adds a async function or array of functions to the queue. Returns a promise that resolves when the added function(s) finish.\n * - `clear` - clears the queue.\n * - `pause` - pauses the queue.\n * - `resume` - resumes the queue. \n * - `getQueue` - returns the current queue.\n * - `isPaused` - returns whether the queue is paused.\n * \n * @example\n * // Create a queue that can run 3 tasks concurrently\n * const queue = new Queue(3);\n * \n * queue.add(() => fetch('https://example.com'));\n * \n * queue.add(async () => {\n * const response = await fetch('https://example.com');\n * return response.json();\n * });\n * \n * // Add an array of tasks to the queue and wait for them to resolve\n * await queue.add([\n * () => fetch('https://apple.com'),\n * () => fetch('https://microsoft.com')\n * ]);\n * // => [Response, Response]\n */\n\nexport class Queue {\n private running = 0;\n private maxConcurrent: number;\n private paused = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private queue: { asyncFn: () => Promise<any>, resolve: (value: any) => void, reject: (reason?: any) => void }[] = [];\n\n /**\n * @constructor\n * @param maxConcurrent - The maximum number of async functions to run concurrently.\n */\n constructor(maxConcurrent: number) {\n this.maxConcurrent = maxConcurrent;\n }\n\n /**\n * Add aync functions or an array of async functions to the queue.\n * \n * @param asyncFn - The aync function(s) to add to the queue.\n * @returns A promise that resolves when the added function(s) finishes.\n */\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn): Promise<TProm>;\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn[]): Promise<TProm[]>;\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn | TAsyncFn[]): Promise<TProm> | Promise<TProm[]> {\n if (Array.isArray(asyncFn)) {\n const promises = asyncFn.map((fn) => this.buildWaitingPromise(fn));\n return Promise.all(promises);\n } else {\n return this.buildWaitingPromise(asyncFn);\n } \n }\n\n private buildWaitingPromise<TProm>(asyncFn: () => Promise<TProm>): Promise<TProm> {\n return new Promise((resolve, reject) => {\n this.queue.push({ asyncFn, resolve, reject });\n this.run();\n });\n } \n\n private run() {\n while (this.queue.length > 0 && this.running < this.maxConcurrent && !this.paused) {\n this.running++;\n const queueElement = this.queue.shift()!;\n void queueElement.asyncFn()\n .then((result) => {\n queueElement.resolve(result);\n }).catch((error) => {\n queueElement.reject(error);\n }).finally(() => {\n this.running--;\n this.run();\n });\n }\n }\n\n /** Removes all the tasks from the queue */\n clear() {\n for (const queueElement of this.queue) {\n queueElement.reject(new Error('Queue cleared'));\n }\n this.queue = [];\n }\n\n /** Pauses the execution of the queue */\n pause() {\n this.paused = true;\n }\n\n /** Resumes the execution of the tasks in the queue */\n resume() {\n this.paused = false;\n this.run();\n }\n\n /** Return the tasks added to the queue */\n getQueue() {\n return this.queue.map((queueElement) => queueElement.asyncFn);\n }\n\n /** Returns whether the queue is paused */\n isPaused() {\n return this.paused;\n }\n\n}\n","/**\n * Similar to [Promise.race](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race?retiredLocale=de) \n * but allows to specify how many promises to wait for.\n *\n * @example\n * const promise1 = Promise.resolve(1);\n * const promise2 = Promise.resolve(2);\n * const promise3 = Promise.resolve(3);\n * \n * const firstThree = await races(3, promise1, promise2, promise3);\n * // => [1, 2, 3]\n * @template TRes - The type of the result of the promises.\n * @param waitFor - The number of promises to wait for.\n * @param promises - The promises to wait for.\n * @returns A promise that resolves an array of the results of the first n promises.\n */\n\nexport function races<TRes>(waitFor: number, ...promises: Promise<TRes>[]): Promise<TRes[]> {\n return new Promise((resolve, reject) => {\n if (promises.length < waitFor)\n waitFor = promises.length;\n\n const results: TRes[] = [];\n let resolved = 0;\n for (const promise of promises) {\n promise.then((value) => {\n results.push(value);\n resolved++;\n if (resolved >= waitFor) {\n resolve(results);\n }\n }).catch((error) => {\n reject(error);\n });\n }\n });\n}","/**\n * Sleeps for the given amount of time.\n *\n * @example\n * await sleep(1000);\n * // => Waits for 1 second.\n * @param ms - Amount of time to sleep in milliseconds.\n * @returns A promise that resolves after the given amount of time.\n */\nexport function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}","/* eslint-disable no-await-in-loop */\nimport { sleep } from '@promise/sleep.js';\n\n/**\n * Retry a function until it succeeds or the maximum number of retries is reached.\n * \n * Default maxRetries: `5`. \n * Default backoff: `2^retries * 100ms` (100, 200, 400, 800, 1600, 3200, ...)\n *\n * @example\n * await retry(() => fetch('https://example.com'));\n * \n * // ---- Advanced example ----\n * const fetchSite = async (url: string) => {\n * const response = await fetch(url);\n * if(!response.ok)\n * throw new Error('Failed to fetch');\n * }\n * \n * const logger = (error: unknown, retry?: number) => console.log(\"Retrying\", retry, error);\n * \n * await retry(() => fetchSite('https://example.com'), { maxRetries: 3, backoff: retries => retries * 1000, onRetry: logger });\n * // => Will retry 3 times with a 1 second delay between each retry. Will log the error and retry number.\n * \n * @param func The function to retry.\n * @param options The options for the retry.\n * @param options.maxRetries The maximum number of retries. Defaults to `5`.\n * @param options.backoff The backoff function to use. Defaults to `2^retries * 100`.\n * @param options.onRetry The function to call when a retry is attempted.\n * @template TRes The type of the result of the function.\n * @returns A promise that resolves when the function succeeds.\n */\n\nexport async function retry<TRes>(\n func: () => Promise<TRes>, \n options?: { \n maxRetries?: number,\n backoff?: ((retries: number) => number),\n onRetry: (error?: unknown, retry?: number) => void\n }\n): Promise<TRes> {\n const backOffFn = options?.backoff ?? (retries => (2 ** retries) * 100);\n const maxRetries = options?.maxRetries ?? 5;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const onRetry = options?.onRetry ?? (() => {});\n let retries = 0;\n let lastError: unknown;\n\n while (retries <= maxRetries) {\n try {\n if (retries > 0)\n onRetry(lastError, retries);\n return await func();\n } catch (error) {\n lastError = error;\n retries++;\n if (retries > maxRetries) {\n throw error;\n }\n await sleep(backOffFn(retries));\n }\n }\n\n throw new Error('Retry terminated without success, this should never happen');\n}","/**\n * Returns a new promise that will reject with an error after a specified timeout. \n *\n * @example\n * try {\n * await timeout(fetch('https://example.com'), 1000);\n * } catch (error) {\n * console.log(error.message);\n * // => 'Promise timed out after 1000ms'\n * }\n * @template TRes - The type of the resolved value.\n * @param promise - The promise to wrap.\n * @param timeout - The timeout in milliseconds.\n * \n * @returns A new promise that will reject with an error after the specified timeout.\n */\nexport function timeout<TRes>(promise: Promise<TRes>, timeout: number): Promise<TRes> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(`Promise timed out after ${timeout}ms`));\n }, timeout);\n \n promise.then(\n (result) => {\n clearTimeout(timeoutId);\n resolve(result);\n },\n (error) => {\n clearTimeout(timeoutId);\n reject(error);\n }\n );\n });\n}","/**\n * Deburrs a string by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @example\n * deburr('déjà vu')\n * // => 'deja vu'\n * @param str - The string to deburr.\n * @returns Returns the deburred string.\n */\n\nexport function deburr(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/[^\\u0000-\\u007E]/g, (chr: string) =>\n chr.normalize('NFD').replace(/[\\u0300-\\u036F]/g, ''));\n}\n","import { deburr } from '@string/deburr';\n\nexport function splitWords(str: string): string[] {\n str = deburr(str);\n\n // Split non-alphanumeric characters with spaces and deal with camel/PascalCase\n const regex = new RegExp(\n '[^\\\\dA-Za-z]' + // match any character that is not a letter or a digit\n '|' + // or\n '(?<=[a-z])' + // lookbehind for a lowercase letter\n '(?=[A-Z])' + // lookahead for an uppercase letter\n '|' + // or\n '(?<=[A-Z])' + // lookbehind for an uppercase letter\n '(?=[A-Z][a-z])' // lookahead for an uppercase letter followed by a lowercase letter\n );\n\n return str.split(regex).filter(Boolean);\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts `string` to camelCase.\n *\n * @example\n * camelCase('Foo Bar')\n * // => 'fooBar'\n * camelCase('--foo-bar--')\n * // => 'fooBar'\n * camelCase('__FOO_BAR__')\n * // => 'fooBar'\n * @param str - The string to convert.\n * @returns Returns the camel cased string.\n */\n\nexport function camelCase(str: string): string {\n const words = splitWords(str);\n\n // Capitalize the first letter of each word\n const camelCase = words.map((word, index) => {\n if (index === 0) {\n return word.toLowerCase();\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return camelCase.join('');\n}\n","/**\n * Converts the first character of a string to upper case and the remaining to lower case.\n *\n * @example\n * capitalize('FRED')\n * // => 'Fred'\n * @param str - The string to capitalize.\n * @returns Returns the capitalized string.\n */\n\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Converts the characters `&`, `<`, `>`, `\"` and `'` in a string to their corresponding HTML entities.\n *\n * @example\n * escapeHtml('fred, barney, & pebbles')\n * // => 'fred, barney, & pebbles'\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escapeHtml(str: string): string {\n const escapeChars: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\\'': ''',\n '\"': '"'\n };\n return str.replace(/[\"&'<>]/g, char => escapeChars[char] || char);\n}\n","/**\n * Escapes the `RegExp` special characters `^`, `$`, `\\`, `.`, `*`, `+`,\n * `?`, `(`, `)`, `[`, `]`, `{`, `}`, and `|` in a string.\n *\n * @example\n * escapeRegExp('[moderndash](https://moderndash.io/)')\n * // => '\\[moderndash\\]\\(https://moderndash\\.io/\\)'\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escapeRegExp(str: string): string {\n return str.replace(/[$()*+.?[\\\\\\]^{|}]/g, '\\\\$&');\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to kebab-case.\n *\n * @example\n * kebabCase('Foo Bar')\n * // => 'foo-bar'\n * kebabCase('fooBar')\n * // => 'foo-bar'\n * kebabCase('__FOO_BAR__')\n * // => 'foo-bar'\n * kebabCase('Héllo World')\n * // => 'hello-world'\n * \n * @param str - The string to convert.\n * @returns Returns the kebab cased string.\n */\n\nexport function kebabCase(str: string): string {\n const words = splitWords(str);\n let kebabCase = '';\n for (const word of words) {\n kebabCase += word.toLowerCase() + '-';\n }\n return kebabCase.slice(0, -1);\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n\n/**\n * Converts a string to PascalCase.\n *\n * @example\n * pascalCase('Foo Bar')\n * // => 'FooBar'\n * pascalCase('fooBar')\n * // => 'FooBar'\n * pascalCase('__FOO_BAR__')\n * // => 'FooBar'\n * pascalCase('Héllo World')\n * // => 'HelloWorld'\n * \n * @param str - The string to convert.\n * @returns Returns the pascal cased string.\n */\n\nexport function pascalCase(str: string): string {\n const words = splitWords(str);\n let pascalCase = '';\n for (const word of words) {\n pascalCase += word.charAt(0).toUpperCase() + word.slice(1);\n }\n return pascalCase;\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to snake_case.\n *\n * @example\n * snakeCase('Foo Bar')\n * // => 'foo_bar'\n * snakeCase('fooBar')\n * // => 'foo_bar'\n * snakeCase('--FOO-BAR--')\n * // => 'foo_bar'\n * snakeCase('foo2bar')\n * // => 'foo_2_bar'\n * snakeCase('Héllo World')\n * // => 'hello_world'\n * @param str - The string to convert.\n * @returns Returns the snake cased string.\n */\n\nexport function snakeCase(str: string): string {\n const words = splitWords(str);\n let snakeCase = '';\n for (const word of words) {\n if (snakeCase.length > 0) {\n snakeCase += '_';\n }\n snakeCase += word.toLowerCase();\n }\n return snakeCase;\n}\n","import { deburr } from '@string/deburr';\n\n/**\n * Removes all special characters from a string.\n *\n * @example\n * stripSpecial('Héllo! World #$%&*!')\n * // => 'Hello World'\n * @param str - The string to remove special characters from.\n * @returns Returns the string with special characters removed.\n*/\n\nexport function stripSpecial(str: string): string {\n str = deburr(str);\n return str.replace(/[^\\s\\w]/gi, '');\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to Title Case.\n *\n * @example\n * titleCase('--foo-bar--')\n * // => 'Foo Bar'\n * titleCase('fooBar')\n * // => 'Foo Bar'\n * titleCase('__FOO_BAR__')\n * // => 'Foo Bar'\n * titleCase('HélloWorld')\n * // => 'Hello World'\n * @param str - The string to convert.\n * @returns Returns the title cased string.\n */\n\nexport function titleCase(str: string): string {\n const words = splitWords(str);\n let titleCase = '';\n for (const word of words) {\n titleCase += word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ' ';\n }\n return titleCase.trimEnd();\n}\n","/**\n * Converts the HTML entities `&`, `<`, `>`, `"` and `'`\n * in a string to their corresponding characters.\n *\n * @example\n * unescapeHtml('fred, barney, & pebbles')\n * // => 'fred, barney, & pebbles'\n * @param str - The string to unescape.\n * @returns Returns the unescaped string.\n */\n\nexport function unescapeHtml(str: string): string {\n const entityMap: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': '\\''\n };\n return str.replace(/&(?:amp|lt|gt|quot|#(0+)?39);/g, (entity: string) => entityMap[entity] || entity);\n}\n","/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @example\n * isEmpty(null)\n * // => true\n *\n * isEmpty({})\n * // => true\n *\n * isEmpty(\"\")\n * // => true\n *\n * isEmpty([1, 2, 3])\n * // => false\n *\n * isEmpty('abc')\n * // => false\n *\n * isEmpty({ 'a': 1 })\n * // => false\n * @param value - The value to check.\n * @returns Returns `true` if given vlaue is empty, else `false`.\n */\n\nexport function isEmpty(value: string | object | null | undefined): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n\n if (typeof value === 'string' || Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (value instanceof Map || value instanceof Set) {\n return value.size === 0;\n }\n\n if (typeof value === 'object') {\n return Object.keys(value).length === 0;\n }\n\n return false;\n}\n","/**\n * Checks if given string is a valid URL\n *\n * @example\n * isUrl('https://google.com')\n * // => true\n * isUrl('google.com')\n * // => false\n * @param str - The string to check.\n * @returns Returns `true` if given string is a valid URL, else `false`.\n */\n\nexport function isUrl(str: string): boolean {\n try {\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}"],"mappings":"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","names":["difference","intersection","count","count","retries","timeout","camelCase","kebabCase","pascalCase","snakeCase","titleCase"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/array/chunk.ts","../src/array/count.ts","../src/validate/isPlainObject.ts","../src/validate/isEqual.ts","../src/array/difference.ts","../src/array/dropRightWhile.ts","../src/array/dropWhile.ts","../src/array/group.ts","../src/array/intersection.ts","../src/array/sample.ts","../src/array/shuffle.ts","../src/array/sort.ts","../src/array/takeRightWhile.ts","../src/array/takeWhile.ts","../src/array/unique.ts","../src/decorator/toDecorator.ts","../src/function/debounce.ts","../src/decorator/decDebounce.ts","../src/function/maxCalls.ts","../src/decorator/decMaxCalls.ts","../src/function/memoize.ts","../src/decorator/decMemoize.ts","../src/function/minCalls.ts","../src/decorator/decMinCalls.ts","../src/function/throttle.ts","../src/decorator/decThrottle.ts","../src/function/times.ts","../src/number/sum.ts","../src/number/average.ts","../src/number/median.ts","../src/number/randomFloat.ts","../src/number/randomInt.ts","../src/object/merge.ts","../src/object/pick.ts","../src/object/omit.ts","../src/object/set.ts","../src/promise/queue.ts","../src/promise/races.ts","../src/promise/sleep.ts","../src/promise/retry.ts","../src/promise/timeout.ts","../src/string/splitWords.ts","../src/string/deburr.ts","../src/string/camelCase.ts","../src/string/capitalize.ts","../src/string/escapeHtml.ts","../src/string/escapeRegExp.ts","../src/string/kebabCase.ts","../src/string/pascalCase.ts","../src/string/snakeCase.ts","../src/string/titleCase.ts","../src/string/unescapeHtml.ts","../src/validate/isEmpty.ts","../src/validate/isUrl.ts"],"sourcesContent":["export * from './array';\nexport * from './decorator';\nexport * from './function';\nexport * from './number';\nexport * from './object';\nexport * from './promise';\nexport * from './string';\nexport * from './type';\nexport * from './validate';\n","/**\n * Creates an array of elements split into groups the length of size. If array can't be split evenly, the final chunk will be the remaining elements.\n *\n * @example\n * chunk(['a', 'b', 'c', 'd'], 2)\n * // => [['a', 'b'], ['c', 'd']]\n *\n * chunk(['a', 'b', 'c', 'd'], 3)\n * // => [['a', 'b', 'c'], ['d']]\n * @param chunkSize The length of each chunk\n * @param array The array to chunk.\n * @template TElem The type of the array elements.\n * @returns Returns the new array of chunks.\n */\n\nexport function chunk<TElem>(array: TElem[], chunkSize: number): TElem[][] {\n const sizeInteger = Math.trunc(chunkSize);\n if (array.length === 0 || sizeInteger < 1) {\n return [];\n }\n\n const chunkedArray = [];\n let i = 0;\n\n while (i < array.length) {\n chunkedArray.push(array.slice(i, i + sizeInteger));\n i += sizeInteger;\n }\n\n return chunkedArray;\n}\n","/**\n * Creates an object with counts of occurrences of items in the array.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true, age: 36 },\n * { 'user': 'betty', 'active': false, age: 36 },\n * { 'user': 'fred', 'active': true, age: 40 }\n * ]\n *\n * count(users, value => value.active);\n * // => { 'true': 2, 'false': 1 }\n * \n * count(users, value => value.age);\n * // => { '36': 2, '40': 1 }\n * \n * @param criteria The criteria to count by.\n * @param array The array or record to iterate over.\n * @template TElem The type of the array elements.\n * @returns Returns the composed aggregate object.\n */\n\nexport function count<TElem, TKey extends PropertyKey>(array: TElem[], criteria: (value: TElem) => TKey | boolean): Record<TKey, number> {\n const result = {} as Record<TKey, number>;\n for (const value of array) {\n let key = criteria(value);\n if (typeof key === 'boolean')\n key = key.toString() as TKey;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result[key] === undefined)\n result[key] = 1;\n else\n result[key] += 1;\n }\n return result;\n}\n","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Checks if the value is a plain object.\n * \n * @example\n * isPlainObject({}) // => true\n * isPlainObject({ a: 1 }) // => true\n * isPlainObject(null) // => false\n * isPlainObject('1') // => false\n * isPlainObject([]) // => false\n * isPlainObject(new Function()) // => false\n * isPlainObject(new Date()) // => false\n * @param value - The value to check\n * @returns Boolean indicating if the value is a plain object\n */\n\nexport function isPlainObject(value: unknown): value is PlainObject {\n return value?.constructor === Object;\n}","import type { PlainObject } from '@type/PlainObject.js';\n\nimport { isPlainObject } from './isPlainObject.js';\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @example\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n * @param a - The value to compare.\n * @param b - The other value to compare.\n * @returns Returns `true` if the values are equivalent, else `false`.\n */\n\nexport function isEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n \n if (Array.isArray(a) && Array.isArray(b)) {\n return isSameArray(a, b);\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.toString() === b.toString();\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n return isSameObject(a, b);\n }\n\n return false;\n}\n\nfunction isSameObject(a: PlainObject, b: PlainObject) {\n // check if the objects have the same keys\n const keys1 = Object.keys(a);\n const keys2 = Object.keys(b);\n if (!isEqual(keys1, keys2)) return false;\n\n // check if the values of each key in the objects are equal\n for (const key of keys1) {\n if (!isEqual(a[key], b[key])) return false;\n }\n\n // the objects are deeply equal\n return true;\n}\n\nfunction isSameArray(a: unknown[], b: unknown[]) {\n if (a.length !== b.length) return false;\n\n // check if the values of each element in the arrays are equal\n for (const [i, element] of a.entries()) {\n if (!isEqual(element, b[i])) return false;\n }\n\n return true;\n}\n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Create a new array with values from the first array that are not present in the other arrays.\n * \n * Optionally, use a compare function to determine the comparison of elements (default: {@link isEqual}).\n * @example\n * difference([2, 1], [2, 3])\n * // => [1]\n *\n * // ---- Custom compare function ----\n * difference((a, b) => Math.floor(a) === Math.floor(b), [1.2, 3.1], [1.3, 2.4])\n * // => [3.1]\n *\n * // ---- Only compare by id ----\n * const arr1 = [{ id: 1, name: 'Yeet' }, { id: 3, name: 'John' }];\n * const arr2 = [{ id: 3, name: 'Carl' }, { id: 4, name: 'Max' }];\n *\n * difference((a, b) => a.id === b.id, arr1, arr2)\n * // => [{ id: 1, name: 'Yeet' }]\n * @param arrays First array is inspected, others are excluded.\n * @template TElem The type of the array elements.\n * @returns Returns the new array of filtered values.\n */\n\nexport function difference<TElem>(...arrays: ArrayMinLength<TElem[], 2>): TElem[];\nexport function difference<TElem>(arrayOrCompFn: (a: TElem, b: TElem) => boolean, ...arrays: ArrayMinLength<TElem[], 2>): TElem[];\nexport function difference<TElem>(arrayOrCompFn: TElem[] | ((a: TElem, b: TElem) => boolean), ...arrays: ArrayMinLength<TElem[], 2>): TElem[] {\n const withCompareFn = typeof arrayOrCompFn === 'function';\n const compareFN = withCompareFn ? arrayOrCompFn as (a: TElem, b: TElem) => boolean : isEqual;\n\n const [firstArray, ...restArrays] = withCompareFn ? arrays : [arrayOrCompFn, ...arrays];\n const difference: TElem[] = [];\n\n firstArray.forEach(element => {\n if (!restArrays.some(array => array.some(item => compareFN(item, element)))) {\n difference.push(element);\n }\n });\n\n return difference;\n}","/**\n * Creates a slice of `array` excluding elements dropped from the end. \n * Elements are dropped until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * dropRightWhile(users, ({ active }) => active)\n * // => objects for ['barney']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @template TElem The type of the array elements.\n * @returns Returns the slice of `array`.\n */\n\nexport function dropRightWhile<TElem>(array: TElem[], predicate: (value: TElem) => boolean) {\n let i = array.length;\n while (i > 0 && predicate(array[i - 1])) {\n i--;\n }\n return array.slice(0, i);\n}\n","/**\n * Creates a slice of `array` excluding elements dropped from the beginning. \n * Elements are dropped until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * dropWhile(users, ({ active }) => active)\n * // => objects for ['pebbles']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @template TElem The type of the array elements.\n * @returns Returns the slice of `array`.\n */\n\nexport function dropWhile<TElem>(array: TElem[], predicate: (value: TElem) => boolean): TElem[] {\n const index = array.findIndex(x => !predicate(x));\n return array.slice(index === -1 ? array.length : index);\n}\n","/**\n * Creates an object with grouped items in the array.\n *\n * @example\n * group([6.1, 4.2, 6.3], Math.floor)\n * // => { 4: [4.2], 6: [6.1, 6.3] }\n *\n * group([6.1, 4.2, 6.3], value => value > 5)\n * // => { 'false': [4.2], 'true': [6.1, 6.3] }\n * \n * @param collection The array or object to iterate over.\n * @param criteria The criteria to group by.\n * @template TElem The type of the array elements.\n * @returns An object with grouped items.\n */\n\nexport function group<TElem, TKey extends PropertyKey>(array: TElem[], criteria: (value: TElem) => TKey | boolean): Record<TKey, TElem[]> {\n const result = {} as Record<TKey, TElem[]>;\n for (const value of array) {\n let key = criteria(value);\n if (typeof key === 'boolean')\n key = key.toString() as TKey;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n result[key] = result[key] ?? [];\n result[key].push(value);\n }\n return result;\n}\n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Create an array with unique values from all input arrays, with order based on the first array. \n * \n * Optionally, use a compare function for element comparison (default: {@link isEqual}).\n * @example\n * intersection([2, 1], [2, 3])\n * // => [2]\n *\n * // ---- Custom compare function ----\n * const compareFn = (a, b) => Math.floor(a) === Math.floor(b);\n * \n * intersection(compareFn, [1.2, 1.1], [1.3, 2.4])\n * // => [1.2]\n *\n * // ---- Only compare by id ----\n * const arr1 = [{ id: 1, name: 'Yeet' }, { id: 3, name: 'John' }];\n * const arr2 = [{ id: 3, name: 'Carl' }, { id: 4, name: 'Max' }];\n *\n * intersection((a, b) => a.id === b.id, arr1, arr2)\n * // => [{ id: 3, name: 'John' }]\n * @param arrays - The arrays to inspect.\n * @returns Returns the new array of intersecting values.\n */\n\nexport function intersection<TArr>(...arrays: ArrayMinLength<TArr[], 2>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: ArrayMinLength<TArr[], 2>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: ArrayMinLength<TArr[], 2>): TArr[] {\n const withCompareFn = typeof arrayOrCompFn === 'function';\n const compareFN = withCompareFn ? arrayOrCompFn as (a: TArr, b: TArr) => boolean : isEqual;\n\n const [firstArray, ...restArrays] = withCompareFn ? arrays : [arrayOrCompFn, ...arrays];\n const intersection: TArr[] = [];\n\n firstArray.forEach(element => {\n if (restArrays.every(array => array.some(item => compareFN(item, element)))) {\n intersection.push(element);\n }\n });\n\n return intersection;\n}","/**\n * Gets a random element an array. A single element is returned by default. \n * Specify the `multi` parameter to get an array of multiple random elements.\n *\n * If the array is empty, `undefined` is returned. \n * If `multi` is defined it returns an empty array. \n * @example\n * sample([1, 2, 3, 4])\n * // => 2\n *\n * sample([1, 2, 3, 4], 2)\n * // => [3, 1]\n * @param array - The array to sample.\n * @returns Returns the random element.\n */\n\nexport function sample<TArr>(array: TArr[]): TArr | undefined;\nexport function sample<TArr>(array: TArr[], multi: number): TArr[];\nexport function sample<TArr>(array: TArr[], multi?: number): TArr | undefined | TArr[] {\n if (multi === undefined) {\n if (array.length === 0) return undefined;\n return getSingleSample(array);\n }\n\n if (multi && array.length === 0) return [];\n\n // Multiple samples\n const result = new Array<TArr>(multi);\n for (let i = 0; i < multi; i++) {\n result[i] = getSingleSample(array);\n }\n return result;\n}\n\nfunction getSingleSample<TArr>(array: TArr[]): TArr {\n const randomIndex = Math.floor(Math.random() * array.length);\n return array[randomIndex];\n}","/**\n * Creates a new array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @example\n * shuffle([1, 2, 3, 4])\n * // => [4, 1, 3, 2]\n * @param array - The array or object to shuffle.\n * @returns Returns the new shuffled array.\n */\n\nexport function shuffle<TArr>(array: TArr[]): TArr[] {\n const shuffledArray = [...array];\n let currentIndex = shuffledArray.length;\n let temporaryValue: TArr;\n let randomIndex: number;\n\n // While there remain elements to shuffle...\n while (0 !== currentIndex) {\n // Pick a remaining element...\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex -= 1;\n\n // And swap it with the current element.\n temporaryValue = shuffledArray[currentIndex];\n shuffledArray[currentIndex] = shuffledArray[randomIndex];\n shuffledArray[randomIndex] = temporaryValue;\n }\n\n return shuffledArray;\n}\n","\n/**\n * Creates a new sorted array in ascending or descending order based on one or multiple sorting criteria.\n * \n * @example\n * sort([1, 2, 3, 4], { order: 'desc' })\n * // => [4, 3, 2, 1]\n * \n * // --- Sorting by multiple properties ---\n * const array = [{ a: 2, b: 1 }, { a: 1, b: 2 }, { a: 1, b: 1 }];\n * \n * sort(array,\n * { order: 'asc', by: item => item.a },\n * { order: 'desc', by: item => item.b }\n * )\n * // => [{ a: 1, b: 2 }, { a: 1, b: 1 }, { a: 2, b: 1 }]\n * @param array - The array to sort.\n * @param orders - The sorting criteria, one or multiple objects with properties order (either 'asc' or 'desc') and by (iteratee function to sort based on a specific property).\n * @param orders.order - The order to sort in, either 'asc' or 'desc'.\n * @param orders.by - The iteratee function to sort based on a specific property.\n * @returns Returns the sorted array.\n*/\nexport function sort<TInput>(array: TInput[], ...orders: { order?: 'asc' | 'desc', by?: (item: TInput) => number | bigint | Date | string }[]): TInput[] {\n return [...array].sort((a, b) => {\n for (const { order, by } of orders) {\n const aValue = by ? by(a) : a;\n const bValue = by ? by(b) : b;\n if (aValue < bValue) {\n return order === 'desc' ? 1 : -1; \n }\n if (aValue > bValue) {\n return order === 'desc' ? -1 : 1;\n }\n }\n return 0;\n });\n}","/**\n * Creates a slice of `array` with elements taken from the end. \n * Elements are taken until `predicate` returns falsey.\n * \n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * takeRightWhile(({ active }) => active, users)\n * // => objects for ['fred', 'pebbles']\n * @param predicate - The function invoked per iteration.\n * @param array - The array to query.\n * @returns Returns the slice of `array`.\n */\n\nexport function takeRightWhile<TArr>(predicate: (elem: TArr) => boolean, array: TArr[]): TArr[] {\n const result: TArr[] = [];\n\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n result.unshift(array[i]);\n } else {\n break;\n }\n }\n\n return result;\n}\n","/**\n * Creates a slice of `array` with elements taken from the beginning. \n * Elements are taken until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * takeWhile(users, ({ active }) => active)\n * // => objects for ['barney', 'fred']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @returns Returns the slice of `array`.\n */\n\nexport function takeWhile<TArr>(array: TArr[], predicate: (elem: TArr) => boolean): TArr[] {\n const result: TArr[] = [];\n\n for (const element of array) {\n if (predicate(element)) {\n result.push(element);\n } else {\n break;\n }\n }\n\n return result;\n}\n","import { isEqual } from '@validate/isEqual';\n\n/**\n * Creates a duplicate-free version of an array, in which only the first occurrence of each element is kept. \n * The order of result values is determined by the order they occur in the array.\n *\n * An compare function is optinal to specify how the array is compared (default: {@link isEqual}).\n * \n * @example\n * unique([2, 1, 2])\n * // => [2, 1]\n *\n * const users = [\n * { id: 1, name: 'a' },\n * { id: 1, name: 'c' }\n * ]\n *\n * unique(users, (a, b) => a.id === b.id)\n * // => [{ id: 1, name: 'a' }]\n *\n *\n * @param array - The array to inspect.\n * @param iteratee - The iteratee invoked per element.\n * @returns Returns the new duplicate free array.\n */\n\nexport function unique<TInput>(array: TInput[], compareFn = (a: TInput, b: TInput) => isEqual(a, b)): TInput[] {\n return array.filter((value, index, self) => {\n return self.findIndex(otherValue => compareFn(value, otherValue)) === index;\n });\n}\n","import type { GenericFunction } from '@type/GenericFunction.js';\n\ntype Tail<T extends unknown[]> = T extends [infer _Head, ...infer Tail] ? Tail : never;\n\n/**\n * Transforms a function that takes a function as first argument into a decorator function.\n * \n * @example\n * ```typescript\n * function log(func: Function, message: string) {\n * return function (...args: unknown[]) {\n * console.log(message);\n * return func(...args);\n * };\n * }\n * \n * const logger = toDecorator(log);\n * \n * class TestClass {\n * @logger(\"Hello world!\")\n * testMethod() {\n * return 1; \n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(); \n * // => Log \"Hello World\" and return 1\n * ```\n * @param func - The function to transform.\n * @returns A decorator function that can be used to decorate a method.\n */\n\nexport function toDecorator<TFunc extends GenericFunction<TFunc>>(func: TFunc) {\n return function (...args: Tail<Parameters<TFunc>>) {\n return function (target: unknown, key: string, descriptor: PropertyDescriptor) {\n const creatorArgs = [descriptor.value, ...args] as Parameters<TFunc>;\n descriptor.value = func(...creatorArgs);\n };\n };\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a debounced version of a function. Only calling it after a specified amount of time has passed without any new calls.\n * \n * **Methods:** \n * - `cancel` will cancel the next invocation of the debounced function. \n * - `flush` will immediately invoke the debounced function and cancel any pending invocations. \n * \n * This function can be used as a decorator with {@link decDebounce}.\n * \n * @example\n * const sayHello = (name: string) => console.log(`Hello, ${name}!`);\n * const debouncedSayHello = debounce(sayHello, 200);\n * \n * debouncedSayHello(\"John\");\n * debouncedSayHello(\"Jane\");\n * // => Only the second invocation of `debouncedSayHello` is executed, after a delay of 200ms.\n * @param func - The function to debounce.\n * @param wait - The number of milliseconds to wait before invoking `func`.\n * @returns A debounced version of `func` with `cancel` and `flush` methods.\n */\n\nexport function debounce<TFunc extends GenericFunction<TFunc>>(func: TFunc, wait: number): TFunc & {\n cancel: () => void;\n flush: () => void;\n} {\n let timeoutId: NodeJS.Timeout | undefined;\n const debounced = function (this: unknown, ...args: Parameters<TFunc>) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func.apply(this, args), wait);\n };\n\n /** Cancels the next invocation of the debounced function. */\n debounced.cancel = function () {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n };\n\n /** Immediately invokes the debounced function and cancels any pending invocations. */\n debounced.flush = function (this: unknown, ...args: Parameters<TFunc>) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n func.apply(this, args);\n };\n\n return debounced as TFunc & { cancel: () => void; flush: () => void };\n}","import { toDecorator } from '@decorator/toDecorator.js';\nimport { debounce } from '@function/debounce.js';\n\n/**\n * Debouces the decorated function. Only calling it after a specified amount of time has passed without any new calls.\n * \n * Look at {@link debounce} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decDebounce(1000)\n * testMethod(str: string) {\n * console.log(\"Debounced:\", str);\n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(\"Hello\");\n * instance.testMethod(\"World\");\n * // => Only the second invocation of `debouncedSayHello` is executed, after a delay of 1000ms.\n * ```\n * @param wait - Milliseconds to wait before invoking the decorated function after the last invocation.\n */\n\nexport function decDebounce(wait: number) {\n return toDecorator(debounce)(wait);\n}\n","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a function that invokes the given function as long as it's called `<= n` times.\n * \n * Subsequent calls to the created function return the result of the last `func` invocation.\n *\n * This function can be used as a decorator with {@link decMaxCalls}.\n * @example\n * let count = 0;\n * const addCount = () => ++count;\n *\n * // Allow addCount to be invoked twice.\n * const limitAddCount = maxCalls(addCount, 2)\n *\n * limitAddCount() // => 1\n * limitAddCount() // => 2\n * limitAddCount() // => 2\n * // => `limitAddCount` is invoked twice and the result is cached.\n * @param n - The number of calls before the cached result is returned.\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function maxCalls<TFunc extends GenericFunction<TFunc>>(func: TFunc, n: number): TFunc {\n let count = 0;\n let result: ReturnType<TFunc>;\n return function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n if (count < n) {\n count += 1;\n result = func.apply(this, args);\n }\n return result;\n } as TFunc;\n}\n","import { toDecorator } from '@decorator/toDecorator.js';\nimport { maxCalls } from '@function/maxCalls.js';\n\n/**\n * Only invokes the decorated function as long as it's called `<= n` times. \n * Subsequent calls to the decorated function return the result of the last invocation.\n * \n * Look at {@link maxCalls} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * private count = 0;\n * @decMaxCalls(2)\n * testMethod() {\n * return ++this.count;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(); // => 1 \n * instance.testMethod(); // => 2\n * instance.testMethod(); // => 2\n * ```\n * @param n - The number of calls before the cached result is returned.\n */\n\nexport function decMaxCalls(n: number) {\n return toDecorator(maxCalls)(n);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\nconst defaultResolver = (...args: unknown[]) => JSON.stringify(args);\n\n/**\n * Creates a function that caches the result of `func`.\n * \n * The cache key is either determined by the provided `resolver` or by the arguments used in the cached function.\n *\n * The `cache` property is exposed on the cached function. It is an instance of `Map` and can be used to clear or inspect the cache. \n * The cache property can be replaced by a custom cache as long as it implements the `Map` interface.\n *\n * **Options:**\n * - `resolver` A function that determines the cache key for storing the result based on the arguments provided.\n * - `ttl` sets the time to live for the cache in milliseconds. After `ttl` milliseconds, the next call to the memoized function will result in a cache miss.\n * \n * This function can be used as a decorator with {@link decMemoize}.\n * \n * @example\n * ```typescript\n * function fibonacci(n: number) {\n * if (n <= 1) return n;\n * return fibonacci(n - 1) + fibonacci(n - 2);\n * }\n *\n * const memoizedFib = memoize(fibonacci, { ttl: 1000 })\n * \n * memoizedFib(40) // => 102334155\n * memoizedFib(40) // => 102334155 (cache hit)\n * setTimeout(() => memoizedFib(40), 1000) // => 102334155 (cache miss)\n * \n * // Cached values are exposed as the `cache` property.\n * memoizedFib.cache.get(\"40\") // => [value, timestamp]\n * memoizedFib.cache.set(\"40\", [1234, Date.now()])\n * memoizedFib.cache.clear()\n * \n * // This is the default way to create cache keys.\n * const defaultResolver = (...args: unknown[]) => JSON.stringify(args)\n * ```\n * @param func - The function to have its output memoized.\n * @param options - The options object with optional `resolver` and `ttl` parameters.\n * @param options.resolver - A function that determines the cache key for storing the result based on the arguments provided.\n * @param options.ttl - The time to live for the cache in milliseconds.\n * @template TFunc The type of the function to memoize.\n * @template Cache The type of the cache storage.\n * @returns Returns the new memoized function.\n */\n\nexport function memoize<TFunc extends GenericFunction<TFunc>, Cache extends Map<string, [ReturnType<TFunc>, number]>>(\n func: TFunc, options: { resolver?: (...args: Parameters<TFunc>) => string, ttl?: number; } = {}\n): TFunc & { cache: Cache } {\n const resolver = options.resolver ?? defaultResolver;\n const ttl = options.ttl;\n const cache = new Map() as Cache;\n\n const memoizedFunc = function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const key = resolver(...args);\n if (cache.has(key)) {\n const [cacheResult, cacheTime] = cache.get(key)!;\n if (ttl === undefined || (Date.now() - cacheTime < ttl)) {\n return cacheResult;\n }\n }\n const result = func.apply(this, args);\n cache.set(key, [result, Date.now()]);\n return result;\n };\n\n memoizedFunc.cache = cache;\n return memoizedFunc as TFunc & { cache: Cache };\n} ","import { toDecorator } from '@decorator/toDecorator.js';\nimport { memoize } from '@function/memoize.js';\n\n/**\n * Memoizes the decorated function. \n * The cache key is either determined by the provided resolver or by the arguments used in the memoized function.\n * \n * **Options:**\n * - `resolver` A function that determines the cache key for storing the result based on the arguments provided.\n * - `ttl` sets the time to live for the cache in milliseconds. After `ttl` milliseconds, the next call to the memoized function will result in a cache miss.\n * \n * Look at {@link memoize} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decMemoize({ ttl: 1000 })\n * testMethod(a: number, b: number) {\n * return a + b;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(1, 2); // => 3\n * instance.testMethod(1, 2); // => 3 (cached)\n * \n * // After 1 second:\n * instance.testMethod(1, 2); // => 3 (cache miss)\n * ```\n * @param options - The options object.\n * @param options.resolver - A function that determines the cache key for storing the result based on the arguments provided.\n * @param options.ttl - The time to live for the cache in milliseconds.\n */\n\nexport function decMemoize(options: Parameters<typeof memoize>[1] = {}) {\n return toDecorator(memoize)(options);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a function that invokes the given function once it's called more than `n` times. \n * Returns undefined until the minimum call count is reached.\n * \n * This function can be used as a decorator with {@link decMinCalls}.\n * @example\n * const caution = () => console.log(\"Caution!\");\n * const limitedCaution = minCalls(caution, 2);\n *\n * limitedCaution()\n * limitedCaution()\n * limitedCaution()\n * // => `caution` is invoked on the third call.\n * @param n The number of calls before the given function is invoked.\n * @param func The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function minCalls<TFunc extends GenericFunction<TFunc>>(func: TFunc, n: number) {\n let count = 1;\n return function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> | undefined {\n if (count > n) {\n return func.apply(this, args);\n }\n count += 1;\n };\n}","import { toDecorator } from '@decorator/toDecorator.js';\nimport { minCalls } from '@function/minCalls.js';\n\n/** \n * Only invokes the decorated function after it's called more than `n` times.\n * \n * Look at {@link minCalls} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * @example\n * ```typescript\n * class TestClass {\n * @decMinCalls(2)\n * testMethod() {\n * return 1;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(); // => undefined\n * instance.testMethod(); // => undefined\n * instance.testMethod(); // => 1\n * ```\n * @param n The number of calls before the decorated function is invoked.\n */\n\nexport function decMinCalls(n: number) {\n return toDecorator(minCalls)(n);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Generates a function that invokes the given function at most once per every `wait` milliseconds.\n * \n * This function can be used as a decorator with {@link decThrottle}.\n * @example\n * const throttled = throttle(() => console.log(\"Throttled!\"), 1000);\n * \n * throttled();\n * throttled();\n * // => \"Throttled!\" is logged once per second.\n * @param func - The function to throttle.\n * @param wait - The number of milliseconds to throttle invocations to.\n * @returns Returns the new throttled function.\n */\n\n\nexport function throttle<TFunc extends GenericFunction<TFunc>>(func: TFunc, wait: number): TFunc {\n let inThrottle = false;\n return function (this: unknown, ...args: Parameters<TFunc>) {\n if (!inThrottle) {\n func.apply(this, args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), wait);\n }\n } as TFunc;\n}\n \n","import { toDecorator } from '@decorator/toDecorator.js';\nimport { throttle } from '@function/throttle.js';\n\n/**\n * The decorated function is invoked at most once per every `wait` milliseconds.\n * \n * Look at {@link throttle} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decThrottle(1000)\n * testMethod() {\n * console.log(\"Throttled!\");\n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(); // => \"Throttled!\" is logged once per second.\n * instance.testMethod(); // nothing happens\n * ```\n * @param wait - The number of milliseconds to wait between invocations.\n */\n\nexport function decThrottle(wait: number) {\n return toDecorator(throttle)(wait);\n}","/**\n * Invokes a function `n` times, returning an array of the results of\n * each invocation.\n * \n * @example\n * times(index => console.log(\"Run\", index), 3)\n * // => \"Run 0\" | \"Run 1\" | \"Run 2\"\n * times(Math.random, 3)\n * // => [0.123, 0.456, 0.789]\n * times(() => 0, 4)\n * // => [0, 0, 0, 0]\n * @param n - The number of times to invoke `func`.\n * @param func - The function invoked per iteration.\n * @returns Returns an array of results.\n */\n\nexport function times<TInput>(func: (index: number) => TInput, n: number): TInput[] {\n const result: TInput[] = [];\n for (let i = 0; i < n; i++) {\n result.push(func(i));\n }\n return result;\n}","/**\n * Calculates the sum of an array of numbers.\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * sum([1, 2, 3, 4, 5]) // => 15\n * \n * @param numbers - The input array of numbers\n * @returns The sum of the input array \n */\n\nexport function sum(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n return numbers.reduce((total, current) => total + current, 0);\n}","import { sum } from '@number/sum.js';\n\n/**\n * Calculates the average of an array of numbers\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * average([1, 2, 3, 4, 5]) // => 3\n * \n * @param numbers - The input array of numbers\n * @returns The average of the input array, or NaN if the input array is empty\n */\n\nexport function average(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n return sum(numbers) / numbers.length;\n}","/**\n * Calculates the median of an array of numbers\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * median([1, 2, 3, 4, 5]) // => 3\n * median([1, 2, 3, 4, 5, 6]) // => 3.5\n * \n * @param numbers - The input array of numbers\n * @returns The median of the input array\n */\n\nexport function median(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n const sortedArray = [...numbers].sort((a, b) => a - b);\n const mid = Math.floor(sortedArray.length / 2);\n return sortedArray.length % 2 === 0 ? ((sortedArray[mid - 1] + sortedArray[mid]) / 2) : sortedArray[mid];\n}","/**\n * Generates a random float between two given numbers, including those numbers.\n * \n * It uses `crypto.getRandomValues` to generate the random number.\n * @example\n * randomFloat(1, 10) // => 1.123456789\n * \n * @param min - The smallest float that can be generated.\n * @param max - The largest float that can be generated.\n * \n * @returns A random float between `min` and `max`, including `min` and `max`.\n */\n\nexport function randomFloat(min: number, max: number): number {\n if (min > max)\n throw new Error('min must be less than or equal to max');\n const range = max - min;\n const randomBuffer = new Uint32Array(1);\n crypto.getRandomValues(randomBuffer);\n const random = randomBuffer[0] / 0xFFFFFFFF;\n return min + (random * range);\n}","\n/**\n * Generates a random integer between two given numbers, including those numbers.\n * \n * It uses `crypto.getRandomValues` to generate the random number.\n * @example\n * randomInt(1, 10) // => 5\n * \n * @param min - The smallest integer that can be generated.\n * @param max - The largest integer that can be generated.\n * \n * @returns A random integer between `min` and `max`, including `min` and `max`.\n */\n\nexport function randomInt(min: number, max: number): number {\n if (min > max)\n throw new Error('min must be less than or equal to max');\n const range = max - min + 1;\n const randomBuffer = new Uint32Array(1);\n crypto.getRandomValues(randomBuffer);\n return min + (randomBuffer[0] % range);\n}\n \n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\nimport type { PlainObject } from '@type/PlainObject.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * This function combines two or more objects into a single new object. Arrays and other types are overwritten.\n * \n * @example\n * // ---- Nested objects are merged ----\n * merge({ a: 1 }, { b: 2 }, { c: 3, d: { e: 4 } }) \n * // => { a: 1, b: 2, c: 3, d: { e: 4 } }\n *\n * // ---- Other types are overwritten ----\n * merge({ a: [1, 2] }, { a: [3, 4] })\n * // => { a: [3, 4] }\n * \n * merge({ a: 1 }, { a: \"Yes\" })\n * // => { a: \"Yes\" }\n * @param target - The target object\n * @param sources - The source objects\n * @returns A new merged object\n */\n\nexport function merge<TTarget extends PlainObject, TSources extends ArrayMinLength<PlainObject, 1>>(target: TTarget, ...sources: TSources): MergeDeepObjects<[TTarget, ...TSources]> {\n const targetCopy = { ...target };\n for (const source of sources) {\n for (const [key, value] of Object.entries(source)) {\n (targetCopy as PlainObject)[key] = isPlainObject(value) && isPlainObject(targetCopy[key]) \n ? merge(targetCopy[key] as PlainObject, value) \n : value;\n }\n }\n return targetCopy as MergeDeepObjects<[TTarget, ...TSources]>; \n}\n\ntype OptionalPropertyNames<T> =\n { [K in keyof T]-?: (PlainObject extends { [P in K]: T[K] } ? K : never) }[keyof T];\n\ntype SpreadProperties<L, R, K extends keyof L & keyof R> =\n { [P in K]: L[P] | Exclude<R[P], undefined> };\n\ntype Id<T> = T extends infer U ? { [K in keyof U]: U[K] } : never;\n\ntype SpreadTwo<L, R> = Id<\n& Pick<L, Exclude<keyof L, keyof R>>\n& Pick<R, Exclude<keyof R, OptionalPropertyNames<R>>>\n& Pick<R, Exclude<OptionalPropertyNames<R>, keyof L>>\n& SpreadProperties<L, R, OptionalPropertyNames<R> & keyof L>\n>;\n\ntype MergeDeepObjects<A extends readonly [...unknown[]]> = A extends [infer L, ...infer R] ?\n SpreadTwo<L, MergeDeepObjects<R>> : unknown;\n","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @example\n * const object = { 'a': 1, 'b': '2', 'c': 3 }\n *\n * pick(object, ['a', 'c'])\n * // => { 'a': 1, 'c': 3 }\n * @param object - The source object.\n * @param keysToPick - The property paths to pick.\n * @returns Returns the new object.\n */\n\nexport function pick<TInput extends PlainObject, Key extends keyof TInput>(object: TInput, keysToPick: Key[]): Pick<TInput, Key> {\n const result = {} as Pick<TInput, Key>;\n for (const key of keysToPick) {\n result[key] = object[key];\n }\n return result;\n}\n","import type { PlainObject } from '@type/PlainObject.js';\n\nimport { pick } from './pick.js';\n\n/**\n * Omit specified keys from an object\n *\n * @example\n * const obj = {a: 1, b: 2, c: 3};\n * omit(obj, ['a', 'b']);\n * // => {c: 3}\n *\n * @param object - The object to filter\n * @param keysToOmit - The keys to exclude from the returned object\n * @returns - An object without the specified keys\n *\n */\n\nexport function omit<TObj extends PlainObject, Key extends keyof TObj>(object: TObj, keysToOmit: Key[]): Omit<TObj, Key> {\n const keys = Object.keys(object);\n const filteredKeys = keys.filter(key => !keysToOmit.includes(key as Key)) as Exclude<keyof TObj, Key>[];\n\n return pick(object, filteredKeys);\n}","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Sets the value at path of object. If a portion of path doesn’t exist, it’s created.\n * \n * @alpha\n * @example\n * const obj = { a: { b: 2 } };\n * set(obj, 'a.c', 1);\n * // => { a: { b: 2, c: 1 } }\n * \n * @param obj - The object to modify.\n * @param path - The path of the property to set.\n * @param value - The value to set.\n * @returns The modified object.\n */\n\nexport function set<TObj extends PlainObject>(obj: TObj, path: string, value: unknown): TObj {\n const pathParts = path.split(/[.[\\]]/g).filter(x => Boolean(x.trim()));\n\n let currentObj: Record<string | number, unknown> = obj;\n for (let index = 0; index < pathParts.length; index++) {\n const key = pathParts[index];\n\n if (index === pathParts.length - 1) {\n currentObj[key] = value;\n break;\n }\n \n const nextIsNumber = !Number.isNaN(Number.parseInt(pathParts[index + 1]));\n if (currentObj[key] === undefined)\n currentObj[key] = nextIsNumber ? [] : {};\n\n currentObj = currentObj[key] as Record<string | number, unknown>;\n }\n\n return obj;\n}","/**\n * A class for managing a queue of async functions that runs a set number concurrently. \n * If for example you have 10 async functions and you want to run 3 at a time, you can use this class.\n * \n * If the queue is paused, the queue will not run any more async functions until it is resumed.\n * \n * **Methods:**\n * - `add` - adds a async function or array of functions to the queue. Returns a promise that resolves when the added function(s) finish.\n * - `clear` - clears the queue.\n * - `pause` - pauses the queue.\n * - `resume` - resumes the queue. \n * - `getQueue` - returns the current queue.\n * - `isPaused` - returns whether the queue is paused.\n * \n * @example\n * // Create a queue that can run 3 tasks concurrently\n * const queue = new Queue(3);\n * \n * queue.add(() => fetch('https://example.com'));\n * \n * queue.add(async () => {\n * const response = await fetch('https://example.com');\n * return response.json();\n * });\n * \n * // Add an array of tasks to the queue and wait for them to resolve\n * await queue.add([\n * () => fetch('https://apple.com'),\n * () => fetch('https://microsoft.com')\n * ]);\n * // => [Response, Response]\n */\n\nexport class Queue {\n private running = 0;\n private maxConcurrent: number;\n private paused = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private queue: { asyncFn: () => Promise<any>, resolve: (value: any) => void, reject: (reason?: any) => void }[] = [];\n\n /**\n * @constructor\n * @param maxConcurrent - The maximum number of async functions to run concurrently.\n */\n constructor(maxConcurrent: number) {\n this.maxConcurrent = maxConcurrent;\n }\n\n /**\n * Add aync functions or an array of async functions to the queue.\n * \n * @param asyncFn - The aync function(s) to add to the queue.\n * @returns A promise that resolves when the added function(s) finishes.\n */\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn): Promise<TProm>;\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn[]): Promise<TProm[]>;\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn | TAsyncFn[]): Promise<TProm> | Promise<TProm[]> {\n if (Array.isArray(asyncFn)) {\n const promises = asyncFn.map((fn) => this.buildWaitingPromise(fn));\n return Promise.all(promises);\n } else {\n return this.buildWaitingPromise(asyncFn);\n } \n }\n\n private buildWaitingPromise<TProm>(asyncFn: () => Promise<TProm>): Promise<TProm> {\n return new Promise((resolve, reject) => {\n this.queue.push({ asyncFn, resolve, reject });\n this.run();\n });\n } \n\n private run() {\n while (this.queue.length > 0 && this.running < this.maxConcurrent && !this.paused) {\n this.running++;\n const queueElement = this.queue.shift()!;\n void queueElement.asyncFn()\n .then((result) => {\n queueElement.resolve(result);\n }).catch((error) => {\n queueElement.reject(error);\n }).finally(() => {\n this.running--;\n this.run();\n });\n }\n }\n\n /** Removes all the tasks from the queue */\n clear() {\n for (const queueElement of this.queue) {\n queueElement.reject(new Error('Queue cleared'));\n }\n this.queue = [];\n }\n\n /** Pauses the execution of the queue */\n pause() {\n this.paused = true;\n }\n\n /** Resumes the execution of the tasks in the queue */\n resume() {\n this.paused = false;\n this.run();\n }\n\n /** Return the tasks added to the queue */\n getQueue() {\n return this.queue.map((queueElement) => queueElement.asyncFn);\n }\n\n /** Returns whether the queue is paused */\n isPaused() {\n return this.paused;\n }\n\n}\n","/**\n * Similar to [Promise.race](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race?retiredLocale=de) \n * but allows to specify how many promises to wait for.\n *\n * @example\n * const promise1 = Promise.resolve(1);\n * const promise2 = Promise.resolve(2);\n * const promise3 = Promise.resolve(3);\n * \n * const firstThree = await races(3, promise1, promise2, promise3);\n * // => [1, 2, 3]\n * @template TRes - The type of the result of the promises.\n * @param waitFor - The number of promises to wait for.\n * @param promises - The promises to wait for.\n * @returns A promise that resolves an array of the results of the first n promises.\n */\n\nexport function races<TRes>(waitFor: number, ...promises: Promise<TRes>[]): Promise<TRes[]> {\n return new Promise((resolve, reject) => {\n if (promises.length < waitFor)\n waitFor = promises.length;\n\n const results: TRes[] = [];\n let resolved = 0;\n for (const promise of promises) {\n promise.then((value) => {\n results.push(value);\n resolved++;\n if (resolved >= waitFor) {\n resolve(results);\n }\n }).catch((error) => {\n reject(error);\n });\n }\n });\n}","/**\n * Sleeps for the given amount of time.\n *\n * @example\n * await sleep(1000);\n * // => Waits for 1 second.\n * @param ms - Amount of time to sleep in milliseconds.\n * @returns A promise that resolves after the given amount of time.\n */\nexport function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}","/* eslint-disable no-await-in-loop */\nimport { sleep } from '@promise/sleep.js';\n\n/**\n * Retry a function until it succeeds or the maximum number of retries is reached.\n * \n * Default maxRetries: `5`. \n * Default backoff: `2^retries * 100ms` (100, 200, 400, 800, 1600, 3200, ...)\n *\n * @example\n * await retry(() => fetch('https://example.com'));\n * \n * // ---- Advanced example ----\n * const fetchSite = async (url: string) => {\n * const response = await fetch(url);\n * if(!response.ok)\n * throw new Error('Failed to fetch');\n * }\n * \n * const logger = (error: unknown, retry?: number) => console.log(\"Retrying\", retry, error);\n * \n * await retry(() => fetchSite('https://example.com'), { maxRetries: 3, backoff: retries => retries * 1000, onRetry: logger });\n * // => Will retry 3 times with a 1 second delay between each retry. Will log the error and retry number.\n * \n * @param func The function to retry.\n * @param options The options for the retry.\n * @param options.maxRetries The maximum number of retries. Defaults to `5`.\n * @param options.backoff The backoff function to use. Defaults to `2^retries * 100`.\n * @param options.onRetry The function to call when a retry is attempted.\n * @template TRes The type of the result of the function.\n * @returns A promise that resolves when the function succeeds.\n */\n\nexport async function retry<TRes>(\n func: () => Promise<TRes>, \n options?: { \n maxRetries?: number,\n backoff?: ((retries: number) => number),\n onRetry: (error?: unknown, retry?: number) => void\n }\n): Promise<TRes> {\n const backOffFn = options?.backoff ?? (retries => (2 ** retries) * 100);\n const maxRetries = options?.maxRetries ?? 5;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const onRetry = options?.onRetry ?? (() => {});\n let retries = 0;\n let lastError: unknown;\n\n while (retries <= maxRetries) {\n try {\n if (retries > 0)\n onRetry(lastError, retries);\n return await func();\n } catch (error) {\n lastError = error;\n retries++;\n if (retries > maxRetries) {\n throw error;\n }\n await sleep(backOffFn(retries));\n }\n }\n\n throw new Error('Retry terminated without success, this should never happen');\n}","/**\n * Returns a new promise that will reject with an error after a specified timeout. \n *\n * @example\n * try {\n * await timeout(fetch('https://example.com'), 1000);\n * } catch (error) {\n * console.log(error.message);\n * // => 'Promise timed out after 1000ms'\n * }\n * @template TRes - The type of the resolved value.\n * @param promise - The promise to wrap.\n * @param timeout - The timeout in milliseconds.\n * \n * @returns A new promise that will reject with an error after the specified timeout.\n */\nexport function timeout<TRes>(promise: Promise<TRes>, timeout: number): Promise<TRes> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(`Promise timed out after ${timeout}ms`));\n }, timeout);\n \n promise.then(\n (result) => {\n clearTimeout(timeoutId);\n resolve(result);\n },\n (error) => {\n clearTimeout(timeoutId);\n reject(error);\n }\n );\n });\n}","/**\n * Split a string into words. Can deal with camelCase, PascalCase & snake_case.\n * \n * @example\n * splitWords('camelCase')\n * // => ['camel', 'Case']\n * \n * splitWords('PascalCase')\n * // => ['Pascal', 'Case']\n * \n * splitWords('hello_world-123')\n * // => ['hello', 'world', '123']\n * \n * @param str The string to split into words.\n * @returns An array of words.\n */\n\nexport function splitWords(str: string): string[] {\n // Split non-alphanumeric characters with spaces and deal with camel/PascalCase\n const regex = new RegExp(\n '[^\\\\dA-Za-z]' + // match any character that is not a letter or a digit\n '|' + // or\n '(?<=[a-z])' + // lookbehind for a lowercase letter\n '(?=[A-Z])' + // lookahead for an uppercase letter\n '|' + // or\n '(?<=[A-Z])' + // lookbehind for an uppercase letter\n '(?=[A-Z][a-z])' // lookahead for an uppercase letter followed by a lowercase letter\n );\n\n return str.split(regex).filter(Boolean);\n}","/**\n * Deburrs a string by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @example\n * deburr('déjà vu')\n * // => 'deja vu'\n * @param str - The string to deburr.\n * @returns Returns the deburred string.\n */\n\nexport function deburr(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/[^\\u0000-\\u007E]/g, (chr: string) =>\n chr.normalize('NFD').replace(/[\\u0300-\\u036F]/g, ''));\n}\n","import { splitWords } from '@string/splitWords';\n\nimport { deburr } from './deburr.js';\n\n/**\n * Converts `string` to camelCase.\n *\n * @example\n * camelCase('Foo Bar')\n * // => 'fooBar'\n * camelCase('--foo-bar--')\n * // => 'fooBar'\n * camelCase('__FOO_BAR__')\n * // => 'fooBar'\n * @param str - The string to convert.\n * @returns Returns the camel cased string.\n */\n\nexport function camelCase(str: string): string {\n str = deburr(str);\n const words = splitWords(str);\n\n // Capitalize the first letter of each word\n const camelCase = words.map((word: string, index: number) => {\n if (index === 0) {\n return word.toLowerCase();\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return camelCase.join('');\n}\n","/**\n * Converts the first character of a string to upper case and the remaining to lower case.\n *\n * @example\n * capitalize('FRED')\n * // => 'Fred'\n * @param str - The string to capitalize.\n * @returns Returns the capitalized string.\n */\n\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Converts the characters `&`, `<`, `>`, `\"` and `'` in a string to their corresponding HTML entities.\n *\n * @example\n * escapeHtml('fred, barney, & pebbles')\n * // => 'fred, barney, & pebbles'\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escapeHtml(str: string): string {\n const escapeChars: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\\'': ''',\n '\"': '"'\n };\n return str.replace(/[\"&'<>]/g, char => escapeChars[char] || char);\n}\n","/**\n * Escapes the `RegExp` special characters `^`, `$`, `\\`, `.`, `*`, `+`,\n * `?`, `(`, `)`, `[`, `]`, `{`, `}`, and `|` in a string.\n *\n * @example\n * escapeRegExp('[moderndash](https://moderndash.io/)')\n * // => '\\[moderndash\\]\\(https://moderndash\\.io/\\)'\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escapeRegExp(str: string): string {\n return str.replace(/[$()*+.?[\\\\\\]^{|}]/g, '\\\\$&');\n}\n","import { splitWords } from '@string/splitWords';\n\nimport { deburr } from './deburr.js';\n\n/**\n * Converts a string to kebab-case.\n *\n * @example\n * kebabCase('Foo Bar')\n * // => 'foo-bar'\n * kebabCase('fooBar')\n * // => 'foo-bar'\n * kebabCase('__FOO_BAR__')\n * // => 'foo-bar'\n * kebabCase('Héllo World')\n * // => 'hello-world'\n * \n * @param str - The string to convert.\n * @returns Returns the kebab cased string.\n */\n\nexport function kebabCase(str: string): string {\n str = deburr(str);\n const words = splitWords(str);\n let kebabCase = '';\n for (const word of words) {\n kebabCase += word.toLowerCase() + '-';\n }\n return kebabCase.slice(0, -1);\n}\n","import { splitWords } from '@string/splitWords';\n\nimport { deburr } from './deburr.js';\n\n\n/**\n * Converts a string to PascalCase.\n *\n * @example\n * pascalCase('Foo Bar')\n * // => 'FooBar'\n * pascalCase('fooBar')\n * // => 'FooBar'\n * pascalCase('__FOO_BAR__')\n * // => 'FooBar'\n * pascalCase('Héllo World')\n * // => 'HelloWorld'\n * \n * @param str - The string to convert.\n * @returns Returns the pascal cased string.\n */\n\nexport function pascalCase(str: string): string {\n str = deburr(str);\n const words = splitWords(str);\n let pascalCase = '';\n for (const word of words) {\n pascalCase += word.charAt(0).toUpperCase() + word.slice(1);\n }\n return pascalCase;\n}\n","import { splitWords } from '@string/splitWords';\n\nimport { deburr } from './deburr.js';\n\n/**\n * Converts a string to snake_case.\n *\n * @example\n * snakeCase('Foo Bar')\n * // => 'foo_bar'\n * snakeCase('fooBar')\n * // => 'foo_bar'\n * snakeCase('--FOO-BAR--')\n * // => 'foo_bar'\n * snakeCase('foo2bar')\n * // => 'foo_2_bar'\n * snakeCase('Héllo World')\n * // => 'hello_world'\n * @param str - The string to convert.\n * @returns Returns the snake cased string.\n */\n\nexport function snakeCase(str: string): string {\n str = deburr(str);\n const words = splitWords(str);\n let snakeCase = '';\n for (const word of words) {\n if (snakeCase.length > 0) {\n snakeCase += '_';\n }\n snakeCase += word.toLowerCase();\n }\n return snakeCase;\n}\n","import { splitWords } from '@string/splitWords';\n\nimport { deburr } from './deburr.js';\n\n/**\n * Converts a string to Title Case.\n *\n * @example\n * titleCase('--foo-bar--')\n * // => 'Foo Bar'\n * titleCase('fooBar')\n * // => 'Foo Bar'\n * titleCase('__FOO_BAR__')\n * // => 'Foo Bar'\n * titleCase('HélloWorld')\n * // => 'Hello World'\n * @param str - The string to convert.\n * @returns Returns the title cased string.\n */\n\nexport function titleCase(str: string): string {\n str = deburr(str);\n const words = splitWords(str);\n let titleCase = '';\n for (const word of words) {\n titleCase += word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ' ';\n }\n return titleCase.trimEnd();\n}\n","/**\n * Converts the HTML entities `&`, `<`, `>`, `"` and `'`\n * in a string to their corresponding characters.\n *\n * @example\n * unescapeHtml('fred, barney, & pebbles')\n * // => 'fred, barney, & pebbles'\n * @param str - The string to unescape.\n * @returns Returns the unescaped string.\n */\n\nexport function unescapeHtml(str: string): string {\n const entityMap: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': '\\''\n };\n return str.replace(/&(?:amp|lt|gt|quot|#(0+)?39);/g, (entity: string) => entityMap[entity] || entity);\n}\n","/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @example\n * isEmpty(null)\n * // => true\n *\n * isEmpty({})\n * // => true\n *\n * isEmpty(\"\")\n * // => true\n *\n * isEmpty([1, 2, 3])\n * // => false\n *\n * isEmpty('abc')\n * // => false\n *\n * isEmpty({ 'a': 1 })\n * // => false\n * @param value - The value to check.\n * @returns Returns `true` if given vlaue is empty, else `false`.\n */\n\nexport function isEmpty(value: string | object | null | undefined): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n\n if (typeof value === 'string' || Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (value instanceof Map || value instanceof Set) {\n return value.size === 0;\n }\n\n if (typeof value === 'object') {\n return Object.keys(value).length === 0;\n }\n\n return false;\n}\n","/**\n * Checks if given string is a valid URL\n *\n * @example\n * isUrl('https://google.com')\n * // => true\n * isUrl('google.com')\n * // => false\n * @param str - The string to check.\n * @returns Returns `true` if given string is a valid URL, else `false`.\n */\n\nexport function isUrl(str: string): boolean {\n try {\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}"],"mappings":"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","names":["difference","intersection","count","count","retries","timeout","camelCase","kebabCase","pascalCase","snakeCase","titleCase"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1013,17 +1013,6 @@ declare function pascalCase(str: string): string;
|
|
|
1013
1013
|
*/
|
|
1014
1014
|
declare function snakeCase(str: string): string;
|
|
1015
1015
|
|
|
1016
|
-
/**
|
|
1017
|
-
* Removes all special characters from a string.
|
|
1018
|
-
*
|
|
1019
|
-
* @example
|
|
1020
|
-
* stripSpecial('Héllo! World #$%&*!')
|
|
1021
|
-
* // => 'Hello World'
|
|
1022
|
-
* @param str - The string to remove special characters from.
|
|
1023
|
-
* @returns Returns the string with special characters removed.
|
|
1024
|
-
*/
|
|
1025
|
-
declare function stripSpecial(str: string): string;
|
|
1026
|
-
|
|
1027
1016
|
/**
|
|
1028
1017
|
* Converts a string to Title Case.
|
|
1029
1018
|
*
|
|
@@ -1139,4 +1128,4 @@ declare function isPlainObject(value: unknown): value is PlainObject;
|
|
|
1139
1128
|
*/
|
|
1140
1129
|
declare function isUrl(str: string): boolean;
|
|
1141
1130
|
|
|
1142
|
-
export { ArrayMinLength, GenericFunction, PlainObject, Queue, average, camelCase, capitalize, chunk, count, debounce, deburr, decDebounce, decMaxCalls, decMemoize, decMinCalls, decThrottle, difference, dropRightWhile, dropWhile, escapeHtml, escapeRegExp, group, intersection, isEmpty, isEqual, isPlainObject, isUrl, kebabCase, maxCalls, median, memoize, merge, minCalls, omit, pascalCase, pick, races, randomFloat, randomInt, retry, sample, set, shuffle, sleep, snakeCase, sort,
|
|
1131
|
+
export { ArrayMinLength, GenericFunction, PlainObject, Queue, average, camelCase, capitalize, chunk, count, debounce, deburr, decDebounce, decMaxCalls, decMemoize, decMinCalls, decThrottle, difference, dropRightWhile, dropWhile, escapeHtml, escapeRegExp, group, intersection, isEmpty, isEqual, isPlainObject, isUrl, kebabCase, maxCalls, median, memoize, merge, minCalls, omit, pascalCase, pick, races, randomFloat, randomInt, retry, sample, set, shuffle, sleep, snakeCase, sort, sum, takeRightWhile, takeWhile, throttle, timeout, times, titleCase, toDecorator, unescapeHtml, unique };
|
package/dist/index.js
CHANGED
|
@@ -564,14 +564,8 @@ function timeout(promise, timeout2) {
|
|
|
564
564
|
});
|
|
565
565
|
}
|
|
566
566
|
|
|
567
|
-
// src/string/
|
|
568
|
-
function deburr(str) {
|
|
569
|
-
return str.replace(/[^\u0000-\u007E]/g, (chr) => chr.normalize("NFD").replace(/[\u0300-\u036F]/g, ""));
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
// src/helpers/stringModifiers.ts
|
|
567
|
+
// src/string/splitWords.ts
|
|
573
568
|
function splitWords(str) {
|
|
574
|
-
str = deburr(str);
|
|
575
569
|
const regex = new RegExp(
|
|
576
570
|
"[^\\dA-Za-z]|(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])"
|
|
577
571
|
// lookahead for an uppercase letter followed by a lowercase letter
|
|
@@ -579,8 +573,14 @@ function splitWords(str) {
|
|
|
579
573
|
return str.split(regex).filter(Boolean);
|
|
580
574
|
}
|
|
581
575
|
|
|
576
|
+
// src/string/deburr.ts
|
|
577
|
+
function deburr(str) {
|
|
578
|
+
return str.replace(/[^\u0000-\u007E]/g, (chr) => chr.normalize("NFD").replace(/[\u0300-\u036F]/g, ""));
|
|
579
|
+
}
|
|
580
|
+
|
|
582
581
|
// src/string/camelCase.ts
|
|
583
582
|
function camelCase(str) {
|
|
583
|
+
str = deburr(str);
|
|
584
584
|
const words = splitWords(str);
|
|
585
585
|
const camelCase2 = words.map((word, index) => {
|
|
586
586
|
if (index === 0) {
|
|
@@ -615,6 +615,7 @@ function escapeRegExp(str) {
|
|
|
615
615
|
|
|
616
616
|
// src/string/kebabCase.ts
|
|
617
617
|
function kebabCase(str) {
|
|
618
|
+
str = deburr(str);
|
|
618
619
|
const words = splitWords(str);
|
|
619
620
|
let kebabCase2 = "";
|
|
620
621
|
for (const word of words) {
|
|
@@ -625,6 +626,7 @@ function kebabCase(str) {
|
|
|
625
626
|
|
|
626
627
|
// src/string/pascalCase.ts
|
|
627
628
|
function pascalCase(str) {
|
|
629
|
+
str = deburr(str);
|
|
628
630
|
const words = splitWords(str);
|
|
629
631
|
let pascalCase2 = "";
|
|
630
632
|
for (const word of words) {
|
|
@@ -635,6 +637,7 @@ function pascalCase(str) {
|
|
|
635
637
|
|
|
636
638
|
// src/string/snakeCase.ts
|
|
637
639
|
function snakeCase(str) {
|
|
640
|
+
str = deburr(str);
|
|
638
641
|
const words = splitWords(str);
|
|
639
642
|
let snakeCase2 = "";
|
|
640
643
|
for (const word of words) {
|
|
@@ -646,14 +649,9 @@ function snakeCase(str) {
|
|
|
646
649
|
return snakeCase2;
|
|
647
650
|
}
|
|
648
651
|
|
|
649
|
-
// src/string/stripSpecial.ts
|
|
650
|
-
function stripSpecial(str) {
|
|
651
|
-
str = deburr(str);
|
|
652
|
-
return str.replace(/[^\s\w]/gi, "");
|
|
653
|
-
}
|
|
654
|
-
|
|
655
652
|
// src/string/titleCase.ts
|
|
656
653
|
function titleCase(str) {
|
|
654
|
+
str = deburr(str);
|
|
657
655
|
const words = splitWords(str);
|
|
658
656
|
let titleCase2 = "";
|
|
659
657
|
for (const word of words) {
|
|
@@ -744,7 +742,6 @@ export {
|
|
|
744
742
|
sleep,
|
|
745
743
|
snakeCase,
|
|
746
744
|
sort,
|
|
747
|
-
stripSpecial,
|
|
748
745
|
sum,
|
|
749
746
|
takeRightWhile,
|
|
750
747
|
takeWhile,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/array/chunk.ts","../src/array/count.ts","../src/validate/isPlainObject.ts","../src/validate/isEqual.ts","../src/array/difference.ts","../src/array/dropRightWhile.ts","../src/array/dropWhile.ts","../src/array/group.ts","../src/array/intersection.ts","../src/array/sample.ts","../src/array/shuffle.ts","../src/array/sort.ts","../src/array/takeRightWhile.ts","../src/array/takeWhile.ts","../src/array/unique.ts","../src/decorator/toDecorator.ts","../src/function/debounce.ts","../src/decorator/decDebounce.ts","../src/function/maxCalls.ts","../src/decorator/decMaxCalls.ts","../src/function/memoize.ts","../src/decorator/decMemoize.ts","../src/function/minCalls.ts","../src/decorator/decMinCalls.ts","../src/function/throttle.ts","../src/decorator/decThrottle.ts","../src/function/times.ts","../src/number/sum.ts","../src/number/average.ts","../src/number/median.ts","../src/number/randomFloat.ts","../src/number/randomInt.ts","../src/object/merge.ts","../src/object/pick.ts","../src/object/omit.ts","../src/object/set.ts","../src/promise/queue.ts","../src/promise/races.ts","../src/promise/sleep.ts","../src/promise/retry.ts","../src/promise/timeout.ts","../src/string/deburr.ts","../src/helpers/stringModifiers.ts","../src/string/camelCase.ts","../src/string/capitalize.ts","../src/string/escapeHtml.ts","../src/string/escapeRegExp.ts","../src/string/kebabCase.ts","../src/string/pascalCase.ts","../src/string/snakeCase.ts","../src/string/stripSpecial.ts","../src/string/titleCase.ts","../src/string/unescapeHtml.ts","../src/validate/isEmpty.ts","../src/validate/isUrl.ts"],"sourcesContent":["/**\n * Creates an array of elements split into groups the length of size. If array can't be split evenly, the final chunk will be the remaining elements.\n *\n * @example\n * chunk(['a', 'b', 'c', 'd'], 2)\n * // => [['a', 'b'], ['c', 'd']]\n *\n * chunk(['a', 'b', 'c', 'd'], 3)\n * // => [['a', 'b', 'c'], ['d']]\n * @param chunkSize The length of each chunk\n * @param array The array to chunk.\n * @template TElem The type of the array elements.\n * @returns Returns the new array of chunks.\n */\n\nexport function chunk<TElem>(array: TElem[], chunkSize: number): TElem[][] {\n const sizeInteger = Math.trunc(chunkSize);\n if (array.length === 0 || sizeInteger < 1) {\n return [];\n }\n\n const chunkedArray = [];\n let i = 0;\n\n while (i < array.length) {\n chunkedArray.push(array.slice(i, i + sizeInteger));\n i += sizeInteger;\n }\n\n return chunkedArray;\n}\n","/**\n * Creates an object with counts of occurrences of items in the array.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true, age: 36 },\n * { 'user': 'betty', 'active': false, age: 36 },\n * { 'user': 'fred', 'active': true, age: 40 }\n * ]\n *\n * count(users, value => value.active);\n * // => { 'true': 2, 'false': 1 }\n * \n * count(users, value => value.age);\n * // => { '36': 2, '40': 1 }\n * \n * @param criteria The criteria to count by.\n * @param array The array or record to iterate over.\n * @template TElem The type of the array elements.\n * @returns Returns the composed aggregate object.\n */\n\nexport function count<TElem, TKey extends PropertyKey>(array: TElem[], criteria: (value: TElem) => TKey | boolean): Record<TKey, number> {\n const result = {} as Record<TKey, number>;\n for (const value of array) {\n let key = criteria(value);\n if (typeof key === 'boolean')\n key = key.toString() as TKey;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result[key] === undefined)\n result[key] = 1;\n else\n result[key] += 1;\n }\n return result;\n}\n","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Checks if the value is a plain object.\n * \n * @example\n * isPlainObject({}) // => true\n * isPlainObject({ a: 1 }) // => true\n * isPlainObject(null) // => false\n * isPlainObject('1') // => false\n * isPlainObject([]) // => false\n * isPlainObject(new Function()) // => false\n * isPlainObject(new Date()) // => false\n * @param value - The value to check\n * @returns Boolean indicating if the value is a plain object\n */\n\nexport function isPlainObject(value: unknown): value is PlainObject {\n return value?.constructor === Object;\n}","import type { PlainObject } from '@type/PlainObject.js';\n\nimport { isPlainObject } from './isPlainObject.js';\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @example\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n * @param a - The value to compare.\n * @param b - The other value to compare.\n * @returns Returns `true` if the values are equivalent, else `false`.\n */\n\nexport function isEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n \n if (Array.isArray(a) && Array.isArray(b)) {\n return isSameArray(a, b);\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.toString() === b.toString();\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n return isSameObject(a, b);\n }\n\n return false;\n}\n\nfunction isSameObject(a: PlainObject, b: PlainObject) {\n // check if the objects have the same keys\n const keys1 = Object.keys(a);\n const keys2 = Object.keys(b);\n if (!isEqual(keys1, keys2)) return false;\n\n // check if the values of each key in the objects are equal\n for (const key of keys1) {\n if (!isEqual(a[key], b[key])) return false;\n }\n\n // the objects are deeply equal\n return true;\n}\n\nfunction isSameArray(a: unknown[], b: unknown[]) {\n if (a.length !== b.length) return false;\n\n // check if the values of each element in the arrays are equal\n for (const [i, element] of a.entries()) {\n if (!isEqual(element, b[i])) return false;\n }\n\n return true;\n}\n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Create a new array with values from the first array that are not present in the other arrays.\n * \n * Optionally, use a compare function to determine the comparison of elements (default: {@link isEqual}).\n * @example\n * difference([2, 1], [2, 3])\n * // => [1]\n *\n * // ---- Custom compare function ----\n * difference((a, b) => Math.floor(a) === Math.floor(b), [1.2, 3.1], [1.3, 2.4])\n * // => [3.1]\n *\n * // ---- Only compare by id ----\n * const arr1 = [{ id: 1, name: 'Yeet' }, { id: 3, name: 'John' }];\n * const arr2 = [{ id: 3, name: 'Carl' }, { id: 4, name: 'Max' }];\n *\n * difference((a, b) => a.id === b.id, arr1, arr2)\n * // => [{ id: 1, name: 'Yeet' }]\n * @param arrays First array is inspected, others are excluded.\n * @template TElem The type of the array elements.\n * @returns Returns the new array of filtered values.\n */\n\nexport function difference<TElem>(...arrays: ArrayMinLength<TElem[], 2>): TElem[];\nexport function difference<TElem>(arrayOrCompFn: (a: TElem, b: TElem) => boolean, ...arrays: ArrayMinLength<TElem[], 2>): TElem[];\nexport function difference<TElem>(arrayOrCompFn: TElem[] | ((a: TElem, b: TElem) => boolean), ...arrays: ArrayMinLength<TElem[], 2>): TElem[] {\n const withCompareFn = typeof arrayOrCompFn === 'function';\n const compareFN = withCompareFn ? arrayOrCompFn as (a: TElem, b: TElem) => boolean : isEqual;\n\n const [firstArray, ...restArrays] = withCompareFn ? arrays : [arrayOrCompFn, ...arrays];\n const difference: TElem[] = [];\n\n firstArray.forEach(element => {\n if (!restArrays.some(array => array.some(item => compareFN(item, element)))) {\n difference.push(element);\n }\n });\n\n return difference;\n}","/**\n * Creates a slice of `array` excluding elements dropped from the end. \n * Elements are dropped until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * dropRightWhile(users, ({ active }) => active)\n * // => objects for ['barney']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @template TElem The type of the array elements.\n * @returns Returns the slice of `array`.\n */\n\nexport function dropRightWhile<TElem>(array: TElem[], predicate: (value: TElem) => boolean) {\n let i = array.length;\n while (i > 0 && predicate(array[i - 1])) {\n i--;\n }\n return array.slice(0, i);\n}\n","/**\n * Creates a slice of `array` excluding elements dropped from the beginning. \n * Elements are dropped until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * dropWhile(users, ({ active }) => active)\n * // => objects for ['pebbles']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @template TElem The type of the array elements.\n * @returns Returns the slice of `array`.\n */\n\nexport function dropWhile<TElem>(array: TElem[], predicate: (value: TElem) => boolean): TElem[] {\n const index = array.findIndex(x => !predicate(x));\n return array.slice(index === -1 ? array.length : index);\n}\n","/**\n * Creates an object with grouped items in the array.\n *\n * @example\n * group([6.1, 4.2, 6.3], Math.floor)\n * // => { 4: [4.2], 6: [6.1, 6.3] }\n *\n * group([6.1, 4.2, 6.3], value => value > 5)\n * // => { 'false': [4.2], 'true': [6.1, 6.3] }\n * \n * @param collection The array or object to iterate over.\n * @param criteria The criteria to group by.\n * @template TElem The type of the array elements.\n * @returns An object with grouped items.\n */\n\nexport function group<TElem, TKey extends PropertyKey>(array: TElem[], criteria: (value: TElem) => TKey | boolean): Record<TKey, TElem[]> {\n const result = {} as Record<TKey, TElem[]>;\n for (const value of array) {\n let key = criteria(value);\n if (typeof key === 'boolean')\n key = key.toString() as TKey;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n result[key] = result[key] ?? [];\n result[key].push(value);\n }\n return result;\n}\n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Create an array with unique values from all input arrays, with order based on the first array. \n * \n * Optionally, use a compare function for element comparison (default: {@link isEqual}).\n * @example\n * intersection([2, 1], [2, 3])\n * // => [2]\n *\n * // ---- Custom compare function ----\n * const compareFn = (a, b) => Math.floor(a) === Math.floor(b);\n * \n * intersection(compareFn, [1.2, 1.1], [1.3, 2.4])\n * // => [1.2]\n *\n * // ---- Only compare by id ----\n * const arr1 = [{ id: 1, name: 'Yeet' }, { id: 3, name: 'John' }];\n * const arr2 = [{ id: 3, name: 'Carl' }, { id: 4, name: 'Max' }];\n *\n * intersection((a, b) => a.id === b.id, arr1, arr2)\n * // => [{ id: 3, name: 'John' }]\n * @param arrays - The arrays to inspect.\n * @returns Returns the new array of intersecting values.\n */\n\nexport function intersection<TArr>(...arrays: ArrayMinLength<TArr[], 2>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: ArrayMinLength<TArr[], 2>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: ArrayMinLength<TArr[], 2>): TArr[] {\n const withCompareFn = typeof arrayOrCompFn === 'function';\n const compareFN = withCompareFn ? arrayOrCompFn as (a: TArr, b: TArr) => boolean : isEqual;\n\n const [firstArray, ...restArrays] = withCompareFn ? arrays : [arrayOrCompFn, ...arrays];\n const intersection: TArr[] = [];\n\n firstArray.forEach(element => {\n if (restArrays.every(array => array.some(item => compareFN(item, element)))) {\n intersection.push(element);\n }\n });\n\n return intersection;\n}","/**\n * Gets a random element an array. A single element is returned by default. \n * Specify the `multi` parameter to get an array of multiple random elements.\n *\n * If the array is empty, `undefined` is returned. \n * If `multi` is defined it returns an empty array. \n * @example\n * sample([1, 2, 3, 4])\n * // => 2\n *\n * sample([1, 2, 3, 4], 2)\n * // => [3, 1]\n * @param array - The array to sample.\n * @returns Returns the random element.\n */\n\nexport function sample<TArr>(array: TArr[]): TArr | undefined;\nexport function sample<TArr>(array: TArr[], multi: number): TArr[];\nexport function sample<TArr>(array: TArr[], multi?: number): TArr | undefined | TArr[] {\n if (multi === undefined) {\n if (array.length === 0) return undefined;\n return getSingleSample(array);\n }\n\n if (multi && array.length === 0) return [];\n\n // Multiple samples\n const result = new Array<TArr>(multi);\n for (let i = 0; i < multi; i++) {\n result[i] = getSingleSample(array);\n }\n return result;\n}\n\nfunction getSingleSample<TArr>(array: TArr[]): TArr {\n const randomIndex = Math.floor(Math.random() * array.length);\n return array[randomIndex];\n}","/**\n * Creates a new array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @example\n * shuffle([1, 2, 3, 4])\n * // => [4, 1, 3, 2]\n * @param array - The array or object to shuffle.\n * @returns Returns the new shuffled array.\n */\n\nexport function shuffle<TArr>(array: TArr[]): TArr[] {\n const shuffledArray = [...array];\n let currentIndex = shuffledArray.length;\n let temporaryValue: TArr;\n let randomIndex: number;\n\n // While there remain elements to shuffle...\n while (0 !== currentIndex) {\n // Pick a remaining element...\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex -= 1;\n\n // And swap it with the current element.\n temporaryValue = shuffledArray[currentIndex];\n shuffledArray[currentIndex] = shuffledArray[randomIndex];\n shuffledArray[randomIndex] = temporaryValue;\n }\n\n return shuffledArray;\n}\n","\n/**\n * Creates a new sorted array in ascending or descending order based on one or multiple sorting criteria.\n * \n * @example\n * sort([1, 2, 3, 4], { order: 'desc' })\n * // => [4, 3, 2, 1]\n * \n * // --- Sorting by multiple properties ---\n * const array = [{ a: 2, b: 1 }, { a: 1, b: 2 }, { a: 1, b: 1 }];\n * \n * sort(array,\n * { order: 'asc', by: item => item.a },\n * { order: 'desc', by: item => item.b }\n * )\n * // => [{ a: 1, b: 2 }, { a: 1, b: 1 }, { a: 2, b: 1 }]\n * @param array - The array to sort.\n * @param orders - The sorting criteria, one or multiple objects with properties order (either 'asc' or 'desc') and by (iteratee function to sort based on a specific property).\n * @param orders.order - The order to sort in, either 'asc' or 'desc'.\n * @param orders.by - The iteratee function to sort based on a specific property.\n * @returns Returns the sorted array.\n*/\nexport function sort<TInput>(array: TInput[], ...orders: { order?: 'asc' | 'desc', by?: (item: TInput) => number | bigint | Date | string }[]): TInput[] {\n return [...array].sort((a, b) => {\n for (const { order, by } of orders) {\n const aValue = by ? by(a) : a;\n const bValue = by ? by(b) : b;\n if (aValue < bValue) {\n return order === 'desc' ? 1 : -1; \n }\n if (aValue > bValue) {\n return order === 'desc' ? -1 : 1;\n }\n }\n return 0;\n });\n}","/**\n * Creates a slice of `array` with elements taken from the end. \n * Elements are taken until `predicate` returns falsey.\n * \n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * takeRightWhile(({ active }) => active, users)\n * // => objects for ['fred', 'pebbles']\n * @param predicate - The function invoked per iteration.\n * @param array - The array to query.\n * @returns Returns the slice of `array`.\n */\n\nexport function takeRightWhile<TArr>(predicate: (elem: TArr) => boolean, array: TArr[]): TArr[] {\n const result: TArr[] = [];\n\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n result.unshift(array[i]);\n } else {\n break;\n }\n }\n\n return result;\n}\n","/**\n * Creates a slice of `array` with elements taken from the beginning. \n * Elements are taken until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * takeWhile(users, ({ active }) => active)\n * // => objects for ['barney', 'fred']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @returns Returns the slice of `array`.\n */\n\nexport function takeWhile<TArr>(array: TArr[], predicate: (elem: TArr) => boolean): TArr[] {\n const result: TArr[] = [];\n\n for (const element of array) {\n if (predicate(element)) {\n result.push(element);\n } else {\n break;\n }\n }\n\n return result;\n}\n","import { isEqual } from '@validate/isEqual';\n\n/**\n * Creates a duplicate-free version of an array, in which only the first occurrence of each element is kept. \n * The order of result values is determined by the order they occur in the array.\n *\n * An compare function is optinal to specify how the array is compared (default: {@link isEqual}).\n * \n * @example\n * unique([2, 1, 2])\n * // => [2, 1]\n *\n * const users = [\n * { id: 1, name: 'a' },\n * { id: 1, name: 'c' }\n * ]\n *\n * unique(users, (a, b) => a.id === b.id)\n * // => [{ id: 1, name: 'a' }]\n *\n *\n * @param array - The array to inspect.\n * @param iteratee - The iteratee invoked per element.\n * @returns Returns the new duplicate free array.\n */\n\nexport function unique<TInput>(array: TInput[], compareFn = (a: TInput, b: TInput) => isEqual(a, b)): TInput[] {\n return array.filter((value, index, self) => {\n return self.findIndex(otherValue => compareFn(value, otherValue)) === index;\n });\n}\n","import type { GenericFunction } from '@type/GenericFunction.js';\n\ntype Tail<T extends unknown[]> = T extends [infer _Head, ...infer Tail] ? Tail : never;\n\n/**\n * Transforms a function that takes a function as first argument into a decorator function.\n * \n * @example\n * ```typescript\n * function log(func: Function, message: string) {\n * return function (...args: unknown[]) {\n * console.log(message);\n * return func(...args);\n * };\n * }\n * \n * const logger = toDecorator(log);\n * \n * class TestClass {\n * @logger(\"Hello world!\")\n * testMethod() {\n * return 1; \n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(); \n * // => Log \"Hello World\" and return 1\n * ```\n * @param func - The function to transform.\n * @returns A decorator function that can be used to decorate a method.\n */\n\nexport function toDecorator<TFunc extends GenericFunction<TFunc>>(func: TFunc) {\n return function (...args: Tail<Parameters<TFunc>>) {\n return function (target: unknown, key: string, descriptor: PropertyDescriptor) {\n const creatorArgs = [descriptor.value, ...args] as Parameters<TFunc>;\n descriptor.value = func(...creatorArgs);\n };\n };\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a debounced version of a function. Only calling it after a specified amount of time has passed without any new calls.\n * \n * **Methods:** \n * - `cancel` will cancel the next invocation of the debounced function. \n * - `flush` will immediately invoke the debounced function and cancel any pending invocations. \n * \n * This function can be used as a decorator with {@link decDebounce}.\n * \n * @example\n * const sayHello = (name: string) => console.log(`Hello, ${name}!`);\n * const debouncedSayHello = debounce(sayHello, 200);\n * \n * debouncedSayHello(\"John\");\n * debouncedSayHello(\"Jane\");\n * // => Only the second invocation of `debouncedSayHello` is executed, after a delay of 200ms.\n * @param func - The function to debounce.\n * @param wait - The number of milliseconds to wait before invoking `func`.\n * @returns A debounced version of `func` with `cancel` and `flush` methods.\n */\n\nexport function debounce<TFunc extends GenericFunction<TFunc>>(func: TFunc, wait: number): TFunc & {\n cancel: () => void;\n flush: () => void;\n} {\n let timeoutId: NodeJS.Timeout | undefined;\n const debounced = function (this: unknown, ...args: Parameters<TFunc>) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func.apply(this, args), wait);\n };\n\n /** Cancels the next invocation of the debounced function. */\n debounced.cancel = function () {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n };\n\n /** Immediately invokes the debounced function and cancels any pending invocations. */\n debounced.flush = function (this: unknown, ...args: Parameters<TFunc>) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n func.apply(this, args);\n };\n\n return debounced as TFunc & { cancel: () => void; flush: () => void };\n}","import { toDecorator } from '@decorator/toDecorator.js';\nimport { debounce } from '@function/debounce.js';\n\n/**\n * Debouces the decorated function. Only calling it after a specified amount of time has passed without any new calls.\n * \n * Look at {@link debounce} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decDebounce(1000)\n * testMethod(str: string) {\n * console.log(\"Debounced:\", str);\n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(\"Hello\");\n * instance.testMethod(\"World\");\n * // => Only the second invocation of `debouncedSayHello` is executed, after a delay of 1000ms.\n * ```\n * @param wait - Milliseconds to wait before invoking the decorated function after the last invocation.\n */\n\nexport function decDebounce(wait: number) {\n return toDecorator(debounce)(wait);\n}\n","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a function that invokes the given function as long as it's called `<= n` times.\n * \n * Subsequent calls to the created function return the result of the last `func` invocation.\n *\n * This function can be used as a decorator with {@link decMaxCalls}.\n * @example\n * let count = 0;\n * const addCount = () => ++count;\n *\n * // Allow addCount to be invoked twice.\n * const limitAddCount = maxCalls(addCount, 2)\n *\n * limitAddCount() // => 1\n * limitAddCount() // => 2\n * limitAddCount() // => 2\n * // => `limitAddCount` is invoked twice and the result is cached.\n * @param n - The number of calls before the cached result is returned.\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function maxCalls<TFunc extends GenericFunction<TFunc>>(func: TFunc, n: number): TFunc {\n let count = 0;\n let result: ReturnType<TFunc>;\n return function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n if (count < n) {\n count += 1;\n result = func.apply(this, args);\n }\n return result;\n } as TFunc;\n}\n","import { toDecorator } from '@decorator/toDecorator.js';\nimport { maxCalls } from '@function/maxCalls.js';\n\n/**\n * Only invokes the decorated function as long as it's called `<= n` times. \n * Subsequent calls to the decorated function return the result of the last invocation.\n * \n * Look at {@link maxCalls} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * private count = 0;\n * @decMaxCalls(2)\n * testMethod() {\n * return ++this.count;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(); // => 1 \n * instance.testMethod(); // => 2\n * instance.testMethod(); // => 2\n * ```\n * @param n - The number of calls before the cached result is returned.\n */\n\nexport function decMaxCalls(n: number) {\n return toDecorator(maxCalls)(n);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\nconst defaultResolver = (...args: unknown[]) => JSON.stringify(args);\n\n/**\n * Creates a function that caches the result of `func`.\n * \n * The cache key is either determined by the provided `resolver` or by the arguments used in the cached function.\n *\n * The `cache` property is exposed on the cached function. It is an instance of `Map` and can be used to clear or inspect the cache. \n * The cache property can be replaced by a custom cache as long as it implements the `Map` interface.\n *\n * **Options:**\n * - `resolver` A function that determines the cache key for storing the result based on the arguments provided.\n * - `ttl` sets the time to live for the cache in milliseconds. After `ttl` milliseconds, the next call to the memoized function will result in a cache miss.\n * \n * This function can be used as a decorator with {@link decMemoize}.\n * \n * @example\n * ```typescript\n * function fibonacci(n: number) {\n * if (n <= 1) return n;\n * return fibonacci(n - 1) + fibonacci(n - 2);\n * }\n *\n * const memoizedFib = memoize(fibonacci, { ttl: 1000 })\n * \n * memoizedFib(40) // => 102334155\n * memoizedFib(40) // => 102334155 (cache hit)\n * setTimeout(() => memoizedFib(40), 1000) // => 102334155 (cache miss)\n * \n * // Cached values are exposed as the `cache` property.\n * memoizedFib.cache.get(\"40\") // => [value, timestamp]\n * memoizedFib.cache.set(\"40\", [1234, Date.now()])\n * memoizedFib.cache.clear()\n * \n * // This is the default way to create cache keys.\n * const defaultResolver = (...args: unknown[]) => JSON.stringify(args)\n * ```\n * @param func - The function to have its output memoized.\n * @param options - The options object with optional `resolver` and `ttl` parameters.\n * @param options.resolver - A function that determines the cache key for storing the result based on the arguments provided.\n * @param options.ttl - The time to live for the cache in milliseconds.\n * @template TFunc The type of the function to memoize.\n * @template Cache The type of the cache storage.\n * @returns Returns the new memoized function.\n */\n\nexport function memoize<TFunc extends GenericFunction<TFunc>, Cache extends Map<string, [ReturnType<TFunc>, number]>>(\n func: TFunc, options: { resolver?: (...args: Parameters<TFunc>) => string, ttl?: number; } = {}\n): TFunc & { cache: Cache } {\n const resolver = options.resolver ?? defaultResolver;\n const ttl = options.ttl;\n const cache = new Map() as Cache;\n\n const memoizedFunc = function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const key = resolver(...args);\n if (cache.has(key)) {\n const [cacheResult, cacheTime] = cache.get(key)!;\n if (ttl === undefined || (Date.now() - cacheTime < ttl)) {\n return cacheResult;\n }\n }\n const result = func.apply(this, args);\n cache.set(key, [result, Date.now()]);\n return result;\n };\n\n memoizedFunc.cache = cache;\n return memoizedFunc as TFunc & { cache: Cache };\n} ","import { toDecorator } from '@decorator/toDecorator.js';\nimport { memoize } from '@function/memoize.js';\n\n/**\n * Memoizes the decorated function. \n * The cache key is either determined by the provided resolver or by the arguments used in the memoized function.\n * \n * **Options:**\n * - `resolver` A function that determines the cache key for storing the result based on the arguments provided.\n * - `ttl` sets the time to live for the cache in milliseconds. After `ttl` milliseconds, the next call to the memoized function will result in a cache miss.\n * \n * Look at {@link memoize} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decMemoize({ ttl: 1000 })\n * testMethod(a: number, b: number) {\n * return a + b;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(1, 2); // => 3\n * instance.testMethod(1, 2); // => 3 (cached)\n * \n * // After 1 second:\n * instance.testMethod(1, 2); // => 3 (cache miss)\n * ```\n * @param options - The options object.\n * @param options.resolver - A function that determines the cache key for storing the result based on the arguments provided.\n * @param options.ttl - The time to live for the cache in milliseconds.\n */\n\nexport function decMemoize(options: Parameters<typeof memoize>[1] = {}) {\n return toDecorator(memoize)(options);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a function that invokes the given function once it's called more than `n` times. \n * Returns undefined until the minimum call count is reached.\n * \n * This function can be used as a decorator with {@link decMinCalls}.\n * @example\n * const caution = () => console.log(\"Caution!\");\n * const limitedCaution = minCalls(caution, 2);\n *\n * limitedCaution()\n * limitedCaution()\n * limitedCaution()\n * // => `caution` is invoked on the third call.\n * @param n The number of calls before the given function is invoked.\n * @param func The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function minCalls<TFunc extends GenericFunction<TFunc>>(func: TFunc, n: number) {\n let count = 1;\n return function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> | undefined {\n if (count > n) {\n return func.apply(this, args);\n }\n count += 1;\n };\n}","import { toDecorator } from '@decorator/toDecorator.js';\nimport { minCalls } from '@function/minCalls.js';\n\n/** \n * Only invokes the decorated function after it's called more than `n` times.\n * \n * Look at {@link minCalls} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * @example\n * ```typescript\n * class TestClass {\n * @decMinCalls(2)\n * testMethod() {\n * return 1;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(); // => undefined\n * instance.testMethod(); // => undefined\n * instance.testMethod(); // => 1\n * ```\n * @param n The number of calls before the decorated function is invoked.\n */\n\nexport function decMinCalls(n: number) {\n return toDecorator(minCalls)(n);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Generates a function that invokes the given function at most once per every `wait` milliseconds.\n * \n * This function can be used as a decorator with {@link decThrottle}.\n * @example\n * const throttled = throttle(() => console.log(\"Throttled!\"), 1000);\n * \n * throttled();\n * throttled();\n * // => \"Throttled!\" is logged once per second.\n * @param func - The function to throttle.\n * @param wait - The number of milliseconds to throttle invocations to.\n * @returns Returns the new throttled function.\n */\n\n\nexport function throttle<TFunc extends GenericFunction<TFunc>>(func: TFunc, wait: number): TFunc {\n let inThrottle = false;\n return function (this: unknown, ...args: Parameters<TFunc>) {\n if (!inThrottle) {\n func.apply(this, args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), wait);\n }\n } as TFunc;\n}\n \n","import { toDecorator } from '@decorator/toDecorator.js';\nimport { throttle } from '@function/throttle.js';\n\n/**\n * The decorated function is invoked at most once per every `wait` milliseconds.\n * \n * Look at {@link throttle} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decThrottle(1000)\n * testMethod() {\n * console.log(\"Throttled!\");\n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(); // => \"Throttled!\" is logged once per second.\n * instance.testMethod(); // nothing happens\n * ```\n * @param wait - The number of milliseconds to wait between invocations.\n */\n\nexport function decThrottle(wait: number) {\n return toDecorator(throttle)(wait);\n}","/**\n * Invokes a function `n` times, returning an array of the results of\n * each invocation.\n * \n * @example\n * times(index => console.log(\"Run\", index), 3)\n * // => \"Run 0\" | \"Run 1\" | \"Run 2\"\n * times(Math.random, 3)\n * // => [0.123, 0.456, 0.789]\n * times(() => 0, 4)\n * // => [0, 0, 0, 0]\n * @param n - The number of times to invoke `func`.\n * @param func - The function invoked per iteration.\n * @returns Returns an array of results.\n */\n\nexport function times<TInput>(func: (index: number) => TInput, n: number): TInput[] {\n const result: TInput[] = [];\n for (let i = 0; i < n; i++) {\n result.push(func(i));\n }\n return result;\n}","/**\n * Calculates the sum of an array of numbers.\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * sum([1, 2, 3, 4, 5]) // => 15\n * \n * @param numbers - The input array of numbers\n * @returns The sum of the input array \n */\n\nexport function sum(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n return numbers.reduce((total, current) => total + current, 0);\n}","import { sum } from '@number/sum.js';\n\n/**\n * Calculates the average of an array of numbers\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * average([1, 2, 3, 4, 5]) // => 3\n * \n * @param numbers - The input array of numbers\n * @returns The average of the input array, or NaN if the input array is empty\n */\n\nexport function average(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n return sum(numbers) / numbers.length;\n}","/**\n * Calculates the median of an array of numbers\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * median([1, 2, 3, 4, 5]) // => 3\n * median([1, 2, 3, 4, 5, 6]) // => 3.5\n * \n * @param numbers - The input array of numbers\n * @returns The median of the input array\n */\n\nexport function median(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n const sortedArray = [...numbers].sort((a, b) => a - b);\n const mid = Math.floor(sortedArray.length / 2);\n return sortedArray.length % 2 === 0 ? ((sortedArray[mid - 1] + sortedArray[mid]) / 2) : sortedArray[mid];\n}","/**\n * Generates a random float between two given numbers, including those numbers.\n * \n * It uses `crypto.getRandomValues` to generate the random number.\n * @example\n * randomFloat(1, 10) // => 1.123456789\n * \n * @param min - The smallest float that can be generated.\n * @param max - The largest float that can be generated.\n * \n * @returns A random float between `min` and `max`, including `min` and `max`.\n */\n\nexport function randomFloat(min: number, max: number): number {\n if (min > max)\n throw new Error('min must be less than or equal to max');\n const range = max - min;\n const randomBuffer = new Uint32Array(1);\n crypto.getRandomValues(randomBuffer);\n const random = randomBuffer[0] / 0xFFFFFFFF;\n return min + (random * range);\n}","\n/**\n * Generates a random integer between two given numbers, including those numbers.\n * \n * It uses `crypto.getRandomValues` to generate the random number.\n * @example\n * randomInt(1, 10) // => 5\n * \n * @param min - The smallest integer that can be generated.\n * @param max - The largest integer that can be generated.\n * \n * @returns A random integer between `min` and `max`, including `min` and `max`.\n */\n\nexport function randomInt(min: number, max: number): number {\n if (min > max)\n throw new Error('min must be less than or equal to max');\n const range = max - min + 1;\n const randomBuffer = new Uint32Array(1);\n crypto.getRandomValues(randomBuffer);\n return min + (randomBuffer[0] % range);\n}\n \n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\nimport type { PlainObject } from '@type/PlainObject.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * This function combines two or more objects into a single new object. Arrays and other types are overwritten.\n * \n * @example\n * // ---- Nested objects are merged ----\n * merge({ a: 1 }, { b: 2 }, { c: 3, d: { e: 4 } }) \n * // => { a: 1, b: 2, c: 3, d: { e: 4 } }\n *\n * // ---- Other types are overwritten ----\n * merge({ a: [1, 2] }, { a: [3, 4] })\n * // => { a: [3, 4] }\n * \n * merge({ a: 1 }, { a: \"Yes\" })\n * // => { a: \"Yes\" }\n * @param target - The target object\n * @param sources - The source objects\n * @returns A new merged object\n */\n\nexport function merge<TTarget extends PlainObject, TSources extends ArrayMinLength<PlainObject, 1>>(target: TTarget, ...sources: TSources): MergeDeepObjects<[TTarget, ...TSources]> {\n const targetCopy = { ...target };\n for (const source of sources) {\n for (const [key, value] of Object.entries(source)) {\n (targetCopy as PlainObject)[key] = isPlainObject(value) && isPlainObject(targetCopy[key]) \n ? merge(targetCopy[key] as PlainObject, value) \n : value;\n }\n }\n return targetCopy as MergeDeepObjects<[TTarget, ...TSources]>; \n}\n\ntype OptionalPropertyNames<T> =\n { [K in keyof T]-?: (PlainObject extends { [P in K]: T[K] } ? K : never) }[keyof T];\n\ntype SpreadProperties<L, R, K extends keyof L & keyof R> =\n { [P in K]: L[P] | Exclude<R[P], undefined> };\n\ntype Id<T> = T extends infer U ? { [K in keyof U]: U[K] } : never;\n\ntype SpreadTwo<L, R> = Id<\n& Pick<L, Exclude<keyof L, keyof R>>\n& Pick<R, Exclude<keyof R, OptionalPropertyNames<R>>>\n& Pick<R, Exclude<OptionalPropertyNames<R>, keyof L>>\n& SpreadProperties<L, R, OptionalPropertyNames<R> & keyof L>\n>;\n\ntype MergeDeepObjects<A extends readonly [...unknown[]]> = A extends [infer L, ...infer R] ?\n SpreadTwo<L, MergeDeepObjects<R>> : unknown;\n","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @example\n * const object = { 'a': 1, 'b': '2', 'c': 3 }\n *\n * pick(object, ['a', 'c'])\n * // => { 'a': 1, 'c': 3 }\n * @param object - The source object.\n * @param keysToPick - The property paths to pick.\n * @returns Returns the new object.\n */\n\nexport function pick<TInput extends PlainObject, Key extends keyof TInput>(object: TInput, keysToPick: Key[]): Pick<TInput, Key> {\n const result = {} as Pick<TInput, Key>;\n for (const key of keysToPick) {\n result[key] = object[key];\n }\n return result;\n}\n","import type { PlainObject } from '@type/PlainObject.js';\n\nimport { pick } from './pick.js';\n\n/**\n * Omit specified keys from an object\n *\n * @example\n * const obj = {a: 1, b: 2, c: 3};\n * omit(obj, ['a', 'b']);\n * // => {c: 3}\n *\n * @param object - The object to filter\n * @param keysToOmit - The keys to exclude from the returned object\n * @returns - An object without the specified keys\n *\n */\n\nexport function omit<TObj extends PlainObject, Key extends keyof TObj>(object: TObj, keysToOmit: Key[]): Omit<TObj, Key> {\n const keys = Object.keys(object);\n const filteredKeys = keys.filter(key => !keysToOmit.includes(key as Key)) as Exclude<keyof TObj, Key>[];\n\n return pick(object, filteredKeys);\n}","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Sets the value at path of object. If a portion of path doesn’t exist, it’s created.\n * \n * @alpha\n * @example\n * const obj = { a: { b: 2 } };\n * set(obj, 'a.c', 1);\n * // => { a: { b: 2, c: 1 } }\n * \n * @param obj - The object to modify.\n * @param path - The path of the property to set.\n * @param value - The value to set.\n * @returns The modified object.\n */\n\nexport function set<TObj extends PlainObject>(obj: TObj, path: string, value: unknown): TObj {\n const pathParts = path.split(/[.[\\]]/g).filter(x => Boolean(x.trim()));\n\n let currentObj: Record<string | number, unknown> = obj;\n for (let index = 0; index < pathParts.length; index++) {\n const key = pathParts[index];\n\n if (index === pathParts.length - 1) {\n currentObj[key] = value;\n break;\n }\n \n const nextIsNumber = !Number.isNaN(Number.parseInt(pathParts[index + 1]));\n if (currentObj[key] === undefined)\n currentObj[key] = nextIsNumber ? [] : {};\n\n currentObj = currentObj[key] as Record<string | number, unknown>;\n }\n\n return obj;\n}","/**\n * A class for managing a queue of async functions that runs a set number concurrently. \n * If for example you have 10 async functions and you want to run 3 at a time, you can use this class.\n * \n * If the queue is paused, the queue will not run any more async functions until it is resumed.\n * \n * **Methods:**\n * - `add` - adds a async function or array of functions to the queue. Returns a promise that resolves when the added function(s) finish.\n * - `clear` - clears the queue.\n * - `pause` - pauses the queue.\n * - `resume` - resumes the queue. \n * - `getQueue` - returns the current queue.\n * - `isPaused` - returns whether the queue is paused.\n * \n * @example\n * // Create a queue that can run 3 tasks concurrently\n * const queue = new Queue(3);\n * \n * queue.add(() => fetch('https://example.com'));\n * \n * queue.add(async () => {\n * const response = await fetch('https://example.com');\n * return response.json();\n * });\n * \n * // Add an array of tasks to the queue and wait for them to resolve\n * await queue.add([\n * () => fetch('https://apple.com'),\n * () => fetch('https://microsoft.com')\n * ]);\n * // => [Response, Response]\n */\n\nexport class Queue {\n private running = 0;\n private maxConcurrent: number;\n private paused = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private queue: { asyncFn: () => Promise<any>, resolve: (value: any) => void, reject: (reason?: any) => void }[] = [];\n\n /**\n * @constructor\n * @param maxConcurrent - The maximum number of async functions to run concurrently.\n */\n constructor(maxConcurrent: number) {\n this.maxConcurrent = maxConcurrent;\n }\n\n /**\n * Add aync functions or an array of async functions to the queue.\n * \n * @param asyncFn - The aync function(s) to add to the queue.\n * @returns A promise that resolves when the added function(s) finishes.\n */\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn): Promise<TProm>;\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn[]): Promise<TProm[]>;\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn | TAsyncFn[]): Promise<TProm> | Promise<TProm[]> {\n if (Array.isArray(asyncFn)) {\n const promises = asyncFn.map((fn) => this.buildWaitingPromise(fn));\n return Promise.all(promises);\n } else {\n return this.buildWaitingPromise(asyncFn);\n } \n }\n\n private buildWaitingPromise<TProm>(asyncFn: () => Promise<TProm>): Promise<TProm> {\n return new Promise((resolve, reject) => {\n this.queue.push({ asyncFn, resolve, reject });\n this.run();\n });\n } \n\n private run() {\n while (this.queue.length > 0 && this.running < this.maxConcurrent && !this.paused) {\n this.running++;\n const queueElement = this.queue.shift()!;\n void queueElement.asyncFn()\n .then((result) => {\n queueElement.resolve(result);\n }).catch((error) => {\n queueElement.reject(error);\n }).finally(() => {\n this.running--;\n this.run();\n });\n }\n }\n\n /** Removes all the tasks from the queue */\n clear() {\n for (const queueElement of this.queue) {\n queueElement.reject(new Error('Queue cleared'));\n }\n this.queue = [];\n }\n\n /** Pauses the execution of the queue */\n pause() {\n this.paused = true;\n }\n\n /** Resumes the execution of the tasks in the queue */\n resume() {\n this.paused = false;\n this.run();\n }\n\n /** Return the tasks added to the queue */\n getQueue() {\n return this.queue.map((queueElement) => queueElement.asyncFn);\n }\n\n /** Returns whether the queue is paused */\n isPaused() {\n return this.paused;\n }\n\n}\n","/**\n * Similar to [Promise.race](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race?retiredLocale=de) \n * but allows to specify how many promises to wait for.\n *\n * @example\n * const promise1 = Promise.resolve(1);\n * const promise2 = Promise.resolve(2);\n * const promise3 = Promise.resolve(3);\n * \n * const firstThree = await races(3, promise1, promise2, promise3);\n * // => [1, 2, 3]\n * @template TRes - The type of the result of the promises.\n * @param waitFor - The number of promises to wait for.\n * @param promises - The promises to wait for.\n * @returns A promise that resolves an array of the results of the first n promises.\n */\n\nexport function races<TRes>(waitFor: number, ...promises: Promise<TRes>[]): Promise<TRes[]> {\n return new Promise((resolve, reject) => {\n if (promises.length < waitFor)\n waitFor = promises.length;\n\n const results: TRes[] = [];\n let resolved = 0;\n for (const promise of promises) {\n promise.then((value) => {\n results.push(value);\n resolved++;\n if (resolved >= waitFor) {\n resolve(results);\n }\n }).catch((error) => {\n reject(error);\n });\n }\n });\n}","/**\n * Sleeps for the given amount of time.\n *\n * @example\n * await sleep(1000);\n * // => Waits for 1 second.\n * @param ms - Amount of time to sleep in milliseconds.\n * @returns A promise that resolves after the given amount of time.\n */\nexport function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}","/* eslint-disable no-await-in-loop */\nimport { sleep } from '@promise/sleep.js';\n\n/**\n * Retry a function until it succeeds or the maximum number of retries is reached.\n * \n * Default maxRetries: `5`. \n * Default backoff: `2^retries * 100ms` (100, 200, 400, 800, 1600, 3200, ...)\n *\n * @example\n * await retry(() => fetch('https://example.com'));\n * \n * // ---- Advanced example ----\n * const fetchSite = async (url: string) => {\n * const response = await fetch(url);\n * if(!response.ok)\n * throw new Error('Failed to fetch');\n * }\n * \n * const logger = (error: unknown, retry?: number) => console.log(\"Retrying\", retry, error);\n * \n * await retry(() => fetchSite('https://example.com'), { maxRetries: 3, backoff: retries => retries * 1000, onRetry: logger });\n * // => Will retry 3 times with a 1 second delay between each retry. Will log the error and retry number.\n * \n * @param func The function to retry.\n * @param options The options for the retry.\n * @param options.maxRetries The maximum number of retries. Defaults to `5`.\n * @param options.backoff The backoff function to use. Defaults to `2^retries * 100`.\n * @param options.onRetry The function to call when a retry is attempted.\n * @template TRes The type of the result of the function.\n * @returns A promise that resolves when the function succeeds.\n */\n\nexport async function retry<TRes>(\n func: () => Promise<TRes>, \n options?: { \n maxRetries?: number,\n backoff?: ((retries: number) => number),\n onRetry: (error?: unknown, retry?: number) => void\n }\n): Promise<TRes> {\n const backOffFn = options?.backoff ?? (retries => (2 ** retries) * 100);\n const maxRetries = options?.maxRetries ?? 5;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const onRetry = options?.onRetry ?? (() => {});\n let retries = 0;\n let lastError: unknown;\n\n while (retries <= maxRetries) {\n try {\n if (retries > 0)\n onRetry(lastError, retries);\n return await func();\n } catch (error) {\n lastError = error;\n retries++;\n if (retries > maxRetries) {\n throw error;\n }\n await sleep(backOffFn(retries));\n }\n }\n\n throw new Error('Retry terminated without success, this should never happen');\n}","/**\n * Returns a new promise that will reject with an error after a specified timeout. \n *\n * @example\n * try {\n * await timeout(fetch('https://example.com'), 1000);\n * } catch (error) {\n * console.log(error.message);\n * // => 'Promise timed out after 1000ms'\n * }\n * @template TRes - The type of the resolved value.\n * @param promise - The promise to wrap.\n * @param timeout - The timeout in milliseconds.\n * \n * @returns A new promise that will reject with an error after the specified timeout.\n */\nexport function timeout<TRes>(promise: Promise<TRes>, timeout: number): Promise<TRes> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(`Promise timed out after ${timeout}ms`));\n }, timeout);\n \n promise.then(\n (result) => {\n clearTimeout(timeoutId);\n resolve(result);\n },\n (error) => {\n clearTimeout(timeoutId);\n reject(error);\n }\n );\n });\n}","/**\n * Deburrs a string by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @example\n * deburr('déjà vu')\n * // => 'deja vu'\n * @param str - The string to deburr.\n * @returns Returns the deburred string.\n */\n\nexport function deburr(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/[^\\u0000-\\u007E]/g, (chr: string) =>\n chr.normalize('NFD').replace(/[\\u0300-\\u036F]/g, ''));\n}\n","import { deburr } from '@string/deburr';\n\nexport function splitWords(str: string): string[] {\n str = deburr(str);\n\n // Split non-alphanumeric characters with spaces and deal with camel/PascalCase\n const regex = new RegExp(\n '[^\\\\dA-Za-z]' + // match any character that is not a letter or a digit\n '|' + // or\n '(?<=[a-z])' + // lookbehind for a lowercase letter\n '(?=[A-Z])' + // lookahead for an uppercase letter\n '|' + // or\n '(?<=[A-Z])' + // lookbehind for an uppercase letter\n '(?=[A-Z][a-z])' // lookahead for an uppercase letter followed by a lowercase letter\n );\n\n return str.split(regex).filter(Boolean);\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts `string` to camelCase.\n *\n * @example\n * camelCase('Foo Bar')\n * // => 'fooBar'\n * camelCase('--foo-bar--')\n * // => 'fooBar'\n * camelCase('__FOO_BAR__')\n * // => 'fooBar'\n * @param str - The string to convert.\n * @returns Returns the camel cased string.\n */\n\nexport function camelCase(str: string): string {\n const words = splitWords(str);\n\n // Capitalize the first letter of each word\n const camelCase = words.map((word, index) => {\n if (index === 0) {\n return word.toLowerCase();\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return camelCase.join('');\n}\n","/**\n * Converts the first character of a string to upper case and the remaining to lower case.\n *\n * @example\n * capitalize('FRED')\n * // => 'Fred'\n * @param str - The string to capitalize.\n * @returns Returns the capitalized string.\n */\n\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Converts the characters `&`, `<`, `>`, `\"` and `'` in a string to their corresponding HTML entities.\n *\n * @example\n * escapeHtml('fred, barney, & pebbles')\n * // => 'fred, barney, & pebbles'\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escapeHtml(str: string): string {\n const escapeChars: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\\'': ''',\n '\"': '"'\n };\n return str.replace(/[\"&'<>]/g, char => escapeChars[char] || char);\n}\n","/**\n * Escapes the `RegExp` special characters `^`, `$`, `\\`, `.`, `*`, `+`,\n * `?`, `(`, `)`, `[`, `]`, `{`, `}`, and `|` in a string.\n *\n * @example\n * escapeRegExp('[moderndash](https://moderndash.io/)')\n * // => '\\[moderndash\\]\\(https://moderndash\\.io/\\)'\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escapeRegExp(str: string): string {\n return str.replace(/[$()*+.?[\\\\\\]^{|}]/g, '\\\\$&');\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to kebab-case.\n *\n * @example\n * kebabCase('Foo Bar')\n * // => 'foo-bar'\n * kebabCase('fooBar')\n * // => 'foo-bar'\n * kebabCase('__FOO_BAR__')\n * // => 'foo-bar'\n * kebabCase('Héllo World')\n * // => 'hello-world'\n * \n * @param str - The string to convert.\n * @returns Returns the kebab cased string.\n */\n\nexport function kebabCase(str: string): string {\n const words = splitWords(str);\n let kebabCase = '';\n for (const word of words) {\n kebabCase += word.toLowerCase() + '-';\n }\n return kebabCase.slice(0, -1);\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n\n/**\n * Converts a string to PascalCase.\n *\n * @example\n * pascalCase('Foo Bar')\n * // => 'FooBar'\n * pascalCase('fooBar')\n * // => 'FooBar'\n * pascalCase('__FOO_BAR__')\n * // => 'FooBar'\n * pascalCase('Héllo World')\n * // => 'HelloWorld'\n * \n * @param str - The string to convert.\n * @returns Returns the pascal cased string.\n */\n\nexport function pascalCase(str: string): string {\n const words = splitWords(str);\n let pascalCase = '';\n for (const word of words) {\n pascalCase += word.charAt(0).toUpperCase() + word.slice(1);\n }\n return pascalCase;\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to snake_case.\n *\n * @example\n * snakeCase('Foo Bar')\n * // => 'foo_bar'\n * snakeCase('fooBar')\n * // => 'foo_bar'\n * snakeCase('--FOO-BAR--')\n * // => 'foo_bar'\n * snakeCase('foo2bar')\n * // => 'foo_2_bar'\n * snakeCase('Héllo World')\n * // => 'hello_world'\n * @param str - The string to convert.\n * @returns Returns the snake cased string.\n */\n\nexport function snakeCase(str: string): string {\n const words = splitWords(str);\n let snakeCase = '';\n for (const word of words) {\n if (snakeCase.length > 0) {\n snakeCase += '_';\n }\n snakeCase += word.toLowerCase();\n }\n return snakeCase;\n}\n","import { deburr } from '@string/deburr';\n\n/**\n * Removes all special characters from a string.\n *\n * @example\n * stripSpecial('Héllo! World #$%&*!')\n * // => 'Hello World'\n * @param str - The string to remove special characters from.\n * @returns Returns the string with special characters removed.\n*/\n\nexport function stripSpecial(str: string): string {\n str = deburr(str);\n return str.replace(/[^\\s\\w]/gi, '');\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to Title Case.\n *\n * @example\n * titleCase('--foo-bar--')\n * // => 'Foo Bar'\n * titleCase('fooBar')\n * // => 'Foo Bar'\n * titleCase('__FOO_BAR__')\n * // => 'Foo Bar'\n * titleCase('HélloWorld')\n * // => 'Hello World'\n * @param str - The string to convert.\n * @returns Returns the title cased string.\n */\n\nexport function titleCase(str: string): string {\n const words = splitWords(str);\n let titleCase = '';\n for (const word of words) {\n titleCase += word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ' ';\n }\n return titleCase.trimEnd();\n}\n","/**\n * Converts the HTML entities `&`, `<`, `>`, `"` and `'`\n * in a string to their corresponding characters.\n *\n * @example\n * unescapeHtml('fred, barney, & pebbles')\n * // => 'fred, barney, & pebbles'\n * @param str - The string to unescape.\n * @returns Returns the unescaped string.\n */\n\nexport function unescapeHtml(str: string): string {\n const entityMap: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': '\\''\n };\n return str.replace(/&(?:amp|lt|gt|quot|#(0+)?39);/g, (entity: string) => entityMap[entity] || entity);\n}\n","/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @example\n * isEmpty(null)\n * // => true\n *\n * isEmpty({})\n * // => true\n *\n * isEmpty(\"\")\n * // => true\n *\n * isEmpty([1, 2, 3])\n * // => false\n *\n * isEmpty('abc')\n * // => false\n *\n * isEmpty({ 'a': 1 })\n * // => false\n * @param value - The value to check.\n * @returns Returns `true` if given vlaue is empty, else `false`.\n */\n\nexport function isEmpty(value: string | object | null | undefined): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n\n if (typeof value === 'string' || Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (value instanceof Map || value instanceof Set) {\n return value.size === 0;\n }\n\n if (typeof value === 'object') {\n return Object.keys(value).length === 0;\n }\n\n return false;\n}\n","/**\n * Checks if given string is a valid URL\n *\n * @example\n * isUrl('https://google.com')\n * // => true\n * isUrl('google.com')\n * // => false\n * @param str - The string to check.\n * @returns Returns `true` if given string is a valid URL, else `false`.\n */\n\nexport function isUrl(str: string): boolean {\n try {\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}"],"mappings":"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","names":["difference","intersection","count","count","retries","timeout","camelCase","kebabCase","pascalCase","snakeCase","titleCase"]}
|
|
1
|
+
{"version":3,"sources":["../src/array/chunk.ts","../src/array/count.ts","../src/validate/isPlainObject.ts","../src/validate/isEqual.ts","../src/array/difference.ts","../src/array/dropRightWhile.ts","../src/array/dropWhile.ts","../src/array/group.ts","../src/array/intersection.ts","../src/array/sample.ts","../src/array/shuffle.ts","../src/array/sort.ts","../src/array/takeRightWhile.ts","../src/array/takeWhile.ts","../src/array/unique.ts","../src/decorator/toDecorator.ts","../src/function/debounce.ts","../src/decorator/decDebounce.ts","../src/function/maxCalls.ts","../src/decorator/decMaxCalls.ts","../src/function/memoize.ts","../src/decorator/decMemoize.ts","../src/function/minCalls.ts","../src/decorator/decMinCalls.ts","../src/function/throttle.ts","../src/decorator/decThrottle.ts","../src/function/times.ts","../src/number/sum.ts","../src/number/average.ts","../src/number/median.ts","../src/number/randomFloat.ts","../src/number/randomInt.ts","../src/object/merge.ts","../src/object/pick.ts","../src/object/omit.ts","../src/object/set.ts","../src/promise/queue.ts","../src/promise/races.ts","../src/promise/sleep.ts","../src/promise/retry.ts","../src/promise/timeout.ts","../src/string/splitWords.ts","../src/string/deburr.ts","../src/string/camelCase.ts","../src/string/capitalize.ts","../src/string/escapeHtml.ts","../src/string/escapeRegExp.ts","../src/string/kebabCase.ts","../src/string/pascalCase.ts","../src/string/snakeCase.ts","../src/string/titleCase.ts","../src/string/unescapeHtml.ts","../src/validate/isEmpty.ts","../src/validate/isUrl.ts"],"sourcesContent":["/**\n * Creates an array of elements split into groups the length of size. If array can't be split evenly, the final chunk will be the remaining elements.\n *\n * @example\n * chunk(['a', 'b', 'c', 'd'], 2)\n * // => [['a', 'b'], ['c', 'd']]\n *\n * chunk(['a', 'b', 'c', 'd'], 3)\n * // => [['a', 'b', 'c'], ['d']]\n * @param chunkSize The length of each chunk\n * @param array The array to chunk.\n * @template TElem The type of the array elements.\n * @returns Returns the new array of chunks.\n */\n\nexport function chunk<TElem>(array: TElem[], chunkSize: number): TElem[][] {\n const sizeInteger = Math.trunc(chunkSize);\n if (array.length === 0 || sizeInteger < 1) {\n return [];\n }\n\n const chunkedArray = [];\n let i = 0;\n\n while (i < array.length) {\n chunkedArray.push(array.slice(i, i + sizeInteger));\n i += sizeInteger;\n }\n\n return chunkedArray;\n}\n","/**\n * Creates an object with counts of occurrences of items in the array.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true, age: 36 },\n * { 'user': 'betty', 'active': false, age: 36 },\n * { 'user': 'fred', 'active': true, age: 40 }\n * ]\n *\n * count(users, value => value.active);\n * // => { 'true': 2, 'false': 1 }\n * \n * count(users, value => value.age);\n * // => { '36': 2, '40': 1 }\n * \n * @param criteria The criteria to count by.\n * @param array The array or record to iterate over.\n * @template TElem The type of the array elements.\n * @returns Returns the composed aggregate object.\n */\n\nexport function count<TElem, TKey extends PropertyKey>(array: TElem[], criteria: (value: TElem) => TKey | boolean): Record<TKey, number> {\n const result = {} as Record<TKey, number>;\n for (const value of array) {\n let key = criteria(value);\n if (typeof key === 'boolean')\n key = key.toString() as TKey;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result[key] === undefined)\n result[key] = 1;\n else\n result[key] += 1;\n }\n return result;\n}\n","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Checks if the value is a plain object.\n * \n * @example\n * isPlainObject({}) // => true\n * isPlainObject({ a: 1 }) // => true\n * isPlainObject(null) // => false\n * isPlainObject('1') // => false\n * isPlainObject([]) // => false\n * isPlainObject(new Function()) // => false\n * isPlainObject(new Date()) // => false\n * @param value - The value to check\n * @returns Boolean indicating if the value is a plain object\n */\n\nexport function isPlainObject(value: unknown): value is PlainObject {\n return value?.constructor === Object;\n}","import type { PlainObject } from '@type/PlainObject.js';\n\nimport { isPlainObject } from './isPlainObject.js';\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @example\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n * @param a - The value to compare.\n * @param b - The other value to compare.\n * @returns Returns `true` if the values are equivalent, else `false`.\n */\n\nexport function isEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n \n if (Array.isArray(a) && Array.isArray(b)) {\n return isSameArray(a, b);\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.toString() === b.toString();\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n return isSameObject(a, b);\n }\n\n return false;\n}\n\nfunction isSameObject(a: PlainObject, b: PlainObject) {\n // check if the objects have the same keys\n const keys1 = Object.keys(a);\n const keys2 = Object.keys(b);\n if (!isEqual(keys1, keys2)) return false;\n\n // check if the values of each key in the objects are equal\n for (const key of keys1) {\n if (!isEqual(a[key], b[key])) return false;\n }\n\n // the objects are deeply equal\n return true;\n}\n\nfunction isSameArray(a: unknown[], b: unknown[]) {\n if (a.length !== b.length) return false;\n\n // check if the values of each element in the arrays are equal\n for (const [i, element] of a.entries()) {\n if (!isEqual(element, b[i])) return false;\n }\n\n return true;\n}\n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Create a new array with values from the first array that are not present in the other arrays.\n * \n * Optionally, use a compare function to determine the comparison of elements (default: {@link isEqual}).\n * @example\n * difference([2, 1], [2, 3])\n * // => [1]\n *\n * // ---- Custom compare function ----\n * difference((a, b) => Math.floor(a) === Math.floor(b), [1.2, 3.1], [1.3, 2.4])\n * // => [3.1]\n *\n * // ---- Only compare by id ----\n * const arr1 = [{ id: 1, name: 'Yeet' }, { id: 3, name: 'John' }];\n * const arr2 = [{ id: 3, name: 'Carl' }, { id: 4, name: 'Max' }];\n *\n * difference((a, b) => a.id === b.id, arr1, arr2)\n * // => [{ id: 1, name: 'Yeet' }]\n * @param arrays First array is inspected, others are excluded.\n * @template TElem The type of the array elements.\n * @returns Returns the new array of filtered values.\n */\n\nexport function difference<TElem>(...arrays: ArrayMinLength<TElem[], 2>): TElem[];\nexport function difference<TElem>(arrayOrCompFn: (a: TElem, b: TElem) => boolean, ...arrays: ArrayMinLength<TElem[], 2>): TElem[];\nexport function difference<TElem>(arrayOrCompFn: TElem[] | ((a: TElem, b: TElem) => boolean), ...arrays: ArrayMinLength<TElem[], 2>): TElem[] {\n const withCompareFn = typeof arrayOrCompFn === 'function';\n const compareFN = withCompareFn ? arrayOrCompFn as (a: TElem, b: TElem) => boolean : isEqual;\n\n const [firstArray, ...restArrays] = withCompareFn ? arrays : [arrayOrCompFn, ...arrays];\n const difference: TElem[] = [];\n\n firstArray.forEach(element => {\n if (!restArrays.some(array => array.some(item => compareFN(item, element)))) {\n difference.push(element);\n }\n });\n\n return difference;\n}","/**\n * Creates a slice of `array` excluding elements dropped from the end. \n * Elements are dropped until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * dropRightWhile(users, ({ active }) => active)\n * // => objects for ['barney']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @template TElem The type of the array elements.\n * @returns Returns the slice of `array`.\n */\n\nexport function dropRightWhile<TElem>(array: TElem[], predicate: (value: TElem) => boolean) {\n let i = array.length;\n while (i > 0 && predicate(array[i - 1])) {\n i--;\n }\n return array.slice(0, i);\n}\n","/**\n * Creates a slice of `array` excluding elements dropped from the beginning. \n * Elements are dropped until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * dropWhile(users, ({ active }) => active)\n * // => objects for ['pebbles']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @template TElem The type of the array elements.\n * @returns Returns the slice of `array`.\n */\n\nexport function dropWhile<TElem>(array: TElem[], predicate: (value: TElem) => boolean): TElem[] {\n const index = array.findIndex(x => !predicate(x));\n return array.slice(index === -1 ? array.length : index);\n}\n","/**\n * Creates an object with grouped items in the array.\n *\n * @example\n * group([6.1, 4.2, 6.3], Math.floor)\n * // => { 4: [4.2], 6: [6.1, 6.3] }\n *\n * group([6.1, 4.2, 6.3], value => value > 5)\n * // => { 'false': [4.2], 'true': [6.1, 6.3] }\n * \n * @param collection The array or object to iterate over.\n * @param criteria The criteria to group by.\n * @template TElem The type of the array elements.\n * @returns An object with grouped items.\n */\n\nexport function group<TElem, TKey extends PropertyKey>(array: TElem[], criteria: (value: TElem) => TKey | boolean): Record<TKey, TElem[]> {\n const result = {} as Record<TKey, TElem[]>;\n for (const value of array) {\n let key = criteria(value);\n if (typeof key === 'boolean')\n key = key.toString() as TKey;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n result[key] = result[key] ?? [];\n result[key].push(value);\n }\n return result;\n}\n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Create an array with unique values from all input arrays, with order based on the first array. \n * \n * Optionally, use a compare function for element comparison (default: {@link isEqual}).\n * @example\n * intersection([2, 1], [2, 3])\n * // => [2]\n *\n * // ---- Custom compare function ----\n * const compareFn = (a, b) => Math.floor(a) === Math.floor(b);\n * \n * intersection(compareFn, [1.2, 1.1], [1.3, 2.4])\n * // => [1.2]\n *\n * // ---- Only compare by id ----\n * const arr1 = [{ id: 1, name: 'Yeet' }, { id: 3, name: 'John' }];\n * const arr2 = [{ id: 3, name: 'Carl' }, { id: 4, name: 'Max' }];\n *\n * intersection((a, b) => a.id === b.id, arr1, arr2)\n * // => [{ id: 3, name: 'John' }]\n * @param arrays - The arrays to inspect.\n * @returns Returns the new array of intersecting values.\n */\n\nexport function intersection<TArr>(...arrays: ArrayMinLength<TArr[], 2>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: ArrayMinLength<TArr[], 2>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: ArrayMinLength<TArr[], 2>): TArr[] {\n const withCompareFn = typeof arrayOrCompFn === 'function';\n const compareFN = withCompareFn ? arrayOrCompFn as (a: TArr, b: TArr) => boolean : isEqual;\n\n const [firstArray, ...restArrays] = withCompareFn ? arrays : [arrayOrCompFn, ...arrays];\n const intersection: TArr[] = [];\n\n firstArray.forEach(element => {\n if (restArrays.every(array => array.some(item => compareFN(item, element)))) {\n intersection.push(element);\n }\n });\n\n return intersection;\n}","/**\n * Gets a random element an array. A single element is returned by default. \n * Specify the `multi` parameter to get an array of multiple random elements.\n *\n * If the array is empty, `undefined` is returned. \n * If `multi` is defined it returns an empty array. \n * @example\n * sample([1, 2, 3, 4])\n * // => 2\n *\n * sample([1, 2, 3, 4], 2)\n * // => [3, 1]\n * @param array - The array to sample.\n * @returns Returns the random element.\n */\n\nexport function sample<TArr>(array: TArr[]): TArr | undefined;\nexport function sample<TArr>(array: TArr[], multi: number): TArr[];\nexport function sample<TArr>(array: TArr[], multi?: number): TArr | undefined | TArr[] {\n if (multi === undefined) {\n if (array.length === 0) return undefined;\n return getSingleSample(array);\n }\n\n if (multi && array.length === 0) return [];\n\n // Multiple samples\n const result = new Array<TArr>(multi);\n for (let i = 0; i < multi; i++) {\n result[i] = getSingleSample(array);\n }\n return result;\n}\n\nfunction getSingleSample<TArr>(array: TArr[]): TArr {\n const randomIndex = Math.floor(Math.random() * array.length);\n return array[randomIndex];\n}","/**\n * Creates a new array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @example\n * shuffle([1, 2, 3, 4])\n * // => [4, 1, 3, 2]\n * @param array - The array or object to shuffle.\n * @returns Returns the new shuffled array.\n */\n\nexport function shuffle<TArr>(array: TArr[]): TArr[] {\n const shuffledArray = [...array];\n let currentIndex = shuffledArray.length;\n let temporaryValue: TArr;\n let randomIndex: number;\n\n // While there remain elements to shuffle...\n while (0 !== currentIndex) {\n // Pick a remaining element...\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex -= 1;\n\n // And swap it with the current element.\n temporaryValue = shuffledArray[currentIndex];\n shuffledArray[currentIndex] = shuffledArray[randomIndex];\n shuffledArray[randomIndex] = temporaryValue;\n }\n\n return shuffledArray;\n}\n","\n/**\n * Creates a new sorted array in ascending or descending order based on one or multiple sorting criteria.\n * \n * @example\n * sort([1, 2, 3, 4], { order: 'desc' })\n * // => [4, 3, 2, 1]\n * \n * // --- Sorting by multiple properties ---\n * const array = [{ a: 2, b: 1 }, { a: 1, b: 2 }, { a: 1, b: 1 }];\n * \n * sort(array,\n * { order: 'asc', by: item => item.a },\n * { order: 'desc', by: item => item.b }\n * )\n * // => [{ a: 1, b: 2 }, { a: 1, b: 1 }, { a: 2, b: 1 }]\n * @param array - The array to sort.\n * @param orders - The sorting criteria, one or multiple objects with properties order (either 'asc' or 'desc') and by (iteratee function to sort based on a specific property).\n * @param orders.order - The order to sort in, either 'asc' or 'desc'.\n * @param orders.by - The iteratee function to sort based on a specific property.\n * @returns Returns the sorted array.\n*/\nexport function sort<TInput>(array: TInput[], ...orders: { order?: 'asc' | 'desc', by?: (item: TInput) => number | bigint | Date | string }[]): TInput[] {\n return [...array].sort((a, b) => {\n for (const { order, by } of orders) {\n const aValue = by ? by(a) : a;\n const bValue = by ? by(b) : b;\n if (aValue < bValue) {\n return order === 'desc' ? 1 : -1; \n }\n if (aValue > bValue) {\n return order === 'desc' ? -1 : 1;\n }\n }\n return 0;\n });\n}","/**\n * Creates a slice of `array` with elements taken from the end. \n * Elements are taken until `predicate` returns falsey.\n * \n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * takeRightWhile(({ active }) => active, users)\n * // => objects for ['fred', 'pebbles']\n * @param predicate - The function invoked per iteration.\n * @param array - The array to query.\n * @returns Returns the slice of `array`.\n */\n\nexport function takeRightWhile<TArr>(predicate: (elem: TArr) => boolean, array: TArr[]): TArr[] {\n const result: TArr[] = [];\n\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n result.unshift(array[i]);\n } else {\n break;\n }\n }\n\n return result;\n}\n","/**\n * Creates a slice of `array` with elements taken from the beginning. \n * Elements are taken until `predicate` returns falsey.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * takeWhile(users, ({ active }) => active)\n * // => objects for ['barney', 'fred']\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @returns Returns the slice of `array`.\n */\n\nexport function takeWhile<TArr>(array: TArr[], predicate: (elem: TArr) => boolean): TArr[] {\n const result: TArr[] = [];\n\n for (const element of array) {\n if (predicate(element)) {\n result.push(element);\n } else {\n break;\n }\n }\n\n return result;\n}\n","import { isEqual } from '@validate/isEqual';\n\n/**\n * Creates a duplicate-free version of an array, in which only the first occurrence of each element is kept. \n * The order of result values is determined by the order they occur in the array.\n *\n * An compare function is optinal to specify how the array is compared (default: {@link isEqual}).\n * \n * @example\n * unique([2, 1, 2])\n * // => [2, 1]\n *\n * const users = [\n * { id: 1, name: 'a' },\n * { id: 1, name: 'c' }\n * ]\n *\n * unique(users, (a, b) => a.id === b.id)\n * // => [{ id: 1, name: 'a' }]\n *\n *\n * @param array - The array to inspect.\n * @param iteratee - The iteratee invoked per element.\n * @returns Returns the new duplicate free array.\n */\n\nexport function unique<TInput>(array: TInput[], compareFn = (a: TInput, b: TInput) => isEqual(a, b)): TInput[] {\n return array.filter((value, index, self) => {\n return self.findIndex(otherValue => compareFn(value, otherValue)) === index;\n });\n}\n","import type { GenericFunction } from '@type/GenericFunction.js';\n\ntype Tail<T extends unknown[]> = T extends [infer _Head, ...infer Tail] ? Tail : never;\n\n/**\n * Transforms a function that takes a function as first argument into a decorator function.\n * \n * @example\n * ```typescript\n * function log(func: Function, message: string) {\n * return function (...args: unknown[]) {\n * console.log(message);\n * return func(...args);\n * };\n * }\n * \n * const logger = toDecorator(log);\n * \n * class TestClass {\n * @logger(\"Hello world!\")\n * testMethod() {\n * return 1; \n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(); \n * // => Log \"Hello World\" and return 1\n * ```\n * @param func - The function to transform.\n * @returns A decorator function that can be used to decorate a method.\n */\n\nexport function toDecorator<TFunc extends GenericFunction<TFunc>>(func: TFunc) {\n return function (...args: Tail<Parameters<TFunc>>) {\n return function (target: unknown, key: string, descriptor: PropertyDescriptor) {\n const creatorArgs = [descriptor.value, ...args] as Parameters<TFunc>;\n descriptor.value = func(...creatorArgs);\n };\n };\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a debounced version of a function. Only calling it after a specified amount of time has passed without any new calls.\n * \n * **Methods:** \n * - `cancel` will cancel the next invocation of the debounced function. \n * - `flush` will immediately invoke the debounced function and cancel any pending invocations. \n * \n * This function can be used as a decorator with {@link decDebounce}.\n * \n * @example\n * const sayHello = (name: string) => console.log(`Hello, ${name}!`);\n * const debouncedSayHello = debounce(sayHello, 200);\n * \n * debouncedSayHello(\"John\");\n * debouncedSayHello(\"Jane\");\n * // => Only the second invocation of `debouncedSayHello` is executed, after a delay of 200ms.\n * @param func - The function to debounce.\n * @param wait - The number of milliseconds to wait before invoking `func`.\n * @returns A debounced version of `func` with `cancel` and `flush` methods.\n */\n\nexport function debounce<TFunc extends GenericFunction<TFunc>>(func: TFunc, wait: number): TFunc & {\n cancel: () => void;\n flush: () => void;\n} {\n let timeoutId: NodeJS.Timeout | undefined;\n const debounced = function (this: unknown, ...args: Parameters<TFunc>) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func.apply(this, args), wait);\n };\n\n /** Cancels the next invocation of the debounced function. */\n debounced.cancel = function () {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n };\n\n /** Immediately invokes the debounced function and cancels any pending invocations. */\n debounced.flush = function (this: unknown, ...args: Parameters<TFunc>) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n func.apply(this, args);\n };\n\n return debounced as TFunc & { cancel: () => void; flush: () => void };\n}","import { toDecorator } from '@decorator/toDecorator.js';\nimport { debounce } from '@function/debounce.js';\n\n/**\n * Debouces the decorated function. Only calling it after a specified amount of time has passed without any new calls.\n * \n * Look at {@link debounce} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decDebounce(1000)\n * testMethod(str: string) {\n * console.log(\"Debounced:\", str);\n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(\"Hello\");\n * instance.testMethod(\"World\");\n * // => Only the second invocation of `debouncedSayHello` is executed, after a delay of 1000ms.\n * ```\n * @param wait - Milliseconds to wait before invoking the decorated function after the last invocation.\n */\n\nexport function decDebounce(wait: number) {\n return toDecorator(debounce)(wait);\n}\n","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a function that invokes the given function as long as it's called `<= n` times.\n * \n * Subsequent calls to the created function return the result of the last `func` invocation.\n *\n * This function can be used as a decorator with {@link decMaxCalls}.\n * @example\n * let count = 0;\n * const addCount = () => ++count;\n *\n * // Allow addCount to be invoked twice.\n * const limitAddCount = maxCalls(addCount, 2)\n *\n * limitAddCount() // => 1\n * limitAddCount() // => 2\n * limitAddCount() // => 2\n * // => `limitAddCount` is invoked twice and the result is cached.\n * @param n - The number of calls before the cached result is returned.\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function maxCalls<TFunc extends GenericFunction<TFunc>>(func: TFunc, n: number): TFunc {\n let count = 0;\n let result: ReturnType<TFunc>;\n return function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n if (count < n) {\n count += 1;\n result = func.apply(this, args);\n }\n return result;\n } as TFunc;\n}\n","import { toDecorator } from '@decorator/toDecorator.js';\nimport { maxCalls } from '@function/maxCalls.js';\n\n/**\n * Only invokes the decorated function as long as it's called `<= n` times. \n * Subsequent calls to the decorated function return the result of the last invocation.\n * \n * Look at {@link maxCalls} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * private count = 0;\n * @decMaxCalls(2)\n * testMethod() {\n * return ++this.count;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(); // => 1 \n * instance.testMethod(); // => 2\n * instance.testMethod(); // => 2\n * ```\n * @param n - The number of calls before the cached result is returned.\n */\n\nexport function decMaxCalls(n: number) {\n return toDecorator(maxCalls)(n);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\nconst defaultResolver = (...args: unknown[]) => JSON.stringify(args);\n\n/**\n * Creates a function that caches the result of `func`.\n * \n * The cache key is either determined by the provided `resolver` or by the arguments used in the cached function.\n *\n * The `cache` property is exposed on the cached function. It is an instance of `Map` and can be used to clear or inspect the cache. \n * The cache property can be replaced by a custom cache as long as it implements the `Map` interface.\n *\n * **Options:**\n * - `resolver` A function that determines the cache key for storing the result based on the arguments provided.\n * - `ttl` sets the time to live for the cache in milliseconds. After `ttl` milliseconds, the next call to the memoized function will result in a cache miss.\n * \n * This function can be used as a decorator with {@link decMemoize}.\n * \n * @example\n * ```typescript\n * function fibonacci(n: number) {\n * if (n <= 1) return n;\n * return fibonacci(n - 1) + fibonacci(n - 2);\n * }\n *\n * const memoizedFib = memoize(fibonacci, { ttl: 1000 })\n * \n * memoizedFib(40) // => 102334155\n * memoizedFib(40) // => 102334155 (cache hit)\n * setTimeout(() => memoizedFib(40), 1000) // => 102334155 (cache miss)\n * \n * // Cached values are exposed as the `cache` property.\n * memoizedFib.cache.get(\"40\") // => [value, timestamp]\n * memoizedFib.cache.set(\"40\", [1234, Date.now()])\n * memoizedFib.cache.clear()\n * \n * // This is the default way to create cache keys.\n * const defaultResolver = (...args: unknown[]) => JSON.stringify(args)\n * ```\n * @param func - The function to have its output memoized.\n * @param options - The options object with optional `resolver` and `ttl` parameters.\n * @param options.resolver - A function that determines the cache key for storing the result based on the arguments provided.\n * @param options.ttl - The time to live for the cache in milliseconds.\n * @template TFunc The type of the function to memoize.\n * @template Cache The type of the cache storage.\n * @returns Returns the new memoized function.\n */\n\nexport function memoize<TFunc extends GenericFunction<TFunc>, Cache extends Map<string, [ReturnType<TFunc>, number]>>(\n func: TFunc, options: { resolver?: (...args: Parameters<TFunc>) => string, ttl?: number; } = {}\n): TFunc & { cache: Cache } {\n const resolver = options.resolver ?? defaultResolver;\n const ttl = options.ttl;\n const cache = new Map() as Cache;\n\n const memoizedFunc = function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const key = resolver(...args);\n if (cache.has(key)) {\n const [cacheResult, cacheTime] = cache.get(key)!;\n if (ttl === undefined || (Date.now() - cacheTime < ttl)) {\n return cacheResult;\n }\n }\n const result = func.apply(this, args);\n cache.set(key, [result, Date.now()]);\n return result;\n };\n\n memoizedFunc.cache = cache;\n return memoizedFunc as TFunc & { cache: Cache };\n} ","import { toDecorator } from '@decorator/toDecorator.js';\nimport { memoize } from '@function/memoize.js';\n\n/**\n * Memoizes the decorated function. \n * The cache key is either determined by the provided resolver or by the arguments used in the memoized function.\n * \n * **Options:**\n * - `resolver` A function that determines the cache key for storing the result based on the arguments provided.\n * - `ttl` sets the time to live for the cache in milliseconds. After `ttl` milliseconds, the next call to the memoized function will result in a cache miss.\n * \n * Look at {@link memoize} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decMemoize({ ttl: 1000 })\n * testMethod(a: number, b: number) {\n * return a + b;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(1, 2); // => 3\n * instance.testMethod(1, 2); // => 3 (cached)\n * \n * // After 1 second:\n * instance.testMethod(1, 2); // => 3 (cache miss)\n * ```\n * @param options - The options object.\n * @param options.resolver - A function that determines the cache key for storing the result based on the arguments provided.\n * @param options.ttl - The time to live for the cache in milliseconds.\n */\n\nexport function decMemoize(options: Parameters<typeof memoize>[1] = {}) {\n return toDecorator(memoize)(options);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Creates a function that invokes the given function once it's called more than `n` times. \n * Returns undefined until the minimum call count is reached.\n * \n * This function can be used as a decorator with {@link decMinCalls}.\n * @example\n * const caution = () => console.log(\"Caution!\");\n * const limitedCaution = minCalls(caution, 2);\n *\n * limitedCaution()\n * limitedCaution()\n * limitedCaution()\n * // => `caution` is invoked on the third call.\n * @param n The number of calls before the given function is invoked.\n * @param func The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function minCalls<TFunc extends GenericFunction<TFunc>>(func: TFunc, n: number) {\n let count = 1;\n return function (this: unknown, ...args: Parameters<TFunc>): ReturnType<TFunc> | undefined {\n if (count > n) {\n return func.apply(this, args);\n }\n count += 1;\n };\n}","import { toDecorator } from '@decorator/toDecorator.js';\nimport { minCalls } from '@function/minCalls.js';\n\n/** \n * Only invokes the decorated function after it's called more than `n` times.\n * \n * Look at {@link minCalls} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * @example\n * ```typescript\n * class TestClass {\n * @decMinCalls(2)\n * testMethod() {\n * return 1;\n * }\n * }\n * const instance = new TestClass();\n * instance.testMethod(); // => undefined\n * instance.testMethod(); // => undefined\n * instance.testMethod(); // => 1\n * ```\n * @param n The number of calls before the decorated function is invoked.\n */\n\nexport function decMinCalls(n: number) {\n return toDecorator(minCalls)(n);\n}","import type { GenericFunction } from '@type/GenericFunction.js';\n\n/**\n * Generates a function that invokes the given function at most once per every `wait` milliseconds.\n * \n * This function can be used as a decorator with {@link decThrottle}.\n * @example\n * const throttled = throttle(() => console.log(\"Throttled!\"), 1000);\n * \n * throttled();\n * throttled();\n * // => \"Throttled!\" is logged once per second.\n * @param func - The function to throttle.\n * @param wait - The number of milliseconds to throttle invocations to.\n * @returns Returns the new throttled function.\n */\n\n\nexport function throttle<TFunc extends GenericFunction<TFunc>>(func: TFunc, wait: number): TFunc {\n let inThrottle = false;\n return function (this: unknown, ...args: Parameters<TFunc>) {\n if (!inThrottle) {\n func.apply(this, args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), wait);\n }\n } as TFunc;\n}\n \n","import { toDecorator } from '@decorator/toDecorator.js';\nimport { throttle } from '@function/throttle.js';\n\n/**\n * The decorated function is invoked at most once per every `wait` milliseconds.\n * \n * Look at {@link throttle} for the non-decorator version.\n * \n * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*\n * \n * @example\n * ```typescript\n * class TestClass {\n * @decThrottle(1000)\n * testMethod() {\n * console.log(\"Throttled!\");\n * }\n * }\n * \n * const instance = new TestClass();\n * instance.testMethod(); // => \"Throttled!\" is logged once per second.\n * instance.testMethod(); // nothing happens\n * ```\n * @param wait - The number of milliseconds to wait between invocations.\n */\n\nexport function decThrottle(wait: number) {\n return toDecorator(throttle)(wait);\n}","/**\n * Invokes a function `n` times, returning an array of the results of\n * each invocation.\n * \n * @example\n * times(index => console.log(\"Run\", index), 3)\n * // => \"Run 0\" | \"Run 1\" | \"Run 2\"\n * times(Math.random, 3)\n * // => [0.123, 0.456, 0.789]\n * times(() => 0, 4)\n * // => [0, 0, 0, 0]\n * @param n - The number of times to invoke `func`.\n * @param func - The function invoked per iteration.\n * @returns Returns an array of results.\n */\n\nexport function times<TInput>(func: (index: number) => TInput, n: number): TInput[] {\n const result: TInput[] = [];\n for (let i = 0; i < n; i++) {\n result.push(func(i));\n }\n return result;\n}","/**\n * Calculates the sum of an array of numbers.\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * sum([1, 2, 3, 4, 5]) // => 15\n * \n * @param numbers - The input array of numbers\n * @returns The sum of the input array \n */\n\nexport function sum(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n return numbers.reduce((total, current) => total + current, 0);\n}","import { sum } from '@number/sum.js';\n\n/**\n * Calculates the average of an array of numbers\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * average([1, 2, 3, 4, 5]) // => 3\n * \n * @param numbers - The input array of numbers\n * @returns The average of the input array, or NaN if the input array is empty\n */\n\nexport function average(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n return sum(numbers) / numbers.length;\n}","/**\n * Calculates the median of an array of numbers\n * \n * Returns `NaN` if the input array is empty.\n * @example\n * median([1, 2, 3, 4, 5]) // => 3\n * median([1, 2, 3, 4, 5, 6]) // => 3.5\n * \n * @param numbers - The input array of numbers\n * @returns The median of the input array\n */\n\nexport function median(numbers: number[]): number {\n if (numbers.length === 0)\n return NaN;\n const sortedArray = [...numbers].sort((a, b) => a - b);\n const mid = Math.floor(sortedArray.length / 2);\n return sortedArray.length % 2 === 0 ? ((sortedArray[mid - 1] + sortedArray[mid]) / 2) : sortedArray[mid];\n}","/**\n * Generates a random float between two given numbers, including those numbers.\n * \n * It uses `crypto.getRandomValues` to generate the random number.\n * @example\n * randomFloat(1, 10) // => 1.123456789\n * \n * @param min - The smallest float that can be generated.\n * @param max - The largest float that can be generated.\n * \n * @returns A random float between `min` and `max`, including `min` and `max`.\n */\n\nexport function randomFloat(min: number, max: number): number {\n if (min > max)\n throw new Error('min must be less than or equal to max');\n const range = max - min;\n const randomBuffer = new Uint32Array(1);\n crypto.getRandomValues(randomBuffer);\n const random = randomBuffer[0] / 0xFFFFFFFF;\n return min + (random * range);\n}","\n/**\n * Generates a random integer between two given numbers, including those numbers.\n * \n * It uses `crypto.getRandomValues` to generate the random number.\n * @example\n * randomInt(1, 10) // => 5\n * \n * @param min - The smallest integer that can be generated.\n * @param max - The largest integer that can be generated.\n * \n * @returns A random integer between `min` and `max`, including `min` and `max`.\n */\n\nexport function randomInt(min: number, max: number): number {\n if (min > max)\n throw new Error('min must be less than or equal to max');\n const range = max - min + 1;\n const randomBuffer = new Uint32Array(1);\n crypto.getRandomValues(randomBuffer);\n return min + (randomBuffer[0] % range);\n}\n \n","import type { ArrayMinLength } from '@type/ArrayMinLength.js';\nimport type { PlainObject } from '@type/PlainObject.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * This function combines two or more objects into a single new object. Arrays and other types are overwritten.\n * \n * @example\n * // ---- Nested objects are merged ----\n * merge({ a: 1 }, { b: 2 }, { c: 3, d: { e: 4 } }) \n * // => { a: 1, b: 2, c: 3, d: { e: 4 } }\n *\n * // ---- Other types are overwritten ----\n * merge({ a: [1, 2] }, { a: [3, 4] })\n * // => { a: [3, 4] }\n * \n * merge({ a: 1 }, { a: \"Yes\" })\n * // => { a: \"Yes\" }\n * @param target - The target object\n * @param sources - The source objects\n * @returns A new merged object\n */\n\nexport function merge<TTarget extends PlainObject, TSources extends ArrayMinLength<PlainObject, 1>>(target: TTarget, ...sources: TSources): MergeDeepObjects<[TTarget, ...TSources]> {\n const targetCopy = { ...target };\n for (const source of sources) {\n for (const [key, value] of Object.entries(source)) {\n (targetCopy as PlainObject)[key] = isPlainObject(value) && isPlainObject(targetCopy[key]) \n ? merge(targetCopy[key] as PlainObject, value) \n : value;\n }\n }\n return targetCopy as MergeDeepObjects<[TTarget, ...TSources]>; \n}\n\ntype OptionalPropertyNames<T> =\n { [K in keyof T]-?: (PlainObject extends { [P in K]: T[K] } ? K : never) }[keyof T];\n\ntype SpreadProperties<L, R, K extends keyof L & keyof R> =\n { [P in K]: L[P] | Exclude<R[P], undefined> };\n\ntype Id<T> = T extends infer U ? { [K in keyof U]: U[K] } : never;\n\ntype SpreadTwo<L, R> = Id<\n& Pick<L, Exclude<keyof L, keyof R>>\n& Pick<R, Exclude<keyof R, OptionalPropertyNames<R>>>\n& Pick<R, Exclude<OptionalPropertyNames<R>, keyof L>>\n& SpreadProperties<L, R, OptionalPropertyNames<R> & keyof L>\n>;\n\ntype MergeDeepObjects<A extends readonly [...unknown[]]> = A extends [infer L, ...infer R] ?\n SpreadTwo<L, MergeDeepObjects<R>> : unknown;\n","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @example\n * const object = { 'a': 1, 'b': '2', 'c': 3 }\n *\n * pick(object, ['a', 'c'])\n * // => { 'a': 1, 'c': 3 }\n * @param object - The source object.\n * @param keysToPick - The property paths to pick.\n * @returns Returns the new object.\n */\n\nexport function pick<TInput extends PlainObject, Key extends keyof TInput>(object: TInput, keysToPick: Key[]): Pick<TInput, Key> {\n const result = {} as Pick<TInput, Key>;\n for (const key of keysToPick) {\n result[key] = object[key];\n }\n return result;\n}\n","import type { PlainObject } from '@type/PlainObject.js';\n\nimport { pick } from './pick.js';\n\n/**\n * Omit specified keys from an object\n *\n * @example\n * const obj = {a: 1, b: 2, c: 3};\n * omit(obj, ['a', 'b']);\n * // => {c: 3}\n *\n * @param object - The object to filter\n * @param keysToOmit - The keys to exclude from the returned object\n * @returns - An object without the specified keys\n *\n */\n\nexport function omit<TObj extends PlainObject, Key extends keyof TObj>(object: TObj, keysToOmit: Key[]): Omit<TObj, Key> {\n const keys = Object.keys(object);\n const filteredKeys = keys.filter(key => !keysToOmit.includes(key as Key)) as Exclude<keyof TObj, Key>[];\n\n return pick(object, filteredKeys);\n}","import type { PlainObject } from '@type/PlainObject.js';\n\n/**\n * Sets the value at path of object. If a portion of path doesn’t exist, it’s created.\n * \n * @alpha\n * @example\n * const obj = { a: { b: 2 } };\n * set(obj, 'a.c', 1);\n * // => { a: { b: 2, c: 1 } }\n * \n * @param obj - The object to modify.\n * @param path - The path of the property to set.\n * @param value - The value to set.\n * @returns The modified object.\n */\n\nexport function set<TObj extends PlainObject>(obj: TObj, path: string, value: unknown): TObj {\n const pathParts = path.split(/[.[\\]]/g).filter(x => Boolean(x.trim()));\n\n let currentObj: Record<string | number, unknown> = obj;\n for (let index = 0; index < pathParts.length; index++) {\n const key = pathParts[index];\n\n if (index === pathParts.length - 1) {\n currentObj[key] = value;\n break;\n }\n \n const nextIsNumber = !Number.isNaN(Number.parseInt(pathParts[index + 1]));\n if (currentObj[key] === undefined)\n currentObj[key] = nextIsNumber ? [] : {};\n\n currentObj = currentObj[key] as Record<string | number, unknown>;\n }\n\n return obj;\n}","/**\n * A class for managing a queue of async functions that runs a set number concurrently. \n * If for example you have 10 async functions and you want to run 3 at a time, you can use this class.\n * \n * If the queue is paused, the queue will not run any more async functions until it is resumed.\n * \n * **Methods:**\n * - `add` - adds a async function or array of functions to the queue. Returns a promise that resolves when the added function(s) finish.\n * - `clear` - clears the queue.\n * - `pause` - pauses the queue.\n * - `resume` - resumes the queue. \n * - `getQueue` - returns the current queue.\n * - `isPaused` - returns whether the queue is paused.\n * \n * @example\n * // Create a queue that can run 3 tasks concurrently\n * const queue = new Queue(3);\n * \n * queue.add(() => fetch('https://example.com'));\n * \n * queue.add(async () => {\n * const response = await fetch('https://example.com');\n * return response.json();\n * });\n * \n * // Add an array of tasks to the queue and wait for them to resolve\n * await queue.add([\n * () => fetch('https://apple.com'),\n * () => fetch('https://microsoft.com')\n * ]);\n * // => [Response, Response]\n */\n\nexport class Queue {\n private running = 0;\n private maxConcurrent: number;\n private paused = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private queue: { asyncFn: () => Promise<any>, resolve: (value: any) => void, reject: (reason?: any) => void }[] = [];\n\n /**\n * @constructor\n * @param maxConcurrent - The maximum number of async functions to run concurrently.\n */\n constructor(maxConcurrent: number) {\n this.maxConcurrent = maxConcurrent;\n }\n\n /**\n * Add aync functions or an array of async functions to the queue.\n * \n * @param asyncFn - The aync function(s) to add to the queue.\n * @returns A promise that resolves when the added function(s) finishes.\n */\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn): Promise<TProm>;\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn[]): Promise<TProm[]>;\n add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn | TAsyncFn[]): Promise<TProm> | Promise<TProm[]> {\n if (Array.isArray(asyncFn)) {\n const promises = asyncFn.map((fn) => this.buildWaitingPromise(fn));\n return Promise.all(promises);\n } else {\n return this.buildWaitingPromise(asyncFn);\n } \n }\n\n private buildWaitingPromise<TProm>(asyncFn: () => Promise<TProm>): Promise<TProm> {\n return new Promise((resolve, reject) => {\n this.queue.push({ asyncFn, resolve, reject });\n this.run();\n });\n } \n\n private run() {\n while (this.queue.length > 0 && this.running < this.maxConcurrent && !this.paused) {\n this.running++;\n const queueElement = this.queue.shift()!;\n void queueElement.asyncFn()\n .then((result) => {\n queueElement.resolve(result);\n }).catch((error) => {\n queueElement.reject(error);\n }).finally(() => {\n this.running--;\n this.run();\n });\n }\n }\n\n /** Removes all the tasks from the queue */\n clear() {\n for (const queueElement of this.queue) {\n queueElement.reject(new Error('Queue cleared'));\n }\n this.queue = [];\n }\n\n /** Pauses the execution of the queue */\n pause() {\n this.paused = true;\n }\n\n /** Resumes the execution of the tasks in the queue */\n resume() {\n this.paused = false;\n this.run();\n }\n\n /** Return the tasks added to the queue */\n getQueue() {\n return this.queue.map((queueElement) => queueElement.asyncFn);\n }\n\n /** Returns whether the queue is paused */\n isPaused() {\n return this.paused;\n }\n\n}\n","/**\n * Similar to [Promise.race](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race?retiredLocale=de) \n * but allows to specify how many promises to wait for.\n *\n * @example\n * const promise1 = Promise.resolve(1);\n * const promise2 = Promise.resolve(2);\n * const promise3 = Promise.resolve(3);\n * \n * const firstThree = await races(3, promise1, promise2, promise3);\n * // => [1, 2, 3]\n * @template TRes - The type of the result of the promises.\n * @param waitFor - The number of promises to wait for.\n * @param promises - The promises to wait for.\n * @returns A promise that resolves an array of the results of the first n promises.\n */\n\nexport function races<TRes>(waitFor: number, ...promises: Promise<TRes>[]): Promise<TRes[]> {\n return new Promise((resolve, reject) => {\n if (promises.length < waitFor)\n waitFor = promises.length;\n\n const results: TRes[] = [];\n let resolved = 0;\n for (const promise of promises) {\n promise.then((value) => {\n results.push(value);\n resolved++;\n if (resolved >= waitFor) {\n resolve(results);\n }\n }).catch((error) => {\n reject(error);\n });\n }\n });\n}","/**\n * Sleeps for the given amount of time.\n *\n * @example\n * await sleep(1000);\n * // => Waits for 1 second.\n * @param ms - Amount of time to sleep in milliseconds.\n * @returns A promise that resolves after the given amount of time.\n */\nexport function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}","/* eslint-disable no-await-in-loop */\nimport { sleep } from '@promise/sleep.js';\n\n/**\n * Retry a function until it succeeds or the maximum number of retries is reached.\n * \n * Default maxRetries: `5`. \n * Default backoff: `2^retries * 100ms` (100, 200, 400, 800, 1600, 3200, ...)\n *\n * @example\n * await retry(() => fetch('https://example.com'));\n * \n * // ---- Advanced example ----\n * const fetchSite = async (url: string) => {\n * const response = await fetch(url);\n * if(!response.ok)\n * throw new Error('Failed to fetch');\n * }\n * \n * const logger = (error: unknown, retry?: number) => console.log(\"Retrying\", retry, error);\n * \n * await retry(() => fetchSite('https://example.com'), { maxRetries: 3, backoff: retries => retries * 1000, onRetry: logger });\n * // => Will retry 3 times with a 1 second delay between each retry. Will log the error and retry number.\n * \n * @param func The function to retry.\n * @param options The options for the retry.\n * @param options.maxRetries The maximum number of retries. Defaults to `5`.\n * @param options.backoff The backoff function to use. Defaults to `2^retries * 100`.\n * @param options.onRetry The function to call when a retry is attempted.\n * @template TRes The type of the result of the function.\n * @returns A promise that resolves when the function succeeds.\n */\n\nexport async function retry<TRes>(\n func: () => Promise<TRes>, \n options?: { \n maxRetries?: number,\n backoff?: ((retries: number) => number),\n onRetry: (error?: unknown, retry?: number) => void\n }\n): Promise<TRes> {\n const backOffFn = options?.backoff ?? (retries => (2 ** retries) * 100);\n const maxRetries = options?.maxRetries ?? 5;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const onRetry = options?.onRetry ?? (() => {});\n let retries = 0;\n let lastError: unknown;\n\n while (retries <= maxRetries) {\n try {\n if (retries > 0)\n onRetry(lastError, retries);\n return await func();\n } catch (error) {\n lastError = error;\n retries++;\n if (retries > maxRetries) {\n throw error;\n }\n await sleep(backOffFn(retries));\n }\n }\n\n throw new Error('Retry terminated without success, this should never happen');\n}","/**\n * Returns a new promise that will reject with an error after a specified timeout. \n *\n * @example\n * try {\n * await timeout(fetch('https://example.com'), 1000);\n * } catch (error) {\n * console.log(error.message);\n * // => 'Promise timed out after 1000ms'\n * }\n * @template TRes - The type of the resolved value.\n * @param promise - The promise to wrap.\n * @param timeout - The timeout in milliseconds.\n * \n * @returns A new promise that will reject with an error after the specified timeout.\n */\nexport function timeout<TRes>(promise: Promise<TRes>, timeout: number): Promise<TRes> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(`Promise timed out after ${timeout}ms`));\n }, timeout);\n \n promise.then(\n (result) => {\n clearTimeout(timeoutId);\n resolve(result);\n },\n (error) => {\n clearTimeout(timeoutId);\n reject(error);\n }\n );\n });\n}","/**\n * Split a string into words. Can deal with camelCase, PascalCase & snake_case.\n * \n * @example\n * splitWords('camelCase')\n * // => ['camel', 'Case']\n * \n * splitWords('PascalCase')\n * // => ['Pascal', 'Case']\n * \n * splitWords('hello_world-123')\n * // => ['hello', 'world', '123']\n * \n * @param str The string to split into words.\n * @returns An array of words.\n */\n\nexport function splitWords(str: string): string[] {\n // Split non-alphanumeric characters with spaces and deal with camel/PascalCase\n const regex = new RegExp(\n '[^\\\\dA-Za-z]' + // match any character that is not a letter or a digit\n '|' + // or\n '(?<=[a-z])' + // lookbehind for a lowercase letter\n '(?=[A-Z])' + // lookahead for an uppercase letter\n '|' + // or\n '(?<=[A-Z])' + // lookbehind for an uppercase letter\n '(?=[A-Z][a-z])' // lookahead for an uppercase letter followed by a lowercase letter\n );\n\n return str.split(regex).filter(Boolean);\n}","/**\n * Deburrs a string by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @example\n * deburr('déjà vu')\n * // => 'deja vu'\n * @param str - The string to deburr.\n * @returns Returns the deburred string.\n */\n\nexport function deburr(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/[^\\u0000-\\u007E]/g, (chr: string) =>\n chr.normalize('NFD').replace(/[\\u0300-\\u036F]/g, ''));\n}\n","import { splitWords } from '@string/splitWords';\n\nimport { deburr } from './deburr.js';\n\n/**\n * Converts `string` to camelCase.\n *\n * @example\n * camelCase('Foo Bar')\n * // => 'fooBar'\n * camelCase('--foo-bar--')\n * // => 'fooBar'\n * camelCase('__FOO_BAR__')\n * // => 'fooBar'\n * @param str - The string to convert.\n * @returns Returns the camel cased string.\n */\n\nexport function camelCase(str: string): string {\n str = deburr(str);\n const words = splitWords(str);\n\n // Capitalize the first letter of each word\n const camelCase = words.map((word: string, index: number) => {\n if (index === 0) {\n return word.toLowerCase();\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return camelCase.join('');\n}\n","/**\n * Converts the first character of a string to upper case and the remaining to lower case.\n *\n * @example\n * capitalize('FRED')\n * // => 'Fred'\n * @param str - The string to capitalize.\n * @returns Returns the capitalized string.\n */\n\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Converts the characters `&`, `<`, `>`, `\"` and `'` in a string to their corresponding HTML entities.\n *\n * @example\n * escapeHtml('fred, barney, & pebbles')\n * // => 'fred, barney, & pebbles'\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escapeHtml(str: string): string {\n const escapeChars: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\\'': ''',\n '\"': '"'\n };\n return str.replace(/[\"&'<>]/g, char => escapeChars[char] || char);\n}\n","/**\n * Escapes the `RegExp` special characters `^`, `$`, `\\`, `.`, `*`, `+`,\n * `?`, `(`, `)`, `[`, `]`, `{`, `}`, and `|` in a string.\n *\n * @example\n * escapeRegExp('[moderndash](https://moderndash.io/)')\n * // => '\\[moderndash\\]\\(https://moderndash\\.io/\\)'\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escapeRegExp(str: string): string {\n return str.replace(/[$()*+.?[\\\\\\]^{|}]/g, '\\\\$&');\n}\n","import { splitWords } from '@string/splitWords';\n\nimport { deburr } from './deburr.js';\n\n/**\n * Converts a string to kebab-case.\n *\n * @example\n * kebabCase('Foo Bar')\n * // => 'foo-bar'\n * kebabCase('fooBar')\n * // => 'foo-bar'\n * kebabCase('__FOO_BAR__')\n * // => 'foo-bar'\n * kebabCase('Héllo World')\n * // => 'hello-world'\n * \n * @param str - The string to convert.\n * @returns Returns the kebab cased string.\n */\n\nexport function kebabCase(str: string): string {\n str = deburr(str);\n const words = splitWords(str);\n let kebabCase = '';\n for (const word of words) {\n kebabCase += word.toLowerCase() + '-';\n }\n return kebabCase.slice(0, -1);\n}\n","import { splitWords } from '@string/splitWords';\n\nimport { deburr } from './deburr.js';\n\n\n/**\n * Converts a string to PascalCase.\n *\n * @example\n * pascalCase('Foo Bar')\n * // => 'FooBar'\n * pascalCase('fooBar')\n * // => 'FooBar'\n * pascalCase('__FOO_BAR__')\n * // => 'FooBar'\n * pascalCase('Héllo World')\n * // => 'HelloWorld'\n * \n * @param str - The string to convert.\n * @returns Returns the pascal cased string.\n */\n\nexport function pascalCase(str: string): string {\n str = deburr(str);\n const words = splitWords(str);\n let pascalCase = '';\n for (const word of words) {\n pascalCase += word.charAt(0).toUpperCase() + word.slice(1);\n }\n return pascalCase;\n}\n","import { splitWords } from '@string/splitWords';\n\nimport { deburr } from './deburr.js';\n\n/**\n * Converts a string to snake_case.\n *\n * @example\n * snakeCase('Foo Bar')\n * // => 'foo_bar'\n * snakeCase('fooBar')\n * // => 'foo_bar'\n * snakeCase('--FOO-BAR--')\n * // => 'foo_bar'\n * snakeCase('foo2bar')\n * // => 'foo_2_bar'\n * snakeCase('Héllo World')\n * // => 'hello_world'\n * @param str - The string to convert.\n * @returns Returns the snake cased string.\n */\n\nexport function snakeCase(str: string): string {\n str = deburr(str);\n const words = splitWords(str);\n let snakeCase = '';\n for (const word of words) {\n if (snakeCase.length > 0) {\n snakeCase += '_';\n }\n snakeCase += word.toLowerCase();\n }\n return snakeCase;\n}\n","import { splitWords } from '@string/splitWords';\n\nimport { deburr } from './deburr.js';\n\n/**\n * Converts a string to Title Case.\n *\n * @example\n * titleCase('--foo-bar--')\n * // => 'Foo Bar'\n * titleCase('fooBar')\n * // => 'Foo Bar'\n * titleCase('__FOO_BAR__')\n * // => 'Foo Bar'\n * titleCase('HélloWorld')\n * // => 'Hello World'\n * @param str - The string to convert.\n * @returns Returns the title cased string.\n */\n\nexport function titleCase(str: string): string {\n str = deburr(str);\n const words = splitWords(str);\n let titleCase = '';\n for (const word of words) {\n titleCase += word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ' ';\n }\n return titleCase.trimEnd();\n}\n","/**\n * Converts the HTML entities `&`, `<`, `>`, `"` and `'`\n * in a string to their corresponding characters.\n *\n * @example\n * unescapeHtml('fred, barney, & pebbles')\n * // => 'fred, barney, & pebbles'\n * @param str - The string to unescape.\n * @returns Returns the unescaped string.\n */\n\nexport function unescapeHtml(str: string): string {\n const entityMap: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': '\\''\n };\n return str.replace(/&(?:amp|lt|gt|quot|#(0+)?39);/g, (entity: string) => entityMap[entity] || entity);\n}\n","/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @example\n * isEmpty(null)\n * // => true\n *\n * isEmpty({})\n * // => true\n *\n * isEmpty(\"\")\n * // => true\n *\n * isEmpty([1, 2, 3])\n * // => false\n *\n * isEmpty('abc')\n * // => false\n *\n * isEmpty({ 'a': 1 })\n * // => false\n * @param value - The value to check.\n * @returns Returns `true` if given vlaue is empty, else `false`.\n */\n\nexport function isEmpty(value: string | object | null | undefined): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n\n if (typeof value === 'string' || Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (value instanceof Map || value instanceof Set) {\n return value.size === 0;\n }\n\n if (typeof value === 'object') {\n return Object.keys(value).length === 0;\n }\n\n return false;\n}\n","/**\n * Checks if given string is a valid URL\n *\n * @example\n * isUrl('https://google.com')\n * // => true\n * isUrl('google.com')\n * // => false\n * @param str - The string to check.\n * @returns Returns `true` if given string is a valid URL, else `false`.\n */\n\nexport function isUrl(str: string): boolean {\n try {\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}"],"mappings":"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","names":["difference","intersection","count","count","retries","timeout","camelCase","kebabCase","pascalCase","snakeCase","titleCase"]}
|
package/package.json
CHANGED