@nemigo/helpers 0.9.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Создаёт задержку на указанное количество миллисекунд
3
3
  */
4
- export const delay = (ms, success = false) => new Promise((resolve, reject) => setTimeout(success ? resolve : reject, ms));
4
+ export const delay = (ms, success = true) => new Promise((resolve, reject) => setTimeout(success ? resolve : reject, ms));
5
5
  /**
6
6
  * Создаёт debounce-функцию, которая откладывает выполнение до тех пор, пока не пройдёт указанное время без новых вызовов
7
7
  *
@@ -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,69 @@
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 usePreventStop Условие для вызова {@link preventStop}
37
+ * @param condition Условие для вызова основного коллбэка
27
38
  */
28
39
  export declare const enterKeyHook: <T extends KeyboardEvent = KeyboardEvent>(call?: CanBeNullable<(e: T) => CanBePromise>, { usePreventStop, condition, }?: {
29
40
  usePreventStop?: "enter" | unknown | ((e: T, isEnter: boolean) => unknown);
30
41
  condition?: ((e: T) => unknown) | unknown;
31
42
  }) => (e: T) => void;
43
+ /**
44
+ * Тип события с уточнённым `currentTarget`.
45
+ */
32
46
  export type TargetEvent<E extends Event, N extends HTMLElement = HTMLDivElement> = E & {
33
47
  currentTarget: EventTarget & N;
34
48
  };
49
+ /**
50
+ * Тип клавиатурного события с уточнённым `currentTarget`.
51
+ */
35
52
  export type TargetKeyboardEvent<N extends HTMLElement = HTMLDivElement> = TargetEvent<KeyboardEvent, N>;
53
+ /**
54
+ * Проверяет, является ли событие клавиатурным.
55
+ */
36
56
  export declare const isKeyboardEvent: (e: any) => e is KeyboardEvent;
