@nemigo/helpers 0.13.3 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/aggregator.d.ts +33 -0
  2. package/dist/aggregator.js +44 -0
  3. package/dist/array.d.ts +33 -0
  4. package/dist/array.js +24 -0
  5. package/dist/async/context.d.ts +73 -0
  6. package/dist/async/context.js +90 -0
  7. package/dist/async/future.d.ts +54 -0
  8. package/dist/async/future.js +71 -0
  9. package/dist/async/index.d.ts +56 -27
  10. package/dist/async/index.js +63 -58
  11. package/dist/async/loader.d.ts +67 -0
  12. package/dist/async/loader.js +101 -0
  13. package/dist/async/queue.d.ts +51 -0
  14. package/dist/async/queue.js +84 -0
  15. package/dist/cases.d.ts +31 -21
  16. package/dist/cases.js +41 -37
  17. package/dist/clean.d.ts +44 -26
  18. package/dist/clean.js +67 -42
  19. package/dist/color/types.d.ts +31 -0
  20. package/dist/color/types.js +1 -0
  21. package/dist/datetime/delta.d.ts +28 -0
  22. package/dist/datetime/delta.js +65 -0
  23. package/dist/datetime/format.d.ts +53 -0
  24. package/dist/datetime/format.js +119 -0
  25. package/dist/datetime/index.d.ts +6 -0
  26. package/dist/datetime/index.js +22 -0
  27. package/dist/datetime/plural.d.ts +77 -0
  28. package/dist/datetime/plural.js +78 -0
  29. package/dist/emitter.d.ts +29 -17
  30. package/dist/emitter.js +35 -21
  31. package/dist/explorer.d.ts +22 -29
  32. package/dist/explorer.js +18 -16
  33. package/dist/files.d.ts +31 -2
  34. package/dist/files.js +33 -8
  35. package/dist/fish.d.ts +29 -0
  36. package/dist/fish.js +70 -0
  37. package/dist/html/cookie.d.ts +48 -0
  38. package/dist/html/cookie.js +37 -0
  39. package/dist/html/events.d.ts +133 -0
  40. package/dist/html/events.js +139 -0
  41. package/dist/html/index.d.ts +31 -0
  42. package/dist/html/index.js +61 -0
  43. package/dist/index.d.ts +38 -40
  44. package/dist/index.js +43 -56
  45. package/dist/jiff/apply.d.ts +93 -0
  46. package/dist/jiff/apply.js +64 -0
  47. package/dist/jiff/extract.d.ts +7 -0
  48. package/dist/jiff/extract.js +82 -0
  49. package/dist/jiff/types.d.ts +57 -0
  50. package/dist/jiff/types.js +1 -0
  51. package/dist/lens.d.ts +20 -31
  52. package/dist/lens.js +22 -37
  53. package/dist/msgpack.d.ts +11 -26
  54. package/dist/msgpack.js +9 -21
  55. package/dist/mutate.d.ts +70 -0
  56. package/dist/mutate.js +130 -0
  57. package/dist/omitter.d.ts +54 -34
  58. package/dist/omitter.js +33 -25
  59. package/dist/path.d.ts +20 -1
  60. package/dist/path.js +21 -2
  61. package/dist/phymath/format.d.ts +60 -0
  62. package/dist/phymath/format.js +34 -0
  63. package/dist/phymath/index.d.ts +30 -30
  64. package/dist/phymath/index.js +41 -33
  65. package/dist/promoter.d.ts +20 -12
  66. package/dist/promoter.js +24 -17
  67. package/dist/random.d.ts +20 -21
  68. package/dist/random.js +22 -23
  69. package/dist/rubles.d.ts +24 -0
  70. package/dist/rubles.js +24 -0
  71. package/dist/script.d.ts +60 -13
  72. package/dist/script.js +46 -10
  73. package/dist/string.d.ts +46 -92
  74. package/dist/string.js +46 -171
  75. package/dist/types.d.ts +144 -25
  76. package/dist/url/index.d.ts +12 -0
  77. package/dist/url/index.js +17 -0
  78. package/dist/url/params.d.ts +141 -0
  79. package/dist/{url.js → url/params.js} +90 -18
  80. package/dist/url/slug.d.ts +28 -0
  81. package/dist/url/slug.js +102 -0
  82. package/dist/veil.d.ts +14 -0
  83. package/dist/veil.js +26 -0
  84. package/dist/xod.d.ts +237 -16
  85. package/dist/xod.js +192 -18
  86. package/dist/zipper.d.ts +22 -4
  87. package/dist/zipper.js +22 -5
  88. package/package.json +82 -34
  89. package/dist/async/space.d.ts +0 -8
  90. package/dist/async/space.js +0 -31
  91. package/dist/cleanup.d.ts +0 -9
  92. package/dist/cleanup.js +0 -18
  93. package/dist/colors.d.ts +0 -539
  94. package/dist/colors.js +0 -888
  95. package/dist/cookie.d.ts +0 -60
  96. package/dist/cookie.js +0 -48
  97. package/dist/datetime.d.ts +0 -82
  98. package/dist/datetime.js +0 -161
  99. package/dist/format.d.ts +0 -36
  100. package/dist/format.js +0 -26
  101. package/dist/future.d.ts +0 -51
  102. package/dist/future.js +0 -71
  103. package/dist/html.d.ts +0 -145
  104. package/dist/html.js +0 -205
  105. package/dist/humanly.d.ts +0 -9
  106. package/dist/humanly.js +0 -93
  107. package/dist/lru.d.ts +0 -77
  108. package/dist/lru.js +0 -128
  109. package/dist/queue.d.ts +0 -40
  110. package/dist/queue.js +0 -56
  111. package/dist/url.d.ts +0 -61
