@nemigo/helpers 0.13.3 → 1.5.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.
Files changed (111) hide show
  1. package/dist/aggregator.d.ts +33 -0
  2. package/dist/aggregator.js +44 -0
  3. package/dist/array.d.ts +33 -0
  4. package/dist/array.js +24 -0
  5. package/dist/async/context.d.ts +73 -0
  6. package/dist/async/context.js +90 -0
  7. package/dist/async/future.d.ts +54 -0
  8. package/dist/async/future.js +71 -0
  9. package/dist/async/index.d.ts +56 -27
  10. package/dist/async/index.js +63 -58
  11. package/dist/async/loader.d.ts +67 -0
  12. package/dist/async/loader.js +101 -0
  13. package/dist/async/queue.d.ts +51 -0
  14. package/dist/async/queue.js +84 -0
  15. package/dist/cases.d.ts +31 -21
  16. package/dist/cases.js +41 -37
  17. package/dist/clean.d.ts +44 -26
  18. package/dist/clean.js +67 -42
  19. package/dist/color/types.d.ts +31 -0
  20. package/dist/color/types.js +1 -0
  21. package/dist/datetime/delta.d.ts +28 -0
  22. package/dist/datetime/delta.js +65 -0
  23. package/dist/datetime/format.d.ts +53 -0
  24. package/dist/datetime/format.js +119 -0
  25. package/dist/datetime/index.d.ts +6 -0
  26. package/dist/datetime/index.js +22 -0
  27. package/dist/datetime/plural.d.ts +77 -0
  28. package/dist/datetime/plural.js +78 -0
  29. package/dist/emitter.d.ts +29 -17
  30. package/dist/emitter.js +35 -21
  31. package/dist/explorer.d.ts +22 -29
  32. package/dist/explorer.js +18 -16
  33. package/dist/files.d.ts +31 -2
  34. package/dist/files.js +33 -8
  35. package/dist/fish.d.ts +29 -0
  36. package/dist/fish.js +70 -0
  37. package/dist/html/cookie.d.ts +48 -0
  38. package/dist/html/cookie.js +37 -0
  39. package/dist/html/events.d.ts +133 -0
  40. package/dist/html/events.js +139 -0
  41. package/dist/html/index.d.ts +31 -0
  42. package/dist/html/index.js +61 -0
  43. package/dist/index.d.ts +38 -40
  44. package/dist/index.js +43 -56
  45. package/dist/jiff/apply.d.ts +93 -0
  46. package/dist/jiff/apply.js +64 -0
  47. package/dist/jiff/extract.d.ts +7 -0
  48. package/dist/jiff/extract.js +82 -0
  49. package/dist/jiff/types.d.ts +57 -0
  50. package/dist/jiff/types.js +1 -0
  51. package/dist/lens.d.ts +20 -31
  52. package/dist/lens.js +22 -37
  53. package/dist/msgpack.d.ts +11 -26
  54. package/dist/msgpack.js +9 -21
  55. package/dist/mutate.d.ts +70 -0
  56. package/dist/mutate.js +130 -0
  57. package/dist/omitter.d.ts +54 -34
  58. package/dist/omitter.js +33 -25
  59. package/dist/path.d.ts +20 -1
  60. package/dist/path.js +21 -2
  61. package/dist/phymath/format.d.ts +60 -0
  62. package/dist/phymath/format.js +34 -0
  63. package/dist/phymath/index.d.ts +30 -30
  64. package/dist/phymath/index.js +41 -33
  65. package/dist/promoter.d.ts +20 -12
  66. package/dist/promoter.js +24 -17
  67. package/dist/random.d.ts +20 -21
  68. package/dist/random.js +22 -23
  69. package/dist/rubles.d.ts +24 -0
  70. package/dist/rubles.js +24 -0
  71. package/dist/script.d.ts +60 -13
  72. package/dist/script.js +46 -10
  73. package/dist/string.d.ts +46 -92
  74. package/dist/string.js +46 -171
  75. package/dist/types.d.ts +144 -25
  76. package/dist/url/index.d.ts +12 -0
  77. package/dist/url/index.js +17 -0
  78. package/dist/url/params.d.ts +141 -0
  79. package/dist/{url.js → url/params.js} +90 -18
  80. package/dist/url/slug.d.ts +28 -0
  81. package/dist/url/slug.js +102 -0
  82. package/dist/veil.d.ts +14 -0
  83. package/dist/veil.js +26 -0
  84. package/dist/xod.d.ts +237 -16
  85. package/dist/xod.js +192 -18
  86. package/dist/zipper.d.ts +22 -4
  87. package/dist/zipper.js +22 -5
  88. package/package.json +82 -34
  89. package/dist/async/space.d.ts +0 -8
  90. package/dist/async/space.js +0 -31
  91. package/dist/cleanup.d.ts +0 -9
  92. package/dist/cleanup.js +0 -18
  93. package/dist/colors.d.ts +0 -539
  94. package/dist/colors.js +0 -888
  95. package/dist/cookie.d.ts +0 -60
  96. package/dist/cookie.js +0 -48
  97. package/dist/datetime.d.ts +0 -82
  98. package/dist/datetime.js +0 -161
  99. package/dist/format.d.ts +0 -36
  100. package/dist/format.js +0 -26
  101. package/dist/future.d.ts +0 -51
  102. package/dist/future.js +0 -71
  103. package/dist/html.d.ts +0 -145
  104. package/dist/html.js +0 -205
  105. package/dist/humanly.d.ts +0 -9
  106. package/dist/humanly.js +0 -93
  107. package/dist/lru.d.ts +0 -77
  108. package/dist/lru.js +0 -128
  109. package/dist/queue.d.ts +0 -40
  110. package/dist/queue.js +0 -56
  111. package/dist/url.d.ts +0 -61
