astrology-insights 2.1.0 → 2.3.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.
Files changed (74) hide show
  1. package/dist/core/constants.js +165 -0
  2. package/dist/core/karana.js +23 -0
  3. package/dist/core/nakshatra.js +21 -0
  4. package/dist/core/rashi.js +17 -0
  5. package/dist/core/tithi.js +36 -0
  6. package/dist/core/yoga.js +16 -0
  7. package/dist/panchang/src/birthchart/analysis/aspects.d.ts +24 -0
  8. package/dist/panchang/src/birthchart/analysis/aspects.js +78 -0
  9. package/dist/panchang/src/birthchart/analysis/dosha.d.ts +63 -0
  10. package/dist/panchang/src/birthchart/analysis/dosha.js +326 -0
  11. package/dist/panchang/src/birthchart/analysis/friendships.d.ts +35 -0
  12. package/dist/panchang/src/birthchart/analysis/friendships.js +152 -0
  13. package/dist/panchang/src/birthchart/analysis/index.d.ts +11 -0
  14. package/dist/panchang/src/birthchart/analysis/index.js +17 -0
  15. package/dist/panchang/src/birthchart/analysis/shadbala.d.ts +47 -0
  16. package/dist/panchang/src/birthchart/analysis/shadbala.js +299 -0
  17. package/dist/panchang/src/birthchart/analysis/tattva.d.ts +24 -0
  18. package/dist/panchang/src/birthchart/analysis/tattva.js +63 -0
  19. package/dist/panchang/src/birthchart/birthchart.d.ts +17 -0
  20. package/dist/panchang/src/birthchart/birthchart.js +179 -0
  21. package/dist/panchang/src/birthchart/core/ascendant.d.ts +25 -0
  22. package/dist/panchang/src/birthchart/core/ascendant.js +118 -0
  23. package/dist/panchang/src/birthchart/core/constants.d.ts +31 -0
  24. package/dist/panchang/src/birthchart/core/constants.js +84 -0
  25. package/dist/panchang/src/birthchart/core/houses.d.ts +25 -0
  26. package/dist/panchang/src/birthchart/core/houses.js +76 -0
  27. package/dist/panchang/src/birthchart/core/planets.d.ts +10 -0
  28. package/dist/panchang/src/birthchart/core/planets.js +143 -0
  29. package/dist/panchang/src/birthchart/core/states.d.ts +28 -0
  30. package/dist/panchang/src/birthchart/core/states.js +84 -0
  31. package/dist/panchang/src/birthchart/dasha/constants.d.ts +7 -0
  32. package/dist/panchang/src/birthchart/dasha/constants.js +55 -0
  33. package/dist/panchang/src/birthchart/dasha/index.d.ts +6 -0
  34. package/dist/panchang/src/birthchart/dasha/index.js +12 -0
  35. package/dist/panchang/src/birthchart/dasha/vimshottari.d.ts +41 -0
  36. package/dist/panchang/src/birthchart/dasha/vimshottari.js +195 -0
  37. package/dist/panchang/src/birthchart/divisional/calculator.d.ts +34 -0
  38. package/dist/panchang/src/birthchart/divisional/calculator.js +292 -0
  39. package/dist/panchang/src/birthchart/divisional/charts.d.ts +15 -0
  40. package/dist/panchang/src/birthchart/divisional/charts.js +32 -0
  41. package/dist/panchang/src/birthchart/divisional/index.d.ts +9 -0
  42. package/dist/panchang/src/birthchart/divisional/index.js +13 -0
  43. package/dist/panchang/src/birthchart/divisional/shodashvarga.d.ts +22 -0
  44. package/dist/panchang/src/birthchart/divisional/shodashvarga.js +87 -0
  45. package/dist/panchang/src/birthchart/index.d.ts +26 -0
  46. package/dist/panchang/src/birthchart/index.js +57 -0
  47. package/dist/panchang/src/birthchart/layout/chart-layout.d.ts +13 -0
  48. package/dist/panchang/src/birthchart/layout/chart-layout.js +83 -0
  49. package/dist/panchang/src/birthchart/recommendations/index.d.ts +7 -0
  50. package/dist/panchang/src/birthchart/recommendations/index.js +12 -0
  51. package/dist/panchang/src/birthchart/recommendations/names.d.ts +26 -0
  52. package/dist/panchang/src/birthchart/recommendations/names.js +616 -0
  53. package/dist/panchang/src/birthchart/recommendations/remedies.d.ts +63 -0
  54. package/dist/panchang/src/birthchart/recommendations/remedies.js +305 -0
  55. package/dist/panchang/src/birthchart/types.d.ts +83 -0
  56. package/dist/panchang/src/birthchart/types.js +10 -0
  57. package/dist/panchang/src/calculations/ephemeris.d.ts +80 -0
  58. package/dist/panchang/src/calculations/ephemeris.js +631 -0
  59. package/dist/panchang/src/calculations/planetary.d.ts +75 -0
  60. package/dist/panchang/src/calculations/planetary.js +317 -0
  61. package/dist/panchang/src/panchang-v2.js +104 -4
  62. package/dist/panchang/src/timings/kalam.js +4 -4
  63. package/dist/panchang/src/timings/muhurat.js +1 -1
  64. package/dist/panchang/src/types/panchang.d.ts +161 -0
  65. package/dist/panchang/src/types/panchang.js +5 -0
  66. package/dist/panchang/src/utils/index.d.ts +74 -0
  67. package/dist/panchang/src/utils/index.js +117 -0
  68. package/dist/panchang-v2.js +396 -0
  69. package/dist/timings/kalam.js +114 -0
  70. package/dist/timings/muhurat.js +134 -0
  71. package/dist/types.js +7 -0
  72. package/index.rn.js +68 -34
  73. package/package.json +2 -1
  74. package/panchang/src/panchang-v2.ts +117 -4
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * Panchang constants — astronomical degrees, names, and lookup tables.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RASHIS = exports.KARANA_NAMES_FIXED = exports.KARANA_NAMES_REPEATING = exports.YOGA_NAMES = exports.NAKSHATRAS = exports.TITHI_NAMES = exports.normalizeAngle = exports.DEGREES_PER_RASHI = exports.DEGREES_PER_YOGA = exports.DEGREES_PER_PADA = exports.DEGREES_PER_NAKSHATRA = exports.DEGREES_PER_TITHI = void 0;
7
+ // ---------------------------------------------------------------------------
8
+ // Degree constants
9
+ // ---------------------------------------------------------------------------
10
+ exports.DEGREES_PER_TITHI = 12;
11
+ exports.DEGREES_PER_NAKSHATRA = 13.333333;
12
+ exports.DEGREES_PER_PADA = 3.333333;
13
+ exports.DEGREES_PER_YOGA = 13.333333;
14
+ exports.DEGREES_PER_RASHI = 30;
15
+ // ---------------------------------------------------------------------------
16
+ // Helper
17
+ // ---------------------------------------------------------------------------
18
+ function normalizeAngle(angle) {
19
+ let normalized = angle % 360;
20
+ if (normalized < 0) {
21
+ normalized += 360;
22
+ }
23
+ return normalized;
24
+ }
25
+ exports.normalizeAngle = normalizeAngle;
26
+ // ---------------------------------------------------------------------------
27
+ // Tithi names (30 total: 15 Shukla + 15 Krishna)
28
+ // Index 0-14 = Shukla Paksha; index 15-29 = Krishna Paksha
29
+ // The 15th tithi of each paksha is Purnima / Amavasya respectively.
30
+ // ---------------------------------------------------------------------------
31
+ exports.TITHI_NAMES = [
32
+ // Shukla Paksha (1–15)
33
+ 'Shukla Pratipada',
34
+ 'Shukla Dwitiya',
35
+ 'Shukla Tritiya',
36
+ 'Shukla Chaturthi',
37
+ 'Shukla Panchami',
38
+ 'Shukla Shashthi',
39
+ 'Shukla Saptami',
40
+ 'Shukla Ashtami',
41
+ 'Shukla Navami',
42
+ 'Shukla Dashami',
43
+ 'Shukla Ekadashi',
44
+ 'Shukla Dwadashi',
45
+ 'Shukla Trayodashi',
46
+ 'Shukla Chaturdashi',
47
+ 'Purnima',
48
+ // Krishna Paksha (1–15)
49
+ 'Krishna Pratipada',
50
+ 'Krishna Dwitiya',
51
+ 'Krishna Tritiya',
52
+ 'Krishna Chaturthi',
53
+ 'Krishna Panchami',
54
+ 'Krishna Shashthi',
55
+ 'Krishna Saptami',
56
+ 'Krishna Ashtami',
57
+ 'Krishna Navami',
58
+ 'Krishna Dashami',
59
+ 'Krishna Ekadashi',
60
+ 'Krishna Dwadashi',
61
+ 'Krishna Trayodashi',
62
+ 'Krishna Chaturdashi',
63
+ 'Amavasya',
64
+ ];
65
+ // ---------------------------------------------------------------------------
66
+ // Nakshatras (27)
67
+ // ---------------------------------------------------------------------------
68
+ exports.NAKSHATRAS = [
69
+ { name: 'Ashwini', lord: 'Ketu', deity: 'Ashwini Kumaras' },
70
+ { name: 'Bharani', lord: 'Venus', deity: 'Yama' },
71
+ { name: 'Krittika', lord: 'Sun', deity: 'Agni' },
72
+ { name: 'Rohini', lord: 'Moon', deity: 'Brahma' },
73
+ { name: 'Mrigashira', lord: 'Mars', deity: 'Soma' },
74
+ { name: 'Ardra', lord: 'Rahu', deity: 'Rudra' },
75
+ { name: 'Punarvasu', lord: 'Jupiter', deity: 'Aditi' },
76
+ { name: 'Pushya', lord: 'Saturn', deity: 'Brihaspati' },
77
+ { name: 'Ashlesha', lord: 'Mercury', deity: 'Nagas' },
78
+ { name: 'Magha', lord: 'Ketu', deity: 'Pitrs' },
79
+ { name: 'Purva Phalguni', lord: 'Venus', deity: 'Bhaga' },
80
+ { name: 'Uttara Phalguni', lord: 'Sun', deity: 'Aryaman' },
81
+ { name: 'Hasta', lord: 'Moon', deity: 'Savitar' },
82
+ { name: 'Chitra', lord: 'Mars', deity: 'Vishvakarma' },
83
+ { name: 'Swati', lord: 'Rahu', deity: 'Vayu' },
84
+ { name: 'Vishakha', lord: 'Jupiter', deity: 'Indragni' },
85
+ { name: 'Anuradha', lord: 'Saturn', deity: 'Mitra' },
86
+ { name: 'Jyeshtha', lord: 'Mercury', deity: 'Indra' },
87
+ { name: 'Mula', lord: 'Ketu', deity: 'Nirriti' },
88
+ { name: 'Purva Ashadha', lord: 'Venus', deity: 'Apah' },
89
+ { name: 'Uttara Ashadha', lord: 'Sun', deity: 'Vishvedevas' },
90
+ { name: 'Shravana', lord: 'Moon', deity: 'Vishnu' },
91
+ { name: 'Dhanishtha', lord: 'Mars', deity: 'Vasus' },
92
+ { name: 'Shatabhisha', lord: 'Rahu', deity: 'Varuna' },
93
+ { name: 'Purva Bhadrapada', lord: 'Jupiter', deity: 'Ajaikapat' },
94
+ { name: 'Uttara Bhadrapada', lord: 'Saturn', deity: 'Ahirbudhnya' },
95
+ { name: 'Revati', lord: 'Mercury', deity: 'Pushan' },
96
+ ];
97
+ // ---------------------------------------------------------------------------
98
+ // Yoga names (27)
99
+ // ---------------------------------------------------------------------------
100
+ exports.YOGA_NAMES = [
101
+ 'Vishkumbha',
102
+ 'Preeti',
103
+ 'Ayushman',
104
+ 'Saubhagya',
105
+ 'Shobhana',
106
+ 'Atiganda',
107
+ 'Sukarman',
108
+ 'Dhriti',
109
+ 'Shoola',
110
+ 'Ganda',
111
+ 'Vriddhi',
112
+ 'Dhruva',
113
+ 'Vyaghata',
114
+ 'Harshana',
115
+ 'Vajra',
116
+ 'Siddhi',
117
+ 'Vyatipata',
118
+ 'Variyan',
119
+ 'Parigha',
120
+ 'Shiva',
121
+ 'Siddha',
122
+ 'Sadhya',
123
+ 'Shubha',
124
+ 'Shukla',
125
+ 'Brahma',
126
+ 'Indra',
127
+ 'Vaidhriti',
128
+ ];
129
+ // ---------------------------------------------------------------------------
130
+ // Karana names
131
+ // ---------------------------------------------------------------------------
132
+ /** 7 movable (repeating) karanas */
133
+ exports.KARANA_NAMES_REPEATING = [
134
+ 'Bava',
135
+ 'Balava',
136
+ 'Kaulava',
137
+ 'Taitila',
138
+ 'Garija',
139
+ 'Vanija',
140
+ 'Vishti',
141
+ ];
142
+ /** 4 fixed karanas (occur once per lunar month at the end) */
143
+ exports.KARANA_NAMES_FIXED = [
144
+ 'Shakuni',
145
+ 'Chatushpad',
146
+ 'Naga',
147
+ 'Kimstughna',
148
+ ];
149
+ // ---------------------------------------------------------------------------
150
+ // Rashis (12)
151
+ // ---------------------------------------------------------------------------
152
+ exports.RASHIS = [
153
+ { name: 'Aries', sanskritName: 'Mesha', lord: 'Mars', element: 'Fire' },
154
+ { name: 'Taurus', sanskritName: 'Vrishabha', lord: 'Venus', element: 'Earth' },
155
+ { name: 'Gemini', sanskritName: 'Mithuna', lord: 'Mercury', element: 'Air' },
156
+ { name: 'Cancer', sanskritName: 'Karka', lord: 'Moon', element: 'Water' },
157
+ { name: 'Leo', sanskritName: 'Simha', lord: 'Sun', element: 'Fire' },
158
+ { name: 'Virgo', sanskritName: 'Kanya', lord: 'Mercury', element: 'Earth' },
159
+ { name: 'Libra', sanskritName: 'Tula', lord: 'Venus', element: 'Air' },
160
+ { name: 'Scorpio', sanskritName: 'Vrishchika', lord: 'Mars', element: 'Water' },
161
+ { name: 'Sagittarius', sanskritName: 'Dhanu', lord: 'Jupiter', element: 'Fire' },
162
+ { name: 'Capricorn', sanskritName: 'Makara', lord: 'Saturn', element: 'Earth' },
163
+ { name: 'Aquarius', sanskritName: 'Kumbha', lord: 'Saturn', element: 'Air' },
164
+ { name: 'Pisces', sanskritName: 'Meena', lord: 'Jupiter', element: 'Water' },
165
+ ];
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateKarana = void 0;
4
+ const constants_1 = require("./constants");
5
+ const DEGREES_PER_KARANA = 6;
6
+ function calculateKarana(sunLongitude, moonLongitude) {
7
+ const diff = (0, constants_1.normalizeAngle)(moonLongitude - sunLongitude);
8
+ const karanaIndex = Math.floor(diff / DEGREES_PER_KARANA);
9
+ const posInKarana = diff - (karanaIndex * DEGREES_PER_KARANA);
10
+ const progress = (posInKarana / DEGREES_PER_KARANA) * 100;
11
+ let name;
12
+ if (karanaIndex === 0) {
13
+ name = 'Kimstughna';
14
+ }
15
+ else if (karanaIndex >= 57) {
16
+ name = constants_1.KARANA_NAMES_FIXED[karanaIndex - 57];
17
+ }
18
+ else {
19
+ name = constants_1.KARANA_NAMES_REPEATING[(karanaIndex - 1) % 7];
20
+ }
21
+ return { name, number: karanaIndex + 1, progress: Math.round(progress * 10) / 10 };
22
+ }
23
+ exports.calculateKarana = calculateKarana;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateNakshatra = void 0;
4
+ const constants_1 = require("./constants");
5
+ function calculateNakshatra(moonLongitude) {
6
+ const lon = (0, constants_1.normalizeAngle)(moonLongitude);
7
+ const nakshatraIndex = Math.floor(lon / constants_1.DEGREES_PER_NAKSHATRA);
8
+ const posInNakshatra = lon - (nakshatraIndex * constants_1.DEGREES_PER_NAKSHATRA);
9
+ const pada = Math.min(Math.floor(posInNakshatra / constants_1.DEGREES_PER_PADA) + 1, 4);
10
+ const posInPada = posInNakshatra - ((pada - 1) * constants_1.DEGREES_PER_PADA);
11
+ const nk = constants_1.NAKSHATRAS[nakshatraIndex];
12
+ const progress = (posInNakshatra / constants_1.DEGREES_PER_NAKSHATRA) * 100;
13
+ const padaProgress = (posInPada / constants_1.DEGREES_PER_PADA) * 100;
14
+ return {
15
+ name: nk.name, number: nakshatraIndex + 1, pada,
16
+ lord: nk.lord, deity: nk.deity,
17
+ progress: Math.round(progress * 10) / 10,
18
+ padaProgress: Math.round(padaProgress * 10) / 10,
19
+ };
20
+ }
21
+ exports.calculateNakshatra = calculateNakshatra;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateRashi = void 0;
4
+ const constants_1 = require("./constants");
5
+ function calculateRashi(longitude) {
6
+ const lon = (0, constants_1.normalizeAngle)(longitude);
7
+ const rashiIndex = Math.floor(lon / constants_1.DEGREES_PER_RASHI);
8
+ const degree = lon - (rashiIndex * constants_1.DEGREES_PER_RASHI);
9
+ const rashi = constants_1.RASHIS[rashiIndex];
10
+ return {
11
+ name: rashi.name,
12
+ lord: rashi.lord,
13
+ degree: Math.round(degree * 10) / 10,
14
+ number: rashiIndex + 1,
15
+ };
16
+ }
17
+ exports.calculateRashi = calculateRashi;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateTithi = void 0;
4
+ const constants_1 = require("./constants");
5
+ // Bare tithi names (without paksha prefix) for both halves.
6
+ // Index 0–14: Shukla Paksha tithis; index 15–29: Krishna Paksha tithis.
7
+ // Purnima (index 14) and Amavasya (index 29) have no paksha prefix.
8
+ const BARE_TITHI_NAMES = [
9
+ 'Pratipada', 'Dwitiya', 'Tritiya', 'Chaturthi', 'Panchami',
10
+ 'Shashthi', 'Saptami', 'Ashtami', 'Navami', 'Dashami',
11
+ 'Ekadashi', 'Dwadashi', 'Trayodashi', 'Chaturdashi', 'Purnima',
12
+ 'Pratipada', 'Dwitiya', 'Tritiya', 'Chaturthi', 'Panchami',
13
+ 'Shashthi', 'Saptami', 'Ashtami', 'Navami', 'Dashami',
14
+ 'Ekadashi', 'Dwadashi', 'Trayodashi', 'Chaturdashi', 'Amavasya',
15
+ ];
16
+ function calculateTithi(sunLongitude, moonLongitude) {
17
+ const diff = (0, constants_1.normalizeAngle)(moonLongitude - sunLongitude);
18
+ const tithiIndex = Math.floor(diff / constants_1.DEGREES_PER_TITHI);
19
+ const progress = ((diff % constants_1.DEGREES_PER_TITHI) / constants_1.DEGREES_PER_TITHI) * 100;
20
+ const isShukla = tithiIndex < 15;
21
+ const paksha = isShukla ? 'Shukla' : 'Krishna';
22
+ const pakshaNumber = isShukla ? tithiIndex + 1 : tithiIndex - 15 + 1;
23
+ const baseName = BARE_TITHI_NAMES[tithiIndex];
24
+ // Purnima and Amavasya are standalone names; all others get paksha prefix.
25
+ const name = (baseName === 'Purnima' || baseName === 'Amavasya')
26
+ ? baseName
27
+ : `${paksha} ${baseName}`;
28
+ return {
29
+ name,
30
+ number: pakshaNumber,
31
+ tithiIndex: tithiIndex + 1,
32
+ paksha,
33
+ progress: Math.round(progress * 10) / 10,
34
+ };
35
+ }
36
+ exports.calculateTithi = calculateTithi;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateYoga = void 0;
4
+ const constants_1 = require("./constants");
5
+ function calculateYoga(sunLongitude, moonLongitude) {
6
+ const sum = (0, constants_1.normalizeAngle)(sunLongitude + moonLongitude);
7
+ const yogaIndex = Math.floor(sum / constants_1.DEGREES_PER_YOGA);
8
+ const posInYoga = sum - (yogaIndex * constants_1.DEGREES_PER_YOGA);
9
+ const progress = (posInYoga / constants_1.DEGREES_PER_YOGA) * 100;
10
+ return {
11
+ name: constants_1.YOGA_NAMES[yogaIndex],
12
+ number: yogaIndex + 1,
13
+ progress: Math.round(progress * 10) / 10,
14
+ };
15
+ }
16
+ exports.calculateYoga = calculateYoga;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Vedic Planetary Aspects (Graha Drishti)
3
+ *
4
+ * Every planet fully aspects the 7th house from its position.
5
+ * Mars, Jupiter, Saturn, Rahu, and Ketu have additional special aspects.
6
+ */
7
+ export interface PlanetaryAspect {
8
+ planet: string;
9
+ aspectsHouse: number;
10
+ aspectsPlanets: string[];
11
+ aspectType: 'full' | 'three_quarter' | 'half' | 'quarter';
12
+ strength: number;
13
+ }
14
+ export interface AspectResult {
15
+ aspects: PlanetaryAspect[];
16
+ houseAspects: Record<number, {
17
+ aspectedBy: string[];
18
+ }>;
19
+ }
20
+ export interface AspectPlanetInput {
21
+ name: string;
22
+ houseNumber: number;
23
+ }
24
+ export declare function calculateAspects(planets: AspectPlanetInput[]): AspectResult;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ /**
3
+ * Vedic Planetary Aspects (Graha Drishti)
4
+ *
5
+ * Every planet fully aspects the 7th house from its position.
6
+ * Mars, Jupiter, Saturn, Rahu, and Ketu have additional special aspects.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.calculateAspects = void 0;
10
+ // ── Aspect rules ─────────────────────────────────────────────────────────────
11
+ /**
12
+ * Returns the Vedic house numbers (counted from the planet's house as 1)
13
+ * that a planet aspects, with strength.
14
+ * "7th house" means counting the planet's own house as 1.
15
+ */
16
+ function getAspectedHouseNumbers(planetName) {
17
+ // All planets aspect the 7th house from their position
18
+ const aspects = [
19
+ { nthHouse: 7, type: 'full', strength: 100 },
20
+ ];
21
+ switch (planetName) {
22
+ case 'Mars':
23
+ aspects.push({ nthHouse: 4, type: 'full', strength: 100 }, { nthHouse: 8, type: 'full', strength: 100 });
24
+ break;
25
+ case 'Jupiter':
26
+ aspects.push({ nthHouse: 5, type: 'full', strength: 100 }, { nthHouse: 9, type: 'full', strength: 100 });
27
+ break;
28
+ case 'Saturn':
29
+ aspects.push({ nthHouse: 3, type: 'full', strength: 100 }, { nthHouse: 10, type: 'full', strength: 100 });
30
+ break;
31
+ case 'Rahu':
32
+ case 'Ketu':
33
+ aspects.push({ nthHouse: 5, type: 'full', strength: 100 }, { nthHouse: 9, type: 'full', strength: 100 });
34
+ break;
35
+ }
36
+ return aspects;
37
+ }
38
+ /**
39
+ * Given a base house and an nth-house count (Vedic style, where 1 = own house),
40
+ * return the absolute house number (1-12).
41
+ * E.g., nthHouse=7 from baseHouse=1 => house 7; nthHouse=7 from baseHouse=8 => house 2.
42
+ */
43
+ function resolveHouse(baseHouse, nthHouse) {
44
+ return ((baseHouse - 1 + (nthHouse - 1)) % 12) + 1;
45
+ }
46
+ // ── Calculator ───────────────────────────────────────────────────────────────
47
+ function calculateAspects(planets) {
48
+ // Build a map of house -> planets in that house
49
+ const housePlanets = {};
50
+ for (let h = 1; h <= 12; h++) {
51
+ housePlanets[h] = [];
52
+ }
53
+ for (const p of planets) {
54
+ housePlanets[p.houseNumber]?.push(p.name);
55
+ }
56
+ const aspects = [];
57
+ const houseAspects = {};
58
+ for (let h = 1; h <= 12; h++) {
59
+ houseAspects[h] = { aspectedBy: [] };
60
+ }
61
+ for (const planet of planets) {
62
+ const aspectRules = getAspectedHouseNumbers(planet.name);
63
+ for (const { nthHouse, type, strength } of aspectRules) {
64
+ const target = resolveHouse(planet.houseNumber, nthHouse);
65
+ const planetsInTarget = housePlanets[target] ?? [];
66
+ aspects.push({
67
+ planet: planet.name,
68
+ aspectsHouse: target,
69
+ aspectsPlanets: [...planetsInTarget],
70
+ aspectType: type,
71
+ strength,
72
+ });
73
+ houseAspects[target].aspectedBy.push(planet.name);
74
+ }
75
+ }
76
+ return { aspects, houseAspects };
77
+ }
78
+ exports.calculateAspects = calculateAspects;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Dosha Analysis Module
3
+ *
4
+ * Detects and analyzes major Vedic astrology doshas:
5
+ * - Manglik (Kuja) Dosha
6
+ * - Kaal Sarp Dosha
7
+ * - Ganda Moola Dosha
8
+ * - Gandanta Analysis
9
+ */
10
+ import type { GrahaPosition, HouseInfo, LagnaInfo } from '../types';
11
+ export interface ManglikResult {
12
+ isManglik: boolean;
13
+ severity: 'none' | 'mild' | 'full';
14
+ marsHouse: number;
15
+ details: string;
16
+ cancellations: string[];
17
+ }
18
+ /**
19
+ * Detect Manglik (Kuja) Dosha from a birth chart.
20
+ */
21
+ export declare function analyzeManglik(planets: GrahaPosition[], houses: HouseInfo[]): ManglikResult;
22
+ export interface KaalSarpResult {
23
+ hasDosha: boolean;
24
+ type: string | null;
25
+ rahuHouse: number;
26
+ ketuHouse: number;
27
+ allPlanetsOnOneSide: boolean;
28
+ details: string;
29
+ affectedHouses: number[];
30
+ }
31
+ /**
32
+ * Detect Kaal Sarp Dosha.
33
+ *
34
+ * All 7 planets (Sun through Saturn) must be on one side of the Rahu-Ketu axis.
35
+ */
36
+ export declare function analyzeKaalSarp(planets: GrahaPosition[], houses: HouseInfo[]): KaalSarpResult;
37
+ export interface GandaMoolaResult {
38
+ hasDosha: boolean;
39
+ moonNakshatra: string;
40
+ moonPada: number;
41
+ affectedNakshatras: string[];
42
+ details: string;
43
+ severity: 'none' | 'mild' | 'severe';
44
+ }
45
+ /**
46
+ * Detect Ganda Moola Dosha based on Moon's nakshatra.
47
+ */
48
+ export declare function analyzeGandaMoola(planets: GrahaPosition[]): GandaMoolaResult;
49
+ export interface GandantaPlanet {
50
+ name: string;
51
+ signName: string;
52
+ degree: number;
53
+ type: 'nakshatra_gandanta' | 'rashi_gandanta' | 'tithi_gandanta';
54
+ details: string;
55
+ }
56
+ export interface GandantaResult {
57
+ hasGandanta: boolean;
58
+ planets: GandantaPlanet[];
59
+ }
60
+ /**
61
+ * Analyze Gandanta positions for all planets and Lagna.
62
+ */
63
+ export declare function analyzeGandanta(planets: GrahaPosition[], lagna: LagnaInfo): GandantaResult;