@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.
- package/dist/aggregator.d.ts +33 -0
- package/dist/aggregator.js +44 -0
- package/dist/array.d.ts +33 -0
- package/dist/array.js +24 -0
- package/dist/async/context.d.ts +73 -0
- package/dist/async/context.js +90 -0
- package/dist/async/future.d.ts +54 -0
- package/dist/async/future.js +71 -0
- package/dist/async/index.d.ts +56 -27
- package/dist/async/index.js +63 -58
- package/dist/async/loader.d.ts +67 -0
- package/dist/async/loader.js +101 -0
- package/dist/async/queue.d.ts +51 -0
- package/dist/async/queue.js +84 -0
- package/dist/cases.d.ts +31 -21
- package/dist/cases.js +41 -37
- package/dist/clean.d.ts +44 -26
- package/dist/clean.js +67 -42
- package/dist/color/types.d.ts +31 -0
- package/dist/color/types.js +1 -0
- package/dist/datetime/delta.d.ts +28 -0
- package/dist/datetime/delta.js +65 -0
- package/dist/datetime/format.d.ts +53 -0
- package/dist/datetime/format.js +119 -0
- package/dist/datetime/index.d.ts +6 -0
- package/dist/datetime/index.js +22 -0
- package/dist/datetime/plural.d.ts +77 -0
- package/dist/datetime/plural.js +78 -0
- package/dist/emitter.d.ts +29 -17
- package/dist/emitter.js +35 -21
- package/dist/explorer.d.ts +22 -29
- package/dist/explorer.js +18 -16
- package/dist/files.d.ts +31 -2
- package/dist/files.js +33 -8
- package/dist/fish.d.ts +29 -0
- package/dist/fish.js +70 -0
- package/dist/html/cookie.d.ts +48 -0
- package/dist/html/cookie.js +37 -0
- package/dist/html/events.d.ts +133 -0
- package/dist/html/events.js +139 -0
- package/dist/html/index.d.ts +31 -0
- package/dist/html/index.js +61 -0
- package/dist/index.d.ts +38 -40
- package/dist/index.js +43 -56
- package/dist/jiff/apply.d.ts +93 -0
- package/dist/jiff/apply.js +64 -0
- package/dist/jiff/extract.d.ts +7 -0
- package/dist/jiff/extract.js +82 -0
- package/dist/jiff/types.d.ts +57 -0
- package/dist/jiff/types.js +1 -0
- package/dist/lens.d.ts +20 -31
- package/dist/lens.js +22 -37
- package/dist/msgpack.d.ts +11 -26
- package/dist/msgpack.js +9 -21
- package/dist/mutate.d.ts +70 -0
- package/dist/mutate.js +130 -0
- package/dist/omitter.d.ts +54 -34
- package/dist/omitter.js +33 -25
- package/dist/path.d.ts +20 -1
- package/dist/path.js +21 -2
- package/dist/phymath/format.d.ts +60 -0
- package/dist/phymath/format.js +34 -0
- package/dist/phymath/index.d.ts +30 -30
- package/dist/phymath/index.js +41 -33
- package/dist/promoter.d.ts +20 -12
- package/dist/promoter.js +24 -17
- package/dist/random.d.ts +20 -21
- package/dist/random.js +22 -23
- package/dist/rubles.d.ts +24 -0
- package/dist/rubles.js +24 -0
- package/dist/script.d.ts +60 -13
- package/dist/script.js +46 -10
- package/dist/string.d.ts +46 -92
- package/dist/string.js +46 -171
- package/dist/types.d.ts +144 -25
- package/dist/url/index.d.ts +12 -0
- package/dist/url/index.js +17 -0
- package/dist/url/params.d.ts +141 -0
- package/dist/{url.js → url/params.js} +90 -18
- package/dist/url/slug.d.ts +28 -0
- package/dist/url/slug.js +102 -0
- package/dist/veil.d.ts +14 -0
- package/dist/veil.js +26 -0
- package/dist/xod.d.ts +237 -16
- package/dist/xod.js +192 -18
- package/dist/zipper.d.ts +22 -4
- package/dist/zipper.js +22 -5
- package/package.json +82 -34
- package/dist/async/space.d.ts +0 -8
- package/dist/async/space.js +0 -31
- package/dist/cleanup.d.ts +0 -9
- package/dist/cleanup.js +0 -18
- package/dist/colors.d.ts +0 -539
- package/dist/colors.js +0 -888
- package/dist/cookie.d.ts +0 -60
- package/dist/cookie.js +0 -48
- package/dist/datetime.d.ts +0 -82
- package/dist/datetime.js +0 -161
- package/dist/format.d.ts +0 -36
- package/dist/format.js +0 -26
- package/dist/future.d.ts +0 -51
- package/dist/future.js +0 -71
- package/dist/html.d.ts +0 -145
- package/dist/html.js +0 -205
- package/dist/humanly.d.ts +0 -9
- package/dist/humanly.js +0 -93
- package/dist/lru.d.ts +0 -77
- package/dist/lru.js +0 -128
- package/dist/queue.d.ts +0 -40
- package/dist/queue.js +0 -56
- 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
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Не изменяет исходный
|
|
19
|
+
* Использует внутри {@link deepCleanArray}
|
|
20
|
+
*
|
|
21
|
+
* - Не изменяет исходный объект и объекты внутри
|
|
22
|
+
* - Удаляет значения: `null`, `undefined`, пустые строки `""`
|
|
23
|
+
* - После очистки удаляет объекты и массивы, ставшие пустыми
|
|
6
24
|
*
|
|
7
|
-
* @
|
|
8
|
-
* @param data - Объект или значение для очистки
|
|
9
|
-
* @returns Очищенная копия объекта или исходное значение, если это не объект
|
|
25
|
+
* @remarks **НЕ** предназначен для работы с декларативными методами (могут потерять `this`)
|
|
10
26
|
*
|
|
11
27
|
* @example
|
|
12
28
|
* ```typescript
|
|
13
|
-
* const
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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(
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* //
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* //
|
|
33
|
-
*
|
|
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
|
|
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
|
-
*
|
|
4
|
-
* После очистки удаляет объекты и массивы, ставшие пустыми.
|
|
5
|
-
* Не изменяет исходный объект.
|
|
39
|
+
* Использует внутри {@link deepCleanArray}
|
|
6
40
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
41
|
+
* - Не изменяет исходный объект и объекты внутри
|
|
42
|
+
* - Удаляет значения: `null`, `undefined`, пустые строки `""`
|
|
43
|
+
* - После очистки удаляет объекты и массивы, ставшие пустыми
|
|
44
|
+
*
|
|
45
|
+
* @remarks **НЕ** предназначен для работы с декларативными методами (могут потерять `this`)
|
|
10
46
|
*
|
|
11
47
|
* @example
|
|
12
48
|
* ```typescript
|
|
13
|
-
* const
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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(
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* //
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* //
|
|
33
|
-
*
|
|
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
|
|
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
|
|
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 =
|
|
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;
|