mingpan 0.1.1

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 (231) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +118 -0
  3. package/dist/core/bazi/BaziCore.d.ts +112 -0
  4. package/dist/core/bazi/BaziCore.d.ts.map +1 -0
  5. package/dist/core/bazi/BaziCore.js +606 -0
  6. package/dist/core/bazi/BaziCore.js.map +1 -0
  7. package/dist/core/bazi/SolarTermCalculator.d.ts +46 -0
  8. package/dist/core/bazi/SolarTermCalculator.d.ts.map +1 -0
  9. package/dist/core/bazi/SolarTermCalculator.js +452 -0
  10. package/dist/core/bazi/SolarTermCalculator.js.map +1 -0
  11. package/dist/core/bazi/TrueSolarTime.d.ts +64 -0
  12. package/dist/core/bazi/TrueSolarTime.d.ts.map +1 -0
  13. package/dist/core/bazi/TrueSolarTime.js +210 -0
  14. package/dist/core/bazi/TrueSolarTime.js.map +1 -0
  15. package/dist/core/bazi/ephemerisData.d.ts +10 -0
  16. package/dist/core/bazi/ephemerisData.d.ts.map +1 -0
  17. package/dist/core/bazi/ephemerisData.js +88 -0
  18. package/dist/core/bazi/ephemerisData.js.map +1 -0
  19. package/dist/core/bazi/index.d.ts +8 -0
  20. package/dist/core/bazi/index.d.ts.map +1 -0
  21. package/dist/core/bazi/index.js +30 -0
  22. package/dist/core/bazi/index.js.map +1 -0
  23. package/dist/core/bazi/types.d.ts +116 -0
  24. package/dist/core/bazi/types.d.ts.map +1 -0
  25. package/dist/core/bazi/types.js +7 -0
  26. package/dist/core/bazi/types.js.map +1 -0
  27. package/dist/core/calendar/SolarTermsCalculator.d.ts +33 -0
  28. package/dist/core/calendar/SolarTermsCalculator.d.ts.map +1 -0
  29. package/dist/core/calendar/SolarTermsCalculator.js +111 -0
  30. package/dist/core/calendar/SolarTermsCalculator.js.map +1 -0
  31. package/dist/core/calendar/astronomicalCalendar.d.ts +74 -0
  32. package/dist/core/calendar/astronomicalCalendar.d.ts.map +1 -0
  33. package/dist/core/calendar/astronomicalCalendar.js +276 -0
  34. package/dist/core/calendar/astronomicalCalendar.js.map +1 -0
  35. package/dist/core/calendar/calendar.d.ts +81 -0
  36. package/dist/core/calendar/calendar.d.ts.map +1 -0
  37. package/dist/core/calendar/calendar.js +223 -0
  38. package/dist/core/calendar/calendar.js.map +1 -0
  39. package/dist/core/calendar/constants.d.ts +151 -0
  40. package/dist/core/calendar/constants.d.ts.map +1 -0
  41. package/dist/core/calendar/constants.js +97 -0
  42. package/dist/core/calendar/constants.js.map +1 -0
  43. package/dist/core/calendar/julian.d.ts +54 -0
  44. package/dist/core/calendar/julian.d.ts.map +1 -0
  45. package/dist/core/calendar/julian.js +142 -0
  46. package/dist/core/calendar/julian.js.map +1 -0
  47. package/dist/core/calendar/lunarCalendar.d.ts +79 -0
  48. package/dist/core/calendar/lunarCalendar.d.ts.map +1 -0
  49. package/dist/core/calendar/lunarCalendar.js +164 -0
  50. package/dist/core/calendar/lunarCalendar.js.map +1 -0
  51. package/dist/core/calendar/solarTerms.d.ts +105 -0
  52. package/dist/core/calendar/solarTerms.d.ts.map +1 -0
  53. package/dist/core/calendar/solarTerms.js +487 -0
  54. package/dist/core/calendar/solarTerms.js.map +1 -0
  55. package/dist/core/constants/bazi.d.ts +138 -0
  56. package/dist/core/constants/bazi.d.ts.map +1 -0
  57. package/dist/core/constants/bazi.js +332 -0
  58. package/dist/core/constants/bazi.js.map +1 -0
  59. package/dist/core/constants/index.d.ts +6 -0
  60. package/dist/core/constants/index.d.ts.map +1 -0
  61. package/dist/core/constants/index.js +37 -0
  62. package/dist/core/constants/index.js.map +1 -0
  63. package/dist/core/constants/positions.d.ts +27 -0
  64. package/dist/core/constants/positions.d.ts.map +1 -0
  65. package/dist/core/constants/positions.js +39 -0
  66. package/dist/core/constants/positions.js.map +1 -0
  67. package/dist/core/ziwei/BrightnessSystem.d.ts +53 -0
  68. package/dist/core/ziwei/BrightnessSystem.d.ts.map +1 -0
  69. package/dist/core/ziwei/BrightnessSystem.js +278 -0
  70. package/dist/core/ziwei/BrightnessSystem.js.map +1 -0
  71. package/dist/core/ziwei/IztroAdapter.d.ts +78 -0
  72. package/dist/core/ziwei/IztroAdapter.d.ts.map +1 -0
  73. package/dist/core/ziwei/IztroAdapter.js +314 -0
  74. package/dist/core/ziwei/IztroAdapter.js.map +1 -0
  75. package/dist/core/ziwei/MutagenCore.d.ts +81 -0
  76. package/dist/core/ziwei/MutagenCore.d.ts.map +1 -0
  77. package/dist/core/ziwei/MutagenCore.js +246 -0
  78. package/dist/core/ziwei/MutagenCore.js.map +1 -0
  79. package/dist/index.d.ts +13 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +1101 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/output/fortuneTextRenderer.d.ts +63 -0
  84. package/dist/output/fortuneTextRenderer.d.ts.map +1 -0
  85. package/dist/output/fortuneTextRenderer.js +384 -0
  86. package/dist/output/fortuneTextRenderer.js.map +1 -0
  87. package/dist/output/listTextRenderer.d.ts +298 -0
  88. package/dist/output/listTextRenderer.d.ts.map +1 -0
  89. package/dist/output/listTextRenderer.js +942 -0
  90. package/dist/output/listTextRenderer.js.map +1 -0
  91. package/dist/services/bazi/BaziService.d.ts +83 -0
  92. package/dist/services/bazi/BaziService.d.ts.map +1 -0
  93. package/dist/services/bazi/BaziService.js +635 -0
  94. package/dist/services/bazi/BaziService.js.map +1 -0
  95. package/dist/services/bazi/analyzers/ClimateAnalyzer.d.ts +31 -0
  96. package/dist/services/bazi/analyzers/ClimateAnalyzer.d.ts.map +1 -0
  97. package/dist/services/bazi/analyzers/ClimateAnalyzer.js +194 -0
  98. package/dist/services/bazi/analyzers/ClimateAnalyzer.js.map +1 -0
  99. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.d.ts +16 -0
  100. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.d.ts.map +1 -0
  101. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.js +60 -0
  102. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.js.map +1 -0
  103. package/dist/services/bazi/analyzers/NaYinAnalyzer.d.ts +33 -0
  104. package/dist/services/bazi/analyzers/NaYinAnalyzer.d.ts.map +1 -0
  105. package/dist/services/bazi/analyzers/NaYinAnalyzer.js +209 -0
  106. package/dist/services/bazi/analyzers/NaYinAnalyzer.js.map +1 -0
  107. package/dist/services/bazi/analyzers/PatternAnalyzer.d.ts +159 -0
  108. package/dist/services/bazi/analyzers/PatternAnalyzer.d.ts.map +1 -0
  109. package/dist/services/bazi/analyzers/PatternAnalyzer.js +1150 -0
  110. package/dist/services/bazi/analyzers/PatternAnalyzer.js.map +1 -0
  111. package/dist/services/bazi/analyzers/RelationsAnalyzer.d.ts +114 -0
  112. package/dist/services/bazi/analyzers/RelationsAnalyzer.d.ts.map +1 -0
  113. package/dist/services/bazi/analyzers/RelationsAnalyzer.js +704 -0
  114. package/dist/services/bazi/analyzers/RelationsAnalyzer.js.map +1 -0
  115. package/dist/services/bazi/analyzers/ShenShaAnalyzer.d.ts +236 -0
  116. package/dist/services/bazi/analyzers/ShenShaAnalyzer.d.ts.map +1 -0
  117. package/dist/services/bazi/analyzers/ShenShaAnalyzer.js +2079 -0
  118. package/dist/services/bazi/analyzers/ShenShaAnalyzer.js.map +1 -0
  119. package/dist/services/bazi/analyzers/StrengthAnalyzer.d.ts +181 -0
  120. package/dist/services/bazi/analyzers/StrengthAnalyzer.d.ts.map +1 -0
  121. package/dist/services/bazi/analyzers/StrengthAnalyzer.js +1119 -0
  122. package/dist/services/bazi/analyzers/StrengthAnalyzer.js.map +1 -0
  123. package/dist/services/bazi/analyzers/TenGodsAnalyzer.d.ts +78 -0
  124. package/dist/services/bazi/analyzers/TenGodsAnalyzer.d.ts.map +1 -0
  125. package/dist/services/bazi/analyzers/TenGodsAnalyzer.js +383 -0
  126. package/dist/services/bazi/analyzers/TenGodsAnalyzer.js.map +1 -0
  127. package/dist/services/bazi/analyzers/TraditionalAnalyzer.d.ts +46 -0
  128. package/dist/services/bazi/analyzers/TraditionalAnalyzer.d.ts.map +1 -0
  129. package/dist/services/bazi/analyzers/TraditionalAnalyzer.js +260 -0
  130. package/dist/services/bazi/analyzers/TraditionalAnalyzer.js.map +1 -0
  131. package/dist/services/bazi/analyzers/YongShenAnalyzer.d.ts +70 -0
  132. package/dist/services/bazi/analyzers/YongShenAnalyzer.d.ts.map +1 -0
  133. package/dist/services/bazi/analyzers/YongShenAnalyzer.js +858 -0
  134. package/dist/services/bazi/analyzers/YongShenAnalyzer.js.map +1 -0
  135. package/dist/services/bazi/calculators/DaYunCalculator.d.ts +71 -0
  136. package/dist/services/bazi/calculators/DaYunCalculator.d.ts.map +1 -0
  137. package/dist/services/bazi/calculators/DaYunCalculator.js +496 -0
  138. package/dist/services/bazi/calculators/DaYunCalculator.js.map +1 -0
  139. package/dist/services/bazi/calculators/LiuNianCalculator.d.ts +88 -0
  140. package/dist/services/bazi/calculators/LiuNianCalculator.d.ts.map +1 -0
  141. package/dist/services/bazi/calculators/LiuNianCalculator.js +546 -0
  142. package/dist/services/bazi/calculators/LiuNianCalculator.js.map +1 -0
  143. package/dist/services/bazi/calculators/LiuRiCalculator.d.ts +66 -0
  144. package/dist/services/bazi/calculators/LiuRiCalculator.d.ts.map +1 -0
  145. package/dist/services/bazi/calculators/LiuRiCalculator.js +497 -0
  146. package/dist/services/bazi/calculators/LiuRiCalculator.js.map +1 -0
  147. package/dist/services/bazi/calculators/LiuYueCalculator.d.ts +50 -0
  148. package/dist/services/bazi/calculators/LiuYueCalculator.d.ts.map +1 -0
  149. package/dist/services/bazi/calculators/LiuYueCalculator.js +338 -0
  150. package/dist/services/bazi/calculators/LiuYueCalculator.js.map +1 -0
  151. package/dist/services/bazi/calculators/LuckCycleCalculator.d.ts +123 -0
  152. package/dist/services/bazi/calculators/LuckCycleCalculator.d.ts.map +1 -0
  153. package/dist/services/bazi/calculators/LuckCycleCalculator.js +414 -0
  154. package/dist/services/bazi/calculators/LuckCycleCalculator.js.map +1 -0
  155. package/dist/services/bazi/index.d.ts +21 -0
  156. package/dist/services/bazi/index.d.ts.map +1 -0
  157. package/dist/services/bazi/index.js +83 -0
  158. package/dist/services/bazi/index.js.map +1 -0
  159. package/dist/services/bazi/types.d.ts +597 -0
  160. package/dist/services/bazi/types.d.ts.map +1 -0
  161. package/dist/services/bazi/types.js +123 -0
  162. package/dist/services/bazi/types.js.map +1 -0
  163. package/dist/services/ziwei/ZiweiService.d.ts +86 -0
  164. package/dist/services/ziwei/ZiweiService.d.ts.map +1 -0
  165. package/dist/services/ziwei/ZiweiService.js +343 -0
  166. package/dist/services/ziwei/ZiweiService.js.map +1 -0
  167. package/dist/services/ziwei/calculators/BrightnessCalculator.d.ts +38 -0
  168. package/dist/services/ziwei/calculators/BrightnessCalculator.d.ts.map +1 -0
  169. package/dist/services/ziwei/calculators/BrightnessCalculator.js +142 -0
  170. package/dist/services/ziwei/calculators/BrightnessCalculator.js.map +1 -0
  171. package/dist/services/ziwei/calculators/DailyCalculator.d.ts +27 -0
  172. package/dist/services/ziwei/calculators/DailyCalculator.d.ts.map +1 -0
  173. package/dist/services/ziwei/calculators/DailyCalculator.js +55 -0
  174. package/dist/services/ziwei/calculators/DailyCalculator.js.map +1 -0
  175. package/dist/services/ziwei/calculators/DecadeCalculator.d.ts +46 -0
  176. package/dist/services/ziwei/calculators/DecadeCalculator.d.ts.map +1 -0
  177. package/dist/services/ziwei/calculators/DecadeCalculator.js +181 -0
  178. package/dist/services/ziwei/calculators/DecadeCalculator.js.map +1 -0
  179. package/dist/services/ziwei/calculators/HoroscopeStarsCalculator.d.ts +28 -0
  180. package/dist/services/ziwei/calculators/HoroscopeStarsCalculator.d.ts.map +1 -0
  181. package/dist/services/ziwei/calculators/HoroscopeStarsCalculator.js +84 -0
  182. package/dist/services/ziwei/calculators/HoroscopeStarsCalculator.js.map +1 -0
  183. package/dist/services/ziwei/calculators/HourlyCalculator.d.ts +41 -0
  184. package/dist/services/ziwei/calculators/HourlyCalculator.d.ts.map +1 -0
  185. package/dist/services/ziwei/calculators/HourlyCalculator.js +139 -0
  186. package/dist/services/ziwei/calculators/HourlyCalculator.js.map +1 -0
  187. package/dist/services/ziwei/calculators/MinorLimitCalculator.d.ts +30 -0
  188. package/dist/services/ziwei/calculators/MinorLimitCalculator.d.ts.map +1 -0
  189. package/dist/services/ziwei/calculators/MinorLimitCalculator.js +90 -0
  190. package/dist/services/ziwei/calculators/MinorLimitCalculator.js.map +1 -0
  191. package/dist/services/ziwei/calculators/MonthlyCalculator.d.ts +39 -0
  192. package/dist/services/ziwei/calculators/MonthlyCalculator.d.ts.map +1 -0
  193. package/dist/services/ziwei/calculators/MonthlyCalculator.js +128 -0
  194. package/dist/services/ziwei/calculators/MonthlyCalculator.js.map +1 -0
  195. package/dist/services/ziwei/calculators/MutagenCalculator.d.ts +20 -0
  196. package/dist/services/ziwei/calculators/MutagenCalculator.d.ts.map +1 -0
  197. package/dist/services/ziwei/calculators/MutagenCalculator.js +121 -0
  198. package/dist/services/ziwei/calculators/MutagenCalculator.js.map +1 -0
  199. package/dist/services/ziwei/calculators/PalaceDynamicCalculator.d.ts +35 -0
  200. package/dist/services/ziwei/calculators/PalaceDynamicCalculator.d.ts.map +1 -0
  201. package/dist/services/ziwei/calculators/PalaceDynamicCalculator.js +55 -0
  202. package/dist/services/ziwei/calculators/PalaceDynamicCalculator.js.map +1 -0
  203. package/dist/services/ziwei/calculators/YearlyCalculator.d.ts +35 -0
  204. package/dist/services/ziwei/calculators/YearlyCalculator.d.ts.map +1 -0
  205. package/dist/services/ziwei/calculators/YearlyCalculator.js +119 -0
  206. package/dist/services/ziwei/calculators/YearlyCalculator.js.map +1 -0
  207. package/dist/services/ziwei/index.d.ts +15 -0
  208. package/dist/services/ziwei/index.d.ts.map +1 -0
  209. package/dist/services/ziwei/index.js +48 -0
  210. package/dist/services/ziwei/index.js.map +1 -0
  211. package/dist/services/ziwei/transformers/PalaceTransformer.d.ts +62 -0
  212. package/dist/services/ziwei/transformers/PalaceTransformer.d.ts.map +1 -0
  213. package/dist/services/ziwei/transformers/PalaceTransformer.js +153 -0
  214. package/dist/services/ziwei/transformers/PalaceTransformer.js.map +1 -0
  215. package/dist/services/ziwei/types.d.ts +185 -0
  216. package/dist/services/ziwei/types.d.ts.map +1 -0
  217. package/dist/services/ziwei/types.js +54 -0
  218. package/dist/services/ziwei/types.js.map +1 -0
  219. package/dist/shared/logger.d.ts +51 -0
  220. package/dist/shared/logger.d.ts.map +1 -0
  221. package/dist/shared/logger.js +136 -0
  222. package/dist/shared/logger.js.map +1 -0
  223. package/dist/shared/types.d.ts +91 -0
  224. package/dist/shared/types.d.ts.map +1 -0
  225. package/dist/shared/types.js +7 -0
  226. package/dist/shared/types.js.map +1 -0
  227. package/dist/utils/ageCalculator.d.ts +30 -0
  228. package/dist/utils/ageCalculator.d.ts.map +1 -0
  229. package/dist/utils/ageCalculator.js +51 -0
  230. package/dist/utils/ageCalculator.js.map +1 -0
  231. package/package.json +54 -0
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LiuYueCalculator = void 0;
4
+ const bazi_1 = require("../../../core/constants/bazi");
5
+ const LuckCycleCalculator_1 = require("./LuckCycleCalculator");
6
+ const solarTerms_1 = require("../../../core/calendar/solarTerms");
7
+ // Extract simple arrays for easier usage
8
+ const STEMS = bazi_1.HEAVENLY_STEMS.map(s => s.name);
9
+ const BRANCHES = bazi_1.EARTHLY_BRANCHES.map(b => b.name);
10
+ // Create stem-element mapping
11
+ const STEM_ELEMENTS = bazi_1.HEAVENLY_STEMS.reduce((acc, stem) => {
12
+ acc[stem.name] = stem.element;
13
+ return acc;
14
+ }, {});
15
+ // Create branch-element mapping
16
+ const BRANCH_ELEMENTS = bazi_1.EARTHLY_BRANCHES.reduce((acc, branch) => {
17
+ acc[branch.name] = branch.element;
18
+ return acc;
19
+ }, {});
20
+ // Solar term months - each month starts from a specific solar term (節)
21
+ const MONTH_STARTING_SOLAR_TERMS = [
22
+ '立春', // 寅月
23
+ '惊蛰', // 卯月
24
+ '清明', // 辰月
25
+ '立夏', // 巳月
26
+ '芒种', // 午月
27
+ '小暑', // 未月
28
+ '立秋', // 申月
29
+ '白露', // 酉月
30
+ '寒露', // 戌月
31
+ '立冬', // 亥月
32
+ '大雪', // 子月
33
+ '小寒' // 丑月
34
+ ];
35
+ /**
36
+ * Calculator for Liu Yue (流月) - Monthly Fortune Cycles
37
+ * Provides month-by-month analysis within a Liu Nian year
38
+ */
39
+ class LiuYueCalculator {
40
+ luckCalculator;
41
+ constructor() {
42
+ this.luckCalculator = new LuckCycleCalculator_1.LuckCycleCalculator();
43
+ }
44
+ /**
45
+ * Calculate all Liu Yue for a specific year
46
+ */
47
+ calculateLiuYue(yearStem, yearBranch, dayMasterElement, yongShen, birthDate, currentYear) {
48
+ const months = [];
49
+ // Get all solar terms for the year
50
+ const yearSolarTerms = solarTerms_1.PreciseSolarTermCalculator.calculateYearSolarTerms(currentYear);
51
+ const nextYearSolarTerms = solarTerms_1.PreciseSolarTermCalculator.calculateYearSolarTerms(currentYear + 1);
52
+ // Calculate the stem for the first month (寅月)
53
+ const firstMonthStem = this.calculateFirstMonthStem(yearStem);
54
+ for (let i = 0; i < 12; i++) {
55
+ const monthBranch = BRANCHES[(i + 2) % 12]; // Start from 寅
56
+ const monthStemIndex = (STEMS.indexOf(firstMonthStem) + i) % 10;
57
+ const monthStem = STEMS[monthStemIndex];
58
+ // Calculate month dates based on solar terms
59
+ const { startDate, endDate, solarTermInfo } = this.getMonthDates(currentYear, i, yearSolarTerms, nextYearSolarTerms);
60
+ // Analyze month fortune
61
+ const analysis = this.analyzeMonth(monthStem, monthBranch, yearStem, yearBranch, dayMasterElement, yongShen);
62
+ months.push({
63
+ month: i + 1,
64
+ stem: monthStem,
65
+ branch: monthBranch,
66
+ startDate,
67
+ endDate,
68
+ fortune: analysis.fortune,
69
+ rating: analysis.rating,
70
+ mainInfluences: analysis.mainInfluences,
71
+ opportunities: analysis.opportunities,
72
+ challenges: analysis.challenges,
73
+ recommendations: analysis.recommendations,
74
+ healthFocus: analysis.healthFocus,
75
+ luckyDays: this.calculateLuckyDays(monthStem, monthBranch, dayMasterElement),
76
+ solarTerm: solarTermInfo // Store solar term info for display
77
+ });
78
+ }
79
+ return months;
80
+ }
81
+ /**
82
+ * Calculate the stem for the first month based on year stem
83
+ */
84
+ calculateFirstMonthStem(yearStem) {
85
+ const yearStemIndex = STEMS.indexOf(yearStem);
86
+ const rules = {
87
+ 0: '丙', // 甲年
88
+ 1: '戊', // 乙年
89
+ 2: '庚', // 丙年
90
+ 3: '壬', // 丁年
91
+ 4: '甲', // 戊年
92
+ 5: '丙', // 己年
93
+ 6: '戊', // 庚年
94
+ 7: '庚', // 辛年
95
+ 8: '壬', // 壬年
96
+ 9: '甲' // 癸年
97
+ };
98
+ return rules[yearStemIndex];
99
+ }
100
+ /**
101
+ * Get solar calendar dates for a Chinese month based on solar terms
102
+ */
103
+ getMonthDates(year, monthIndex, yearSolarTerms, nextYearSolarTerms) {
104
+ // Each Chinese month starts from a specific solar term (節)
105
+ const startingSolarTerm = MONTH_STARTING_SOLAR_TERMS[monthIndex];
106
+ const nextSolarTerm = MONTH_STARTING_SOLAR_TERMS[(monthIndex + 1) % 12];
107
+ // Find the starting solar term
108
+ // 注意:八字年从立春开始到次年立春前结束
109
+ // 丑月(monthIndex=11)的开始节气"小寒"在公历次年1月初,需要从下一年节气表查找
110
+ let startDate = null;
111
+ let solarTermInfo;
112
+ if (monthIndex === 11) {
113
+ // 丑月(小寒~立春)开始于公历次年1月
114
+ for (const term of nextYearSolarTerms) {
115
+ if (term.name === startingSolarTerm) {
116
+ startDate = term.date;
117
+ solarTermInfo = term;
118
+ break;
119
+ }
120
+ }
121
+ }
122
+ else {
123
+ for (const term of yearSolarTerms) {
124
+ if (term.name === startingSolarTerm) {
125
+ startDate = term.date;
126
+ solarTermInfo = term;
127
+ break;
128
+ }
129
+ }
130
+ // If not found in current year (e.g., 立春 might be in previous year)
131
+ if (!startDate && monthIndex === 0) {
132
+ const prevYearTerms = solarTerms_1.PreciseSolarTermCalculator.calculateYearSolarTerms(year - 1);
133
+ for (const term of prevYearTerms) {
134
+ if (term.name === startingSolarTerm) {
135
+ startDate = term.date;
136
+ solarTermInfo = term;
137
+ break;
138
+ }
139
+ }
140
+ }
141
+ }
142
+ // Find the ending solar term
143
+ let endDate = null;
144
+ // First check current year
145
+ for (const term of yearSolarTerms) {
146
+ if (term.name === nextSolarTerm) {
147
+ // End date should be the moment before the next solar term starts
148
+ endDate = new Date(term.date.getTime() - 1);
149
+ break;
150
+ }
151
+ }
152
+ // If not found, or if endDate is before startDate (cross-year case like 子月 or 丑月),
153
+ // check next year
154
+ // 例如:子月从大雪(12/7)到小寒(次年1/5),当年1月的小寒比大雪早,需要用次年的小寒
155
+ if (!endDate || (startDate && endDate.getTime() <= startDate.getTime())) {
156
+ for (const term of nextYearSolarTerms) {
157
+ if (term.name === nextSolarTerm) {
158
+ // End date should be the moment before the next solar term starts
159
+ endDate = new Date(term.date.getTime() - 1);
160
+ break;
161
+ }
162
+ }
163
+ }
164
+ // Fallback to approximate dates if solar terms not found
165
+ if (!startDate) {
166
+ startDate = new Date(year, monthIndex + 1, 1);
167
+ }
168
+ if (!endDate) {
169
+ endDate = new Date(year, monthIndex + 2, 0);
170
+ }
171
+ return { startDate, endDate, solarTermInfo };
172
+ }
173
+ /**
174
+ * Analyze month fortune
175
+ */
176
+ analyzeMonth(monthStem, monthBranch, yearStem, yearBranch, dayMasterElement, yongShen) {
177
+ const monthElement = STEM_ELEMENTS[monthStem];
178
+ const monthBranchElement = BRANCH_ELEMENTS[monthBranch];
179
+ // Calculate fortune rating based on element compatibility
180
+ let rating = 50; // Base rating
181
+ // YongShen bonus
182
+ if (yongShen.includes(monthElement)) {
183
+ rating += 30;
184
+ }
185
+ // Element cycle bonus/penalty
186
+ const elementCycle = {
187
+ '木': '火', // Wood generates Fire
188
+ '火': '土', // Fire generates Earth
189
+ '土': '金', // Earth generates Metal
190
+ '金': '水', // Metal generates Water
191
+ '水': '木' // Water generates Wood
192
+ };
193
+ const elementControl = {
194
+ '木': '土', // Wood controls Earth
195
+ '土': '水', // Earth controls Water
196
+ '水': '火', // Water controls Fire
197
+ '火': '金', // Fire controls Metal
198
+ '金': '木' // Metal controls Wood
199
+ };
200
+ if (elementCycle[dayMasterElement] === monthElement) {
201
+ rating += 10; // Month supports day master
202
+ }
203
+ else if (elementCycle[monthElement] === dayMasterElement) {
204
+ rating += 15; // Day master receives support
205
+ }
206
+ else if (elementControl[monthElement] === dayMasterElement) {
207
+ rating -= 20; // Day master is controlled
208
+ }
209
+ else if (elementControl[dayMasterElement] === monthElement) {
210
+ rating += 5; // Day master controls month
211
+ }
212
+ // Ensure rating is within bounds
213
+ rating = Math.max(0, Math.min(100, rating));
214
+ // Analyze influences
215
+ const mainInfluences = [];
216
+ const opportunities = [];
217
+ const challenges = [];
218
+ const recommendations = [];
219
+ const healthFocus = [];
220
+ // Month-Year interaction
221
+ if (this.isHarmony(monthStem, yearStem)) {
222
+ mainInfluences.push('month_year_harmony');
223
+ opportunities.push('smooth_progress');
224
+ }
225
+ if (this.isClash(monthBranch, yearBranch)) {
226
+ mainInfluences.push('month_year_clash');
227
+ challenges.push('potential_conflicts');
228
+ }
229
+ // YongShen support
230
+ if (yongShen.includes(monthElement)) {
231
+ opportunities.push('yongshen_support');
232
+ recommendations.push('seize_opportunities');
233
+ }
234
+ else if (this.isUnfavorable(monthElement, yongShen)) {
235
+ challenges.push('unfavorable_element');
236
+ recommendations.push('stay_cautious');
237
+ }
238
+ // Health focus based on element
239
+ healthFocus.push(...this.getHealthFocus(monthElement));
240
+ // Fortune description
241
+ const fortune = this.getFortuneDescription(rating);
242
+ return {
243
+ fortune,
244
+ rating,
245
+ mainInfluences,
246
+ opportunities,
247
+ challenges,
248
+ recommendations,
249
+ healthFocus
250
+ };
251
+ }
252
+ /**
253
+ * Calculate lucky days within a month
254
+ */
255
+ calculateLuckyDays(monthStem, monthBranch, dayMasterElement) {
256
+ const luckyDays = [];
257
+ const monthElement = STEM_ELEMENTS[monthStem];
258
+ // Simplified lucky day calculation
259
+ // In production, calculate based on daily stems and branches
260
+ for (let day = 1; day <= 30; day++) {
261
+ if ((day % 6) === (STEMS.indexOf(monthStem) % 6)) {
262
+ luckyDays.push(day);
263
+ }
264
+ }
265
+ return luckyDays.slice(0, 5); // Return top 5 lucky days
266
+ }
267
+ /**
268
+ * Check if two stems are in harmony
269
+ */
270
+ isHarmony(stem1, stem2) {
271
+ const harmonies = {
272
+ '甲': '己', '己': '甲',
273
+ '乙': '庚', '庚': '乙',
274
+ '丙': '辛', '辛': '丙',
275
+ '丁': '壬', '壬': '丁',
276
+ '戊': '癸', '癸': '戊'
277
+ };
278
+ return harmonies[stem1] === stem2;
279
+ }
280
+ /**
281
+ * Check if two branches clash
282
+ */
283
+ isClash(branch1, branch2) {
284
+ const clashes = {
285
+ '子': '午', '午': '子',
286
+ '丑': '未', '未': '丑',
287
+ '寅': '申', '申': '寅',
288
+ '卯': '酉', '酉': '卯',
289
+ '辰': '戌', '戌': '辰',
290
+ '巳': '亥', '亥': '巳'
291
+ };
292
+ return clashes[branch1] === branch2;
293
+ }
294
+ /**
295
+ * Check if element is unfavorable
296
+ */
297
+ isUnfavorable(element, yongShen) {
298
+ const unfavorableMap = {
299
+ '木': ['金'],
300
+ '火': ['水'],
301
+ '土': ['木'],
302
+ '金': ['火'],
303
+ '水': ['土']
304
+ };
305
+ return yongShen.some(ys => unfavorableMap[ys]?.includes(element));
306
+ }
307
+ /**
308
+ * Get health focus areas based on element
309
+ */
310
+ getHealthFocus(element) {
311
+ const healthMap = {
312
+ '木': ['liver_health', 'eye_care', 'emotional_balance'],
313
+ '火': ['heart_health', 'blood_circulation', 'sleep_quality'],
314
+ '土': ['digestive_health', 'immune_system', 'grounding'],
315
+ '金': ['respiratory_health', 'skin_care', 'detoxification'],
316
+ '水': ['kidney_health', 'bone_strength', 'hydration']
317
+ };
318
+ return healthMap[element] || [];
319
+ }
320
+ /**
321
+ * Get fortune description based on rating
322
+ */
323
+ getFortuneDescription(rating) {
324
+ if (rating >= 85)
325
+ return '优秀';
326
+ if (rating >= 70)
327
+ return 'very_good';
328
+ if (rating >= 55)
329
+ return '良好';
330
+ if (rating >= 40)
331
+ return '一般';
332
+ if (rating >= 25)
333
+ return '挑战';
334
+ return '困难';
335
+ }
336
+ }
337
+ exports.LiuYueCalculator = LiuYueCalculator;
338
+ //# sourceMappingURL=LiuYueCalculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiuYueCalculator.js","sourceRoot":"","sources":["../../../../src/services/bazi/calculators/LiuYueCalculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Luck Cycle Calculator
3
+ * Implements taro-bazi's complete luck cycle system
4
+ * Handles DaYun (大運), LiuNian (流年), LiuYue (流月), and LiuRi (流日)
5
+ */
6
+ import { BaziChart, Gender } from '../types';
7
+ export interface LuckSequence {
8
+ direction: 'forward' | 'backward';
9
+ startAge: number;
10
+ startDate: Date;
11
+ detailedStartTime?: {
12
+ years: number;
13
+ months: number;
14
+ days: number;
15
+ hours: number;
16
+ };
17
+ deliveryYears?: string[];
18
+ deliveryTiming?: string;
19
+ }
20
+ export interface DaYunPeriod {
21
+ index: number;
22
+ startAge: number;
23
+ endAge: number;
24
+ stemBranch: {
25
+ stem: string;
26
+ branch: string;
27
+ };
28
+ element: string;
29
+ yinYang: 'yin' | 'yang';
30
+ voidBranches?: string[];
31
+ }
32
+ export interface LiuNianYear {
33
+ year: number;
34
+ age: number;
35
+ stemBranch: {
36
+ stem: string;
37
+ branch: string;
38
+ };
39
+ element: string;
40
+ yinYang: 'yin' | 'yang';
41
+ }
42
+ export interface LiuYueMonth {
43
+ year: number;
44
+ month: number;
45
+ stemBranch: {
46
+ stem: string;
47
+ branch: string;
48
+ };
49
+ element: string;
50
+ }
51
+ export interface LiuRiDay {
52
+ date: Date;
53
+ stemBranch: {
54
+ stem: string;
55
+ branch: string;
56
+ };
57
+ element: string;
58
+ }
59
+ export declare class LuckCycleCalculator {
60
+ /**
61
+ * Calculate delivery stems based on birth year stem
62
+ * Returns the stems of years when DaYun changes
63
+ */
64
+ private static calculateDeliveryStems;
65
+ /**
66
+ * Calculate delivery timing based on solar term
67
+ * This should calculate the exact days after the solar term for delivery
68
+ */
69
+ private static calculateDeliveryTiming;
70
+ /**
71
+ * Calculate void branches (空亡) for a stem-branch combination
72
+ */
73
+ static calculateVoidBranches(stem: string, branch: string): string[];
74
+ /**
75
+ * Calculate luck sequence direction based on gender and year stem
76
+ * Male + Yang year OR Female + Yin year = Forward
77
+ * Male + Yin year OR Female + Yang year = Backward
78
+ */
79
+ static calLuckySequence(gender: Gender, yearStem: string): 'forward' | 'backward';
80
+ /**
81
+ * Calculate the starting age and date for luck cycles
82
+ * Based on distance to nearest solar term (forward or backward)
83
+ */
84
+ static calLuckyAge(birthDate: Date, gender: Gender, yearStem: string): LuckSequence;
85
+ /**
86
+ * Calculate complete list of 10-year luck pillars (大運)
87
+ * Usually calculates 8-10 periods covering 80-100 years
88
+ */
89
+ static calLuckyList(chart: BaziChart, gender: Gender, birthDate: Date, numberOfPeriods?: number): DaYunPeriod[];
90
+ /**
91
+ * Calculate fleeting year list (流年)
92
+ * Returns yearly pillars for specified years
93
+ */
94
+ static calFleetingYearList(birthYear: number, years: number[]): LiuNianYear[];
95
+ /**
96
+ * Calculate fleeting month list (流月)
97
+ * Returns monthly pillars for a specific year
98
+ */
99
+ static calFleetingMonthList(year: number): LiuYueMonth[];
100
+ /**
101
+ * Calculate fleeting day list (流日)
102
+ * Returns daily pillars for a specific month
103
+ */
104
+ static calFleetingDayList(year: number, month: number): LiuRiDay[];
105
+ /**
106
+ * Get current DaYun period for a specific age
107
+ */
108
+ static getCurrentDaYun(daYunList: DaYunPeriod[], age: number): DaYunPeriod | null;
109
+ /**
110
+ * Get current LiuNian for a specific year
111
+ */
112
+ static getCurrentLiuNian(birthYear: number, currentYear: number): LiuNianYear;
113
+ /**
114
+ * Calculate interaction between DaYun and LiuNian
115
+ * Returns analysis of their combined influence
116
+ */
117
+ static analyzeDaYunLiuNian(daYun: DaYunPeriod, liuNian: LiuNianYear): {
118
+ stemRelation: string;
119
+ branchRelation: string;
120
+ elementalBalance: string;
121
+ };
122
+ }
123
+ //# sourceMappingURL=LuckCycleCalculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LuckCycleCalculator.d.ts","sourceRoot":"","sources":["../../../../src/services/bazi/calculators/LuckCycleCalculator.ts"],"names":[],"mappings":"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"}