jyotish-calc 1.2.0 → 1.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.
package/README.md CHANGED
@@ -16,6 +16,7 @@ npm install jyotish-calc
16
16
  ## Features
17
17
 
18
18
  - **Graha Calculations**: Calculate positions and aspects of the nine planets (grahas)
19
+ - **Panchanga**: Complete Vedic calendar with tithi, nakshatra, yoga, karana, vaara, muhurtas
19
20
  - **Special Lagnas**: Calculate Bhava Lagna, Hora Lagna, Ghati Lagna, etc.
20
21
  - **Upagrahas**: Calculate shadow planets like Gulika, Mandi, Dhuma, etc.
21
22
  - **Ashtakavarga**: Complete BAV and SAV calculations with house strength analysis
@@ -30,6 +31,7 @@ jyotish
30
31
  ├── index.js # Main entry point
31
32
  ├── package.json # Package configuration
32
33
  └── src
34
+ ├── panchanga # Panchanga (Vedic calendar/almanac)
33
35
  ├── ashtakavarga # Ashtakavarga (BAV & SAV) calculations
34
36
  ├── lagnas # Special Lagna calculations
35
37
  ├── upagrahas # Upagraha calculations
@@ -43,6 +45,7 @@ jyotish
43
45
  └── utils # Helper utilities
44
46
  ```
45
47
 
48
+
46
49
  ## Usage
47
50
 
48
51
  ### Basic Planetary Positions
@@ -163,8 +166,30 @@ const allPoints = {
163
166
  const d9Chart = vargas.calculateVargaChart(allPoints, 'D9');
164
167
  ```
165
168
 
169
+ ### Panchanga (Vedic Calendar)
170
+
171
+ Complete Vedic almanac with all 5 elements, muhurtas, and calendar functions.
172
+
173
+ ```javascript
174
+ const { panchanga } = require('jyotish-calc');
175
+
176
+ const panchangaData = panchanga.calculatePanchanga({
177
+ year: 1998, month: 9, date: 11,
178
+ hour: 4, min: 30, sec: 0,
179
+ lat: 13.0827, lng: 80.2707, timezone: 5.5
180
+ });
181
+
182
+ console.log(panchangaData.sunrise); // {time: 5.97, string: "05:57:55 AM"}
183
+ console.log(panchangaData.tithi); // {number: 21, name: "Shashthi", paksha: "Krishna"}
184
+ console.log(panchangaData.nakshatra); // {number: 2, name: "Bharani", pada: 4}
185
+ console.log(panchangaData.yoga); // {number: 13, name: "Vyaghata"}
186
+ console.log(panchangaData.vaara); // {name: "Friday", nameSanskrit: "Shukravara"}
187
+ console.log(panchangaData.muhurtas.raahuKaalam); // {start: "10:34 AM", end: "12:05 PM"}
188
+ ```
189
+
166
190
  ### Ashtakavarga
167
191
 
192
+
168
193
  Complete strength assessment system.
169
194
 
