moderndash 0.7.5 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -21,14 +21,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
23
  Queue: () => Queue,
24
- after: () => after,
25
- before: () => before,
26
24
  camelCase: () => camelCase,
27
25
  capitalize: () => capitalize,
28
26
  chunk: () => chunk,
29
27
  count: () => count,
30
28
  debounce: () => debounce,
31
29
  deburr: () => deburr,
30
+ decMaxCalls: () => decMaxCalls,
31
+ decMinCalls: () => decMinCalls,
32
32
  difference: () => difference,
33
33
  dropRightWhile: () => dropRightWhile,
34
34
  dropWhile: () => dropWhile,
@@ -41,10 +41,11 @@ __export(src_exports, {
41
41
  isPlainObject: () => isPlainObject,
42
42
  isUrl: () => isUrl,
43
43
  kebabCase: () => kebabCase,
44
+ maxCalls: () => maxCalls,
44
45
  memoize: () => memoize,
45
46
  merge: () => merge,
47
+ minCalls: () => minCalls,
46
48
  omit: () => omit,
47
- once: () => once,
48
49
  pascalCase: () => pascalCase,
49
50
  pick: () => pick,
50
51
  races: () => races,
@@ -62,6 +63,7 @@ __export(src_exports, {
62
63
  throttle: () => throttle,
63
64
  timeout: () => timeout,
64
65
  times: () => times,
66
+ toDecorator: () => toDecorator,
65
67
  unescapeHtml: () => unescapeHtml,
66
68
  unique: () => unique
67
69
  });
@@ -281,27 +283,13 @@ function unique(array, compareFn = (a, b) => isEqual(a, b)) {
281
283
  });
282
284
  }
283
285
 
