@nemigo/helpers 0.13.2 → 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 +57 -34
  58. package/dist/omitter.js +38 -30
  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 +23 -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 -7
  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 -50
  102. package/dist/future.js +0 -59
  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 -39
  110. package/dist/queue.js +0 -54
  111. package/dist/url.d.ts +0 -61
package/dist/clean.d.ts CHANGED
@@ -1,37 +1,55 @@
1
+ /**
2
+ * Рекурсивно очищает массив от "пустых" значений.
3
+ * Использует внутри {@link deepCleanObject}
4
+ *
5
+ * - Не изменяет исходный массив и объекты внутри
6
+ * - Удаляет значения: `null`, `undefined`, пустые строки `""`
7
+ * - После очистки удаляет объекты и массивы, ставшие пустыми
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const array = [1, null, "", { a: "", b: 2 }, undefined];
12
+ * const cleanedArray = deepCleanArray(array);
13
+ * console.log(cleanedArray); // [1, { b: 2 }]
14
+ * ```
15
+ */
16
+ export declare const deepCleanArray: <T = unknown>(array: T[]) => T[];
1
17
  /**
2
18
  * Глубоко очищает объект (включая массивы) от "пустых" значений с созданием копии.
3
- * Удаляет значения: `null`, `undefined`, пустые строки `""`.
4
- * После очистки удаляет объекты и массивы, ставшие пустыми.
5
- * Не изменяет исходный объект.
19
+ * Использует внутри {@link deepCleanArray}
20
+ *
21
+ * - Не изменяет исходный объект и объекты внутри
22
+ * - Удаляет значения: `null`, `undefined`, пустые строки `""`
23
+ * - После очистки удаляет объекты и массивы, ставшие пустыми
6
24
  *
7
- * @template O - Тип исходного объекта
8
- * @param data - Объект или значение для очистки
9
- * @returns Очищенная копия объекта или исходное значение, если это не объект
25
+ * @remarks **НЕ** предназначен для работы с декларативными методами (могут потерять `this`)
10
26
  *
11
27
  * @example
12
28
  * ```typescript
13
- * const original = {
14
- * a: 1,
15
- * b: null,
16
- * c: {
17
- * d: '',
18
- * e: { f: undefined },
19
- * g: [1, null, '', { h: undefined }]
29
+ * const obj = {
30
+ * users: [
31
+ * { name: "John", age: 30, email: "" },
32
+ * { name: "", age: null, email: "test@example.com" },
33
+ * { name: "Alice", age: 25, email: undefined }
34
+ * ],
35
+ * settings: {
36
+ * theme: "dark",
37
+ * notifications: null,
38
+ * preferences: {}
20
39
  * }
21
40
  * };
22
41
  *
23
- * const cleaned = deepObjectClean(original);
24
- * console.log(cleaned); // { a: 1 }
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
42
+ * const cleaned = deepObjectClean(obj);
43
+ * // {
44
+ * // users: [
45
+ * // { name: "John", age: 30 },
46
+ * // { email: "test@example.com" },
47
+ * // { name: "Alice", age: 25 }
48
+ * // ],
49
+ * // settings: {
50
+ * // theme: "dark"
51
+ * // }
52
+ * // }
35
53
  * ```
36
54
  */
