@nemigo/helpers 0.13.3 → 1.5.2

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 +54 -0
  24. package/dist/datetime/format.js +122 -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/html.js DELETED
@@ -1,205 +0,0 @@
1
- import { useConditionGuard } from "./index.js";
2
- /**
3
- * `true`, если глобальный объект `window` отсутствует.
4
- */
5
- export const isSSR = typeof window === "undefined";
6
- //...
7
- /**
8
- * Предотвращает стандартное поведение события и останавливает его всплытие.
9
- */
10
- export const preventStop = (e) => (e.preventDefault(), e.stopPropagation());
11
- /**
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 Обработчик события
22
- */
23
- export const preventStopHook = (call, { usePreventStop = true, condition = true, } = {}) => (e) => {
24
- if (useConditionGuard(usePreventStop, e))
25
- preventStop(e);
26
- if (useConditionGuard(condition, e))
27
- call?.(e);
28
- };
29
- //...
30
- /**
31
- * Возвращает обработчик клавиатурных событий.
32
- *
33
- * Логика:
34
- * 1. Если `usePreventStop === "enter"` и нажата клавиша Enter → вызовется {@link preventStop}.
35
- * 2. Если `usePreventStop` — функция/флаг, и она вернёт true → вызовется {@link preventStop}.
36
- * 3. Если нажата Enter и `condition` → true, вызовется основной коллбэк.
37
- *
38
- * @template T Тип события клавиатуры
39
- * @param call - Основной коллбэк, вызываемый при Enter
40
- * @param onkeydown - Для иных клавиш вызывается всегда, кроме `"Enter`
41
- * @param usePreventStop - Условие для вызова {@link preventStop}
42
- * @param condition - Условие для вызова основного коллбэка
43
- */
44
- export const enterKeyHook = (call, { onkeydown, usePreventStop = "enter", condition = true, } = {}) => (e) => {
45
- const isEnter = e.key === "Enter";
46
- if (usePreventStop === "enter") {
47
- if (isEnter)
48
- preventStop(e);
49
- }
50
- else {
51
- if (useConditionGuard(usePreventStop, e, isEnter))
52
- preventStop(e);
53
- }
54
- if (isEnter) {
55
- if (useConditionGuard(condition))
56
- call?.(e);
57
- }
58
- else {
59
- onkeydown?.(e);
60
- }
61
- };
62
- /**
63
- * Проверяет, является ли событие клавиатурным.
64
- */
65
- export const isKeyboardEvent = (e) => !!e.code;
66
- //...
67
- /**
68
- * Создаёт обработчик контекстного меню.
69
- *
70
- * Если событие вызвано клавиатурой:
71
- * — координаты берутся из `getBoundingClientRect` текущего элемента.
72
- * Если мышью:
73
- * — координаты берутся из `clientX` / `clientY`.
74
- *
75
- * @param call Коллбэк, принимающий позицию и метаданные о событии
76
- */
77
- export const createCtxMenuHandler = (call) => preventStopHook((event) => {
78
- if (isKeyboardEvent(event)) {
79
- const { x, y } = event.currentTarget.getBoundingClientRect();
80
- call({ left: x, top: y }, { isKeyboardEvent: true, event });
81
- }
82
- else {
83
- call({ left: event.clientX, top: event.clientY }, { isKeyboardEvent: false, event });
84
- }
85
- });
86
- //...
87
- export const createClickHandlers = (singleClickHandler, doubleClickHandler, delay = 75) => {
88
- let clickTimer = 0;
89
- let isDoubleClick = false;
90
- const onclick = (e) => {
91
- e.preventDefault();
92
- if (clickTimer)
93
- return;
94
- clickTimer = setTimeout(() => {
95
- if (!isDoubleClick) {
96
- singleClickHandler(e);
97
- }
98
- clickTimer = 0;
99
- isDoubleClick = false;
100
- }, delay);
101
- };
102
- const ondblclick = (e) => {
103
- e.preventDefault();
104
- isDoubleClick = true;
105
- if (clickTimer) {
106
- clearTimeout(clickTimer);
107
- clickTimer = 0;
108
- }
109
- doubleClickHandler(e);
110
- };
111
- return { onclick, ondblclick };
112
- };
113
- //...
114
- /**
115
- * Создаёт слушатель события на указанном элементе.
116
- *
117
- * @template M Карта событий
118
- * @template T Ключ события
119
- * @template E Тип события
120
- * @param event Название события
121
- * @param call Обработчик события
122
- * @param options Параметры слушателя
123
- * @param target Целевой элемент (по умолчанию `window`)
124
- * @returns Функция для удаления обработчика
125
- */
126
- export const createEventListener = (event, call, options = {}, target = window) => {
127
- target.addEventListener(event, call, options);
128
- return () => target.removeEventListener(event, call);
129
- };
130
- //...
131
- /**
132
- * Убирает фокус на активном элементе страницы
133
- */
134
- export const unfocus = () =>
135
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
136
- document.activeElement?.blur?.();
137
- /**
138
- * Снимает текущее выделение текста на странице.
139
- */
140
- export const unselect = () => document.getSelection()?.removeAllRanges();
141
- /**
142
- * Добавляет одноразовый обработчик `mousedown`, который снимает выделение текста.
143
- *
144
- * @returns Функция для удаления обработчика
145
- */
146
- export const unselectByMousedown = () => createEventListener("mousedown", unselect, { once: true });
147
- /**
148
- * Создаёт обработчик кастомного события `rescroll`, который плавно прокручивает элемент наверх.
149
- *
150
- * @param element Целевой элемент (по умолчанию `document.documentElement`)
151
- * @param options Доп. параметры слушателя
152
- * @returns Функция для удаления обработчика
153
- */
154
- export const createRescrollListener = (element = document.documentElement, options) => createEventListener("rescroll",
155
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
156
- () => element?.scrollTo?.({ top: 0, behavior: "smooth" }), options);
157
- /**
158
- * Диспатчит событие `rescroll` на указанный элемент или окно.
159
- *
160
- * @param element Элемент или окно (по умолчанию `window`)
161
- * @returns Было ли событие успешно отправлено
162
- */
163
- export const rescrollDispatch = (element = window) =>
164
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
165
- element?.dispatchEvent?.(new CustomEvent("rescroll"));
166
- //...
167
- /**
168
- * Автоматически изменяет высоту `textarea` в зависимости от содержимого.
169
- *
170
- * @param area Текстовое поле
171
- */
172
- export const autoAreaHeight = (area) => {
173
- if (!area)
174
- return;
175
- area.style.height = "auto";
176
- area.style.height = `${area.scrollHeight}px`;
177
- area.scrollTop = area.scrollHeight;
178
- };
179
- /**
180
- * Преобразует {@link FormData} в объект.
181
- *
182
- * @param form Данные формы
183
- * @param multi Если true, то поддерживаются массивы значений для одинаковых ключей
184
- * @returns Объект с данными формы
185
- */
186
- export const formon = (form, multi = false) => {
187
- if (multi) {
188
- const result = {};
189
- for (const { 0: key, 1: value } of form.entries()) {
190
- if (result[key] !== undefined) {
191
- if (!Array.isArray(result[key])) {
192
- result[key] = [result[key]];
193
- }
194
- result[key].push(value);
195
- }
196
- else {
197
- result[key] = value;
198
- }
199
- }
200
- return result;
201
- }
202
- else {
203
- return Object.fromEntries(form.entries());
204
- }
205
- };
package/dist/humanly.d.ts DELETED
@@ -1,9 +0,0 @@
1
- export type RU_CASES = "nominative" | "genitive" | "dative" | "accusative" | "ablative";
2
- /**
3
- * Форма слова 'рубль' в правильном падеже и числе в зависимости от количества
4
- */
5
- export declare const Rubles: (value: number, form?: RU_CASES) => string;
6
- /**
7
- * Форма слова 'секунда' в правильном падеже и числе в зависимости от количества
8
- */
9
- export declare const Seconds: (value: number, form?: RU_CASES) => string;
package/dist/humanly.js DELETED
@@ -1,93 +0,0 @@
1
- //...
2
- /**
3
- * Основные формы слова 'рубль'
4
- */
5
- const RublesMainSwitch = (form) => {
6
- switch (form) {
7
- case "dative":
8
- return "рублям";
9
- case "ablative":
10
- return "рублями";
11
- default:
12
- return "рублей";
13
- }
14
- };
15
- /**
16
- * Форма слова 'рубль' в правильном падеже и числе в зависимости от количества
17
- */
18
- export const Rubles = (value, form = "nominative") => {
19
- const lastTwoDigits = Math.abs(value % 100);
20
- if (lastTwoDigits > 4 && lastTwoDigits < 21)
21
- return RublesMainSwitch(form);
22
- const lastDigit = Math.abs(value % 10);
23
- if (lastDigit >= 2 && lastDigit <= 4) {
24
- switch (form) {
25
- case "nominative":
26
- case "accusative":
27
- return "рубля";
28
- default:
29
- return RublesMainSwitch(form);
30
- }
31
- }
32
- if (lastDigit === 1) {
33
- switch (form) {
34
- case "nominative":
35
- case "accusative":
36
- return "рубль";
37
- case "genitive":
38
- return "рубля";
39
- case "dative":
40
- return "рублю";
41
- case "ablative":
42
- return "рублём";
43
- }
44
- }
45
- return RublesMainSwitch(form);
46
- };
47
- //...
48
- /**
49
- * Основные формы слова 'секунда'
50
- */
51
- const SecondsMainSwitch = (form) => {
52
- switch (form) {
53
- case "dative":
54
- return "секундам";
55
- case "ablative":
56
- return "секундами";
57
- default:
58
- return "секунд";
59
- }
60
- };
61
- /**
62
- * Форма слова 'секунда' в правильном падеже и числе в зависимости от количества
63
- */
64
- export const Seconds = (value, form = "nominative") => {
65
- const lastTwoDigits = Math.abs(value % 100);
66
- if (lastTwoDigits > 4 && lastTwoDigits < 21)
67
- return SecondsMainSwitch(form);
68
- const lastDigit = Math.abs(value % 10);
69
- if (lastDigit >= 2 && lastDigit <= 4) {
70
- switch (form) {
71
- case "nominative":
72
- case "accusative":
73
- return "секунды";
74
- default:
75
- return SecondsMainSwitch(form);
76
- }
77
- }
78
- if (lastDigit === 1) {
79
- switch (form) {
80
- case "nominative":
81
- return "секунда";
82
- case "accusative":
83
- return "секунду";
84
- case "genitive":
85
- return "секунды";
86
- case "dative":
87
- return "секунде";
88
- case "ablative":
89
- return "секундой";
90
- }
91
- }
92
- return SecondsMainSwitch(form);
93
- };
package/dist/lru.d.ts DELETED
@@ -1,77 +0,0 @@
1
- import type { RID, Timestamp } from "./types.js";
2
- /**
3
- * LRU (Least Recently Used) кэш с поддержкой TTL (time-to-live)
4
- *
5
- * Элементы кэша удаляются при превышении максимального размера либо по истечении заданного TTL.
6
- * TTL для каждого элемента можно задать как глобально при создании кэша, так и индивидуально при установке
7
- *
8
- * @template V - Тип значения для кэша
9
- * @template K - Тип ключа для кэша
10
- *
11
- * @example
12
- * const lruCache = new LRU<string, number>(2, 5); // Глобальный TTL 5 минут
13
- * lruCache.set('one', 1);
14
- * lruCache.set('two', 2);
15
- * lruCache.set('three', 3); // Если кэш переполнен, удалится наименее недавно использованный или устаревший элемент
16
- * console.log(lruCache.get('one')); // undefined, если значение устарело или удалено
17
- * console.log(lruCache.get('two')); // 2
18
- */
19
- export declare class LRU<V = unknown, K extends RID = string> {
20
- /**
21
- * Максимальное количество элементов в кэше
22
- */
23
- readonly max: number;
24
- /**
25
- * Глобальный TTL (time-to-live) для каждого элемента в {@link Timestamp}.
26
- * Если не задан (`undefined`), элементы не устаревают глобально
27
- */
28
- readonly ttl?: Timestamp;
29
- /**
30
- * Внутреннее хранилище кэша.
31
- * Хранит значения вместе с информацией о времени истечения срока их действия
32
- */
33
- private readonly cache;
34
- /**
35
- * @param [max=200] - Максимальное количество элементов в кэше
36
- * @param ttl - Глобальный TTL (time-to-live) для каждого элемента в **минутах**
37
- * Если не задан, элементы не устаревают глобально
38
- */
39
- constructor(max?: number, ttl?: number);
40
- /**
41
- * Перевод минут в {@link Timestamp}
42
- */
43
- private toTimeStamp;
44
- /**
45
- * Проверяет, устарел ли элемент кэша
46
- *
47
- * @param entry - Элемент кэша для проверки
48
- * @returns `true`, если элемент устарел, иначе `false`
49
- */
50
- private isExpired;
51
- /**
52
- * Получает значение из кэша по ключу
53
- *
54
- * - Если элемент найден и не устарел, он перемещается в конец кэша (обновляется порядок использования)
55
- * - Если элемент устарел, он удаляется, и возвращается `undefined`
56
- *
57
- * @param key - Ключ для получения значения
58
- * @returns Значение из кэша или `undefined`, если ключ отсутствует или значение устарело
59
- */
60
- get(key: K): V | undefined;
61
- /**
62
- * Устанавливает значение в кэш
63
- *
64
- * - Если ключ уже существует, его значение обновляется и перемещается в конец
65
- * - Если размер кэша превышает максимальное значение, производится очистка устаревших элементов
66
- * - Если после очистки кэш все еще переполнен, удаляется наименее недавно использованный элемент
67
- *
68
- * @param key - Ключ для установки значения
69
- * @param value - Значение для установки в кэш
70
- * @param ttl - Индивидуальный TTL для данного элемента в **минутах**. Если не задан, используется TTL экземпляра, если он установлен
71
- */
72
- set(key: K, value: V, ttl?: number): void;
73
- /**
74
- * Очищает кэш
75
- */
76
- clear(key?: K): void;
77
- }
package/dist/lru.js DELETED
@@ -1,128 +0,0 @@
1
- /**
2
- * LRU (Least Recently Used) кэш с поддержкой TTL (time-to-live)
3
- *
4
- * Элементы кэша удаляются при превышении максимального размера либо по истечении заданного TTL.
5
- * TTL для каждого элемента можно задать как глобально при создании кэша, так и индивидуально при установке
6
- *
7
- * @template V - Тип значения для кэша
8
- * @template K - Тип ключа для кэша
9
- *
10
- * @example
11
- * const lruCache = new LRU<string, number>(2, 5); // Глобальный TTL 5 минут
12
- * lruCache.set('one', 1);
13
- * lruCache.set('two', 2);
14
- * lruCache.set('three', 3); // Если кэш переполнен, удалится наименее недавно использованный или устаревший элемент
15
- * console.log(lruCache.get('one')); // undefined, если значение устарело или удалено
16
- * console.log(lruCache.get('two')); // 2
17
- */
18
- export class LRU {
19
- /**
20
- * Максимальное количество элементов в кэше
21
- */
22
- max;
23
- /**
24
- * Глобальный TTL (time-to-live) для каждого элемента в {@link Timestamp}.
25
- * Если не задан (`undefined`), элементы не устаревают глобально
26
- */
27
- ttl;
28
- /**
29
- * Внутреннее хранилище кэша.
30
- * Хранит значения вместе с информацией о времени истечения срока их действия
31
- */
32
- cache;
33
- /**
34
- * @param [max=200] - Максимальное количество элементов в кэше
35
- * @param ttl - Глобальный TTL (time-to-live) для каждого элемента в **минутах**
36
- * Если не задан, элементы не устаревают глобально
37
- */
38
- constructor(max = 200, ttl) {
39
- this.max = max;
40
- if (ttl)
41
- this.ttl = this.toTimeStamp(ttl);
42
- this.cache = new Map();
43
- }
44
- /**
45
- * Перевод минут в {@link Timestamp}
46
- */
47
- toTimeStamp(min) {
48
- return min * 60 * 1000;
49
- }
50
- /**
51
- * Проверяет, устарел ли элемент кэша
52
- *
53
- * @param entry - Элемент кэша для проверки
54
- * @returns `true`, если элемент устарел, иначе `false`
55
- */
56
- isExpired(entry) {
57
- return Boolean(entry.expired && Date.now() > entry.expired);
58
- }
59
- /**
60
- * Получает значение из кэша по ключу
61
- *
62
- * - Если элемент найден и не устарел, он перемещается в конец кэша (обновляется порядок использования)
63
- * - Если элемент устарел, он удаляется, и возвращается `undefined`
64
- *
65
- * @param key - Ключ для получения значения
66
- * @returns Значение из кэша или `undefined`, если ключ отсутствует или значение устарело
67
- */
68
- get(key) {
69
- const entry = this.cache.get(key);
70
- if (!entry)
71
- return undefined;
72
- // Если элемент устарел, удаляем его и возвращаем undefined
73
- if (this.isExpired(entry)) {
74
- this.cache.delete(key);
75
- return undefined;
76
- }
77
- // Обновляем порядок использования: удаляем и добавляем элемент в конец
78
- this.cache.delete(key);
79
- this.cache.set(key, entry);
80
- return entry.value;
81
- }
82
- /**
83
- * Устанавливает значение в кэш
84
- *
85
- * - Если ключ уже существует, его значение обновляется и перемещается в конец
86
- * - Если размер кэша превышает максимальное значение, производится очистка устаревших элементов
87
- * - Если после очистки кэш все еще переполнен, удаляется наименее недавно использованный элемент
88
- *
89
- * @param key - Ключ для установки значения
90
- * @param value - Значение для установки в кэш
91
- * @param ttl - Индивидуальный TTL для данного элемента в **минутах**. Если не задан, используется TTL экземпляра, если он установлен
92
- */
93
- set(key, value, ttl) {
94
- // Если ключ уже существует, удаляем его для обновления порядка использования
95
- if (this.cache.has(key))
96
- this.cache.delete(key);
97
- else {
98
- if (this.cache.size >= this.max) {
99
- // Если кэш достиг максимального размера, пробегаем по ключам и удаляем устаревшие элементы
100
- for (const key of this.cache.keys()) {
101
- const entry = this.cache.get(key);
102
- if (!entry || this.isExpired(entry)) {
103
- this.cache.delete(key);
104
- }
105
- }
106
- // Если после очистки устаревших значений кэш все еще переполнен, удаляем первый (наименее недавно использованный) элемент
107
- if (this.cache.size >= this.max) {
108
- const first = this.cache.keys().next().value;
109
- if (first !== undefined)
110
- this.cache.delete(first);
111
- }
112
- }
113
- }
114
- // Вычисляем время истечения для данного элемента
115
- // prettier-ignore
116
- const expired = ttl ? (Date.now() + this.toTimeStamp(ttl)) : (this.ttl ? (Date.now() + this.ttl) : undefined);
117
- this.cache.set(key, { value, expired });
118
- }
119
- /**
120
- * Очищает кэш
121
- */
122
- clear(key) {
123
- if (key)
124
- this.cache.delete(key);
125
- else
126
- this.cache.clear();
127
- }
128
- }
package/dist/queue.d.ts DELETED
@@ -1,40 +0,0 @@
1
- import type { Timestamp } from "./types.js";
2
- /**
3
- * Абстрактный класс очереди
4
- *
5
- * @template T - Тип элементов в очереди
6
- */
7
- export declare abstract class Queue<T> {
8
- _queue: T[];
9
- _delay: number;
10
- private timeout;
11
- /**
12
- * @param [delay=25] - Задержка (в миллисекундах) между обработкой элементов очереди
13
- */
14
- constructor(delay?: Timestamp);
15
- /**
16
- * Добавляет элемент в очередь и запускает обработку
17
- *
18
- * @param item - Элемент для добавления в очередь
19
- * @param run - Запуск очереди
20
- */
21
- protected push(item: T, run?: boolean): void;
22
- /**
23
- * Запускает обработку очереди с задержкой
24
- */
25
- run(): void;
26
- /**
27
- * Метод для обработки элемента очереди
28
- *
29
- * @param item - Элемент для обработки
30
- */
31
- protected abstract handle(item: T): void;
32
- /**
33
- * Сброс таймера шага
34
- */
35
- private stop;
36
- /**
37
- * Сброс очереди
38
- */
39
- reset(): void;
40
- }
package/dist/queue.js DELETED
@@ -1,56 +0,0 @@
1
- /**
2
- * Абстрактный класс очереди
3
- *
4
- * @template T - Тип элементов в очереди
5
- */
6
- export class Queue {
7
- _queue = [];
8
- _delay;
9
- timeout = 0;
10
- // noinspection TypeScriptAbstractClassConstructorCanBeMadeProtected
11
- /**
12
- * @param [delay=25] - Задержка (в миллисекундах) между обработкой элементов очереди
13
- */
14
- constructor(delay = 25) {
15
- this._delay = delay;
16
- }
17
- /**
18
- * Добавляет элемент в очередь и запускает обработку
19
- *
20
- * @param item - Элемент для добавления в очередь
21
- * @param run - Запуск очереди
22
- */
23
- push(item, run = true) {
24
- this._queue.push(item);
25
- if (run)
26
- this.run();
27
- }
28
- /**
29
- * Запускает обработку очереди с задержкой
30
- */
31
- run() {
32
- this.stop();
33
- this.timeout = setTimeout(() => {
34
- if (this._queue.length === 0)
35
- return this.stop();
36
- const item = this._queue.shift();
37
- this.handle(item);
38
- this._queue.length > 0 ? this.run() : this.stop();
39
- }, this._delay);
40
- }
41
- /**
42
- * Сброс таймера шага
43
- */
44
- stop() {
45
- if (this.timeout)
46
- clearTimeout(this.timeout);
47
- this.timeout = 0;
48
- }
49
- /**
50
- * Сброс очереди
51
- */
52
- reset() {
53
- this.stop();
54
- this._queue.length = 0;
55
- }
56
- }
package/dist/url.d.ts DELETED
@@ -1,61 +0,0 @@
1
- import type { CanBeNullable } from "./types.js";
2
- /**
3
- * Возможные значения параметра для {@link pushParams} и {@link clearParams}
4
- */
5
- export type ParamValue = CanBeNullable<string | number | boolean>;
6
- /**
7
- * KV-параметры для URL для {@link pushParams} и {@link clearParams}
8
- */
9
- export type ParamKV<V extends ParamValue = ParamValue> = {
10
- key: string;
11
- value?: V;
12
- };
13
- /**
14
- * Параметры для URL для {@link pushParams} и {@link clearParams}
15
- */
16
- export type Params<V extends ParamValue = ParamValue> = CanBeNullable<string | ParamKV<V>>[];
17
- /**
18
- * Добавляет параметры в URL
19
- *
20
- * Для каждого параметра из массива:
21
- * - Если параметр равен `null` или `undefined`, он пропускается
22
- * - Если параметр имеет тип `string`, то в строке запроса добавляется параметр с ключом равным значению строки и значением `"true"`
23
- * - Если параметр является объектом с ключом и значением, то, если значение не `undefined` и не является объектом, оно приводится к строке и устанавливается в качестве значения
24
- *
25
- * **Небезопасное поведение:**
26
- * - При передаче параметра типа `string` он добавляется как `?param1&param2` (без значения, то есть без `true`)
27
- * - При передаче параметра, значение которого равно `true` или пустой строке, параметр добавляется без значения
28
- *
29
- * @param url - URL, в который будут добавлены параметры
30
- * @param params - Массив параметров
31
- * @param [unsafe=false] - Небезопасное поведение
32
- */
33
- export declare const pushParams: (url: URL, params: Params, unsafe?: boolean) => URL;
34
- export type StrictPushParams = Required<ParamKV<string | boolean | number>>[];
35
- /**
36
- * Объединяет массивы параметров для {@link pushParams} в один массив, исключая дубликаты
37
- *
38
- * @param args - Массивы параметров для объединения
39
- * @returns Массив параметров без дубликатов
40
- */
41
- export declare const mergePushParams: (...args: Params[]) => StrictPushParams;
42
- /**
43
- * Удаляет из URL параметры
44
- *
45
- * Для каждого элемента массива:
46
- * - Если параметр отсутствует или равен `null` или `undefined`, он пропускается
47
- * - Если параметр имеет тип `string`, из URL удаляется параметр с таким именем
48
- * - Если параметр является объектом с ключом (`key`), из URL удаляется параметр с этим ключом
49
- *
50
- * @param url - URL, из которого будут удалены параметры
51
- * @param params - Массив параметров для удаления
52
- */
53
- export declare const clearParams: (url: URL, params: Params) => URL;
54
- export type StrictClearParams = string[];
55
- /**
56
- * Объединяет массивы параметров для {@link clearParams} в один массив, исключая дубликаты
57
- *
58
- * @param args - Массивы параметров для объединения
59
- * @returns Массив параметров без дубликатов
60
- */
61
- export declare const mergeClearParams: (...args: Params[]) => StrictClearParams;