package/dist/cookie.d.ts DELETED
@@ -1,60 +0,0 @@
1
- /**
2
- * Параметры создания куки для {@link CookieCTX}
3
- */
4
- export interface CookieParams {
5
- /**
6
- * Срок действия куки в днях
7
- *
8
- * @default 15
9
- */
10
- days?: number;
11
- /**
12
- * - Strict: Куки будут отправляться только при навигации внутри сайта
13
- * - Lax: Куки доступны для навигации с одного сайта на другой
14
- * - None: Куки доступны для всех запросов, требуется параметр Secure
15
- *
16
- * @default "Lax"
17
- */
18
- policy?: "Strict" | "Lax" | "None";
19
- }
20
- /**
21
- * Серверные readonly-куки для {@link CookieCTX}
22
- */
23
- export interface ServerCookie {
24
- name: string;
25
- value: string;
26
- }
27
- export interface ICookieCTX {
28
- /**
29
- * Инициализирует серверные куки
30
- */
31
- init(cookies: ServerCookie[]): void;
32
- /**
33
- * Устанавливает куку. На сервере игнорируется
34
- */
35
- set(name: string, value: string, params: CookieParams): void;
36
- /**
37
- * Получает значение куки по его названию
38
- *
39
- * @param name - Название куки
40
- * @returns Значение куки или undefined, если кука не найдена
41
- */
42
- get(name: string): string | undefined;
43
- /**
44
- * Удаляет куку по имени. На сервере игнорируется
45
- */
46
- delete(name: string): void;
47
- /**
48
- * Очищает серверные куки
49
- */
50
- clear(): void;
51
- }
52
- export declare class CookieCTX implements ICookieCTX {
53
- private server;
54
- constructor(cookies?: ServerCookie[]);
55
- init(cookies?: ServerCookie[]): void;
56
- get(name: string): string | undefined;
57
- set(name: string, value: string, params?: CookieParams): void;
58
- delete(name: string): void;
59
- clear(): void;
60
- }
package/dist/cookie.js DELETED
@@ -1,48 +0,0 @@
1
- import { isSSR } from "./html.js";
2
- export class CookieCTX {
3
- server = new Map();
4
- constructor(cookies) {
5
- this.init(cookies);
6
- }
7
- init(cookies = []) {
8
- for (const item of cookies)
9
- this.server.set(item.name, item.value);
10
- }
11
- get(name) {
12
- const encoded = encodeURIComponent(name);
13
- if (isSSR)
14
- return this.server.get(encoded);
15
- const key = encoded + "=";
16
- const cookies = document.cookie.split(";");
17
- for (const item of cookies) {
18
- const cookie = item.trim();
19
- if (cookie.startsWith(key)) {
20
- const value = cookie.substring(key.length);
21
- return decodeURIComponent(value);
22
- }
23
- }
24
- }
25
- set(name, value, params = {}) {
26
- if (isSSR)
27
- return;
28
- const { days = 15, policy = "Lax" } = params;
29
- const date = new Date();
30
- date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
31
- const expires = `expires=${date.toUTCString()}`;
32
- const encoded = {
33
- name: encodeURIComponent(name),
34
- value: encodeURIComponent(value),
35
- };
36
- const result = `${encoded.name}=${encoded.value};${expires};path=/;SameSite=${policy}`;
37
- document.cookie = policy === "None" ? result + ";Secure" : result;
38
- }
39
- delete(name) {
40
- if (isSSR)
41
- return;
42
- const encodedName = encodeURIComponent(name);
43
- document.cookie = `${encodedName}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`;
44
- }
45
- clear() {
46
- this.server.clear();
47
- }
48
- }
@@ -1,82 +0,0 @@
1
- import type { Timestamp } from "./types.js";
2
- export declare const months: string[];
3
- export declare const abbs: string[];
4
- /**
5
- * Универсальный шаблонизатор для форматирования даты и времени.
6
- * Поддерживает различные форматы вывода с возможностью указания часового пояса для вывода
7
- *
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 цифры)
17
- *
18
- * @example
19
- * ```typescript
20
- * formatDateTime(new Date(), 'DD.DM.DY TH:TM:TS');
21
- * // "09.10.2023 14:30:59"
22
- *
23
- * formatDateTime(Date.now(), 'DFM DY');
24
- * // "октября 2023"
25
- *
26
- * formatDateTime('2023-12-25', 'DD DAM DY', 3);
27
- * // "25 дек 2023" (с учетом МСК +3)
28
- *
29
- * formatDateTime(Date.now(), 'DY-DM-DD TH:TM');
30
- * // "2023-10-09 14:30"
31
- * ```
32
- */
33
- export declare const formatDateTime: (datetime?: Date | Timestamp | string, format?: string, timezone?: number) => string;
34
- /**
35
- * Готовый пресет для форматирования времени в московском часовом поясе (МСК +3).
36
- * Использует {@link formatDateTime} с предустановленным форматом и часовым поясом.
37
- *
38
- * @param timestamp - Временная метка для форматирования (по умолчанию текущее время)
39
- * @param format - Шаблон форматирования (по умолчанию "DD.DM.DY TH:TM (МСК)")
40
- * @returns Отформатированная строка времени в МСК
41
- *
42
- * @example
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
- * ```
53
- */
54
- export declare const formatMSK: (timestamp?: Timestamp, format?: string) => string;
55
- /**
56
- * Конвертирует строковые представления даты и времени в числовую временную метку (Timestamp).
57
- * Поддерживает локальное время и UTC с указанием часового пояса.
58
- *
59
- * @param date - Строка даты в формате "DD.MM.YYYY" (день.месяц.год)
60
- * @param time - Строка времени в формате "HH:MM" (час:минута), по умолчанию "00:00"
61
- * @param timezone - Часовой пояс в часах относительно GMT (опционально)
62
- * @returns Timestamp в миллисекундах или 0 при неверном формате входных данных
63
- *
64
- * @example
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
- * ```
81
- */
82
- export declare const toTimeStamp: (date: string, time?: string, timezone?: number) => Timestamp | 0;
package/dist/datetime.js DELETED
@@ -1,161 +0,0 @@
1
- import { pad } from "./index.js";
2
- export const months = [
3
- "января",
4
- "февраля",
5
- "марта",
6
- "апреля",
7
- "мая",
8
- "июня",
9
- "июля",
10
- "августа",
11
- "сентября",
12
- "октября",
13
- "ноября",
14
- "декабря",
15
- ];
16
- export const abbs = [
17
- "янв",
18
- "фев",
19
- "марта",
20
- "апр",
21
- "мая",
22
- "июня",
23
- "июля",
24
- "авг",
25
- "сен",
26
- "окт",
27
- "ноя",
28
- "дек",
29
- ];
30
- /**
31
- * Универсальный шаблонизатор для форматирования даты и времени.
32
- * Поддерживает различные форматы вывода с возможностью указания часового пояса для вывода
33
- *
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 цифры)
43
- *
44
- * @example
45
- * ```typescript
46
- * formatDateTime(new Date(), 'DD.DM.DY TH:TM:TS');
47
- * // "09.10.2023 14:30:59"
48
- *
49
- * formatDateTime(Date.now(), 'DFM DY');
50
- * // "октября 2023"
51
- *
52
- * formatDateTime('2023-12-25', 'DD DAM DY', 3);
53
- * // "25 дек 2023" (с учетом МСК +3)
54
- *
55
- * formatDateTime(Date.now(), 'DY-DM-DD TH:TM');
56
- * // "2023-10-09 14:30"
57
- * ```
58
- */
59
- export const formatDateTime = (datetime = Date.now(), format = "DD.DM.DY TH:TM", timezone) => {
60
- const base = new Date(datetime);
61
- const useTz = timezone !== undefined;
62
- const shiftMinutes = useTz ? Math.round(timezone * 60) : 0;
63
- const shifted = useTz ? new Date(base.valueOf() + shiftMinutes * 60000) : base;
64
- const seconds = useTz ? shifted.getUTCSeconds() : shifted.getSeconds();
65
- const minutes = useTz ? shifted.getUTCMinutes() : shifted.getMinutes();
66
- const hours = useTz ? shifted.getUTCHours() : shifted.getHours();
67
- const day = useTz ? shifted.getUTCDate() : shifted.getDate();
68
- const monthIndex = useTz ? shifted.getUTCMonth() : shifted.getMonth();
69
- const year = useTz ? shifted.getUTCFullYear() : shifted.getFullYear();
70
- const replacements = {
71
- TS: pad(seconds),
72
- TM: pad(minutes),
73
- TH: pad(hours),
74
- DD: pad(day),
75
- DM: pad(monthIndex + 1),
76
- DFM: months[monthIndex],
77
- DAM: abbs[monthIndex],
78
- DY: year.toString(),
79
- };
80
- const result = [];
81
- let i = 0;
82
- while (i < format.length) {
83
- let found = false;
84
- for (const key in replacements) {
85
- if (format.startsWith(key, i)) {
86
- result.push(replacements[key]);
87
- i += key.length;
88
- found = true;
89
- break;
90
- }
91
- }
92
- if (!found) {
93
- result.push(format[i]);
94
- i++;
95
- }
96
- }
97
- return result.join("");
98
- };
99
- /**
100
- * Готовый пресет для форматирования времени в московском часовом поясе (МСК +3).
101
- * Использует {@link formatDateTime} с предустановленным форматом и часовым поясом.
102
- *
103
- * @param timestamp - Временная метка для форматирования (по умолчанию текущее время)
104
- * @param format - Шаблон форматирования (по умолчанию "DD.DM.DY TH:TM (МСК)")
105
- * @returns Отформатированная строка времени в МСК
106
- *
107
- * @example
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
- * ```
118
- */
119
- export const formatMSK = (timestamp = Date.now(), format = "DD.DM.DY TH:TM (МСК)") => formatDateTime(timestamp, format, 3);
120
- //...
121
- /**
122
- * Конвертирует строковые представления даты и времени в числовую временную метку (Timestamp).
123
- * Поддерживает локальное время и UTC с указанием часового пояса.
124
- *
125
- * @param date - Строка даты в формате "DD.MM.YYYY" (день.месяц.год)
126
- * @param time - Строка времени в формате "HH:MM" (час:минута), по умолчанию "00:00"
127
- * @param timezone - Часовой пояс в часах относительно GMT (опционально)
128
- * @returns Timestamp в миллисекундах или 0 при неверном формате входных данных
129
- *
130
- * @example
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
- * ```
147
- */
148
- export const toTimeStamp = (date, time = "00:00", timezone) => {
149
- const [day, month, year] = date.split(".").map(Number);
150
- const [hours, minutes] = time.split(":").map(Number);
151
- // Проверка на корректность ввода (если хотя бы одно значение не число)
152
- // prettier-ignore
153
- if ([day, month, year, hours, minutes].some(isNaN))
154
- return 0;
155
- if (timezone !== undefined) {
156
- return Date.UTC(year, month - 1, day, hours, minutes) - timezone * 60 * 60 * 1000;
157
- }
158
- else {
159
- return new Date(year, month - 1, day, hours, minutes).getTime();
160
- }
161
- };
package/dist/format.d.ts DELETED
@@ -1,36 +0,0 @@
1
- import type { CanBeNullable } from "./types.js";
2
- export interface FormatNumberConfig {
3
- /**
4
- * @default 2
5
- */
6
- fraction?: number;
7
- /**
8
- * @default "---"
9
- */
10
- fallback?: string;
11
- /**
12
- * @example "₽"
13
- */
14
- postfix?: string;
15
- /**
16
- * - "always" - "0" для всех исключительных ситуаций
17
- * - "value" - "0" только при значении равном нулю, иначе `fallback`
18
- * - "never" - `fallback` всегда
19
- *
20
- * @default value
21
- */
22
- zero?: "always" | "value" | "never";
23
- }
24
- export declare const FormatNumberRegExp: RegExp;
25
- /**
26
- * Форматирование числа по тысячам
27
- *
28
- * @example "1 234" или "1 234,56"
29
- */
30
- export declare const formatNumber: (amount: CanBeNullable<number | string>, { fraction, fallback, zero, postfix }?: FormatNumberConfig) => string;
31
- /**
32
- * Форматирование в RUB-формат
33
- *
34
- * @example "1 234 ₽" или "1 234,56 ₽"
35
- */
36
- export declare const formatRUB: (amount: CanBeNullable<number | string>, { fraction, fallback, zero }?: Omit<FormatNumberConfig, "postfix">) => string;
package/dist/format.js DELETED
@@ -1,26 +0,0 @@
1
- import { caseNumber } from "./cases.js";
2
- import { toRound } from "./phymath/index.js";
3
- export const FormatNumberRegExp = /\B(?=(\d{3})+(?!\d))/g;
4
- /**
5
- * Форматирование числа по тысячам
6
- *
7
- * @example "1 234" или "1 234,56"
8
- */
9
- export const formatNumber = (amount, { fraction = 2, fallback = "---", zero = "value", postfix } = {}) => caseNumber(amount, (v) => {
10
- if (v === undefined)
11
- return zero === "always" ? (postfix ? "0 " + postfix : "0") : fallback;
12
- if (v === 0)
13
- return zero === "never" ? fallback : postfix ? "0 " + postfix : "0";
14
- if (fraction === 0)
15
- return Math.round(v).toString().replace(FormatNumberRegExp, " ");
16
- const { 0: integer, 1: fractional = "" } = toRound(v, fraction).toString().split(".");
17
- const result = integer.replace(FormatNumberRegExp, " ");
18
- const formatted = fractional ? `${result},${fractional}` : result;
19
- return postfix ? formatted + " " + postfix : formatted;
20
- });
21
- /**
22
- * Форматирование в RUB-формат
23
- *
24
- * @example "1 234 ₽" или "1 234,56 ₽"
25
- */
26
- export const formatRUB = (amount, { fraction = 2, fallback = "---", zero = "value" } = {}) => formatNumber(amount, { fraction, fallback, zero, postfix: "₽" });
package/dist/future.d.ts DELETED
@@ -1,51 +0,0 @@
1
- import type { CanBePromise, RID, Timestamp } from "./types.js";
2
- /**
3
- * Тип фьючерса: таймер или интервал
4
- */
5
- export type FutureType = "timer" | "interval";
6
- /**
7
- * Фьючерс для {@link Future}
8
- */
9
- export interface FutureOptions {
10
- /**
11
- * Тип фьючерса
12
- *
13
- * @default {@link FutureType}
14
- */
15
- type?: FutureType;
16
- /**
17
- * Уникальный ключ фьючерса
18
- */
19
- key?: RID;
20
- /**
21
- * Задержка ({@link Timestamp}). Если не указана, используется значение по умолчанию
22
- */
23
- delay?: number;
24
- }
25
- /**
26
- * Класс для управления таймерами и интервалами
27
- */
28
- export declare class Future {
29
- readonly delay: Timestamp;
30
- /**
31
- * @param [delay=5min] - Задержка по умолчанию
32
- */
33
- constructor(delay?: Timestamp);
34
- private timers;
35
- private intervals;
36
- private get;
37
- /**
38
- * Очищает таймеры или интервалы
39
- */
40
- clear(type?: FutureType, key?: RID): void;
41
- /**
42
- * Сброс фьючерса
43
- */
44
- private reset;
45
- /**
46
- * Удаляет предыдущий фьючерс по ключу (если он был) и стартует новый.
47
- * Функция будет обёрнута в {@link boundary} при вызове
48
- */
49
- run(call: () => CanBePromise, { type, key, delay }?: FutureOptions): void;
50
- has(type: FutureType, key: RID): boolean;
51
- }
package/dist/future.js DELETED
@@ -1,71 +0,0 @@
1
- //...
2
- /**
3
- * Класс для управления таймерами и интервалами
4
- */
5
- export class Future {
6
- delay = 5 * 60 * 1000;
7
- /**
8
- * @param [delay=5min] - Задержка по умолчанию
9
- */
10
- constructor(delay = 5 * 60 * 1000) {
11
- this.delay = delay;
12
- }
13
- timers = new Map();
14
- intervals = new Map();
15
- get(type) {
16
- if (type === "timer")
17
- return this.timers;
18
- return this.intervals;
19
- }
20
- /**
21
- * Очищает таймеры или интервалы
22
- */
23
- clear(type, key) {
24
- if (type) {
25
- const map = this.get(type);
26
- key ? this.reset(type, map, key) : map.clear();
27
- }
28
- else {
29
- this.timers.clear();
30
- this.intervals.clear();
31
- }
32
- }
33
- /**
34
- * Сброс фьючерса
35
- */
36
- reset(type, map, key) {
37
- const id = map.get(key);
38
- if (!id)
39
- return;
40
- type === "timer" ? clearTimeout(id) : clearInterval(id);
41
- map.delete(key);
42
- }
43
- /**
44
- * Удаляет предыдущий фьючерс по ключу (если он был) и стартует новый.
45
- * Функция будет обёрнута в {@link boundary} при вызове
46
- */
47
- run(call, { type = "timer", key = Symbol(), delay = this.delay } = {}) {
48
- if (type === "timer") {
49
- this.reset(type, this.timers, key);
50
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
51
- const timer = setTimeout(async () => {
52
- try {
53
- await call();
54
- }
55
- finally {
56
- this.timers.delete(key);
57
- }
58
- }, delay);
59
- this.timers.set(key, timer);
60
- }
61
- else {
62
- this.reset(type, this.intervals, key);
63
- const timer = setInterval(call, delay);
64
- this.intervals.set(key, timer);
65
- }
66
- }
67
- has(type, key) {
68
- const map = this.get(type);
69
- return map.has(key);
70
- }
71
- }
package/dist/html.d.ts DELETED
@@ -1,145 +0,0 @@
1
- import type { CanBeNullable, CanBePromise, KEYS, Timestamp } from "./types.js";
2
- /**
3
- * `true`, если глобальный объект `window` отсутствует.
4
- */
5
- export declare const isSSR: boolean;
6
- /**
7
- * Предотвращает стандартное поведение события и останавливает его всплытие.
8
- */
9
- export declare const preventStop: (e: Event) => void;
10
- /**
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 Обработчик события
21
- */
22
- export declare const preventStopHook: <T extends Event = Event>(call?: CanBeNullable<(e: T) => CanBePromise>, { usePreventStop, condition, }?: {
23
- usePreventStop?: ((e: T) => unknown) | unknown;
24
- condition?: ((e: T) => unknown) | unknown;
25
- }) => ((e: T) => void);
26
- /**
27
- * Возвращает обработчик клавиатурных событий.
28
- *
29
- * Логика:
30
- * 1. Если `usePreventStop === "enter"` и нажата клавиша Enter → вызовется {@link preventStop}.
31
- * 2. Если `usePreventStop` — функция/флаг, и она вернёт true → вызовется {@link preventStop}.
32
- * 3. Если нажата Enter и `condition` → true, вызовется основной коллбэк.
33
- *
34
- * @template T Тип события клавиатуры
35
- * @param call - Основной коллбэк, вызываемый при Enter
36
- * @param onkeydown - Для иных клавиш вызывается всегда, кроме `"Enter`
37
- * @param usePreventStop - Условие для вызова {@link preventStop}
38
- * @param condition - Условие для вызова основного коллбэка
39
- */
40
- export declare const enterKeyHook: <T extends KeyboardEvent = KeyboardEvent>(call?: CanBeNullable<(e: T) => CanBePromise>, { onkeydown, usePreventStop, condition, }?: {
41
- onkeydown?: (e: T) => void;
42
- usePreventStop?: "enter" | unknown | ((e: T, isEnter: boolean) => unknown);
43
- condition?: ((e: T) => unknown) | unknown;
44
- }) => (e: T) => void;
45
- /**
46
- * Тип события с уточнённым `currentTarget`.
47
- */
48
- export type TargetEvent<E extends Event, N extends HTMLElement = HTMLDivElement> = E & {
49
- currentTarget: EventTarget & N;
50
- };
51
- /**
52
- * Тип клавиатурного события с уточнённым `currentTarget`.
53
- */
54
- export type TargetKeyboardEvent<N extends HTMLElement = HTMLDivElement> = TargetEvent<KeyboardEvent, N>;
55
- /**
56
- * Проверяет, является ли событие клавиатурным.
57
- */
58
- export declare const isKeyboardEvent: (e: any) => e is KeyboardEvent;
59
- export type MouseBoardEvent = MouseEvent | TargetKeyboardEvent;
60
- /**
61
- * Создаёт обработчик контекстного меню.
62
- *
63
- * Если событие вызвано клавиатурой:
64
- * — координаты берутся из `getBoundingClientRect` текущего элемента.
65
- * Если мышью:
66
- * — координаты берутся из `clientX` / `clientY`.
67
- *
68
- * @param call Коллбэк, принимающий позицию и метаданные о событии
69
- */
70
- export declare const createCtxMenuHandler: <N extends HTMLElement = HTMLDivElement>(call: (position: {
71
- left: number;
72
- top: number;
73
- }, meta: {
74
- isKeyboardEvent: true;
75
- event: TargetKeyboardEvent<N>;
76
- } | {
77
- isKeyboardEvent: false;
78
- event: MouseEvent;
79
- }) => void) => (e: MouseEvent | TargetKeyboardEvent<N>) => void;
80
- export declare const createClickHandlers: (singleClickHandler: (e: MouseEvent) => void, doubleClickHandler: (e: MouseEvent) => void, delay?: Timestamp) => {
81
- onclick: (e: MouseEvent) => void;
82
- ondblclick: (e: MouseEvent) => void;
83
- };
84
- /**
85
- * Создаёт слушатель события на указанном элементе.
86
- *
87
- * @template M Карта событий
88
- * @template T Ключ события
89
- * @template E Тип события
90
- * @param event Название события
91
- * @param call Обработчик события
92
- * @param options Параметры слушателя
93
- * @param target Целевой элемент (по умолчанию `window`)
94
- * @returns Функция для удаления обработчика
95
- */
96
- 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);
97
- /**
98
- * Убирает фокус на активном элементе страницы
99
- */
100
- export declare const unfocus: () => void;
101
- /**
102
- * Снимает текущее выделение текста на странице.
103
- */
104
- export declare const unselect: () => void;
105
- /**
106
- * Добавляет одноразовый обработчик `mousedown`, который снимает выделение текста.
107
- *
108
- * @returns Функция для удаления обработчика
109
- */
110
- export declare const unselectByMousedown: () => (() => void);
111
- declare global {
112
- interface WindowEventMap {
113
- /** Кастомное событие для прокрутки страницы к началу */
114
- rescroll: CustomEvent;
115
- }
116
- }
117
- /**
118
- * Создаёт обработчик кастомного события `rescroll`, который плавно прокручивает элемент наверх.
119
- *
120
- * @param element Целевой элемент (по умолчанию `document.documentElement`)
121
- * @param options Доп. параметры слушателя
122
- * @returns Функция для удаления обработчика
123
- */
124
- export declare const createRescrollListener: (element?: HTMLElement, options?: EventListenerOptions) => (() => void);
125
- /**
126
- * Диспатчит событие `rescroll` на указанный элемент или окно.
127
- *
128
- * @param element Элемент или окно (по умолчанию `window`)
129
- * @returns Было ли событие успешно отправлено
130
- */
131
- export declare const rescrollDispatch: (element?: HTMLElement | Window) => boolean;
132
- /**
133
- * Автоматически изменяет высоту `textarea` в зависимости от содержимого.
134
- *
135
- * @param area Текстовое поле
136
- */
137
- export declare const autoAreaHeight: (area?: HTMLTextAreaElement) => void;
138
- /**
139
- * Преобразует {@link FormData} в объект.
140
- *
141
- * @param form Данные формы
142
- * @param multi Если true, то поддерживаются массивы значений для одинаковых ключей
143
- * @returns Объект с данными формы
144
- */
145
- export declare const formon: <D = any>(form: FormData, multi?: boolean) => D;