37
- export declare const deepObjectClean: <O>(data: O) => O;
55
+ export declare const deepCleanObject: <O = unknown>(data: O) => O;
package/dist/clean.js CHANGED
@@ -1,63 +1,88 @@
1
+ /**
2
+ * Рекурсивно очищает массив от "пустых" значений.
3
+ * Использует внутри {@link deepCleanObject}
4
+ *
5
+ * - Не изменяет исходный массив и объекты внутри
6
+ * - Удаляет значения: `null`, `undefined`, пустые строки `""`
7
+ * - После очистки удаляет объекты и массивы, ставшие пустыми
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const array = [1, null, "", { a: "", b: 2 }, undefined];
12
+ * const cleanedArray = deepCleanArray(array);
13
+ * console.log(cleanedArray); // [1, { b: 2 }]
14
+ * ```
15
+ */
16
+ export const deepCleanArray = (array) => array.reduce((acc, value) => {
17
+ // Пропускаем явно пустые примитивы
18
+ if (value === "" || value === null || value === undefined)
19
+ return acc;
20
+ // Рекурсивно обрабатываем объекты и массивы
21
+ if (typeof value === "object") {
22
+ const cleaned = deepCleanObject(value);
23
+ // Проверяем не стал ли объект/массив пустым после очистки
24
+ if (Array.isArray(cleaned) && cleaned.length > 0) {
25
+ acc.push(cleaned);
26
+ }
27
+ else if (!Array.isArray(cleaned) && Object.keys(cleaned).length > 0) {
28
+ acc.push(cleaned);
29
+ }
30
+ }
31
+ else {
32
+ // Сохраняем непустые примитивы
33
+ acc.push(value);
34
+ }
35
+ return acc;
36
+ }, []);
1
37
  /**
2
38
  * Глубоко очищает объект (включая массивы) от "пустых" значений с созданием копии.
3
- * Удаляет значения: `null`, `undefined`, пустые строки `""`.
4
- * После очистки удаляет объекты и массивы, ставшие пустыми.
5
- * Не изменяет исходный объект.
39
+ * Использует внутри {@link deepCleanArray}
6
40
  *
7
- * @template O - Тип исходного объекта
8
- * @param data - Объект или значение для очистки
9
- * @returns Очищенная копия объекта или исходное значение, если это не объект
41
+ * - Не изменяет исходный объект и объекты внутри
42
+ * - Удаляет значения: `null`, `undefined`, пустые строки `""`
43
+ * - После очистки удаляет объекты и массивы, ставшие пустыми
44
+ *
45
+ * @remarks **НЕ** предназначен для работы с декларативными методами (могут потерять `this`)
10
46
  *
11
47
  * @example
12
48
  * ```typescript
13
- * const original = {
14
- * a: 1,
15
- * b: null,
16
- * c: {
17
- * d: '',
18
- * e: { f: undefined },
19
- * g: [1, null, '', { h: undefined }]
49
+ * const obj = {
50
+ * users: [
51
+ * { name: "John", age: 30, email: "" },
52
+ * { name: "", age: null, email: "test@example.com" },
53
+ * { name: "Alice", age: 25, email: undefined }
54
+ * ],
55
+ * settings: {
56
+ * theme: "dark",
57
+ * notifications: null,
58
+ * preferences: {}
20
59
  * }
21
60
  * };
22
61
  *
23
- * const cleaned = deepObjectClean(original);
24
- * console.log(cleaned); // { a: 1 }
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
62
+ * const cleaned = deepObjectClean(obj);
63
+ * // {
64
+ * // users: [
65
+ * // { name: "John", age: 30 },
66
+ * // { email: "test@example.com" },
67
+ * // { name: "Alice", age: 25 }
68
+ * // ],
69
+ * // settings: {
70
+ * // theme: "dark"
71
+ * // }
72
+ * // }
35
73
  * ```
36
74
  */
