@nemigo/helpers 0.13.1 → 0.13.3

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,5 +1,6 @@
1
+ import { AsyncLocalStorage } from "async_hooks";
1
2
  export declare abstract class AsyncSpace<TX> {
2
- private async_storage;
3
+ __async_storage: AsyncLocalStorage<TX[]>;
3
4
  getTX(): TX[];
4
5
  space<T>(call: (tx: TX[]) => Promise<T>, auto?: boolean): Promise<T>;
5
6
  commit(): Promise<void>;
@@ -1,19 +1,19 @@
1
1
  import { AsyncLocalStorage } from "async_hooks";
2
2
  export class AsyncSpace {
3
- async_storage = new AsyncLocalStorage();
3
+ __async_storage = new AsyncLocalStorage();
4
4
  getTX() {
5
- const ctx = this.async_storage.getStore();
5
+ const ctx = this.__async_storage.getStore();
6
6
  if (ctx)
7
7
  return ctx;
8
8
  throw new Error("getTX() called outside of space()");
9
9
  }
10
10
  async space(call, auto = true) {
11
- const ctx = this.async_storage.getStore();
11
+ const ctx = this.__async_storage.getStore();
12
12
  if (ctx)
13
13
  return call(ctx);
14
14
  // Создаем новое пространство
15
15
  const tx = [];
16
- const result = await this.async_storage.run(tx, () => call(tx));
16
+ const result = await this.__async_storage.run(tx, () => call(tx));
17
17
  // Автоматически выполняем транзакции, если они есть и включен автокоммит
18
18
  if (auto && tx.length > 0) {
19
19
  await this.submit(tx);
@@ -22,7 +22,7 @@ export class AsyncSpace {
22
22
  return result;
23
23
  }
24
24
  async commit() {
25
- const ctx = this.async_storage.getStore();
25
+ const ctx = this.__async_storage.getStore();
26
26
  if (!ctx)
27
27
  throw new Error("commit() called outside of space()");
28
28
  await this.submit(ctx);
@@ -0,0 +1,539 @@
1
+ /**
2
+ * RGB цвет (красный, зелёный, синий)
3
+ */
4
+ export interface RGB {
5
+ /**
6
+ * Красный канал (0-255)
7
+ */
8
+ r: number;
9
+ /**
10
+ * Зелёный канал (0-255)
11
+ */
12
+ g: number;
13
+ /**
14
+ * Синий канал (0-255)
15
+ */
16
+ b: number;
17
+ }
18
+ /**
19
+ * RGBA цвет (красный, зелёный, синий, альфа)
20
+ */
21
+ export interface RGBA extends RGB {
22
+ /**
23
+ * Прозрачность (0-1)
24
+ */
25
+ a: number;
26
+ }
27
+ /**
28
+ * HSL цвет (оттенок, насыщенность, яркость)
29
+ */
30
+ export interface HSL {
31
+ /**
32
+ * Оттенок (0-360)
33
+ */
34
+ h: number;
35
+ /**
36
+ * Насыщенность (0-100)
37
+ */
38
+ s: number;
39
+ /**
40
+ * Яркость (0-100)
41
+ */
42
+ l: number;
43
+ }
44
+ /**
45
+ * HSLA цвет (оттенок, насыщенность, яркость, альфа)
46
+ */
47
+ export interface HSLA extends HSL {
48
+ /**
49
+ * Прозрачность (0-1)
50
+ */
51
+ a: number;
52
+ }
53
+ /**
54
+ * HSV цвет (оттенок, насыщенность, значение)
55
+ */
56
+ export interface HSV {
57
+ /**
58
+ * Оттенок (0-360)
59
+ */
60
+ h: number;
61
+ /**
62
+ * Насыщенность (0-100)
63
+ */
64
+ s: number;
65
+ /**
66
+ * Значение (0-100)
67
+ */
68
+ v: number;
69
+ }
70
+ /**
71
+ * HSVA цвет (оттенок, насыщенность, значение, альфа)
72
+ */
73
+ export interface HSVA extends HSV {
74
+ /**
75
+ * Прозрачность (0-1)
76
+ */
77
+ a: number;
78
+ }
79
+ /**
80
+ * HEX цвет в формате "#RRGGBB"
81
+ */
82
+ export type HEX = string;
83
+ /**
84
+ * HEXA цвет в формате "#RRGGBBAA"
85
+ */
86
+ export type HEXA = string;
87
+ /**
88
+ * Ограничивает значение RGB-канала в диапазоне 0-255
89
+ */
90
+ export declare const clampRgb: (value: number) => number;
91
+ /**
92
+ * Ограничивает оттенок в диапазоне 0-360
93
+ */
94
+ export declare const clampHue: (value: number) => number;
95
+ /**
96
+ * Ограничивает процентное значение в диапазоне 0-100
97
+ */
98
+ export declare const clampPercent: (value: number) => number;
99
+ /**
100
+ * Ограничивает значение альфа-канала в диапазоне 0-1
101
+ */
102
+ export declare const clampAlpha: (value: number) => number;
103
+ /**
104
+ * Парсит HEX-строку в RGB или RGBA
105
+ *
106
+ * Поддерживаемые форматы:
107
+ * - #RGB
108
+ * - #RRGGBB
109
+ * - #RGBA
110
+ * - #RRGGBBAA
111
+ *
112
+ * @param hex - HEX-строка цвета
113
+ * @returns RGB или RGBA объект, или null если формат неверен
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * parseHex("#ff0000"); // { r: 255, g: 0, b: 0 }
118
+ * parseHex("#f00"); // { r: 255, g: 0, b: 0 }
119
+ * parseHex("#ff0000ff"); // { r: 255, g: 0, b: 0, a: 1 }
120
+ * parseHex("#f00f"); // { r: 255, g: 0, b: 0, a: 1 }
121
+ * parseHex("invalid"); // null
122
+ * ```
123
+ */
124
+ export declare const parseHex: (hex: string) => RGB | RGBA | null;
125
+ /**
126
+ * Парсит RGB/RGBA строку в объект
127
+ *
128
+ * Поддерживаемые форматы:
129
+ * - rgb(r, g, b)
130
+ * - rgba(r, g, b, a)
131
+ * - rgb(r g b)
132
+ * - rgba(r g b / a)
133
+ *
134
+ * @param rgb - RGB/RGBA строка
135
+ * @returns RGB или RGBA объект, или null если формат неверен
136
+ *
137
+ * @example
138
+ * ```typescript
139
+ * parseRgb("rgb(255, 0, 0)"); // { r: 255, g: 0, b: 0 }
140
+ * parseRgb("rgba(255, 0, 0, 0.5)"); // { r: 255, g: 0, b: 0, a: 0.5 }
141
+ * parseRgb("rgb(255 0 0)"); // { r: 255, g: 0, b: 0 }
142
+ * parseRgb("rgba(255 0 0 / 0.5)"); // { r: 255, g: 0, b: 0, a: 0.5 }
143
+ * ```
144
+ */
145
+ export declare const parseRgb: (rgb: string) => RGB | RGBA | null;
146
+ /**
147
+ * Парсит HSL/HSLA строку в объект
148
+ *
149
+ * Поддерживаемые форматы:
150
+ * - hsl(h, s%, l%)
151
+ * - hsla(h, s%, l%, a)
152
+ * - hsl(h s% l%)
153
+ * - hsla(h s% l% / a)
154
+ *
155
+ * @param hsl - HSL/HSLA строка
156
+ * @returns HSL или HSLA объект, или null если формат неверен
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * parseHsl("hsl(0, 100%, 50%)"); // { h: 0, s: 100, l: 50 }
161
+ * parseHsl("hsla(0, 100%, 50%, 0.5)"); // { h: 0, s: 100, l: 50, a: 0.5 }
162
+ * parseHsl("hsl(0 100% 50%)"); // { h: 0, s: 100, l: 50 }
163
+ * ```
164
+ */
165
+ export declare const parseHsl: (hsl: string) => HSL | HSLA | null;
166
+ /**
167
+ * Универсальный парсер цвета
168
+ *
169
+ * Пробует распознать формат и парсит соответствующим парсером
170
+ *
171
+ * @param color - Строка цвета в любом поддерживаемом формате
172
+ * @returns RGB или RGBA объект, или null если формат не распознан
173
+ *
174
+ * @example
175
+ * ```typescript
176
+ * parseColor("#ff0000"); // { r: 255, g: 0, b: 0 }
177
+ * parseColor("rgb(255, 0, 0)"); // { r: 255, g: 0, b: 0 }
178
+ * parseColor("hsl(0, 100%, 50%)"); // { r: 255, g: 0, b: 0 }
179
+ * ```
180
+ */
181
+ export declare const parseColor: (color: string) => RGB | RGBA | null;
182
+ /**
183
+ * Конвертирует RGB/RGBA в HEX/HEXA строку
184
+ *
185
+ * @param rgb - RGB или RGBA объект
186
+ * @returns HEX строка в формате #RRGGBB или #RRGGBBAA
187
+ *
188
+ * @example
189
+ * ```typescript
190
+ * rgbToHex({ r: 255, g: 0, b: 0 }); // "#ff0000"
191
+ * rgbToHex({ r: 255, g: 0, b: 0, a: 0.5 }); // "#ff000080"
192
+ * ```
193
+ */
194
+ export declare const rgbToHex: (rgb: RGB | RGBA) => HEX | HEXA;
195
+ /**
196
+ * Конвертирует HEX строку в RGB/RGBA объект
197
+ *
198
+ * @param hex - HEX строка
199
+ * @returns RGB или RGBA объект
200
+ * @throws {Error} Если формат HEX неверен
201
+ *
202
+ * @example
203
+ * ```typescript
204
+ * hexToRgb("#ff0000"); // { r: 255, g: 0, b: 0 }
205
+ * hexToRgb("#f00"); // { r: 255, g: 0, b: 0 }
206
+ * ```
207
+ */
208
+ export declare const hexToRgb: (hex: string) => RGB | RGBA;
209
+ /**
210
+ * Конвертирует RGB/RGBA в HSL/HSLA
211
+ *
212
+ * @param rgb - RGB или RGBA объект
213
+ * @returns HSL или HSLA объект
214
+ *
215
+ * @example
216
+ * ```typescript
217
+ * rgbToHsl({ r: 255, g: 0, b: 0 }); // { h: 0, s: 100, l: 50 }
218
+ * rgbToHsl({ r: 255, g: 255, b: 255 }); // { h: 0, s: 0, l: 100 }
219
+ * ```
220
+ */
221
+ export declare const rgbToHsl: (rgb: RGB | RGBA) => HSL | HSLA;
222
+ /**
223
+ * Конвертирует HSL/HSLA в RGB/RGBA
224
+ *
225
+ * @param hsl - HSL или HSLA объект
226
+ * @returns RGB или RGBA объект
227
+ *
228
+ * @example
229
+ * ```typescript
230
+ * hslToRgb({ h: 0, s: 100, l: 50 }); // { r: 255, g: 0, b: 0 }
231
+ * hslToRgb({ h: 0, s: 0, l: 100 }); // { r: 255, g: 255, b: 255 }
232
+ * ```
233
+ */
234
+ export declare const hslToRgb: (hsl: HSL | HSLA) => RGB | RGBA;
235
+ /**
236
+ * Конвертирует RGB/RGBA в HSV/HSVA
237
+ *
238
+ * @param rgb - RGB или RGBA объект
239
+ * @returns HSV или HSVA объект
240
+ *
241
+ * @example
242
+ * ```typescript
243
+ * rgbToHsv({ r: 255, g: 0, b: 0 }); // { h: 0, s: 100, v: 100 }
244
+ * rgbToHsv({ r: 0, g: 0, b: 0 }); // { h: 0, s: 0, v: 0 }
245
+ * ```
246
+ */
247
+ export declare const rgbToHsv: (rgb: RGB | RGBA) => HSV | HSVA;
248
+ /**
249
+ * Конвертирует HSV/HSVA в RGB/RGBA
250
+ *
251
+ * @param hsv - HSV или HSVA объект
252
+ * @returns RGB или RGBA объект
253
+ *
254
+ * @example
255
+ * ```typescript
256
+ * hsvToRgb({ h: 0, s: 100, v: 100 }); // { r: 255, g: 0, b: 0 }
257
+ * hsvToRgb({ h: 0, s: 0, v: 0 }); // { r: 0, g: 0, b: 0 }
258
+ * ```
259
+ */
260
+ export declare const hsvToRgb: (hsv: HSV | HSVA) => RGB | RGBA;
261
+ /**
262
+ * Форматирует RGB/RGBA в CSS-строку
263
+ *
264
+ * @param rgb - RGB или RGBA объект
265
+ * @returns CSS-строка в формате rgb(r, g, b) или rgba(r, g, b, a)
266
+ *
267
+ * @example
268
+ * ```typescript
269
+ * toRgbString({ r: 255, g: 0, b: 0 }); // "rgb(255, 0, 0)"
270
+ * toRgbString({ r: 255, g: 0, b: 0, a: 0.5 }); // "rgba(255, 0, 0, 0.5)"
271
+ * ```
272
+ */
273
+ export declare const toRgbString: (rgb: RGB | RGBA) => string;
274
+ /**
275
+ * Форматирует RGB/RGBA в HEX-строку
276
+ *
277
+ * @param rgb - RGB или RGBA объект
278
+ * @returns HEX-строка в формате #RRGGBB или #RRGGBBAA
279
+ *
280
+ * @example
281
+ * ```typescript
282
+ * toHexString({ r: 255, g: 0, b: 0 }); // "#ff0000"
283
+ * toHexString({ r: 255, g: 0, b: 0, a: 0.5 }); // "#ff000080"
284
+ * ```
285
+ */
286
+ export declare const toHexString: (rgb: RGB | RGBA) => string;
287
+ /**
288
+ * Форматирует HSL/HSLA в CSS-строку
289
+ *
290
+ * @param hsl - HSL или HSLA объект
291
+ * @returns CSS-строка в формате hsl(h, s%, l%) или hsla(h, s%, l%, a)
292
+ *
293
+ * @example
294
+ * ```typescript
295
+ * toHslString({ h: 0, s: 100, l: 50 }); // "hsl(0, 100%, 50%)"
296
+ * toHslString({ h: 0, s: 100, l: 50, a: 0.5 }); // "hsla(0, 100%, 50%, 0.5)"
297
+ * ```
298
+ */
299
+ export declare const toHslString: (hsl: HSL | HSLA) => string;
300
+ /**
301
+ * Вычисляет относительную яркость цвета по формуле WCAG
302
+ *
303
+ * @param rgb - RGB объект
304
+ * @returns Относительная яркость (0-1)
305
+ *
306
+ * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * getLuminance({ r: 255, g: 255, b: 255 }); // 1 (белый)
311
+ * getLuminance({ r: 0, g: 0, b: 0 }); // 0 (чёрный)
312
+ * getLuminance({ r: 255, g: 0, b: 0 }); // 0.2126 (красный)
313
+ * ```
314
+ */
315
+ export declare const getLuminance: (rgb: RGB) => number;
316
+ /**
317
+ * Вычисляет контрастность между двумя цветами по формуле WCAG
318
+ *
319
+ * @param rgb1 - Первый RGB объект
320
+ * @param rgb2 - Второй RGB объект
321
+ * @returns Коэффициент контрастности (1-21)
322
+ *
323
+ * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef
324
+ *
325
+ * @example
326
+ * ```typescript
327
+ * getContrast({ r: 255, g: 255, b: 255 }, { r: 0, g: 0, b: 0 }); // 21 (максимальный контраст)
328
+ * getContrast({ r: 255, g: 255, b: 255 }, { r: 255, g: 255, b: 255 }); // 1 (нет контраста)
329
+ * ```
330
+ */
331
+ export declare const getContrast: (rgb1: RGB, rgb2: RGB) => number;
332
+ /**
333
+ * Класс для работы с цветами
334
+ *
335
+ * Поддерживает конвертацию между форматами, манипуляции с цветом и вычисление характеристик
336
+ *
337
+ * @example
338
+ * ```typescript
339
+ * const color = new Color("#ff0000");
340
+ * color.rgb; // { r: 255, g: 0, b: 0 }
341
+ * color.hex; // "#ff0000"
342
+ * color.lighten(20).hex; // "#ff6666"
343
+ * color.luminance(); // 0.2126
344
+ * ```
345
+ */
346
+ export declare class Color {
347
+ private _rgb;
348
+ /**
349
+ * Создаёт экземпляр Color
350
+ *
351
+ * @param color - Строка цвета или RGB/RGBA объект
352
+ * @throws {Error} Если формат цвета не распознан
353
+ *
354
+ * @example
355
+ * ```typescript
356
+ * new Color("#ff0000");
357
+ * new Color("rgb(255, 0, 0)");
358
+ * new Color({ r: 255, g: 0, b: 0 });
359
+ * new Color({ r: 255, g: 0, b: 0, a: 0.5 });
360
+ * ```
361
+ */
362
+ constructor(color: string | RGB | RGBA);
363
+ /**
364
+ * Получает RGB представление цвета
365
+ */
366
+ get rgb(): RGB;
367
+ /**
368
+ * Получает RGBA представление цвета
369
+ */
370
+ get rgba(): RGBA;
371
+ /**
372
+ * Получает HSL представление цвета
373
+ */
374
+ get hsl(): HSL;
375
+ /**
376
+ * Получает HSLA представление цвета
377
+ */
378
+ get hsla(): HSLA;
379
+ /**
380
+ * Получает HSV представление цвета
381
+ */
382
+ get hsv(): HSV;
383
+ /**
384
+ * Получает HSVA представление цвета
385
+ */
386
+ get hsva(): HSVA;
387
+ /**
388
+ * Получает HEX представление цвета
389
+ */
390
+ get hex(): string;
391
+ /**
392
+ * Осветляет цвет
393
+ *
394
+ * @param amount - Процент осветления (0-100)
395
+ * @returns Новый экземпляр Color
396
+ *
397
+ * @example
398
+ * ```typescript
399
+ * new Color("#ff0000").lighten(20).hex; // "#ff6666"
400
+ * ```
401
+ */
402
+ lighten(amount: number): Color;
403
+ /**
404
+ * Затемняет цвет
405
+ *
406
+ * @param amount - Процент затемнения (0-100)
407
+ * @returns Новый экземпляр Color
408
+ *
409
+ * @example
410
+ * ```typescript
411
+ * new Color("#ff0000").darken(20).hex; // "#990000"
412
+ * ```
413
+ */
414
+ darken(amount: number): Color;
415
+ /**
416
+ * Увеличивает насыщенность цвета
417
+ *
418
+ * @param amount - Процент увеличения насыщенности (0-100)
419
+ * @returns Новый экземпляр Color
420
+ *
421
+ * @example
422
+ * ```typescript
423
+ * new Color("#ff6666").saturate(50).hex; // "#ff1a1a"
424
+ * ```
425
+ */
426
+ saturate(amount: number): Color;
427
+ /**
428
+ * Уменьшает насыщенность цвета
429
+ *
430
+ * @param amount - Процент уменьшения насыщенности (0-100)
431
+ * @returns Новый экземпляр Color
432
+ *
433
+ * @example
434
+ * ```typescript
435
+ * new Color("#ff0000").desaturate(50).hex; // "#bf4040"
436
+ * ```
437
+ */
438
+ desaturate(amount: number): Color;
439
+ /**
440
+ * Устанавливает прозрачность цвета
441
+ *
442
+ * @param alpha - Значение альфа-канала (0-1)
443
+ * @returns Новый экземпляр Color
444
+ *
445
+ * @example
446
+ * ```typescript
447
+ * new Color("#ff0000").opacity(0.5).hex; // "#ff000080"
448
+ * ```
449
+ */
450
+ opacity(alpha: number): Color;
451
+ /**
452
+ * Инвертирует цвет
453
+ *
454
+ * @returns Новый экземпляр Color
455
+ *
456
+ * @example
457
+ * ```typescript
458
+ * new Color("#ff0000").invert().hex; // "#00ffff"
459
+ * ```
460
+ */
461
+ invert(): Color;
462
+ /**
463
+ * Смешивает цвет с другим цветом
464
+ *
465
+ * @param color - Цвет для смешивания
466
+ * @param weight - Вес первого цвета (0-1), по умолчанию 0.5
467
+ * @returns Новый экземпляр Color
468
+ *
469
+ * @example
470
+ * ```typescript
471
+ * new Color("#ff0000").mix(new Color("#0000ff")).hex; // "#800080"
472
+ * new Color("#ff0000").mix(new Color("#0000ff"), 0.75).hex; // "#bf0040"
473
+ * ```
474
+ */
475
+ mix(color: Color, weight?: number): Color;
476
+ /**
477
+ * Вычисляет относительную яркость цвета
478
+ *
479
+ * @returns Относительная яркость (0-1)
480
+ *
481
+ * @example
482
+ * ```typescript
483
+ * new Color("#ffffff").luminance(); // 1
484
+ * new Color("#000000").luminance(); // 0
485
+ * ```
486
+ */
487
+ luminance(): number;
488
+ /**
489
+ * Вычисляет контрастность с другим цветом
490
+ *
491
+ * @param color - Цвет для сравнения
492
+ * @returns Коэффициент контрастности (1-21)
493
+ *
494
+ * @example
495
+ * ```typescript
496
+ * new Color("#ffffff").contrast(new Color("#000000")); // 21
497
+ * new Color("#ffffff").contrast(new Color("#ffffff")); // 1
498
+ * ```
499
+ */
500
+ contrast(color: Color): number;
501
+ /**
502
+ * Проверяет, является ли цвет светлым
503
+ *
504
+ * @returns true, если яркость > 0.5
505
+ *
506
+ * @example
507
+ * ```typescript
508
+ * new Color("#ffffff").isLight(); // true
509
+ * new Color("#000000").isLight(); // false
510
+ * ```
511
+ */
512
+ isLight(): boolean;
513
+ /**
514
+ * Проверяет, является ли цвет тёмным
515
+ *
516
+ * @returns true, если яркость <= 0.5
517
+ *
518
+ * @example
519
+ * ```typescript
520
+ * new Color("#000000").isDark(); // true
521
+ * new Color("#ffffff").isDark(); // false
522
+ * ```
523
+ */
524
+ isDark(): boolean;
525
+ /**
526
+ * Преобразует цвет в строку
527
+ *
528
+ * @param format - Формат вывода (hex, rgb, hsl), по умолчанию hex
529
+ * @returns Строковое представление цвета
530
+ *
531
+ * @example
532
+ * ```typescript
533
+ * new Color("#ff0000").toString(); // "#ff0000"
534
+ * new Color("#ff0000").toString("rgb"); // "rgb(255, 0, 0)"
535
+ * new Color("#ff0000").toString("hsl"); // "hsl(0, 100%, 50%)"
536
+ * ```
537
+ */
538
+ toString(format?: "hex" | "rgb" | "hsl"): string;
539
+ }