moderndash 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -20,12 +20,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
+ Queue: () => Queue,
23
24
  after: () => after,
24
25
  before: () => before,
25
26
  camelCase: () => camelCase,
26
27
  capitalize: () => capitalize,
27
28
  chunk: () => chunk,
28
29
  count: () => count,
30
+ dashCase: () => dashCase,
29
31
  debounce: () => debounce,
30
32
  deburr: () => deburr,
31
33
  difference: () => difference,
@@ -55,6 +57,7 @@ __export(src_exports, {
55
57
  takeRightWhile: () => takeRightWhile,
56
58
  takeWhile: () => takeWhile,
57
59
  throttle: () => throttle,
60
+ timeout: () => timeout,
58
61
  times: () => times,
59
62
  unescapeHtml: () => unescapeHtml,
60
63
  unique: () => unique
@@ -436,11 +439,88 @@ function omit(object, keysToOmit) {
436
439
  return pick(object, filteredKeys);
437
440
  }
438
441
 
442
+ // src/promise/queue.ts
443
+ var Queue = class {
444
+ running = 0;
445
+ maxConcurrent;
446
+ paused = false;
447
+ queue = [];
448
+ constructor(maxConcurrent) {
449
+ this.maxConcurrent = maxConcurrent;
450
+ }
451
+ add(asyncFn) {
452
+ if (Array.isArray(asyncFn)) {
453
+ const promises = asyncFn.map((fn) => this.buildWaitingPromise(fn));
454
+ return Promise.all(promises);
455
+ } else {
456
+ return this.buildWaitingPromise(asyncFn);
457
+ }
458
+ }
459
+ buildWaitingPromise(asyncFn) {
460
+ return new Promise((resolve, reject) => {
461
+ this.queue.push({ asyncFn, resolve, reject });
462
+ this.run();
463
+ });
464
+ }
465
+ run() {
466
+ while (this.queue.length > 0 && this.running < this.maxConcurrent && !this.paused) {
467
+ this.running++;
468
+ const queueElement = this.queue.shift();
469
+ void queueElement.asyncFn().then((result) => {
470
+ queueElement.resolve(result);
471
+ }).catch((error) => {
472
+ queueElement.reject(error);
473
+ }).finally(() => {
474
+ this.running--;
475
+ this.run();
476
+ });
477
+ }
478
+ }
479
+ clear() {
480
+ for (const queueElement of this.queue) {
481
+ queueElement.reject(new Error("Queue cleared"));
482
+ }
483
+ this.queue = [];
484
+ }
485
+ pause() {
486
+ this.paused = true;
487
+ }
488
+ resume() {
489
+ this.paused = false;
490
+ this.run();
491
+ }
492
+ getQueue() {
493
+ return this.queue.map((queueElement) => queueElement.asyncFn);
494
+ }
495
+ isPaused() {
496
+ return this.paused;
497
+ }
498
+ };
499
+
439
500
  // src/promise/sleep.ts
440
501
  function sleep(ms) {
441
502
  return new Promise((resolve) => setTimeout(resolve, ms));
442
503
  }
443
504
 
505
+ // src/promise/timeout.ts
506
+ function timeout(promise, timeout2) {
507
+ return new Promise((resolve, reject) => {
508
+ const timeoutId = setTimeout(() => {
509
+ reject(new Error(`Promise timed out after ${timeout2}ms`));
510
+ }, timeout2);
511
+ promise.then(
512
+ (result) => {
513
+ clearTimeout(timeoutId);
514
+ resolve(result);
515
+ },
516
+ (error) => {
517
+ clearTimeout(timeoutId);
518
+ reject(error);
519
+ }
520
+ );
521
+ });
522
+ }
523
+
444
524
  // src/string/deburr.ts
445
525
  function deburr(str) {
446
526
  return str.replace(/[^\u0000-\u007E]/g, (chr) => chr.normalize("NFD").replace(/[\u0300-\u036F]/g, ""));
@@ -472,6 +552,16 @@ function capitalize(str) {
472
552
  return str.charAt(0).toUpperCase() + str.slice(1);
473
553
  }
474
554
 
555
+ // src/string/dashCase.ts
556
+ function dashCase(str) {
557
+ const words = splitWords(str);
558
+ let dashCase2 = "";
559
+ for (const word of words) {
560
+ dashCase2 += word.toLowerCase() + "-";
561
+ }
562
+ return dashCase2.slice(0, -1);
563
+ }
564
+
475
565
  // src/string/escapeHtml.ts
476
566
  function escapeHtml(str) {
477
567
  const escapeChars = {
@@ -583,12 +673,14 @@ function isUrl(str) {
583
673
  }
584
674
  // Annotate the CommonJS export names for ESM import in node:
585
675
  0 && (module.exports = {
676
+ Queue,
586
677
  after,
587
678
  before,
588
679
  camelCase,
589
680
  capitalize,
590
681
  chunk,
591
682
  count,
683
+ dashCase,
592
684
  debounce,
593
685
  deburr,
594
686
  difference,
@@ -618,6 +710,7 @@ function isUrl(str) {
618
710
  takeRightWhile,
619
711
  takeWhile,
620
712
  throttle,
713
+ timeout,
621
714
  times,
622
715
  unescapeHtml,
623
716
  unique
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/array/chunk.ts","../src/array/count.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/pick.ts","../src/object/omit.ts","../src/promise/sleep.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/isPlainObject.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 * @category Array\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 { RecordKey } from '@helpers/types';\n\n/**\n * Creates an object composed of keys generated from the results of running \n * each element of `collection` thru `iteratee`. \n * The corresponding value of each key is the number of times the key was returned by `iteratee`.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'betty', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ]\n *\n * count(users, value => value.active);\n * // => { 'true': 2, 'false': 1 }\n * @category Array\n * @param iteratee - The iteratee to transform keys.\n * @param collection - The array or record to iterate over.\n * @returns Returns the composed aggregate object.\n */\n\nexport function count<TInput, TKey extends RecordKey>(array: TInput[], iteratee: (value: TInput) => TKey): Record<TKey, number> {\n const result = {} as Record<TKey, number>;\n for (const value of array) {\n const key = iteratee(value);\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 }\n return result;\n}\n","import type { RecordKey } from '@helpers/types';\n\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 * @category Validate\n * @param value1 - The value to compare.\n * @param value2 - The other value to compare.\n * @returns Returns `true` if the values are equivalent, else `false`.\n */\n\nexport function isEqual(value1: unknown, value2: unknown): boolean {\n if (value1 === value2) return true;\n\n if (Array.isArray(value1) && Array.isArray(value2)) {\n return isSameArray(value1, value2);\n }\n\n if (value1 instanceof RegExp && value2 instanceof RegExp) {\n return value1.toString() === value2.toString();\n }\n\n if (isObject(value1) && isObject(value2)) {\n return isSameObject(value1, value2);\n }\n\n return false;\n}\n\ntype KeyValueObject = Record<RecordKey, unknown>;\nfunction isObject(value: unknown): value is KeyValueObject {\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && Object.prototype.toString.call(value) === '[object Object]';\n}\n\nfunction isSameObject(value1: KeyValueObject, value2: KeyValueObject) {\n // check if the objects have the same keys\n const keys1 = Object.keys(value1);\n const keys2 = Object.keys(value2);\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(value1[key], value2[key])) return false;\n }\n\n // the objects are deeply equal\n return true;\n}\n\nfunction isSameArray(value1: unknown[], value2: unknown[]) {\n if (value1.length !== value2.length) return false;\n\n // check if the values of each element in the arrays are equal\n for (const [i, element] of value1.entries()) {\n if (!isEqual(element, value2[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 * @category Array\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 * @category Array\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 * @category Array\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 { RecordKey } from '@helpers/types';\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key.\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 * @category Array\n * @param collection - The array or object to iterate over.\n * @param iteratee - The iteratee to transform keys.\n * @returns Returns the composed aggregate object.\n */\n\nexport function group<T, U extends RecordKey>(array: T[], iteratee: (value: T) => U): Record<U, T[]> {\n const result = {} as Record<U, T[]>;\n for (const value of array) {\n const key = iteratee(value);\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Function\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 * @category Function\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`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, all arguments\n * 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 * @category Function\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 * @category Function\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 * @category Function\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}","/**\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 * @category Object\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, 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 { 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 object, 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}","/**\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}","/**\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * stripSpecialChars('Héllo! World #$%&*!')\n * // => 'Hello World'\n * @category String\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 * unescape('fred, barney, &amp; pebbles')\n * // => 'fred, barney, & pebbles'\n * @category String\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 * @category Validate\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","export function isPlainObject(value: unknown): value is object {\n return value !== null && typeof value === 'object' && value.constructor === Object;\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","camelCase","kebabCase","pascalCase","snakeCase","startCase"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/array/chunk.ts","../src/array/count.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/pick.ts","../src/object/omit.ts","../src/promise/queue.ts","../src/promise/sleep.ts","../src/promise/timeout.ts","../src/string/deburr.ts","../src/helpers/stringModifiers.ts","../src/string/camelCase.ts","../src/string/capitalize.ts","../src/string/dashCase.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/isPlainObject.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 * @category Array\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 { RecordKey } from '@helpers/types';\n\n/**\n * Creates an object composed of keys generated from the results of running \n * each element of `collection` thru `iteratee`. \n * The corresponding value of each key is the number of times the key was returned by `iteratee`.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'betty', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ]\n *\n * count(users, value => value.active);\n * // => { 'true': 2, 'false': 1 }\n * @category Array\n * @param iteratee - The iteratee to transform keys.\n * @param collection - The array or record to iterate over.\n * @returns Returns the composed aggregate object.\n */\n\nexport function count<TInput, TKey extends RecordKey>(array: TInput[], iteratee: (value: TInput) => TKey): Record<TKey, number> {\n const result = {} as Record<TKey, number>;\n for (const value of array) {\n const key = iteratee(value);\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 }\n return result;\n}\n","import type { RecordKey } from '@helpers/types';\n\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 * @category Validate\n * @param value1 - The value to compare.\n * @param value2 - The other value to compare.\n * @returns Returns `true` if the values are equivalent, else `false`.\n */\n\nexport function isEqual(value1: unknown, value2: unknown): boolean {\n if (value1 === value2) return true;\n\n if (Array.isArray(value1) && Array.isArray(value2)) {\n return isSameArray(value1, value2);\n }\n\n if (value1 instanceof RegExp && value2 instanceof RegExp) {\n return value1.toString() === value2.toString();\n }\n\n if (isObject(value1) && isObject(value2)) {\n return isSameObject(value1, value2);\n }\n\n return false;\n}\n\ntype KeyValueObject = Record<RecordKey, unknown>;\nfunction isObject(value: unknown): value is KeyValueObject {\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && Object.prototype.toString.call(value) === '[object Object]';\n}\n\nfunction isSameObject(value1: KeyValueObject, value2: KeyValueObject) {\n // check if the objects have the same keys\n const keys1 = Object.keys(value1);\n const keys2 = Object.keys(value2);\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(value1[key], value2[key])) return false;\n }\n\n // the objects are deeply equal\n return true;\n}\n\nfunction isSameArray(value1: unknown[], value2: unknown[]) {\n if (value1.length !== value2.length) return false;\n\n // check if the values of each element in the arrays are equal\n for (const [i, element] of value1.entries()) {\n if (!isEqual(element, value2[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 * @category Array\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 * @category Array\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 * @category Array\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 { RecordKey } from '@helpers/types';\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key.\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 * @category Array\n * @param collection - The array or object to iterate over.\n * @param iteratee - The iteratee to transform keys.\n * @returns Returns the composed aggregate object.\n */\n\nexport function group<T, U extends RecordKey>(array: T[], iteratee: (value: T) => U): Record<U, T[]> {\n const result = {} as Record<U, T[]>;\n for (const value of array) {\n const key = iteratee(value);\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Function\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 * @category Function\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`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, all arguments\n * 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 * @category Function\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 * @category Function\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 * @category Function\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}","/**\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 * @category Object\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, 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 { 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 object, 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}","/**\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 functions in 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 /** Returns 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 * 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}","/**\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 * @category String\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 * @category String\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 * @category String\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","import { splitWords } from '@helpers/stringModifiers.js';\n\n/**\n * Converts a string to dash-case.\n *\n * @example\n * dashCase('Foo Bar')\n * // => 'foo-bar'\n * dashCase('fooBar')\n * // => 'foo-bar'\n * dashCase('__FOO_BAR__')\n * // => 'foo-bar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the dash cased string.\n */\n\nexport function dashCase(str: string): string {\n const words = splitWords(str);\n\n let dashCase = '';\n for (const word of words) {\n dashCase += word.toLowerCase() + '-';\n }\n return dashCase.slice(0, -1);\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * stripSpecialChars('Héllo! World #$%&*!')\n * // => 'Hello World'\n * @category String\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 * unescape('fred, barney, &amp; pebbles')\n * // => 'fred, barney, & pebbles'\n * @category String\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 * @category Validate\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","export function isPlainObject(value: unknown): value is object {\n return value !== null && typeof value === 'object' && value.constructor === Object;\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","timeout","camelCase","dashCase","kebabCase","pascalCase","snakeCase","startCase"]}
package/dist/index.d.ts CHANGED
@@ -431,6 +431,73 @@ declare function omit<TObj extends object, Key extends keyof TObj>(object: TObj,
431
431
  */
432
432
  declare function pick<TInput, Key extends keyof TInput>(object: TInput, keysToPick: Key[]): Pick<TInput, Key>;
433
433
 
434
+ /**
435
+ * A class for managing a queue of async functions that runs a set number concurrently.
436
+ * If for example you have 10 async functions and you want to run 3 at a time, you can use this class.
437
+ *
438
+ * If the queue is paused, the queue will not run any more async functions until it is resumed.
439
+ *
440
+ * ---
441
+ *
442
+ * **Methods:**
443
+ * - {@link Queue.add} - adds a async function or array of functions to the queue.
444
+ * Returns a promise that resolves when the added function(s) finish.
445
+ * - {@link Queue.clear} - clears the queue.
446
+ * - {@link Queue.pause} - pauses the queue.
447
+ * - {@link Queue.resume} - resumes the queue.
448
+ * - {@link Queue.getQueue} - returns the queue.
449
+ * - {@link Queue.isPaused} - returns whether the queue is paused.
450
+ *
451
+ * @example
452
+ * // Create a queue that can run 3 tasks concurrently
453
+ * const queue = new Queue(3);
454
+ *
455
+ * queue.add(() => fetch('https://example.com'));
456
+ *
457
+ * queue.add(async () => {
458
+ * const response = await fetch('https://example.com');
459
+ * return response.json();
460
+ * });
461
+ *
462
+ * // Add an array of tasks to the queue and wait for them to resolve
463
+ * await queue.add([
464
+ * () => fetch('https://apple.com'),
465
+ * () => fetch('https://microsoft.com')
466
+ * ]);
467
+ * // => [Response, Response]
468
+ */
469
+ declare class Queue {
470
+ private running;
471
+ private maxConcurrent;
472
+ private paused;
473
+ private queue;
474
+ /**
475
+ * @constructor
476
+ * @param maxConcurrent - The maximum number of async functions to run concurrently.
477
+ */
478
+ constructor(maxConcurrent: number);
479
+ /**
480
+ * Add aync functions or an array of async functions to the queue.
481
+ *
482
+ * @param asyncFn - The aync function(s) to add to the queue.
483
+ * @returns A promise that resolves when the added function(s) finishes.
484
+ */
485
+ add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn): Promise<TProm>;
486
+ add<TProm, TAsyncFn extends () => Promise<TProm>>(asyncFn: TAsyncFn[]): Promise<TProm[]>;
487
+ private buildWaitingPromise;
488
+ private run;
489
+ /** Removes all the tasks from the queue */
490
+ clear(): void;
491
+ /** Pauses the execution of the functions in the queue */
492
+ pause(): void;
493
+ /** Resumes the execution of the tasks in the queue */
494
+ resume(): void;
495
+ /** Returns the queue */
496
+ getQueue(): (() => Promise<any>)[];
497
+ /** Returns whether the queue is paused */
498
+ isPaused(): boolean;
499
+ }
500
+
434
501
  /**
435
502
  * Sleeps for the given amount of time.
436
503
  *
@@ -442,6 +509,24 @@ declare function pick<TInput, Key extends keyof TInput>(object: TInput, keysToPi
442
509
  */
443
510
  declare function sleep(ms: number): Promise<unknown>;
444
511
 
512
+ /**
513
+ * Returns a new promise that will reject with an error after a specified timeout.
514
+ *
515
+ * @example
516
+ * try {
517
+ * await timeout(fetch('https://example.com'), 1000);
518
+ * } catch (error) {
519
+ * console.log(error.message);
520
+ * // => 'Promise timed out after 1000ms'
521
+ * }
522
+ * @template TRes - The type of the resolved value.
523
+ * @param promise - The promise to wrap.
524
+ * @param timeout - The timeout in milliseconds.
525
+ *
526
+ * @returns A new promise that will reject with an error after the specified timeout.
527
+ */
528
+ declare function timeout<TRes>(promise: Promise<TRes>, timeout: number): Promise<TRes>;
529
+
445
530
  /**
446
531
  * Converts `string` to camelCase.
447
532
  *
@@ -470,6 +555,22 @@ declare function camelCase(str: string): string;
470
555
  */
471
556
  declare function capitalize(str: string): string;
472
557
 
558
+ /**
559
+ * Converts a string to dash-case.
560
+ *
561
+ * @example
562
+ * dashCase('Foo Bar')
563
+ * // => 'foo-bar'
564
+ * dashCase('fooBar')
565
+ * // => 'foo-bar'
566
+ * dashCase('__FOO_BAR__')
567
+ * // => 'foo-bar'
568
+ * @category String
569
+ * @param str - The string to convert.
570
+ * @returns Returns the dash cased string.
571
+ */
572
+ declare function dashCase(str: string): string;
573
+
473
574
  /**
474
575
  * Deburrs a string by converting
475
576
  * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
@@ -751,4 +852,4 @@ declare function isPlainObject(value: unknown): value is object;
751
852
  */
752
853
  declare function isUrl(str: string): boolean;
753
854
 
754
- export { Float, Int, Negative, Positive, after, before, camelCase, capitalize, chunk, count, debounce, deburr, difference, dropRightWhile, dropWhile, escapeHtml, escapeRegExp, group, intersection, isEmpty, isEqual, isPlainObject, isUrl, kebabCase, memoize, omit, once, pascalCase, pick, sample, shuffle, sleep, snakeCase, sort, startCase, stripSpecial, takeRightWhile, takeWhile, throttle, times, unescapeHtml, unique };
855
+ export { Float, Int, Negative, Positive, Queue, after, before, camelCase, capitalize, chunk, count, dashCase, debounce, deburr, difference, dropRightWhile, dropWhile, escapeHtml, escapeRegExp, group, intersection, isEmpty, isEqual, isPlainObject, isUrl, kebabCase, memoize, omit, once, pascalCase, pick, sample, shuffle, sleep, snakeCase, sort, startCase, stripSpecial, takeRightWhile, takeWhile, throttle, timeout, times, unescapeHtml, unique };
package/dist/index.js CHANGED
@@ -373,11 +373,88 @@ function omit(object, keysToOmit) {
373
373
  return pick(object, filteredKeys);
374
374
  }
375
375
 
376
+ // src/promise/queue.ts
377
+ var Queue = class {
378
+ running = 0;
379
+ maxConcurrent;
380
+ paused = false;
381
+ queue = [];
382
+ constructor(maxConcurrent) {
383
+ this.maxConcurrent = maxConcurrent;
384
+ }
385
+ add(asyncFn) {
386
+ if (Array.isArray(asyncFn)) {
387
+ const promises = asyncFn.map((fn) => this.buildWaitingPromise(fn));
388
+ return Promise.all(promises);
389
+ } else {
390
+ return this.buildWaitingPromise(asyncFn);
391
+ }
392
+ }
393
+ buildWaitingPromise(asyncFn) {
394
+ return new Promise((resolve, reject) => {
395
+ this.queue.push({ asyncFn, resolve, reject });
396
+ this.run();
397
+ });
398
+ }
399
+ run() {
400
+ while (this.queue.length > 0 && this.running < this.maxConcurrent && !this.paused) {
401
+ this.running++;
402
+ const queueElement = this.queue.shift();
403
+ void queueElement.asyncFn().then((result) => {
404
+ queueElement.resolve(result);
405
+ }).catch((error) => {
406
+ queueElement.reject(error);
407
+ }).finally(() => {
408
+ this.running--;
409
+ this.run();
410
+ });
411
+ }
412
+ }
413
+ clear() {
414
+ for (const queueElement of this.queue) {
415
+ queueElement.reject(new Error("Queue cleared"));
416
+ }
417
+ this.queue = [];
418
+ }
419
+ pause() {
420
+ this.paused = true;
421
+ }
422
+ resume() {
423
+ this.paused = false;
424
+ this.run();
425
+ }
426
+ getQueue() {
427
+ return this.queue.map((queueElement) => queueElement.asyncFn);
428
+ }
429
+ isPaused() {
430
+ return this.paused;
431
+ }
432
+ };
433
+
376
434
  // src/promise/sleep.ts
377
435
  function sleep(ms) {
378
436
  return new Promise((resolve) => setTimeout(resolve, ms));
379
437
  }
380
438
 
439
+ // src/promise/timeout.ts
440
+ function timeout(promise, timeout2) {
441
+ return new Promise((resolve, reject) => {
442
+ const timeoutId = setTimeout(() => {
443
+ reject(new Error(`Promise timed out after ${timeout2}ms`));
444
+ }, timeout2);
445
+ promise.then(
446
+ (result) => {
447
+ clearTimeout(timeoutId);
448
+ resolve(result);
449
+ },
450
+ (error) => {
451
+ clearTimeout(timeoutId);
452
+ reject(error);
453
+ }
454
+ );
455
+ });
456
+ }
457
+
381
458
  // src/string/deburr.ts
382
459
  function deburr(str) {
383
460
  return str.replace(/[^\u0000-\u007E]/g, (chr) => chr.normalize("NFD").replace(/[\u0300-\u036F]/g, ""));
@@ -409,6 +486,16 @@ function capitalize(str) {
409
486
  return str.charAt(0).toUpperCase() + str.slice(1);
410
487
  }
411
488
 
489
+ // src/string/dashCase.ts
490
+ function dashCase(str) {
491
+ const words = splitWords(str);
492
+ let dashCase2 = "";
493
+ for (const word of words) {
494
+ dashCase2 += word.toLowerCase() + "-";
495
+ }
496
+ return dashCase2.slice(0, -1);
497
+ }
498
+
412
499
  // src/string/escapeHtml.ts
413
500
  function escapeHtml(str) {
414
501
  const escapeChars = {
@@ -519,12 +606,14 @@ function isUrl(str) {
519
606
  }
520
607
  }
521
608
  export {
609
+ Queue,
522
610
  after,
523
611
  before,
524
612
  camelCase,
525
613
  capitalize,
526
614
  chunk,
527
615
  count,
616
+ dashCase,
528
617
  debounce,
529
618
  deburr,
530
619
  difference,
@@ -554,6 +643,7 @@ export {
554
643
  takeRightWhile,
555
644
  takeWhile,
556
645
  throttle,
646
+ timeout,
557
647
  times,
558
648
  unescapeHtml,
559
649
  unique
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/array/chunk.ts","../src/array/count.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/pick.ts","../src/object/omit.ts","../src/promise/sleep.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/isPlainObject.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 * @category Array\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 { RecordKey } from '@helpers/types';\n\n/**\n * Creates an object composed of keys generated from the results of running \n * each element of `collection` thru `iteratee`. \n * The corresponding value of each key is the number of times the key was returned by `iteratee`.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'betty', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ]\n *\n * count(users, value => value.active);\n * // => { 'true': 2, 'false': 1 }\n * @category Array\n * @param iteratee - The iteratee to transform keys.\n * @param collection - The array or record to iterate over.\n * @returns Returns the composed aggregate object.\n */\n\nexport function count<TInput, TKey extends RecordKey>(array: TInput[], iteratee: (value: TInput) => TKey): Record<TKey, number> {\n const result = {} as Record<TKey, number>;\n for (const value of array) {\n const key = iteratee(value);\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 }\n return result;\n}\n","import type { RecordKey } from '@helpers/types';\n\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 * @category Validate\n * @param value1 - The value to compare.\n * @param value2 - The other value to compare.\n * @returns Returns `true` if the values are equivalent, else `false`.\n */\n\nexport function isEqual(value1: unknown, value2: unknown): boolean {\n if (value1 === value2) return true;\n\n if (Array.isArray(value1) && Array.isArray(value2)) {\n return isSameArray(value1, value2);\n }\n\n if (value1 instanceof RegExp && value2 instanceof RegExp) {\n return value1.toString() === value2.toString();\n }\n\n if (isObject(value1) && isObject(value2)) {\n return isSameObject(value1, value2);\n }\n\n return false;\n}\n\ntype KeyValueObject = Record<RecordKey, unknown>;\nfunction isObject(value: unknown): value is KeyValueObject {\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && Object.prototype.toString.call(value) === '[object Object]';\n}\n\nfunction isSameObject(value1: KeyValueObject, value2: KeyValueObject) {\n // check if the objects have the same keys\n const keys1 = Object.keys(value1);\n const keys2 = Object.keys(value2);\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(value1[key], value2[key])) return false;\n }\n\n // the objects are deeply equal\n return true;\n}\n\nfunction isSameArray(value1: unknown[], value2: unknown[]) {\n if (value1.length !== value2.length) return false;\n\n // check if the values of each element in the arrays are equal\n for (const [i, element] of value1.entries()) {\n if (!isEqual(element, value2[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 * @category Array\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 * @category Array\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 * @category Array\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 { RecordKey } from '@helpers/types';\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key.\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 * @category Array\n * @param collection - The array or object to iterate over.\n * @param iteratee - The iteratee to transform keys.\n * @returns Returns the composed aggregate object.\n */\n\nexport function group<T, U extends RecordKey>(array: T[], iteratee: (value: T) => U): Record<U, T[]> {\n const result = {} as Record<U, T[]>;\n for (const value of array) {\n const key = iteratee(value);\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Function\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 * @category Function\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`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, all arguments\n * 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 * @category Function\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 * @category Function\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 * @category Function\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}","/**\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 * @category Object\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, 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 { 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 object, 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}","/**\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}","/**\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * stripSpecialChars('Héllo! World #$%&*!')\n * // => 'Hello World'\n * @category String\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 * unescape('fred, barney, &amp; pebbles')\n * // => 'fred, barney, & pebbles'\n * @category String\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 * @category Validate\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","export function isPlainObject(value: unknown): value is object {\n return value !== null && typeof value === 'object' && value.constructor === Object;\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","camelCase","kebabCase","pascalCase","snakeCase","startCase"]}
1
+ {"version":3,"sources":["../src/array/chunk.ts","../src/array/count.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/pick.ts","../src/object/omit.ts","../src/promise/queue.ts","../src/promise/sleep.ts","../src/promise/timeout.ts","../src/string/deburr.ts","../src/helpers/stringModifiers.ts","../src/string/camelCase.ts","../src/string/capitalize.ts","../src/string/dashCase.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/isPlainObject.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 * @category Array\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 { RecordKey } from '@helpers/types';\n\n/**\n * Creates an object composed of keys generated from the results of running \n * each element of `collection` thru `iteratee`. \n * The corresponding value of each key is the number of times the key was returned by `iteratee`.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'betty', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ]\n *\n * count(users, value => value.active);\n * // => { 'true': 2, 'false': 1 }\n * @category Array\n * @param iteratee - The iteratee to transform keys.\n * @param collection - The array or record to iterate over.\n * @returns Returns the composed aggregate object.\n */\n\nexport function count<TInput, TKey extends RecordKey>(array: TInput[], iteratee: (value: TInput) => TKey): Record<TKey, number> {\n const result = {} as Record<TKey, number>;\n for (const value of array) {\n const key = iteratee(value);\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 }\n return result;\n}\n","import type { RecordKey } from '@helpers/types';\n\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 * @category Validate\n * @param value1 - The value to compare.\n * @param value2 - The other value to compare.\n * @returns Returns `true` if the values are equivalent, else `false`.\n */\n\nexport function isEqual(value1: unknown, value2: unknown): boolean {\n if (value1 === value2) return true;\n\n if (Array.isArray(value1) && Array.isArray(value2)) {\n return isSameArray(value1, value2);\n }\n\n if (value1 instanceof RegExp && value2 instanceof RegExp) {\n return value1.toString() === value2.toString();\n }\n\n if (isObject(value1) && isObject(value2)) {\n return isSameObject(value1, value2);\n }\n\n return false;\n}\n\ntype KeyValueObject = Record<RecordKey, unknown>;\nfunction isObject(value: unknown): value is KeyValueObject {\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && Object.prototype.toString.call(value) === '[object Object]';\n}\n\nfunction isSameObject(value1: KeyValueObject, value2: KeyValueObject) {\n // check if the objects have the same keys\n const keys1 = Object.keys(value1);\n const keys2 = Object.keys(value2);\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(value1[key], value2[key])) return false;\n }\n\n // the objects are deeply equal\n return true;\n}\n\nfunction isSameArray(value1: unknown[], value2: unknown[]) {\n if (value1.length !== value2.length) return false;\n\n // check if the values of each element in the arrays are equal\n for (const [i, element] of value1.entries()) {\n if (!isEqual(element, value2[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 * @category Array\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 * @category Array\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 * @category Array\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 { RecordKey } from '@helpers/types';\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key.\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 * @category Array\n * @param collection - The array or object to iterate over.\n * @param iteratee - The iteratee to transform keys.\n * @returns Returns the composed aggregate object.\n */\n\nexport function group<T, U extends RecordKey>(array: T[], iteratee: (value: T) => U): Record<U, T[]> {\n const result = {} as Record<U, T[]>;\n for (const value of array) {\n const key = iteratee(value);\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Array\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 * @category Function\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 * @category Function\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`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, all arguments\n * 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 * @category Function\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 * @category Function\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 * @category Function\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}","/**\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 * @category Object\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, 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 { 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 object, 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}","/**\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 functions in 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 /** Returns 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 * 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}","/**\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 * @category String\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 * @category String\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 * @category String\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","import { splitWords } from '@helpers/stringModifiers.js';\n\n/**\n * Converts a string to dash-case.\n *\n * @example\n * dashCase('Foo Bar')\n * // => 'foo-bar'\n * dashCase('fooBar')\n * // => 'foo-bar'\n * dashCase('__FOO_BAR__')\n * // => 'foo-bar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the dash cased string.\n */\n\nexport function dashCase(str: string): string {\n const words = splitWords(str);\n\n let dashCase = '';\n for (const word of words) {\n dashCase += word.toLowerCase() + '-';\n }\n return dashCase.slice(0, -1);\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * @category String\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 * stripSpecialChars('Héllo! World #$%&*!')\n * // => 'Hello World'\n * @category String\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 * unescape('fred, barney, &amp; pebbles')\n * // => 'fred, barney, & pebbles'\n * @category String\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 * @category Validate\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","export function isPlainObject(value: unknown): value is object {\n return value !== null && typeof value === 'object' && value.constructor === Object;\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","timeout","camelCase","dashCase","kebabCase","pascalCase","snakeCase","startCase"]}
package/package.json CHANGED
@@ -48,5 +48,5 @@
48
48
  "tsup": "6.5.0",
49
49
  "ctix": "1.8.1"
50
50
  },
51
- "version": "0.5.0"
51
+ "version": "0.6.0"
52
52
  }