tauqeet-js 1.0.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/dist/index.cjs ADDED
@@ -0,0 +1,1105 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ Astronomy: () => astronomy_exports,
24
+ AstronomyClass: () => Astronomy,
25
+ DTR: () => DTR,
26
+ PRESETS: () => PRESETS,
27
+ PrayerEngine: () => PrayerEngine,
28
+ PrayerTimes: () => prayer_exports,
29
+ Qibla: () => qibla_exports,
30
+ RTD: () => RTD,
31
+ acosd: () => acosd,
32
+ asind: () => asind,
33
+ atan2d: () => atan2d,
34
+ calculate: () => getPrayerTimes,
35
+ calculateQibla: () => calculateQibla,
36
+ cosd: () => cosd,
37
+ getDeltaT: () => getDeltaT,
38
+ getJulianCenturies: () => getJulianCenturies,
39
+ getJulianDate: () => getJulianDate,
40
+ getJulianMillennia: () => getJulianMillennia,
41
+ getPrayerTimes: () => getPrayerTimes,
42
+ norm24: () => norm24,
43
+ norm360: () => norm360,
44
+ sind: () => sind,
45
+ tand: () => tand
46
+ });
47
+ module.exports = __toCommonJS(index_exports);
48
+
49
+ // src/core/math.ts
50
+ var DTR = Math.PI / 180;
51
+ var RTD = 180 / Math.PI;
52
+ function sind(x) {
53
+ return Math.sin(DTR * x);
54
+ }
55
+ function cosd(x) {
56
+ return Math.cos(DTR * x);
57
+ }
58
+ function tand(x) {
59
+ return Math.tan(DTR * x);
60
+ }
61
+ function asind(x) {
62
+ return Math.asin(x) * RTD;
63
+ }
64
+ function acosd(x) {
65
+ return Math.acos(x) * RTD;
66
+ }
67
+ function atan2d(y, x) {
68
+ return Math.atan2(y, x) * RTD;
69
+ }
70
+ function norm360(x) {
71
+ let res = x % 360;
72
+ if (res < 0) res += 360;
73
+ return res;
74
+ }
75
+ function norm24(x) {
76
+ let res = x % 24;
77
+ if (res < 0) res += 24;
78
+ return res;
79
+ }
80
+
81
+ // src/core/time.ts
82
+ function getJulianDate(date) {
83
+ let year = date.getUTCFullYear();
84
+ let month = date.getUTCMonth() + 1;
85
+ const day = date.getUTCDate();
86
+ const hour = date.getUTCHours();
87
+ const minute = date.getUTCMinutes();
88
+ const second = date.getUTCSeconds();
89
+ const ms = date.getUTCMilliseconds();
90
+ if (month <= 2) {
91
+ year -= 1;
92
+ month += 12;
93
+ }
94
+ const A = Math.floor(year / 100);
95
+ const B = 2 - A + Math.floor(A / 4);
96
+ const dayFraction = (hour + minute / 60 + (second + ms / 1e3) / 3600) / 24;
97
+ return Math.floor(365.25 * (year + 4716)) + Math.floor(30.6001 * (month + 1)) + day + B - 1524.5 + dayFraction;
98
+ }
99
+ function getJulianCenturies(jd) {
100
+ return (jd - 2451545) / 36525;
101
+ }
102
+ function getJulianMillennia(jc) {
103
+ return 0.1 * jc;
104
+ }
105
+ function getDeltaT(year) {
106
+ if (year < -500) {
107
+ const u2 = (year - 1820) / 100;
108
+ return -20 + 32 * u2 * u2;
109
+ }
110
+ if (year < 500) {
111
+ const u2 = year / 100;
112
+ return 10583.6 - 1014.41 * u2 + 33.7831 * u2 * u2 - 5.95205 * u2 * u2 * u2 - 0.179848 * u2 ** 4 + 0.0221741 * u2 ** 5 + 903165e-8 * u2 ** 6;
113
+ }
114
+ if (year < 1600) {
115
+ const u2 = (year - 1e3) / 100;
116
+ return 1570 - 157.42 * u2 - 51.5205 * u2 * u2 + 17.5101 * u2 * u2 * u2 - 0.720364 * u2 ** 4 + 0.01633 * u2 ** 5 - 0.113063 * u2 ** 6;
117
+ }
118
+ if (year < 1700) {
119
+ const t = year - 1600;
120
+ return 120 - 0.9808 * t - 0.01532 * t * t + t * t * t / 7129;
121
+ }
122
+ if (year < 1800) {
123
+ const t = year - 1700;
124
+ return 8.83 + 0.1603 * t - 59285e-7 * t * t + 13336e-8 * t * t * t - t ** 4 / 1174e3;
125
+ }
126
+ if (year < 1860) {
127
+ const t = year - 1800;
128
+ return 13.72 - 0.332447 * t + 68612e-7 * t * t + 41116e-7 * t * t * t - t ** 4 / 1022e3 + t ** 5 / 2616e4 - t ** 6 / 2e8;
129
+ }
130
+ if (year < 1900) {
131
+ const t = year - 1860;
132
+ return 7.62 + 0.5737 * t - 0.251754 * t * t + 0.0168066 * t * t * t - t ** 4 / 328e3 + t ** 5 / 212e5;
133
+ }
134
+ if (year < 1920) {
135
+ const t = year - 1900;
136
+ return -2.73 + 0.1218 * t - 0.034114 * t * t + 398787e-8 * t * t * t;
137
+ }
138
+ if (year < 1941) {
139
+ const t = year - 1920;
140
+ return 21.2 + 0.84493 * t - 0.0761 * t * t + 20936e-7 * t * t * t;
141
+ }
142
+ if (year < 1961) {
143
+ const t = year - 1950;
144
+ return 29.07 + 0.407 * t - t * t / 233 + t * t * t / 2547;
145
+ }
146
+ if (year < 1986) {
147
+ const t = year - 1975;
148
+ return 45.45 + 1.067 * t - t * t / 260 - t * t * t / 718;
149
+ }
150
+ if (year < 2005) {
151
+ const t = year - 2e3;
152
+ return 63.86 + 0.3345 * t - 0.060374 * t * t + 17275e-7 * t * t * t + 653935e-9 * t ** 4 + 237359e-10 * t ** 5;
153
+ }
154
+ if (year < 2050) {
155
+ const t = year - 2e3;
156
+ return 62.92 + 0.32217 * t + 5589e-6 * t * t;
157
+ }
158
+ if (year < 2150) {
159
+ return -20 + 32 * ((year - 1820) / 100) ** 2 - 0.5628 * (2150 - year);
160
+ }
161
+ const u = (year - 1820) / 100;
162
+ return -20 + 32 * u * u;
163
+ }
164
+
165
+ // src/astronomy/index.ts
166
+ var astronomy_exports = {};
167
+ __export(astronomy_exports, {
168
+ Astronomy: () => Astronomy
169
+ });
170
+
171
+ // src/algorithms/nutation.ts
172
+ var RAW_NUT_DATA = [
173
+ " 0 0 0 0 1-171996-174.2 92025 8.9 ",
174
+ " 0 0 2-2 2 -13187 -1.6 5736-3.1 ",
175
+ " 0 0 2 0 2 -2274 -0.2 977-0.5 ",
176
+ " 0 0 0 0 2 2062 0.2 -895 0.5 ",
177
+ " 0-1 0 0 0 -1426 3.4 54-0.1 ",
178
+ " 1 0 0 0 0 712 0.1 -7 0.0 ",
179
+ " 0 1 2-2 2 -517 1.2 224-0.6 ",
180
+ " 0 0 2 0 1 -386 -0.4 200 0.0 ",
181
+ " 1 0 2 0 2 -301 0.0 129-0.1 ",
182
+ " 0-1 2-2 2 217 -0.5 -95 0.3 ",
183
+ "-1 0 0 2 0 158 0.0 -1 0.0 ",
184
+ " 0 0 2-2 1 129 0.1 -70 0.0 ",
185
+ "-1 0 2 0 2 123 0.0 -53 0.0 ",
186
+ " 1 0 0 0 1 63 0.1 -33 0.0 ",
187
+ " 0 0 0 2 0 63 0.0 -2 0.0 ",
188
+ "-1 0 2 2 2 -59 0.0 26 0.0 ",
189
+ "-1 0 0 0 1 -58 -0.1 32 0.0 ",
190
+ " 1 0 2 0 1 -51 0.0 27 0.0 ",
191
+ "-2 0 0 2 0 -48 0.0 1 0.0 ",
192
+ "-2 0 2 0 1 46 0.0 -24 0.0 ",
193
+ " 0 0 2 2 2 -38 0.0 16 0.0 ",
194
+ " 2 0 2 0 2 -31 0.0 13 0.0 ",
195
+ " 2 0 0 0 0 29 0.0 -1 0.0 ",
196
+ " 1 0 2-2 2 29 0.0 -12 0.0 ",
197
+ " 0 0 2 0 0 26 0.0 -1 0.0 ",
198
+ " 0 0 2-2 0 -22 0.0 0 0.0 ",
199
+ "-1 0 2 0 1 21 0.0 -10 0.0 ",
200
+ " 0 2 0 0 0 17 -0.1 0 0.0 ",
201
+ " 0 2 2-2 2 -16 0.1 7 0.0 ",
202
+ "-1 0 0 2 1 16 0.0 -8 0.0 ",
203
+ " 0 1 0 0 1 -15 0.0 9 0.0 ",
204
+ " 1 0 0-2 1 -13 0.0 7 0.0 ",
205
+ " 0-1 0 0 1 -12 0.0 6 0.0 ",
206
+ " 2 0-2 0 0 11 0.0 0 0.0 ",
207
+ "-1 0 2 2 1 -10 0.0 5 0.0 ",
208
+ " 1 0 2 2 2 -8 0.0 3 0.0 ",
209
+ " 0-1 2 0 2 -7 0.0 3 0.0 ",
210
+ " 0 0 2 2 1 -7 0.0 3 0.0 ",
211
+ " 1 1 0-2 0 -7 0.0 0 0.0 ",
212
+ " 0 1 2 0 2 7 0.0 -3 0.0 ",
213
+ "-2 0 0 2 1 -6 0.0 3 0.0 ",
214
+ " 0 0 0 2 1 -6 0.0 3 0.0 ",
215
+ " 2 0 2-2 2 6 0.0 -3 0.0 ",
216
+ " 1 0 0 2 0 6 0.0 0 0.0 ",
217
+ " 1 0 2-2 1 6 0.0 -3 0.0 ",
218
+ " 0 0 0-2 1 -5 0.0 3 0.0 ",
219
+ " 0-1 2-2 1 -5 0.0 3 0.0 ",
220
+ " 2 0 2 0 1 -5 0.0 3 0.0 ",
221
+ " 1-1 0 0 0 5 0.0 0 0.0 ",
222
+ " 1 0 0-1 0 -4 0.0 0 0.0 ",
223
+ " 0 0 0 1 0 -4 0.0 0 0.0 ",
224
+ " 0 1 0-2 0 -4 0.0 0 0.0 ",
225
+ " 1 0-2 0 0 4 0.0 0 0.0 ",
226
+ " 2 0 0-2 1 4 0.0 -2 0.0 ",
227
+ " 0 1 2-2 1 4 0.0 -2 0.0 ",
228
+ " 1 1 0 0 0 -3 0.0 0 0.0 ",
229
+ " 1-1 0-1 0 -3 0.0 0 0.0 ",
230
+ "-1-1 2 2 2 -3 0.0 1 0.0 ",
231
+ " 0-1 2 2 2 -3 0.0 1 0.0 ",
232
+ " 1-1 2 0 2 -3 0.0 1 0.0 ",
233
+ " 3 0 2 0 2 -3 0.0 1 0.0 ",
234
+ "-2 0 2 0 2 -3 0.0 1 0.0 ",
235
+ " 1 0 2 0 0 3 0.0 0 0.0 ",
236
+ "-1 0 2 4 2 -2 0.0 1 0.0 ",
237
+ " 1 0 0 0 2 -2 0.0 1 0.0 ",
238
+ "-1 0 2-2 1 -2 0.0 1 0.0 ",
239
+ " 0-2 2-2 1 -2 0.0 1 0.0 ",
240
+ "-2 0 0 0 1 -2 0.0 1 0.0 ",
241
+ " 2 0 0 0 1 2 0.0 -1 0.0 ",
242
+ " 3 0 0 0 0 2 0.0 0 0.0 ",
243
+ " 1 1 2 0 2 2 0.0 -1 0.0 ",
244
+ " 0 0 2 1 2 2 0.0 -1 0.0 ",
245
+ " 1 0 0 2 1 -1 0.0 0 0.0 ",
246
+ " 1 0 2 2 1 -1 0.0 1 0.0 ",
247
+ " 1 1 0-2 1 -1 0.0 0 0.0 ",
248
+ " 0 1 0 2 0 -1 0.0 0 0.0 ",
249
+ " 0 1 2-2 0 -1 0.0 0 0.0 ",
250
+ " 0 1-2 2 0 -1 0.0 0 0.0 ",
251
+ " 1 0-2 2 0 -1 0.0 0 0.0 ",
252
+ " 1 0-2-2 0 -1 0.0 0 0.0 ",
253
+ " 1 0 2-2 0 -1 0.0 0 0.0 ",
254
+ " 1 0 0-4 0 -1 0.0 0 0.0 ",
255
+ " 2 0 0-4 0 -1 0.0 0 0.0 ",
256
+ " 0 0 2 4 2 -1 0.0 0 0.0 ",
257
+ " 0 0 2-1 2 -1 0.0 0 0.0 ",
258
+ "-2 0 2 4 2 -1 0.0 1 0.0 ",
259
+ " 2 0 2 2 2 -1 0.0 0 0.0 ",
260
+ " 0-1 2 0 1 -1 0.0 0 0.0 ",
261
+ " 0 0-2 0 1 -1 0.0 0 0.0 ",
262
+ " 0 0 4-2 2 1 0.0 0 0.0 ",
263
+ " 0 1 0 0 2 1 0.0 0 0.0 ",
264
+ " 1 1 2-2 2 1 0.0 -1 0.0 ",
265
+ " 3 0 2-2 2 1 0.0 0 0.0 ",
266
+ "-2 0 2 2 2 1 0.0 -1 0.0 ",
267
+ "-1 0 0 0 2 1 0.0 -1 0.0 ",
268
+ " 0 0-2 2 1 1 0.0 0 0.0 ",
269
+ " 0 1 2 0 1 1 0.0 0 0.0 ",
270
+ "-1 0 4 0 2 1 0.0 0 0.0 ",
271
+ " 2 1 0-2 0 1 0.0 0 0.0 ",
272
+ " 2 0 0 2 0 1 0.0 0 0.0 ",
273
+ " 2 0 2-2 1 1 0.0 -1 0.0 ",
274
+ " 2 0-2 0 1 1 0.0 0 0.0 ",
275
+ " 1-1 0-2 0 1 0.0 0 0.0 ",
276
+ "-1 0 0 1 1 1 0.0 0 0.0 ",
277
+ "-1-1 0 2 1 1 0.0 0 0.0 ",
278
+ " 0 1 0 1 0 1 0.0 0 0.0 "
279
+ ];
280
+ function calculateNutation(TE) {
281
+ const TE2 = TE * TE;
282
+ const TE3 = TE2 * TE;
283
+ let localMm = 134.962981389 + 198.867398056 * TE + norm360(477e3 * TE) + 0.008697222222 * TE2 + TE3 / 56250;
284
+ let localM = 357.527723333 + 359.05034 * TE + norm360(35640 * TE) - 1602777778e-13 * TE2 - TE3 / 3e5;
285
+ let localF = 93.271910277 + 82.017538055 * TE + norm360(483120 * TE) - 36825e-7 * TE2 + TE3 / 327272.7273;
286
+ let localD = 297.850363055 + 307.11148 * TE + norm360(444960 * TE) - 0.001914166667 * TE2 + TE3 / 189473.6842;
287
+ let localOmega = 125.044522222 - 134.136260833 * TE - norm360(1800 * TE) + 0.002070833333 * TE2 + TE3 / 45e4;
288
+ const Mm_rad = norm360(localMm) * DTR;
289
+ const M_rad = norm360(localM) * DTR;
290
+ const F_rad = norm360(localF) * DTR;
291
+ const D_rad = norm360(localD) * DTR;
292
+ const omega_rad = norm360(localOmega) * DTR;
293
+ let dp = 0;
294
+ let de = 0;
295
+ for (const entry of RAW_NUT_DATA) {
296
+ const fMm = parseInt(entry.substring(0, 2).trim(), 10);
297
+ const fM = parseInt(entry.substring(2, 4).trim(), 10);
298
+ const fF = parseInt(entry.substring(4, 6).trim(), 10);
299
+ const fD = parseInt(entry.substring(6, 8).trim(), 10);
300
+ const f_omega = parseInt(entry.substring(8, 10).trim(), 10);
301
+ const term1 = parseInt(entry.substring(10, 17).trim(), 10);
302
+ const term1t = parseFloat(entry.substring(17, 23).trim()) || 0;
303
+ const term2 = parseInt(entry.substring(23, 29).trim(), 10);
304
+ const term2t = parseFloat(entry.substring(29, 33).trim()) || 0;
305
+ const arg = fD * D_rad + fM * M_rad + fMm * Mm_rad + fF * F_rad + f_omega * omega_rad;
306
+ dp += (term1 + TE * term1t) * Math.sin(arg);
307
+ de += (term2 + TE * term2t) * Math.cos(arg);
308
+ }
309
+ const deltaPsi = dp / 36e6;
310
+ const deltaEps = de / 36e6;
311
+ const eps0 = (84381.448 - 46.815 * TE - 59e-5 * TE2 + 1813e-6 * TE3) / 3600;
312
+ const eps = eps0 + deltaEps;
313
+ return { deltaPsi, deltaEps, eps0, eps };
314
+ }
315
+
316
+ // src/algorithms/solar.ts
317
+ function calculateSolar(jd, deltaPsi, eps, TE, Tau, T) {
318
+ const { cos, sin, atan2, asin } = Math;
319
+ let L0 = 175347046;
320
+ L0 += 3341656 * cos(4.6692568 + 6283.07585 * Tau);
321
+ L0 += 34894 * cos(4.6261 + 12566.1517 * Tau);
322
+ L0 += 3497 * cos(2.7441 + 5753.3849 * Tau);
323
+ L0 += 3418 * cos(2.8289 + 3.5231 * Tau);
324
+ L0 += 3136 * cos(3.6277 + 77713.7715 * Tau);
325
+ L0 += 2676 * cos(4.4181 + 7860.4194 * Tau);
326
+ L0 += 2343 * cos(6.1352 + 3930.2097 * Tau);
327
+ L0 += 1324 * cos(0.7425 + 11506.7698 * Tau);
328
+ L0 += 1273 * cos(2.0371 + 529.691 * Tau);
329
+ L0 += 1199 * cos(1.1096 + 1577.3435 * Tau);
330
+ L0 += 990 * cos(5.233 + 5884.927 * Tau);
331
+ L0 += 902 * cos(2.045 + 26.298 * Tau);
332
+ L0 += 857 * cos(3.508 + 398.149 * Tau);
333
+ L0 += 780 * cos(1.179 + 5223.694 * Tau);
334
+ L0 += 753 * cos(2.533 + 5507.553 * Tau);
335
+ L0 += 505 * cos(4.583 + 18849.228 * Tau);
336
+ L0 += 492 * cos(4.205 + 775.523 * Tau);
337
+ L0 += 357 * cos(2.92 + 0.067 * Tau);
338
+ L0 += 317 * cos(5.849 + 11790.629 * Tau);
339
+ L0 += 284 * cos(1.899 + 796.298 * Tau);
340
+ L0 += 271 * cos(0.315 + 10977.079 * Tau);
341
+ L0 += 243 * cos(0.345 + 5486.778 * Tau);
342
+ L0 += 206 * cos(4.806 + 2544.314 * Tau);
343
+ L0 += 205 * cos(1.869 + 5573.143 * Tau);
344
+ L0 += 202 * cos(2.458 + 6069.777 * Tau);
345
+ L0 += 156 * cos(0.833 + 213.299 * Tau);
346
+ L0 += 132 * cos(3.411 + 2942.463 * Tau);
347
+ L0 += 126 * cos(1.083 + 20.775 * Tau);
348
+ L0 += 115 * cos(0.645 + 0.98 * Tau);
349
+ L0 += 103 * cos(0.636 + 4694.003 * Tau);
350
+ L0 += 102 * cos(0.976 + 15720.839 * Tau);
351
+ L0 += 102 * cos(4.267 + 7.114 * Tau);
352
+ L0 += 99 * cos(6.21 + 2146.17 * Tau);
353
+ L0 += 98 * cos(0.68 + 155.42 * Tau);
354
+ L0 += 86 * cos(5.98 + 161000.69 * Tau);
355
+ L0 += 85 * cos(1.3 + 6275.96 * Tau);
356
+ L0 += 85 * cos(3.67 + 71430.7 * Tau);
357
+ L0 += 80 * cos(1.81 + 17260.15 * Tau);
358
+ L0 += 79 * cos(3.04 + 12036.46 * Tau);
359
+ L0 += 75 * cos(1.76 + 5088.63 * Tau);
360
+ L0 += 74 * cos(3.5 + 3154.69 * Tau);
361
+ L0 += 74 * cos(4.68 + 801.82 * Tau);
362
+ L0 += 70 * cos(0.83 + 9437.76 * Tau);
363
+ L0 += 62 * cos(3.98 + 8827.39 * Tau);
364
+ L0 += 61 * cos(1.82 + 7084.9 * Tau);
365
+ L0 += 57 * cos(2.78 + 6286.6 * Tau);
366
+ L0 += 56 * cos(4.39 + 14143.5 * Tau);
367
+ L0 += 56 * cos(3.47 + 6279.55 * Tau);
368
+ L0 += 52 * cos(0.19 + 12139.55 * Tau);
369
+ L0 += 52 * cos(1.33 + 1748.02 * Tau);
370
+ L0 += 51 * cos(0.28 + 5856.48 * Tau);
371
+ L0 += 49 * cos(0.49 + 1194.45 * Tau);
372
+ L0 += 41 * cos(5.37 + 8429.24 * Tau);
373
+ L0 += 41 * cos(2.4 + 19651.05 * Tau);
374
+ L0 += 39 * cos(6.17 + 10447.39 * Tau);
375
+ L0 += 37 * cos(6.04 + 10213.29 * Tau);
376
+ L0 += 37 * cos(2.57 + 1059.38 * Tau);
377
+ L0 += 36 * cos(1.71 + 2352.87 * Tau);
378
+ L0 += 36 * cos(1.78 + 6812.77 * Tau);
379
+ L0 += 33 * cos(0.59 + 17789.85 * Tau);
380
+ L0 += 30 * cos(0.44 + 83996.85 * Tau);
381
+ L0 += 30 * cos(2.74 + 1349.87 * Tau);
382
+ L0 += 25 * cos(3.16 + 4690.48 * Tau);
383
+ let L1 = 628331966747;
384
+ L1 += 206059 * cos(2.678235 + 6283.07585 * Tau);
385
+ L1 += 4303 * cos(2.6351 + 12566.1517 * Tau);
386
+ L1 += 425 * cos(1.59 + 3.523 * Tau);
387
+ L1 += 119 * cos(5.796 + 26.298 * Tau);
388
+ L1 += 109 * cos(2.966 + 1577.344 * Tau);
389
+ L1 += 93 * cos(2.59 + 18849.23 * Tau);
390
+ L1 += 72 * cos(1.14 + 529.69 * Tau);
391
+ L1 += 68 * cos(1.87 + 398.15 * Tau);
392
+ L1 += 67 * cos(4.41 + 5507.55 * Tau);
393
+ L1 += 59 * cos(2.89 + 5223.69 * Tau);
394
+ L1 += 56 * cos(2.17 + 155.42 * Tau);
395
+ L1 += 45 * cos(0.4 + 796.3 * Tau);
396
+ L1 += 36 * cos(0.47 + 775.52 * Tau);
397
+ L1 += 29 * cos(2.65 + 7.11 * Tau);
398
+ L1 += 21 * cos(5.34 + 0.98 * Tau);
399
+ L1 += 19 * cos(1.85 + 5486.78 * Tau);
400
+ L1 += 19 * cos(4.97 + 213.3 * Tau);
401
+ L1 += 17 * cos(2.99 + 6275.96 * Tau);
402
+ L1 += 16 * cos(0.03 + 2544.31 * Tau);
403
+ L1 += 16 * cos(1.43 + 2146.17 * Tau);
404
+ L1 += 15 * cos(1.21 + 10977.08 * Tau);
405
+ L1 += 12 * cos(2.83 + 1748.02 * Tau);
406
+ L1 += 12 * cos(3.26 + 5088.63 * Tau);
407
+ L1 += 12 * cos(5.27 + 1194.45 * Tau);
408
+ L1 += 12 * cos(2.08 + 4694 * Tau);
409
+ L1 += 11 * cos(0.77 + 553.57 * Tau);
410
+ L1 += 10 * cos(1.3 + 6286.6 * Tau);
411
+ L1 += 10 * cos(4.24 + 1349.87 * Tau);
412
+ L1 += 9 * cos(2.7 + 242.73 * Tau);
413
+ L1 += 9 * cos(5.64 + 951.72 * Tau);
414
+ L1 += 8 * cos(5.3 + 2352.87 * Tau);
415
+ L1 += 6 * cos(2.65 + 9437.76 * Tau);
416
+ L1 += 6 * cos(4.67 + 4690.48 * Tau);
417
+ let L2 = 52919;
418
+ L2 += 8720 * cos(1.0721 + 6283.0758 * Tau);
419
+ L2 += 309 * cos(0.867 + 12566.152 * Tau);
420
+ L2 += 27 * cos(0.05 + 3.52 * Tau);
421
+ L2 += 16 * cos(5.19 + 26.3 * Tau);
422
+ L2 += 16 * cos(3.68 + 155.42 * Tau);
423
+ L2 += 10 * cos(0.76 + 18849.23 * Tau);
424
+ L2 += 9 * cos(2.06 + 77713.77 * Tau);
425
+ L2 += 7 * cos(0.83 + 775.52 * Tau);
426
+ L2 += 5 * cos(4.66 + 1577.34 * Tau);
427
+ L2 += 4 * cos(1.03 + 7.11 * Tau);
428
+ L2 += 4 * cos(3.44 + 5573.14 * Tau);
429
+ L2 += 3 * cos(5.14 + 796.3 * Tau);
430
+ L2 += 3 * cos(6.05 + 5507.55 * Tau);
431
+ L2 += 3 * cos(1.19 + 242.73 * Tau);
432
+ L2 += 3 * cos(6.12 + 529.69 * Tau);
433
+ L2 += 3 * cos(0.31 + 398.15 * Tau);
434
+ L2 += 3 * cos(2.28 + 553.57 * Tau);
435
+ L2 += 2 * cos(4.38 + 5223.69 * Tau);
436
+ L2 += 2 * cos(3.75 + 0.98 * Tau);
437
+ let L3 = 289 * cos(5.844 + 6283.076 * Tau);
438
+ L3 += 35;
439
+ L3 += 17 * cos(5.49 + 12566.15 * Tau);
440
+ L3 += 3 * cos(5.2 + 155.42 * Tau);
441
+ L3 += 1 * cos(4.72 + 3.52 * Tau);
442
+ L3 += 1 * cos(5.3 + 18849.23 * Tau);
443
+ L3 += 1 * cos(5.97 + 242.73 * Tau);
444
+ let L4 = 114 * cos(3.142);
445
+ L4 += 8 * cos(4.13 + 6283.08 * Tau);
446
+ L4 += 1 * cos(3.84 + 12566.15 * Tau);
447
+ let L5 = 1 * cos(3.14 + 0 * Tau);
448
+ const Tau2 = Tau * Tau;
449
+ const Tau3 = Tau2 * Tau;
450
+ const Tau4 = Tau3 * Tau;
451
+ const Tau5 = Tau4 * Tau;
452
+ const Lhelioc = norm360((L0 + L1 * Tau + L2 * Tau2 + L3 * Tau3 + L4 * Tau4 + L5 * Tau5) / 1e8 / (Math.PI / 180));
453
+ const LsunTrue = norm360(Lhelioc + 180 - 25e-6);
454
+ let B0 = 280 * cos(3.199 + 84334.662 * Tau);
455
+ B0 += 102 * cos(5.422 + 5507.553 * Tau);
456
+ B0 += 80 * cos(3.88 + 5223.69 * Tau);
457
+ B0 += 44 * cos(3.7 + 2352.87 * Tau);
458
+ B0 += 32 * cos(4 + 1577.34 * Tau);
459
+ let B1 = 9 * cos(3.9 + 5507.55 * Tau);
460
+ B1 += 6 * cos(1.73 + 5223.69 * Tau);
461
+ const B = (B0 + B1 * Tau) / 1e8 / (Math.PI / 180);
462
+ let beta = norm360(-B);
463
+ if (beta > 180) beta -= 360;
464
+ let R0 = 100013989;
465
+ R0 += 1670700 * cos(3.0984635 + 6283.07585 * Tau);
466
+ R0 += 13956 * cos(3.05525 + 12566.1517 * Tau);
467
+ R0 += 3084 * cos(5.1985 + 77713.7715 * Tau);
468
+ R0 += 1628 * cos(1.1739 + 5753.3849 * Tau);
469
+ R0 += 1576 * cos(2.8469 + 7860.4194 * Tau);
470
+ R0 += 925 * cos(5.453 + 11506.77 * Tau);
471
+ R0 += 542 * cos(4.564 + 3930.21 * Tau);
472
+ R0 += 472 * cos(3.661 + 5884.927 * Tau);
473
+ R0 += 346 * cos(0.964 + 5507.553 * Tau);
474
+ R0 += 329 * cos(5.9 + 5223.694 * Tau);
475
+ R0 += 307 * cos(0.299 + 5573.143 * Tau);
476
+ R0 += 243 * cos(4.273 + 11790.629 * Tau);
477
+ R0 += 212 * cos(5.847 + 1577.344 * Tau);
478
+ R0 += 186 * cos(5.022 + 10977.079 * Tau);
479
+ R0 += 175 * cos(3.012 + 18849.228 * Tau);
480
+ R0 += 110 * cos(5.055 + 5486.778 * Tau);
481
+ R0 += 98 * cos(0.89 + 6069.78 * Tau);
482
+ R0 += 86 * cos(5.69 + 15720.84 * Tau);
483
+ R0 += 86 * cos(1.27 + 161000.69 * Tau);
484
+ R0 += 65 * cos(0.27 + 17260.15 * Tau);
485
+ R0 += 63 * cos(0.92 + 529.69 * Tau);
486
+ R0 += 57 * cos(2.01 + 83996.85 * Tau);
487
+ R0 += 56 * cos(5.24 + 71430.7 * Tau);
488
+ R0 += 49 * cos(3.25 + 2544.31 * Tau);
489
+ R0 += 47 * cos(2.58 + 775.52 * Tau);
490
+ R0 += 45 * cos(5.54 + 9437.76 * Tau);
491
+ R0 += 43 * cos(6.01 + 6275.96 * Tau);
492
+ R0 += 39 * cos(5.36 + 4694 * Tau);
493
+ R0 += 38 * cos(2.39 + 8827.39 * Tau);
494
+ R0 += 37 * cos(0.83 + 19651.05 * Tau);
495
+ R0 += 37 * cos(4.9 + 12139.55 * Tau);
496
+ R0 += 36 * cos(1.67 + 12036.46 * Tau);
497
+ R0 += 35 * cos(1.84 + 2942.46 * Tau);
498
+ R0 += 33 * cos(0.24 + 7084.9 * Tau);
499
+ R0 += 32 * cos(0.18 + 5088.63 * Tau);
500
+ R0 += 32 * cos(1.78 + 398.15 * Tau);
501
+ R0 += 28 * cos(1.21 + 6286.6 * Tau);
502
+ R0 += 28 * cos(1.9 + 6279.55 * Tau);
503
+ R0 += 26 * cos(4.59 + 10447.39 * Tau);
504
+ let R1 = 103019 * cos(1.10749 + 6283.07585 * Tau);
505
+ R1 += 1721 * cos(1.0644 + 12566.1517 * Tau);
506
+ R1 += 702 * cos(3.142);
507
+ R1 += 32 * cos(1.02 + 18849.23 * Tau);
508
+ R1 += 31 * cos(2.84 + 5507.55 * Tau);
509
+ R1 += 25 * cos(1.32 + 5223.69 * Tau);
510
+ R1 += 18 * cos(1.42 + 1577.34 * Tau);
511
+ R1 += 10 * cos(5.91 + 10977.08 * Tau);
512
+ R1 += 9 * cos(1.42 + 6275.96 * Tau);
513
+ R1 += 9 * cos(0.27 + 5486.78 * Tau);
514
+ let R2 = 4359 * cos(5.7846 + 6283.0758 * Tau);
515
+ R2 += 124 * cos(5.579 + 12566.152 * Tau);
516
+ R2 += 12 * cos(3.14);
517
+ R2 += 9 * cos(3.63 + 77713.77 * Tau);
518
+ R2 += 6 * cos(1.87 + 5573.14 * Tau);
519
+ R2 += 3 * cos(5.47 + 18849.23 * Tau);
520
+ let R3 = 145 * cos(4.273 + 6283.076 * Tau);
521
+ R3 += 7 * cos(3.92 + 12566.15 * Tau);
522
+ let R4 = 4 * cos(2.56 + 6283.08 * Tau);
523
+ const R = (R0 + R1 * Tau + R2 * Tau2 + R3 * Tau3 + R4 * Tau4) / 1e8;
524
+ const TE2 = TE * TE;
525
+ const LsunPrime = norm360(Lhelioc + 180 - 1.397 * TE - 31e-5 * TE2);
526
+ const betaCorrected = beta + 11e-6 * (cosd(LsunPrime) - sind(LsunPrime));
527
+ const lambda = norm360(LsunTrue + deltaPsi - 5691611e-9 / R);
528
+ const RA = norm360(atan2d(sind(lambda) * cosd(eps) - tand(betaCorrected) * sind(eps), cosd(lambda)));
529
+ const SHA = norm360(360 - RA);
530
+ const DEC = asind(sind(betaCorrected) * cosd(eps) + cosd(betaCorrected) * sind(eps) * sind(lambda));
531
+ const T2 = T * T;
532
+ const T3 = T2 * T;
533
+ const GHAAmean = norm360(280.46061837 + 360.98564736629 * (jd - 2451545) + 387933e-9 * T2 - T3 / 3871e4);
534
+ const GHAAtrue = norm360(GHAAmean + deltaPsi * cosd(eps));
535
+ const GHA = norm360(GHAAtrue - RA);
536
+ const SD = 959.63 / R;
537
+ const HP = 8.794 / R;
538
+ const dayfraction = (jd + 0.5) % 1;
539
+ let EOT = 4 * GHA + 720 - 1440 * dayfraction;
540
+ if (EOT > 20) EOT -= 1440;
541
+ if (EOT < -20) EOT += 1440;
542
+ return { RA, DEC, GHA, SHA, SD, HP, EOT, distance: R };
543
+ }
544
+
545
+ // src/algorithms/moon.ts
546
+ function calculateMoon(jd, TE, deltaPsi, eps, GHAAtrue, sunLambda, sunRA, sunDec) {
547
+ const { abs, round, sin, cos, atan2, asin, floor } = Math;
548
+ const Lmoon_mean = norm360(218.3164591 + 481267.88134236 * TE - 13268e-7 * TE ** 2 + TE ** 3 / 538841 - TE ** 4 / 65194e3);
549
+ const D = norm360(297.8502042 + 445267.1115168 * TE - 163e-5 * TE ** 2 + TE ** 3 / 545868 - TE ** 4 / 113065e3);
550
+ const Msun_mean = norm360(357.5291092 + 35999.0502909 * TE - 1536e-7 * TE ** 2 + TE ** 3 / 2449e4);
551
+ const Mmoon_mean = norm360(134.9634114 + 477198.8676313 * TE + 8997e-6 * TE ** 2 + TE ** 3 / 69699 - TE ** 4 / 14712e3);
552
+ const F = norm360(93.2720993 + 483202.0175273 * TE - 34029e-7 * TE ** 2 - TE ** 3 / 3526e3 + TE ** 4 / 86331e4);
553
+ let A1 = norm360(119.75 + 131.849 * TE);
554
+ let A2 = norm360(53.09 + 479264.29 * TE);
555
+ let A3 = norm360(313.45 + 481266.484 * TE);
556
+ const fE = 1 - 2516e-6 * TE - 74e-7 * TE ** 2;
557
+ const fE2 = fE * fE;
558
+ const terms = [
559
+ { d: 0, ms: 0, mm: 1, f: 0, s: 6288774, c: -20905355 },
560
+ { d: 2, ms: 0, mm: -1, f: 0, s: 1274027, c: -3699111 },
561
+ { d: 2, ms: 0, mm: 0, f: 0, s: 658314, c: -2955968 },
562
+ { d: 0, ms: 0, mm: 2, f: 0, s: 213618, c: -569925 },
563
+ { d: 0, ms: 1, mm: 0, f: 0, s: -185116, c: 48888 },
564
+ { d: 0, ms: 0, mm: 0, f: 2, s: -114332, c: -3149 },
565
+ { d: 2, ms: 0, mm: -2, f: 0, s: 58793, c: 246158 },
566
+ { d: 2, ms: -1, mm: -1, f: 0, s: 57066, c: -152138 },
567
+ { d: 2, ms: 0, mm: 1, f: 0, s: 53322, c: -170733 },
568
+ { d: 2, ms: -1, mm: 0, f: 0, s: 45758, c: -204586 },
569
+ { d: 0, ms: 1, mm: -1, f: 0, s: -40923, c: -129620 },
570
+ { d: 1, ms: 0, mm: 0, f: 0, s: -34720, c: 108743 },
571
+ { d: 0, ms: 1, mm: 1, f: 0, s: -30383, c: 104755 },
572
+ { d: 2, ms: 0, mm: 0, f: -2, s: 15327, c: 10321 },
573
+ { d: 0, ms: 0, mm: 1, f: 2, s: -12528, c: 0 },
574
+ { d: 0, ms: 0, mm: 1, f: -2, s: 10980, c: 79661 },
575
+ { d: 4, ms: 0, mm: -1, f: 0, s: 10675, c: -34782 },
576
+ { d: 0, ms: 0, mm: 3, f: 0, s: 10034, c: -23210 },
577
+ { d: 4, ms: 0, mm: -2, f: 0, s: 8548, c: -21636 },
578
+ { d: 2, ms: 1, mm: -1, f: 0, s: -7888, c: 24208 },
579
+ { d: 2, ms: 1, mm: 0, f: 0, s: -6766, c: 30824 },
580
+ { d: 1, ms: 0, mm: -1, f: 0, s: -5163, c: -8379 },
581
+ { d: 1, ms: 1, mm: 0, f: 0, s: 4987, c: -16675 },
582
+ { d: 2, ms: -1, mm: 1, f: 0, s: 4036, c: -12831 },
583
+ { d: 2, ms: 0, mm: 2, f: 0, s: 3994, c: -10445 },
584
+ { d: 4, ms: 0, mm: 0, f: 0, s: 3861, c: -11650 },
585
+ { d: 2, ms: 0, mm: -3, f: 0, s: 3665, c: 14403 },
586
+ { d: 0, ms: 1, mm: -2, f: 0, s: -2689, c: -7003 },
587
+ { d: 2, ms: 0, mm: -1, f: 2, s: -2602, c: 0 },
588
+ { d: 2, ms: -1, mm: -2, f: 0, s: 2390, c: 10056 },
589
+ { d: 1, ms: 0, mm: 1, f: 0, s: -2348, c: 6322 },
590
+ { d: 2, ms: -2, mm: 0, f: 0, s: 2236, c: -9884 },
591
+ { d: 0, ms: 1, mm: 2, f: 0, s: -2120, c: 5751 },
592
+ { d: 0, ms: 2, mm: 0, f: 0, s: -2069, c: 0 },
593
+ { d: 2, ms: -2, mm: -1, f: 0, s: 2048, c: -4950 },
594
+ { d: 2, ms: 0, mm: 1, f: -2, s: -1773, c: 4130 },
595
+ { d: 2, ms: 0, mm: 0, f: 2, s: -1595, c: 0 },
596
+ { d: 4, ms: -1, mm: -1, f: 0, s: 1215, c: -3958 },
597
+ { d: 0, ms: 0, mm: 2, f: 2, s: -1110, c: 0 },
598
+ { d: 3, ms: 0, mm: -1, f: 0, s: -892, c: 3258 },
599
+ { d: 2, ms: 1, mm: 1, f: 0, s: -810, c: 2616 },
600
+ { d: 4, ms: -1, mm: -2, f: 0, s: 759, c: -1897 },
601
+ { d: 0, ms: 2, mm: -1, f: 0, s: -713, c: -2117 },
602
+ { d: 2, ms: 2, mm: -1, f: 0, s: -700, c: 2354 },
603
+ { d: 2, ms: 1, mm: -2, f: 0, s: 691, c: 0 },
604
+ { d: 2, ms: -1, mm: 0, f: -2, s: 596, c: 0 },
605
+ { d: 4, ms: 0, mm: 1, f: 0, s: 549, c: -1423 },
606
+ { d: 0, ms: 0, mm: 4, f: 0, s: 537, c: -1117 },
607
+ { d: 4, ms: -1, mm: 0, f: 0, s: 520, c: -1571 },
608
+ { d: 1, ms: 0, mm: -2, f: 0, s: -487, c: -1739 },
609
+ { d: 2, ms: 1, mm: 0, f: -2, s: -399, c: 0 },
610
+ { d: 0, ms: 0, mm: 2, f: -2, s: -381, c: -4421 },
611
+ { d: 1, ms: 1, mm: 1, f: 0, s: 351, c: 0 },
612
+ { d: 3, ms: 0, mm: -2, f: 0, s: -340, c: 0 },
613
+ { d: 4, ms: 0, mm: -3, f: 0, s: 330, c: 0 },
614
+ { d: 2, ms: -1, mm: 2, f: 0, s: 327, c: 0 },
615
+ { d: 0, ms: 2, mm: 1, f: 0, s: -323, c: 1165 },
616
+ { d: 1, ms: 1, mm: -1, f: 0, s: 299, c: 0 },
617
+ { d: 2, ms: 0, mm: 3, f: 0, s: 294, c: 0 },
618
+ { d: 2, ms: 0, mm: -1, f: -2, s: 0, c: 8752 }
619
+ ];
620
+ let sumL = 0;
621
+ let sumR = 0;
622
+ for (const term of terms) {
623
+ let f = 1;
624
+ if (abs(term.ms) === 1) f = fE;
625
+ if (abs(term.ms) === 2) f = fE2;
626
+ const arg = term.d * D + term.ms * Msun_mean + term.mm * Mmoon_mean + term.f * F;
627
+ sumL += f * term.s * sind(arg);
628
+ sumR += f * term.c * cosd(arg);
629
+ }
630
+ const latTerms = [
631
+ { d: 0, ms: 0, mm: 0, f: 1, s: 5128122 },
632
+ { d: 0, ms: 0, mm: 1, f: 1, s: 280602 },
633
+ { d: 0, ms: 0, mm: 1, f: -1, s: 277693 },
634
+ { d: 2, ms: 0, mm: 0, f: -1, s: 173237 },
635
+ { d: 2, ms: 0, mm: -1, f: 1, s: 55413 },
636
+ { d: 2, ms: 0, mm: -1, f: -1, s: 46271 },
637
+ { d: 2, ms: 0, mm: 0, f: 1, s: 32573 },
638
+ { d: 0, ms: 0, mm: 2, f: 1, s: 17198 },
639
+ { d: 2, ms: 0, mm: 1, f: -1, s: 9266 },
640
+ { d: 0, ms: 0, mm: 2, f: -1, s: 8822 },
641
+ { d: 2, ms: -1, mm: 0, f: -1, s: 8216 },
642
+ { d: 2, ms: 0, mm: -2, f: -1, s: 4324 },
643
+ { d: 2, ms: 0, mm: 1, f: 1, s: 4200 },
644
+ { d: 2, ms: 1, mm: 0, f: -1, s: -3359 },
645
+ { d: 2, ms: -1, mm: -1, f: 1, s: 2463 },
646
+ { d: 2, ms: -1, mm: 0, f: 1, s: 2211 },
647
+ { d: 2, ms: -1, mm: -1, f: -1, s: 2065 },
648
+ { d: 0, ms: 1, mm: -1, f: -1, s: -1870 },
649
+ { d: 4, ms: 0, mm: -1, f: -1, s: 1828 },
650
+ { d: 0, ms: 1, mm: 0, f: 1, s: -1794 },
651
+ { d: 0, ms: 0, mm: 0, f: 3, s: -1749 },
652
+ { d: 0, ms: 1, mm: -1, f: 1, s: -1565 },
653
+ { d: 1, ms: 0, mm: 0, f: 1, s: -1491 },
654
+ { d: 0, ms: 1, mm: 1, f: 1, s: -1475 },
655
+ { d: 0, ms: 1, mm: 1, f: -1, s: -1410 },
656
+ { d: 0, ms: 1, mm: 0, f: -1, s: -1344 },
657
+ { d: 1, ms: 0, mm: 0, f: -1, s: -1335 },
658
+ { d: 0, ms: 0, mm: 3, f: 1, s: 1107 },
659
+ { d: 4, ms: 0, mm: 0, f: -1, s: 1021 },
660
+ { d: 4, ms: 0, mm: -1, f: 1, s: 833 },
661
+ { d: 0, ms: 0, mm: 1, f: -3, s: 777 },
662
+ { d: 4, ms: 0, mm: -2, f: 1, s: 671 },
663
+ { d: 2, ms: 0, mm: 0, f: -3, s: 607 },
664
+ { d: 2, ms: 0, mm: 2, f: -1, s: 596 },
665
+ { d: 2, ms: -1, mm: 1, f: -1, s: 491 },
666
+ { d: 2, ms: 0, mm: -2, f: 1, s: -451 },
667
+ { d: 0, ms: 0, mm: 3, f: -1, s: 439 },
668
+ { d: 2, ms: 0, mm: 2, f: 1, s: 422 },
669
+ { d: 2, ms: 0, mm: -3, f: -1, s: 421 },
670
+ { d: 2, ms: 1, mm: -1, f: 1, s: -366 },
671
+ { d: 2, ms: 1, mm: 0, f: 1, s: -351 },
672
+ { d: 4, ms: 0, mm: 0, f: 1, s: 331 },
673
+ { d: 2, ms: -1, mm: 1, f: 1, s: 315 },
674
+ { d: 2, ms: -2, mm: 0, f: -1, s: 302 },
675
+ { d: 0, ms: 0, mm: 1, f: 3, s: -283 },
676
+ { d: 2, ms: 1, mm: 1, f: -1, s: -229 },
677
+ { d: 1, ms: 1, mm: 0, f: -1, s: 223 },
678
+ { d: 1, ms: 1, mm: 0, f: 1, s: 223 },
679
+ { d: 0, ms: 1, mm: -2, f: -1, s: -220 },
680
+ { d: 2, ms: 1, mm: -1, f: -1, s: -220 },
681
+ { d: 1, ms: 0, mm: 1, f: 1, s: -185 },
682
+ { d: 2, ms: -1, mm: -2, f: -1, s: 181 },
683
+ { d: 0, ms: 1, mm: 2, f: 1, s: -177 },
684
+ { d: 4, ms: 0, mm: -2, f: -1, s: 176 },
685
+ { d: 4, ms: -1, mm: -1, f: -1, s: 166 },
686
+ { d: 1, ms: 0, mm: 1, f: -1, s: -164 },
687
+ { d: 4, ms: 0, mm: 1, f: -1, s: 132 },
688
+ { d: 1, ms: 0, mm: -1, f: -1, s: -119 },
689
+ { d: 4, ms: -1, mm: 0, f: -1, s: 115 },
690
+ { d: 2, ms: -2, mm: 0, f: 1, s: 107 }
691
+ ];
692
+ let sumB = 0;
693
+ for (const term of latTerms) {
694
+ let f = 1;
695
+ if (abs(term.ms) === 1) f = fE;
696
+ if (abs(term.ms) === 2) f = fE2;
697
+ const arg = term.d * D + term.ms * Msun_mean + term.mm * Mmoon_mean + term.f * F;
698
+ sumB += f * term.s * sind(arg);
699
+ }
700
+ sumL = sumL + 3958 * sind(A1) + 1962 * sind(Lmoon_mean - F) + 318 * sind(A2);
701
+ sumB = sumB - 2235 * sind(Lmoon_mean) + 382 * sind(A3) + 175 * sind(A1 - F) + 175 * sind(A1 + F) + 127 * sind(Lmoon_mean - Mmoon_mean) - 115 * sind(Lmoon_mean + Mmoon_mean);
702
+ const lambdaM = norm360(Lmoon_mean + sumL / 1e6);
703
+ const betaM = sumB / 1e6;
704
+ const dEM = 385000.56 + sumR / 1e3;
705
+ const lambdaMapp = lambdaM + deltaPsi;
706
+ const RA = norm360(atan2d(sind(lambdaMapp) * cosd(eps) - tand(betaM) * sind(eps), cosd(lambdaMapp)));
707
+ const SHA = norm360(360 - RA);
708
+ const DEC = asind(sind(betaM) * cosd(eps) + cosd(betaM) * sind(eps) * sind(lambdaMapp));
709
+ const GHA = norm360(GHAAtrue - RA);
710
+ const HP = 3600 * asind(6378.14 / dEM);
711
+ const SD = 3600 * asind(1738 / dEM);
712
+ let phaseAngle = lambdaMapp - sunLambda;
713
+ const illumination = 100 * (1 - cosd(phaseAngle)) / 2;
714
+ const xMoon = norm360(phaseAngle);
715
+ const isWaxing = xMoon > 0 && xMoon < 180;
716
+ return {
717
+ RA,
718
+ DEC,
719
+ GHA,
720
+ SHA,
721
+ SD,
722
+ HP,
723
+ illumination: round(10 * illumination) / 10,
724
+ isWaxing,
725
+ distance: dEM
726
+ };
727
+ }
728
+
729
+ // src/algorithms/polaris.ts
730
+ function calculatePolaris(TE, GHAAtrue, eps, deltaPsi, sunLambda) {
731
+ const { atan2, asin, sin, cos, tan } = Math;
732
+ const RApol0 = 37.95293333;
733
+ const DECpol0 = 89.26408889;
734
+ const dRApol = 2.98155 / 3600;
735
+ const dDECpol = -0.0152 / 3600;
736
+ const RApol1 = RApol0 + 100 * TE * dRApol;
737
+ const DECpol1 = DECpol0 + 100 * TE * dDECpol;
738
+ const eps0_2000 = 23.439291111;
739
+ const lambdapol1 = atan2d(sind(RApol1) * cosd(eps0_2000) + tand(DECpol1) * sind(eps0_2000), cosd(RApol1));
740
+ const betapol1 = asind(sind(DECpol1) * cosd(eps0_2000) - cosd(DECpol1) * sind(eps0_2000) * sind(RApol1));
741
+ const eta = (47.0029 * TE - 0.03302 * TE ** 2 + 6e-5 * TE ** 3) / 3600 * (Math.PI / 180);
742
+ const PI0 = (174.876384 - (869.8089 * TE + 0.03536 * TE ** 2) / 3600) * (Math.PI / 180);
743
+ const p0 = (5029.0966 * TE + 1.11113 * TE ** 2 - 6e-7 * TE ** 3) / 3600 * (Math.PI / 180);
744
+ const A1 = cos(eta) * cosd(betapol1) * sin(PI0 - lambdapol1 * (Math.PI / 180)) - sin(eta) * sind(betapol1);
745
+ const B1 = cosd(betapol1) * cos(PI0 - lambdapol1 * (Math.PI / 180));
746
+ const C1 = cos(eta) * sind(betapol1) + sin(eta) * cosd(betapol1) * sin(PI0 - lambdapol1 * (Math.PI / 180));
747
+ let lambdapol2 = (p0 + PI0 - atan2(A1, B1)) / (Math.PI / 180);
748
+ let betapol2 = asin(C1) / (Math.PI / 180);
749
+ lambdapol2 += deltaPsi;
750
+ const kappa = 20.49552 / 3600;
751
+ const pi0 = 102.93735 + 1.71953 * TE + 46e-5 * TE ** 2;
752
+ const e = 0.016708617 - 42037e-9 * TE - 1236e-10 * TE ** 2;
753
+ const dlambdapol = (e * kappa * cosd(pi0 - lambdapol2) - kappa * cosd(sunLambda - lambdapol2)) / cosd(betapol2);
754
+ const dbetapol = -kappa * sind(betapol2) * (sind(sunLambda - lambdapol2) - e * sind(pi0 - lambdapol2));
755
+ lambdapol2 += dlambdapol;
756
+ betapol2 += dbetapol;
757
+ const RApol2 = atan2d(sind(lambdapol2) * cosd(eps) - tand(betapol2) * sind(eps), cosd(lambdapol2));
758
+ const DECpol2 = asind(sind(betapol2) * cosd(eps) + cosd(betapol2) * sind(eps) * sind(lambdapol2));
759
+ return {
760
+ GHA: norm360(GHAAtrue - RApol2),
761
+ SHA: norm360(360 - RApol2),
762
+ DEC: DECpol2
763
+ };
764
+ }
765
+
766
+ // src/astronomy/index.ts
767
+ var Astronomy = class {
768
+ _jd;
769
+ _jde;
770
+ _t;
771
+ // JD-based centuries
772
+ _te;
773
+ // JDE-based centuries
774
+ _tau;
775
+ // JDE-based millennia
776
+ _nutation;
777
+ _solar;
778
+ _moon;
779
+ _polaris;
780
+ constructor(date = /* @__PURE__ */ new Date(), deltaT) {
781
+ this._jd = getJulianDate(date);
782
+ const dt = deltaT !== void 0 ? deltaT : getDeltaT(date.getUTCFullYear());
783
+ this._jde = this._jd + dt / 86400;
784
+ this._t = (this._jd - 2451545) / 36525;
785
+ this._te = (this._jde - 2451545) / 36525;
786
+ this._tau = 0.1 * this._te;
787
+ this._nutation = calculateNutation(this._te);
788
+ }
789
+ get jd() {
790
+ return this._jd;
791
+ }
792
+ get jde() {
793
+ return this._jde;
794
+ }
795
+ get t() {
796
+ return this._t;
797
+ }
798
+ get te() {
799
+ return this._te;
800
+ }
801
+ get tau() {
802
+ return this._tau;
803
+ }
804
+ get nutation() {
805
+ return this._nutation;
806
+ }
807
+ get sun() {
808
+ if (!this._solar) {
809
+ this._solar = calculateSolar(
810
+ this._jd,
811
+ this._nutation.deltaPsi,
812
+ this._nutation.eps,
813
+ this._te,
814
+ this._tau,
815
+ this._t
816
+ );
817
+ }
818
+ return this._solar;
819
+ }
820
+ get moon() {
821
+ if (!this._moon) {
822
+ const sunResult = this.sun;
823
+ const t2 = this._t * this._t;
824
+ const t3 = t2 * this._t;
825
+ const ghaaMean = (280.46061837 + 360.98564736629 * (this._jd - 2451545) + 387933e-9 * t2 - t3 / 3871e4) % 360;
826
+ const ghaaTrue = (ghaaMean + this._nutation.deltaPsi * Math.cos(this._nutation.eps * Math.PI / 180)) % 360;
827
+ this._moon = calculateMoon(
828
+ this._jd,
829
+ this._te,
830
+ this._nutation.deltaPsi,
831
+ this._nutation.eps,
832
+ ghaaTrue,
833
+ 0,
834
+ // Should use apparent longitude of sun
835
+ sunResult.RA,
836
+ sunResult.DEC
837
+ );
838
+ }
839
+ return this._moon;
840
+ }
841
+ get polaris() {
842
+ if (!this._polaris) {
843
+ const sunResult = this.sun;
844
+ const t2 = this._t * this._t;
845
+ const t3 = t2 * this._t;
846
+ const ghaaMean = (280.46061837 + 360.98564736629 * (this._jd - 2451545) + 387933e-9 * t2 - t3 / 3871e4) % 360;
847
+ const ghaaTrue = (ghaaMean + this._nutation.deltaPsi * Math.cos(this._nutation.eps * Math.PI / 180)) % 360;
848
+ this._polaris = calculatePolaris(
849
+ this._te,
850
+ ghaaTrue,
851
+ this._nutation.eps,
852
+ this._nutation.deltaPsi,
853
+ 0
854
+ // sunLambda
855
+ );
856
+ }
857
+ return this._polaris;
858
+ }
859
+ };
860
+
861
+ // src/prayer/index.ts
862
+ var prayer_exports = {};
863
+ __export(prayer_exports, {
864
+ PRESETS: () => PRESETS,
865
+ PrayerEngine: () => PrayerEngine,
866
+ getPrayerTimes: () => getPrayerTimes
867
+ });
868
+
869
+ // src/prayer/types.ts
870
+ var PRESETS = {
871
+ MWL: { fajrAngle: 18, ishaAngle: 17 },
872
+ ISNA: { fajrAngle: 15, ishaAngle: 15 },
873
+ Egypt: { fajrAngle: 19.5, ishaAngle: 17.5 },
874
+ Makkah: { fajrAngle: 18.5, ishaInterval: 90 },
875
+ Karachi: { fajrAngle: 18, ishaAngle: 18 },
876
+ Tehran: { fajrAngle: 17.7, ishaAngle: 14, maghribAngle: 4.5 },
877
+ Jafari: { fajrAngle: 16, ishaAngle: 14, maghribAngle: 4 }
878
+ };
879
+
880
+ // src/prayer/engine.ts
881
+ var PrayerEngine = class {
882
+ constructor(coords, method = "Karachi") {
883
+ this.coords = coords;
884
+ this.method = method;
885
+ }
886
+ coords;
887
+ method;
888
+ calculate(date, asrFactor = 2) {
889
+ console.log(`--- ENGINE DEBUG: ${date.toDateString()} ---`);
890
+ console.log(`Coords: ${this.coords.latitude}, ${this.coords.longitude}`);
891
+ const dhuhr = this.calculateTransit(date);
892
+ console.log(`Solar Noon (Dhuhr): ${dhuhr.toISOString()} (${dhuhr.toString()})`);
893
+ const params = PRESETS[this.method];
894
+ const fajr = this.solveIteratively(date, params.fajrAngle, "morning");
895
+ console.log(`Fajr: ${isNaN(fajr.getTime()) ? "No Occurrence" : fajr.toISOString()}`);
896
+ const sunrise = this.solvePhenomenonIteratively(date, "morning");
897
+ console.log(`Sunrise: ${isNaN(sunrise.getTime()) ? "No Occurrence" : sunrise.toISOString()}`);
898
+ const maghrib = params.maghribInterval ? new Date(sunrise.getTime() + params.maghribInterval * 6e4) : params.maghribAngle ? this.solveIteratively(date, params.maghribAngle, "evening") : this.solvePhenomenonIteratively(date, "evening");
899
+ console.log(`Maghrib: ${isNaN(maghrib.getTime()) ? "No Occurrence" : maghrib.toISOString()}`);
900
+ const isha = params.ishaInterval ? new Date(maghrib.getTime() + params.ishaInterval * 6e4) : this.solveIteratively(date, params.ishaAngle || 18, "evening");
901
+ console.log(`Isha: ${isNaN(isha.getTime()) ? "No Occurrence" : isha.toISOString()}`);
902
+ const asr = this.solveAsrIteratively(date, asrFactor);
903
+ console.log(`Asr: ${isNaN(asr.getTime()) ? "No Occurrence" : asr.toISOString()}`);
904
+ const dhahwaKubra = new Date((fajr.getTime() + maghrib.getTime()) / 2);
905
+ console.log(`Dhahwa Kubra: ${isNaN(dhahwaKubra.getTime()) ? "No Occurrence" : dhahwaKubra.toISOString()}`);
906
+ return {
907
+ fajr,
908
+ sunrise,
909
+ dhahwaKubra,
910
+ dhuhr,
911
+ asr,
912
+ maghrib,
913
+ isha
914
+ };
915
+ }
916
+ getSolarAt(date) {
917
+ const jd = getJulianDate(date);
918
+ const dt = 70;
919
+ const jde = jd + dt / 86400;
920
+ const t = (jd - 2451545) / 36525;
921
+ const te = (jde - 2451545) / 36525;
922
+ const tau = 0.1 * te;
923
+ const nut = calculateNutation(te);
924
+ const solar = calculateSolar(jd, nut.deltaPsi, nut.eps, te, tau, t);
925
+ console.log(`[jd=${jd.toFixed(6)}] GHA=${solar.GHA.toFixed(4)}, DEC=${solar.DEC.toFixed(4)}, EOT=${solar.EOT.toFixed(4)}`);
926
+ return { solar, jd };
927
+ }
928
+ calculateTransit(date) {
929
+ let currentUtcTime = 12 - this.coords.longitude / 15;
930
+ for (let i = 0; i < 3; i++) {
931
+ const checkDate = this.toDate(date, currentUtcTime);
932
+ const { solar } = this.getSolarAt(checkDate);
933
+ currentUtcTime = 12 - this.coords.longitude / 15 - solar.EOT / 60;
934
+ }
935
+ return this.toDate(date, currentUtcTime);
936
+ }
937
+ /**
938
+ * Successive Approximation loop for target Zenith angle.
939
+ * Stops when refinement is < 1 second.
940
+ */
941
+ solveIteratively(date, angleBelowHorizon, side) {
942
+ let prevTime = side === "morning" ? 6 : 18;
943
+ let currentUtcTime = prevTime;
944
+ const MAX_ITER = 5;
945
+ for (let i = 0; i < MAX_ITER; i++) {
946
+ const checkDate = this.toDate(date, currentUtcTime);
947
+ const { solar } = this.getSolarAt(checkDate);
948
+ const denominator = cosd(this.coords.latitude) * cosd(solar.DEC);
949
+ if (Math.abs(denominator) < 1e-10) {
950
+ return /* @__PURE__ */ new Date(NaN);
951
+ }
952
+ const cosH = (sind(-angleBelowHorizon) - sind(this.coords.latitude) * sind(solar.DEC)) / denominator;
953
+ if (cosH > 1 || cosH < -1) return /* @__PURE__ */ new Date(NaN);
954
+ const H = acosd(cosH) / 15;
955
+ const transit = 12 - this.coords.longitude / 15 - solar.EOT / 60;
956
+ currentUtcTime = side === "morning" ? transit - H : transit + H;
957
+ if (Math.abs(currentUtcTime - prevTime) * 3600 < 1) break;
958
+ prevTime = currentUtcTime;
959
+ }
960
+ return this.toDate(date, currentUtcTime);
961
+ }
962
+ /**
963
+ * Successive Approximation for Sunrise/Maghrib.
964
+ * Formula: 90 + 34' (Refraction) + SD - HP
965
+ */
966
+ solvePhenomenonIteratively(date, side) {
967
+ let prevTime = side === "morning" ? 6 : 18;
968
+ let currentUtcTime = prevTime;
969
+ for (let i = 0; i < 5; i++) {
970
+ const checkDate = this.toDate(date, currentUtcTime);
971
+ const { solar } = this.getSolarAt(checkDate);
972
+ const refraction = 34 / 60;
973
+ const sd_deg = solar.SD / 3600;
974
+ const hp_deg = solar.HP / 3600;
975
+ const elevation = this.coords.elevation || 0;
976
+ const dip = 0.02933333 * Math.sqrt(elevation);
977
+ const targetZenith = 90 + refraction + sd_deg - hp_deg + dip;
978
+ const denominator = cosd(this.coords.latitude) * cosd(solar.DEC);
979
+ if (Math.abs(denominator) < 1e-10) {
980
+ return /* @__PURE__ */ new Date(NaN);
981
+ }
982
+ const cosH = (cosd(targetZenith) - sind(this.coords.latitude) * sind(solar.DEC)) / denominator;
983
+ if (cosH > 1 || cosH < -1) return /* @__PURE__ */ new Date(NaN);
984
+ const H = acosd(cosH) / 15;
985
+ const transit = 12 - this.coords.longitude / 15 - solar.EOT / 60;
986
+ currentUtcTime = side === "morning" ? transit - H : transit + H;
987
+ if (Math.abs(currentUtcTime - prevTime) * 3600 < 1) break;
988
+ prevTime = currentUtcTime;
989
+ }
990
+ return this.toDate(date, currentUtcTime);
991
+ }
992
+ solveAsrIteratively(date, factor) {
993
+ let prevTime = 15;
994
+ let currentUtcTime = prevTime;
995
+ for (let i = 0; i < 5; i++) {
996
+ const checkDate = this.toDate(date, currentUtcTime);
997
+ const { solar } = this.getSolarAt(checkDate);
998
+ const alt = factor + tand(Math.abs(this.coords.latitude - solar.DEC));
999
+ const h = atan2d(1, alt);
1000
+ const denominator = cosd(this.coords.latitude) * cosd(solar.DEC);
1001
+ if (Math.abs(denominator) < 1e-10) {
1002
+ return /* @__PURE__ */ new Date(NaN);
1003
+ }
1004
+ const cosH = (sind(h) - sind(this.coords.latitude) * sind(solar.DEC)) / denominator;
1005
+ if (cosH > 1 || cosH < -1) return /* @__PURE__ */ new Date(NaN);
1006
+ const H = acosd(cosH) / 15;
1007
+ const transit = 12 - this.coords.longitude / 15 - solar.EOT / 60;
1008
+ currentUtcTime = transit + H;
1009
+ if (Math.abs(currentUtcTime - prevTime) * 3600 < 1) break;
1010
+ prevTime = currentUtcTime;
1011
+ }
1012
+ return this.toDate(date, currentUtcTime);
1013
+ }
1014
+ toDate(baseDate, utcHours) {
1015
+ const d = new Date(Date.UTC(baseDate.getUTCFullYear(), baseDate.getUTCMonth(), baseDate.getUTCDate(), 0, 0, 0));
1016
+ const totalSeconds = Math.round(utcHours * 3600);
1017
+ d.setUTCSeconds(totalSeconds);
1018
+ return d;
1019
+ }
1020
+ };
1021
+
1022
+ // src/prayer/index.ts
1023
+ function getPrayerTimes(arg1, arg2, arg3, arg4, arg5, arg6) {
1024
+ let config;
1025
+ if (typeof arg1 === "number") {
1026
+ config = {
1027
+ location: { latitude: arg1, longitude: arg2 || 0 },
1028
+ method: arg3 || "Karachi",
1029
+ madhab: typeof arg4 === "number" ? arg4 === 2 ? "Hanafi" : "Shafi" : arg4 || "Hanafi",
1030
+ date: arg5 || /* @__PURE__ */ new Date(),
1031
+ elevation: arg6
1032
+ };
1033
+ } else {
1034
+ config = arg1;
1035
+ }
1036
+ const {
1037
+ date = /* @__PURE__ */ new Date(),
1038
+ location,
1039
+ method = "Karachi",
1040
+ madhab = "Hanafi",
1041
+ elevation = config.location.elevation || 0,
1042
+ elevationUnit = "m"
1043
+ } = config;
1044
+ const elevationMeters = elevationUnit === "ft" ? elevation * 0.3048 : elevation;
1045
+ const engine = new PrayerEngine({ ...location, elevation: elevationMeters }, method);
1046
+ const factor = madhab === "Hanafi" ? 2 : 1;
1047
+ return engine.calculate(date, factor);
1048
+ }
1049
+
1050
+ // src/qibla/index.ts
1051
+ var qibla_exports = {};
1052
+ __export(qibla_exports, {
1053
+ calculateQibla: () => calculateQibla
1054
+ });
1055
+ var MAKKAH_LAT = 21.4225;
1056
+ var MAKKAH_LNG = 39.8262;
1057
+ function calculateQibla(coords) {
1058
+ const phi = coords.latitude;
1059
+ const lambda = coords.longitude;
1060
+ const y = sind(MAKKAH_LNG - lambda);
1061
+ const x = cosd(phi) * tand(MAKKAH_LAT) - sind(phi) * cosd(MAKKAH_LNG - lambda);
1062
+ let qibla = atan2d(y, x);
1063
+ if (qibla < 0) qibla += 360;
1064
+ const dPhi = Math.log(tand(MAKKAH_LAT / 2 + 45) / tand(phi / 2 + 45));
1065
+ const dLon = (MAKKAH_LNG - lambda) * Math.PI / 180;
1066
+ let rhumb = atan2d(dLon, dPhi);
1067
+ if (rhumb < 0) rhumb += 360;
1068
+ const R = 6371;
1069
+ const dLat = (MAKKAH_LAT - phi) * Math.PI / 180;
1070
+ const dl = (MAKKAH_LNG - lambda) * Math.PI / 180;
1071
+ const a = Math.sin(dLat / 2) ** 2 + Math.cos(phi * Math.PI / 180) * Math.cos(MAKKAH_LAT * Math.PI / 180) * Math.sin(dl / 2) ** 2;
1072
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
1073
+ const distance = R * c;
1074
+ return {
1075
+ bearing: qibla,
1076
+ rhumbLine: rhumb,
1077
+ distance
1078
+ };
1079
+ }
1080
+ // Annotate the CommonJS export names for ESM import in node:
1081
+ 0 && (module.exports = {
1082
+ Astronomy,
1083
+ AstronomyClass,
1084
+ DTR,
1085
+ PRESETS,
1086
+ PrayerEngine,
1087
+ PrayerTimes,
1088
+ Qibla,
1089
+ RTD,
1090
+ acosd,
1091
+ asind,
1092
+ atan2d,
1093
+ calculate,
1094
+ calculateQibla,
1095
+ cosd,
1096
+ getDeltaT,
1097
+ getJulianCenturies,
1098
+ getJulianDate,
1099
+ getJulianMillennia,
1100
+ getPrayerTimes,
1101
+ norm24,
1102
+ norm360,
1103
+ sind,
1104
+ tand
1105
+ });