37
- export const deepObjectClean = (data) => {
75
+ export const deepCleanObject = (data) => {
38
76
  if (typeof data !== "object" || data === null)
39
77
  return data;
40
- if (Array.isArray(data)) {
41
- return data.reduce((acc, value) => {
42
- if (value !== "" && value !== null && value !== undefined) {
43
- if (typeof value === "object") {
44
- const cleaned = deepObjectClean(value);
45
- if (Object.keys(cleaned).length !== 0)
46
- acc.push(cleaned);
47
- }
48
- else {
49
- acc.push(value);
50
- }
51
- }
52
- return acc;
53
- }, []);
54
- }
78
+ if (Array.isArray(data))
79
+ return deepCleanArray(data);
55
80
  const result = {};
56
81
  for (const key in data) {
57
82
  const value = data[key];
58
83
  if (value !== "" && value !== null && value !== undefined) {
59
84
  if (typeof value === "object") {
60
- const cleaned = deepObjectClean(value);
85
+ const cleaned = deepCleanObject(value);
61
86
  if (Object.keys(cleaned).length !== 0)
62
87
  result[key] = cleaned;
63
88
  }
@@ -0,0 +1,31 @@
1
+ import type { Cortege } from "../types.js";
2
+ export type RGB = [r: number, g: number, b: number] | Cortege<3>;
3
+ export type RGBA = [r: number, g: number, b: number, a: number] | Cortege<4>;
4
+ /**
5
+ * - h: оттенок, 0-360
6
+ * - s: насыщенность, 0-100
7
+ * - l: яркость, 0-100
8
+ */
9
+ export type HSL = [h: number, s: number, l: number] | Cortege<3>;
10
+ /**
11
+ * - h: оттенок, 0-360
12
+ * - s: насыщенность, 0-100
13
+ * - l: яркость, 0-100
14
+ * - a: альфа, 0-1
15
+ */
16
+ export type HSLA = [h: number, s: number, l: number, a: number] | Cortege<4>;
17
+ /**
18
+ * - h: оттенок, 0-360
19
+ * - s: насыщенность, 0-100
20
+ * - v: значение, 0-100
21
+ */
22
+ export type HSV = [h: number, s: number, v: number] | Cortege<3>;
23
+ /**
24
+ * - h: оттенок, 0-360
25
+ * - s: насыщенность, 0-100
26
+ * - v: значение, 0-100
27
+ * - a: альфа, 0-1
28
+ */
29
+ export type HSVA = [h: number, s: number, v: number, a: number] | Cortege<4>;
30
+ export type HEX = string;
31
+ export type HEXA = string;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ import type { RoundMethod } from "../phymath/index.js";
2
+ import type { Timestamp } from "../types.js";
3
+ export declare const MS_IN_SECOND = 1000;
4
+ export declare const MS_IN_MINUTE: number;
5
+ export declare const MS_IN_HOUR: number;
6
+ export declare const MS_IN_DAY: number;
7
+ export declare const MS_IN_WEEK: number;
8
+ export declare const formatPerformanceDelta: (start: Timestamp, end?: Timestamp) => string;
9
+ /**
10
+ * Дельта-объект времени для {@link timeDeltaObjectToTimestamp}
11
+ */
12
+ export interface TimeDeltaObject {
13
+ w?: number;
14
+ d?: number;
15
+ h?: number;
16
+ m?: number;
17
+ s?: number;
18
+ ms?: number;
19
+ }
20
+ /**
21
+ * Опции для {@link timeDeltaObjectToTimestamp}
22
+ */
23
+ export interface TimeDeltaDeltaObjectToTimestampOptions {
24
+ round_key?: keyof TimeDeltaObject;
25
+ round_method?: RoundMethod;
26
+ in_seconds?: boolean;
27
+ }
28
+ export declare const timeDeltaObjectToTimestamp: (obj: TimeDeltaObject, options?: TimeDeltaDeltaObjectToTimestampOptions) => number;
@@ -0,0 +1,65 @@
1
+ import { round } from "../phymath/index.js";
2
+ export const MS_IN_SECOND = 1000;
3
+ export const MS_IN_MINUTE = 60 * MS_IN_SECOND;
4
+ export const MS_IN_HOUR = 60 * MS_IN_MINUTE;
5
+ export const MS_IN_DAY = 24 * MS_IN_HOUR;
6
+ export const MS_IN_WEEK = 7 * MS_IN_DAY;
7
+ export const formatPerformanceDelta = (start, end = Date.now()) => {
8
+ const diff = end - start;
9
+ if (diff < 1000)
10
+ return diff + "ms";
11
+ return diff / 1000 + "s";
12
+ };
13
+ export const timeDeltaObjectToTimestamp = (obj, options = {}) => {
14
+ const { round_key, round_method, in_seconds = false } = options;
15
+ // Вычисляем общее время в миллисекундах
16
+ let totalMs = 0;
17
+ if (obj.w)
18
+ totalMs += obj.w * MS_IN_WEEK;
19
+ if (obj.d)
20
+ totalMs += obj.d * MS_IN_DAY;
21
+ if (obj.h)
22
+ totalMs += obj.h * MS_IN_HOUR;
23
+ if (obj.m)
24
+ totalMs += obj.m * MS_IN_MINUTE;
25
+ if (obj.s)
26
+ totalMs += obj.s * MS_IN_SECOND;
27
+ if (obj.ms)
28
+ totalMs += obj.ms;
29
+ // Применяем округление если указано
30
+ if (round_key) {
31
+ let unitValue;
32
+ switch (round_key) {
33
+ case "w":
34
+ unitValue = MS_IN_WEEK;
35
+ break;
36
+ case "d":
37
+ unitValue = MS_IN_DAY;
38
+ break;
39
+ case "h":
40
+ unitValue = MS_IN_HOUR;
41
+ break;
42
+ case "m":
43
+ unitValue = MS_IN_MINUTE;
44
+ break;
45
+ case "s":
46
+ unitValue = MS_IN_SECOND;
47
+ break;
48
+ case "ms":
49
+ unitValue = 1;
50
+ break;
51
+ default:
52
+ unitValue = 1;
53
+ }
54
+ // Преобразуем в нужные единицы, округляем и возвращаем к миллисекундам
55
+ const valueInUnits = totalMs / unitValue;
56
+ const roundedValue = round(valueInUnits, 0, round_method);
57
+ totalMs = roundedValue * unitValue;
58
+ }
59
+ // Если нужен результат в секундах
60
+ if (in_seconds) {
61
+ const seconds = totalMs / MS_IN_SECOND;
62
+ return round(seconds, 0, round_method);
63
+ }
64
+ return totalMs;
65
+ };
@@ -0,0 +1,53 @@
1
+ import type { DateTime } from "../types.js";
2
+ /**
3
+ * Полные названия месяцев на русском языке (родительный падеж)
4
+ */
5
+ export declare const months: string[];
6
+ /**
7
+ * Сокращенные названия месяцев на русском языке
8
+ */
9
+ export declare const abbs: string[];
10
+ /**
11
+ * Шаблонизатор для форматирования даты и времени
12
+ *
13
+ * **Поддерживаемые токены:**
14
+ * - `TS` - секунды (00-59)
15
+ * - `TM` - минуты (00-59)
16
+ * - `TH` - часы (00-23)
17
+ * - `DD` - день месяца (01-31)
18
+ * - `DM` - месяц числом (01-12)
19
+ * - `DFM` - месяц полным названием (января, февраля, ...)
20
+ * - `DAM` - месяц сокращённым названием (янв, фев, ...)
21
+ * - `DY` - год (4 цифры)
22
+ *
23
+ * @param datetime - Дата и время для форматирования
24
+ * @param [format="DD.DM.DY TH:TM"] - Шаблон форматирования с токенами
25
+ * @param [timezone] - Часовой пояс в часах относительно UTC
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * // Базовое использование
30
+ * formatDateTime(new Date(), "DD.DM.DY TH:TM:TS");
31
+ * // "09.10.2023 14:30:59"
32
+ *
33
+ * // Форматирование с полными названиями месяцев
34
+ * formatDateTime(Date.now(), "DD DFM DY");
35
+ * // "09 октября 2023"
36
+ *
37
+ * // Сокращенные названия месяцев
38
+ * formatDateTime("2023-12-25", "DD DAM DY");
39
+ * // "25 дек 2023"
40
+ *
41
+ * // С указанием в нужном часовом поясе
42
+ * formatDateTime(Date.now(), "DD.DM.DY TH:TM", 3); // По МСК
43
+ * // "09.10.2023 17:30" (если по UTC время 14:30)
44
+ * ```
45
+ */
46
+ export declare const formatDateTime: (datetime?: DateTime, format?: string, timezone?: number) => string;
47
+ /**
48
+ * Готовый пресет {@link formatDateTime} для форматирования в московском часовом поясе (МСК +3)
49
+ *
50
+ * @param datetime - Дата и время для форматирования
51
+ * @param [format="DD.DM.DY TH:TM (МСК)"] - Шаблон форматирования с токенами
52
+ */
53
+ export declare const formatMSK: (datetime?: DateTime, format?: string) => string;
@@ -0,0 +1,119 @@
1
+ import { MS_IN_MINUTE } from "./delta.js";
2
+ import { pad } from "../index.js";
3
+ /**
4
+ * Полные названия месяцев на русском языке (родительный падеж)
5
+ */
6
+ export const months = [
7
+ "января",
8
+ "февраля",
9
+ "марта",
10
+ "апреля",
11
+ "мая",
12
+ "июня",
13
+ "июля",
14
+ "августа",
15
+ "сентября",
16
+ "октября",
17
+ "ноября",
18
+ "декабря",
19
+ ];
20
+ /**
21
+ * Сокращенные названия месяцев на русском языке
22
+ */
23
+ export const abbs = [
24
+ "янв",
25
+ "фев",
26
+ "марта",
27
+ "апр",
28
+ "мая",
29
+ "июня",
30
+ "июля",
31
+ "авг",
32
+ "сен",
33
+ "окт",
34
+ "ноя",
35
+ "дек",
36
+ ];
37
+ /**
38
+ * Шаблонизатор для форматирования даты и времени
39
+ *
40
+ * **Поддерживаемые токены:**
41
+ * - `TS` - секунды (00-59)
42
+ * - `TM` - минуты (00-59)
43
+ * - `TH` - часы (00-23)
44
+ * - `DD` - день месяца (01-31)
45
+ * - `DM` - месяц числом (01-12)
46
+ * - `DFM` - месяц полным названием (января, февраля, ...)
47
+ * - `DAM` - месяц сокращённым названием (янв, фев, ...)
48
+ * - `DY` - год (4 цифры)
49
+ *
50
+ * @param datetime - Дата и время для форматирования
51
+ * @param [format="DD.DM.DY TH:TM"] - Шаблон форматирования с токенами
52
+ * @param [timezone] - Часовой пояс в часах относительно UTC
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * // Базовое использование
57
+ * formatDateTime(new Date(), "DD.DM.DY TH:TM:TS");
58
+ * // "09.10.2023 14:30:59"
59
+ *
60
+ * // Форматирование с полными названиями месяцев
61
+ * formatDateTime(Date.now(), "DD DFM DY");
62
+ * // "09 октября 2023"
63
+ *
64
+ * // Сокращенные названия месяцев
65
+ * formatDateTime("2023-12-25", "DD DAM DY");
66
+ * // "25 дек 2023"
67
+ *
68
+ * // С указанием в нужном часовом поясе
69
+ * formatDateTime(Date.now(), "DD.DM.DY TH:TM", 3); // По МСК
70
+ * // "09.10.2023 17:30" (если по UTC время 14:30)
71
+ * ```
72
+ */
73
+ export const formatDateTime = (datetime = Date.now(), format = "DD.DM.DY TH:TM", timezone) => {
74
+ const base = new Date(datetime);
75
+ const useTimezone = timezone !== undefined;
76
+ const shiftMinutes = useTimezone ? Math.round(timezone * 60) : 0;
77
+ const shifted = useTimezone ? new Date(base.valueOf() + shiftMinutes * MS_IN_MINUTE) : base;
78
+ const seconds = useTimezone ? shifted.getUTCSeconds() : shifted.getSeconds();
79
+ const minutes = useTimezone ? shifted.getUTCMinutes() : shifted.getMinutes();
80
+ const hours = useTimezone ? shifted.getUTCHours() : shifted.getHours();
81
+ const day = useTimezone ? shifted.getUTCDate() : shifted.getDate();
82
+ const monthIndex = useTimezone ? shifted.getUTCMonth() : shifted.getMonth();
83
+ const year = useTimezone ? shifted.getUTCFullYear() : shifted.getFullYear();
84
+ const replacements = {
85
+ TS: pad(seconds),
86
+ TM: pad(minutes),
87
+ TH: pad(hours),
88
+ DD: pad(day),
89
+ DM: pad(monthIndex + 1),
90
+ DFM: months[monthIndex],
91
+ DAM: abbs[monthIndex],
92
+ DY: year.toString(),
93
+ };
94
+ const result = [];
95
+ let position = 0;
96
+ while (position < format.length) {
97
+ let tokenFound = false;
98
+ for (const token in replacements) {
99
+ if (format.startsWith(token, position)) {
100
+ result.push(replacements[token]);
101
+ position += token.length;
102
+ tokenFound = true;
103
+ break;
104
+ }
105
+ }
106
+ if (!tokenFound) {
107
+ result.push(format[position]);
108
+ position++;
109
+ }
110
+ }
111
+ return result.join("");
112
+ };
113
+ /**
114
+ * Готовый пресет {@link formatDateTime} для форматирования в московском часовом поясе (МСК +3)
115
+ *
116
+ * @param datetime - Дата и время для форматирования
117
+ * @param [format="DD.DM.DY TH:TM (МСК)"] - Шаблон форматирования с токенами
118
+ */
119
+ export const formatMSK = (datetime, format = "DD.DM.DY TH:TM (МСК)") => formatDateTime(datetime, format, 3);
@@ -0,0 +1,6 @@
1
+ export declare const isEqualDay: (a: Date, b: Date) => boolean;
2
+ export declare const isToday: (date: Date) => boolean;
3
+ export declare const isYesterday: (date: Date) => boolean;
4
+ export declare const isDayBeforeYesterday: (date: Date) => boolean;
5
+ export declare const isTomorrow: (date: Date) => boolean;
6
+ export declare const isDayAfterTomorrow: (date: Date) => boolean;
@@ -0,0 +1,22 @@
1
+ export const isEqualDay = (a, b) => a.toDateString() === b.toDateString();
2
+ export const isToday = (date) => isEqualDay(date, new Date());
3
+ export const isYesterday = (date) => {
4
+ const target = new Date();
5
+ target.setDate(target.getDate() - 1);
6
+ return isEqualDay(date, target);
7
+ };
8
+ export const isDayBeforeYesterday = (date) => {
9
+ const target = new Date();
10
+ target.setDate(target.getDate() - 2);
11
+ return isEqualDay(date, target);
12
+ };
13
+ export const isTomorrow = (date) => {
14
+ const target = new Date();
15
+ target.setDate(target.getDate() + 1);
16
+ return isEqualDay(date, target);
17
+ };
18
+ export const isDayAfterTomorrow = (date) => {
19
+ const target = new Date();
20
+ target.setDate(target.getDate() + 2);
21
+ return isEqualDay(date, target);
22
+ };
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Склонение слова "секунда" в зависимости от числа
3
+ *
4
+ * @example
5
+ * ```typescript
6
+ * pluralSeconds(1); // "секунда"
7
+ * pluralSeconds(3); // "секунды"
8
+ * pluralSeconds(155); // "секунд"
9
+ * ```
10
+ */
11
+ export declare const pluralSeconds: (value: number) => string;
12
+ /**
13
+ * Склонение слова "минута" в зависимости от числа
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * pluralMinutes(1); // "минута"
18
+ * pluralMinutes(3); // "минуты"
19
+ * pluralMinutes(155); // "минут"
20
+ * ```
21
+ */
22
+ export declare const pluralMinutes: (value: number) => string;
23
+ /**
24
+ * Склонение слова "час" в зависимости от числа
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * pluralHours(1); // "час"
29
+ * pluralHours(3); // "часа"
30
+ * pluralHours(155); // "часов"
31
+ * ```
32
+ */
33
+ export declare const pluralHours: (value: number) => string;
34
+ /**
35
+ * Склонение слова "день" в зависимости от числа
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * pluralDays(1); // "день"
40
+ * pluralDays(3); // "дня"
41
+ * pluralDays(155); // "дней"
42
+ * ```
43
+ */
44
+ export declare const pluralDays: (value: number) => string;
45
+ /**
46
+ * Склонение слова "неделя" в зависимости от числа
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * pluralWeeks(1); // "неделя"
51
+ * pluralWeeks(3); // "недели"
52
+ * pluralWeeks(155); // "недель"
53
+ * ```
54
+ */
55
+ export declare const pluralWeeks: (value: number) => string;
56
+ /**
57
+ * Склонение слова "месяц" в зависимости от числа
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * pluralMonths(1); // "месяц"
62
+ * pluralMonths(3); // "месяца"
63
+ * pluralMonths(155); // "месяцев"
64
+ * ```
65
+ */
66
+ export declare const pluralMonths: (value: number) => string;
67
+ /**
68
+ * Склонение слова "год" в зависимости от числа
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * pluralYears(1); // "год"
73
+ * pluralYears(3); // "года"
74
+ * pluralYears(155); // "лет"
75
+ * ```
76
+ */
77
+ export declare const pluralYears: (value: number) => string;