@gracefullight/saju 0.2.0 → 0.4.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 (81) hide show
  1. package/README.en.md +250 -32
  2. package/README.md +250 -32
  3. package/dist/__tests__/date-fns-adapter.test.js +1 -1
  4. package/dist/__tests__/four-pillars.test.js +10 -9
  5. package/dist/__tests__/luck.test.d.ts +2 -0
  6. package/dist/__tests__/luck.test.d.ts.map +1 -0
  7. package/dist/__tests__/luck.test.js +33 -0
  8. package/dist/__tests__/lunar.test.js +1 -1
  9. package/dist/__tests__/luxon-adapter.test.js +1 -1
  10. package/dist/__tests__/relations.test.d.ts +2 -0
  11. package/dist/__tests__/relations.test.d.ts.map +1 -0
  12. package/dist/__tests__/relations.test.js +90 -0
  13. package/dist/__tests__/saju.test.d.ts +2 -0
  14. package/dist/__tests__/saju.test.d.ts.map +1 -0
  15. package/dist/__tests__/saju.test.js +133 -0
  16. package/dist/__tests__/sinsals.test.d.ts +2 -0
  17. package/dist/__tests__/sinsals.test.d.ts.map +1 -0
  18. package/dist/__tests__/sinsals.test.js +64 -0
  19. package/dist/__tests__/solar-terms.test.d.ts +2 -0
  20. package/dist/__tests__/solar-terms.test.d.ts.map +1 -0
  21. package/dist/__tests__/solar-terms.test.js +121 -0
  22. package/dist/__tests__/strength.test.d.ts +2 -0
  23. package/dist/__tests__/strength.test.d.ts.map +1 -0
  24. package/dist/__tests__/strength.test.js +44 -0
  25. package/dist/__tests__/ten-gods.test.d.ts +2 -0
  26. package/dist/__tests__/ten-gods.test.d.ts.map +1 -0
  27. package/dist/__tests__/ten-gods.test.js +119 -0
  28. package/dist/__tests__/twelve-stages.test.d.ts +2 -0
  29. package/dist/__tests__/twelve-stages.test.d.ts.map +1 -0
  30. package/dist/__tests__/twelve-stages.test.js +86 -0
  31. package/dist/__tests__/utils.test.d.ts +2 -0
  32. package/dist/__tests__/utils.test.d.ts.map +1 -0
  33. package/dist/__tests__/utils.test.js +130 -0
  34. package/dist/__tests__/yongshen.test.d.ts +2 -0
  35. package/dist/__tests__/yongshen.test.d.ts.map +1 -0
  36. package/dist/__tests__/yongshen.test.js +62 -0
  37. package/dist/adapters/date-fns.d.ts +1 -1
  38. package/dist/adapters/luxon.d.ts +1 -1
  39. package/dist/core/four-pillars.d.ts +6 -6
  40. package/dist/core/four-pillars.d.ts.map +1 -1
  41. package/dist/core/four-pillars.js +10 -26
  42. package/dist/core/luck.d.ts +60 -0
  43. package/dist/core/luck.d.ts.map +1 -0
  44. package/dist/core/luck.js +137 -0
  45. package/dist/core/relations.d.ts +94 -0
  46. package/dist/core/relations.d.ts.map +1 -0
  47. package/dist/core/relations.js +309 -0
  48. package/dist/core/sinsals.d.ts +19 -0
  49. package/dist/core/sinsals.d.ts.map +1 -0
  50. package/dist/core/sinsals.js +339 -0
  51. package/dist/core/solar-terms.d.ts +155 -0
  52. package/dist/core/solar-terms.d.ts.map +1 -0
  53. package/dist/core/solar-terms.js +266 -0
  54. package/dist/core/strength.d.ts +18 -0
  55. package/dist/core/strength.d.ts.map +1 -0
  56. package/dist/core/strength.js +255 -0
  57. package/dist/core/ten-gods.d.ts +127 -0
  58. package/dist/core/ten-gods.d.ts.map +1 -0
  59. package/dist/core/ten-gods.js +331 -0
  60. package/dist/core/twelve-stages.d.ts +17 -0
  61. package/dist/core/twelve-stages.d.ts.map +1 -0
  62. package/dist/core/twelve-stages.js +77 -0
  63. package/dist/core/yongshen.d.ts +20 -0
  64. package/dist/core/yongshen.d.ts.map +1 -0
  65. package/dist/core/yongshen.js +216 -0
  66. package/dist/index.d.ts +63 -3
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +57 -2
  69. package/dist/types/common.d.ts +12 -0
  70. package/dist/types/common.d.ts.map +1 -0
  71. package/dist/types/common.js +1 -0
  72. package/dist/types/index.d.ts +2 -0
  73. package/dist/types/index.d.ts.map +1 -0
  74. package/dist/types/index.js +1 -0
  75. package/dist/utils/constants.d.ts +13 -0
  76. package/dist/utils/constants.d.ts.map +1 -0
  77. package/dist/utils/constants.js +59 -0
  78. package/dist/utils/index.d.ts +2 -0
  79. package/dist/utils/index.d.ts.map +1 -0
  80. package/dist/utils/index.js +1 -0
  81. package/package.json +13 -12
