@nemigo/helpers 0.10.0 → 0.11.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.
- package/dist/async/space.js +2 -1
- package/dist/clean.d.ts +30 -6
- package/dist/clean.js +30 -6
- package/dist/datetime.d.ts +59 -32
- package/dist/datetime.js +59 -32
- package/dist/files.d.ts +1 -15
- package/dist/files.js +1 -15
- package/dist/html.d.ts +74 -36
- package/dist/html.js +77 -39
- package/dist/path.d.ts +3 -0
- package/dist/path.js +7 -0
- package/dist/random.d.ts +36 -3
- package/dist/random.js +36 -3
- package/dist/string.d.ts +115 -14
- package/dist/string.js +116 -14
- package/package.json +10 -4
package/dist/async/space.js
CHANGED
|
@@ -11,9 +11,10 @@ export class AsyncSpace {
|
|
|
11
11
|
const ctx = this.async_storage.getStore();
|
|
12
12
|
if (ctx)
|
|
13
13
|
return call(ctx);
|
|
14
|
-
|
|
14
|
+
// Создаем новое пространство
|
|
15
15
|
const tx = [];
|
|
16
16
|
const result = await this.async_storage.run(tx, () => call(tx));
|
|
17
|
+
// Автоматически выполняем транзакции, если они есть и включен автокоммит
|
|
17
18
|
if (auto && tx.length > 0) {
|
|
18
19
|
await this.submit(tx);
|
|
19
20
|
tx.length = 0;
|
package/dist/clean.d.ts
CHANGED
|
@@ -1,13 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Глубоко очищает объект (включая массивы) от "пустых" значений с созданием копии.
|
|
3
|
+
* Удаляет значения: `null`, `undefined`, пустые строки `""`.
|
|
4
|
+
* После очистки удаляет объекты и массивы, ставшие пустыми.
|
|
5
|
+
* Не изменяет исходный объект.
|
|
6
|
+
*
|
|
7
|
+
* @template O - Тип исходного объекта
|
|
8
|
+
* @param data - Объект или значение для очистки
|
|
9
|
+
* @returns Очищенная копия объекта или исходное значение, если это не объект
|
|
5
10
|
*
|
|
6
11
|
* @example
|
|
7
|
-
*
|
|
8
|
-
* const
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const original = {
|
|
14
|
+
* a: 1,
|
|
15
|
+
* b: null,
|
|
16
|
+
* c: {
|
|
17
|
+
* d: '',
|
|
18
|
+
* e: { f: undefined },
|
|
19
|
+
* g: [1, null, '', { h: undefined }]
|
|
20
|
+
* }
|
|
21
|
+
* };
|
|
9
22
|
*
|
|
23
|
+
* const cleaned = deepObjectClean(original);
|
|
10
24
|
* console.log(cleaned); // { a: 1 }
|
|
11
|
-
* console.log(original); //
|
|
25
|
+
* console.log(original); // Исходный объект не изменен
|
|
26
|
+
*
|
|
27
|
+
* // Работа с массивами
|
|
28
|
+
* const array = [1, null, '', { a: '', b: 2 }, undefined];
|
|
29
|
+
* const cleanedArray = deepObjectClean(array);
|
|
30
|
+
* console.log(cleanedArray); // [1, { b: 2 }]
|
|
31
|
+
*
|
|
32
|
+
* // Примитивы возвращаются без изменений
|
|
33
|
+
* deepObjectClean("hello"); // "hello"
|
|
34
|
+
* deepObjectClean(null); // null
|
|
35
|
+
* ```
|
|
12
36
|
*/
|
|
13
37
|
export declare const deepObjectClean: <O>(data: O) => O;
|
package/dist/clean.js
CHANGED
|
@@ -1,14 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Глубоко очищает объект (включая массивы) от "пустых" значений с созданием копии.
|
|
3
|
+
* Удаляет значения: `null`, `undefined`, пустые строки `""`.
|
|
4
|
+
* После очистки удаляет объекты и массивы, ставшие пустыми.
|
|
5
|
+
* Не изменяет исходный объект.
|
|
6
|
+
*
|
|
7
|
+
* @template O - Тип исходного объекта
|
|
8
|
+
* @param data - Объект или значение для очистки
|
|
9
|
+
* @returns Очищенная копия объекта или исходное значение, если это не объект
|
|
5
10
|
*
|
|
6
11
|
* @example
|
|
7
|
-
*
|
|
8
|
-
* const
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const original = {
|
|
14
|
+
* a: 1,
|
|
15
|
+
* b: null,
|
|
16
|
+
* c: {
|
|
17
|
+
* d: '',
|
|
18
|
+
* e: { f: undefined },
|
|
19
|
+
* g: [1, null, '', { h: undefined }]
|
|
20
|
+
* }
|
|
21
|
+
* };
|
|
9
22
|
*
|
|
23
|
+
* const cleaned = deepObjectClean(original);
|
|
10
24
|
* console.log(cleaned); // { a: 1 }
|
|
11
|
-
* console.log(original); //
|
|
25
|
+
* console.log(original); // Исходный объект не изменен
|
|
26
|
+
*
|
|
27
|
+
* // Работа с массивами
|
|
28
|
+
* const array = [1, null, '', { a: '', b: 2 }, undefined];
|
|
29
|
+
* const cleanedArray = deepObjectClean(array);
|
|
30
|
+
* console.log(cleanedArray); // [1, { b: 2 }]
|
|
31
|
+
*
|
|
32
|
+
* // Примитивы возвращаются без изменений
|
|
33
|
+
* deepObjectClean("hello"); // "hello"
|
|
34
|
+
* deepObjectClean(null); // null
|
|
35
|
+
* ```
|
|
12
36
|
*/
|
|
13
37
|
export const deepObjectClean = (data) => {
|
|
14
38
|
if (typeof data !== "object" || data === null)
|
package/dist/datetime.d.ts
CHANGED
|
@@ -1,55 +1,82 @@
|
|
|
1
1
|
import type { Timestamp } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Русифицированные названия месяцев в родительском падеже
|
|
4
|
-
*/
|
|
5
2
|
export declare const months: string[];
|
|
6
|
-
/**
|
|
7
|
-
* Русифицированные сокращённые названия месяцев в родительском падеже
|
|
8
|
-
*/
|
|
9
3
|
export declare const abbs: string[];
|
|
10
4
|
/**
|
|
11
|
-
*
|
|
5
|
+
* Универсальный шаблонизатор для форматирования даты и времени.
|
|
6
|
+
* Поддерживает различные форматы вывода с возможностью указания часового пояса для вывода
|
|
12
7
|
*
|
|
13
|
-
*
|
|
8
|
+
* **Поддерживаемые токены:**
|
|
9
|
+
* - `TS` - секунды (00-59)
|
|
10
|
+
* - `TM` - минуты (00-59)
|
|
11
|
+
* - `TH` - часы (00-23)
|
|
12
|
+
* - `DD` - день месяца (01-31)
|
|
13
|
+
* - `DM` - месяц числом (01-12)
|
|
14
|
+
* - `DFM` - месяц полным названием (января, февраля, ...)
|
|
15
|
+
* - `DAM` - месяц сокращённым названием (янв, фев, ...)
|
|
16
|
+
* - `DY` - год (4 цифры)
|
|
14
17
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* DD
|
|
18
|
-
*
|
|
19
|
-
* DM - месяц числом
|
|
20
|
-
*
|
|
21
|
-
* DFM - месяц полным названием
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* formatDateTime(new Date(), 'DD.DM.DY TH:TM:TS');
|
|
21
|
+
* // "09.10.2023 14:30:59"
|
|
22
22
|
*
|
|
23
|
-
*
|
|
23
|
+
* formatDateTime(Date.now(), 'DFM DY');
|
|
24
|
+
* // "октября 2023"
|
|
24
25
|
*
|
|
25
|
-
* DY
|
|
26
|
+
* formatDateTime('2023-12-25', 'DD DAM DY', 3);
|
|
27
|
+
* // "25 дек 2023" (с учетом МСК +3)
|
|
26
28
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
29
|
+
* formatDateTime(Date.now(), 'DY-DM-DD TH:TM');
|
|
30
|
+
* // "2023-10-09 14:30"
|
|
31
|
+
* ```
|
|
30
32
|
*/
|
|
31
33
|
export declare const formatDateTime: (datetime?: Date | Timestamp | string, format?: string, timezone?: number) => string;
|
|
32
34
|
/**
|
|
33
|
-
* Готовый пресет для
|
|
35
|
+
* Готовый пресет для форматирования времени в московском часовом поясе (МСК +3).
|
|
36
|
+
* Использует {@link formatDateTime} с предустановленным форматом и часовым поясом.
|
|
34
37
|
*
|
|
35
|
-
*
|
|
38
|
+
* @param timestamp - Временная метка для форматирования (по умолчанию текущее время)
|
|
39
|
+
* @param format - Шаблон форматирования (по умолчанию "DD.DM.DY TH:TM (МСК)")
|
|
40
|
+
* @returns Отформатированная строка времени в МСК
|
|
36
41
|
*
|
|
37
42
|
* @example
|
|
38
|
-
*
|
|
39
|
-
*
|
|
43
|
+
* ```typescript
|
|
44
|
+
* formatMSK(Date.now());
|
|
45
|
+
* // "09.10.2023 14:30 (МСК)"
|
|
46
|
+
*
|
|
47
|
+
* formatMSK(1696934400000);
|
|
48
|
+
* // "09.10.2023 14:30 (МСК)"
|
|
49
|
+
*
|
|
50
|
+
* formatMSK(Date.now(), 'DD DAM DY TH:TM');
|
|
51
|
+
* // "09 окт 2023 14:30"
|
|
52
|
+
* ```
|
|
40
53
|
*/
|
|
41
54
|
export declare const formatMSK: (timestamp?: Timestamp, format?: string) => string;
|
|
42
55
|
/**
|
|
43
|
-
* Конвертирует строковые представления даты и времени в
|
|
44
|
-
*
|
|
45
|
-
* @param date - Строка даты в формате "DD.MM.YYYY"
|
|
46
|
-
* @param [time="00:00"] - Строка времени в формате "HH:MM"
|
|
47
|
-
* @param [timezone] - Часовой пояс относительно GMT
|
|
56
|
+
* Конвертирует строковые представления даты и времени в числовую временную метку (Timestamp).
|
|
57
|
+
* Поддерживает локальное время и UTC с указанием часового пояса.
|
|
48
58
|
*
|
|
49
|
-
* @
|
|
59
|
+
* @param date - Строка даты в формате "DD.MM.YYYY" (день.месяц.год)
|
|
60
|
+
* @param time - Строка времени в формате "HH:MM" (час:минута), по умолчанию "00:00"
|
|
61
|
+
* @param timezone - Часовой пояс в часах относительно GMT (опционально)
|
|
62
|
+
* @returns Timestamp в миллисекундах или 0 при неверном формате входных данных
|
|
50
63
|
*
|
|
51
64
|
* @example
|
|
52
|
-
*
|
|
53
|
-
*
|
|
65
|
+
* ```typescript
|
|
66
|
+
* toTimeStamp("11.02.2012", "13:45");
|
|
67
|
+
* // Возвращает Timestamp для 11 февраля 2012, 13:45
|
|
68
|
+
*
|
|
69
|
+
* toTimeStamp("25.12.2023");
|
|
70
|
+
* // Возвращает Timestamp для 25 декабря 2023, 00:00
|
|
71
|
+
*
|
|
72
|
+
* toTimeStamp("01.01.2024", "12:00", 3);
|
|
73
|
+
* // Возвращает Timestamp для 1 января 2024, 12:00 МСК (UTC+3)
|
|
74
|
+
*
|
|
75
|
+
* toTimeStamp("invalid", "date");
|
|
76
|
+
* // Возвращает 0 из-за неверного формата
|
|
77
|
+
*
|
|
78
|
+
* toTimeStamp("32.13.2023");
|
|
79
|
+
* // Возвращает 0 из-за неверной даты
|
|
80
|
+
* ```
|
|
54
81
|
*/
|
|
55
82
|
export declare const toTimeStamp: (date: string, time?: string, timezone?: number) => Timestamp | 0;
|
package/dist/datetime.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { pad } from "./index.js";
|
|
2
|
-
/**
|
|
3
|
-
* Русифицированные названия месяцев в родительском падеже
|
|
4
|
-
*/
|
|
5
2
|
export const months = [
|
|
6
3
|
"января",
|
|
7
4
|
"февраля",
|
|
@@ -16,9 +13,6 @@ export const months = [
|
|
|
16
13
|
"ноября",
|
|
17
14
|
"декабря",
|
|
18
15
|
];
|
|
19
|
-
/**
|
|
20
|
-
* Русифицированные сокращённые названия месяцев в родительском падеже
|
|
21
|
-
*/
|
|
22
16
|
export const abbs = [
|
|
23
17
|
"янв",
|
|
24
18
|
"фев",
|
|
@@ -34,25 +28,33 @@ export const abbs = [
|
|
|
34
28
|
"дек",
|
|
35
29
|
];
|
|
36
30
|
/**
|
|
37
|
-
*
|
|
31
|
+
* Универсальный шаблонизатор для форматирования даты и времени.
|
|
32
|
+
* Поддерживает различные форматы вывода с возможностью указания часового пояса для вывода
|
|
38
33
|
*
|
|
39
|
-
*
|
|
34
|
+
* **Поддерживаемые токены:**
|
|
35
|
+
* - `TS` - секунды (00-59)
|
|
36
|
+
* - `TM` - минуты (00-59)
|
|
37
|
+
* - `TH` - часы (00-23)
|
|
38
|
+
* - `DD` - день месяца (01-31)
|
|
39
|
+
* - `DM` - месяц числом (01-12)
|
|
40
|
+
* - `DFM` - месяц полным названием (января, февраля, ...)
|
|
41
|
+
* - `DAM` - месяц сокращённым названием (янв, фев, ...)
|
|
42
|
+
* - `DY` - год (4 цифры)
|
|
40
43
|
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* DD
|
|
44
|
-
*
|
|
45
|
-
* DM - месяц числом
|
|
46
|
-
*
|
|
47
|
-
* DFM - месяц полным названием
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* formatDateTime(new Date(), 'DD.DM.DY TH:TM:TS');
|
|
47
|
+
* // "09.10.2023 14:30:59"
|
|
48
48
|
*
|
|
49
|
-
*
|
|
49
|
+
* formatDateTime(Date.now(), 'DFM DY');
|
|
50
|
+
* // "октября 2023"
|
|
50
51
|
*
|
|
51
|
-
* DY
|
|
52
|
+
* formatDateTime('2023-12-25', 'DD DAM DY', 3);
|
|
53
|
+
* // "25 дек 2023" (с учетом МСК +3)
|
|
52
54
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
55
|
+
* formatDateTime(Date.now(), 'DY-DM-DD TH:TM');
|
|
56
|
+
* // "2023-10-09 14:30"
|
|
57
|
+
* ```
|
|
56
58
|
*/
|
|
57
59
|
export const formatDateTime = (datetime = Date.now(), format = "DD.DM.DY TH:TM", timezone) => {
|
|
58
60
|
const base = new Date(datetime);
|
|
@@ -95,28 +97,53 @@ export const formatDateTime = (datetime = Date.now(), format = "DD.DM.DY TH:TM",
|
|
|
95
97
|
return result.join("");
|
|
96
98
|
};
|
|
97
99
|
/**
|
|
98
|
-
* Готовый пресет для
|
|
100
|
+
* Готовый пресет для форматирования времени в московском часовом поясе (МСК +3).
|
|
101
|
+
* Использует {@link formatDateTime} с предустановленным форматом и часовым поясом.
|
|
99
102
|
*
|
|
100
|
-
*
|
|
103
|
+
* @param timestamp - Временная метка для форматирования (по умолчанию текущее время)
|
|
104
|
+
* @param format - Шаблон форматирования (по умолчанию "DD.DM.DY TH:TM (МСК)")
|
|
105
|
+
* @returns Отформатированная строка времени в МСК
|
|
101
106
|
*
|
|
102
107
|
* @example
|
|
103
|
-
*
|
|
104
|
-
*
|
|
108
|
+
* ```typescript
|
|
109
|
+
* formatMSK(Date.now());
|
|
110
|
+
* // "09.10.2023 14:30 (МСК)"
|
|
111
|
+
*
|
|
112
|
+
* formatMSK(1696934400000);
|
|
113
|
+
* // "09.10.2023 14:30 (МСК)"
|
|
114
|
+
*
|
|
115
|
+
* formatMSK(Date.now(), 'DD DAM DY TH:TM');
|
|
116
|
+
* // "09 окт 2023 14:30"
|
|
117
|
+
* ```
|
|
105
118
|
*/
|
|
106
119
|
export const formatMSK = (timestamp = Date.now(), format = "DD.DM.DY TH:TM (МСК)") => formatDateTime(timestamp, format, 3);
|
|
107
120
|
//...
|
|
108
121
|
/**
|
|
109
|
-
* Конвертирует строковые представления даты и времени в
|
|
110
|
-
*
|
|
111
|
-
* @param date - Строка даты в формате "DD.MM.YYYY"
|
|
112
|
-
* @param [time="00:00"] - Строка времени в формате "HH:MM"
|
|
113
|
-
* @param [timezone] - Часовой пояс относительно GMT
|
|
122
|
+
* Конвертирует строковые представления даты и времени в числовую временную метку (Timestamp).
|
|
123
|
+
* Поддерживает локальное время и UTC с указанием часового пояса.
|
|
114
124
|
*
|
|
115
|
-
* @
|
|
125
|
+
* @param date - Строка даты в формате "DD.MM.YYYY" (день.месяц.год)
|
|
126
|
+
* @param time - Строка времени в формате "HH:MM" (час:минута), по умолчанию "00:00"
|
|
127
|
+
* @param timezone - Часовой пояс в часах относительно GMT (опционально)
|
|
128
|
+
* @returns Timestamp в миллисекундах или 0 при неверном формате входных данных
|
|
116
129
|
*
|
|
117
130
|
* @example
|
|
118
|
-
*
|
|
119
|
-
*
|
|
131
|
+
* ```typescript
|
|
132
|
+
* toTimeStamp("11.02.2012", "13:45");
|
|
133
|
+
* // Возвращает Timestamp для 11 февраля 2012, 13:45
|
|
134
|
+
*
|
|
135
|
+
* toTimeStamp("25.12.2023");
|
|
136
|
+
* // Возвращает Timestamp для 25 декабря 2023, 00:00
|
|
137
|
+
*
|
|
138
|
+
* toTimeStamp("01.01.2024", "12:00", 3);
|
|
139
|
+
* // Возвращает Timestamp для 1 января 2024, 12:00 МСК (UTC+3)
|
|
140
|
+
*
|
|
141
|
+
* toTimeStamp("invalid", "date");
|
|
142
|
+
* // Возвращает 0 из-за неверного формата
|
|
143
|
+
*
|
|
144
|
+
* toTimeStamp("32.13.2023");
|
|
145
|
+
* // Возвращает 0 из-за неверной даты
|
|
146
|
+
* ```
|
|
120
147
|
*/
|
|
121
148
|
export const toTimeStamp = (date, time = "00:00", timezone) => {
|
|
122
149
|
const [day, month, year] = date.split(".").map(Number);
|
package/dist/files.d.ts
CHANGED
|
@@ -1,22 +1,8 @@
|
|
|
1
1
|
export declare const fileToBase64: (file: File) => Promise<string>;
|
|
2
2
|
/**
|
|
3
|
-
* Проверяет, является ли файл
|
|
4
|
-
*
|
|
5
|
-
* @para file - Объект файла
|
|
6
|
-
* @returns true, если файл является изображением
|
|
3
|
+
* Проверяет, является ли файл изображением. SVG данную проверку не проходят.
|
|
7
4
|
*/
|
|
8
5
|
export declare const isImage: (file: File) => boolean;
|
|
9
|
-
/**
|
|
10
|
-
* Проверяет, является ли файл видео
|
|
11
|
-
*/
|
|
12
6
|
export declare const isVideo: (file: File) => boolean;
|
|
13
|
-
/**
|
|
14
|
-
* Проверяет, является ли файл аудио
|
|
15
|
-
*/
|
|
16
7
|
export declare const isAudio: (file: File) => boolean;
|
|
17
|
-
/**
|
|
18
|
-
* Преобразует размер файла в человекочитаемый формат
|
|
19
|
-
*
|
|
20
|
-
* @param size - Размер файла в байтах
|
|
21
|
-
*/
|
|
22
8
|
export declare const getFileSize: (size: number) => string;
|
package/dist/files.js
CHANGED
|
@@ -6,19 +6,10 @@ export const fileToBase64 = (file) => new Promise((resolve, reject) => {
|
|
|
6
6
|
});
|
|
7
7
|
//...
|
|
8
8
|
/**
|
|
9
|
-
* Проверяет, является ли файл
|
|
10
|
-
*
|
|
11
|
-
* @para file - Объект файла
|
|
12
|
-
* @returns true, если файл является изображением
|
|
9
|
+
* Проверяет, является ли файл изображением. SVG данную проверку не проходят.
|
|
13
10
|
*/
|
|
14
11
|
export const isImage = (file) => file.type.startsWith("image/") && !file.type.includes("svg");
|
|
15
|
-
/**
|
|
16
|
-
* Проверяет, является ли файл видео
|
|
17
|
-
*/
|
|
18
12
|
export const isVideo = (file) => file.type.startsWith("video/");
|
|
19
|
-
/**
|
|
20
|
-
* Проверяет, является ли файл аудио
|
|
21
|
-
*/
|
|
22
13
|
export const isAudio = (file) => file.type.startsWith("audio/");
|
|
23
14
|
//...
|
|
24
15
|
const UNITS = [
|
|
@@ -32,11 +23,6 @@ const UNITS = [
|
|
|
32
23
|
"ZB",
|
|
33
24
|
"YB",
|
|
34
25
|
];
|
|
35
|
-
/**
|
|
36
|
-
* Преобразует размер файла в человекочитаемый формат
|
|
37
|
-
*
|
|
38
|
-
* @param size - Размер файла в байтах
|
|
39
|
-
*/
|
|
40
26
|
export const getFileSize = (size) => {
|
|
41
27
|
const bytes = Math.round(size);
|
|
42
28
|
if (bytes === 0)
|
package/dist/html.d.ts
CHANGED
|
@@ -1,39 +1,71 @@
|
|
|
1
1
|
import type { CanBeNullable, CanBePromise, KEYS } from "./types.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* `true`, если глобальный объект `window` отсутствует.
|
|
4
4
|
*/
|
|
5
5
|
export declare const isSSR: boolean;
|
|
6
6
|
/**
|
|
7
|
-
* Предотвращает
|
|
7
|
+
* Предотвращает стандартное поведение события и останавливает его всплытие.
|
|
8
8
|
*/
|
|
9
9
|
export declare const preventStop: (e: Event) => void;
|
|
10
10
|
/**
|
|
11
|
-
* Создаёт обработчик события с {@link preventStop},
|
|
12
|
-
*
|
|
11
|
+
* Создаёт обработчик события с вызовом {@link preventStop}, если условие `usePreventStop` истинно.
|
|
12
|
+
*
|
|
13
|
+
* 1. Если `usePreventStop` → true (или функция вернёт true), то событие будет остановлено.
|
|
14
|
+
* 2. Если `condition` → true (или функция вернёт true), то выполнится переданный коллбэк.
|
|
15
|
+
*
|
|
16
|
+
* @template T Тип события
|
|
17
|
+
* @param call Коллбэк для вызова после проверки условия
|
|
18
|
+
* @param usePreventStop Флаг или функция-условие для вызова {@link preventStop}
|
|
19
|
+
* @param condition Флаг или функция-условие для вызова `call`
|
|
20
|
+
* @returns Обработчик события
|
|
13
21
|
*/
|
|
14
22
|
export declare const preventStopHook: <T extends Event = Event>(call?: CanBeNullable<(e: T) => CanBePromise>, { usePreventStop, condition, }?: {
|
|
15
23
|
usePreventStop?: ((e: T) => unknown) | unknown;
|
|
16
24
|
condition?: ((e: T) => unknown) | unknown;
|
|
17
25
|
}) => ((e: T) => void);
|
|
18
26
|
/**
|
|
19
|
-
*
|
|
27
|
+
* Возвращает обработчик клавиатурных событий.
|
|
20
28
|
*
|
|
21
|
-
*
|
|
29
|
+
* Логика:
|
|
30
|
+
* 1. Если `usePreventStop === "enter"` и нажата клавиша Enter → вызовется {@link preventStop}.
|
|
31
|
+
* 2. Если `usePreventStop` — функция/флаг, и она вернёт true → вызовется {@link preventStop}.
|
|
32
|
+
* 3. Если нажата Enter и `condition` → true, вызовется основной коллбэк.
|
|
22
33
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
34
|
+
* @template T Тип события клавиатуры
|
|
35
|
+
* @param call - Основной коллбэк, вызываемый при Enter
|
|
36
|
+
* @param onkeydown - Для иных клавиш вызывается всегда, кроме `"Enter`
|
|
37
|
+
* @param usePreventStop - Условие для вызова {@link preventStop}
|
|
38
|
+
* @param condition - Условие для вызова основного коллбэка
|
|
27
39
|
*/
|
|
28
|
-
export declare const enterKeyHook: <T extends
|
|
40
|
+
export declare const enterKeyHook: <T extends TargetKeyboardEvent = TargetKeyboardEvent>(call?: CanBeNullable<(e: T) => CanBePromise>, { onkeydown, usePreventStop, condition, }?: {
|
|
41
|
+
onkeydown?: (e: T) => void;
|
|
29
42
|
usePreventStop?: "enter" | unknown | ((e: T, isEnter: boolean) => unknown);
|
|
30
43
|
condition?: ((e: T) => unknown) | unknown;
|
|
31
44
|
}) => (e: T) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Тип события с уточнённым `currentTarget`.
|
|
47
|
+
*/
|
|
32
48
|
export type TargetEvent<E extends Event, N extends HTMLElement = HTMLDivElement> = E & {
|
|
33
49
|
currentTarget: EventTarget & N;
|
|
34
50
|
};
|
|
51
|
+
/**
|
|
52
|
+
* Тип клавиатурного события с уточнённым `currentTarget`.
|
|
53
|
+
*/
|
|
35
54
|
export type TargetKeyboardEvent<N extends HTMLElement = HTMLDivElement> = TargetEvent<KeyboardEvent, N>;
|
|
55
|
+
/**
|
|
56
|
+
* Проверяет, является ли событие клавиатурным.
|
|
57
|
+
*/
|
|
36
58
|
export declare const isKeyboardEvent: (e: any) => e is KeyboardEvent;
|
|
59
|
+
/**
|
|
60
|
+
* Создаёт обработчик контекстного меню.
|
|
61
|
+
*
|
|
62
|
+
* Если событие вызвано клавиатурой:
|
|
63
|
+
* — координаты берутся из `getBoundingClientRect` текущего элемента.
|
|
64
|
+
* Если мышью:
|
|
65
|
+
* — координаты берутся из `clientX` / `clientY`.
|
|
66
|
+
*
|
|
67
|
+
* @param call Коллбэк, принимающий позицию и метаданные о событии
|
|
68
|
+
*/
|
|
37
69
|
export declare const ctxMenuHook: <N extends HTMLElement = HTMLDivElement>(call: (position: {
|
|
38
70
|
left: number;
|
|
39
71
|
top: number;
|
|
@@ -45,58 +77,64 @@ export declare const ctxMenuHook: <N extends HTMLElement = HTMLDivElement>(call:
|
|
|
45
77
|
event: MouseEvent;
|
|
46
78
|
}) => void) => (e: TargetKeyboardEvent<N> | MouseEvent) => void;
|
|
47
79
|
/**
|
|
48
|
-
* Создаёт
|
|
49
|
-
*
|
|
50
|
-
* @template T - Тип события из `WindowEventMap`
|
|
51
|
-
* @template E - Тип объекта события (по умолчанию `WindowEventMap[T]`)
|
|
52
|
-
*
|
|
53
|
-
* @param {T} event - Ключ события
|
|
54
|
-
* @param {(e: E) => CanBePromise} call - Функция-обработчик события
|
|
55
|
-
* @param {AddEventListenerOptions} [options] - Дополнительные параметры
|
|
56
|
-
* @param {HTMLElement | Window} [target=window] - Целевой элемент для привязки события
|
|
80
|
+
* Создаёт слушатель события на указанном элементе.
|
|
57
81
|
*
|
|
58
|
-
* @
|
|
82
|
+
* @template M Карта событий
|
|
83
|
+
* @template T Ключ события
|
|
84
|
+
* @template E Тип события
|
|
85
|
+
* @param event Название события
|
|
86
|
+
* @param call Обработчик события
|
|
87
|
+
* @param options Параметры слушателя
|
|
88
|
+
* @param target Целевой элемент (по умолчанию `window`)
|
|
89
|
+
* @returns Функция для удаления обработчика
|
|
59
90
|
*/
|
|
60
91
|
export declare const createEventListener: <const M = WindowEventMap, const T extends KEYS<M> = KEYS<M>, const E = M[T]>(event: T, call: (e: E) => CanBePromise, options?: AddEventListenerOptions, target?: HTMLElement | Window | Document) => (() => void);
|
|
61
92
|
/**
|
|
62
|
-
* Убирает
|
|
93
|
+
* Убирает фокус на активном элементе страницы
|
|
94
|
+
*/
|
|
95
|
+
export declare const unfocus: () => void;
|
|
96
|
+
/**
|
|
97
|
+
* Снимает текущее выделение текста на странице.
|
|
63
98
|
*/
|
|
64
99
|
export declare const unselect: () => void;
|
|
65
100
|
/**
|
|
66
|
-
*
|
|
101
|
+
* Добавляет одноразовый обработчик `mousedown`, который снимает выделение текста.
|
|
67
102
|
*
|
|
68
|
-
* @returns Функция для удаления обработчика
|
|
103
|
+
* @returns Функция для удаления обработчика
|
|
69
104
|
*/
|
|
70
105
|
export declare const unselectByMousedown: () => (() => void);
|
|
71
106
|
declare global {
|
|
72
107
|
interface WindowEventMap {
|
|
108
|
+
/** Кастомное событие для прокрутки страницы к началу */
|
|
73
109
|
rescroll: CustomEvent;
|
|
74
110
|
}
|
|
75
111
|
}
|
|
76
112
|
/**
|
|
77
|
-
* Создаёт обработчик события
|
|
113
|
+
* Создаёт обработчик кастомного события `rescroll`, который плавно прокручивает элемент наверх.
|
|
78
114
|
*
|
|
79
|
-
* @param
|
|
80
|
-
* @param
|
|
81
|
-
*
|
|
82
|
-
* @returns Функция для удаления обработчика события
|
|
115
|
+
* @param element Целевой элемент (по умолчанию `document.documentElement`)
|
|
116
|
+
* @param options Доп. параметры слушателя
|
|
117
|
+
* @returns Функция для удаления обработчика
|
|
83
118
|
*/
|
|
84
119
|
export declare const createRescrollListener: (element?: HTMLElement, options?: EventListenerOptions) => (() => void);
|
|
85
120
|
/**
|
|
86
|
-
*
|
|
121
|
+
* Диспатчит событие `rescroll` на указанный элемент или окно.
|
|
87
122
|
*
|
|
88
|
-
* @param
|
|
89
|
-
* @returns
|
|
123
|
+
* @param element Элемент или окно (по умолчанию `window`)
|
|
124
|
+
* @returns Было ли событие успешно отправлено
|
|
90
125
|
*/
|
|
91
126
|
export declare const rescrollDispatch: (element?: HTMLElement | Window) => boolean;
|
|
92
127
|
/**
|
|
93
|
-
* Автоматически изменяет высоту
|
|
128
|
+
* Автоматически изменяет высоту `textarea` в зависимости от содержимого.
|
|
129
|
+
*
|
|
130
|
+
* @param area Текстовое поле
|
|
94
131
|
*/
|
|
95
132
|
export declare const autoAreaHeight: (area?: HTMLTextAreaElement) => void;
|
|
96
133
|
/**
|
|
97
|
-
*
|
|
134
|
+
* Преобразует {@link FormData} в объект.
|
|
98
135
|
*
|
|
99
|
-
* @param form
|
|
100
|
-
* @param multi
|
|
136
|
+
* @param form Данные формы
|
|
137
|
+
* @param multi Если true, то поддерживаются массивы значений для одинаковых ключей
|
|
138
|
+
* @returns Объект с данными формы
|
|
101
139
|
*/
|
|
102
140
|
export declare const formon: <D = any>(form: FormData, multi?: boolean) => D;
|
package/dist/html.js
CHANGED
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
import { useConditionGuard } from "./index.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* `true`, если глобальный объект `window` отсутствует.
|
|
4
4
|
*/
|
|
5
5
|
export const isSSR = typeof window === "undefined";
|
|
6
|
+
//...
|
|
6
7
|
/**
|
|
7
|
-
* Предотвращает
|
|
8
|
+
* Предотвращает стандартное поведение события и останавливает его всплытие.
|
|
8
9
|
*/
|
|
9
10
|
export const preventStop = (e) => (e.preventDefault(), e.stopPropagation());
|
|
10
11
|
/**
|
|
11
|
-
* Создаёт обработчик события с {@link preventStop},
|
|
12
|
-
*
|
|
12
|
+
* Создаёт обработчик события с вызовом {@link preventStop}, если условие `usePreventStop` истинно.
|
|
13
|
+
*
|
|
14
|
+
* 1. Если `usePreventStop` → true (или функция вернёт true), то событие будет остановлено.
|
|
15
|
+
* 2. Если `condition` → true (или функция вернёт true), то выполнится переданный коллбэк.
|
|
16
|
+
*
|
|
17
|
+
* @template T Тип события
|
|
18
|
+
* @param call Коллбэк для вызова после проверки условия
|
|
19
|
+
* @param usePreventStop Флаг или функция-условие для вызова {@link preventStop}
|
|
20
|
+
* @param condition Флаг или функция-условие для вызова `call`
|
|
21
|
+
* @returns Обработчик события
|
|
13
22
|
*/
|
|
14
23
|
export const preventStopHook = (call, { usePreventStop = true, condition = true, } = {}) => (e) => {
|
|
15
24
|
if (useConditionGuard(usePreventStop, e))
|
|
@@ -19,16 +28,20 @@ export const preventStopHook = (call, { usePreventStop = true, condition = true,
|
|
|
19
28
|
};
|
|
20
29
|
//...
|
|
21
30
|
/**
|
|
22
|
-
*
|
|
31
|
+
* Возвращает обработчик клавиатурных событий.
|
|
23
32
|
*
|
|
24
|
-
*
|
|
33
|
+
* Логика:
|
|
34
|
+
* 1. Если `usePreventStop === "enter"` и нажата клавиша Enter → вызовется {@link preventStop}.
|
|
35
|
+
* 2. Если `usePreventStop` — функция/флаг, и она вернёт true → вызовется {@link preventStop}.
|
|
36
|
+
* 3. Если нажата Enter и `condition` → true, вызовется основной коллбэк.
|
|
25
37
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
38
|
+
* @template T Тип события клавиатуры
|
|
39
|
+
* @param call - Основной коллбэк, вызываемый при Enter
|
|
40
|
+
* @param onkeydown - Для иных клавиш вызывается всегда, кроме `"Enter`
|
|
41
|
+
* @param usePreventStop - Условие для вызова {@link preventStop}
|
|
42
|
+
* @param condition - Условие для вызова основного коллбэка
|
|
30
43
|
*/
|
|
31
|
-
export const enterKeyHook = (call, { usePreventStop = "enter", condition = true, } = {}) => (e) => {
|
|
44
|
+
export const enterKeyHook = (call, { onkeydown, usePreventStop = "enter", condition = true, } = {}) => (e) => {
|
|
32
45
|
const isEnter = e.key === "Enter";
|
|
33
46
|
if (usePreventStop === "enter") {
|
|
34
47
|
if (isEnter)
|
|
@@ -38,10 +51,29 @@ export const enterKeyHook = (call, { usePreventStop = "enter", condition = true,
|
|
|
38
51
|
if (useConditionGuard(usePreventStop, e, isEnter))
|
|
39
52
|
preventStop(e);
|
|
40
53
|
}
|
|
41
|
-
if (isEnter
|
|
42
|
-
|
|
54
|
+
if (isEnter) {
|
|
55
|
+
if (useConditionGuard(condition))
|
|
56
|
+
call?.(e);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
onkeydown?.(e);
|
|
60
|
+
}
|
|
43
61
|
};
|
|
62
|
+
/**
|
|
63
|
+
* Проверяет, является ли событие клавиатурным.
|
|
64
|
+
*/
|
|
44
65
|
export const isKeyboardEvent = (e) => !!e.code;
|
|
66
|
+
//...
|
|
67
|
+
/**
|
|
68
|
+
* Создаёт обработчик контекстного меню.
|
|
69
|
+
*
|
|
70
|
+
* Если событие вызвано клавиатурой:
|
|
71
|
+
* — координаты берутся из `getBoundingClientRect` текущего элемента.
|
|
72
|
+
* Если мышью:
|
|
73
|
+
* — координаты берутся из `clientX` / `clientY`.
|
|
74
|
+
*
|
|
75
|
+
* @param call Коллбэк, принимающий позицию и метаданные о событии
|
|
76
|
+
*/
|
|
45
77
|
export const ctxMenuHook = (call) => preventStopHook((event) => {
|
|
46
78
|
if (isKeyboardEvent(event)) {
|
|
47
79
|
const { x, y } = event.currentTarget.getBoundingClientRect();
|
|
@@ -53,17 +85,16 @@ export const ctxMenuHook = (call) => preventStopHook((event) => {
|
|
|
53
85
|
});
|
|
54
86
|
//...
|
|
55
87
|
/**
|
|
56
|
-
* Создаёт
|
|
88
|
+
* Создаёт слушатель события на указанном элементе.
|
|
57
89
|
*
|
|
58
|
-
* @template
|
|
59
|
-
* @template
|
|
60
|
-
*
|
|
61
|
-
* @param
|
|
62
|
-
* @param
|
|
63
|
-
* @param
|
|
64
|
-
* @param
|
|
65
|
-
*
|
|
66
|
-
* @returns Функция для удаления обработчика события
|
|
90
|
+
* @template M Карта событий
|
|
91
|
+
* @template T Ключ события
|
|
92
|
+
* @template E Тип события
|
|
93
|
+
* @param event Название события
|
|
94
|
+
* @param call Обработчик события
|
|
95
|
+
* @param options Параметры слушателя
|
|
96
|
+
* @param target Целевой элемент (по умолчанию `window`)
|
|
97
|
+
* @returns Функция для удаления обработчика
|
|
67
98
|
*/
|
|
68
99
|
export const createEventListener = (event, call, options = {}, target = window) => {
|
|
69
100
|
target.addEventListener(event, call, options);
|
|
@@ -71,38 +102,45 @@ export const createEventListener = (event, call, options = {}, target = window)
|
|
|
71
102
|
};
|
|
72
103
|
//...
|
|
73
104
|
/**
|
|
74
|
-
* Убирает
|
|
105
|
+
* Убирает фокус на активном элементе страницы
|
|
106
|
+
*/
|
|
107
|
+
export const unfocus = () =>
|
|
108
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
109
|
+
document.activeElement?.blur?.();
|
|
110
|
+
/**
|
|
111
|
+
* Снимает текущее выделение текста на странице.
|
|
75
112
|
*/
|
|
76
113
|
export const unselect = () => document.getSelection()?.removeAllRanges();
|
|
77
114
|
/**
|
|
78
|
-
*
|
|
115
|
+
* Добавляет одноразовый обработчик `mousedown`, который снимает выделение текста.
|
|
79
116
|
*
|
|
80
|
-
* @returns Функция для удаления обработчика
|
|
117
|
+
* @returns Функция для удаления обработчика
|
|
81
118
|
*/
|
|
82
119
|
export const unselectByMousedown = () => createEventListener("mousedown", unselect, { once: true });
|
|
83
120
|
/**
|
|
84
|
-
* Создаёт обработчик события
|
|
85
|
-
*
|
|
86
|
-
* @param {HTMLElement} [element=document.documentElement] - Элемент, для которого привязывается обработчик
|
|
87
|
-
* @param {EventListenerOptions} [options] - Дополнительные параметры
|
|
121
|
+
* Создаёт обработчик кастомного события `rescroll`, который плавно прокручивает элемент наверх.
|
|
88
122
|
*
|
|
89
|
-
* @
|
|
123
|
+
* @param element Целевой элемент (по умолчанию `document.documentElement`)
|
|
124
|
+
* @param options Доп. параметры слушателя
|
|
125
|
+
* @returns Функция для удаления обработчика
|
|
90
126
|
*/
|
|
91
127
|
export const createRescrollListener = (element = document.documentElement, options) => createEventListener("rescroll",
|
|
92
128
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
93
129
|
() => element?.scrollTo?.({ top: 0, behavior: "smooth" }), options);
|
|
94
130
|
/**
|
|
95
|
-
*
|
|
131
|
+
* Диспатчит событие `rescroll` на указанный элемент или окно.
|
|
96
132
|
*
|
|
97
|
-
* @param
|
|
98
|
-
* @returns
|
|
133
|
+
* @param element Элемент или окно (по умолчанию `window`)
|
|
134
|
+
* @returns Было ли событие успешно отправлено
|
|
99
135
|
*/
|
|
100
136
|
export const rescrollDispatch = (element = window) =>
|
|
101
137
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
102
138
|
element?.dispatchEvent?.(new CustomEvent("rescroll"));
|
|
103
139
|
//...
|
|
104
140
|
/**
|
|
105
|
-
* Автоматически изменяет высоту
|
|
141
|
+
* Автоматически изменяет высоту `textarea` в зависимости от содержимого.
|
|
142
|
+
*
|
|
143
|
+
* @param area Текстовое поле
|
|
106
144
|
*/
|
|
107
145
|
export const autoAreaHeight = (area) => {
|
|
108
146
|
if (!area)
|
|
@@ -111,12 +149,12 @@ export const autoAreaHeight = (area) => {
|
|
|
111
149
|
area.style.height = `${area.scrollHeight}px`;
|
|
112
150
|
area.scrollTop = area.scrollHeight;
|
|
113
151
|
};
|
|
114
|
-
//...
|
|
115
152
|
/**
|
|
116
|
-
*
|
|
153
|
+
* Преобразует {@link FormData} в объект.
|
|
117
154
|
*
|
|
118
|
-
* @param form
|
|
119
|
-
* @param multi
|
|
155
|
+
* @param form Данные формы
|
|
156
|
+
* @param multi Если true, то поддерживаются массивы значений для одинаковых ключей
|
|
157
|
+
* @returns Объект с данными формы
|
|
120
158
|
*/
|
|
121
159
|
export const formon = (form, multi = false) => {
|
|
122
160
|
if (multi) {
|
package/dist/path.d.ts
ADDED
package/dist/path.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const pathRegExp = /[\\/]/g;
|
|
2
|
+
export const toUnixPath = (path) => path.replace(pathRegExp, "/");
|
|
3
|
+
export const isChildPath = (parentPath, childPath) => {
|
|
4
|
+
const uChildPath = toUnixPath(childPath);
|
|
5
|
+
const nParentPath = toUnixPath(parentPath) + "/";
|
|
6
|
+
return uChildPath.startsWith(nParentPath);
|
|
7
|
+
};
|
package/dist/random.d.ts
CHANGED
|
@@ -1,12 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Генерирует случайный числовой код указанной длины.
|
|
3
|
+
* Код состоит только из цифр и не может начинаться с нуля.
|
|
4
|
+
*
|
|
5
|
+
* @param length - Длина генерируемого кода (по умолчанию 6)
|
|
6
|
+
* @returns Строка с числовым кодом
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* rand(4); // "1234" (пример)
|
|
11
|
+
* rand(6); // "123456" (пример)
|
|
12
|
+
* rand(8); // "12345678" (пример)
|
|
13
|
+
* ```
|
|
3
14
|
*/
|
|
4
15
|
export declare const rand: (length?: number) => string;
|
|
5
16
|
/**
|
|
6
|
-
*
|
|
17
|
+
* Генерирует уникальный ID, состоящий из текущей временной метки и случайного кода.
|
|
18
|
+
* Формат: `timestamp:randomCode`
|
|
19
|
+
*
|
|
20
|
+
* @param length - Длина случайной части кода (по умолчанию 7)
|
|
21
|
+
* @returns Уникальный ID в формате строки
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* randID(4); // "1696934400000:1234" (пример)
|
|
26
|
+
* randID(6); // "1696934400000:123456" (пример)
|
|
27
|
+
* ```
|
|
7
28
|
*/
|
|
8
29
|
export declare const randID: (length?: number) => string;
|
|
9
30
|
/**
|
|
10
|
-
*
|
|
31
|
+
* Генерирует случайный UID (уникальный идентификатор) из буквенно-цифровых символов.
|
|
32
|
+
* Может включать префикс таблицы для организации идентификаторов.
|
|
33
|
+
*
|
|
34
|
+
* @param table - Префикс таблицы для организации UID (опционально)
|
|
35
|
+
* @param length - Длина UID в символах (по умолчанию 20)
|
|
36
|
+
* @returns Случайный UID в формате строки
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* randUID(); // "a1b2c3d4e5f6g7h8i9j0" (пример)
|
|
41
|
+
* randUID("user", 10); // "user:a1b2c3d4e5" (пример)
|
|
42
|
+
* randUID("session", 16); // "session:a1b2c3d4e5f6g7h8" (пример)
|
|
43
|
+
* ```
|
|
11
44
|
*/
|
|
12
45
|
export declare const randUID: (table?: string, length?: number) => string;
|
package/dist/random.js
CHANGED
|
@@ -1,16 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Генерирует случайный числовой код указанной длины.
|
|
3
|
+
* Код состоит только из цифр и не может начинаться с нуля.
|
|
4
|
+
*
|
|
5
|
+
* @param length - Длина генерируемого кода (по умолчанию 6)
|
|
6
|
+
* @returns Строка с числовым кодом
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* rand(4); // "1234" (пример)
|
|
11
|
+
* rand(6); // "123456" (пример)
|
|
12
|
+
* rand(8); // "12345678" (пример)
|
|
13
|
+
* ```
|
|
3
14
|
*/
|
|
4
15
|
export const rand = (length = 6) => {
|
|
5
16
|
const min = Math.pow(10, length - 1);
|
|
6
17
|
return Math.floor(min + Math.random() * 9 * min).toString();
|
|
7
18
|
};
|
|
8
19
|
/**
|
|
9
|
-
*
|
|
20
|
+
* Генерирует уникальный ID, состоящий из текущей временной метки и случайного кода.
|
|
21
|
+
* Формат: `timestamp:randomCode`
|
|
22
|
+
*
|
|
23
|
+
* @param length - Длина случайной части кода (по умолчанию 7)
|
|
24
|
+
* @returns Уникальный ID в формате строки
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* randID(4); // "1696934400000:1234" (пример)
|
|
29
|
+
* randID(6); // "1696934400000:123456" (пример)
|
|
30
|
+
* ```
|
|
10
31
|
*/
|
|
11
32
|
export const randID = (length = 7) => `${Date.now()}:${rand(length)}`;
|
|
12
33
|
/**
|
|
13
|
-
*
|
|
34
|
+
* Генерирует случайный UID (уникальный идентификатор) из буквенно-цифровых символов.
|
|
35
|
+
* Может включать префикс таблицы для организации идентификаторов.
|
|
36
|
+
*
|
|
37
|
+
* @param table - Префикс таблицы для организации UID (опционально)
|
|
38
|
+
* @param length - Длина UID в символах (по умолчанию 20)
|
|
39
|
+
* @returns Случайный UID в формате строки
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* randUID(); // "a1b2c3d4e5f6g7h8i9j0" (пример)
|
|
44
|
+
* randUID("user", 10); // "user:a1b2c3d4e5" (пример)
|
|
45
|
+
* randUID("session", 16); // "session:a1b2c3d4e5f6g7h8" (пример)
|
|
46
|
+
* ```
|
|
14
47
|
*/
|
|
15
48
|
export const randUID = (table, length = 20) => {
|
|
16
49
|
const UID = "abcdefghijklmnopqrstuvwxyz0123456789"; // 36 символов
|
package/dist/string.d.ts
CHANGED
|
@@ -1,48 +1,149 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Регулярное выражение для захвата всех нецифровых символов из
|
|
2
|
+
* Регулярное выражение для захвата всех нецифровых символов из строки.
|
|
3
|
+
* Используется для удаления всех символов, кроме цифр 0-9.
|
|
3
4
|
*/
|
|
4
5
|
export declare const oDigitRegExp: RegExp;
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
+
* Удаляет все символы из строки, кроме цифр 0-9.
|
|
8
|
+
*
|
|
9
|
+
* @param v - Входная строка для очистки
|
|
10
|
+
* @returns Строка, содержащая только цифры
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* oDigitClean("abc123def456"); // "123456"
|
|
15
|
+
* oDigitClean("+7 (999) 123-45-67"); // "79991234567"
|
|
16
|
+
* oDigitClean(""); // ""
|
|
17
|
+
* ```
|
|
7
18
|
*/
|
|
8
19
|
export declare const oDigitClean: (v?: string) => string;
|
|
9
20
|
/**
|
|
10
|
-
* Регулярное выражение для захвата
|
|
21
|
+
* Регулярное выражение для захвата одного или более пробельных символов подряд.
|
|
22
|
+
* Включает пробелы, табуляции, переносы строк и другие пробельные символы.
|
|
11
23
|
*/
|
|
12
24
|
export declare const spaceRegExp: RegExp;
|
|
13
25
|
/**
|
|
14
|
-
*
|
|
26
|
+
* Нормализует пробелы в строке: заменяет множественные пробелы на один и удаляет пробелы в начале и конце.
|
|
27
|
+
*
|
|
28
|
+
* @param v - Входная строка для нормализации
|
|
29
|
+
* @returns Строка с нормализованными пробелами
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* spaceClean(" hello world "); // "hello world"
|
|
34
|
+
* spaceClean("multiple\n\n\nspaces"); // "multiple spaces"
|
|
35
|
+
* spaceClean("tab\t\tseparated"); // "tab separated"
|
|
36
|
+
* ```
|
|
15
37
|
*/
|
|
16
38
|
export declare const spaceClean: (v?: string) => string;
|
|
17
39
|
/**
|
|
18
|
-
*
|
|
40
|
+
* Удаляет все вхождения плейсхолдера из строки.
|
|
41
|
+
*
|
|
42
|
+
* @param str - Входная строка
|
|
43
|
+
* @param placeholder - Строка или регулярное выражение для удаления (по умолчанию "_")
|
|
44
|
+
* @returns Строка без плейсхолдеров
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* clearPH("hello_world_test", "_"); // "helloworldtest"
|
|
49
|
+
* clearPH("user___name", "_"); // "username"
|
|
50
|
+
* clearPH("test***end", "*"); // "testend"
|
|
51
|
+
* clearPH("email@domain.com", /@/); // "emaildomain.com"
|
|
52
|
+
* ```
|
|
19
53
|
*/
|
|
20
54
|
export declare const clearPH: (str?: string, placeholder?: string | RegExp) => string;
|
|
21
55
|
/**
|
|
22
|
-
* Приводит первый символ
|
|
56
|
+
* Приводит первый символ строки к верхнему регистру, остальные оставляет без изменений.
|
|
57
|
+
*
|
|
58
|
+
* @param word - Строка для капитализации
|
|
59
|
+
* @returns Строка с заглавной первой буквой
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* toCapital("hello"); // "Hello"
|
|
64
|
+
* toCapital("world"); // "World"
|
|
65
|
+
* toCapital(""); // ""
|
|
66
|
+
* toCapital("a"); // "A"
|
|
67
|
+
* ```
|
|
23
68
|
*/
|
|
24
69
|
export declare const toCapital: (word?: string) => string;
|
|
25
70
|
/**
|
|
26
|
-
* Приводит первый символ каждого слова к верхнему регистру
|
|
71
|
+
* Приводит первый символ каждого слова к верхнему регистру (Title Case).
|
|
72
|
+
* Разделяет строку по пробелам и применяет капитализацию к каждому слову.
|
|
73
|
+
*
|
|
74
|
+
* @param str - Строка для преобразования в Title Case
|
|
75
|
+
* @returns Строка с заглавными первыми буквами каждого слова
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* toCapitalMap("hello world"); // "Hello World"
|
|
80
|
+
* toCapitalMap("javascript programming"); // "Javascript Programming"
|
|
81
|
+
* toCapitalMap(""); // ""
|
|
82
|
+
* toCapitalMap("single"); // "Single"
|
|
83
|
+
* ```
|
|
27
84
|
*/
|
|
28
85
|
export declare const toCapitalMap: (str?: string) => string;
|
|
29
86
|
/**
|
|
30
|
-
* Повторяет строку указанное количество раз с разделителем
|
|
87
|
+
* Повторяет строку указанное количество раз с разделителем между повторениями.
|
|
31
88
|
*
|
|
32
|
-
* @param
|
|
33
|
-
* @param
|
|
34
|
-
* @param
|
|
89
|
+
* @param str - Исходная строка для повторения
|
|
90
|
+
* @param length - Количество повторений (должно быть неотрицательным)
|
|
91
|
+
* @param separator - Разделитель между повторениями (по умолчанию пустая строка)
|
|
92
|
+
* @returns Результирующая строка из повторений
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* repeat("abc", 3); // "abcabcabc"
|
|
97
|
+
* repeat("hello", 2, " "); // "hello hello"
|
|
98
|
+
* repeat("x", 5, "-"); // "x-x-x-x-x"
|
|
99
|
+
* repeat("test", 0); // ""
|
|
100
|
+
* repeat("", 3, ","); // ",,"
|
|
101
|
+
* ```
|
|
35
102
|
*/
|
|
36
103
|
export declare const repeat: (str: string, length: number, separator?: string) => string;
|
|
37
104
|
/**
|
|
38
|
-
* Приводит
|
|
105
|
+
* Приводит строку к нижнему регистру и нормализует пробелы.
|
|
106
|
+
* Комбинация методов toLowerCase() и spaceClean().
|
|
107
|
+
*
|
|
108
|
+
* @param str - Строка для нормализации
|
|
109
|
+
* @returns Строка в нижнем регистре с нормализованными пробелами
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* toFlat(" Hello World "); // "hello world"
|
|
114
|
+
* toFlat("CamelCase String"); // "camelcase string"
|
|
115
|
+
* toFlat(""); // ""
|
|
116
|
+
* ```
|
|
39
117
|
*/
|
|
40
118
|
export declare const toFlat: (str?: string) => string;
|
|
41
119
|
/**
|
|
42
|
-
*
|
|
120
|
+
* Карта для транслитерации кириллических символов в латинские.
|
|
121
|
+
* Содержит соответствия для всех букв русского алфавита в нижнем регистре.
|
|
122
|
+
* Используется в функции {@link toSlug} для создания URL-friendly строк.
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* cyrillicToLatinMap.get('а'); // "a"
|
|
127
|
+
* cyrillicToLatinMap.get('ё'); // "yo"
|
|
128
|
+
* cyrillicToLatinMap.get('ъ'); // ""
|
|
129
|
+
* ```
|
|
43
130
|
*/
|
|
44
131
|
export declare const cyrillicToLatinMap: Map<string, string>;
|
|
45
132
|
/**
|
|
46
|
-
*
|
|
133
|
+
* Создает URL-friendly slug из текста.
|
|
134
|
+
* Конвертирует кириллицу в латиницу, удаляет специальные символы,
|
|
135
|
+
* нормализует пробелы и заменяет их на разделитель.
|
|
136
|
+
*
|
|
137
|
+
* @param text - Исходный текст для преобразования в slug
|
|
138
|
+
* @param separator - Разделитель для замены пробелов (по умолчанию "-")
|
|
139
|
+
* @returns URL-friendly строка
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* toSlug("Привет, мир!"); // "privet-mir"
|
|
144
|
+
* toSlug("JavaScript Programming"); // "javascript-programming"
|
|
145
|
+
* toSlug("Café & Restaurant", "_"); // "cafe_restaurant"
|
|
146
|
+
* toSlug("Специальные символы!!!", "."); // "specialnye-simvoly"
|
|
147
|
+
* ```
|
|
47
148
|
*/
|
|
48
149
|
export declare const toSlug: (text: string, separator?: string) => string;
|
package/dist/string.js
CHANGED
|
@@ -1,49 +1,137 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Регулярное выражение для захвата всех нецифровых символов из
|
|
2
|
+
* Регулярное выражение для захвата всех нецифровых символов из строки.
|
|
3
|
+
* Используется для удаления всех символов, кроме цифр 0-9.
|
|
3
4
|
*/
|
|
4
5
|
export const oDigitRegExp = /\D/g;
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
+
* Удаляет все символы из строки, кроме цифр 0-9.
|
|
8
|
+
*
|
|
9
|
+
* @param v - Входная строка для очистки
|
|
10
|
+
* @returns Строка, содержащая только цифры
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* oDigitClean("abc123def456"); // "123456"
|
|
15
|
+
* oDigitClean("+7 (999) 123-45-67"); // "79991234567"
|
|
16
|
+
* oDigitClean(""); // ""
|
|
17
|
+
* ```
|
|
7
18
|
*/
|
|
8
19
|
export const oDigitClean = (v = "") => v.replace(oDigitRegExp, "");
|
|
9
20
|
//...
|
|
10
21
|
/**
|
|
11
|
-
* Регулярное выражение для захвата
|
|
22
|
+
* Регулярное выражение для захвата одного или более пробельных символов подряд.
|
|
23
|
+
* Включает пробелы, табуляции, переносы строк и другие пробельные символы.
|
|
12
24
|
*/
|
|
13
25
|
export const spaceRegExp = /\s+/g;
|
|
14
26
|
/**
|
|
15
|
-
*
|
|
27
|
+
* Нормализует пробелы в строке: заменяет множественные пробелы на один и удаляет пробелы в начале и конце.
|
|
28
|
+
*
|
|
29
|
+
* @param v - Входная строка для нормализации
|
|
30
|
+
* @returns Строка с нормализованными пробелами
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* spaceClean(" hello world "); // "hello world"
|
|
35
|
+
* spaceClean("multiple\n\n\nspaces"); // "multiple spaces"
|
|
36
|
+
* spaceClean("tab\t\tseparated"); // "tab separated"
|
|
37
|
+
* ```
|
|
16
38
|
*/
|
|
17
39
|
export const spaceClean = (v = "") => v.replace(spaceRegExp, " ").trim();
|
|
18
40
|
/**
|
|
19
|
-
*
|
|
41
|
+
* Удаляет все вхождения плейсхолдера из строки.
|
|
42
|
+
*
|
|
43
|
+
* @param str - Входная строка
|
|
44
|
+
* @param placeholder - Строка или регулярное выражение для удаления (по умолчанию "_")
|
|
45
|
+
* @returns Строка без плейсхолдеров
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* clearPH("hello_world_test", "_"); // "helloworldtest"
|
|
50
|
+
* clearPH("user___name", "_"); // "username"
|
|
51
|
+
* clearPH("test***end", "*"); // "testend"
|
|
52
|
+
* clearPH("email@domain.com", /@/); // "emaildomain.com"
|
|
53
|
+
* ```
|
|
20
54
|
*/
|
|
21
55
|
export const clearPH = (str = "", placeholder = "_") => str.replaceAll(placeholder, "");
|
|
22
56
|
//...
|
|
23
57
|
/**
|
|
24
|
-
* Приводит первый символ
|
|
58
|
+
* Приводит первый символ строки к верхнему регистру, остальные оставляет без изменений.
|
|
59
|
+
*
|
|
60
|
+
* @param word - Строка для капитализации
|
|
61
|
+
* @returns Строка с заглавной первой буквой
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* toCapital("hello"); // "Hello"
|
|
66
|
+
* toCapital("world"); // "World"
|
|
67
|
+
* toCapital(""); // ""
|
|
68
|
+
* toCapital("a"); // "A"
|
|
69
|
+
* ```
|
|
25
70
|
*/
|
|
26
71
|
export const toCapital = (word = "") => word.charAt(0).toUpperCase() + word.slice(1);
|
|
27
72
|
/**
|
|
28
|
-
* Приводит первый символ каждого слова к верхнему регистру
|
|
73
|
+
* Приводит первый символ каждого слова к верхнему регистру (Title Case).
|
|
74
|
+
* Разделяет строку по пробелам и применяет капитализацию к каждому слову.
|
|
75
|
+
*
|
|
76
|
+
* @param str - Строка для преобразования в Title Case
|
|
77
|
+
* @returns Строка с заглавными первыми буквами каждого слова
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* toCapitalMap("hello world"); // "Hello World"
|
|
82
|
+
* toCapitalMap("javascript programming"); // "Javascript Programming"
|
|
83
|
+
* toCapitalMap(""); // ""
|
|
84
|
+
* toCapitalMap("single"); // "Single"
|
|
85
|
+
* ```
|
|
29
86
|
*/
|
|
30
87
|
export const toCapitalMap = (str = "") => str.split(" ").map(toCapital).join(" ");
|
|
31
88
|
//...
|
|
32
89
|
/**
|
|
33
|
-
* Повторяет строку указанное количество раз с разделителем
|
|
90
|
+
* Повторяет строку указанное количество раз с разделителем между повторениями.
|
|
91
|
+
*
|
|
92
|
+
* @param str - Исходная строка для повторения
|
|
93
|
+
* @param length - Количество повторений (должно быть неотрицательным)
|
|
94
|
+
* @param separator - Разделитель между повторениями (по умолчанию пустая строка)
|
|
95
|
+
* @returns Результирующая строка из повторений
|
|
34
96
|
*
|
|
35
|
-
* @
|
|
36
|
-
*
|
|
37
|
-
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* repeat("abc", 3); // "abcabcabc"
|
|
100
|
+
* repeat("hello", 2, " "); // "hello hello"
|
|
101
|
+
* repeat("x", 5, "-"); // "x-x-x-x-x"
|
|
102
|
+
* repeat("test", 0); // ""
|
|
103
|
+
* repeat("", 3, ","); // ",,"
|
|
104
|
+
* ```
|
|
38
105
|
*/
|
|
39
106
|
export const repeat = (str, length, separator = "") => Array.from({ length }).fill(str).join(separator);
|
|
40
107
|
//...
|
|
41
108
|
/**
|
|
42
|
-
* Приводит
|
|
109
|
+
* Приводит строку к нижнему регистру и нормализует пробелы.
|
|
110
|
+
* Комбинация методов toLowerCase() и spaceClean().
|
|
111
|
+
*
|
|
112
|
+
* @param str - Строка для нормализации
|
|
113
|
+
* @returns Строка в нижнем регистре с нормализованными пробелами
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```typescript
|
|
117
|
+
* toFlat(" Hello World "); // "hello world"
|
|
118
|
+
* toFlat("CamelCase String"); // "camelcase string"
|
|
119
|
+
* toFlat(""); // ""
|
|
120
|
+
* ```
|
|
43
121
|
*/
|
|
44
122
|
export const toFlat = (str = "") => spaceClean(str.toLowerCase());
|
|
123
|
+
//...
|
|
45
124
|
/**
|
|
46
|
-
*
|
|
125
|
+
* Карта для транслитерации кириллических символов в латинские.
|
|
126
|
+
* Содержит соответствия для всех букв русского алфавита в нижнем регистре.
|
|
127
|
+
* Используется в функции {@link toSlug} для создания URL-friendly строк.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```typescript
|
|
131
|
+
* cyrillicToLatinMap.get('а'); // "a"
|
|
132
|
+
* cyrillicToLatinMap.get('ё'); // "yo"
|
|
133
|
+
* cyrillicToLatinMap.get('ъ'); // ""
|
|
134
|
+
* ```
|
|
47
135
|
*/
|
|
48
136
|
export const cyrillicToLatinMap = new Map([
|
|
49
137
|
["а", "a"],
|
|
@@ -81,7 +169,21 @@ export const cyrillicToLatinMap = new Map([
|
|
|
81
169
|
["я", "ya"],
|
|
82
170
|
]);
|
|
83
171
|
/**
|
|
84
|
-
*
|
|
172
|
+
* Создает URL-friendly slug из текста.
|
|
173
|
+
* Конвертирует кириллицу в латиницу, удаляет специальные символы,
|
|
174
|
+
* нормализует пробелы и заменяет их на разделитель.
|
|
175
|
+
*
|
|
176
|
+
* @param text - Исходный текст для преобразования в slug
|
|
177
|
+
* @param separator - Разделитель для замены пробелов (по умолчанию "-")
|
|
178
|
+
* @returns URL-friendly строка
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```typescript
|
|
182
|
+
* toSlug("Привет, мир!"); // "privet-mir"
|
|
183
|
+
* toSlug("JavaScript Programming"); // "javascript-programming"
|
|
184
|
+
* toSlug("Café & Restaurant", "_"); // "cafe_restaurant"
|
|
185
|
+
* toSlug("Специальные символы!!!", "."); // "specialnye-simvoly"
|
|
186
|
+
* ```
|
|
85
187
|
*/
|
|
86
188
|
export const toSlug = (text, separator = "-") => {
|
|
87
189
|
const buf = [];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nemigo/helpers",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Vlad Logvin",
|
|
@@ -91,6 +91,10 @@
|
|
|
91
91
|
"types": "./dist/omitter.d.ts",
|
|
92
92
|
"default": "./dist/omitter.js"
|
|
93
93
|
},
|
|
94
|
+
"./path": {
|
|
95
|
+
"types": "./dist/path.d.ts",
|
|
96
|
+
"default": "./dist/path.js"
|
|
97
|
+
},
|
|
94
98
|
"./phymath": {
|
|
95
99
|
"types": "./dist/phymath/index.d.ts",
|
|
96
100
|
"default": "./dist/phymath/index.js"
|
|
@@ -137,18 +141,20 @@
|
|
|
137
141
|
}
|
|
138
142
|
},
|
|
139
143
|
"peerDependencies": {
|
|
144
|
+
"@std/msgpack": "jsr:^1.0.0",
|
|
140
145
|
"zod": ">=4.0.0"
|
|
141
146
|
},
|
|
142
147
|
"peerDependenciesMeta": {
|
|
148
|
+
"@std/msgpack": {
|
|
149
|
+
"optional": true
|
|
150
|
+
},
|
|
143
151
|
"zod": {
|
|
144
152
|
"optional": true
|
|
145
153
|
}
|
|
146
154
|
},
|
|
147
|
-
"dependencies": {
|
|
148
|
-
"@std/msgpack": "jsr:^1.0.0"
|
|
149
|
-
},
|
|
150
155
|
"devDependencies": {
|
|
151
156
|
"@nemigo/configs": "workspace:*",
|
|
157
|
+
"@std/msgpack": "jsr:1.0.3",
|
|
152
158
|
"zod": "4.1.5"
|
|
153
159
|
}
|
|
154
160
|
}
|