@dxtmisha/functional-basic 0.1.0 → 0.1.1

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.
Files changed (122) hide show
  1. package/package.json +5 -3
  2. package/src/classes/Api.ts +407 -0
  3. package/src/classes/ApiDefault.ts +83 -0
  4. package/src/classes/ApiHeaders.ts +52 -0
  5. package/src/classes/ApiPreparation.ts +114 -0
  6. package/src/classes/ApiResponse.ts +293 -0
  7. package/src/classes/ApiStatus.ts +173 -0
  8. package/src/classes/BroadcastMessage.ts +73 -0
  9. package/src/classes/Cache.ts +60 -0
  10. package/src/classes/CacheItem.ts +95 -0
  11. package/src/classes/CacheStatic.ts +30 -0
  12. package/src/classes/Cookie.ts +135 -0
  13. package/src/classes/CookieBlock.ts +31 -0
  14. package/src/classes/DataStorage.ts +194 -0
  15. package/src/classes/Datetime.ts +891 -0
  16. package/src/classes/EventItem.ts +373 -0
  17. package/src/classes/Geo.ts +320 -0
  18. package/src/classes/GeoFlag.ts +386 -0
  19. package/src/classes/GeoIntl.ts +839 -0
  20. package/src/classes/GeoPhone.ts +272 -0
  21. package/src/classes/Global.ts +32 -0
  22. package/src/classes/Hash.ts +142 -0
  23. package/src/classes/Icons.ts +165 -0
  24. package/src/classes/Loading.ts +90 -0
  25. package/src/classes/Meta.ts +284 -0
  26. package/src/classes/MetaManager.ts +200 -0
  27. package/src/classes/MetaOg.ts +147 -0
  28. package/src/classes/MetaTwitter.ts +154 -0
  29. package/src/classes/ScrollbarWidth.ts +86 -0
  30. package/src/classes/Translate.ts +293 -0
  31. package/src/classes/__tests__/Api.test.ts +728 -0
  32. package/src/classes/__tests__/ApiDefault.test.ts +222 -0
  33. package/src/classes/__tests__/ApiHeaders.test.ts +447 -0
  34. package/src/classes/__tests__/ApiPreparation.test.ts +257 -0
  35. package/src/classes/__tests__/ApiResponse.test.ts +547 -0
  36. package/src/classes/__tests__/ApiStatus.test.ts +403 -0
  37. package/src/classes/__tests__/Meta.test.ts +629 -0
  38. package/src/classes/__tests__/MetaManager.test.ts +836 -0
  39. package/src/classes/__tests__/MetaOg.test.ts +677 -0
  40. package/src/classes/__tests__/MetaTwitter.test.ts +423 -0
  41. package/src/functions/anyToString.ts +36 -0
  42. package/src/functions/applyTemplate.ts +63 -0
  43. package/src/functions/arrFill.ts +10 -0
  44. package/src/functions/copyObject.ts +10 -0
  45. package/src/functions/createElement.ts +40 -0
  46. package/src/functions/domQuerySelector.ts +15 -0
  47. package/src/functions/domQuerySelectorAll.ts +15 -0
  48. package/src/functions/encodeAttribute.ts +15 -0
  49. package/src/functions/eventStopPropagation.ts +10 -0
  50. package/src/functions/executeFunction.ts +13 -0
  51. package/src/functions/executePromise.ts +19 -0
  52. package/src/functions/forEach.ts +39 -0
  53. package/src/functions/frame.ts +38 -0
  54. package/src/functions/getAttributes.ts +27 -0
  55. package/src/functions/getClipboardData.ts +13 -0
  56. package/src/functions/getColumn.ts +18 -0
  57. package/src/functions/getElement.ts +35 -0
  58. package/src/functions/getElementId.ts +39 -0
  59. package/src/functions/getElementItem.ts +27 -0
  60. package/src/functions/getElementOrWindow.ts +23 -0
  61. package/src/functions/getExp.ts +21 -0
  62. package/src/functions/getItemByPath.ts +24 -0
  63. package/src/functions/getKey.ts +9 -0
  64. package/src/functions/getLengthOfAllArray.ts +13 -0
  65. package/src/functions/getMaxLengthAllArray.ts +13 -0
  66. package/src/functions/getMinLengthAllArray.ts +13 -0
  67. package/src/functions/getMouseClient.ts +17 -0
  68. package/src/functions/getMouseClientX.ts +9 -0
  69. package/src/functions/getMouseClientY.ts +9 -0
  70. package/src/functions/getObjectByKeys.ts +24 -0
  71. package/src/functions/getObjectNoUndefined.ts +23 -0
  72. package/src/functions/getObjectOrNone.ts +11 -0
  73. package/src/functions/getRandomText.ts +29 -0
  74. package/src/functions/getRequestString.ts +21 -0
  75. package/src/functions/getStepPercent.ts +19 -0
  76. package/src/functions/getStepValue.ts +19 -0
  77. package/src/functions/goScroll.ts +40 -0
  78. package/src/functions/inArray.ts +10 -0
  79. package/src/functions/initScrollbarOffset.ts +14 -0
  80. package/src/functions/intersectKey.ts +34 -0
  81. package/src/functions/isArray.ts +9 -0
  82. package/src/functions/isDifferent.ts +27 -0
  83. package/src/functions/isDomRuntime.ts +12 -0
  84. package/src/functions/isFilled.ts +49 -0
  85. package/src/functions/isFloat.ts +16 -0
  86. package/src/functions/isFunction.ts +11 -0
  87. package/src/functions/isInDom.ts +15 -0
  88. package/src/functions/isIntegerBetween.ts +11 -0
  89. package/src/functions/isNull.ts +11 -0
  90. package/src/functions/isNumber.ts +16 -0
  91. package/src/functions/isObject.ts +9 -0
  92. package/src/functions/isObjectNotArray.ts +11 -0
  93. package/src/functions/isSelected.ts +32 -0
  94. package/src/functions/isSelectedByList.ts +19 -0
  95. package/src/functions/isString.ts +9 -0
  96. package/src/functions/isWindow.ts +11 -0
  97. package/src/functions/random.ts +10 -0
  98. package/src/functions/replaceRecursive.ts +60 -0
  99. package/src/functions/replaceTemplate.ts +22 -0
  100. package/src/functions/secondToTime.ts +20 -0
  101. package/src/functions/setElementItem.ts +56 -0
  102. package/src/functions/setValues.ts +59 -0
  103. package/src/functions/splice.ts +59 -0
  104. package/src/functions/strFill.ts +12 -0
  105. package/src/functions/toArray.ts +19 -0
  106. package/src/functions/toCamelCase.ts +16 -0
  107. package/src/functions/toCamelCaseFirst.ts +12 -0
  108. package/src/functions/toDate.ts +44 -0
  109. package/src/functions/toKebabCase.ts +25 -0
  110. package/src/functions/toNumber.ts +35 -0
  111. package/src/functions/toNumberByMax.ts +33 -0
  112. package/src/functions/toPercent.ts +10 -0
  113. package/src/functions/toPercentBy100.ts +12 -0
  114. package/src/functions/transformation.ts +59 -0
  115. package/src/functions/uniqueArray.ts +9 -0
  116. package/src/functions/writeClipboardData.ts +17 -0
  117. package/src/library.ts +116 -0
  118. package/src/types/apiTypes.ts +143 -0
  119. package/src/types/basicTypes.ts +155 -0
  120. package/src/types/geoTypes.ts +109 -0
  121. package/src/types/metaTypes.ts +764 -0
  122. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,34 @@