package/dist/types.d.ts CHANGED
@@ -1,68 +1,187 @@
1
1
  export type * from "./phymath/types.js";
2
- import type { ZIP } from "./zipper.js";
3
- export type { ZIP };
2
+ export type { ZIP } from "./zipper.js";
4
3
  /**
5
- * Дата и время в формате UNIX
4
+ * Просто алиас к {@link Parameters}
6
5
  */
7
- export type Timestamp = number;
6
+ export type Args<F extends (...args: any[]) => any> = Parameters<F>;
7
+ /**
8
+ * Просто алиас к {@link ReturnType}
9
+ */
10
+ export type Return<F extends (...args: any[]) => any> = ReturnType<F>;
11
+ /**
12
+ * Любая функция, полезна для дженириков
13
+ */
14
+ export type AnyFunc = (...args: any[]) => any;
15
+ /**
16
+ * Производная функция от {@link AnyFunc}, полезна для дженириков
17
+ */
18
+ export type FuncCopy<F extends AnyFunc> = (...args: Args<F>) => Return<F>;
19
+ /**
20
+ * Любая функция с `this`, полезна для дженириков
21
+ */
22
+ export type AnyThisFunc<This> = (this: This, ...args: any[]) => any;
8
23
  /**
9
- * Идентификатор чего-либо для рантайма (например, для кэша)
24
+ * Производная функция от {@link AnyThisFunc}, полезна для дженириков
25
+ */
26
+ export type ThisFuncCopy<This, F extends AnyThisFunc<This>> = (this: This, ...args: Args<F>) => Return<F>;
27
+ /**
28
+ * Идентификатор чего-либо для использования в рантайме (например, для кэша или ключей Map/Set)
10
29
  */
11
30
  export type RID = string | number | symbol;
12
31
  /**
13
- * Обобщённый тип таймеров
32
+ * Значение, которое может быть сериализовано в JSON
14
33
  */
15
- export type TimeoutType = ReturnType<typeof setTimeout>;
34
+ export type Serializable = object | null | string | number | boolean;
16
35
  /**
17
- * Обобщённый тип интервалов
36
+ * Интерфейс всех состояний
18
37
  */
19
- export type IntervalType = ReturnType<typeof setInterval>;
38
+ export interface IState<V> {
39
+ get(): V;
40
+ set(v: V): void;
41
+ }
20
42
  /**
21
- * Массив в массиве
43
+ * Интерфейс для хранения чего-нибудь
22
44
  */