57
+ /**
58
+ * Создаёт обработчик контекстного меню.
59
+ *
60
+ * Если событие вызвано клавиатурой:
61
+ * — координаты берутся из `getBoundingClientRect` текущего элемента.
62
+ * Если мышью:
63
+ * — координаты берутся из `clientX` / `clientY`.
64
+ *
65
+ * @param call Коллбэк, принимающий позицию и метаданные о событии
66
+ */
37
67
  export declare const ctxMenuHook: <N extends HTMLElement = HTMLDivElement>(call: (position: {
38
68
  left: number;
39
69
  top: number;
@@ -45,58 +75,64 @@ export declare const ctxMenuHook: <N extends HTMLElement = HTMLDivElement>(call:
45
75
  event: MouseEvent;
46
76
  }) => void) => (e: TargetKeyboardEvent<N> | MouseEvent) => void;
47
77
  /**
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] - Целевой элемент для привязки события
78
+ * Создаёт слушатель события на указанном элементе.
57
79
  *
58
- * @returns Функция для удаления обработчика события
80
+ * @template M Карта событий
81
+ * @template T Ключ события
82
+ * @template E Тип события
83
+ * @param event Название события
84
+ * @param call Обработчик события
85
+ * @param options Параметры слушателя
86
+ * @param target Целевой элемент (по умолчанию `window`)
87
+ * @returns Функция для удаления обработчика
59
88
  */
60
89
  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
90
  /**
62
- * Убирает все выделения текста на странице
91
+ * Убирает фокус на активном элементе страницы
92
+ */
93
+ export declare const unfocus: () => void;
94
+ /**
95
+ * Снимает текущее выделение текста на странице.
63
96
  */
64
97
  export declare const unselect: () => void;
65
98
  /**
66
- * Создаёт once-обработчик события "mousedown" с {@link unselect}
99
+ * Добавляет одноразовый обработчик `mousedown`, который снимает выделение текста.
67
100
  *
68
- * @returns Функция для удаления обработчика события
101
+ * @returns Функция для удаления обработчика
69
102
  */
70
103
  export declare const unselectByMousedown: () => (() => void);
71
104
  declare global {
72
105
  interface WindowEventMap {
106
+ /** Кастомное событие для прокрутки страницы к началу */
73
107
  rescroll: CustomEvent;
74
108
  }
75
109
  }
76
110
  /**
77
- * Создаёт обработчик события "rescroll" для прокрутки элемента наверх с плавной анимацией
111
+ * Создаёт обработчик кастомного события `rescroll`, который плавно прокручивает элемент наверх.
78
112
  *
79
- * @param {HTMLElement} [element=document.documentElement] - Элемент, для которого привязывается обработчик
80
- * @param {EventListenerOptions} [options] - Дополнительные параметры
81
- *
82
- * @returns Функция для удаления обработчика события
113
+ * @param element Целевой элемент (по умолчанию `document.documentElement`)
114
+ * @param options Доп. параметры слушателя
115
+ * @returns Функция для удаления обработчика
83
116
  */
84
117
  export declare const createRescrollListener: (element?: HTMLElement, options?: EventListenerOptions) => (() => void);
85
118
  /**
86
- * Генерирует и пробрасывает событие "rescroll" на указанный элемент или окно
119
+ * Диспатчит событие `rescroll` на указанный элемент или окно.
87
120
  *
88
- * @param {HTMLElement | Window} [element=window] - Элемент или окно, на которое будет отправлено событие
89
- * @returns {boolean} Возвращает результат метода dispatchEvent
121
+ * @param element Элемент или окно (по умолчанию `window`)
122
+ * @returns Было ли событие успешно отправлено
90
123
  */
91
124
  export declare const rescrollDispatch: (element?: HTMLElement | Window) => boolean;
92
125
  /**
93
- * Автоматически изменяет высоту текстового поля (`textarea`) в зависимости от его содержимого
126
+ * Автоматически изменяет высоту `textarea` в зависимости от содержимого.
127
+ *
128
+ * @param area Текстовое поле
94
129
  */
95
130
  export declare const autoAreaHeight: (area?: HTMLTextAreaElement) => void;
96
131
  /**
97
- * Преобразование `{@link FormData}` в объект
132
+ * Преобразует {@link FormData} в объект.
98
133
  *
99
- * @param form - данные формы
100
- * @param multi - поддержка массивов значений
134
+ * @param form Данные формы
135
+ * @param multi Если true, то поддерживаются массивы значений для одинаковых ключей
136
+ * @returns Объект с данными формы
101
137
  */
102
138
  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,14 +28,17 @@ 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 usePreventStop Условие для вызова {@link preventStop}
41
+ * @param condition Условие для вызова основного коллбэка
30
42
  */
31
43
  export const enterKeyHook = (call, { usePreventStop = "enter", condition = true, } = {}) => (e) => {
32
44
  const isEnter = e.key === "Enter";
@@ -41,7 +53,21 @@ export const enterKeyHook = (call, { usePreventStop = "enter", condition = true,
41
53
  if (isEnter && useConditionGuard(condition))
42
54
  call?.(e);
43
55
  };
56
+ /**
57
+ * Проверяет, является ли событие клавиатурным.
58
+ */
44
59
  export const isKeyboardEvent = (e) => !!e.code;
60
+ //...
61
+ /**
62
+ * Создаёт обработчик контекстного меню.
63
+ *
64
+ * Если событие вызвано клавиатурой:
65
+ * — координаты берутся из `getBoundingClientRect` текущего элемента.
66
+ * Если мышью:
67
+ * — координаты берутся из `clientX` / `clientY`.
68
+ *
69
+ * @param call Коллбэк, принимающий позицию и метаданные о событии
70
+ */
45
71
  export const ctxMenuHook = (call) => preventStopHook((event) => {
46
72
  if (isKeyboardEvent(event)) {
47
73
  const { x, y } = event.currentTarget.getBoundingClientRect();
@@ -53,17 +79,16 @@ export const ctxMenuHook = (call) => preventStopHook((event) => {
53
79
  });
54
80
  //...
55
81
  /**
56
- * Создаёт обработчик событий для указанного элемента или окна
57
- *
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] - Целевой элемент для привязки события
82
+ * Создаёт слушатель события на указанном элементе.
65
83
  *
66
- * @returns Функция для удаления обработчика события
84
+ * @template M Карта событий
85
+ * @template T Ключ события
86
+ * @template E Тип события
87
+ * @param event Название события
88
+ * @param call Обработчик события
89
+ * @param options Параметры слушателя
90
+ * @param target Целевой элемент (по умолчанию `window`)
91
+ * @returns Функция для удаления обработчика
67
92
  */
68
93
  export const createEventListener = (event, call, options = {}, target = window) => {
69
94
  target.addEventListener(event, call, options);
@@ -71,38 +96,45 @@ export const createEventListener = (event, call, options = {}, target = window)
71
96
  };
72
97
  //...
73
98
  /**
74
- * Убирает все выделения текста на странице
99
+ * Убирает фокус на активном элементе страницы
100
+ */
101
+ export const unfocus = () =>
102
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
103
+ document.activeElement?.blur?.();
104
+ /**
105
+ * Снимает текущее выделение текста на странице.
75
106
  */
76
107
  export const unselect = () => document.getSelection()?.removeAllRanges();
77
108
  /**
78
- * Создаёт once-обработчик события "mousedown" с {@link unselect}
109
+ * Добавляет одноразовый обработчик `mousedown`, который снимает выделение текста.
79
110
  *
80
- * @returns Функция для удаления обработчика события
111
+ * @returns Функция для удаления обработчика
81
112
  */
82
113
  export const unselectByMousedown = () => createEventListener("mousedown", unselect, { once: true });
83
114
  /**
84
- * Создаёт обработчик события "rescroll" для прокрутки элемента наверх с плавной анимацией
85
- *
86
- * @param {HTMLElement} [element=document.documentElement] - Элемент, для которого привязывается обработчик
87
- * @param {EventListenerOptions} [options] - Дополнительные параметры
115
+ * Создаёт обработчик кастомного события `rescroll`, который плавно прокручивает элемент наверх.
88
116
  *
89
- * @returns Функция для удаления обработчика события
117
+ * @param element Целевой элемент (по умолчанию `document.documentElement`)
118
+ * @param options Доп. параметры слушателя
119
+ * @returns Функция для удаления обработчика
90
120
  */
91
121
  export const createRescrollListener = (element = document.documentElement, options) => createEventListener("rescroll",
92
122
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
93
123
  () => element?.scrollTo?.({ top: 0, behavior: "smooth" }), options);
94
124
  /**
95
- * Генерирует и пробрасывает событие "rescroll" на указанный элемент или окно
125
+ * Диспатчит событие `rescroll` на указанный элемент или окно.
96
126
  *
97
- * @param {HTMLElement | Window} [element=window] - Элемент или окно, на которое будет отправлено событие
98
- * @returns {boolean} Возвращает результат метода dispatchEvent
127
+ * @param element Элемент или окно (по умолчанию `window`)
128
+ * @returns Было ли событие успешно отправлено
99
129
  */
100
130
  export const rescrollDispatch = (element = window) =>
101
131
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
102
132
  element?.dispatchEvent?.(new CustomEvent("rescroll"));
103
133
  //...
104
134
  /**
105
- * Автоматически изменяет высоту текстового поля (`textarea`) в зависимости от его содержимого
135
+ * Автоматически изменяет высоту `textarea` в зависимости от содержимого.
136
+ *
137
+ * @param area Текстовое поле
106
138
  */
107
139
  export const autoAreaHeight = (area) => {
108
140
  if (!area)
@@ -111,12 +143,12 @@ export const autoAreaHeight = (area) => {
111
143
  area.style.height = `${area.scrollHeight}px`;
112
144
  area.scrollTop = area.scrollHeight;
113
145
  };
114
- //...
115
146
  /**
116
- * Преобразование `{@link FormData}` в объект
147
+ * Преобразует {@link FormData} в объект.
117
148
  *
118
- * @param form - данные формы
119
- * @param multi - поддержка массивов значений
149
+ * @param form Данные формы
150
+ * @param multi Если true, то поддерживаются массивы значений для одинаковых ключей
151
+ * @returns Объект с данными формы
120
152
  */
121
153
  export const formon = (form, multi = false) => {
122
154
  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.9.1",
3
+ "version": "0.11.0",
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
  }