@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.
- package/dist/aggregator.d.ts +33 -0
- package/dist/aggregator.js +44 -0
- package/dist/array.d.ts +33 -0
- package/dist/array.js +24 -0
- package/dist/async/context.d.ts +73 -0
- package/dist/async/context.js +90 -0
- package/dist/async/future.d.ts +54 -0
- package/dist/async/future.js +71 -0
- package/dist/async/index.d.ts +56 -27
- package/dist/async/index.js +63 -58
- package/dist/async/loader.d.ts +67 -0
- package/dist/async/loader.js +101 -0
- package/dist/async/queue.d.ts +51 -0
- package/dist/async/queue.js +84 -0
- package/dist/cases.d.ts +31 -21
- package/dist/cases.js +41 -37
- package/dist/clean.d.ts +44 -26
- package/dist/clean.js +67 -42
- package/dist/color/types.d.ts +31 -0
- package/dist/color/types.js +1 -0
- package/dist/datetime/delta.d.ts +28 -0
- package/dist/datetime/delta.js +65 -0
- package/dist/datetime/format.d.ts +53 -0
- package/dist/datetime/format.js +119 -0
- package/dist/datetime/index.d.ts +6 -0
- package/dist/datetime/index.js +22 -0
- package/dist/datetime/plural.d.ts +77 -0
- package/dist/datetime/plural.js +78 -0
- package/dist/emitter.d.ts +29 -17
- package/dist/emitter.js +35 -21
- package/dist/explorer.d.ts +22 -29
- package/dist/explorer.js +18 -16
- package/dist/files.d.ts +31 -2
- package/dist/files.js +33 -8
- package/dist/fish.d.ts +29 -0
- package/dist/fish.js +70 -0
- package/dist/html/cookie.d.ts +48 -0
- package/dist/html/cookie.js +37 -0
- package/dist/html/events.d.ts +133 -0
- package/dist/html/events.js +139 -0
- package/dist/html/index.d.ts +31 -0
- package/dist/html/index.js +61 -0
- package/dist/index.d.ts +38 -40
- package/dist/index.js +43 -56
- package/dist/jiff/apply.d.ts +93 -0
- package/dist/jiff/apply.js +64 -0
- package/dist/jiff/extract.d.ts +7 -0
- package/dist/jiff/extract.js +82 -0
- package/dist/jiff/types.d.ts +57 -0
- package/dist/jiff/types.js +1 -0
- package/dist/lens.d.ts +20 -31
- package/dist/lens.js +22 -37
- package/dist/msgpack.d.ts +11 -26
- package/dist/msgpack.js +9 -21
- package/dist/mutate.d.ts +70 -0
- package/dist/mutate.js +130 -0
- package/dist/omitter.d.ts +54 -34
- package/dist/omitter.js +33 -25
- package/dist/path.d.ts +20 -1
- package/dist/path.js +21 -2
- package/dist/phymath/format.d.ts +60 -0
- package/dist/phymath/format.js +34 -0
- package/dist/phymath/index.d.ts +30 -30
- package/dist/phymath/index.js +41 -33
- package/dist/promoter.d.ts +20 -12
- package/dist/promoter.js +24 -17
- package/dist/random.d.ts +20 -21
- package/dist/random.js +22 -23
- package/dist/rubles.d.ts +24 -0
- package/dist/rubles.js +24 -0
- package/dist/script.d.ts +60 -13
- package/dist/script.js +46 -10
- package/dist/string.d.ts +46 -92
- package/dist/string.js +46 -171
- package/dist/types.d.ts +144 -25
- package/dist/url/index.d.ts +12 -0
- package/dist/url/index.js +17 -0
- package/dist/url/params.d.ts +141 -0
- package/dist/{url.js → url/params.js} +90 -18
- package/dist/url/slug.d.ts +28 -0
- package/dist/url/slug.js +102 -0
- package/dist/veil.d.ts +14 -0
- package/dist/veil.js +26 -0
- package/dist/xod.d.ts +237 -16
- package/dist/xod.js +192 -18
- package/dist/zipper.d.ts +22 -4
- package/dist/zipper.js +22 -5
- package/package.json +82 -34
- package/dist/async/space.d.ts +0 -8
- package/dist/async/space.js +0 -31
- package/dist/cleanup.d.ts +0 -9
- package/dist/cleanup.js +0 -18
- package/dist/colors.d.ts +0 -539
- package/dist/colors.js +0 -888
- package/dist/cookie.d.ts +0 -60
- package/dist/cookie.js +0 -48
- package/dist/datetime.d.ts +0 -82
- package/dist/datetime.js +0 -161
- package/dist/format.d.ts +0 -36
- package/dist/format.js +0 -26
- package/dist/future.d.ts +0 -51
- package/dist/future.js +0 -71
- package/dist/html.d.ts +0 -145
- package/dist/html.js +0 -205
- package/dist/humanly.d.ts +0 -9
- package/dist/humanly.js +0 -93
- package/dist/lru.d.ts +0 -77
- package/dist/lru.js +0 -128
- package/dist/queue.d.ts +0 -40
- package/dist/queue.js +0 -56
- 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
|
-
|
|
3
|
-
export type { ZIP };
|
|
2
|
+
export type { ZIP } from "./zipper.js";
|
|
4
3
|
/**
|
|
5
|
-
*
|
|
4
|
+
* Просто алиас к {@link Parameters}
|
|
6
5
|
*/
|
|
7
|
-
export type
|
|
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
|
|
34
|
+
export type Serializable = object | null | string | number | boolean;
|
|
16
35
|
/**
|
|
17
|
-
*
|
|
36
|
+
* Интерфейс всех состояний
|
|
18
37
|
*/
|
|
19
|
-
export
|
|
38
|
+
export interface IState<V> {
|
|
39
|
+
get(): V;
|
|
40
|
+
set(v: V): void;
|
|
41
|
+
}
|
|
20
42
|
/**
|
|
21
|
-
*
|
|
43
|
+
* Интерфейс для хранения чего-нибудь
|
|
22
44
|
*/
|
|
23
|
-
export
|
|
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
|
-
*
|
|
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
|
|
118
|
+
export type Matrix<V = unknown> = V[][];
|
|
28
119
|
/**
|
|
29
120
|
* Значение может быть массивом или одиночным элементом
|
|
30
121
|
*/
|
|
31
|
-
export type CanBeArray<
|
|
122
|
+
export type CanBeArray<V = unknown> = V | V[];
|
|
32
123
|
/**
|
|
33
124
|
* Массив может быть readonly
|
|
34
125
|
*/
|
|
35
|
-
export type
|
|
126
|
+
export type CanBeReadonlyArray<V = unknown> = readonly V[] | V[];
|
|
36
127
|
/**
|
|
37
|
-
* Значение может быть
|
|
128
|
+
* Значение может быть `null` или `undefined`
|
|
38
129
|
*/
|
|
39
|
-
export type
|
|
130
|
+
export type CanBeNullable<V = unknown> = V | null | undefined;
|
|
40
131
|
/**
|
|
41
|
-
*
|
|
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
|
-
|
|
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¶m2` (без значения)
|
|
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¶m2` (без значения, то есть без `true`)
|
|
14
|
+
* - При передаче параметра типа `string` он добавляется как `?param1¶m2` (без значения)
|
|
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
|
|
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, добавляем параметр без значения, иначе
|
|
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
|
|
84
|
+
* Объединяет массивы параметров для {@link pushUrlParams} в один массив, исключая дубликаты
|
|
51
85
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
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
|
|
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
|
-
* @
|
|
100
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
119
|
-
*
|
|
189
|
+
* const merged = mergeClearUrlParams(params1, params2, params3);
|
|
190
|
+
* // Результат: ["page", "sort", "filter", "search"]
|
|
191
|
+
* ```
|
|
120
192
|
*/
|
|
121
|
-
export const
|
|
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;
|