23
- export type Matrix<T = unknown> = T[][];
45
+ export interface Dictionary<K = any, V = any> {
46
+ get(key: K): V | undefined;
47
+ set(key: K, v: V): void;
48
+ }
24
49
  /**
25
- * Значение может быть `null` или `undefined`
50
+ * Дата и время в формате Unix (количество миллисекунд с 1 января 1970 года)
51
+ */
52
+ export type Timestamp = number;
53
+ /**
54
+ * Все форматы даты и времени
55
+ */
56
+ export type DateTime = Date | Timestamp | string;
57
+ /**
58
+ * Расширенный {@link Timestamp} с информацией о часовом поясе (обычно в котором надо отобразить)
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * // Московское время (UTC+3)
63
+ * { zone: 3, stamp: 1703510400000 }
64
+ *
65
+ * // Тихоокеанское время (UTC-8)
66
+ * { zone: -8, stamp: 1703510400000 }
67
+ * ```
68
+ */
69
+ export interface ZoneStamp {
70
+ /**
71
+ * Часовой пояс в формате смещения от UTC (в часах)
72
+ */
73
+ zone: number;
74
+ /**
75
+ * Дата и время в формате {@link Timestamp}
76
+ */
77
+ stamp: Timestamp;
78
+ }
79
+ /**
80
+ * Обобщённый тип таймеров (возвращаемое значение {@link setTimeout})
81
+ */
82
+ export type TimeoutType = Return<typeof setTimeout>;
83
+ /**
84
+ * Обобщённый тип интервалов (возвращаемое значение {@link setInterval})
85
+ */
86
+ export type IntervalType = Return<typeof setInterval>;
87
+ /**
88
+ * Получение типа элемента массива
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * type NumbersArray = number[];
93
+ * type NumberElement = ArrayElement<NumbersArray>; // number
94
+ *
95
+ * type UsersArray = User[];
96
+ * type UserElement = ArrayElement<UsersArray>; // User
97
+ *
98
+ * type Mixed = ArrayElement<(string | number)[]>; // string | number
99
+ * ```
100
+ */
101
+ export type ArrayElement<T> = T extends (infer U)[] ? U : never;
102
+ /**
103
+ * Массив с ожидаемым `length` для построения других дженериков
104
+ *
105
+ * @remarks Это не совсем настоящий кортеж, совмещайте с настоящим для полноценной типизации
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * type Vector2D = [number, number] | Cortege<2>;
110
+ * ```
111
+ */
112
+ export type Cortege<L extends number, V = number> = {
113
+ length: L;
114
+ } & Array<V>;
115
+ /**
116
+ * Двумерный массив (массив в массиве)
26
117
  */
27
- export type CanBeNullable<T = unknown> = T | null | undefined;
118
+ export type Matrix<V = unknown> = V[][];
28
119
  /**
29
120
  * Значение может быть массивом или одиночным элементом
30
121
  */
31
- export type CanBeArray<T = unknown> = T | T[];
122
+ export type CanBeArray<V = unknown> = V | V[];
32
123
  /**
33
124
  * Массив может быть readonly
34
125
  */
35
- export type CanBeReadonly<T = unknown> = readonly T[] | T[];
126
+ export type CanBeReadonlyArray<V = unknown> = readonly V[] | V[];
36
127
  /**
37
- * Значение может быть промиссом
128
+ * Значение может быть `null` или `undefined`
38
129
  */
39
- export type CanBePromise<T = unknown> = T | Promise<T>;
130
+ export type CanBeNullable<V = unknown> = V | null | undefined;
40
131
  /**
41
- * Исключение `undefined`
132
+ * Значение может быть промисом
133
+ */
134
+ export type CanBePromise<V = void> = V | Promise<V>;
135
+ /**
136
+ * Исключает `undefined` из типа
42
137
  */
43
138
  export type Exist<T> = Exclude<T, undefined>;
44
139
  /**
45
- * Только строковые ключи объектов
140
+ * Получение только строковых ключей
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * interface User {
145
+ * id: number;
146
+ * name: string;
147
+ * func: () => Iterator<string>;
148
+ * }
149
+ *
150
+ * type UserKeys = KEYS<User>; // "id" | "name"
151
+ * ```
46
152
  */
47
153
  export type KEYS<O> = keyof O extends infer Key ? (Key extends string ? Key : never) : never;