@@ -0,0 +1,119 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { analyzeTenGods, countElements, countTenGods, getBranchElement, getHiddenStems, getStemElement, getStemPolarity, getTenGod, } from "../core/ten-gods";
3
+ describe("ten-gods", () => {
4
+ describe("getStemElement", () => {
5
+ it("returns correct element for each stem", () => {
6
+ expect(getStemElement("甲")).toBe("wood");
7
+ expect(getStemElement("乙")).toBe("wood");
8
+ expect(getStemElement("丙")).toBe("fire");
9
+ expect(getStemElement("丁")).toBe("fire");
10
+ expect(getStemElement("戊")).toBe("earth");
11
+ expect(getStemElement("己")).toBe("earth");
12
+ expect(getStemElement("庚")).toBe("metal");
13
+ expect(getStemElement("辛")).toBe("metal");
14
+ expect(getStemElement("壬")).toBe("water");
15
+ expect(getStemElement("癸")).toBe("water");
16
+ });
17
+ });
18
+ describe("getStemPolarity", () => {
19
+ it("returns correct polarity for each stem", () => {
20
+ expect(getStemPolarity("甲")).toBe("yang");
21
+ expect(getStemPolarity("乙")).toBe("yin");
22
+ expect(getStemPolarity("丙")).toBe("yang");
23
+ expect(getStemPolarity("丁")).toBe("yin");
24
+ });
25
+ });
26
+ describe("getBranchElement", () => {
27
+ it("returns correct element for each branch", () => {
28
+ expect(getBranchElement("子")).toBe("water");
29
+ expect(getBranchElement("丑")).toBe("earth");
30
+ expect(getBranchElement("寅")).toBe("wood");
31
+ expect(getBranchElement("卯")).toBe("wood");
32
+ expect(getBranchElement("午")).toBe("fire");
33
+ expect(getBranchElement("酉")).toBe("metal");
34
+ });
35
+ });
36
+ describe("getHiddenStems", () => {
37
+ it("returns correct hidden stems for each branch", () => {
38
+ expect(getHiddenStems("子")).toEqual(["癸"]);
39
+ expect(getHiddenStems("丑")).toEqual(["己", "癸", "辛"]);
40
+ expect(getHiddenStems("寅")).toEqual(["甲", "丙", "戊"]);
41
+ expect(getHiddenStems("卯")).toEqual(["乙"]);
42
+ expect(getHiddenStems("午")).toEqual(["丁", "己"]);
43
+ });
44
+ });
45
+ describe("getTenGod", () => {
46
+ it("correctly identifies 비견 (same element, same polarity)", () => {
47
+ expect(getTenGod("甲", "甲")).toBe("비견");
48
+ expect(getTenGod("乙", "乙")).toBe("비견");
49
+ });
50
+ it("correctly identifies 겁재 (same element, different polarity)", () => {
51
+ expect(getTenGod("甲", "乙")).toBe("겁재");
52
+ expect(getTenGod("乙", "甲")).toBe("겁재");
53
+ });
54
+ it("correctly identifies 식신 (I generate, same polarity)", () => {
55
+ expect(getTenGod("甲", "丙")).toBe("식신");
56
+ expect(getTenGod("丙", "戊")).toBe("식신");
57
+ });
58
+ it("correctly identifies 상관 (I generate, different polarity)", () => {
59
+ expect(getTenGod("甲", "丁")).toBe("상관");
60
+ expect(getTenGod("丙", "己")).toBe("상관");
61
+ });
62
+ it("correctly identifies 편재 (I control, same polarity)", () => {
63
+ expect(getTenGod("甲", "戊")).toBe("편재");
64
+ expect(getTenGod("丙", "庚")).toBe("편재");
65
+ });
66
+ it("correctly identifies 정재 (I control, different polarity)", () => {
67
+ expect(getTenGod("甲", "己")).toBe("정재");
68
+ expect(getTenGod("丙", "辛")).toBe("정재");
69
+ });
70
+ it("correctly identifies 편관 (controls me, same polarity)", () => {
71
+ expect(getTenGod("甲", "庚")).toBe("편관");
72
+ expect(getTenGod("丙", "壬")).toBe("편관");
73
+ });
74
+ it("correctly identifies 정관 (controls me, different polarity)", () => {
75
+ expect(getTenGod("甲", "辛")).toBe("정관");
76
+ expect(getTenGod("丙", "癸")).toBe("정관");
77
+ });
78
+ it("correctly identifies 편인 (generates me, same polarity)", () => {
79
+ expect(getTenGod("甲", "壬")).toBe("편인");
80
+ expect(getTenGod("丙", "甲")).toBe("편인");
81
+ });
82
+ it("correctly identifies 정인 (generates me, different polarity)", () => {
83
+ expect(getTenGod("甲", "癸")).toBe("정인");
84
+ expect(getTenGod("丙", "乙")).toBe("정인");
85
+ });
86
+ });
87
+ describe("analyzeTenGods", () => {
88
+ it("analyzes four pillars correctly", () => {
89
+ const result = analyzeTenGods("甲子", "丙寅", "甲辰", "乙亥");
90
+ expect(result.dayMaster).toBe("甲");
91
+ expect(result.year.stem.tenGod).toBe("비견");
92
+ expect(result.month.stem.tenGod).toBe("식신");
93
+ expect(result.day.stem.tenGod).toBe("일간");
94
+ expect(result.hour.stem.tenGod).toBe("겁재");
95
+ });
96
+ it("includes hidden stems analysis", () => {
97
+ const result = analyzeTenGods("甲子", "丙寅", "甲辰", "乙亥");
98
+ expect(result.year.branch.hiddenStems).toHaveLength(1);
99
+ expect(result.year.branch.hiddenStems[0].stem).toBe("癸");
100
+ expect(result.month.branch.hiddenStems).toHaveLength(3);
101
+ });
102
+ });
103
+ describe("countTenGods", () => {
104
+ it("counts ten gods correctly", () => {
105
+ const analysis = analyzeTenGods("甲子", "丙寅", "甲辰", "乙亥");
106
+ const counts = countTenGods(analysis);
107
+ expect(counts.비견).toBeGreaterThanOrEqual(1);
108
+ expect(counts.식신).toBeGreaterThanOrEqual(1);
109
+ });
110
+ });
111
+ describe("countElements", () => {
112
+ it("counts elements correctly", () => {
113
+ const analysis = analyzeTenGods("甲子", "丙寅", "甲辰", "乙亥");
114
+ const counts = countElements(analysis);
115
+ expect(counts.wood).toBeGreaterThanOrEqual(3);
116
+ expect(counts.fire).toBeGreaterThanOrEqual(1);
117
+ });
118
+ });
119
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=twelve-stages.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twelve-stages.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/twelve-stages.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { analyzeTwelveStages, getTwelveStage, STAGE_INFO, TWELVE_STAGES, } from "../core/twelve-stages";
3
+ describe("twelve-stages", () => {
4
+ describe("getTwelveStage", () => {
5
+ it("should return longLife for 甲 at 亥", () => {
6
+ expect(getTwelveStage("甲", "亥")).toBe("longLife");
7
+ });
8
+ it("should return imperial for 甲 at 卯", () => {
9
+ expect(getTwelveStage("甲", "卯")).toBe("imperial");
10
+ });
11
+ it("should return tomb for 甲 at 未", () => {
12
+ expect(getTwelveStage("甲", "未")).toBe("tomb");
13
+ });
14
+ it("should return longLife for 乙 at 午", () => {
15
+ expect(getTwelveStage("乙", "午")).toBe("longLife");
16
+ });
17
+ it("should return imperial for 乙 at 寅", () => {
18
+ expect(getTwelveStage("乙", "寅")).toBe("imperial");
19
+ });
20
+ it("should return longLife for 丙 at 寅", () => {
21
+ expect(getTwelveStage("丙", "寅")).toBe("longLife");
22
+ });
23
+ it("should return imperial for 丙 at 午", () => {
24
+ expect(getTwelveStage("丙", "午")).toBe("imperial");
25
+ });
26
+ it("should return longLife for 庚 at 巳", () => {
27
+ expect(getTwelveStage("庚", "巳")).toBe("longLife");
28
+ });
29
+ it("should return imperial for 庚 at 酉", () => {
30
+ expect(getTwelveStage("庚", "酉")).toBe("imperial");
31
+ });
32
+ it("should return longLife for 壬 at 申", () => {
33
+ expect(getTwelveStage("壬", "申")).toBe("longLife");
34
+ });
35
+ it("should return imperial for 壬 at 子", () => {
36
+ expect(getTwelveStage("壬", "子")).toBe("imperial");
37
+ });
38
+ it("should throw error for invalid stem", () => {
39
+ expect(() => getTwelveStage("X", "子")).toThrow("Invalid stem: X");
40
+ });
41
+ it("should throw error for invalid branch", () => {
42
+ expect(() => getTwelveStage("甲", "X")).toThrow("Invalid branch: X");
43
+ });
44
+ });
45
+ describe("analyzeTwelveStages", () => {
46
+ it("should analyze all four pillars", () => {
47
+ const result = analyzeTwelveStages("甲子", "丙寅", "戊辰", "庚午");
48
+ expect(result.year).toBeDefined();
49
+ expect(result.month).toBeDefined();
50
+ expect(result.day).toBeDefined();
51
+ expect(result.hour).toBeDefined();
52
+ expect(TWELVE_STAGES).toContain(result.year);
53
+ expect(TWELVE_STAGES).toContain(result.month);
54
+ expect(TWELVE_STAGES).toContain(result.day);
55
+ expect(TWELVE_STAGES).toContain(result.hour);
56
+ });
57
+ it("should correctly analyze 戊 day master", () => {
58
+ const result = analyzeTwelveStages("甲子", "丙寅", "戊辰", "庚午");
59
+ expect(result.month).toBe("longLife");
60
+ expect(result.hour).toBe("imperial");
61
+ });
62
+ });
63
+ describe("STAGE_INFO", () => {
64
+ it("should have info for all twelve stages", () => {
65
+ for (const stage of TWELVE_STAGES) {
66
+ expect(STAGE_INFO[stage]).toBeDefined();
67
+ expect(STAGE_INFO[stage].korean).toBeDefined();
68
+ expect(STAGE_INFO[stage].hanja).toBeDefined();
69
+ expect(STAGE_INFO[stage].meaning).toBeDefined();
70
+ expect(["strong", "neutral", "weak"]).toContain(STAGE_INFO[stage].strength);
71
+ }
72
+ });
73
+ it("should have correct korean names", () => {
74
+ expect(STAGE_INFO.longLife.korean).toBe("장생");
75
+ expect(STAGE_INFO.bathing.korean).toBe("목욕");
76
+ expect(STAGE_INFO.imperial.korean).toBe("제왕");
77
+ expect(STAGE_INFO.death.korean).toBe("사");
78
+ });
79
+ it("should have correct strength classifications", () => {
80
+ expect(STAGE_INFO.longLife.strength).toBe("strong");
81
+ expect(STAGE_INFO.imperial.strength).toBe("strong");
82
+ expect(STAGE_INFO.decline.strength).toBe("weak");
83
+ expect(STAGE_INFO.tomb.strength).toBe("neutral");
84
+ });
85
+ });
86
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,130 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { BRANCHES, dayPillarIndexFromJdn, ELEMENTS, getBranchIndex, getPillarIndex, getStemIndex, isYangStem, isYinStem, jdnFromDate, pillarFromIndex, STEMS, } from "../utils";
3
+ describe("constants", () => {
4
+ describe("STEMS", () => {
5
+ it("should have 10 stems", () => {
6
+ expect(STEMS).toHaveLength(10);
7
+ });
8
+ it("should start with 甲 and end with 癸", () => {
9
+ expect(STEMS[0]).toBe("甲");
10
+ expect(STEMS[9]).toBe("癸");
11
+ });
12
+ });
13
+ describe("BRANCHES", () => {
14
+ it("should have 12 branches", () => {
15
+ expect(BRANCHES).toHaveLength(12);
16
+ });
17
+ it("should start with 子 and end with 亥", () => {
18
+ expect(BRANCHES[0]).toBe("子");
19
+ expect(BRANCHES[11]).toBe("亥");
20
+ });
21
+ });
22
+ describe("ELEMENTS", () => {
23
+ it("should have 5 elements", () => {
24
+ expect(ELEMENTS).toHaveLength(5);
25
+ });
26
+ it("should contain wood, fire, earth, metal, water", () => {
27
+ expect(ELEMENTS).toContain("wood");
28
+ expect(ELEMENTS).toContain("fire");
29
+ expect(ELEMENTS).toContain("earth");
30
+ expect(ELEMENTS).toContain("metal");
31
+ expect(ELEMENTS).toContain("water");
32
+ });
33
+ });
34
+ });
35
+ describe("getStemIndex", () => {
36
+ it("should return correct index for each stem", () => {
37
+ expect(getStemIndex("甲")).toBe(0);
38
+ expect(getStemIndex("乙")).toBe(1);
39
+ expect(getStemIndex("癸")).toBe(9);
40
+ });
41
+ it("should return -1 for invalid stem", () => {
42
+ expect(getStemIndex("X")).toBe(-1);
43
+ });
44
+ });
45
+ describe("getBranchIndex", () => {
46
+ it("should return correct index for each branch", () => {
47
+ expect(getBranchIndex("子")).toBe(0);
48
+ expect(getBranchIndex("丑")).toBe(1);
49
+ expect(getBranchIndex("亥")).toBe(11);
50
+ });
51
+ it("should return -1 for invalid branch", () => {
52
+ expect(getBranchIndex("X")).toBe(-1);
53
+ });
54
+ });
55
+ describe("pillarFromIndex", () => {
56
+ it("should return 甲子 for index 0", () => {
57
+ expect(pillarFromIndex(0)).toBe("甲子");
58
+ });
59
+ it("should return 乙丑 for index 1", () => {
60
+ expect(pillarFromIndex(1)).toBe("乙丑");
61
+ });
62
+ it("should handle negative indices", () => {
63
+ expect(pillarFromIndex(-1)).toBe("癸亥");
64
+ });
65
+ it("should wrap around for indices >= 60", () => {
66
+ expect(pillarFromIndex(60)).toBe("甲子");
67
+ expect(pillarFromIndex(61)).toBe("乙丑");
68
+ });
69
+ });
70
+ describe("getPillarIndex", () => {
71
+ it("should return 0 for 甲子", () => {
72
+ expect(getPillarIndex("甲子")).toBe(0);
73
+ });
74
+ it("should return correct index for 乙丑", () => {
75
+ expect(getPillarIndex("乙丑")).toBe(1);
76
+ });
77
+ it("should be inverse of pillarFromIndex", () => {
78
+ for (let i = 0; i < 60; i++) {
79
+ const pillar = pillarFromIndex(i);
80
+ expect(getPillarIndex(pillar)).toBe(i);
81
+ }
82
+ });
83
+ });
84
+ describe("jdnFromDate", () => {
85
+ it("should return correct JDN for known date", () => {
86
+ expect(jdnFromDate(2000, 1, 1)).toBe(2451545);
87
+ });
88
+ it("should return correct JDN for epoch date", () => {
89
+ expect(jdnFromDate(1970, 1, 1)).toBe(2440588);
90
+ });
91
+ });
92
+ describe("dayPillarIndexFromJdn", () => {
93
+ it("should return value between 0 and 59", () => {
94
+ const idx = dayPillarIndexFromJdn(2451545);
95
+ expect(idx).toBeGreaterThanOrEqual(0);
96
+ expect(idx).toBeLessThan(60);
97
+ });
98
+ });
99
+ describe("isYangStem", () => {
100
+ it("should return true for yang stems", () => {
101
+ expect(isYangStem("甲")).toBe(true);
102
+ expect(isYangStem("丙")).toBe(true);
103
+ expect(isYangStem("戊")).toBe(true);
104
+ expect(isYangStem("庚")).toBe(true);
105
+ expect(isYangStem("壬")).toBe(true);
106
+ });
107
+ it("should return false for yin stems", () => {
108
+ expect(isYangStem("乙")).toBe(false);
109
+ expect(isYangStem("丁")).toBe(false);
110
+ expect(isYangStem("己")).toBe(false);
111
+ expect(isYangStem("辛")).toBe(false);
112
+ expect(isYangStem("癸")).toBe(false);
113
+ });
114
+ });
115
+ describe("isYinStem", () => {
116
+ it("should return true for yin stems", () => {
117
+ expect(isYinStem("乙")).toBe(true);
118
+ expect(isYinStem("丁")).toBe(true);
119
+ expect(isYinStem("己")).toBe(true);
120
+ expect(isYinStem("辛")).toBe(true);
121
+ expect(isYinStem("癸")).toBe(true);
122
+ });
123
+ it("should return false for yang stems", () => {
124
+ expect(isYinStem("甲")).toBe(false);
125
+ expect(isYinStem("丙")).toBe(false);
126
+ expect(isYinStem("戊")).toBe(false);
127
+ expect(isYinStem("庚")).toBe(false);
128
+ expect(isYinStem("壬")).toBe(false);
129
+ });
130
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=yongshen.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yongshen.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/yongshen.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { analyzeYongShen, getElementRecommendations } from "../core/yongshen";
3
+ describe("yongshen", () => {
4
+ describe("analyzeYongShen", () => {
5
+ it("returns yongshen analysis result", () => {
6
+ const result = analyzeYongShen("甲子", "丙寅", "甲辰", "乙亥");
7
+ expect(result.primary).toBeDefined();
8
+ expect(result.method).toBeDefined();
9
+ expect(result.reasoning).toBeDefined();
10
+ expect(result.allElements).toBeDefined();
11
+ });
12
+ it("identifies yongshen elements correctly", () => {
13
+ const result = analyzeYongShen("甲子", "丙寅", "甲辰", "乙亥");
14
+ expect(result.allElements[result.primary].isYongShen).toBe(true);
15
+ });
16
+ it("identifies kishen elements correctly", () => {
17
+ const result = analyzeYongShen("甲子", "丙寅", "甲辰", "乙亥");
18
+ const hasKiShen = Object.values(result.allElements).some((e) => e.isKiShen);
19
+ expect(hasKiShen).toBe(true);
20
+ });
21
+ it("uses 억부 method for 중화 strength (조후 is adjustment, not primary)", () => {
22
+ const result = analyzeYongShen("甲子", "丙寅", "庚申", "丁亥");
23
+ expect(["억부", "격국"]).toContain(result.method);
24
+ });
25
+ it("uses 억부 method for extreme strength", () => {
26
+ const result = analyzeYongShen("甲寅", "甲寅", "甲寅", "甲寅");
27
+ expect(result.method).toBe("억부");
28
+ });
29
+ it("includes johuAdjustment field in result", () => {
30
+ const result = analyzeYongShen("甲子", "丙寅", "甲辰", "乙亥");
31
+ expect("johuAdjustment" in result).toBe(true);
32
+ });
33
+ it("includes reasoning in result", () => {
34
+ const result = analyzeYongShen("甲子", "丙寅", "甲辰", "乙亥");
35
+ expect(result.reasoning.length).toBeGreaterThan(0);
36
+ });
37
+ });
38
+ describe("getElementRecommendations", () => {
39
+ it("returns colors for yongshen element", () => {
40
+ const yongShen = analyzeYongShen("甲子", "丙寅", "甲辰", "乙亥");
41
+ const recommendations = getElementRecommendations(yongShen);
42
+ expect(recommendations.colors.length).toBeGreaterThan(0);
43
+ });
44
+ it("returns directions for yongshen element", () => {
45
+ const yongShen = analyzeYongShen("甲子", "丙寅", "甲辰", "乙亥");
46
+ const recommendations = getElementRecommendations(yongShen);
47
+ expect(recommendations.directions.length).toBeGreaterThan(0);
48
+ });
49
+ it("returns numbers for yongshen element", () => {
50
+ const yongShen = analyzeYongShen("甲子", "丙寅", "甲辰", "乙亥");
51
+ const recommendations = getElementRecommendations(yongShen);
52
+ expect(recommendations.numbers.length).toBeGreaterThan(0);
53
+ });
54
+ it("includes secondary element recommendations when present", () => {
55
+ const yongShen = analyzeYongShen("甲子", "丙寅", "甲辰", "乙亥");
56
+ if (yongShen.secondary) {
57
+ const recommendations = getElementRecommendations(yongShen);
58
+ expect(recommendations.colors.length).toBeGreaterThan(2);
59
+ }
60
+ });
61
+ });
62
+ });
@@ -1,4 +1,4 @@
1
- import type { DateAdapter } from "@/adapters/date-adapter";
1
+ import type { DateAdapter } from "../adapters/date-adapter";
2
2
  interface DateFnsDate {
3
3
  date: Date;
4
4
  timeZone: string;
@@ -1,3 +1,3 @@
1
- import type { DateAdapter } from "@/adapters/date-adapter";
1
+ import type { DateAdapter } from "../adapters/date-adapter";
2
2
  export declare function createLuxonAdapter(): Promise<DateAdapter<import("luxon").DateTime>>;
3
3
  //# sourceMappingURL=luxon.d.ts.map
@@ -1,7 +1,7 @@
1
- import type { DateAdapter } from "@/adapters/date-adapter";
2
- import { type LunarDate } from "@/core/lunar";
3
- export declare const STEMS: string[];
4
- export declare const BRANCHES: string[];
1
+ import type { DateAdapter } from "../adapters/date-adapter";
2
+ import { type LunarDate } from "../core/lunar";
3
+ import { BRANCHES, STEMS } from "../utils";
4
+ export { STEMS, BRANCHES };
5
5
  export declare const STANDARD_PRESET: {
6
6
  dayBoundary: "midnight";
7
7
  useMeanSolarTimeForHour: boolean;
@@ -65,8 +65,8 @@ export declare function hourPillar<T>(adapter: DateAdapter<T>, dtLocal: T, { lon
65
65
  day: number;
66
66
  };
67
67
  };
68
- export declare function getFourPillars<T>(adapter: DateAdapter<T>, dtLocal: T, { longitudeDeg, tzOffsetHours, preset, }: {
69
- longitudeDeg: number;
68
+ export declare function getFourPillars<T>(adapter: DateAdapter<T>, dtLocal: T, { longitudeDeg, tzOffsetHours, preset, }?: {
69
+ longitudeDeg?: number;
70
70
  tzOffsetHours?: number;
71
71
  preset?: typeof presetA | typeof presetB;
72
72
  }): {
@@ -1 +1 @@
1
- {"version":3,"file":"four-pillars.d.ts","sourceRoot":"","sources":["../../src/core/four-pillars.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"four-pillars.d.ts","sourceRoot":"","sources":["../../src/core/four-pillars.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { getLunarDate } from "@/core/lunar";
2
- export const STEMS = ["甲", "乙", "丙", "丁", "戊", "己", "", "辛", "壬", "癸"];
3
- export const BRANCHES = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"];
1
+ import { getLunarDate } from "../core/lunar";
2
+ import { BRANCHES, jdnFromDate, pillarFromIndex, STEMS } from "../utils";
3
+ export { STEMS, BRANCHES };
4
4
  export const STANDARD_PRESET = {
5
5
  dayBoundary: "midnight",
6
- useMeanSolarTimeForHour: false,
6
+ useMeanSolarTimeForHour: true,
7
7
  useMeanSolarTimeForBoundary: false,
8
8
  };
9
9
  export const TRADITIONAL_PRESET = {
@@ -17,25 +17,10 @@ function normDeg(x) {
17
17
  x %= 360;
18
18
  return x < 0 ? x + 360 : x;
19
19
  }
20
- function pillarFrom60(idx60) {
21
- return STEMS[idx60 % 10] + BRANCHES[idx60 % 12];
22
- }
23
- function jdnFromDate(y, m, d) {
24
- const a = Math.floor((14 - m) / 12);
25
- const y2 = y + 4800 - a;
26
- const m2 = m + 12 * a - 3;
27
- return (d +
28
- Math.floor((153 * m2 + 2) / 5) +
29
- 365 * y2 +
30
- Math.floor(y2 / 4) -
31
- Math.floor(y2 / 100) +
32
- Math.floor(y2 / 400) -
33
- 32045);
34
- }
35
20
  export function dayPillarFromDate({ year, month, day, }) {
36
21
  const jdn = jdnFromDate(year, month, day);
37
22
  const idx60 = (((jdn - 11) % 60) + 60) % 60;
38
- return { idx60, pillar: pillarFrom60(idx60) };
23
+ return { idx60, pillar: pillarFromIndex(idx60) };
39
24
  }
40
25
  export function applyMeanSolarTime(adapter, dtLocal, longitudeDeg, tzOffsetHours = 9) {
41
26
  const deltaMinutes = 4 * (longitudeDeg - 15 * tzOffsetHours);
@@ -111,7 +96,7 @@ export function yearPillar(adapter, dtLocal) {
111
96
  const lichunLocal = adapter.setZone(lichunUtc(adapter, y), adapter.getZoneName(dtLocal));
112
97
  const solarYear = adapter.isGreaterThanOrEqual(dtLocal, lichunLocal) ? y : y - 1;
113
98
  const idx60 = (((solarYear - 1984) % 60) + 60) % 60;
114
- return { idx60, pillar: pillarFrom60(idx60), solarYear };
99
+ return { idx60, pillar: pillarFromIndex(idx60), solarYear };
115
100
  }
116
101
  function monthBranchIndexFromSunLon(lon) {
117
102
  return (Math.floor(((lon + 45) % 360) / 30) + 2) % 12;
@@ -184,9 +169,8 @@ export function hourPillar(adapter, dtLocal, { longitudeDeg, tzOffsetHours = 9,
184
169
  const hs = (dayStemIdx * 2 + hb) % 10;
185
170
  return { pillar: STEMS[hs] + BRANCHES[hb], adjustedDt: dtUsed, effectiveDate: effDate };
186
171
  }
187
- export function getFourPillars(adapter, dtLocal, { longitudeDeg, tzOffsetHours = 9, preset = presetA, }) {
188
- if (typeof longitudeDeg !== "number")
189
- throw new Error("longitudeDeg is required");
172
+ export function getFourPillars(adapter, dtLocal, { longitudeDeg, tzOffsetHours = 9, preset = presetA, } = {}) {
173
+ const effectiveLongitude = longitudeDeg ?? tzOffsetHours * 15;
190
174
  const dayBoundary = preset.dayBoundary ?? "midnight";
191
175
  const useMeanSolarTimeForHour = preset.useMeanSolarTimeForHour ?? false;
192
176
  const useMeanSolarTimeForBoundary = preset.useMeanSolarTimeForBoundary ?? false;
@@ -194,13 +178,13 @@ export function getFourPillars(adapter, dtLocal, { longitudeDeg, tzOffsetHours =
194
178
  const m = monthPillar(adapter, dtLocal);
195
179
  const effDate = effectiveDayDate(adapter, dtLocal, {
196
180
  dayBoundary,
197
- longitudeDeg,
181
+ longitudeDeg: effectiveLongitude,
198
182
  tzOffsetHours,
199
183
  useMeanSolarTimeForBoundary,
200
184
  });
201
185
  const d = dayPillarFromDate(effDate);
202
186
  const h = hourPillar(adapter, dtLocal, {
203
- longitudeDeg,
187
+ longitudeDeg: effectiveLongitude,
204
188
  tzOffsetHours,
205
189
  useMeanSolarTimeForHour,
206
190
  dayBoundary,
@@ -0,0 +1,60 @@
1
+ import type { DateAdapter } from "../adapters/date-adapter";
2
+ import type { Gender, Polarity } from "../types";
3
+ export type { Gender };
4
+ export interface LuckPillar {
5
+ index: number;
6
+ startAge: number;
7
+ endAge: number;
8
+ stem: string;
9
+ branch: string;
10
+ pillar: string;
11
+ }
12
+ export interface StartAgeDetail {
13
+ years: number;
14
+ months: number;
15
+ days: number;
16
+ }
17
+ export interface MajorLuckResult {
18
+ gender: Gender;
19
+ yearStemPolarity: Polarity;
20
+ isForward: boolean;
21
+ startAge: number;
22
+ startAgeDetail: StartAgeDetail;
23
+ daysToTerm: number;
24
+ pillars: LuckPillar[];
25
+ }
26
+ export declare function calculateMajorLuck<T>(adapter: DateAdapter<T>, birthDateTime: T, gender: Gender, yearPillar: string, monthPillar: string, options?: {
27
+ count?: number;
28
+ nextJieMillis?: number;
29
+ prevJieMillis?: number;
30
+ }): MajorLuckResult;
31
+ export interface YearlyLuckResult {
32
+ year: number;
33
+ stem: string;
34
+ branch: string;
35
+ pillar: string;
36
+ age: number;
37
+ }
38
+ export declare function calculateYearlyLuck(birthYear: number, fromYear: number, toYear: number): YearlyLuckResult[];
39
+ export declare function getYearPillar(year: number): string;
40
+ export declare function getCurrentMajorLuck(majorLuck: MajorLuckResult, age: number): LuckPillar | null;
41
+ export interface MonthlyLuckResult {
42
+ year: number;
43
+ month: number;
44
+ stem: string;
45
+ branch: string;
46
+ pillar: string;
47
+ }
48
+ export declare function calculateMonthlyLuck(year: number, fromMonth: number, toMonth: number): MonthlyLuckResult[];
49
+ export interface DailyLuckResult {
50
+ year: number;
51
+ month: number;
52
+ day: number;
53
+ stem: string;
54
+ branch: string;
55
+ pillar: string;
56
+ }
57
+ export declare function calculateDailyLuck(year: number, month: number, fromDay: number, toDay: number): DailyLuckResult[];
58
+ export declare function getDayPillar(year: number, month: number, day: number): string;
59
+ export declare function getMonthPillar(year: number, month: number): string;
60
+ //# sourceMappingURL=luck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"luck.d.ts","sourceRoot":"","sources":["../../src/core/luck.ts"],"names":[],"mappings":"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"}