react-native-lich-am 1.0.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/LICENSE +21 -0
- package/README.md +248 -0
- package/core/index.d.ts +1 -0
- package/core/index.js +1 -0
- package/core/package.json +5 -0
- package/dataset/2024.d.ts +1 -0
- package/dataset/2024.js +1 -0
- package/dataset/2025.d.ts +1 -0
- package/dataset/2025.js +1 -0
- package/dataset/2026.d.ts +1 -0
- package/dataset/2026.js +1 -0
- package/dataset/2027.d.ts +1 -0
- package/dataset/2027.js +1 -0
- package/dataset/2028.d.ts +1 -0
- package/dataset/2028.js +1 -0
- package/dataset/index.d.ts +1 -0
- package/dataset/index.js +1 -0
- package/dataset/package.json +5 -0
- package/lib/core/astro.d.ts +43 -0
- package/lib/core/astro.js +203 -0
- package/lib/core/canchi.d.ts +47 -0
- package/lib/core/canchi.js +78 -0
- package/lib/core/constants.d.ts +54 -0
- package/lib/core/constants.js +141 -0
- package/lib/core/day.d.ts +30 -0
- package/lib/core/day.js +103 -0
- package/lib/core/format.d.ts +26 -0
- package/lib/core/format.js +60 -0
- package/lib/core/huong.d.ts +26 -0
- package/lib/core/huong.js +44 -0
- package/lib/core/index.d.ts +16 -0
- package/lib/core/index.js +32 -0
- package/lib/core/lunar.d.ts +39 -0
- package/lib/core/lunar.js +130 -0
- package/lib/core/tietkhi.d.ts +40 -0
- package/lib/core/tietkhi.js +115 -0
- package/lib/core/truc.d.ts +47 -0
- package/lib/core/truc.js +70 -0
- package/lib/core/types.d.ts +66 -0
- package/lib/core/types.js +3 -0
- package/lib/dataset/2024.d.ts +30 -0
- package/lib/dataset/2024.js +69 -0
- package/lib/dataset/2025.d.ts +30 -0
- package/lib/dataset/2025.js +69 -0
- package/lib/dataset/2026.d.ts +30 -0
- package/lib/dataset/2026.js +69 -0
- package/lib/dataset/2027.d.ts +30 -0
- package/lib/dataset/2027.js +69 -0
- package/lib/dataset/2028.d.ts +30 -0
- package/lib/dataset/2028.js +69 -0
- package/lib/dataset/data/days-2024.json +1 -0
- package/lib/dataset/data/days-2025.json +1 -0
- package/lib/dataset/data/days-2026.json +1 -0
- package/lib/dataset/data/days-2027.json +1 -0
- package/lib/dataset/data/days-2028.json +1 -0
- package/lib/dataset/data/dict.json +1 -0
- package/lib/dataset/data/gio-table.json +1 -0
- package/lib/dataset/decode.d.ts +225 -0
- package/lib/dataset/decode.js +285 -0
- package/lib/dataset/index.d.ts +37 -0
- package/lib/dataset/index.js +87 -0
- package/lib/index.d.ts +21 -0
- package/lib/index.js +37 -0
- package/lib/ui/LunarCalendar.d.ts +58 -0
- package/lib/ui/LunarCalendar.js +311 -0
- package/lib/ui/LunarDayDetail.d.ts +32 -0
- package/lib/ui/LunarDayDetail.js +221 -0
- package/lib/ui/index.d.ts +9 -0
- package/lib/ui/index.js +18 -0
- package/lib/ui/theme.d.ts +46 -0
- package/lib/ui/theme.js +60 -0
- package/package.json +431 -0
- package/ui/index.d.ts +1 -0
- package/ui/index.js +1 -0
- package/ui/package.json +5 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Chuyển đổi dương lịch ⇄ âm lịch (âm lịch Việt Nam, múi giờ UTC+7).
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getLunarMonthDays = exports.getLeapMonthOfYear = exports.lunarToSolar = exports.solarToLunar = void 0;
|
|
7
|
+
const constants_1 = require("./constants");
|
|
8
|
+
const astro_1 = require("./astro");
|
|
9
|
+
/**
|
|
10
|
+
* Dương lịch → âm lịch.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* solarToLunar(10, 2, 2024) // Tết Giáp Thìn → { day: 1, month: 1, year: 2024, leap: false }
|
|
14
|
+
*/
|
|
15
|
+
function solarToLunar(day, month, year, timeZone = constants_1.TZ_VN) {
|
|
16
|
+
const dayNumber = (0, astro_1.jdFromDate)(day, month, year);
|
|
17
|
+
const k = (0, astro_1.int)((dayNumber - 2415021.076998695) / 29.530588853);
|
|
18
|
+
let monthStart = (0, astro_1.getNewMoonDay)(k + 1, timeZone);
|
|
19
|
+
if (monthStart > dayNumber) {
|
|
20
|
+
monthStart = (0, astro_1.getNewMoonDay)(k, timeZone);
|
|
21
|
+
}
|
|
22
|
+
let a11 = (0, astro_1.getLunarMonth11)(year, timeZone);
|
|
23
|
+
let b11 = a11;
|
|
24
|
+
let lunarYear;
|
|
25
|
+
if (a11 >= monthStart) {
|
|
26
|
+
lunarYear = year;
|
|
27
|
+
a11 = (0, astro_1.getLunarMonth11)(year - 1, timeZone);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
lunarYear = year + 1;
|
|
31
|
+
b11 = (0, astro_1.getLunarMonth11)(year + 1, timeZone);
|
|
32
|
+
}
|
|
33
|
+
const lunarDay = dayNumber - monthStart + 1;
|
|
34
|
+
const diff = (0, astro_1.int)((monthStart - a11) / 29);
|
|
35
|
+
let lunarLeap = false;
|
|
36
|
+
let lunarMonth = diff + 11;
|
|
37
|
+
if (b11 - a11 > 365) {
|
|
38
|
+
const leapMonthDiff = (0, astro_1.getLeapMonthOffset)(a11, timeZone);
|
|
39
|
+
if (diff >= leapMonthDiff) {
|
|
40
|
+
lunarMonth = diff + 10;
|
|
41
|
+
if (diff === leapMonthDiff) {
|
|
42
|
+
lunarLeap = true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (lunarMonth > 12) {
|
|
47
|
+
lunarMonth -= 12;
|
|
48
|
+
}
|
|
49
|
+
if (lunarMonth >= 11 && diff < 4) {
|
|
50
|
+
lunarYear -= 1;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
day: lunarDay,
|
|
54
|
+
month: lunarMonth,
|
|
55
|
+
year: lunarYear,
|
|
56
|
+
leap: lunarLeap,
|
|
57
|
+
jd: dayNumber,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
exports.solarToLunar = solarToLunar;
|
|
61
|
+
/**
|
|
62
|
+
* Âm lịch → dương lịch.
|
|
63
|
+
*
|
|
64
|
+
* @returns ngày dương lịch, hoặc `null` nếu tổ hợp âm lịch không tồn tại
|
|
65
|
+
* (ví dụ yêu cầu tháng nhuận nhưng năm đó không có tháng nhuận đó).
|
|
66
|
+
*/
|
|
67
|
+
function lunarToSolar(day, month, year, leap = false, timeZone = constants_1.TZ_VN) {
|
|
68
|
+
let a11;
|
|
69
|
+
let b11;
|
|
70
|
+
if (month < 11) {
|
|
71
|
+
a11 = (0, astro_1.getLunarMonth11)(year - 1, timeZone);
|
|
72
|
+
b11 = (0, astro_1.getLunarMonth11)(year, timeZone);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
a11 = (0, astro_1.getLunarMonth11)(year, timeZone);
|
|
76
|
+
b11 = (0, astro_1.getLunarMonth11)(year + 1, timeZone);
|
|
77
|
+
}
|
|
78
|
+
let off = month - 11;
|
|
79
|
+
if (off < 0) {
|
|
80
|
+
off += 12;
|
|
81
|
+
}
|
|
82
|
+
if (b11 - a11 > 365) {
|
|
83
|
+
const leapOff = (0, astro_1.getLeapMonthOffset)(a11, timeZone);
|
|
84
|
+
let leapMonth = leapOff - 2;
|
|
85
|
+
if (leapMonth < 0) {
|
|
86
|
+
leapMonth += 12;
|
|
87
|
+
}
|
|
88
|
+
if (leap && month !== leapMonth) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
if (leap || off >= leapOff) {
|
|
92
|
+
off += 1;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const k = (0, astro_1.int)(0.5 + (a11 - 2415021.076998695) / 29.530588853);
|
|
96
|
+
const monthStart = (0, astro_1.getNewMoonDay)(k + off, timeZone);
|
|
97
|
+
const jd = monthStart + day - 1;
|
|
98
|
+
const [d, m, y] = (0, astro_1.jdToDate)(jd);
|
|
99
|
+
return { day: d, month: m, year: y, jd };
|
|
100
|
+
}
|
|
101
|
+
exports.lunarToSolar = lunarToSolar;
|
|
102
|
+
/** Tháng âm `month` của năm âm `year` có phải tháng nhuận hay không */
|
|
103
|
+
function getLeapMonthOfYear(year, timeZone = constants_1.TZ_VN) {
|
|
104
|
+
const a11 = (0, astro_1.getLunarMonth11)(year - 1, timeZone);
|
|
105
|
+
const b11 = (0, astro_1.getLunarMonth11)(year, timeZone);
|
|
106
|
+
if (b11 - a11 <= 365) {
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
109
|
+
const leapOff = (0, astro_1.getLeapMonthOffset)(a11, timeZone);
|
|
110
|
+
let leapMonth = leapOff - 2;
|
|
111
|
+
if (leapMonth < 0) {
|
|
112
|
+
leapMonth += 12;
|
|
113
|
+
}
|
|
114
|
+
return leapMonth;
|
|
115
|
+
}
|
|
116
|
+
exports.getLeapMonthOfYear = getLeapMonthOfYear;
|
|
117
|
+
/** Số ngày của một tháng âm (29 hoặc 30) */
|
|
118
|
+
function getLunarMonthDays(month, year, leap = false, timeZone = constants_1.TZ_VN) {
|
|
119
|
+
const first = lunarToSolar(1, month, year, leap, timeZone);
|
|
120
|
+
if (!first) {
|
|
121
|
+
return 0;
|
|
122
|
+
}
|
|
123
|
+
const next = lunarToSolar(1, month === 12 ? 1 : month + 1, month === 12 ? year + 1 : year, false, timeZone);
|
|
124
|
+
if (!next) {
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
const diff = next.jd - first.jd;
|
|
128
|
+
return diff > 0 && diff < 32 ? diff : 0;
|
|
129
|
+
}
|
|
130
|
+
exports.getLunarMonthDays = getLunarMonthDays;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiết khí (24 tiết) và "tháng tiết khí" (Kiến tháng) dùng cho Trực.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Cung 15° của kinh độ mặt trời, giá trị 0..23. `arc * 15°` là kinh độ mặt trời; 0 = Xuân phân.
|
|
6
|
+
*
|
|
7
|
+
* Lấy tại **cuối ngày địa phương**, tức tiết khí đang hiệu lực lúc 24:00.
|
|
8
|
+
* Tiết khí được ấn định cho ngày mà thời điểm giao tiết rơi vào, chứ không phải
|
|
9
|
+
* theo vị trí mặt trời lúc 00:00 — nếu lấy mốc đầu ngày thì những tiết giao vào
|
|
10
|
+
* buổi sáng/tối sẽ bị lùi sang hôm sau (sai 96 ngày trên dữ liệu đối chiếu).
|
|
11
|
+
*/
|
|
12
|
+
export declare function getSunArc(jd: number, timeZone?: number): number;
|
|
13
|
+
export interface TietKhi {
|
|
14
|
+
/** id 1..24, theo quy ước: 1 = Xuân phân, 19 = Đông chí */
|
|
15
|
+
id: number;
|
|
16
|
+
name: string;
|
|
17
|
+
/** Kinh độ mặt trời tại điểm bắt đầu tiết (độ) */
|
|
18
|
+
longitude: number;
|
|
19
|
+
/** Ngày dương lịch bắt đầu tiết này */
|
|
20
|
+
start: {
|
|
21
|
+
day: number;
|
|
22
|
+
month: number;
|
|
23
|
+
year: number;
|
|
24
|
+
};
|
|
25
|
+
/** JD của ngày bắt đầu tiết */
|
|
26
|
+
startJd: number;
|
|
27
|
+
}
|
|
28
|
+
/** Tiết khí của một ngày (theo JD) */
|
|
29
|
+
export declare function getTietKhi(jd: number, timeZone?: number): TietKhi;
|
|
30
|
+
/**
|
|
31
|
+
* Chi của "tháng tiết khí" (Kiến tháng) — dùng để tính Trực.
|
|
32
|
+
*
|
|
33
|
+
* Lập xuân → Dần, Kinh trập → Mão, Thanh minh → Thìn, …
|
|
34
|
+
* Trả về chỉ số địa chi 0..11 (0 = Tý).
|
|
35
|
+
*/
|
|
36
|
+
export declare function getTietKhiMonthChi(jd: number, timeZone?: number): number;
|
|
37
|
+
/** Danh sách 24 tiết khí của một năm dương lịch, kèm ngày bắt đầu */
|
|
38
|
+
export declare function getTietKhiOfYear(year: number, timeZone?: number): TietKhi[];
|
|
39
|
+
/** JD của ngày sóc gần nhất trước hoặc bằng `jd` */
|
|
40
|
+
export declare function getMonthStart(jd: number, timeZone?: number): number;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tiết khí (24 tiết) và "tháng tiết khí" (Kiến tháng) dùng cho Trực.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getMonthStart = exports.getTietKhiOfYear = exports.getTietKhiMonthChi = exports.getTietKhi = exports.getSunArc = void 0;
|
|
7
|
+
const constants_1 = require("./constants");
|
|
8
|
+
const astro_1 = require("./astro");
|
|
9
|
+
/**
|
|
10
|
+
* Cung 15° của kinh độ mặt trời, giá trị 0..23. `arc * 15°` là kinh độ mặt trời; 0 = Xuân phân.
|
|
11
|
+
*
|
|
12
|
+
* Lấy tại **cuối ngày địa phương**, tức tiết khí đang hiệu lực lúc 24:00.
|
|
13
|
+
* Tiết khí được ấn định cho ngày mà thời điểm giao tiết rơi vào, chứ không phải
|
|
14
|
+
* theo vị trí mặt trời lúc 00:00 — nếu lấy mốc đầu ngày thì những tiết giao vào
|
|
15
|
+
* buổi sáng/tối sẽ bị lùi sang hôm sau (sai 96 ngày trên dữ liệu đối chiếu).
|
|
16
|
+
*/
|
|
17
|
+
function getSunArc(jd, timeZone = constants_1.TZ_VN) {
|
|
18
|
+
const l = (0, astro_1.sunLongitude)(jd + 0.5 - timeZone / 24);
|
|
19
|
+
return (0, astro_1.int)((l / Math.PI) * 12);
|
|
20
|
+
}
|
|
21
|
+
exports.getSunArc = getSunArc;
|
|
22
|
+
function arcToId(arc) {
|
|
23
|
+
const id = (arc + 1) % 24;
|
|
24
|
+
return id === 0 ? 24 : id;
|
|
25
|
+
}
|
|
26
|
+
function jdToYmd(jd) {
|
|
27
|
+
// tách riêng để tránh import vòng
|
|
28
|
+
let a;
|
|
29
|
+
let b;
|
|
30
|
+
let c;
|
|
31
|
+
if (jd > 2299160) {
|
|
32
|
+
a = jd + 32044;
|
|
33
|
+
b = (0, astro_1.int)((4 * a + 3) / 146097);
|
|
34
|
+
c = a - (0, astro_1.int)((b * 146097) / 4);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
b = 0;
|
|
38
|
+
c = jd + 32082;
|
|
39
|
+
}
|
|
40
|
+
const d = (0, astro_1.int)((4 * c + 3) / 1461);
|
|
41
|
+
const e = c - (0, astro_1.int)((1461 * d) / 4);
|
|
42
|
+
const m = (0, astro_1.int)((5 * e + 2) / 153);
|
|
43
|
+
return {
|
|
44
|
+
day: e - (0, astro_1.int)((153 * m + 2) / 5) + 1,
|
|
45
|
+
month: m + 3 - 12 * (0, astro_1.int)(m / 10),
|
|
46
|
+
year: b * 100 + d - 4800 + (0, astro_1.int)(m / 10),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Tiết khí của một ngày (theo JD) */
|
|
50
|
+
function getTietKhi(jd, timeZone = constants_1.TZ_VN) {
|
|
51
|
+
const arc = getSunArc(jd, timeZone);
|
|
52
|
+
const id = arcToId(arc);
|
|
53
|
+
const meta = constants_1.TIET_KHI[id - 1];
|
|
54
|
+
// lùi về ngày bắt đầu tiết hiện tại
|
|
55
|
+
let startJd = jd;
|
|
56
|
+
while (getSunArc(startJd - 1, timeZone) === arc) {
|
|
57
|
+
startJd -= 1;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
id,
|
|
61
|
+
name: meta.name,
|
|
62
|
+
longitude: meta.lon,
|
|
63
|
+
startJd,
|
|
64
|
+
start: jdToYmd(startJd),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
exports.getTietKhi = getTietKhi;
|
|
68
|
+
/**
|
|
69
|
+
* Chi của "tháng tiết khí" (Kiến tháng) — dùng để tính Trực.
|
|
70
|
+
*
|
|
71
|
+
* Lập xuân → Dần, Kinh trập → Mão, Thanh minh → Thìn, …
|
|
72
|
+
* Trả về chỉ số địa chi 0..11 (0 = Tý).
|
|
73
|
+
*/
|
|
74
|
+
function getTietKhiMonthChi(jd, timeZone = constants_1.TZ_VN) {
|
|
75
|
+
const arc = getSunArc(jd, timeZone);
|
|
76
|
+
return (((arc + 1) >> 1) + 3) % 12;
|
|
77
|
+
}
|
|
78
|
+
exports.getTietKhiMonthChi = getTietKhiMonthChi;
|
|
79
|
+
/** Danh sách 24 tiết khí của một năm dương lịch, kèm ngày bắt đầu */
|
|
80
|
+
function getTietKhiOfYear(year, timeZone = constants_1.TZ_VN) {
|
|
81
|
+
const out = [];
|
|
82
|
+
const jdStart = (() => {
|
|
83
|
+
// 01/01 dương lịch
|
|
84
|
+
const a = (0, astro_1.int)((14 - 1) / 12);
|
|
85
|
+
const y = year + 4800 - a;
|
|
86
|
+
const m = 1 + 12 * a - 3;
|
|
87
|
+
return 1 + (0, astro_1.int)((153 * m + 2) / 5) + 365 * y + (0, astro_1.int)(y / 4) - (0, astro_1.int)(y / 100) + (0, astro_1.int)(y / 400) - 32045;
|
|
88
|
+
})();
|
|
89
|
+
let jd = jdStart;
|
|
90
|
+
let lastId = -1;
|
|
91
|
+
while (true) {
|
|
92
|
+
const tk = getTietKhi(jd, timeZone);
|
|
93
|
+
const ymd = jdToYmd(jd);
|
|
94
|
+
if (ymd.year > year) {
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
if (tk.id !== lastId) {
|
|
98
|
+
out.push(tk);
|
|
99
|
+
lastId = tk.id;
|
|
100
|
+
}
|
|
101
|
+
jd += 1;
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
exports.getTietKhiOfYear = getTietKhiOfYear;
|
|
106
|
+
/** JD của ngày sóc gần nhất trước hoặc bằng `jd` */
|
|
107
|
+
function getMonthStart(jd, timeZone = constants_1.TZ_VN) {
|
|
108
|
+
const k = (0, astro_1.int)((jd - 2415021.076998695) / 29.530588853);
|
|
109
|
+
let start = (0, astro_1.getNewMoonDay)(k + 1, timeZone);
|
|
110
|
+
if (start > jd) {
|
|
111
|
+
start = (0, astro_1.getNewMoonDay)(k, timeZone);
|
|
112
|
+
}
|
|
113
|
+
return start;
|
|
114
|
+
}
|
|
115
|
+
exports.getMonthStart = getMonthStart;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trực (Thập nhị kiến trừ) và 12 giờ hoàng đạo.
|
|
3
|
+
*
|
|
4
|
+
* Quy luật Trực đã được kiểm chứng khớp 1.462/1.462 ngày dữ liệu Lịch Việt:
|
|
5
|
+
* Trực = (chi ngày − chi tháng tiết khí) mod 12, tra vào 12 Trực bắt đầu từ Kiến.
|
|
6
|
+
*
|
|
7
|
+
* Bảng giờ hoàng đạo sinh từ công thức `(2 × chi ngày + 8) mod 12`
|
|
8
|
+
* khớp đúng bảng cổ điển (Tý–Ngọ: Tý Sửu Mão Ngọ Thân Dậu; …).
|
|
9
|
+
*/
|
|
10
|
+
export interface TrucInfo {
|
|
11
|
+
/** Chỉ số 0..11, 0 = Kiến */
|
|
12
|
+
index: number;
|
|
13
|
+
/** Tên Trực */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Chi tháng tiết khí dùng để tính */
|
|
16
|
+
monthChiIndex: number;
|
|
17
|
+
/** Chi ngày */
|
|
18
|
+
dayChiIndex: number;
|
|
19
|
+
}
|
|
20
|
+
/** Trực của ngày */
|
|
21
|
+
export declare function getTruc(jd: number, dayChiIndex: number, timeZone?: number): TrucInfo;
|
|
22
|
+
export interface GioInfo {
|
|
23
|
+
/** Chỉ số địa chi của giờ, 0 = Tý */
|
|
24
|
+
index: number;
|
|
25
|
+
/** Tên chi, ví dụ "Tý" */
|
|
26
|
+
chi: string;
|
|
27
|
+
/** Khung giờ thực, ví dụ "23:00 – 00:59" */
|
|
28
|
+
range: string;
|
|
29
|
+
/** Giờ bắt đầu (0..23) */
|
|
30
|
+
startHour: number;
|
|
31
|
+
/** Giờ kết thúc (0..23) */
|
|
32
|
+
endHour: number;
|
|
33
|
+
/** Thần cai quản giờ này */
|
|
34
|
+
than: string;
|
|
35
|
+
/** Có phải giờ hoàng đạo (giờ tốt) */
|
|
36
|
+
hoangDao: boolean;
|
|
37
|
+
}
|
|
38
|
+
/** Vị trí thần hoàng đạo tại giờ Tý, suy từ chi ngày */
|
|
39
|
+
export declare function getThanOffset(dayChiIndex: number): number;
|
|
40
|
+
/** Thần cai quản một giờ */
|
|
41
|
+
export declare function getThanOfHour(dayChiIndex: number, hourIndex: number): string;
|
|
42
|
+
/** Có phải giờ hoàng đạo hay không */
|
|
43
|
+
export declare function isHoangDaoHour(dayChiIndex: number, hourIndex: number): boolean;
|
|
44
|
+
/** Đầy đủ 12 khung giờ trong ngày kèm thông tin hoàng đạo */
|
|
45
|
+
export declare function getGioInDay(dayChiIndex: number): GioInfo[];
|
|
46
|
+
/** Danh sách chỉ số 6 giờ hoàng đạo trong ngày */
|
|
47
|
+
export declare function getHoangDaoHours(dayChiIndex: number): number[];
|
package/lib/core/truc.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Trực (Thập nhị kiến trừ) và 12 giờ hoàng đạo.
|
|
4
|
+
*
|
|
5
|
+
* Quy luật Trực đã được kiểm chứng khớp 1.462/1.462 ngày dữ liệu Lịch Việt:
|
|
6
|
+
* Trực = (chi ngày − chi tháng tiết khí) mod 12, tra vào 12 Trực bắt đầu từ Kiến.
|
|
7
|
+
*
|
|
8
|
+
* Bảng giờ hoàng đạo sinh từ công thức `(2 × chi ngày + 8) mod 12`
|
|
9
|
+
* khớp đúng bảng cổ điển (Tý–Ngọ: Tý Sửu Mão Ngọ Thân Dậu; …).
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.getHoangDaoHours = exports.getGioInDay = exports.isHoangDaoHour = exports.getThanOfHour = exports.getThanOffset = exports.getTruc = void 0;
|
|
13
|
+
const constants_1 = require("./constants");
|
|
14
|
+
const tietkhi_1 = require("./tietkhi");
|
|
15
|
+
/** Trực của ngày */
|
|
16
|
+
function getTruc(jd, dayChiIndex, timeZone = constants_1.TZ_VN) {
|
|
17
|
+
const monthChiIndex = (0, tietkhi_1.getTietKhiMonthChi)(jd, timeZone);
|
|
18
|
+
const index = (((dayChiIndex - monthChiIndex) % 12) + 12) % 12;
|
|
19
|
+
return { index, name: constants_1.TRUC[index], monthChiIndex, dayChiIndex };
|
|
20
|
+
}
|
|
21
|
+
exports.getTruc = getTruc;
|
|
22
|
+
const GIO_LABEL = [
|
|
23
|
+
'23:00 – 00:59', '01:00 – 02:59', '03:00 – 04:59', '05:00 – 06:59',
|
|
24
|
+
'07:00 – 08:59', '09:00 – 10:59', '11:00 – 12:59', '13:00 – 14:59',
|
|
25
|
+
'15:00 – 16:59', '17:00 – 18:59', '19:00 – 20:59', '21:00 – 22:59',
|
|
26
|
+
];
|
|
27
|
+
const GIO_START = [23, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21];
|
|
28
|
+
/** Vị trí thần hoàng đạo tại giờ Tý, suy từ chi ngày */
|
|
29
|
+
function getThanOffset(dayChiIndex) {
|
|
30
|
+
return (((2 * dayChiIndex + 8) % 12) + 12) % 12;
|
|
31
|
+
}
|
|
32
|
+
exports.getThanOffset = getThanOffset;
|
|
33
|
+
/** Thần cai quản một giờ */
|
|
34
|
+
function getThanOfHour(dayChiIndex, hourIndex) {
|
|
35
|
+
const offset = getThanOffset(dayChiIndex);
|
|
36
|
+
const idx = (((hourIndex - offset) % 12) + 12) % 12;
|
|
37
|
+
return constants_1.THAN_12[idx];
|
|
38
|
+
}
|
|
39
|
+
exports.getThanOfHour = getThanOfHour;
|
|
40
|
+
/** Có phải giờ hoàng đạo hay không */
|
|
41
|
+
function isHoangDaoHour(dayChiIndex, hourIndex) {
|
|
42
|
+
const offset = getThanOffset(dayChiIndex);
|
|
43
|
+
const idx = (((hourIndex - offset) % 12) + 12) % 12;
|
|
44
|
+
return constants_1.THAN_12_TOT.indexOf(idx) >= 0;
|
|
45
|
+
}
|
|
46
|
+
exports.isHoangDaoHour = isHoangDaoHour;
|
|
47
|
+
/** Đầy đủ 12 khung giờ trong ngày kèm thông tin hoàng đạo */
|
|
48
|
+
function getGioInDay(dayChiIndex) {
|
|
49
|
+
return GIO_LABEL.map((range, i) => ({
|
|
50
|
+
index: i,
|
|
51
|
+
chi: constants_1.CHI[i],
|
|
52
|
+
range,
|
|
53
|
+
startHour: GIO_START[i],
|
|
54
|
+
endHour: (GIO_START[i] + 1) % 24,
|
|
55
|
+
than: getThanOfHour(dayChiIndex, i),
|
|
56
|
+
hoangDao: isHoangDaoHour(dayChiIndex, i),
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
exports.getGioInDay = getGioInDay;
|
|
60
|
+
/** Danh sách chỉ số 6 giờ hoàng đạo trong ngày */
|
|
61
|
+
function getHoangDaoHours(dayChiIndex) {
|
|
62
|
+
const out = [];
|
|
63
|
+
for (let i = 0; i < 12; i += 1) {
|
|
64
|
+
if (isHoangDaoHour(dayChiIndex, i)) {
|
|
65
|
+
out.push(i);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
exports.getHoangDaoHours = getHoangDaoHours;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** Kiểu dữ liệu dùng chung */
|
|
2
|
+
import type { CanChi, NapAm } from './canchi';
|
|
3
|
+
import type { GioInfo, TrucInfo } from './truc';
|
|
4
|
+
import type { HuongXuatHanh } from './huong';
|
|
5
|
+
import type { TietKhi } from './tietkhi';
|
|
6
|
+
import type { LunarDate } from './lunar';
|
|
7
|
+
/** Ngày dương lịch */
|
|
8
|
+
export interface SolarDateInfo {
|
|
9
|
+
day: number;
|
|
10
|
+
month: number;
|
|
11
|
+
year: number;
|
|
12
|
+
/** 0 = Chủ nhật … 6 = Thứ bảy */
|
|
13
|
+
weekday: number;
|
|
14
|
+
/** "Chủ nhật" … */
|
|
15
|
+
weekdayName: string;
|
|
16
|
+
/** "2024-02-10" */
|
|
17
|
+
iso: string;
|
|
18
|
+
}
|
|
19
|
+
/** Ngày âm lịch kèm tên tháng */
|
|
20
|
+
export interface LunarDateInfo extends LunarDate {
|
|
21
|
+
/** "tháng Giêng", "tháng Chạp" */
|
|
22
|
+
monthName: string;
|
|
23
|
+
/** "tháng Sáu nhuận" nếu là tháng nhuận */
|
|
24
|
+
monthNameFull: string;
|
|
25
|
+
/** "20/11/2023" */
|
|
26
|
+
text: string;
|
|
27
|
+
/** "Quý Mão" — chỉ có khi đi kèm can chi năm */
|
|
28
|
+
canChiYearName?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Thông tin đầy đủ của một ngày */
|
|
31
|
+
export interface LunarDayInfo {
|
|
32
|
+
jd: number;
|
|
33
|
+
solar: SolarDateInfo;
|
|
34
|
+
lunar: LunarDateInfo;
|
|
35
|
+
canChi: {
|
|
36
|
+
year: CanChi;
|
|
37
|
+
month: CanChi;
|
|
38
|
+
day: CanChi;
|
|
39
|
+
};
|
|
40
|
+
/** Con giáp của năm âm, ví dụ "Rồng" */
|
|
41
|
+
conGiap: string;
|
|
42
|
+
/** Nạp âm (ngũ hành) của năm / tháng / ngày */
|
|
43
|
+
napAm: {
|
|
44
|
+
year: NapAm;
|
|
45
|
+
month: NapAm;
|
|
46
|
+
day: NapAm;
|
|
47
|
+
};
|
|
48
|
+
/** Ngũ hành của ngày, dạng chữ: Kim | Mộc | Thủy | Hỏa | Thổ */
|
|
49
|
+
nguHanh: string;
|
|
50
|
+
/** Ngũ hành của ngày, dạng số đúng quy ước Lịch Việt: 1=Kim 2=Mộc 3=Thủy 4=Hỏa 5=Thổ */
|
|
51
|
+
nguHanhId: number;
|
|
52
|
+
tietKhi: TietKhi;
|
|
53
|
+
truc: TrucInfo;
|
|
54
|
+
/** Đủ 12 khung giờ trong ngày */
|
|
55
|
+
gio: GioInfo[];
|
|
56
|
+
/** Chỉ 6 giờ hoàng đạo */
|
|
57
|
+
gioHoangDao: GioInfo[];
|
|
58
|
+
/** Hướng xuất hành (Hỷ thần / Tài thần / Hạc thần) */
|
|
59
|
+
huongXuatHanh: HuongXuatHanh;
|
|
60
|
+
}
|
|
61
|
+
/** Ngày có thể truyền vào API */
|
|
62
|
+
export type DateInput = Date | string | number | {
|
|
63
|
+
day: number;
|
|
64
|
+
month: number;
|
|
65
|
+
year: number;
|
|
66
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* react-native-lich-am / dataset/2024
|
|
3
|
+
*
|
|
4
|
+
* Chỉ nạp dữ liệu năm 2024 — nhẹ hơn hẳn so với entry `dataset` (nạp cả 5 năm).
|
|
5
|
+
*/
|
|
6
|
+
import { type ChatLuong, type FindGoodDaysOptions, type LichVietDay } from './decode';
|
|
7
|
+
export * from './decode';
|
|
8
|
+
/** Năm của bộ dữ liệu này */
|
|
9
|
+
export declare const YEAR = 2024;
|
|
10
|
+
/** Các năm có dữ liệu trong entry point này */
|
|
11
|
+
export declare const AVAILABLE_YEARS: number[];
|
|
12
|
+
/** Có dữ liệu chi tiết cho ngày này hay không (chuỗi "YYYY-MM-DD") */
|
|
13
|
+
export declare function hasDayData(date: string): boolean;
|
|
14
|
+
/** Lấy thông tin chi tiết một ngày theo chuỗi "YYYY-MM-DD" */
|
|
15
|
+
export declare function getDayData(date: string): LichVietDay | null;
|
|
16
|
+
/** Lấy theo ngày/tháng/năm dương */
|
|
17
|
+
export declare function getDayDataBySolar(day: number, month: number, year: number): LichVietDay | null;
|
|
18
|
+
/** Toàn bộ ngày có dữ liệu, dạng "YYYY-MM-DD", đã sắp xếp */
|
|
19
|
+
export declare function listDayKeys(): string[];
|
|
20
|
+
/** Toàn bộ ngày đã giải mã */
|
|
21
|
+
export declare function listDays(): LichVietDay[];
|
|
22
|
+
/** Tìm ngày phù hợp cho một việc */
|
|
23
|
+
export declare function findGoodDays(options: FindGoodDaysOptions): LichVietDay[];
|
|
24
|
+
/** Ngày đẹp nhất trong một khoảng */
|
|
25
|
+
export declare function topDays(from?: string, to?: string, limit?: number): LichVietDay[];
|
|
26
|
+
/** Thống kê chất lượng ngày trong một khoảng */
|
|
27
|
+
export declare function getQualityStats(from?: string, to?: string): Record<ChatLuong, number> & {
|
|
28
|
+
total: number;
|
|
29
|
+
avgDiem: number;
|
|
30
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* react-native-lich-am / dataset/2024
|
|
4
|
+
*
|
|
5
|
+
* Chỉ nạp dữ liệu năm 2024 — nhẹ hơn hẳn so với entry `dataset` (nạp cả 5 năm).
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.getQualityStats = exports.topDays = exports.findGoodDays = exports.listDays = exports.listDayKeys = exports.getDayDataBySolar = exports.getDayData = exports.hasDayData = exports.AVAILABLE_YEARS = exports.YEAR = void 0;
|
|
23
|
+
const decode_1 = require("./decode");
|
|
24
|
+
__exportStar(require("./decode"), exports);
|
|
25
|
+
const store = (0, decode_1.createStore)([require('./data/days-2024.json')]);
|
|
26
|
+
/** Năm của bộ dữ liệu này */
|
|
27
|
+
exports.YEAR = 2024;
|
|
28
|
+
/** Các năm có dữ liệu trong entry point này */
|
|
29
|
+
exports.AVAILABLE_YEARS = [2024];
|
|
30
|
+
/** Có dữ liệu chi tiết cho ngày này hay không (chuỗi "YYYY-MM-DD") */
|
|
31
|
+
function hasDayData(date) {
|
|
32
|
+
return store.has(date);
|
|
33
|
+
}
|
|
34
|
+
exports.hasDayData = hasDayData;
|
|
35
|
+
/** Lấy thông tin chi tiết một ngày theo chuỗi "YYYY-MM-DD" */
|
|
36
|
+
function getDayData(date) {
|
|
37
|
+
return store.lookup(date);
|
|
38
|
+
}
|
|
39
|
+
exports.getDayData = getDayData;
|
|
40
|
+
/** Lấy theo ngày/tháng/năm dương */
|
|
41
|
+
function getDayDataBySolar(day, month, year) {
|
|
42
|
+
return store.lookup((0, decode_1.toIso)(year, month, day));
|
|
43
|
+
}
|
|
44
|
+
exports.getDayDataBySolar = getDayDataBySolar;
|
|
45
|
+
/** Toàn bộ ngày có dữ liệu, dạng "YYYY-MM-DD", đã sắp xếp */
|
|
46
|
+
function listDayKeys() {
|
|
47
|
+
return store.keys;
|
|
48
|
+
}
|
|
49
|
+
exports.listDayKeys = listDayKeys;
|
|
50
|
+
/** Toàn bộ ngày đã giải mã */
|
|
51
|
+
function listDays() {
|
|
52
|
+
return store.all();
|
|
53
|
+
}
|
|
54
|
+
exports.listDays = listDays;
|
|
55
|
+
/** Tìm ngày phù hợp cho một việc */
|
|
56
|
+
function findGoodDays(options) {
|
|
57
|
+
return (0, decode_1.findGoodDaysIn)(store.keys, store.lookup, options);
|
|
58
|
+
}
|
|
59
|
+
exports.findGoodDays = findGoodDays;
|
|
60
|
+
/** Ngày đẹp nhất trong một khoảng */
|
|
61
|
+
function topDays(from, to, limit = 10) {
|
|
62
|
+
return (0, decode_1.topDaysIn)(store.keys, store.lookup, from, to, limit);
|
|
63
|
+
}
|
|
64
|
+
exports.topDays = topDays;
|
|
65
|
+
/** Thống kê chất lượng ngày trong một khoảng */
|
|
66
|
+
function getQualityStats(from, to) {
|
|
67
|
+
return (0, decode_1.qualityStatsIn)(store.keys, store.lookup, from, to);
|
|
68
|
+
}
|
|
69
|
+
exports.getQualityStats = getQualityStats;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* react-native-lich-am / dataset/2025
|
|
3
|
+
*
|
|
4
|
+
* Chỉ nạp dữ liệu năm 2025 — nhẹ hơn hẳn so với entry `dataset` (nạp cả 5 năm).
|
|
5
|
+
*/
|
|
6
|
+
import { type ChatLuong, type FindGoodDaysOptions, type LichVietDay } from './decode';
|
|
7
|
+
export * from './decode';
|
|
8
|
+
/** Năm của bộ dữ liệu này */
|
|
9
|
+
export declare const YEAR = 2025;
|
|
10
|
+
/** Các năm có dữ liệu trong entry point này */
|
|
11
|
+
export declare const AVAILABLE_YEARS: number[];
|
|
12
|
+
/** Có dữ liệu chi tiết cho ngày này hay không (chuỗi "YYYY-MM-DD") */
|
|
13
|
+
export declare function hasDayData(date: string): boolean;
|
|
14
|
+
/** Lấy thông tin chi tiết một ngày theo chuỗi "YYYY-MM-DD" */
|
|
15
|
+
export declare function getDayData(date: string): LichVietDay | null;
|
|
16
|
+
/** Lấy theo ngày/tháng/năm dương */
|
|
17
|
+
export declare function getDayDataBySolar(day: number, month: number, year: number): LichVietDay | null;
|
|
18
|
+
/** Toàn bộ ngày có dữ liệu, dạng "YYYY-MM-DD", đã sắp xếp */
|
|
19
|
+
export declare function listDayKeys(): string[];
|
|
20
|
+
/** Toàn bộ ngày đã giải mã */
|
|
21
|
+
export declare function listDays(): LichVietDay[];
|
|
22
|
+
/** Tìm ngày phù hợp cho một việc */
|
|
23
|
+
export declare function findGoodDays(options: FindGoodDaysOptions): LichVietDay[];
|
|
24
|
+
/** Ngày đẹp nhất trong một khoảng */
|
|
25
|
+
export declare function topDays(from?: string, to?: string, limit?: number): LichVietDay[];
|
|
26
|
+
/** Thống kê chất lượng ngày trong một khoảng */
|
|
27
|
+
export declare function getQualityStats(from?: string, to?: string): Record<ChatLuong, number> & {
|
|
28
|
+
total: number;
|
|
29
|
+
avgDiem: number;
|
|
30
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* react-native-lich-am / dataset/2025
|
|
4
|
+
*
|
|
5
|
+
* Chỉ nạp dữ liệu năm 2025 — nhẹ hơn hẳn so với entry `dataset` (nạp cả 5 năm).
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.getQualityStats = exports.topDays = exports.findGoodDays = exports.listDays = exports.listDayKeys = exports.getDayDataBySolar = exports.getDayData = exports.hasDayData = exports.AVAILABLE_YEARS = exports.YEAR = void 0;
|
|
23
|
+
const decode_1 = require("./decode");
|
|
24
|
+
__exportStar(require("./decode"), exports);
|
|
25
|
+
const store = (0, decode_1.createStore)([require('./data/days-2025.json')]);
|
|
26
|
+
/** Năm của bộ dữ liệu này */
|
|
27
|
+
exports.YEAR = 2025;
|
|
28
|
+
/** Các năm có dữ liệu trong entry point này */
|
|
29
|
+
exports.AVAILABLE_YEARS = [2025];
|
|
30
|
+
/** Có dữ liệu chi tiết cho ngày này hay không (chuỗi "YYYY-MM-DD") */
|
|
31
|
+
function hasDayData(date) {
|
|
32
|
+
return store.has(date);
|
|
33
|
+
}
|
|
34
|
+
exports.hasDayData = hasDayData;
|
|
35
|
+
/** Lấy thông tin chi tiết một ngày theo chuỗi "YYYY-MM-DD" */
|
|
36
|
+
function getDayData(date) {
|
|
37
|
+
return store.lookup(date);
|
|
38
|
+
}
|
|
39
|
+
exports.getDayData = getDayData;
|
|
40
|
+
/** Lấy theo ngày/tháng/năm dương */
|
|
41
|
+
function getDayDataBySolar(day, month, year) {
|
|
42
|
+
return store.lookup((0, decode_1.toIso)(year, month, day));
|
|
43
|
+
}
|
|
44
|
+
exports.getDayDataBySolar = getDayDataBySolar;
|
|
45
|
+
/** Toàn bộ ngày có dữ liệu, dạng "YYYY-MM-DD", đã sắp xếp */
|
|
46
|
+
function listDayKeys() {
|
|
47
|
+
return store.keys;
|
|
48
|
+
}
|
|
49
|
+
exports.listDayKeys = listDayKeys;
|
|
50
|
+
/** Toàn bộ ngày đã giải mã */
|
|
51
|
+
function listDays() {
|
|
52
|
+
return store.all();
|
|
53
|
+
}
|
|
54
|
+
exports.listDays = listDays;
|
|
55
|
+
/** Tìm ngày phù hợp cho một việc */
|
|
56
|
+
function findGoodDays(options) {
|
|
57
|
+
return (0, decode_1.findGoodDaysIn)(store.keys, store.lookup, options);
|
|
58
|
+
}
|
|
59
|
+
exports.findGoodDays = findGoodDays;
|
|
60
|
+
/** Ngày đẹp nhất trong một khoảng */
|
|
61
|
+
function topDays(from, to, limit = 10) {
|
|
62
|
+
return (0, decode_1.topDaysIn)(store.keys, store.lookup, from, to, limit);
|
|
63
|
+
}
|
|
64
|
+
exports.topDays = topDays;
|
|
65
|
+
/** Thống kê chất lượng ngày trong một khoảng */
|
|
66
|
+
function getQualityStats(from, to) {
|
|
67
|
+
return (0, decode_1.qualityStatsIn)(store.keys, store.lookup, from, to);
|
|
68
|
+
}
|
|
69
|
+
exports.getQualityStats = getQualityStats;
|