154
+ /**
155
+ * Примитив для всех записей с идентификатором
156
+ */
157
+ export interface RecordPrimitive {
158
+ /**
159
+ * Уникальный идентификатор записи:
160
+ * - UID, если запись из БД
161
+ * - {@link ZIP}, если генерируется из данных записи
162
+ * - Возможны иные варианты по контексту
163
+ */
164
+ id: string;
165
+ }
48
166
  /**
49
167
  * Рекурсивный {@link Partial}
168
+ *
169
+ * @remarks Криво работает с функциональными методами и **НЕ** имеет защиты от бесконечных рекурсий
50
170
  */
51
171
  export type DeepPartial<O> = {
52
172
  [K in keyof O]?: O[K] extends object | undefined ? DeepPartial<O[K]> : O[K];
53
173
  };
54
174
  /**
55
175
  * Рекурсивный {@link Required}
176
+ *
177
+ * @remarks Криво работает с функциональными методами и **НЕ** имеет защиты от бесконечных рекурсий
56
178
  */
57
179
  export type DeepRequired<O> = {
58
180
  [K in keyof O]-?: O[K] extends object | undefined ? DeepRequired<NonNullable<O[K]>> : O[K];
59
181
  };
60
182
  /**
61
- * Получение тип элемента массива
62
- */
63
- export type ArrayElement<T> = T extends (infer U)[] ? U : never;
64
- /**
65
- * - ASC - по возрастанию
66
- * - DESC - по убыванию
183
+ * Направление сортировки:
184
+ * - `ASC` — по возрастанию
185
+ * - `DESC` по убыванию
67
186
  */