1
+ import { forEach } from './forEach'
2
+ import { isObject } from './isObject'
3
+
4
+ /**
5
+ * Computes the intersection of arrays using keys for comparison.
6
+ *
7
+ * Вычислить пересечение массивов, сравнивая ключи.
8
+ * @param data the array with master keys to check/ основной проверяемый массив
9
+ * @param comparison arrays to compare keys against/ массивы, с которыми идёт сравнение
10
+ */
11
+ export function intersectKey<
12
+ T,
13
+ KT extends keyof T,
14
+ C,
15
+ KC extends keyof C
16
+ >(
17
+ data?: T,
18
+ comparison?: C
19
+ ): Record<KT & KC, T[KT]> {
20
+ const values = {} as Record<KT & KC, T[KT]>
21
+
22
+ if (
23
+ isObject(data)
24
+ && isObject(comparison)
25
+ ) {
26
+ forEach<T[KT], void>(data, (item, index) => {
27
+ if (index in comparison) {
28
+ values[index as (KT & KC)] = item
29
+ }
30
+ })
31
+ }
32
+
33
+ return values
34
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Checks if the values are arrays.
3
+ *
4
+ * Проверяет, являются ли значения массивами.
5
+ * @param value input value/ входное значение
6
+ */
7
+ export function isArray<T, R>(value: T): value is Extract<T, R[]> {
8
+ return Array.isArray(value)
9
+ }
@@ -0,0 +1,27 @@
1
+ import { forEach } from './forEach'
2
+
3
+ import { type ObjectItem } from '../types/basicTypes'
4
+
5
+ /**
6
+ * Checks if the values of two objects are different.
7
+ *
8
+ * Проверяет, различаются ли значения двух объектов.
9
+ * @param value current values/ текущие значения
10
+ * @param old old values/ старые значения
11
+ */
12
+ export function isDifferent<T>(
13
+ value: ObjectItem<T>,
14
+ old: ObjectItem<T>
15
+ ): boolean {
16
+ let different = Object.keys(value).length !== Object.keys(old).length
17
+
18
+ if (!different) {
19
+ forEach(value, (item, key) => {
20
+ if (item !== old?.[key]) {
21
+ different = true
22
+ }
23
+ })
24
+ }
25
+
26
+ return different
27
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Проверяет, выполняется ли код в браузере, где доступен объект `window`.
3
+ * Возвращает `true`, если `window` доступен, что означает, что код выполняется в браузере.
4
+ *
5
+ * Checks if the code is running in a browser where the `window` object is available.
6
+ * Returns `true` if `window` is defined, indicating the code is running in a browser.
7
+ *
8
+ * @returns `true`, если выполняется в браузере, иначе `false`/ `true` if running in a browser, otherwise `false`
9
+ */
10
+ export function isDomRuntime(): boolean {
11
+ return typeof window !== 'undefined' && Boolean(window.document)
12
+ }
@@ -0,0 +1,49 @@
1
+ import { isNull } from './isNull'
2
+
3
+ import { type EmptyValue } from '../types/basicTypes'
4
+
5
+ /**
6
+ * Checks if the field is filled.
7
+ *
8
+ * Проверяет, заполнено ли поле.
9
+ * @param value input value/ входное значение
10
+ * @param zeroTrue if true, '0' is considered filled/ если true, то '0' считается заполненным
11
+ */
12
+ export function isFilled<T>(
13
+ value: T,
14
+ zeroTrue?: boolean
15
+ ): value is Exclude<T, EmptyValue> {
16
+ if (value) {
17
+ if (
18
+ zeroTrue
19
+ && value === '0'
20
+ ) {
21
+ return true
22
+ }
23
+
24
+ switch (typeof value) {
25
+ case 'bigint':
26
+ case 'number':
27
+ return value !== 0
28
+ case 'boolean':
29
+ return value
30
+ case 'function':
31
+ case 'symbol':
32
+ return true
33
+ case 'object':
34
+ if (Array.isArray(value)) {
35
+ return value.length > 0
36
+ }
37
+
38
+ return Object.values(value).some(item => !isNull(item))
39
+ case 'string':
40
+ return !['', 'undefined', 'null', '0', 'false', '[]'].includes(value)
41
+ case 'undefined':
42
+ return false
43
+ default:
44
+ return Boolean(value)
45
+ }
46
+ }
47
+
48
+ return false
49
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Checks if the value is an integer or a floating-point number.
3
+ *
4
+ * Проверяет, является ли значение числом или дробным числом.
5
+ * @param value values for checking/ значения для проверки
6
+ */
7
+ export function isFloat(value: any): boolean {
8
+ switch (typeof value) {
9
+ case 'number':
10
+ return true
11
+ case 'string':
12
+ return Boolean(value.match(/^([0-9]+|[0-9]+\.[0-9]+)$/))
13
+ default:
14
+ return false
15
+ }
16
+ }
@@ -0,0 +1,11 @@
1
+ import { type FunctionArgs } from '../types/basicTypes'
2
+
3
+ /**
4
+ * Checks if the function is a callback function.
5
+ *
6
+ * Проверяет, является ли функция обратного вызова.
7
+ * @param callback the value being checked/ проверяемое значение
8
+ */
9
+ export function isFunction<T>(callback: T): callback is Extract<T, FunctionArgs<any, any>> {
10
+ return callback instanceof Function || typeof callback === 'function'
11
+ }
@@ -0,0 +1,15 @@
1
+ import { getElement } from './getElement'
2
+ import {
3
+ type ElementOrString,
4
+ type ElementOrWindow
5
+ } from '../types/basicTypes'
6
+
7
+ /**
8
+ * Checks if an element is still in the DOM tree.
9
+ *
10
+ * Проверяет, находится ли еще элемент в дереве DOM.
11
+ * @param element selectors for matching or an Element/ селекторов для сопоставления или Element
12
+ */
13
+ export function isInDom<E extends ElementOrWindow>(element?: ElementOrString<E>): boolean {
14
+ return Boolean(getElement(element)?.closest('html'))
15
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Checks if the value is between integers.
3
+ *
4
+ * Проверяет, лежит ли значение между целыми числами.
5
+ * @param value input value/ входное значение
6
+ * @param between value for rounding/ значение для округления
7
+ */
8
+ export function isIntegerBetween(value: number, between: number): boolean {
9
+ const floor = Math.floor(between)
10
+ return value >= floor && value < floor + 1
11
+ }
@@ -0,0 +1,11 @@
1
+ import { type Undefined } from '../types/basicTypes'
2
+
3
+ /**
4
+ * Is the variable equal to null or undefined.
5
+ *
6
+ * Является ли переменная равной null или undefined.
7
+ * @param value input value/ входное значение
8
+ */
9
+ export function isNull<T>(value: T): value is Extract<T, Undefined> {
10
+ return value === null || value === undefined
11
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Checks if the value is a number.
3
+ *
4
+ * Проверяет, является ли значение числом.
5
+ * @param value values for checking/ значения для проверки
6
+ */
7
+ export function isNumber(value: any): boolean {
8
+ switch (typeof value) {
9
+ case 'number':
10
+ return true
11
+ case 'string':
12
+ return Boolean(value.match(/^[0-9]+$/))
13
+ default:
14
+ return false
15
+ }
16
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Checks if a value is an object.
3
+ *
4
+ * Проверяет, является ли значение объектом.
5
+ * @param value input value/ входное значение
6
+ */
7
+ export function isObject<T>(value: T): value is Extract<T, Record<any, any>> {
8
+ return Boolean(value && typeof value === 'object')
9
+ }
@@ -0,0 +1,11 @@
1
+ import { isObject } from './isObject'
2
+
3
+ /**
4
+ * Checks if the value is an object or not an array.
5
+ *
6
+ * Проверяет, является ли значение объектом и не является массивом.
7
+ * @param value input value/ входное значение
8
+ */
9
+ export function isObjectNotArray<T>(value: T): value is Exclude<Extract<T, Record<any, any>>, any[] | undefined | null> {
10
+ return isObject(value) && !Array.isArray(value)
11
+ }
@@ -0,0 +1,32 @@
1
+ import { isNull } from './isNull'
2
+ import { isNumber } from './isNumber'
3
+ import { toNumber } from './toNumber'
4
+
5
+ /**
6
+ * Checks if value is in the array selected or if value equals selected, if selected is a string.
7
+ *
8
+ * Проверяет, есть ли value в массиве selected или равен ли value selected, если selected - строка.
9
+ * @param value input value/ входное значение
10
+ * @param selected array or string for comparison/ массив или строка для сравнения
11
+ */
12
+ export function isSelected<T, S>(
13
+ value: T,
14
+ selected: T | T[] | S
15
+ ): boolean {
16
+ if (isNull(value)) {
17
+ return false
18
+ }
19
+
20
+ if (Array.isArray(selected)) {
21
+ return selected.includes(value)
22
+ }
23
+
24
+ if (
25
+ isNumber(value)
26
+ && isNumber(selected)
27
+ ) {
28
+ return toNumber(value as number) === toNumber(selected as number)
29
+ }
30
+
31
+ return value === selected
32
+ }
@@ -0,0 +1,19 @@
1
+ import { isSelected } from './isSelected'
2
+
3
+ /**
4
+ * Testing isSelected property for the entire list of values.
5
+ *
6
+ * Проверка свойства isSelected для всех значений списка.
7
+ * @param values list of values for comparison/ список значений для сравнения
8
+ * @param selected array or string for comparison/ массив или строка для сравнения
9
+ */
10
+ export function isSelectedByList<T>(
11
+ values: T | T[],
12
+ selected: T | T[]
13
+ ): boolean {
14
+ if (Array.isArray(values)) {
15
+ return values.every(item => isSelected(item, selected))
16
+ }
17
+
18
+ return isSelected(values, selected)
19
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Checks if the value is of type string.
3
+ *
4
+ * Проверяет, является ли значение типом строки.
5
+ * @param value input value/ входное значение
6
+ */
7
+ export function isString<T>(value: T): value is Extract<T, string> {
8
+ return typeof value === 'string'
9
+ }
@@ -0,0 +1,11 @@
1
+ import { isDomRuntime } from './isDomRuntime'
2
+
3
+ /**
4
+ * Checks if object is Window.
5
+ *
6
+ * Проверяет, является ли объект Window.
7
+ * @param element selectors for matching or an Element/ селекторов для сопоставления или Element
8
+ */
9
+ export function isWindow<E>(element: E): element is Extract<E, Window> {
10
+ return isDomRuntime() && element === window
11
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Generate a random integer.
3
+ *
4
+ * Генерирует случайное число.
5
+ * @param min the lowest value to return/ наименьшее значение
6
+ * @param max the highest value to return/ наибольшее значение
7
+ */
8
+ export function random(min: number, max: number): number {
9
+ return Math.floor((Math.random() * (max - min + 1)) + min)
10
+ }
@@ -0,0 +1,60 @@
1
+ import { copyObject } from './copyObject'
2
+ import { forEach } from './forEach'
3
+ import { isObject } from './isObject'
4
+ import { uniqueArray } from './uniqueArray'
5
+
6
+ import {
7
+ type ObjectItem,
8
+ type ObjectOrArray
9
+ } from '../types/basicTypes'
10
+
11
+ /**
12
+ * Merge one or more arrays recursively.
13
+ *
14
+ * Рекурсивное слияние одного или более массивов.
15
+ * @param array the array in which elements are replaced/ массив, элементы которого будут заменены
16
+ * @param replacement arrays from which elements will be extracted/ массивы, из которых будут браться элементы для замены
17
+ * @param isMerge merge one or more arrays/ сливает один или большее количество массивов
18
+ */
19
+ export function replaceRecursive<I>(
20
+ array: ObjectItem<I>,
21
+ replacement?: ObjectOrArray<I>,
22
+ isMerge = true
23
+ ): ObjectItem<I> {
24
+ const returnData: ObjectItem<I> = copyObject(array)
25
+
26
+ if (
27
+ isObject(array)
28
+ && isObject(replacement)
29
+ ) {
30
+ forEach<I, void>(
31
+ replacement,
32
+ (item, index) => {
33
+ const data = array?.[index]
34
+
35
+ if (
36
+ isObject(data)
37
+ && isObject(item)
38
+ ) {
39
+ if (
40
+ isMerge
41
+ && Array.isArray(data)
42
+ && Array.isArray(item)
43
+ ) {
44
+ returnData[index] = copyObject(uniqueArray([...data, ...item])) as I
45
+ } else {
46
+ returnData[index] = replaceRecursive<I>(
47
+ (Array.isArray(data) ? { ...data } : data) as ObjectItem<I>,
48
+ item as ObjectOrArray<I>,
49
+ isMerge
50
+ ) as I
51
+ }
52
+ } else {
53
+ returnData[index] = isObject(item) ? copyObject(item) : item
54
+ }
55
+ }
56
+ )
57
+ }
58
+
59
+ return returnData
60
+ }
@@ -0,0 +1,22 @@
1
+ import { executeFunction } from './executeFunction'
2
+ import { forEach } from './forEach'
3
+ import { getExp } from './getExp'
4
+
5
+ import { type FunctionReturn } from '../types/basicTypes'
6
+
7
+ /**
8
+ * Replacing the value from replaces in value.
9
+ *
10
+ * Замена значения из replaces в value.
11
+ * @param value template string/ строка шаблона
12
+ * @param replaces object with data for replacement/ объект с данными для замены
13
+ */
14
+ export function replaceTemplate(value: string, replaces: Record<string, string | FunctionReturn<string>>): string {
15
+ let data = value
16
+
17
+ forEach(replaces, (replacement, pattern) => {
18
+ data = data.replace(getExp(`[${pattern}]`), executeFunction(replacement))
19
+ })
20
+
21
+ return data
22
+ }
@@ -0,0 +1,20 @@
1
+ import { toNumber } from './toNumber'
2
+
3
+ /**
4
+ * Converts seconds into a time string.
5
+ *
6
+ * Преобразовывает секунды в строку с временем.
7
+ * @param second specified seconds/ указанные секунды
8
+ */
9
+ export function secondToTime(second: number | string | undefined): string {
10
+ const time = toNumber(second)
11
+
12
+ if (time > 0) {
13
+ const minutes = String(Math.floor(time / 60)).padStart(2, '0')
14
+ const seconds = String(time % 60).padStart(2, '0')
15
+
16
+ return `${minutes}:${seconds}`
17
+ }
18
+
19
+ return '00:00'
20
+ }
@@ -0,0 +1,56 @@
1
+ import { executeFunction } from './executeFunction'
2
+ import { forEach } from './forEach'
3
+ import { getElement } from './getElement'
4
+ import { getElementItem } from './getElementItem'
5
+ import { isObject } from './isObject'
6
+
7
+ import {
8
+ type ElementOrString,
9
+ type ElementOrWindow
10
+ } from '../types/basicTypes'
11
+
12
+ /**
13
+ * Modifies the value of an element identified by its key.
14
+ *
15
+ * Изменяет значение элемента, определенного ключом.
16
+ * @param element checked element/ проверяемый элемент
17
+ * @param index index at which we retrieve values/ индекс, по которому получаем значения
18
+ * @param value new value/ новое значение
19
+ */
20
+ export function setElementItem<
21
+ E extends ElementOrWindow,
22
+ K extends keyof E,
23
+ V extends E[K] = E[K]
24
+ >(
25
+ element: ElementOrString<E>,
26
+ index: K,
27
+ value: V | Record<string, V>
28
+ ): E | undefined {
29
+ const item = getElement(element)
30
+
31
+ if (item) {
32
+ const data: any = getElementItem(item, index)
33
+
34
+ if (
35
+ isObject(data)
36
+ && isObject(value)
37
+ ) {
38
+ forEach(value as any, (item, key) => {
39
+ data[key] = executeFunction(item)
40
+ })
41
+ } else {
42
+ const newValue = executeFunction(value)
43
+
44
+ if (
45
+ !(index in item)
46
+ && typeof newValue === 'string'
47
+ ) {
48
+ item.setAttribute(index.toString(), newValue)
49
+ } else {
50
+ (item as any)[index] = executeFunction(value)
51
+ }
52
+ }
53
+ }
54
+
55
+ return item
56
+ }
@@ -0,0 +1,59 @@
1
+ import { isArray } from './isArray'
2
+
3
+ /**
4
+ * Modifies data according to its type and settings.
5
+ *
6
+ * Изменяет данные в соответствии с их типом и настройками.
7
+ * @param selected base values/ базовые значения
8
+ * @param value new values/ новые значения
9
+ * @param multiple support for multiple values/ поддержка нескольких значений
10
+ * @param maxlength maximum values/ максимальные значения
11
+ * @param alwaysChange updating values in any case/ обновление значений при любом случае
12
+ * @param notEmpty do not make the values empty/ не делать значения пустыми
13
+ */
14
+ export function setValues<T>(
15
+ selected: T | T[] | undefined,
16
+ value: any,
17
+ {
18
+ multiple = false,
19
+ maxlength = 0,
20
+ alwaysChange = true,
21
+ notEmpty = false
22
+ }
23
+ ): T | T[] | undefined {
24
+ if (multiple) {
25
+ if (isArray(selected)) {
26
+ const key = selected.indexOf(value)
27
+ const data: any[] = [...selected]
28
+
29
+ if (key !== -1) {
30
+ if (!notEmpty || data.length > 1) {
31
+ data.splice(key, 1)
32
+ }
33
+ } else if (!maxlength || selected.length < maxlength) {
34
+ data.push(value)
35
+ }
36
+
37
+ return data
38
+ }
39
+
40
+ if (selected === value) {
41
+ return []
42
+ }
43
+
44
+ if (selected) {
45
+ return [selected, value]
46
+ }
47
+
48
+ return [value]
49
+ }
50
+
51
+ if (
52
+ alwaysChange
53
+ || selected !== value
54
+ ) {
55
+ return value
56
+ }
57
+
58
+ return selected
59
+ }
@@ -0,0 +1,59 @@
1
+ import { copyObject } from './copyObject'
2
+ import { forEach } from './forEach'
3
+ import { isObject } from './isObject'
4
+ import { replaceRecursive } from './replaceRecursive'
5
+
6
+ import {
7
+ type ObjectItem,
8
+ type ObjectOrArray
9
+ } from '../types/basicTypes'
10
+
11
+ /**
12
+ * This method is used to copy the values of all enumerable own properties from one source object to a target object.
13
+ * In priority according to the processing list.
14
+ *
15
+ * Метод используется для копирования значений всех перечисляемых свойств одного объекта в другой.
16
+ * В приоритете по списку обработки.
17
+ * @param array the target object/ целевой объект
18
+ * @param replacement the source object/ исходные объекты
19
+ * @param indexStart index at which to start changing the array/ индекс, по которому начинает изменять массив
20
+ */
21
+ export function splice<I>(
22
+ array: ObjectItem<I>,
23
+ replacement?: ObjectItem<I> | I,
24
+ indexStart?: string
25
+ ): ObjectItem<I> {
26
+ if (
27
+ isObject(array)
28
+ && isObject(replacement)
29
+ ) {
30
+ if (indexStart) {
31
+ let returnData: ObjectItem<I> = {}
32
+ let init = false
33
+
34
+ forEach<I, void>(array, (item, index) => {
35
+ if (
36
+ !init && (
37
+ indexStart === index
38
+ || indexStart === item
39
+ )
40
+ ) {
41
+ init = true
42
+ returnData = replaceRecursive(returnData, replacement as ObjectOrArray)
43
+ } else if (init) {
44
+ returnData = replaceRecursive(returnData, { [index]: item })
45
+ } else {
46
+ returnData[index] = isObject(item) ? copyObject(item) : item
47
+ }
48
+ })
49
+
50
+ return init ? returnData : replaceRecursive(array, replacement as ObjectOrArray)
51
+ }
52
+
53
+ if (isObject(replacement)) {
54
+ return replaceRecursive(array, replacement as ObjectOrArray)
55
+ }
56
+ }
57
+
58
+ return copyObject(array)
59
+ }
@@ -0,0 +1,12 @@
1
+ import { arrFill } from './arrFill'
2
+
3
+ /**
4
+ * The method creates a string of length count, consisting of the characters value.
5
+ *
6
+ * Метод создает строку длиной count, состоящую из символов value.
7
+ * @param value character for filling/ символ для заполнения
8
+ * @param count length of the string/ длина строки
9
+ */
10
+ export function strFill(value: string, count: number): string {
11
+ return arrFill(value, count).join('')
12
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Преобразует значение в массив.
3
+ * Если переданное значение уже является массивом, возвращается оно само.
4
+ * В противном случае значение оборачивается в массив.
5
+ *
6
+ * Converts a value to an array.
7
+ * If the value is already an array, it returns it as is.
8
+ * Otherwise, it wraps the value in an array.
9
+ *
10
+ * @param value - Значение, которое необходимо преобразовать в массив.
11
+ *
12
+ * The value to be converted into an array.
13
+ * @returns Массив, содержащий переданное значение.
14
+ *
15
+ * An array containing the provided value.
16
+ */
17
+ export function toArray<T>(value: T): T extends any[] ? T : [T] {
18
+ return (Array.isArray(value) ? value : [value]) as T extends any[] ? T : [T]
19
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Convert a String to Camel Case (upper).
3
+ *
4
+ * Преобразование строки в Camel Case (upper).
5
+ * @param value input value/ входное значение
6
+ */
7
+ export function toCamelCase(value: string): string {
8
+ return value
9
+ .toString()
10
+ .trim()
11
+ .replace(/[^\w- ]+/g, '')
12
+ .replace(/ +/g, '-')
13
+ .replace(/(?<=[A-Z])([A-Z])/g, char => `${char.toLowerCase()}`)
14
+ .replace(/-+([a-zA-Z0-9])/g, (...char: string[]) => `${String(char[1]).toUpperCase()}`)
15
+ .replace(/^([A-Z])/, char => `${char.toLowerCase()}`)
16
+ }