284
- // src/function/after.ts
285
- function after(n, func) {
286
- let count2 = 1;
287
- return (...args) => {
288
- if (count2 >= n) {
289
- return func(...args);
290
- }
291
- count2 += 1;
292
- };
293
- }
294
-
295
- // src/function/before.ts
296
- function before(n, func) {
297
- let count2 = 0;
298
- let result;
299
- return (...args) => {
300
- if (count2 < n) {
301
- count2 += 1;
302
- result = func(...args);
303
- }
304
- return result;
286
+ // src/decorator/toDecorator.ts
287
+ function toDecorator(func) {
288
+ return function(...args) {
289
+ return function(target, key, descriptor) {
290
+ const creatorArgs = [descriptor.value, ...args];
291
+ descriptor.value = func(...creatorArgs);
292
+ };
305
293
  };
306
294
  }
307
295
 
@@ -394,16 +382,30 @@ function debounce(fn, wait = 0, options = {}) {
394
382
  return debounced;
395
383
  }
396
384
 
385
+ // src/function/maxCalls.ts
386
+ function maxCalls(func, n) {
387
+ let count2 = 0;
388
+ let result;
389
+ return function(...args) {
390
+ if (count2 < n) {
391
+ count2 += 1;
392
+ result = func.apply(this, args);
393
+ }
394
+ return result;
395
+ };
396
+ }
397
+ var decMaxCalls = toDecorator(maxCalls);
398
+
397
399
  // src/function/memoize.ts
398
400
  var defaultResolver = (...args) => JSON.stringify(args);
399
401
  function memoize(func, resolver = defaultResolver) {
400
402
  const cache = /* @__PURE__ */ new Map();
401
- const memoizedFunc = (...args) => {
403
+ const memoizedFunc = function(...args) {
402
404
  const key = resolver(...args);
403
405
  if (cache.has(key)) {
404
406
  return cache.get(key);
405
407
  }
406
- const result = func(...args);
408
+ const result = func.apply(this, args);
407
409
  cache.set(key, result);
408
410
  return result;
409
411
  };
@@ -411,10 +413,17 @@ function memoize(func, resolver = defaultResolver) {
411
413
  return memoizedFunc;
412
414
  }
413
415
 
414
- // src/function/once.ts
415
- function once(func) {
416
- return before(1, func);
416
+ // src/function/minCalls.ts
417
+ function minCalls(func, n) {
418
+ let count2 = 1;
419
+ return function(...args) {
420
+ if (count2 > n) {
421
+ return func.apply(this, args);
422
+ }
423
+ count2 += 1;
424
+ };
417
425
  }
426
+ var decMinCalls = toDecorator(minCalls);
418
427
 
419
428
  // src/function/throttle.ts
420
429
  function throttle(func, wait = 0, options = {}) {
@@ -426,7 +435,7 @@ function throttle(func, wait = 0, options = {}) {
426
435
  }
427
436
 
428
437
  // src/function/times.ts
429
- function times(n, func) {
438
+ function times(func, n) {
430
439
  const result = [];
431
440
  for (let i = 0; i < n; i++) {
432
441
  result.push(func(i));
@@ -741,14 +750,14 @@ function isUrl(str) {
741
750
  // Annotate the CommonJS export names for ESM import in node:
742
751
  0 && (module.exports = {
743
752
  Queue,
744
- after,
745
- before,
746
753
  camelCase,
747
754
  capitalize,
748
755
  chunk,
749
756
  count,
750
757
  debounce,
751
758
  deburr,
759
+ decMaxCalls,
760
+ decMinCalls,
752
761
  difference,
753
762
  dropRightWhile,
754
763
  dropWhile,
@@ -761,10 +770,11 @@ function isUrl(str) {
761
770
  isPlainObject,
762
771
  isUrl,
763
772
  kebabCase,
773
+ maxCalls,
764
774
  memoize,
765
775
  merge,
776
+ minCalls,
766
777
  omit,
767
- once,
768
778
  pascalCase,
769
779
  pick,
770
780
  races,
@@ -782,6 +792,7 @@ function isUrl(str) {
782
792
  throttle,
783
793
  timeout,
784
794
  times,
795
+ toDecorator,
785
796
  unescapeHtml,
786
797
  unique
787
798
  });
@@ -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/function/after.ts","../src/function/before.ts","../src/function/debounce.ts","../src/function/memoize.ts","../src/function/once.ts","../src/function/throttle.ts","../src/function/times.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/startCase.ts","../src/string/stripSpecial.ts","../src/string/unescapeHtml.ts","../src/validate/isEmpty.ts","../src/validate/isUrl.ts"],"sourcesContent":["export * from './array';\nexport * from './function';\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 * @returns Returns the new array of chunks.\n * @param chunkSize - The array to process.\n * @param array - The length of each chunk\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 */\n\nexport function chunk<TInput>(array: TInput[], chunkSize: number): TInput[][] {\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","import type { ObjectKey } from '@type/ObjectKey';\n\n/**\n * Creates an object with counts of occurrences of items in the array.\n *\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 * @returns Returns the composed aggregate object.\n */\n\nexport function count<TInput, TKey extends ObjectKey>(array: TInput[], criteria: (value: TInput) => 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 '@helpers/types.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 '@helpers/types';\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 { MinimumTwoArrays } from '@helpers/types';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Creates an array values not included in the other given arrays. \n * The order and references of result values are determined by the first array.\n *\n * An compare function is optinal to specify how the elements of the arrays are compared. \n * Default compare function is {@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 * @returns Returns the new array of filtered values.\n */\n\nexport function difference<TArr>(...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function difference<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function difference<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: MinimumTwoArrays<TArr>): 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 difference: TArr[] = [];\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 * @returns Returns the slice of `array`.\n */\n\nexport function dropRightWhile<TArr>(array: TArr[], predicate: (value: TArr) => 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 * @returns Returns the slice of `array`.\n */\n\nexport function dropWhile<TArr>(array: TArr[], predicate: (value: TArr) => boolean): TArr[] {\n const index = array.findIndex(x => !predicate(x));\n return array.slice(index === -1 ? array.length : index);\n}\n","import type { ObjectKey } from '@type/ObjectKey';\n\n/**\n * Creates an object with grouped items in the array.\n * The critiria provides the key to group by.\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 * @param collection - The array or object to iterate over.\n * @param criteria - The criteria to group by.\n * @returns An object with grouped items.\n */\n\nexport function group<TArr, TKey extends ObjectKey>(array: TArr[], criteria: (value: TArr) => TKey | boolean): Record<TKey, TArr[]> {\n const result = {} as Record<TKey, TArr[]>;\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 { MinimumTwoArrays } from '@helpers/types';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Creates an array of unique values that are included in all given arrays. \n * The order and references of result values are determined by the first array.\n *\n * An compare function is optinal to specify how the elements of the arrays are compared. \n * Default compare function is {@link isEqual}.\n * @example\n * intersection([2, 1], [2, 3])\n * // => [2]\n *\n * // ---- Custom compare function ----\n * intersection((a, b) => Math.floor(a) === Math.floor(b), [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: MinimumTwoArrays<TArr>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: MinimumTwoArrays<TArr>): 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. \n * An iteratee function is optional to sort the array based on a specific property.\n *\n * @example\n * sort([1, 2, 3, 4], 'desc')\n * // => [4, 3, 2, 1]\n *\n * sort([{ a: 1 }, { a: 2 }, { a: 3 }], 'asc', item => item.a)\n * // => [{ a: 1 }, { a: 2 }, { a: 3 }]\n * @param array - The array to sort.\n * @param order - The order in which to sort the array.\n * @param iteratee - The iteratee function to sort the array based on a specific property.\n * @returns Returns the sorted array.\n */\n\nexport function sort<TInput>(array: TInput[], order?: 'asc' | 'desc', iteratee?: (item: TInput) => number | bigint | Date | string): TInput[] {\n return [...array].sort((a, b) => {\n const aValue = iteratee ? iteratee(a) : a;\n const bValue = iteratee ? iteratee(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 return 0;\n });\n}\n","/**\n * Creates a slice of `array` with elements taken from the end. \n * Elements are taken until `predicate` returns falsey.\n *\n * @returns Returns the slice of `array`.\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 */\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.\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 '@helpers/types.js';\n\n/**\n * The opposite of `before`. This method creates a function that invokes `func` once it's called `n` or more times.\n *\n * @example\n * const caution = () => console.log(\"Caution!\");\n * const afterFN = after(2, caution);\n *\n * afterFN()\n * afterFN()\n * afterFN()\n * // => `caution` is invoked after called twice\n * @param n The number of calls before `func` is invoked.\n * @param func The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function after<TFunc extends GenericFunction<TFunc>>(n: number, func: TFunc) {\n let count = 1;\n return (...args: Parameters<TFunc>): ReturnType<TFunc> | undefined => {\n if (count >= n) {\n return func(...args);\n }\n count += 1;\n };\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\n/**\n * Creates a function that invokes `func`, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @param n - The number of calls at which `func` is no longer invoked.\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n * @example\n * const caution = () => console.log(\"Caution!\");\n *\n * // Only call caution two times\n * const reducedCaution = before(2, caution)\n *\n * reducedCaution()\n * reducedCaution()\n * reducedCaution()\n * // => `caution` is invoked twice\n */\n\nexport function before<TFunc extends GenericFunction<TFunc>>(n: number, func: TFunc): TFunc {\n let count = 0;\n let result: ReturnType<TFunc>;\n return ((...args: Parameters<TFunc>): ReturnType<TFunc> => {\n if (count < n) {\n count += 1;\n result = func(...args);\n }\n return result;\n }) as TFunc;\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\n// TODO this is a port from lodash, it probably can be improved and shortened, also fix TS errors\nexport function debounce<TFunc extends GenericFunction<TFunc>>(\n fn: TFunc, wait = 0, options: { leading?: boolean, maxWait?: number, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n let lastArgs: Parameters<TFunc> | undefined;\n let lastThis: ThisParameterType<TFunc> | undefined;\n let result: ReturnType<TFunc>;\n let timerId: ReturnType<typeof setTimeout> | undefined;\n let lastCallTime: number | undefined;\n let lastInvokeTime = 0;\n const maxing = options.maxWait ?? false;\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n const maxWait = options.maxWait ?? 0;\n\n function invokeFunc(time: number) {\n const args: Parameters<TFunc> | undefined = lastArgs;\n const thisArg: ThisParameterType<TFunc> | undefined = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n // @ts-expect-error\n result = fn.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time: number) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time: number) {\n // @ts-expect-error\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n const timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time: number) {\n if (lastCallTime === undefined)\n return true;\n\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return timeSinceLastCall >= wait || timeSinceLastCall < 0 || (maxing && timeSinceLastInvoke >= maxWait);\n }\n\n function timerExpired() {\n const time = Date.now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time: number) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `fn` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(Date.now());\n }\n\n function debounced(this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const time = Date.now();\n const isInvoking = shouldInvoke(time);\n\n lastArgs = args;\n // TODO Fix this assignment\n // eslint-disable-next-line @typescript-eslint/no-this-alias,unicorn/no-this-assignment\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n","import type{ GenericFunction } from '@helpers/types.js';\n\nconst defaultResolver = (...args: unknown[]) => JSON.stringify(args);\n\n/**\n * Creates a function that memoizes the result of `func`.\n * If `resolver` is provided, it determines the cache key for storing the result based on the arguments provided to the memoized function. \n * By default, all arguments provided to the memoized function are used as the map cache key.\n *\n * The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @example\n * const object = { 'a': 1, 'b': 2 }\n *\n * const values = memoize(values)\n * values(object)\n * // => [1, 2]\n *\n * values(object)\n * // => [1, 2]\n *\n * object.a = 2\n * values(object)\n * // => [2, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b'])\n * values(object)\n * // => ['a', 'b']\n *\n * // Replace `memoize.Cache`.\n * memoize.Cache = WeakMap\n * @param func - The function to have its output memoized.\n * @param resolver - The function to resolve the cache key.\n * @returns Returns the new memoized function.\n */\n\nexport function memoize<TFunc extends GenericFunction<TFunc>, Cache extends Map<string | symbol, ReturnType<TFunc>>>(\n func: TFunc, resolver: ((...args: Parameters<TFunc>) => string | symbol) = defaultResolver\n): TFunc & { cache: Cache } {\n\n const cache = new Map() as Cache;\n const memoizedFunc = (...args: Parameters<TFunc>): ReturnType<TFunc> => {\n const key = resolver(...args);\n if (cache.has(key)) {\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n return cache.get(key) as ReturnType<TFunc>;\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n };\n memoizedFunc.cache = cache;\n return memoizedFunc as TFunc & { cache: Cache };\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\nimport { before } from '@function/before';\n\n/**\n * Creates a function that is restricted to invoking `func` once.\n * Repeat calls to the function return the value of the first invocation.\n *\n * @example\n * const initialize = once(() => console.log('initialize'))\n * initialize()\n * initialize()\n * // => `createApplication` is invoked once\n *\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function once<TFunc extends GenericFunction<TFunc>>(func: TFunc): TFunc {\n return before(1, func);\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\nimport { debounce } from '@function/debounce';\n\nexport function throttle<TFunc extends GenericFunction<TFunc>>(\n func: TFunc, wait = 0, options: { leading?: boolean, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n return debounce(func, wait, {\n leading: options.leading ?? true,\n maxWait: wait,\n trailing: options.trailing ?? true\n });\n}\n","/**\n * Invokes a function `n` times, returning an array of the results of\n * each invocation.\n *\n * The function is invoked with one argument: `index`\n *\n * @example\n * times(3, index => console.log(\"Run\", index)))\n * // => \"Run 0\" | \"Run 1\" | \"Run 2\"\n * times(3, Math.random)\n * // => [0.123, 0.456, 0.789]\n * times(4, () => 0)\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>(n: number, func: (index: number) => TInput): TInput[] {\n const result: TInput[] = [];\n for (let i = 0; i < n; i++) {\n result.push(func(i));\n }\n return result;\n}","import type { PlainObject } from '@helpers/types.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * Deep merge two or more objects.\n * \n * @example\n * // ---- Nested objects are merged ----\n * merge({ a: 1 }, { b: 2 }, { c: 3 }) \n * // => { a: 1, b: 2, c: 3 }\n * \n * merge({ a: { b: 1 } }, { a: { c: 2 } })\n * // => { a: { b: 1, c: 2 } }\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 The merged object\n */\n\nexport function merge(target: PlainObject, ...sources: PlainObject[]): PlainObject {\n for (const source of sources) {\n for (const [key, value] of Object.entries(source)) {\n target[key] = isPlainObject(value) && isPlainObject(target[key]) \n ? merge(target[key] as PlainObject, value) \n : value;\n }\n }\n return target;\n}","import type { PlainObject } from '@helpers/types.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 '@helpers/types.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 '@helpers/types.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * Sets the value at path of object. If a portion of path doesn’t exist, it’s created.\n * \n * TODO: Add support for array paths.\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(obj: PlainObject, path: string, value: unknown): PlainObject {\n const pathParts = path.split('.');\n const lastPathPart = pathParts.pop()!;\n\n let currentObj = obj;\n for (const pathPart of pathParts) {\n if (!isPlainObject(currentObj[pathPart])) {\n currentObj[pathPart] = {};\n }\n currentObj = currentObj[pathPart] as PlainObject;\n }\n\n currentObj[lastPathPart] = value;\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 * ---\n * \n * **Methods:**\n * - {@link Queue.add} - adds a async function or array of functions to the queue. \n * Returns a promise that resolves when the added function(s) finish.\n * - {@link Queue.clear} - clears the queue.\n * - {@link Queue.pause} - pauses the queue.\n * - {@link Queue.resume} - resumes the queue. \n * - {@link Queue.getQueue} - returns the queue.\n * - {@link Queue.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 * escape('fred, barney, & pebbles')\n * // => 'fred, barney, &amp; 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 '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\\'': '&#39;',\n '\"': '&quot;'\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 { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to Start Case.\n *\n * @example\n * startCase('--foo-bar--')\n * // => 'Foo Bar'\n * startCase('fooBar')\n * // => 'Foo Bar'\n * startCase('__FOO_BAR__')\n * // => 'Foo Bar'\n * startCase('HélloWorld')\n * // => 'Hello World'\n * @param str - The string to convert.\n * @returns Returns the start cased string.\n */\n\nexport function startCase(str: string): string {\n const words = splitWords(str);\n let startCase = '';\n for (const word of words) {\n startCase += word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ' ';\n }\n return startCase.trimEnd();\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","/**\n * Converts the HTML entities `&amp;`, `&lt;`, `&gt;`, `&quot;` and `&#39;`\n * in a string to their corresponding characters.\n *\n * @example\n * unescapeHtml('fred, barney, &amp; 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 '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': '\\''\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","startCase"]}
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/function/maxCalls.ts","../src/function/memoize.ts","../src/function/minCalls.ts","../src/function/throttle.ts","../src/function/times.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/startCase.ts","../src/string/stripSpecial.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 './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 * @returns Returns the new array of chunks.\n * @param chunkSize - The array to process.\n * @param array - The length of each chunk\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 */\n\nexport function chunk<TInput>(array: TInput[], chunkSize: number): TInput[][] {\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 *\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 * @returns Returns the composed aggregate object.\n */\n\nexport function count<TInput, TKey extends PropertyKey>(array: TInput[], criteria: (value: TInput) => 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 '@helpers/types.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 '@helpers/types';\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 { MinimumTwoArrays } from '@helpers/types';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Creates an array values not included in the other given arrays. \n * The order and references of result values are determined by the first array.\n *\n * An compare function is optinal to specify how the elements of the arrays are compared. \n * Default compare function is {@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 * @returns Returns the new array of filtered values.\n */\n\nexport function difference<TArr>(...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function difference<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function difference<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: MinimumTwoArrays<TArr>): 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 difference: TArr[] = [];\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 * @returns Returns the slice of `array`.\n */\n\nexport function dropRightWhile<TArr>(array: TArr[], predicate: (value: TArr) => 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 * @returns Returns the slice of `array`.\n */\n\nexport function dropWhile<TArr>(array: TArr[], predicate: (value: TArr) => boolean): TArr[] {\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 * The critiria provides the key to group by.\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 * @param collection - The array or object to iterate over.\n * @param criteria - The criteria to group by.\n * @returns An object with grouped items.\n */\n\nexport function group<TArr, TKey extends PropertyKey>(array: TArr[], criteria: (value: TArr) => TKey | boolean): Record<TKey, TArr[]> {\n const result = {} as Record<TKey, TArr[]>;\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 { MinimumTwoArrays } from '@helpers/types';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Creates an array of unique values that are included in all given arrays. \n * The order and references of result values are determined by the first array.\n *\n * An compare function is optinal to specify how the elements of the arrays are compared. \n * Default compare function is {@link isEqual}.\n * @example\n * intersection([2, 1], [2, 3])\n * // => [2]\n *\n * // ---- Custom compare function ----\n * intersection((a, b) => Math.floor(a) === Math.floor(b), [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: MinimumTwoArrays<TArr>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: MinimumTwoArrays<TArr>): 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. \n * An iteratee function is optional to sort the array based on a specific property.\n *\n * @example\n * sort([1, 2, 3, 4], 'desc')\n * // => [4, 3, 2, 1]\n *\n * sort([{ a: 1 }, { a: 2 }, { a: 3 }], 'asc', item => item.a)\n * // => [{ a: 1 }, { a: 2 }, { a: 3 }]\n * @param array - The array to sort.\n * @param order - The order in which to sort the array.\n * @param iteratee - The iteratee function to sort the array based on a specific property.\n * @returns Returns the sorted array.\n */\n\nexport function sort<TInput>(array: TInput[], order?: 'asc' | 'desc', iteratee?: (item: TInput) => number | bigint | Date | string): TInput[] {\n return [...array].sort((a, b) => {\n const aValue = iteratee ? iteratee(a) : a;\n const bValue = iteratee ? iteratee(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 return 0;\n });\n}\n","/**\n * Creates a slice of `array` with elements taken from the end. \n * Elements are taken until `predicate` returns falsey.\n *\n * @returns Returns the slice of `array`.\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 */\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.\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 '@helpers/types.js';\n\ntype Tail<T extends unknown[]> = T extends [infer _Head, ...infer Tail] ? Tail : never;\n\n/**\n * \n * \n * @example\n * const caution = () => console.log(\"Caution!\");\n * \n * @param func\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 '@helpers/types.js';\n\n// TODO this is a port from lodash, it probably can be improved and shortened, also fix TS errors\nexport function debounce<TFunc extends GenericFunction<TFunc>>(\n fn: TFunc, wait = 0, options: { leading?: boolean, maxWait?: number, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n let lastArgs: Parameters<TFunc> | undefined;\n let lastThis: ThisParameterType<TFunc> | undefined;\n let result: ReturnType<TFunc>;\n let timerId: ReturnType<typeof setTimeout> | undefined;\n let lastCallTime: number | undefined;\n let lastInvokeTime = 0;\n const maxing = options.maxWait ?? false;\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n const maxWait = options.maxWait ?? 0;\n\n function invokeFunc(time: number) {\n const args: Parameters<TFunc> | undefined = lastArgs;\n const thisArg: ThisParameterType<TFunc> | undefined = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n // @ts-expect-error\n result = fn.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time: number) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time: number) {\n // @ts-expect-error\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n const timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time: number) {\n if (lastCallTime === undefined)\n return true;\n\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return timeSinceLastCall >= wait || timeSinceLastCall < 0 || (maxing && timeSinceLastInvoke >= maxWait);\n }\n\n function timerExpired() {\n const time = Date.now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time: number) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `fn` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(Date.now());\n }\n\n function debounced(this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const time = Date.now();\n const isInvoking = shouldInvoke(time);\n\n lastArgs = args;\n // TODO Fix this assignment\n // eslint-disable-next-line @typescript-eslint/no-this-alias,unicorn/no-this-assignment\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\nimport { toDecorator } from '@decorator/toDecorator.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(2, addCount)\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: ThisParameterType<TFunc>, ...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\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 * 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 */\nexport const decMaxCalls = toDecorator(maxCalls);","import type{ GenericFunction } from '@helpers/types.js';\n\nconst defaultResolver = (...args: unknown[]) => JSON.stringify(args);\n\n/**\n * Creates a function that memoizes the result of `func`.\n * If `resolver` is provided, it determines the cache key for storing the result based on the arguments provided to the memoized function. \n * By default, all arguments provided to the memoized function are used as the map cache key.\n *\n * The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @example\n * const object = { 'a': 1, 'b': 2 }\n *\n * const values = memoize(values)\n * values(object)\n * // => [1, 2]\n *\n * values(object)\n * // => [1, 2]\n *\n * object.a = 2\n * values(object)\n * // => [2, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b'])\n * values(object)\n * // => ['a', 'b']\n *\n * // Replace `memoize.Cache`.\n * memoize.Cache = WeakMap\n * @param func - The function to have its output memoized.\n * @param resolver - The function to resolve the cache key.\n * @returns Returns the new memoized function.\n */\n\nexport function memoize<TFunc extends GenericFunction<TFunc>, Cache extends Map<string | symbol, ReturnType<TFunc>>>(\n func: TFunc, resolver: ((...args: Parameters<TFunc>) => string | symbol) = defaultResolver\n): TFunc & { cache: Cache } {\n const cache = new Map() as Cache;\n\n const memoizedFunc = function (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const key = resolver(...args);\n if (cache.has(key)) {\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n return cache.get(key) as ReturnType<TFunc>;\n }\n const result = func.apply(this, args);\n cache.set(key, result);\n return result;\n };\n \n memoizedFunc.cache = cache;\n return memoizedFunc as TFunc & { cache: Cache };\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\nimport { toDecorator } from '@decorator/toDecorator.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 minCalls = after(caution, 2);\n *\n * minCalls()\n * minCalls()\n * minCalls()\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: ThisParameterType<TFunc>, ...args: Parameters<TFunc>): ReturnType<TFunc> | undefined {\n if (count > n) {\n return func.apply(this, args);\n }\n count += 1;\n };\n}\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 * class TestClass {\n * @decAfter(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 runAfter The number of calls before the decorated function is invoked.\n */\n\nexport const decMinCalls = toDecorator(minCalls);","import type { GenericFunction } from '@helpers/types.js';\n\nimport { debounce } from '@function/debounce';\n\nexport function throttle<TFunc extends GenericFunction<TFunc>>(\n func: TFunc, wait = 0, options: { leading?: boolean, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n return debounce(func, wait, {\n leading: options.leading ?? true,\n maxWait: wait,\n trailing: options.trailing ?? true\n });\n}\n","/**\n * Invokes a function `n` times, returning an array of the results of\n * each invocation.\n * \n * @example\n * times(3, index => console.log(\"Run\", index)))\n * // => \"Run 0\" | \"Run 1\" | \"Run 2\"\n * times(3, Math.random)\n * // => [0.123, 0.456, 0.789]\n * times(4, () => 0)\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\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}","import type { PlainObject } from '@helpers/types.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * Deep merge two or more objects.\n * \n * @example\n * // ---- Nested objects are merged ----\n * merge({ a: 1 }, { b: 2 }, { c: 3 }) \n * // => { a: 1, b: 2, c: 3 }\n * \n * merge({ a: { b: 1 } }, { a: { c: 2 } })\n * // => { a: { b: 1, c: 2 } }\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 The merged object\n */\n\nexport function merge(target: PlainObject, ...sources: PlainObject[]): PlainObject {\n for (const source of sources) {\n for (const [key, value] of Object.entries(source)) {\n target[key] = isPlainObject(value) && isPlainObject(target[key]) \n ? merge(target[key] as PlainObject, value) \n : value;\n }\n }\n return target;\n}","import type { PlainObject } from '@helpers/types.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 '@helpers/types.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 '@helpers/types.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * Sets the value at path of object. If a portion of path doesn’t exist, it’s created.\n * \n * TODO: Add support for array paths.\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(obj: PlainObject, path: string, value: unknown): PlainObject {\n const pathParts = path.split('.');\n const lastPathPart = pathParts.pop()!;\n\n let currentObj = obj;\n for (const pathPart of pathParts) {\n if (!isPlainObject(currentObj[pathPart])) {\n currentObj[pathPart] = {};\n }\n currentObj = currentObj[pathPart] as PlainObject;\n }\n\n currentObj[lastPathPart] = value;\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 * ---\n * \n * **Methods:**\n * - {@link Queue.add} - adds a async function or array of functions to the queue. \n * Returns a promise that resolves when the added function(s) finish.\n * - {@link Queue.clear} - clears the queue.\n * - {@link Queue.pause} - pauses the queue.\n * - {@link Queue.resume} - resumes the queue. \n * - {@link Queue.getQueue} - returns the queue.\n * - {@link Queue.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 * escape('fred, barney, & pebbles')\n * // => 'fred, barney, &amp; 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 '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\\'': '&#39;',\n '\"': '&quot;'\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 { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to Start Case.\n *\n * @example\n * startCase('--foo-bar--')\n * // => 'Foo Bar'\n * startCase('fooBar')\n * // => 'Foo Bar'\n * startCase('__FOO_BAR__')\n * // => 'Foo Bar'\n * startCase('HélloWorld')\n * // => 'Hello World'\n * @param str - The string to convert.\n * @returns Returns the start cased string.\n */\n\nexport function startCase(str: string): string {\n const words = splitWords(str);\n let startCase = '';\n for (const word of words) {\n startCase += word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ' ';\n }\n return startCase.trimEnd();\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","/**\n * Converts the HTML entities `&amp;`, `&lt;`, `&gt;`, `&quot;` and `&#39;`\n * in a string to their corresponding characters.\n *\n * @example\n * unescapeHtml('fred, barney, &amp; 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 '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': '\\''\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","startCase"]}
package/dist/index.d.ts CHANGED
@@ -13,12 +13,6 @@
13
13
  */
14
14
  declare function chunk<TInput>(array: TInput[], chunkSize: number): TInput[][];
15
15
 
16
- /**
17
- * This type is used to define the key type of a plain object.
18
- * An object key can be a string, number or symbol.
19
- */
20
- type ObjectKey = string | number | symbol;
21
-
22
16
  /**
23
17
  * Creates an object with counts of occurrences of items in the array.
24
18
  *
@@ -40,7 +34,7 @@ type ObjectKey = string | number | symbol;
40
34
  * @param array - The array or record to iterate over.
41
35
  * @returns Returns the composed aggregate object.
42
36
  */
43
- declare function count<TInput, TKey extends ObjectKey>(array: TInput[], criteria: (value: TInput) => TKey | boolean): Record<TKey, number>;
37
+ declare function count<TInput, TKey extends PropertyKey>(array: TInput[], criteria: (value: TInput) => TKey | boolean): Record<TKey, number>;
44
38
 
45
39
  type MinimumTwoArrays<TInput> = [TInput[], TInput[], ...TInput[][]];
46
40
  /**
@@ -48,7 +42,7 @@ type MinimumTwoArrays<TInput> = [TInput[], TInput[], ...TInput[][]];
48
42
  * @typeParam TFunc - The input function type
49
43
  */
50
44
  type GenericFunction<TFunc extends (...args: any) => any> = (...args: Parameters<TFunc>) => ReturnType<TFunc>;
51
- type PlainObject$1 = Record<ObjectKey, unknown>;
45
+ type PlainObject$1 = Record<PropertyKey, unknown>;
52
46
 
53
47
  /**
54
48
  * Creates an array values not included in the other given arrays.
@@ -87,7 +81,7 @@ declare function difference<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean,
87
81
  * { 'user': 'pebbles', 'active': true }
88
82
  * ]
89
83
  *
90
- * dropRightWhile(users, { active }) => active)
84
+ * dropRightWhile(users, ({ active }) => active)
91
85
  * // => objects for ['barney']
92
86
  * @param predicate - The function invoked per iteration.
93
87
  * @param array - The array to query.
@@ -128,7 +122,7 @@ declare function dropWhile<TArr>(array: TArr[], predicate: (value: TArr) => bool
128
122
  * @param criteria - The criteria to group by.
129
123
  * @returns An object with grouped items.
130
124
  */
131
- declare function group<TArr, TKey extends ObjectKey>(array: TArr[], criteria: (value: TArr) => TKey | boolean): Record<TKey, TArr[]>;
125
+ declare function group<TArr, TKey extends PropertyKey>(array: TArr[], criteria: (value: TArr) => TKey | boolean): Record<TKey, TArr[]>;
132
126
 
133
127
  /**
134
128
  * Creates an array of unique values that are included in all given arrays.
@@ -266,48 +260,69 @@ declare function takeWhile<TArr>(array: TArr[], predicate: (elem: TArr) => boole
266
260
  */
267
261
  declare function unique<TInput>(array: TInput[], compareFn?: (a: TInput, b: TInput) => boolean): TInput[];
268
262
 
263
+ type Tail<T extends unknown[]> = T extends [infer _Head, ...infer Tail] ? Tail : never;
269
264
  /**
270
- * The opposite of `before`. This method creates a function that invokes `func` once it's called `n` or more times.
265
+ *
271
266
  *
272
267
  * @example
273
268
  * const caution = () => console.log("Caution!");
274
- * const afterFN = after(2, caution);
275
269
  *
276
- * afterFN()
277
- * afterFN()
278
- * afterFN()
279
- * // => `caution` is invoked after called twice
280
- * @param n The number of calls before `func` is invoked.
281
- * @param func The function to restrict.
282
- * @returns Returns the new restricted function.
270
+ * @param func
271
+ * @returns A decorator function that can be used to decorate a method.
283
272
  */
284
- declare function after<TFunc extends GenericFunction<TFunc>>(n: number, func: TFunc): (...args: Parameters<TFunc>) => ReturnType<TFunc> | undefined;
273
+ declare function toDecorator<TFunc extends GenericFunction<TFunc>>(func: TFunc): (...args: Tail<Parameters<TFunc>>) => (target: unknown, key: string, descriptor: PropertyDescriptor) => void;
274
+
275
+ declare function debounce<TFunc extends GenericFunction<TFunc>>(fn: TFunc, wait?: number, options?: {
276
+ leading?: boolean;
277
+ maxWait?: number;
278
+ trailing?: boolean;
279
+ }): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc>;
285
280
 
286
281
  /**
287
- * Creates a function that invokes `func`, while it's called less than `n` times. Subsequent
288
- * calls to the created function return the result of the last `func` invocation.
282
+ * Creates a function that invokes the given function as long as it's called `<= n` times.
283
+ *
284
+ * Subsequent calls to the created function return the result of the last `func` invocation.
285
+ *
286
+ * This function can be used as a decorator with {@link decMaxCalls}.
287
+ * @example
288
+ * let count = 0;
289
+ * const addCount = () => ++count;
290
+ *
291
+ * // Allow addCount to be invoked twice.
292
+ * const limitAddCount = maxCalls(2, addCount)
289
293
  *
290
- * @param n - The number of calls at which `func` is no longer invoked.
294
+ * limitAddCount() // => 1
295
+ * limitAddCount() // => 2
296
+ * limitAddCount() // => 2
297
+ * // => `limitAddCount` is invoked twice and the result is cached.
298
+ * @param n - The number of calls before the cached result is returned.
291
299
  * @param func - The function to restrict.
292
300
  * @returns Returns the new restricted function.
293
- * @example
294
- * const caution = () => console.log("Caution!");
301
+ */
302
+ declare function maxCalls<TFunc extends GenericFunction<TFunc>>(func: TFunc, n: number): TFunc;
303
+ /**
304
+ * Only invokes the decorated function as long as it's called `<= n` times.
305
+ * Subsequent calls to the decorated function return the result of the last invocation.
306
+ *
307
+ * Look at {@link maxCalls} for the non-decorator version.
295
308
  *
296
- * // Only call caution two times
297
- * const reducedCaution = before(2, caution)
309
+ * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*
310
+ *
311
+ * @example
312
+ * class TestClass {
313
+ * private count = 0;
314
+ * @decMaxCalls(2)
315
+ * testMethod() {
316
+ * return ++this.count;
317
+ * }
318
+ * }
319
+ * const instance = new TestClass();
320
+ * instance.testMethod(); // => 1
321
+ * instance.testMethod(); // => 2
322
+ * instance.testMethod(); // => 2
298
323
  *
299
- * reducedCaution()
300
- * reducedCaution()
301
- * reducedCaution()
302
- * // => `caution` is invoked twice
303
324
  */
304
- declare function before<TFunc extends GenericFunction<TFunc>>(n: number, func: TFunc): TFunc;
305
-
306
- declare function debounce<TFunc extends GenericFunction<TFunc>>(fn: TFunc, wait?: number, options?: {
307
- leading?: boolean;
308
- maxWait?: number;
309
- trailing?: boolean;
310
- }): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc>;
325
+ declare const decMaxCalls: (n: number) => (target: unknown, key: string, descriptor: PropertyDescriptor) => void;
311
326
 
312
327
  /**
313
328
  * Creates a function that memoizes the result of `func`.
@@ -350,19 +365,44 @@ declare function memoize<TFunc extends GenericFunction<TFunc>, Cache extends Map
350
365
  };
351
366
 
352
367
  /**
353
- * Creates a function that is restricted to invoking `func` once.
354
- * Repeat calls to the function return the value of the first invocation.
368
+ * Creates a function that invokes the given function once it's called more than `n` times.
369
+ * Returns undefined until the minimum call count is reached.
355
370
  *
371
+ * This function can be used as a decorator with {@link decMinCalls}.
356
372
  * @example
357
- * const initialize = once(() => console.log('initialize'))
358
- * initialize()
359
- * initialize()
360
- * // => `createApplication` is invoked once
373
+ * const caution = () => console.log("Caution!");
374
+ * const minCalls = after(caution, 2);
361
375
  *
362
- * @param func - The function to restrict.
376
+ * minCalls()
377
+ * minCalls()
378
+ * minCalls()
379
+ * // => `caution` is invoked on the third call.
380
+ * @param n The number of calls before the given function is invoked.
381
+ * @param func The function to restrict.
363
382
  * @returns Returns the new restricted function.
364
383
  */
365
- declare function once<TFunc extends GenericFunction<TFunc>>(func: TFunc): TFunc;
384
+ declare function minCalls<TFunc extends GenericFunction<TFunc>>(func: TFunc, n: number): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> | undefined;
385
+ /**
386
+ * Only invokes the decorated function after it's called more than `n` times.
387
+ *
388
+ * Look at {@link minCalls} for the non-decorator version.
389
+ *
390
+ * *Requires TypeScript >=5.0 or `experimentalDecorators` flag enabled.*
391
+ * @example
392
+ * class TestClass {
393
+ * @decAfter(2)
394
+ * testMethod() {
395
+ * return 1;
396
+ * }
397
+ * }
398
+ * const instance = new TestClass();
399
+ * instance.testMethod(); // => undefined
400
+ * instance.testMethod(); // => undefined
401
+ * instance.testMethod(); // => 1
402
+ *
403
+ * @param runAfter The number of calls before the decorated function is invoked.
404
+ */
405
+ declare const decMinCalls: (n: number) => (target: unknown, key: string, descriptor: PropertyDescriptor) => void;
366
406
 
367
407
  declare function throttle<TFunc extends GenericFunction<TFunc>>(func: TFunc, wait?: number, options?: {
368
408
  leading?: boolean;
@@ -373,8 +413,6 @@ declare function throttle<TFunc extends GenericFunction<TFunc>>(func: TFunc, wai
373
413
  * Invokes a function `n` times, returning an array of the results of
374
414
  * each invocation.
375
415
  *
376
- * The function is invoked with one argument: `index`
377
- *
378
416
  * @example
379
417
  * times(3, index => console.log("Run", index)))
380
418
  * // => "Run 0" | "Run 1" | "Run 2"
@@ -386,7 +424,7 @@ declare function throttle<TFunc extends GenericFunction<TFunc>>(func: TFunc, wai
386
424
  * @param func - The function invoked per iteration.
387
425
  * @returns Returns an array of results.
388
426
  */
389
- declare function times<TInput>(n: number, func: (index: number) => TInput): TInput[];
427
+ declare function times<TInput>(func: (index: number) => TInput, n: number): TInput[];
390
428
 
391
429
  /**
392
430
  * Deep merge two or more objects.
@@ -778,7 +816,7 @@ declare function unescapeHtml(str: string): string;
778
816
  * obj = [1, 2, 3];
779
817
  * // => Type 'number[]' is not assignable to type 'PlainObject'.
780
818
  */
781
- type PlainObject = Record<ObjectKey, unknown>;
819
+ type PlainObject = Record<PropertyKey, unknown>;
782
820
 
783
821
  /**
784
822
  * Checks if `value` is an empty object, collection, map, or set.
@@ -866,4 +904,4 @@ declare function isPlainObject(value: unknown): value is PlainObject$1;
866
904
  */
867
905
  declare function isUrl(str: string): boolean;
868
906
 
869
- export { ObjectKey, PlainObject, Queue, after, before, camelCase, capitalize, chunk, count, debounce, deburr, difference, dropRightWhile, dropWhile, escapeHtml, escapeRegExp, group, intersection, isEmpty, isEqual, isPlainObject, isUrl, kebabCase, memoize, merge, omit, once, pascalCase, pick, races, retry, sample, set, shuffle, sleep, snakeCase, sort, startCase, stripSpecial, takeRightWhile, takeWhile, throttle, timeout, times, unescapeHtml, unique };
907
+ export { PlainObject, Queue, camelCase, capitalize, chunk, count, debounce, deburr, decMaxCalls, decMinCalls, difference, dropRightWhile, dropWhile, escapeHtml, escapeRegExp, group, intersection, isEmpty, isEqual, isPlainObject, isUrl, kebabCase, maxCalls, memoize, merge, minCalls, omit, pascalCase, pick, races, retry, sample, set, shuffle, sleep, snakeCase, sort, startCase, stripSpecial, takeRightWhile, takeWhile, throttle, timeout, times, toDecorator, unescapeHtml, unique };
package/dist/index.js CHANGED
@@ -212,27 +212,13 @@ function unique(array, compareFn = (a, b) => isEqual(a, b)) {
212
212
  });
213
213
  }
214
214
 
215
- // src/function/after.ts
216
- function after(n, func) {
217
- let count2 = 1;
218
- return (...args) => {
219
- if (count2 >= n) {
220
- return func(...args);
221
- }
222
- count2 += 1;
223
- };
224
- }
225
-
226
- // src/function/before.ts
227
- function before(n, func) {
228
- let count2 = 0;
229
- let result;
230
- return (...args) => {
231
- if (count2 < n) {
232
- count2 += 1;
233
- result = func(...args);
234
- }
235
- return result;
215
+ // src/decorator/toDecorator.ts
216
+ function toDecorator(func) {
217
+ return function(...args) {
218
+ return function(target, key, descriptor) {
219
+ const creatorArgs = [descriptor.value, ...args];
220
+ descriptor.value = func(...creatorArgs);
221
+ };
236
222
  };
237
223
  }
238
224
 
@@ -325,16 +311,30 @@ function debounce(fn, wait = 0, options = {}) {
325
311
  return debounced;
326
312
  }
327
313
 
314
+ // src/function/maxCalls.ts
315
+ function maxCalls(func, n) {
316
+ let count2 = 0;
317
+ let result;
318
+ return function(...args) {
319
+ if (count2 < n) {
320
+ count2 += 1;
321
+ result = func.apply(this, args);
322
+ }
323
+ return result;
324
+ };
325
+ }
326
+ var decMaxCalls = toDecorator(maxCalls);
327
+
328
328
  // src/function/memoize.ts
329
329
  var defaultResolver = (...args) => JSON.stringify(args);
330
330
  function memoize(func, resolver = defaultResolver) {
331
331
  const cache = /* @__PURE__ */ new Map();
332
- const memoizedFunc = (...args) => {
332
+ const memoizedFunc = function(...args) {
333
333
  const key = resolver(...args);
334
334
  if (cache.has(key)) {
335
335
  return cache.get(key);
336
336
  }
337
- const result = func(...args);
337
+ const result = func.apply(this, args);
338
338
  cache.set(key, result);
339
339
  return result;
340
340
  };
@@ -342,10 +342,17 @@ function memoize(func, resolver = defaultResolver) {
342
342
  return memoizedFunc;
343
343
  }
344
344
 
345
- // src/function/once.ts
346
- function once(func) {
347
- return before(1, func);
345
+ // src/function/minCalls.ts
346
+ function minCalls(func, n) {
347
+ let count2 = 1;
348
+ return function(...args) {
349
+ if (count2 > n) {
350
+ return func.apply(this, args);
351
+ }
352
+ count2 += 1;
353
+ };
348
354
  }
355
+ var decMinCalls = toDecorator(minCalls);
349
356
 
350
357
  // src/function/throttle.ts
351
358
  function throttle(func, wait = 0, options = {}) {
@@ -357,7 +364,7 @@ function throttle(func, wait = 0, options = {}) {
357
364
  }
358
365
 
359
366
  // src/function/times.ts
360
- function times(n, func) {
367
+ function times(func, n) {
361
368
  const result = [];
362
369
  for (let i = 0; i < n; i++) {
363
370
  result.push(func(i));
@@ -671,14 +678,14 @@ function isUrl(str) {
671
678
  }
672
679
  export {
673
680
  Queue,
674
- after,
675
- before,
676
681
  camelCase,
677
682
  capitalize,
678
683
  chunk,
679
684
  count,
680
685
  debounce,
681
686
  deburr,
687
+ decMaxCalls,
688
+ decMinCalls,
682
689
  difference,
683
690
  dropRightWhile,
684
691
  dropWhile,
@@ -691,10 +698,11 @@ export {
691
698
  isPlainObject,
692
699
  isUrl,
693
700
  kebabCase,
701
+ maxCalls,
694
702
  memoize,
695
703
  merge,
704
+ minCalls,
696
705
  omit,
697
- once,
698
706
  pascalCase,
699
707
  pick,
700
708
  races,
@@ -712,6 +720,7 @@ export {
712
720
  throttle,
713
721
  timeout,
714
722
  times,
723
+ toDecorator,
715
724
  unescapeHtml,
716
725
  unique
717
726
  };
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/function/after.ts","../src/function/before.ts","../src/function/debounce.ts","../src/function/memoize.ts","../src/function/once.ts","../src/function/throttle.ts","../src/function/times.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/startCase.ts","../src/string/stripSpecial.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 * @returns Returns the new array of chunks.\n * @param chunkSize - The array to process.\n * @param array - The length of each chunk\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 */\n\nexport function chunk<TInput>(array: TInput[], chunkSize: number): TInput[][] {\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","import type { ObjectKey } from '@type/ObjectKey';\n\n/**\n * Creates an object with counts of occurrences of items in the array.\n *\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 * @returns Returns the composed aggregate object.\n */\n\nexport function count<TInput, TKey extends ObjectKey>(array: TInput[], criteria: (value: TInput) => 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 '@helpers/types.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 '@helpers/types';\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 { MinimumTwoArrays } from '@helpers/types';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Creates an array values not included in the other given arrays. \n * The order and references of result values are determined by the first array.\n *\n * An compare function is optinal to specify how the elements of the arrays are compared. \n * Default compare function is {@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 * @returns Returns the new array of filtered values.\n */\n\nexport function difference<TArr>(...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function difference<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function difference<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: MinimumTwoArrays<TArr>): 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 difference: TArr[] = [];\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 * @returns Returns the slice of `array`.\n */\n\nexport function dropRightWhile<TArr>(array: TArr[], predicate: (value: TArr) => 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 * @returns Returns the slice of `array`.\n */\n\nexport function dropWhile<TArr>(array: TArr[], predicate: (value: TArr) => boolean): TArr[] {\n const index = array.findIndex(x => !predicate(x));\n return array.slice(index === -1 ? array.length : index);\n}\n","import type { ObjectKey } from '@type/ObjectKey';\n\n/**\n * Creates an object with grouped items in the array.\n * The critiria provides the key to group by.\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 * @param collection - The array or object to iterate over.\n * @param criteria - The criteria to group by.\n * @returns An object with grouped items.\n */\n\nexport function group<TArr, TKey extends ObjectKey>(array: TArr[], criteria: (value: TArr) => TKey | boolean): Record<TKey, TArr[]> {\n const result = {} as Record<TKey, TArr[]>;\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 { MinimumTwoArrays } from '@helpers/types';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Creates an array of unique values that are included in all given arrays. \n * The order and references of result values are determined by the first array.\n *\n * An compare function is optinal to specify how the elements of the arrays are compared. \n * Default compare function is {@link isEqual}.\n * @example\n * intersection([2, 1], [2, 3])\n * // => [2]\n *\n * // ---- Custom compare function ----\n * intersection((a, b) => Math.floor(a) === Math.floor(b), [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: MinimumTwoArrays<TArr>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: MinimumTwoArrays<TArr>): 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. \n * An iteratee function is optional to sort the array based on a specific property.\n *\n * @example\n * sort([1, 2, 3, 4], 'desc')\n * // => [4, 3, 2, 1]\n *\n * sort([{ a: 1 }, { a: 2 }, { a: 3 }], 'asc', item => item.a)\n * // => [{ a: 1 }, { a: 2 }, { a: 3 }]\n * @param array - The array to sort.\n * @param order - The order in which to sort the array.\n * @param iteratee - The iteratee function to sort the array based on a specific property.\n * @returns Returns the sorted array.\n */\n\nexport function sort<TInput>(array: TInput[], order?: 'asc' | 'desc', iteratee?: (item: TInput) => number | bigint | Date | string): TInput[] {\n return [...array].sort((a, b) => {\n const aValue = iteratee ? iteratee(a) : a;\n const bValue = iteratee ? iteratee(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 return 0;\n });\n}\n","/**\n * Creates a slice of `array` with elements taken from the end. \n * Elements are taken until `predicate` returns falsey.\n *\n * @returns Returns the slice of `array`.\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 */\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.\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 '@helpers/types.js';\n\n/**\n * The opposite of `before`. This method creates a function that invokes `func` once it's called `n` or more times.\n *\n * @example\n * const caution = () => console.log(\"Caution!\");\n * const afterFN = after(2, caution);\n *\n * afterFN()\n * afterFN()\n * afterFN()\n * // => `caution` is invoked after called twice\n * @param n The number of calls before `func` is invoked.\n * @param func The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function after<TFunc extends GenericFunction<TFunc>>(n: number, func: TFunc) {\n let count = 1;\n return (...args: Parameters<TFunc>): ReturnType<TFunc> | undefined => {\n if (count >= n) {\n return func(...args);\n }\n count += 1;\n };\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\n/**\n * Creates a function that invokes `func`, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @param n - The number of calls at which `func` is no longer invoked.\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n * @example\n * const caution = () => console.log(\"Caution!\");\n *\n * // Only call caution two times\n * const reducedCaution = before(2, caution)\n *\n * reducedCaution()\n * reducedCaution()\n * reducedCaution()\n * // => `caution` is invoked twice\n */\n\nexport function before<TFunc extends GenericFunction<TFunc>>(n: number, func: TFunc): TFunc {\n let count = 0;\n let result: ReturnType<TFunc>;\n return ((...args: Parameters<TFunc>): ReturnType<TFunc> => {\n if (count < n) {\n count += 1;\n result = func(...args);\n }\n return result;\n }) as TFunc;\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\n// TODO this is a port from lodash, it probably can be improved and shortened, also fix TS errors\nexport function debounce<TFunc extends GenericFunction<TFunc>>(\n fn: TFunc, wait = 0, options: { leading?: boolean, maxWait?: number, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n let lastArgs: Parameters<TFunc> | undefined;\n let lastThis: ThisParameterType<TFunc> | undefined;\n let result: ReturnType<TFunc>;\n let timerId: ReturnType<typeof setTimeout> | undefined;\n let lastCallTime: number | undefined;\n let lastInvokeTime = 0;\n const maxing = options.maxWait ?? false;\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n const maxWait = options.maxWait ?? 0;\n\n function invokeFunc(time: number) {\n const args: Parameters<TFunc> | undefined = lastArgs;\n const thisArg: ThisParameterType<TFunc> | undefined = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n // @ts-expect-error\n result = fn.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time: number) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time: number) {\n // @ts-expect-error\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n const timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time: number) {\n if (lastCallTime === undefined)\n return true;\n\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return timeSinceLastCall >= wait || timeSinceLastCall < 0 || (maxing && timeSinceLastInvoke >= maxWait);\n }\n\n function timerExpired() {\n const time = Date.now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time: number) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `fn` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(Date.now());\n }\n\n function debounced(this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const time = Date.now();\n const isInvoking = shouldInvoke(time);\n\n lastArgs = args;\n // TODO Fix this assignment\n // eslint-disable-next-line @typescript-eslint/no-this-alias,unicorn/no-this-assignment\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n","import type{ GenericFunction } from '@helpers/types.js';\n\nconst defaultResolver = (...args: unknown[]) => JSON.stringify(args);\n\n/**\n * Creates a function that memoizes the result of `func`.\n * If `resolver` is provided, it determines the cache key for storing the result based on the arguments provided to the memoized function. \n * By default, all arguments provided to the memoized function are used as the map cache key.\n *\n * The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @example\n * const object = { 'a': 1, 'b': 2 }\n *\n * const values = memoize(values)\n * values(object)\n * // => [1, 2]\n *\n * values(object)\n * // => [1, 2]\n *\n * object.a = 2\n * values(object)\n * // => [2, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b'])\n * values(object)\n * // => ['a', 'b']\n *\n * // Replace `memoize.Cache`.\n * memoize.Cache = WeakMap\n * @param func - The function to have its output memoized.\n * @param resolver - The function to resolve the cache key.\n * @returns Returns the new memoized function.\n */\n\nexport function memoize<TFunc extends GenericFunction<TFunc>, Cache extends Map<string | symbol, ReturnType<TFunc>>>(\n func: TFunc, resolver: ((...args: Parameters<TFunc>) => string | symbol) = defaultResolver\n): TFunc & { cache: Cache } {\n\n const cache = new Map() as Cache;\n const memoizedFunc = (...args: Parameters<TFunc>): ReturnType<TFunc> => {\n const key = resolver(...args);\n if (cache.has(key)) {\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n return cache.get(key) as ReturnType<TFunc>;\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n };\n memoizedFunc.cache = cache;\n return memoizedFunc as TFunc & { cache: Cache };\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\nimport { before } from '@function/before';\n\n/**\n * Creates a function that is restricted to invoking `func` once.\n * Repeat calls to the function return the value of the first invocation.\n *\n * @example\n * const initialize = once(() => console.log('initialize'))\n * initialize()\n * initialize()\n * // => `createApplication` is invoked once\n *\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function once<TFunc extends GenericFunction<TFunc>>(func: TFunc): TFunc {\n return before(1, func);\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\nimport { debounce } from '@function/debounce';\n\nexport function throttle<TFunc extends GenericFunction<TFunc>>(\n func: TFunc, wait = 0, options: { leading?: boolean, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n return debounce(func, wait, {\n leading: options.leading ?? true,\n maxWait: wait,\n trailing: options.trailing ?? true\n });\n}\n","/**\n * Invokes a function `n` times, returning an array of the results of\n * each invocation.\n *\n * The function is invoked with one argument: `index`\n *\n * @example\n * times(3, index => console.log(\"Run\", index)))\n * // => \"Run 0\" | \"Run 1\" | \"Run 2\"\n * times(3, Math.random)\n * // => [0.123, 0.456, 0.789]\n * times(4, () => 0)\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>(n: number, func: (index: number) => TInput): TInput[] {\n const result: TInput[] = [];\n for (let i = 0; i < n; i++) {\n result.push(func(i));\n }\n return result;\n}","import type { PlainObject } from '@helpers/types.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * Deep merge two or more objects.\n * \n * @example\n * // ---- Nested objects are merged ----\n * merge({ a: 1 }, { b: 2 }, { c: 3 }) \n * // => { a: 1, b: 2, c: 3 }\n * \n * merge({ a: { b: 1 } }, { a: { c: 2 } })\n * // => { a: { b: 1, c: 2 } }\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 The merged object\n */\n\nexport function merge(target: PlainObject, ...sources: PlainObject[]): PlainObject {\n for (const source of sources) {\n for (const [key, value] of Object.entries(source)) {\n target[key] = isPlainObject(value) && isPlainObject(target[key]) \n ? merge(target[key] as PlainObject, value) \n : value;\n }\n }\n return target;\n}","import type { PlainObject } from '@helpers/types.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 '@helpers/types.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 '@helpers/types.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * Sets the value at path of object. If a portion of path doesn’t exist, it’s created.\n * \n * TODO: Add support for array paths.\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(obj: PlainObject, path: string, value: unknown): PlainObject {\n const pathParts = path.split('.');\n const lastPathPart = pathParts.pop()!;\n\n let currentObj = obj;\n for (const pathPart of pathParts) {\n if (!isPlainObject(currentObj[pathPart])) {\n currentObj[pathPart] = {};\n }\n currentObj = currentObj[pathPart] as PlainObject;\n }\n\n currentObj[lastPathPart] = value;\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 * ---\n * \n * **Methods:**\n * - {@link Queue.add} - adds a async function or array of functions to the queue. \n * Returns a promise that resolves when the added function(s) finish.\n * - {@link Queue.clear} - clears the queue.\n * - {@link Queue.pause} - pauses the queue.\n * - {@link Queue.resume} - resumes the queue. \n * - {@link Queue.getQueue} - returns the queue.\n * - {@link Queue.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 * escape('fred, barney, & pebbles')\n * // => 'fred, barney, &amp; 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 '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\\'': '&#39;',\n '\"': '&quot;'\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 { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to Start Case.\n *\n * @example\n * startCase('--foo-bar--')\n * // => 'Foo Bar'\n * startCase('fooBar')\n * // => 'Foo Bar'\n * startCase('__FOO_BAR__')\n * // => 'Foo Bar'\n * startCase('HélloWorld')\n * // => 'Hello World'\n * @param str - The string to convert.\n * @returns Returns the start cased string.\n */\n\nexport function startCase(str: string): string {\n const words = splitWords(str);\n let startCase = '';\n for (const word of words) {\n startCase += word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ' ';\n }\n return startCase.trimEnd();\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","/**\n * Converts the HTML entities `&amp;`, `&lt;`, `&gt;`, `&quot;` and `&#39;`\n * in a string to their corresponding characters.\n *\n * @example\n * unescapeHtml('fred, barney, &amp; 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 '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': '\\''\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","startCase"]}
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/function/maxCalls.ts","../src/function/memoize.ts","../src/function/minCalls.ts","../src/function/throttle.ts","../src/function/times.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/startCase.ts","../src/string/stripSpecial.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 * @returns Returns the new array of chunks.\n * @param chunkSize - The array to process.\n * @param array - The length of each chunk\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 */\n\nexport function chunk<TInput>(array: TInput[], chunkSize: number): TInput[][] {\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 *\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 * @returns Returns the composed aggregate object.\n */\n\nexport function count<TInput, TKey extends PropertyKey>(array: TInput[], criteria: (value: TInput) => 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 '@helpers/types.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 '@helpers/types';\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 { MinimumTwoArrays } from '@helpers/types';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Creates an array values not included in the other given arrays. \n * The order and references of result values are determined by the first array.\n *\n * An compare function is optinal to specify how the elements of the arrays are compared. \n * Default compare function is {@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 * @returns Returns the new array of filtered values.\n */\n\nexport function difference<TArr>(...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function difference<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function difference<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: MinimumTwoArrays<TArr>): 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 difference: TArr[] = [];\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 * @returns Returns the slice of `array`.\n */\n\nexport function dropRightWhile<TArr>(array: TArr[], predicate: (value: TArr) => 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 * @returns Returns the slice of `array`.\n */\n\nexport function dropWhile<TArr>(array: TArr[], predicate: (value: TArr) => boolean): TArr[] {\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 * The critiria provides the key to group by.\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 * @param collection - The array or object to iterate over.\n * @param criteria - The criteria to group by.\n * @returns An object with grouped items.\n */\n\nexport function group<TArr, TKey extends PropertyKey>(array: TArr[], criteria: (value: TArr) => TKey | boolean): Record<TKey, TArr[]> {\n const result = {} as Record<TKey, TArr[]>;\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 { MinimumTwoArrays } from '@helpers/types';\n\nimport { isEqual } from '@validate/isEqual';\n\n/**\n * Creates an array of unique values that are included in all given arrays. \n * The order and references of result values are determined by the first array.\n *\n * An compare function is optinal to specify how the elements of the arrays are compared. \n * Default compare function is {@link isEqual}.\n * @example\n * intersection([2, 1], [2, 3])\n * // => [2]\n *\n * // ---- Custom compare function ----\n * intersection((a, b) => Math.floor(a) === Math.floor(b), [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: MinimumTwoArrays<TArr>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: (a: TArr, b: TArr) => boolean, ...arrays: MinimumTwoArrays<TArr>): TArr[];\nexport function intersection<TArr>(arrayOrCompFn: TArr[] | ((a: TArr, b: TArr) => boolean), ...arrays: MinimumTwoArrays<TArr>): 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. \n * An iteratee function is optional to sort the array based on a specific property.\n *\n * @example\n * sort([1, 2, 3, 4], 'desc')\n * // => [4, 3, 2, 1]\n *\n * sort([{ a: 1 }, { a: 2 }, { a: 3 }], 'asc', item => item.a)\n * // => [{ a: 1 }, { a: 2 }, { a: 3 }]\n * @param array - The array to sort.\n * @param order - The order in which to sort the array.\n * @param iteratee - The iteratee function to sort the array based on a specific property.\n * @returns Returns the sorted array.\n */\n\nexport function sort<TInput>(array: TInput[], order?: 'asc' | 'desc', iteratee?: (item: TInput) => number | bigint | Date | string): TInput[] {\n return [...array].sort((a, b) => {\n const aValue = iteratee ? iteratee(a) : a;\n const bValue = iteratee ? iteratee(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 return 0;\n });\n}\n","/**\n * Creates a slice of `array` with elements taken from the end. \n * Elements are taken until `predicate` returns falsey.\n *\n * @returns Returns the slice of `array`.\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 */\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.\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 '@helpers/types.js';\n\ntype Tail<T extends unknown[]> = T extends [infer _Head, ...infer Tail] ? Tail : never;\n\n/**\n * \n * \n * @example\n * const caution = () => console.log(\"Caution!\");\n * \n * @param func\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 '@helpers/types.js';\n\n// TODO this is a port from lodash, it probably can be improved and shortened, also fix TS errors\nexport function debounce<TFunc extends GenericFunction<TFunc>>(\n fn: TFunc, wait = 0, options: { leading?: boolean, maxWait?: number, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n let lastArgs: Parameters<TFunc> | undefined;\n let lastThis: ThisParameterType<TFunc> | undefined;\n let result: ReturnType<TFunc>;\n let timerId: ReturnType<typeof setTimeout> | undefined;\n let lastCallTime: number | undefined;\n let lastInvokeTime = 0;\n const maxing = options.maxWait ?? false;\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n const maxWait = options.maxWait ?? 0;\n\n function invokeFunc(time: number) {\n const args: Parameters<TFunc> | undefined = lastArgs;\n const thisArg: ThisParameterType<TFunc> | undefined = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n // @ts-expect-error\n result = fn.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time: number) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time: number) {\n // @ts-expect-error\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n const timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time: number) {\n if (lastCallTime === undefined)\n return true;\n\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return timeSinceLastCall >= wait || timeSinceLastCall < 0 || (maxing && timeSinceLastInvoke >= maxWait);\n }\n\n function timerExpired() {\n const time = Date.now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time: number) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `fn` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(Date.now());\n }\n\n function debounced(this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const time = Date.now();\n const isInvoking = shouldInvoke(time);\n\n lastArgs = args;\n // TODO Fix this assignment\n // eslint-disable-next-line @typescript-eslint/no-this-alias,unicorn/no-this-assignment\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\nimport { toDecorator } from '@decorator/toDecorator.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(2, addCount)\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: ThisParameterType<TFunc>, ...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\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 * 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 */\nexport const decMaxCalls = toDecorator(maxCalls);","import type{ GenericFunction } from '@helpers/types.js';\n\nconst defaultResolver = (...args: unknown[]) => JSON.stringify(args);\n\n/**\n * Creates a function that memoizes the result of `func`.\n * If `resolver` is provided, it determines the cache key for storing the result based on the arguments provided to the memoized function. \n * By default, all arguments provided to the memoized function are used as the map cache key.\n *\n * The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @example\n * const object = { 'a': 1, 'b': 2 }\n *\n * const values = memoize(values)\n * values(object)\n * // => [1, 2]\n *\n * values(object)\n * // => [1, 2]\n *\n * object.a = 2\n * values(object)\n * // => [2, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b'])\n * values(object)\n * // => ['a', 'b']\n *\n * // Replace `memoize.Cache`.\n * memoize.Cache = WeakMap\n * @param func - The function to have its output memoized.\n * @param resolver - The function to resolve the cache key.\n * @returns Returns the new memoized function.\n */\n\nexport function memoize<TFunc extends GenericFunction<TFunc>, Cache extends Map<string | symbol, ReturnType<TFunc>>>(\n func: TFunc, resolver: ((...args: Parameters<TFunc>) => string | symbol) = defaultResolver\n): TFunc & { cache: Cache } {\n const cache = new Map() as Cache;\n\n const memoizedFunc = function (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const key = resolver(...args);\n if (cache.has(key)) {\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n return cache.get(key) as ReturnType<TFunc>;\n }\n const result = func.apply(this, args);\n cache.set(key, result);\n return result;\n };\n \n memoizedFunc.cache = cache;\n return memoizedFunc as TFunc & { cache: Cache };\n}\n","import type { GenericFunction } from '@helpers/types.js';\n\nimport { toDecorator } from '@decorator/toDecorator.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 minCalls = after(caution, 2);\n *\n * minCalls()\n * minCalls()\n * minCalls()\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: ThisParameterType<TFunc>, ...args: Parameters<TFunc>): ReturnType<TFunc> | undefined {\n if (count > n) {\n return func.apply(this, args);\n }\n count += 1;\n };\n}\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 * class TestClass {\n * @decAfter(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 runAfter The number of calls before the decorated function is invoked.\n */\n\nexport const decMinCalls = toDecorator(minCalls);","import type { GenericFunction } from '@helpers/types.js';\n\nimport { debounce } from '@function/debounce';\n\nexport function throttle<TFunc extends GenericFunction<TFunc>>(\n func: TFunc, wait = 0, options: { leading?: boolean, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n return debounce(func, wait, {\n leading: options.leading ?? true,\n maxWait: wait,\n trailing: options.trailing ?? true\n });\n}\n","/**\n * Invokes a function `n` times, returning an array of the results of\n * each invocation.\n * \n * @example\n * times(3, index => console.log(\"Run\", index)))\n * // => \"Run 0\" | \"Run 1\" | \"Run 2\"\n * times(3, Math.random)\n * // => [0.123, 0.456, 0.789]\n * times(4, () => 0)\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\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}","import type { PlainObject } from '@helpers/types.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * Deep merge two or more objects.\n * \n * @example\n * // ---- Nested objects are merged ----\n * merge({ a: 1 }, { b: 2 }, { c: 3 }) \n * // => { a: 1, b: 2, c: 3 }\n * \n * merge({ a: { b: 1 } }, { a: { c: 2 } })\n * // => { a: { b: 1, c: 2 } }\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 The merged object\n */\n\nexport function merge(target: PlainObject, ...sources: PlainObject[]): PlainObject {\n for (const source of sources) {\n for (const [key, value] of Object.entries(source)) {\n target[key] = isPlainObject(value) && isPlainObject(target[key]) \n ? merge(target[key] as PlainObject, value) \n : value;\n }\n }\n return target;\n}","import type { PlainObject } from '@helpers/types.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 '@helpers/types.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 '@helpers/types.js';\n\nimport { isPlainObject } from '@validate/isPlainObject.js';\n\n/**\n * Sets the value at path of object. If a portion of path doesn’t exist, it’s created.\n * \n * TODO: Add support for array paths.\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(obj: PlainObject, path: string, value: unknown): PlainObject {\n const pathParts = path.split('.');\n const lastPathPart = pathParts.pop()!;\n\n let currentObj = obj;\n for (const pathPart of pathParts) {\n if (!isPlainObject(currentObj[pathPart])) {\n currentObj[pathPart] = {};\n }\n currentObj = currentObj[pathPart] as PlainObject;\n }\n\n currentObj[lastPathPart] = value;\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 * ---\n * \n * **Methods:**\n * - {@link Queue.add} - adds a async function or array of functions to the queue. \n * Returns a promise that resolves when the added function(s) finish.\n * - {@link Queue.clear} - clears the queue.\n * - {@link Queue.pause} - pauses the queue.\n * - {@link Queue.resume} - resumes the queue. \n * - {@link Queue.getQueue} - returns the queue.\n * - {@link Queue.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 * escape('fred, barney, & pebbles')\n * // => 'fred, barney, &amp; 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 '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\\'': '&#39;',\n '\"': '&quot;'\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 { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to Start Case.\n *\n * @example\n * startCase('--foo-bar--')\n * // => 'Foo Bar'\n * startCase('fooBar')\n * // => 'Foo Bar'\n * startCase('__FOO_BAR__')\n * // => 'Foo Bar'\n * startCase('HélloWorld')\n * // => 'Hello World'\n * @param str - The string to convert.\n * @returns Returns the start cased string.\n */\n\nexport function startCase(str: string): string {\n const words = splitWords(str);\n let startCase = '';\n for (const word of words) {\n startCase += word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ' ';\n }\n return startCase.trimEnd();\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","/**\n * Converts the HTML entities `&amp;`, `&lt;`, `&gt;`, `&quot;` and `&#39;`\n * in a string to their corresponding characters.\n *\n * @example\n * unescapeHtml('fred, barney, &amp; 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 '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': '\\''\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","startCase"]}
package/package.json CHANGED
@@ -48,5 +48,5 @@
48
48
  "tsup": "6.5.0",
49
49
  "ctix": "1.8.2"
50
50
  },
51
- "version": "0.7.5"
51
+ "version": "0.7.6"
52
52
  }