68
187
  export type SortDirection = "ASC" | "DESC";
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Извлекает доменную часть ({@link URL.origin})
3
+ */
4
+ export declare const extractUrlOrigin: (url: URL | string) => string;
5
+ /**
6
+ * Возвращает текущий URL из {@link window.location}
7
+ */
8
+ export declare const getCurrentUrl: () => URL;
9
+ /**
10
+ * Преобразует абсолютный URL в относительный (без {@link URL.origin})
11
+ */
12
+ export declare const toRelativeUrl: (url: URL) => string;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Извлекает доменную часть ({@link URL.origin})
3
+ */
4
+ export const extractUrlOrigin = (url) => {
5
+ if (url instanceof URL)
6
+ return url.origin;
7
+ const { origin } = new URL(url);
8
+ return origin;
9
+ };
10
+ /**
11
+ * Возвращает текущий URL из {@link window.location}
12
+ */
13
+ export const getCurrentUrl = () => new URL(window.location.href);
14
+ /**
15
+ * Преобразует абсолютный URL в относительный (без {@link URL.origin})
16
+ */
17
+ export const toRelativeUrl = (url) => url.toString().replace(url.origin, "");
@@ -0,0 +1,141 @@
1
+ import type { CanBeNullable } from "../types.js";
2
+ /**
3
+ * Возможные значения параметра для {@link pushUrlParams} и {@link clearUrlParams}
4
+ */
5
+ export type UrlParamValue = CanBeNullable<string | number | boolean>;
6
+ /**
7
+ * KV-параметры для URL для {@link pushUrlParams} и {@link clearUrlParams}
8
+ */
9
+ export type UrlParamKV<V extends UrlParamValue = UrlParamValue> = {
10
+ key: string;
11
+ value?: V;
12
+ };
13
+ /**
14
+ * Параметры для URL для {@link pushUrlParams} и {@link clearUrlParams}
15
+ */
16
+ export type UrlParams<V extends UrlParamValue = UrlParamValue> = CanBeNullable<string | UrlParamKV<V>>[];
17
+ /**
18
+ * Добавляет параметры в URL
19
+ *
20
+ * Для каждого параметра из массива:
21
+ *
22
+ * - Если параметр равен `null` или `undefined`, он пропускается
23
+ * - Если параметр имеет тип `string`, то в строке запроса добавляется параметр с ключом равным значению строки и значением `"true"`
24
+ * - Если параметр является объектом с ключом и значением, то, если значение не `undefined` и не является объектом, оно приводится к строке и
25
+ * устанавливается в качестве значения
26
+ *
27
+ * **Небезопасное поведение (unsafe=true):**
28
+ *
29
+ * - При передаче параметра типа `string` он добавляется как `?param1&param2` (без значения)
30
+ * - При передаче параметра, значение которого равно `true` или пустой строке, параметр добавляется без значения
31
+ * - Автоматически очищает пустые значения (`=&` → `&`, `param=` → `param`)
32
+ *
33
+ * @param url - URL, в который будут добавлены параметры
34
+ * @param params - Массив параметров
35
+ * @param [unsafe=false] - Небезопасное поведение
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * const url = new URL("https://example.com");
40
+ *
41
+ * // Безопасное поведение (по умолчанию)
42
+ * pushUrlParams(url, [
43
+ * "sort",
44
+ * { key: "page", value: 1 },
45
+ * { key: "search", value: "hello" }
46
+ * ]);
47
+ * // Результат: https://example.com?sort=true&page=1&search=hello
48
+ *
49
+ * // Небезопасное поведение
50
+ * pushUrlParams(url, [
51
+ * "sort",
52
+ * { key: "filter", value: true },
53
+ * { key: "empty", value: "" }
54
+ * ], true);
55
+ * // Результат: https://example.com?sort&filter&empty
56
+ *
57
+ * // Смешанные параметры
58
+ * pushUrlParams(url, [
59
+ * "active",
60
+ * { key: "id", value: 123 },
61
+ * { key: "debug", value: false },
62
+ * null, // игнорируется
63
+ * undefined // игнорируется
64
+ * ]);
65
+ * // Результат: https://example.com?active=true&id=123&debug=false
66
+ * ```
67
+ */
68
+ export declare const pushUrlParams: (url: URL, params: UrlParams, unsafe?: boolean) => void;
69
+ /**
70
+ * Строгий тип параметров для {@link pushUrlParams} (все поля обязательны)
71
+ */
72
+ export type StrictPushUrlParams = Required<UrlParamKV<string | boolean | number>>[];
73
+ /**
74
+ * Объединяет массивы параметров для {@link pushUrlParams} в один массив, исключая дубликаты
75
+ *
76
+ * При конфликте параметров с одинаковыми ключами:
77
+ * - Последнее значение имеет приоритет
78
+ * - Параметры без значений (`true`) заменяются на параметры со значениями
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * const params1 = ["sort", { key: "page", value: 1 }];
83
+ * const params2 = [{ key: "page", value: 2 }, { key: "filter", value: "active" }];
84
+ *
85
+ * const merged = mergePushUrlParams(params1, params2);
86
+ * // Результат: [
87
+ * // { key: "sort", value: true },
88
+ * // { key: "page", value: 2 },
89
+ * // { key: "filter", value: "active" }
90
+ * // ]
91
+ * ```
92
+ */
93
+ export declare const mergePushUrlParams: (...args: UrlParams[]) => StrictPushUrlParams;
94
+ /**
95
+ * Удаляет из URL параметры
96
+ *
97
+ * Для каждого элемента массива:
98
+ *
99
+ * - Если параметр отсутствует или равен `null` или `undefined`, он пропускается
100
+ * - Если параметр имеет тип `string`, из URL удаляется параметр с таким именем
101
+ * - Если параметр является объектом с ключом (`key`), из URL удаляется параметр с этим ключом
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * const url = new URL("https://example.com?page=1&sort=name&filter=active");
106
+ *
107
+ * // Удаление параметров
108
+ * clearUrlParams(url, [
109
+ * "page",
110
+ * { key: "sort" },
111
+ * { key: "nonexistent" } // безопасно игнорируется
112
+ * ]);
113
+ * // Результат: https://example.com?filter=active
114
+ *
115
+ * // Удаление всех параметров определенного типа
116
+ * clearUrlParams(url, [
117
+ * "filter",
118
+ * "search",
119
+ * "category"
120
+ * ]);
121
+ * ```
122
+ */
123
+ export declare const clearUrlParams: (url: URL, params: UrlParams) => void;
124
+ /**
125
+ * Строгий тип параметров для {@link clearUrlParams} (только ключи)
126
+ */
127
+ export type StrictClearUrlParams = string[];
128
+ /**
129
+ * Объединяет массивы параметров для {@link clearUrlParams} в один массив, исключая дубликаты
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * const params1 = ["page", "sort"];
134
+ * const params2 = ["sort", "filter"]; // дубликат "sort" будет удален
135
+ * const params3 = [{ key: "search" }];
136
+ *
137
+ * const merged = mergeClearUrlParams(params1, params2, params3);
138
+ * // Результат: ["page", "sort", "filter", "search"]
139
+ * ```
140
+ */
141
+ export declare const mergeClearUrlParams: (...args: UrlParams[]) => StrictClearUrlParams;
@@ -3,24 +3,59 @@
3
3
  * Добавляет параметры в URL
