@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.
@@ -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
- * Очищает рекурсивно C КОПИРОВАНИЕМ объект (в т.ч. и массивы) от пустых, неопределенных или нулевых значений.
3
- * Дополнительно удаляет пустые объекты и массивы, которые могут появиться после очистки.
4
- * Если аргумент не является объектом, он возвращается без изменений
2
+ * Глубоко очищает объект (включая массивы) от "пустых" значений с созданием копии.
3
+ * Удаляет значения: `null`, `undefined`, пустые строки `""`.
4
+ * После очистки удаляет объекты и массивы, ставшие пустыми.
5
+ * Не изменяет исходный объект.
6
+ *
7
+ * @template O - Тип исходного объекта
8
+ * @param data - Объект или значение для очистки
9
+ * @returns Очищенная копия объекта или исходное значение, если это не объект
5
10
  *
6
11
  * @example
7
- * const original = { a: 1, b: null, c: { d: '', e: { f: undefined } } };
8
- * const cleaned = deepObjectClean(original);
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); // {{ a: 1, b: null, c: { d: '', e: { f: undefined } } }
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
- * Очищает рекурсивно C КОПИРОВАНИЕМ объект (в т.ч. и массивы) от пустых, неопределенных или нулевых значений.
3
- * Дополнительно удаляет пустые объекты и массивы, которые могут появиться после очистки.
4
- * Если аргумент не является объектом, он возвращается без изменений
2
+ * Глубоко очищает объект (включая массивы) от "пустых" значений с созданием копии.
3
+ * Удаляет значения: `null`, `undefined`, пустые строки `""`.
4
+ * После очистки удаляет объекты и массивы, ставшие пустыми.
5
+ * Не изменяет исходный объект.
6
+ *
7
+ * @template O - Тип исходного объекта
8
+ * @param data - Объект или значение для очистки
9
+ * @returns Очищенная копия объекта или исходное значение, если это не объект
5
10
  *
6
11
  * @example
7
- * const original = { a: 1, b: null, c: { d: '', e: { f: undefined } } };
8
- * const cleaned = deepObjectClean(original);
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); // {{ a: 1, b: null, c: { d: '', e: { f: undefined } } }
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)
@@ -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
- * Шаблонизатор вывода даты и времени из {@link Timestamp}
5
+ * Универсальный шаблонизатор для форматирования даты и времени.
6
+ * Поддерживает различные форматы вывода с возможностью указания часового пояса для вывода
12
7
  *
13
- * TS - секунды
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
- * TM - минуты
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
- * DAM - месяц сокращённым названием
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
- * @example
28
- * const formatted = dateTimeFormatter(new Date(), 'DD.DM.DY TH:TM:TS');
29
- * console.log(formatted); // "09.10.2023 14:30:59"
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
- * Готовый пресет для {@link formatDateTime}
35
+ * Готовый пресет для форматирования времени в московском часовом поясе (МСК +3).
36
+ * Использует {@link formatDateTime} с предустановленным форматом и часовым поясом.
34
37
  *
35
- * `DD.DM.DY TH:TM (МСК)` с МСК-флагом
38
+ * @param timestamp - Временная метка для форматирования (по умолчанию текущее время)
39
+ * @param format - Шаблон форматирования (по умолчанию "DD.DM.DY TH:TM (МСК)")
40
+ * @returns Отформатированная строка времени в МСК
36
41
  *
37
42
  * @example
38
- * const mskTime = formatMSK(Date.now());
39
- * console.log(mskTime); // "09.10.2023 14:30 (МСК)"
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
- * Конвертирует строковые представления даты и времени в {@link Timestamp}
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
- * @returns TimeStamp соответствующий указанной дате и времени или 0 при неверном формате
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
- * const timestamp = toTimeStamp("11.02.2012", "13:45");
53
- * console.log(timestamp); // Выведет {@link Timestamp} для "11.02.2012 13:45"
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
- * Шаблонизатор вывода даты и времени из {@link Timestamp}
31
+ * Универсальный шаблонизатор для форматирования даты и времени.
32
+ * Поддерживает различные форматы вывода с возможностью указания часового пояса для вывода
38
33
  *