170
195
  ```javascript
package/index.js CHANGED
@@ -8,6 +8,7 @@ const strengths = require('./src/strengths/index');
8
8
  const lagnas = require('./src/lagnas/index');
9
9
  const upagrahas = require('./src/upagrahas/index');
10
10
  const ashtakavarga = require('./src/ashtakavarga/index');
11
+ const panchanga = require('./src/panchanga/index');
11
12
 
12
13
  module.exports = {
13
14
  grahas,
@@ -19,5 +20,7 @@ module.exports = {
19
20
  strengths,
20
21
  lagnas,
21
22
  upagrahas,
22
- ashtakavarga
23
+ ashtakavarga,
24
+ panchanga
23
25
  }
26
+
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "jyotish-calc",
3
- "version": "1.2.0",
4
- "description": "Comprehensive Vedic Astrology library with Special Lagnas, Upagrahas, Ashtakavarga, Dashas, Vargas, and Shadbala",
3
+ "version": "1.3.0",
4
+ "description": "Comprehensive Vedic Astrology library with Panchanga, Special Lagnas, Upagrahas, Ashtakavarga, Dashas, Vargas, and Shadbala",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
7
  "test": "jest",
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Panchanga Constants
3
+ * Core constants for Vedic calendar calculations
4
+ */
5
+
6
+ // ============ ASTRONOMICAL CONSTANTS ============
7
+
8
+ // Kali Yuga epoch - Julian Day Number for Feb 18, 3102 BCE
9
+ const KALI_YUGA_JD = 588465.5;
10
+
11
+ // Mahabharata date for special tithi handling
12
+ const MAHABHARATA_JD = 588465.5;
13
+
14
+ // Year lengths
15
+ const SIDEREAL_YEAR = 365.256363;
16
+ const TROPICAL_YEAR = 365.2421988;
17
+ const SYNODIC_MONTH = 29.530588853;
18
+
19
+ // Degree measures
20
+ const ONE_TITHI = 12; // 360/30 degrees
21
+ const ONE_NAKSHATRA = 13.333333; // 360/27 degrees
22
+ const ONE_YOGA = 13.333333; // 360/27 degrees
23
+ const ONE_PADA = 3.333333; // 360/108 degrees
24
+
25
+ // ============ PANCHANGA ELEMENT NAMES ============
26
+
27
+ const TITHI_NAMES = [
28
+ 'Pratipada', 'Dwitiya', 'Tritiya', 'Chaturthi', 'Panchami',
29
+ 'Shashthi', 'Saptami', 'Ashtami', 'Navami', 'Dashami',
30
+ 'Ekadashi', 'Dwadashi', 'Trayodashi', 'Chaturdashi', 'Purnima',
31
+ 'Pratipada', 'Dwitiya', 'Tritiya', 'Chaturthi', 'Panchami',
32
+ 'Shashthi', 'Saptami', 'Ashtami', 'Navami', 'Dashami',
33
+ 'Ekadashi', 'Dwadashi', 'Trayodashi', 'Chaturdashi', 'Amavasya'
34
+ ];
35
+
36
+ const NAKSHATRA_NAMES = [
37
+ 'Ashwini', 'Bharani', 'Krittika', 'Rohini', 'Mrigashira',
38
+ 'Ardra', 'Punarvasu', 'Pushya', 'Ashlesha', 'Magha',
39
+ 'Purva Phalguni', 'Uttara Phalguni', 'Hasta', 'Chitra', 'Swati',
40
+ 'Vishakha', 'Anuradha', 'Jyeshtha', 'Mula', 'Purva Ashadha',
41
+ 'Uttara Ashadha', 'Shravana', 'Dhanishtha', 'Shatabhisha', 'Purva Bhadrapada',
42
+ 'Uttara Bhadrapada', 'Revati'
43
+ ];
44
+
45
+ const YOGA_NAMES = [
46
+ 'Vishkambha', 'Priti', 'Ayushman', 'Saubhagya', 'Shobhana',
47
+ 'Atiganda', 'Sukarma', 'Dhriti', 'Shoola', 'Ganda',
48
+ 'Vriddhi', 'Dhruva', 'Vyaghata', 'Harshana', 'Vajra',
49
+ 'Siddhi', 'Vyatipata', 'Variyan', 'Parigha', 'Shiva',
50
+ 'Siddha', 'Sadhya', 'Shubha', 'Shukla', 'Brahma',
51
+ 'Indra', 'Vaidhriti'
52
+ ];
53
+
54
+ const KARANA_NAMES = [
55
+ 'Kimstughna', 'Bava', 'Balava', 'Kaulava', 'Taitila',
56
+ 'Garaja', 'Vanija', 'Vishti', 'Shakuni', 'Chatushpada', 'Naga'
57
+ ];
58
+
59
+ const VAARA_NAMES = [
60
+ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
61
+ ];
62
+
63
+ const VAARA_NAMES_SANSKRIT = [
64
+ 'Ravivara', 'Somavara', 'Mangalavara', 'Budhavara', 'Guruvara', 'Shukravara', 'Shanivara'
65
+ ];
66
+
67
+ const PAKSHA_NAMES = ['Shukla', 'Krishna'];
68
+
69
+ const LUNAR_MONTH_NAMES = [
70
+ 'Chaitra', 'Vaishakha', 'Jyeshtha', 'Ashadha', 'Shravana', 'Bhadrapada',
71
+ 'Ashwin', 'Kartik', 'Margashirsha', 'Pausha', 'Magha', 'Phalguna'
72
+ ];
73
+
74
+ const SOLAR_MONTH_NAMES = [
75
+ 'Mesha', 'Vrishabha', 'Mithuna', 'Karka', 'Simha', 'Kanya',
76
+ 'Tula', 'Vrishchika', 'Dhanu', 'Makara', 'Kumbha', 'Meena'
77
+ ];
78
+
79
+ const TAMIL_MONTH_NAMES = [
80
+ 'Chithirai', 'Vaikasi', 'Aani', 'Aadi', 'Aavani', 'Purattasi',
81
+ 'Aippasi', 'Karthigai', 'Margazhi', 'Thai', 'Maasi', 'Panguni'
82
+ ];
83
+
84
+ const SAMVATSARA_NAMES = [
85
+ 'Prabhava', 'Vibhava', 'Shukla', 'Pramodoota', 'Prajothpatti',
86
+ 'Angirasa', 'Srimukha', 'Bhava', 'Yuva', 'Dhatru',
87
+ 'Ishvara', 'Bahudhanya', 'Pramathi', 'Vikrama', 'Vrisha',
88
+ 'Chitrabhanu', 'Svabhanu', 'Tarana', 'Parthiva', 'Vyaya',
89
+ 'Sarvajit', 'Sarvadhari', 'Virodhi', 'Vikrita', 'Khara',
90
+ 'Nandana', 'Vijaya', 'Jaya', 'Manmatha', 'Durmukhi',
91
+ 'Hevilambi', 'Vilambi', 'Vikari', 'Sharvari', 'Plava',
92
+ 'Shubhakrit', 'Shobhakrit', 'Krodhi', 'Vishvavasu', 'Parabhava',
93
+ 'Plavanga', 'Kilaka', 'Saumya', 'Sadharana', 'Virodhikrit',
94
+ 'Paridhaavi', 'Pramadicha', 'Ananda', 'Rakshasa', 'Nala',
95
+ 'Pingala', 'Kalayukti', 'Siddharthi', 'Raudra', 'Durmathi',
96
+ 'Dundubhi', 'Rudhirodgari', 'Raktakshi', 'Krodhana', 'Akshaya'
97
+ ];
98
+
99
+ const RITU_NAMES = [
100
+ 'Vasanta', 'Grishma', 'Varsha', 'Sharad', 'Hemanta', 'Shishira'
101
+ ];
102
+
103
+ // ============ MUHURTA CONSTANTS ============
104
+
105
+ // Trikalam offsets from sunrise (fraction of day)
106
+ // Index by weekday: 0=Sunday, 1=Monday, ..., 6=Saturday
107
+ const RAAHU_KAALAM_OFFSETS = [0.875, 0.125, 0.75, 0.5, 0.625, 0.375, 0.25];
108
+ const GULIKAI_OFFSETS = [0.75, 0.625, 0.5, 0.375, 0.25, 0.125, 0.0];
109
+ const YAMAGANDAM_OFFSETS = [0.5, 0.375, 0.25, 0.125, 0.0, 0.75, 0.625];
110
+
111
+ // Durmuhurtam offsets from sunrise (in 1/12ths of day duration)
112
+ // [offset1, offset2] - some days have only 1 durmuhurtam
113
+ const DURMUHURTAM_OFFSETS = [
114
+ [10.4, 0.0], // Sunday
115
+ [6.4, 8.8], // Monday
116
+ [2.4, 4.8], // Tuesday (second uses night duration)
117
+ [5.6, 0.0], // Wednesday
118
+ [4.0, 8.8], // Thursday
119
+ [2.4, 6.4], // Friday
120
+ [1.6, 0.0] // Saturday
121
+ ];
122
+
123
+ // Gauri Choghadiya day table (1/8 of day, 8 periods)
124
+ // 0=Udveg, 1=Char, 2=Labh, 3=Amrit, 4=Kaal, 5=Shubh, 6=Rog
125
+ const GAURI_CHOGHADIYA_DAY = [
126
+ [0, 1, 2, 3, 4, 5, 6, 0], // Sunday
127
+ [3, 4, 5, 6, 0, 1, 2, 3], // Monday
128
+ [6, 0, 1, 2, 3, 4, 5, 6], // Tuesday
129
+ [2, 3, 4, 5, 6, 0, 1, 2], // Wednesday
130
+ [5, 6, 0, 1, 2, 3, 4, 5], // Thursday
131
+ [1, 2, 3, 4, 5, 6, 0, 1], // Friday
132
+ [4, 5, 6, 0, 1, 2, 3, 4] // Saturday
133
+ ];
134
+
135
+ const GAURI_CHOGHADIYA_NIGHT = [
136
+ [6, 5, 4, 3, 2, 1, 0, 6], // Sunday night
137
+ [2, 1, 0, 6, 5, 4, 3, 2], // Monday night
138
+ [5, 4, 3, 2, 1, 0, 6, 5], // Tuesday night
139
+ [1, 0, 6, 5, 4, 3, 2, 1], // Wednesday night
140
+ [4, 3, 2, 1, 0, 6, 5, 4], // Thursday night
141
+ [0, 6, 5, 4, 3, 2, 1, 0], // Friday night
142
+ [3, 2, 1, 0, 6, 5, 4, 3] // Saturday night
143
+ ];
144
+
145
+ const CHOGHADIYA_NAMES = ['Udveg', 'Char', 'Labh', 'Amrit', 'Kaal', 'Shubh', 'Rog'];
146
+
147
+ // Planetary hora rulers by day (12 day + 12 night)
148
+ // Order: Sun(0), Venus(5), Mercury(3), Moon(1), Saturn(6), Jupiter(4), Mars(2)
149
+ const HORA_SEQUENCE = [0, 5, 3, 1, 6, 4, 2]; // Repeats
150
+
151
+ // Day rulers for upagraha calculations (by weekday)
152
+ const DAY_RULERS = [
153
+ [0, 1, 2, 3, 4, 5, 6, null], // Sunday: Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, -
154
+ [1, 2, 3, 4, 5, 6, 0, null], // Monday
155
+ [2, 3, 4, 5, 6, 0, 1, null], // Tuesday
156
+ [3, 4, 5, 6, 0, 1, 2, null], // Wednesday
157
+ [4, 5, 6, 0, 1, 2, 3, null], // Thursday
158
+ [5, 6, 0, 1, 2, 3, 4, null], // Friday
159
+ [6, 0, 1, 2, 3, 4, 5, null] // Saturday
160
+ ];
161
+
162
+ const NIGHT_RULERS = [
163
+ [4, 5, 6, 0, 1, 2, 3, null], // Sunday night
164
+ [5, 6, 0, 1, 2, 3, 4, null], // Monday night
165
+ [6, 0, 1, 2, 3, 4, 5, null], // Tuesday night
166
+ [0, 1, 2, 3, 4, 5, 6, null], // Wednesday night
167
+ [1, 2, 3, 4, 5, 6, 0, null], // Thursday night
168
+ [2, 3, 4, 5, 6, 0, 1, null], // Friday night
169
+ [3, 4, 5, 6, 0, 1, 2, null] // Saturday night
170
+ ];
171
+
172
+ // ============ SPECIAL YOGA TABLES ============
173
+
174
+ // Amrita Siddha Yoga - auspicious star-weekday combinations
175
+ const AMRITA_SIDDHA_YOGA = {
176
+ 0: [1, 6, 12, 17, 23], // Sunday: Bharani, Ardra, Hasta, Anuradha, Shatabhisha
177
+ 1: [4, 9, 14, 19, 24], // Monday: Rohini, Ashlesha, Chitra, Mula, P.Bhadra
178
+ 2: [3, 8, 13, 18, 23], // Tuesday: Krittika, Pushya, Hasta, Jyeshtha, Shatabhisha
179
+ 3: [2, 7, 12, 17, 22], // Wednesday: Bharani, Punarvasu, Hasta, Anuradha, Shravana
180
+ 4: [5, 10, 15, 20, 25], // Thursday: Mrigashira, Magha, Swati, P.Ashadha, U.Bhadra
181
+ 5: [1, 6, 11, 16, 21], // Friday: Bharani, Ardra, U.Phalguni, Vishakha, U.Ashadha
182
+ 6: [4, 9, 14, 19, 24] // Saturday: Rohini, Ashlesha, Chitra, Mula, P.Bhadra
183
+ };
184
+
185
+ // Mrityu Yoga - inauspicious star-weekday combinations
186
+ const MRITYU_YOGA = {
187
+ 0: 14, // Sunday - Chitra
188
+ 1: 7, // Monday - Punarvasu
189
+ 2: 4, // Tuesday - Rohini
190
+ 3: 13, // Wednesday - Hasta
191
+ 4: 21, // Thursday - U.Ashadha
192
+ 5: 22, // Friday - Shravana
193
+ 6: 9 // Saturday - Ashlesha
194
+ };
195
+
196
+ // Dagdha Yoga - burnt combinations
197
+ const DAGDHA_YOGA = {
198
+ 0: 12, // Sunday - Hasta
199
+ 1: 6, // Monday - Ardra
200
+ 2: 17, // Tuesday - Anuradha
201
+ 3: 3, // Wednesday - Krittika
202
+ 4: 9, // Thursday - Ashlesha
203
+ 5: 18, // Friday - Jyeshtha
204
+ 6: 22 // Saturday - Shravana
205
+ };
206
+
207
+ // ============ AYANAMSA CONSTANTS ============
208
+
209
+ const AYANAMSA_MODES = {
210
+ FAGAN: 0,
211
+ LAHIRI: 1,
212
+ DELUCE: 2,
213
+ RAMAN: 3,
214
+ KP: 4,
215
+ KRISHNAMURTI: 5,
216
+ DJWHAL_KHUL: 6,
217
+ YUKTESHWAR: 7,
218
+ JN_BHASIN: 8,
219
+ BABYL_KUGLER1: 9,
220
+ BABYL_KUGLER2: 10,
221
+ BABYL_KUGLER3: 11,
222
+ BABYL_HUBER: 12,
223
+ TRUE_CITRA: 27,
224
+ TRUE_REVATI: 28,
225
+ TRUE_PUSHYA: 29
226
+ };
227
+
228
+ const DEFAULT_AYANAMSA = 'LAHIRI';
229
+
230
+ // ============ SIGN CONSTANTS ============
231
+
232
+ const SIGN_NAMES = [
233
+ 'Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo',
234
+ 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces'
235
+ ];
236
+
237
+ const MOVABLE_SIGNS = [0, 3, 6, 9]; // Aries, Cancer, Libra, Capricorn
238
+ const FIXED_SIGNS = [1, 4, 7, 10]; // Taurus, Leo, Scorpio, Aquarius
239
+ const DUAL_SIGNS = [2, 5, 8, 11]; // Gemini, Virgo, Sagittarius, Pisces
240
+
241
+ module.exports = {
242
+ // Astronomical
243
+ KALI_YUGA_JD, MAHABHARATA_JD, SIDEREAL_YEAR, TROPICAL_YEAR, SYNODIC_MONTH,
244
+ ONE_TITHI, ONE_NAKSHATRA, ONE_YOGA, ONE_PADA,
245
+
246
+ // Names
247
+ TITHI_NAMES, NAKSHATRA_NAMES, YOGA_NAMES, KARANA_NAMES,
248
+ VAARA_NAMES, VAARA_NAMES_SANSKRIT, PAKSHA_NAMES,
249
+ LUNAR_MONTH_NAMES, SOLAR_MONTH_NAMES, TAMIL_MONTH_NAMES,
250
+ SAMVATSARA_NAMES, RITU_NAMES, SIGN_NAMES,
251
+
252
+ // Muhurta tables
253
+ RAAHU_KAALAM_OFFSETS, GULIKAI_OFFSETS, YAMAGANDAM_OFFSETS,
254
+ DURMUHURTAM_OFFSETS,
255
+ GAURI_CHOGHADIYA_DAY, GAURI_CHOGHADIYA_NIGHT, CHOGHADIYA_NAMES,
256
+ HORA_SEQUENCE, DAY_RULERS, NIGHT_RULERS,
257
+
258
+ // Yoga tables
259
+ AMRITA_SIDDHA_YOGA, MRITYU_YOGA, DAGDHA_YOGA,
260
+
261
+ // Ayanamsa
262
+ AYANAMSA_MODES, DEFAULT_AYANAMSA,
263
+
264
+ // Signs
265
+ MOVABLE_SIGNS, FIXED_SIGNS, DUAL_SIGNS
266
+ };
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Panchanga Module - Main Entry Point
3
+ * Comprehensive Vedic Calendar/Almanac Calculations
4
+ *
5
+ * Provides calculations for:
6
+ * - Panchangam (5 elements): Tithi, Nakshatra, Yoga, Karana, Vaara
7
+ * - Sunrise/Sunset and Moon rise/set
8
+ * - Lunar calendar with Adhika month detection
9
+ * - Solar calendar with Sankranti
10
+ * - Muhurtas (auspicious/inauspicious time periods)
11
+ * - Samvatsara (60-year cycle)
12
+ */
13
+
14
+ // Core modules
15
+ const constants = require('./constants');
16
+ const utils = require('./utils');
17
+ const sunriseSunset = require('./sunrise-sunset');
18
+
19
+ // Panchanga elements
20
+ const tithiModule = require('./tithi');
21
+ const nakshatraModule = require('./nakshatra');
22
+ const yogamModule = require('./yogam');
23
+ const karanaModule = require('./karana');
24
+ const vaaraModule = require('./vaara');
25
+
26
+ // Calendar modules
27
+ const lunarCalendar = require('./lunar-calendar');
28
+ const solarCalendar = require('./solar-calendar');
29
+
30
+ // Muhurtas
31
+ const muhurtas = require('./muhurtas');
32
+
33
+ /**
34
+ * Calculate complete Panchanga for a given date and place
35
+ *
36
+ * IMPORTANT: Uses Vedic day (sunrise-to-sunrise).
37
+ * For times before sunrise, uses previous day's sunrise and vaara.
38
+ *
39
+ * @param {object} birthData - {year, month, date, hour, min, sec, lat, lng, timezone}
40
+ * @returns {object} Complete panchanga data
41
+ */
42
+ function calculatePanchanga(birthData) {
43
+ const { year, month, date, hour = 0, min = 0, sec = 0, lat, lng, timezone } = birthData;
44
+
45
+ const jd = utils.dateToJD(year, month, date, hour + min / 60 + sec / 3600);
46
+ const place = { latitude: lat, longitude: lng, timezone };
47
+ const currentTime = hour + min / 60 + sec / 3600;
48
+
49
+ // Calculate today's sunrise to determine Vedic day
50
+ const todaySunrise = sunriseSunset.sunrise(jd, place);
51
+
52
+ // Determine if birth is before sunrise (previous Vedic day)
53
+ const isBeforeSunrise = todaySunrise && currentTime < todaySunrise.hours;
54
+
55
+ // For Vedic day, if before sunrise, use previous day's sunrise
56
+ let vedicDayJD = jd;
57
+ let vedicSunrise, vedicSunset;
58
+
59
+ if (isBeforeSunrise) {
60
+ vedicDayJD = jd - 1; // Previous day
61
+ vedicSunrise = sunriseSunset.sunrise(vedicDayJD, place);
62
+ vedicSunset = sunriseSunset.sunset(vedicDayJD, place);
63
+ } else {
64
+ vedicSunrise = todaySunrise;
65
+ vedicSunset = sunriseSunset.sunset(jd, place);
66
+ }
67
+
68
+ // Calculate Vedic vaara (accounts for sunrise-based day)
69
+ const vedicVaaraData = vaaraModule.vedicVaara(jd, place, todaySunrise);
70
+
71
+ // Moon rise/set for the calendar date
72
+ const moonriseData = sunriseSunset.moonrise(jd, place);
73
+ const moonsetData = sunriseSunset.moonset(jd, place);
74
+
75
+ // IMPORTANT: Panchanga elements (tithi, nakshatra, yoga, karana) are calculated
76
+ // for the ACTUAL BIRTH MOMENT (jd), not the Vedic day start
77
+ // These elements reflect the astronomical positions at the exact time
78
+ const tithiData = tithiModule.tithi(jd, place);
79
+ const nakshatraData = nakshatraModule.nakshatra(jd, place);
80
+ const yogaData = yogamModule.yogam(jd, place);
81
+ const karanaData = karanaModule.karana(jd, place);
82
+
83
+ // Calendar data for the Vedic day
84
+ const lunarMonthData = lunarCalendar.lunarMonth(jd, place);
85
+ const solarMonthData = solarCalendar.raasi(jd, place);
86
+ const samvatsaraData = solarCalendar.samvatsara(jd, place);
87
+
88
+ // Muhurtas use the Vedic day's sunrise/sunset for time divisions
89
+ const raahuKaalam = muhurtas.raahuKaalam(vedicDayJD, place);
90
+ const yamagandaKaalam = muhurtas.yamagandaKaalam(vedicDayJD, place);
91
+ const gulikaiKaalam = muhurtas.gulikaiKaalam(vedicDayJD, place);
92
+ const abhijitMuhurta = muhurtas.abhijitMuhurta(vedicDayJD, place);
93
+ const brahmaMuhurta = muhurtas.brahmaMuhurta(vedicDayJD, place);
94
+ const durmuhurtamData = muhurtas.durmuhurtam(vedicDayJD, place);
95
+
96
+ // Calculate Vedic day length
97
+ const vedicDayLength = vedicSunset && vedicSunrise ?
98
+ vedicSunset.hours - vedicSunrise.hours : 12;
99
+ const vedicNightLength = 24 - vedicDayLength;
100
+
101
+ return {
102
+ date: { year, month, date },
103
+ time: { hour, min, sec },
104
+ place: { latitude: lat, longitude: lng, timezone },
105
+ julianDay: jd,
106
+ isBeforeSunrise,
107
+ vedicDate: isBeforeSunrise ? {
108
+ year: utils.jdToDate(vedicDayJD).year,
109
+ month: utils.jdToDate(vedicDayJD).month,
110
+ day: Math.floor(utils.jdToDate(vedicDayJD).day)
111
+ } : { year, month, day: date },
112
+
113
+ // Sun/Moon times (for Vedic day)
114
+ sunrise: vedicSunrise ? {
115
+ time: vedicSunrise.hours,
116
+ string: vedicSunrise.string,
117
+ string24: vedicSunrise.string24,
118
+ date: isBeforeSunrise ? `${month}/${date - 1}` : `${month}/${date}`
119
+ } : null,
120
+ sunset: vedicSunset ? {
121
+ time: vedicSunset.hours,
122
+ string: vedicSunset.string,
123
+ string24: vedicSunset.string24
124
+ } : null,
125
+ moonrise: moonriseData ? {
126
+ time: moonriseData.hours,
127
+ string: moonriseData.string
128
+ } : null,
129
+ moonset: moonsetData ? {
130
+ time: moonsetData.hours,
131
+ string: moonsetData.string
132
+ } : null,
133
+ dayLength: vedicDayLength,
134
+ nightLength: vedicNightLength,
135
+
136
+ // Panchanga (5 elements)
137
+ tithi: tithiData ? {
138
+ number: tithiData.number,
139
+ name: tithiData.name,
140
+ paksha: tithiData.paksha,
141
+ tithiInPaksha: tithiData.tithiInPaksha,
142
+ endTime: tithiData.endTimeString,
143
+ nextTithi: tithiData.nextTithi
144
+ } : null,
145
+
146
+ nakshatra: nakshatraData ? {
147
+ number: nakshatraData.number,
148
+ name: nakshatraData.name,
149
+ pada: nakshatraData.pada,
150
+ endTime: nakshatraData.endTimeString,
151
+ nextNakshatra: nakshatraData.nextNakshatra
152
+ } : null,
153
+
154
+ yoga: yogaData ? {
155
+ number: yogaData.number,
156
+ name: yogaData.name,
157
+ endTime: yogaData.endTimeString,
158
+ auspicious: yogaData.auspicious,
159
+ nextYoga: yogaData.nextYoga
160
+ } : null,
161
+
162
+ karana: karanaData ? {
163
+ number: karanaData.number,
164
+ name: karanaData.name,
165
+ type: karanaData.type,
166
+ endTime: karanaData.endTimeString,
167
+ isVishti: karanaData.isVishti
168
+ } : null,
169
+
170
+ vaara: vedicVaaraData ? {
171
+ number: vedicVaaraData.number,
172
+ name: vedicVaaraData.name,
173
+ nameSanskrit: vedicVaaraData.nameSanskrit,
174
+ ruler: vedicVaaraData.planetaryRuler.name,
175
+ isBeforeSunrise: vedicVaaraData.isBeforeSunrise
176
+ } : null,
177
+
178
+ // Calendar
179
+ lunarMonth: lunarMonthData ? {
180
+ number: lunarMonthData.number,
181
+ name: lunarMonthData.fullName,
182
+ isAdhika: lunarMonthData.isAdhika,
183
+ isNija: lunarMonthData.isNija
184
+ } : null,
185
+
186
+ solarMonth: solarMonthData ? {
187
+ number: solarMonthData.number,
188
+ name: solarMonthData.name,
189
+ signName: solarMonthData.signName,
190
+ sunLongitude: solarMonthData.sunLongitude
191
+ } : null,
192
+
193
+ samvatsara: samvatsaraData ? {
194
+ number: samvatsaraData.number,
195
+ name: samvatsaraData.name,
196
+ year: samvatsaraData.year
197
+ } : null,
198
+
199
+ // Muhurtas
200
+ muhurtas: {
201
+ raahuKaalam: raahuKaalam ? {
202
+ start: raahuKaalam.startString,
203
+ end: raahuKaalam.endString
204
+ } : null,
205
+ yamagandaKaalam: yamagandaKaalam ? {
206
+ start: yamagandaKaalam.startString,
207
+ end: yamagandaKaalam.endString
208
+ } : null,
209
+ gulikaiKaalam: gulikaiKaalam ? {
210
+ start: gulikaiKaalam.startString,
211
+ end: gulikaiKaalam.endString
212
+ } : null,
213
+ abhijitMuhurta: abhijitMuhurta ? {
214
+ start: abhijitMuhurta.startString,
215
+ end: abhijitMuhurta.endString
216
+ } : null,
217
+ brahmaMuhurta: brahmaMuhurta ? {
218
+ start: brahmaMuhurta.startString,
219
+ end: brahmaMuhurta.endString
220
+ } : null,
221
+ durmuhurtam: durmuhurtamData.map(d => ({
222
+ start: d.startString,
223
+ end: d.endString
224
+ }))
225
+ }
226
+ };
227
+ }
228
+
229
+ /**
230
+ * Get Panchanga for a specific Julian Day
231
+ * @param {number} jd - Julian Day Number
232
+ * @param {object} place - {latitude, longitude, timezone}
233
+ * @returns {object} Panchanga data
234
+ */
235
+ function getPanchangaForJD(jd, place) {
236
+ const dateInfo = utils.jdToDate(jd);
237
+ return calculatePanchanga({
238
+ year: dateInfo.year,
239
+ month: dateInfo.month,
240
+ date: Math.floor(dateInfo.day),
241
+ hour: Math.floor(dateInfo.hour),
242
+ min: Math.floor((dateInfo.hour % 1) * 60),
243
+ sec: 0,
244
+ lat: place.latitude,
245
+ lng: place.longitude,
246
+ timezone: place.timezone
247
+ });
248
+ }
249
+
250
+ // Export all functions and constants
251
+ module.exports = {
252
+ // Main calculation
253
+ calculatePanchanga,
254
+ getPanchangaForJD,
255
+
256
+ // Constants
257
+ ...constants,
258
+
259
+ // Utils
260
+ dateToJD: utils.dateToJD,
261
+ jdToDate: utils.jdToDate,
262
+ norm360: utils.norm360,
263
+ formatTime: utils.formatTime,
264
+
265
+ // Sunrise/Sunset
266
+ sunrise: sunriseSunset.sunrise,
267
+ sunset: sunriseSunset.sunset,
268
+ moonrise: sunriseSunset.moonrise,
269
+ moonset: sunriseSunset.moonset,
270
+ midday: sunriseSunset.midday,
271
+ midnight: sunriseSunset.midnight,
272
+ dayLength: sunriseSunset.dayLength,
273
+ nightLength: sunriseSunset.nightLength,
274
+ solarLongitude: sunriseSunset.solarLongitude,
275
+ lunarLongitude: sunriseSunset.lunarLongitude,
276
+
277
+ // Tithi
278
+ tithi: tithiModule.tithi,
279
+ lunarPhase: tithiModule.lunarPhase,
280
+ newMoon: tithiModule.newMoon,
281
+ fullMoon: tithiModule.fullMoon,
282
+ quickTithi: tithiModule.quickTithi,
283
+
284
+ // Nakshatra
285
+ nakshatra: nakshatraModule.nakshatra,
286
+ nakshatraPada: nakshatraModule.nakshatraPada,
287
+ quickNakshatra: nakshatraModule.quickNakshatra,
288
+ nakshatraLord: nakshatraModule.nakshatraLord,
289
+
290
+ // Yoga
291
+ yogam: yogamModule.yogam,
292
+ yogaPhase: yogamModule.yogaPhase,
293
+ isAuspiciousYoga: yogamModule.isAuspiciousYoga,
294
+
295
+ // Karana
296
+ karana: karanaModule.karana,
297
+ karanaFromTithi: karanaModule.karanaFromTithi,
298
+ isVishti: karanaModule.isVishti,
299
+
300
+ // Vaara
301
+ vaara: vaaraModule.vaara,
302
+ vedicVaara: vaaraModule.vedicVaara,
303
+
304
+ // Lunar Calendar
305
+ lunarMonth: lunarCalendar.lunarMonth,
306
+ lunarDate: lunarCalendar.lunarDate,
307
+ eraYears: lunarCalendar.eraYears,
308
+ ritu: lunarCalendar.ritu,
309
+
310
+ // Solar Calendar
311
+ raasi: solarCalendar.raasi,
312
+ tamilSolarMonthAndDate: solarCalendar.tamilSolarMonthAndDate,
313
+ samvatsara: solarCalendar.samvatsara,
314
+ previousSankranti: solarCalendar.previousSankranti,
315
+ nextSankranti: solarCalendar.nextSankranti,
316
+
317
+ // Muhurtas
318
+ trikalam: muhurtas.trikalam,
319
+ raahuKaalam: muhurtas.raahuKaalam,
320
+ yamagandaKaalam: muhurtas.yamagandaKaalam,
321
+ gulikaiKaalam: muhurtas.gulikaiKaalam,
322
+ abhijitMuhurta: muhurtas.abhijitMuhurta,
323
+ durmuhurtam: muhurtas.durmuhurtam,
324
+ brahmaMuhurta: muhurtas.brahmaMuhurta,
325
+ godhuliMuhurta: muhurtas.godhuliMuhurta,
326
+ vijayaMuhurta: muhurtas.vijayaMuhurta,
327
+ gauriChoghadiya: muhurtas.gauriChoghadiya,
328
+ amritKaalam: muhurtas.amritKaalam,
329
+ sandhyaPeriods: muhurtas.sandhyaPeriods
330
+ };