4
4
  *
5
5
  * Для каждого параметра из массива:
6
+ *
6
7
  * - Если параметр равен `null` или `undefined`, он пропускается
7
8
  * - Если параметр имеет тип `string`, то в строке запроса добавляется параметр с ключом равным значению строки и значением `"true"`
8
- * - Если параметр является объектом с ключом и значением, то, если значение не `undefined` и не является объектом, оно приводится к строке и устанавливается в качестве значения
9
+ * - Если параметр является объектом с ключом и значением, то, если значение не `undefined` и не является объектом, оно приводится к строке и
10
+ * устанавливается в качестве значения
11
+ *
12
+ * **Небезопасное поведение (unsafe=true):**
9
13
  *
10
- * **Небезопасное поведение:**
11
- * - При передаче параметра типа `string` он добавляется как `?param1&param2` (без значения, то есть без `true`)
14
+ * - При передаче параметра типа `string` он добавляется как `?param1&param2` (без значения)
12
15
  * - При передаче параметра, значение которого равно `true` или пустой строке, параметр добавляется без значения
16
+ * - Автоматически очищает пустые значения (`=&` → `&`, `param=` → `param`)
13
17
  *
14
18
  * @param url - URL, в который будут добавлены параметры
15
19
  * @param params - Массив параметров
16
20
  * @param [unsafe=false] - Небезопасное поведение
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const url = new URL("https://example.com");
25
+ *
26
+ * // Безопасное поведение (по умолчанию)
27
+ * pushUrlParams(url, [
28
+ * "sort",
29
+ * { key: "page", value: 1 },
30
+ * { key: "search", value: "hello" }
31
+ * ]);
32
+ * // Результат: https://example.com?sort=true&page=1&search=hello
33
+ *
34
+ * // Небезопасное поведение
35
+ * pushUrlParams(url, [
36
+ * "sort",
37
+ * { key: "filter", value: true },
38
+ * { key: "empty", value: "" }
39
+ * ], true);
40
+ * // Результат: https://example.com?sort&filter&empty
41
+ *
42
+ * // Смешанные параметры
43
+ * pushUrlParams(url, [
44
+ * "active",
45
+ * { key: "id", value: 123 },
46
+ * { key: "debug", value: false },
47
+ * null, // игнорируется
48
+ * undefined // игнорируется
49
+ * ]);
50
+ * // Результат: https://example.com?active=true&id=123&debug=false
51
+ * ```
17
52
  */
18
- export const pushParams = (url, params, unsafe = false) => {
53
+ export const pushUrlParams = (url, params, unsafe = false) => {
19
54
  for (const param of params) {
20
55
  if (!param)
21
56
  continue;
22
57
  if (typeof param === "string") {
23
- // Если unsafe === true, добавляем параметр без значения, иначе - как "true"
58
+ // Если unsafe === true, добавляем параметр без значения, иначе как "true"
24
59
  url.searchParams.set(param, unsafe ? "" : "true");
25
60
  continue;
26
61
  }
@@ -44,15 +79,28 @@ export const pushParams = (url, params, unsafe = false) => {
44
79
  }
45
80
  url.href = splitted.join("?");
46
81
  }
47
- return url;
48
82
  };
49
83
  /**
50
- * Объединяет массивы параметров для {@link pushParams} в один массив, исключая дубликаты
84
+ * Объединяет массивы параметров для {@link pushUrlParams} в один массив, исключая дубликаты
51
85
  *
52
- * @param args - Массивы параметров для объединения
53
- * @returns Массив параметров без дубликатов
86
+ * При конфликте параметров с одинаковыми ключами:
87
+ * - Последнее значение имеет приоритет
88
+ * - Параметры без значений (`true`) заменяются на параметры со значениями
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * const params1 = ["sort", { key: "page", value: 1 }];
93
+ * const params2 = [{ key: "page", value: 2 }, { key: "filter", value: "active" }];
94
+ *
95
+ * const merged = mergePushUrlParams(params1, params2);
96
+ * // Результат: [
97
+ * // { key: "sort", value: true },
98
+ * // { key: "page", value: 2 },
99
+ * // { key: "filter", value: "active" }
100
+ * // ]
101
+ * ```
54
102
  */
