@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.
- package/README.en.md +250 -32
- package/README.md +250 -32
- package/dist/__tests__/date-fns-adapter.test.js +1 -1
- package/dist/__tests__/four-pillars.test.js +10 -9
- package/dist/__tests__/luck.test.d.ts +2 -0
- package/dist/__tests__/luck.test.d.ts.map +1 -0
- package/dist/__tests__/luck.test.js +33 -0
- package/dist/__tests__/lunar.test.js +1 -1
- package/dist/__tests__/luxon-adapter.test.js +1 -1
- package/dist/__tests__/relations.test.d.ts +2 -0
- package/dist/__tests__/relations.test.d.ts.map +1 -0
- package/dist/__tests__/relations.test.js +90 -0
- package/dist/__tests__/saju.test.d.ts +2 -0
- package/dist/__tests__/saju.test.d.ts.map +1 -0
- package/dist/__tests__/saju.test.js +133 -0
- package/dist/__tests__/sinsals.test.d.ts +2 -0
- package/dist/__tests__/sinsals.test.d.ts.map +1 -0
- package/dist/__tests__/sinsals.test.js +64 -0
- package/dist/__tests__/solar-terms.test.d.ts +2 -0
- package/dist/__tests__/solar-terms.test.d.ts.map +1 -0
- package/dist/__tests__/solar-terms.test.js +121 -0
- package/dist/__tests__/strength.test.d.ts +2 -0
- package/dist/__tests__/strength.test.d.ts.map +1 -0
- package/dist/__tests__/strength.test.js +44 -0
- package/dist/__tests__/ten-gods.test.d.ts +2 -0
- package/dist/__tests__/ten-gods.test.d.ts.map +1 -0
- package/dist/__tests__/ten-gods.test.js +119 -0
- package/dist/__tests__/twelve-stages.test.d.ts +2 -0
- package/dist/__tests__/twelve-stages.test.d.ts.map +1 -0
- package/dist/__tests__/twelve-stages.test.js +86 -0
- package/dist/__tests__/utils.test.d.ts +2 -0
- package/dist/__tests__/utils.test.d.ts.map +1 -0
- package/dist/__tests__/utils.test.js +130 -0
- package/dist/__tests__/yongshen.test.d.ts +2 -0
- package/dist/__tests__/yongshen.test.d.ts.map +1 -0
- package/dist/__tests__/yongshen.test.js +62 -0
- package/dist/adapters/date-fns.d.ts +1 -1
- package/dist/adapters/luxon.d.ts +1 -1
- package/dist/core/four-pillars.d.ts +6 -6
- package/dist/core/four-pillars.d.ts.map +1 -1
- package/dist/core/four-pillars.js +10 -26
- package/dist/core/luck.d.ts +60 -0
- package/dist/core/luck.d.ts.map +1 -0
- package/dist/core/luck.js +137 -0
- package/dist/core/relations.d.ts +94 -0
- package/dist/core/relations.d.ts.map +1 -0
- package/dist/core/relations.js +309 -0
- package/dist/core/sinsals.d.ts +19 -0
- package/dist/core/sinsals.d.ts.map +1 -0
- package/dist/core/sinsals.js +339 -0
- package/dist/core/solar-terms.d.ts +155 -0
- package/dist/core/solar-terms.d.ts.map +1 -0
- package/dist/core/solar-terms.js +266 -0
- package/dist/core/strength.d.ts +18 -0
- package/dist/core/strength.d.ts.map +1 -0
- package/dist/core/strength.js +255 -0
- package/dist/core/ten-gods.d.ts +127 -0
- package/dist/core/ten-gods.d.ts.map +1 -0
- package/dist/core/ten-gods.js +331 -0
- package/dist/core/twelve-stages.d.ts +17 -0
- package/dist/core/twelve-stages.d.ts.map +1 -0
- package/dist/core/twelve-stages.js +77 -0
- package/dist/core/yongshen.d.ts +20 -0
- package/dist/core/yongshen.d.ts.map +1 -0
- package/dist/core/yongshen.js +216 -0
- package/dist/index.d.ts +63 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +57 -2
- package/dist/types/common.d.ts +12 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/utils/constants.d.ts +13 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +59 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
+
});
|
package/dist/adapters/luxon.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { DateAdapter } from "
|
|
2
|
-
import { type LunarDate } from "
|
|
3
|
-
|
|
4
|
-
export
|
|
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
|
|
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":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
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 "
|
|
2
|
-
|
|
3
|
-
export
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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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"}
|