39
- * TS - секунды
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
- * TM - минуты
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
- * DAM - месяц сокращённым названием
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
- * @example
54
- * const formatted = dateTimeFormatter(new Date(), 'DD.DM.DY TH:TM:TS');
55
- * console.log(formatted); // "09.10.2023 14:30:59"
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
- * Готовый пресет для {@link formatDateTime}
100
+ * Готовый пресет для форматирования времени в московском часовом поясе (МСК +3).
101
+ * Использует {@link formatDateTime} с предустановленным форматом и часовым поясом.
99
102
  *
100
- * `DD.DM.DY TH:TM (МСК)` с МСК-флагом
103
+ * @param timestamp - Временная метка для форматирования (по умолчанию текущее время)
104
+ * @param format - Шаблон форматирования (по умолчанию "DD.DM.DY TH:TM (МСК)")
105
+ * @returns Отформатированная строка времени в МСК
101
106
  *
102
107
  * @example
103
- * const mskTime = formatMSK(Date.now());
104
- * console.log(mskTime); // "09.10.2023 14:30 (МСК)"
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
- * Конвертирует строковые представления даты и времени в {@link Timestamp}
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
- * @returns TimeStamp соответствующий указанной дате и времени или 0 при неверном формате
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
- * const timestamp = toTimeStamp("11.02.2012", "13:45");
119
- * console.log(timestamp); // Выведет {@link Timestamp} для "11.02.2012 13:45"
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
- * Проверяет, является ли файл изображением (исключая SVG)
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
- * Проверяет, является ли файл изображением (исключая SVG)
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
- * Проверка по глобальному `window`
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}, который выполняется всегда, если иное не задано через `usePreventStop`
12
- * Коллбэк выполняется аналогично, но уже относительно `condition`
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
- * TODO: актуализация JSDoc
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
- * 1. Если `usePreventStop === true`, вызывает {@link preventStop}
24
- * 2. Если load вернёт `false` (при его наличии), то выполнение остановится
25
- * 3. Вызывает переданный **prepare-коллбэк** (при его наличии), если он вернёт `false`, то выполнение остановится
26
- * 4. Вызывает основной коллбэк только при нажатии `Enter`.
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 KeyboardEvent = KeyboardEvent>(call?: CanBeNullable<(e: T) => CanBePromise>, { usePreventStop, condition, }?: {
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
- * @returns Функция для удаления обработчика события
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
- * Создаёт once-обработчик события "mousedown" с {@link unselect}
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
- * Создаёт обработчик события "rescroll" для прокрутки элемента наверх с плавной анимацией
113
+ * Создаёт обработчик кастомного события `rescroll`, который плавно прокручивает элемент наверх.
78
114
  *
79
- * @param {HTMLElement} [element=document.documentElement] - Элемент, для которого привязывается обработчик
80
- * @param {EventListenerOptions} [options] - Дополнительные параметры
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
- * Генерирует и пробрасывает событие "rescroll" на указанный элемент или окно
121
+ * Диспатчит событие `rescroll` на указанный элемент или окно.
87
122
  *
88
- * @param {HTMLElement | Window} [element=window] - Элемент или окно, на которое будет отправлено событие
89
- * @returns {boolean} Возвращает результат метода dispatchEvent
123
+ * @param element Элемент или окно (по умолчанию `window`)
124
+ * @returns Было ли событие успешно отправлено
90
125
  */
91
126
  export declare const rescrollDispatch: (element?: HTMLElement | Window) => boolean;
92
127
  /**
93
- * Автоматически изменяет высоту текстового поля (`textarea`) в зависимости от его содержимого
128
+ * Автоматически изменяет высоту `textarea` в зависимости от содержимого.
129
+ *
130
+ * @param area Текстовое поле
94
131
  */
95
132
  export declare const autoAreaHeight: (area?: HTMLTextAreaElement) => void;
96
133
  /**
97
- * Преобразование `{@link FormData}` в объект
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
- * Проверка по глобальному `window`
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}, который выполняется всегда, если иное не задано через `usePreventStop`
12
- * Коллбэк выполняется аналогично, но уже относительно `condition`
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
- * TODO: актуализация JSDoc
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
- * 1. Если `usePreventStop === true`, вызывает {@link preventStop}
27
- * 2. Если load вернёт `false` (при его наличии), то выполнение остановится
28
- * 3. Вызывает переданный **prepare-коллбэк** (при его наличии), если он вернёт `false`, то выполнение остановится
29
- * 4. Вызывает основной коллбэк только при нажатии `Enter`.
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 && useConditionGuard(condition))
42
- call?.(e);
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 T - Тип события из `WindowEventMap`
59
- * @template E - Тип объекта события (по умолчанию `WindowEventMap[T]`)
60
- *
61
- * @param {T} event - Ключ события
62
- * @param {(e: E) => CanBePromise} call - Функция-обработчик события
63
- * @param {AddEventListenerOptions} [options] - Дополнительные параметры
64
- * @param {HTMLElement | Window} [target=window] - Целевой элемент для привязки события
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
- * Создаёт once-обработчик события "mousedown" с {@link unselect}
115
+ * Добавляет одноразовый обработчик `mousedown`, который снимает выделение текста.
79
116
  *
80
- * @returns Функция для удаления обработчика события
117
+ * @returns Функция для удаления обработчика
81
118
  */
82
119
  export const unselectByMousedown = () => createEventListener("mousedown", unselect, { once: true });
83
120
  /**
84
- * Создаёт обработчик события "rescroll" для прокрутки элемента наверх с плавной анимацией
85
- *
86
- * @param {HTMLElement} [element=document.documentElement] - Элемент, для которого привязывается обработчик
87
- * @param {EventListenerOptions} [options] - Дополнительные параметры
121
+ * Создаёт обработчик кастомного события `rescroll`, который плавно прокручивает элемент наверх.
88
122
  *
89
- * @returns Функция для удаления обработчика события
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
- * Генерирует и пробрасывает событие "rescroll" на указанный элемент или окно
131
+ * Диспатчит событие `rescroll` на указанный элемент или окно.
96
132
  *
97
- * @param {HTMLElement | Window} [element=window] - Элемент или окно, на которое будет отправлено событие
98
- * @returns {boolean} Возвращает результат метода dispatchEvent
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
- * Автоматически изменяет высоту текстового поля (`textarea`) в зависимости от его содержимого
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
- * Преобразование `{@link FormData}` в объект
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
@@ -0,0 +1,3 @@
1
+ export declare const pathRegExp: RegExp;
2
+ export declare const toUnixPath: (path: string) => string;
3
+ export declare const isChildPath: (parentPath: string, childPath: string) => boolean;
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
- * Генератор случайных ID ( {@link Date.now}:{@link rand} )
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
- * Генератор случайных UID
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
- * Генератор случайных ID ( {@link Date.now}:{@link rand} )
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
- * Генератор случайных UID
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 {string} str - Исходная строка
33
- * @param {number} length - Количество повторений
34
- * @param {string} [separator=""] - Разделитель между повторениями (по умолчанию пустая строка)
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
- * Готовая {@link Map} для перевода кириллицы нижнего регистра в латиницу
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
- * Функция для создания *slug* (фрагмента URL) сущности
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
- * @param {string} str - Исходная строка
36
- * @param {number} length - Количество повторений
37
- * @param {string} [separator=""] - Разделитель между повторениями (по умолчанию пустая строка)
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
- * Готовая {@link Map} для перевода кириллицы нижнего регистра в латиницу
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
- * Функция для создания *slug* (фрагмента URL) сущности
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.10.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
  }