55
- export const mergePushParams = (...args) => {
103
+ export const mergePushUrlParams = (...args) => {
56
104
  const acc = [];
57
105
  for (const params of args) {
58
106
  for (const param of params) {
@@ -92,14 +140,32 @@ export const mergePushParams = (...args) => {
92
140
  * Удаляет из URL параметры
93
141
  *
94
142
  * Для каждого элемента массива:
143
+ *
95
144
  * - Если параметр отсутствует или равен `null` или `undefined`, он пропускается
96
145
  * - Если параметр имеет тип `string`, из URL удаляется параметр с таким именем
97
146
  * - Если параметр является объектом с ключом (`key`), из URL удаляется параметр с этим ключом
98
147
  *
99
- * @param url - URL, из которого будут удалены параметры
100
- * @param params - Массив параметров для удаления
148
+ * @example
149
+ * ```typescript
150
+ * const url = new URL("https://example.com?page=1&sort=name&filter=active");
151
+ *
152
+ * // Удаление параметров
153
+ * clearUrlParams(url, [
154
+ * "page",
155
+ * { key: "sort" },
156
+ * { key: "nonexistent" } // безопасно игнорируется
157
+ * ]);
158
+ * // Результат: https://example.com?filter=active
159
+ *
160
+ * // Удаление всех параметров определенного типа
161
+ * clearUrlParams(url, [
162
+ * "filter",
163
+ * "search",
164
+ * "category"
165
+ * ]);
166
+ * ```
101
167
  */
102
- export const clearParams = (url, params) => {
168
+ export const clearUrlParams = (url, params) => {
103
169
  for (const param of params) {
104
170
  if (!param)
105
171
  continue;
@@ -110,15 +176,21 @@ export const clearParams = (url, params) => {
110
176
  if (param.key)
111
177
  url.searchParams.delete(param.key);
112
178
  }
113
- return url;
114
179
  };
115
180
  /**
116
- * Объединяет массивы параметров для {@link clearParams} в один массив, исключая дубликаты
181
+ * Объединяет массивы параметров для {@link clearUrlParams} в один массив, исключая дубликаты
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * const params1 = ["page", "sort"];
186
+ * const params2 = ["sort", "filter"]; // дубликат "sort" будет удален
187
+ * const params3 = [{ key: "search" }];
117
188
  *
118
- * @param args - Массивы параметров для объединения
119
- * @returns Массив параметров без дубликатов
189
+ * const merged = mergeClearUrlParams(params1, params2, params3);
190
+ * // Результат: ["page", "sort", "filter", "search"]
191
+ * ```
120
192
  */
121
- export const mergeClearParams = (...args) => {
193
+ export const mergeClearUrlParams = (...args) => {
122
194
  const acc = [];
123
195
  for (const params of args) {
124
196
  for (const param of params) {
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Карта для транслитерации кириллических символов в латинские.
3
+ * Содержит соответствия для всех букв русского алфавита в нижнем регистре.
4
+ * Используется в функции {@link toSlug} для создания URL-friendly строк
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * cyrillicToLatinMap.get("а"); // "a"
9
+ * cyrillicToLatinMap.get("ё"); // "yo"
10
+ * cyrillicToLatinMap.get("ъ"); // ""
11
+ * ```
12
+ */
13
+ export declare const cyrillicToLatinMap: Map<string, string>;
14
+ /**
15
+ * Конвертирует кириллицу в латиницу, удаляет специальные символы, нормализует пробелы и заменяет их на разделитель
16
+ *
17
+ * @param str - Строка для преобразования в slug
18
+ * @param [separator="-"] - Разделитель для замены пробелов
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * toSlug("Привет, мир!"); // "privet-mir"
23
+ * toSlug("JavaScript Programming"); // "javascript-programming"
24
+ * toSlug("Café & Restaurant", "_"); // "cafe_restaurant"
25
+ * toSlug("Специальные символы!!!", "."); // "specialnye-simvoly"
26
+ * ```
27
+ */
28
+ export declare const toSlug: (str: string, separator?: string) => string;