@typescriptify/sweph 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.
Files changed (211) hide show
  1. package/README.md +422 -0
  2. package/ephe/semo_18.se1 +0 -0
  3. package/ephe/sepl_18.se1 +0 -0
  4. package/originalCode/.eslintrc.json +124 -0
  5. package/originalCode/.gitattributes +2 -0
  6. package/originalCode/.github/FUNDING.yml +5 -0
  7. package/originalCode/.github/workflows/test.yml +35 -0
  8. package/originalCode/LICENSE +840 -0
  9. package/originalCode/README.md +91 -0
  10. package/originalCode/binding.gyp +41 -0
  11. package/originalCode/constants.js +366 -0
  12. package/originalCode/docs.gif +0 -0
  13. package/originalCode/index.d.ts +5115 -0
  14. package/originalCode/index.js +7 -0
  15. package/originalCode/index.mjs +109 -0
  16. package/originalCode/package.json +55 -0
  17. package/originalCode/src/functions/azalt.cpp +39 -0
  18. package/originalCode/src/functions/azalt_rev.cpp +35 -0
  19. package/originalCode/src/functions/calc.cpp +29 -0
  20. package/originalCode/src/functions/calc_pctr.cpp +31 -0
  21. package/originalCode/src/functions/calc_ut.cpp +29 -0
  22. package/originalCode/src/functions/close.cpp +6 -0
  23. package/originalCode/src/functions/cotrans.cpp +26 -0
  24. package/originalCode/src/functions/cotrans_sp.cpp +26 -0
  25. package/originalCode/src/functions/cs2degstr.cpp +19 -0
  26. package/originalCode/src/functions/cs2lonlatstr.cpp +23 -0
  27. package/originalCode/src/functions/cs2timestr.cpp +23 -0
  28. package/originalCode/src/functions/csnorm.cpp +15 -0
  29. package/originalCode/src/functions/csroundsec.cpp +15 -0
  30. package/originalCode/src/functions/d2l.cpp +15 -0
  31. package/originalCode/src/functions/date_conversion.cpp +30 -0
  32. package/originalCode/src/functions/day_of_week.cpp +15 -0
  33. package/originalCode/src/functions/degnorm.cpp +15 -0
  34. package/originalCode/src/functions/deltat.cpp +15 -0
  35. package/originalCode/src/functions/deltat_ex.cpp +24 -0
  36. package/originalCode/src/functions/difcs2n.cpp +19 -0
  37. package/originalCode/src/functions/difcsn.cpp +19 -0
  38. package/originalCode/src/functions/difdeg2n.cpp +19 -0
  39. package/originalCode/src/functions/difdegn.cpp +19 -0
  40. package/originalCode/src/functions/fixstar.cpp +32 -0
  41. package/originalCode/src/functions/fixstar2.cpp +32 -0
  42. package/originalCode/src/functions/fixstar2_mag.cpp +28 -0
  43. package/originalCode/src/functions/fixstar2_ut.cpp +32 -0
  44. package/originalCode/src/functions/fixstar_mag.cpp +28 -0
  45. package/originalCode/src/functions/fixstar_ut.cpp +32 -0
  46. package/originalCode/src/functions/gauquelin_sector.cpp +44 -0
  47. package/originalCode/src/functions/get_ayanamsa.cpp +15 -0
  48. package/originalCode/src/functions/get_ayanamsa_ex.cpp +27 -0
  49. package/originalCode/src/functions/get_ayanamsa_ex_ut.cpp +27 -0
  50. package/originalCode/src/functions/get_ayanamsa_name.cpp +19 -0
  51. package/originalCode/src/functions/get_ayanamsa_ut.cpp +15 -0
  52. package/originalCode/src/functions/get_current_file_data.cpp +28 -0
  53. package/originalCode/src/functions/get_library_path.cpp +8 -0
  54. package/originalCode/src/functions/get_orbital_elements.cpp +29 -0
  55. package/originalCode/src/functions/get_planet_name.cpp +19 -0
  56. package/originalCode/src/functions/get_tid_acc.cpp +7 -0
  57. package/originalCode/src/functions/heliacal_pheno_ut.cpp +52 -0
  58. package/originalCode/src/functions/heliacal_ut.cpp +52 -0
  59. package/originalCode/src/functions/helio_cross.cpp +33 -0
  60. package/originalCode/src/functions/helio_cross_ut.cpp +33 -0
  61. package/originalCode/src/functions/house_name.cpp +20 -0
  62. package/originalCode/src/functions/house_pos.cpp +36 -0
  63. package/originalCode/src/functions/houses.cpp +35 -0
  64. package/originalCode/src/functions/houses_armc.cpp +38 -0
  65. package/originalCode/src/functions/houses_armc_ex2.cpp +47 -0
  66. package/originalCode/src/functions/houses_ex.cpp +37 -0
  67. package/originalCode/src/functions/houses_ex2.cpp +46 -0
  68. package/originalCode/src/functions/jdet_to_utc.cpp +38 -0
  69. package/originalCode/src/functions/jdut1_to_utc.cpp +38 -0
  70. package/originalCode/src/functions/julday.cpp +25 -0
  71. package/originalCode/src/functions/lat_to_lmt.cpp +27 -0
  72. package/originalCode/src/functions/lmt_to_lat.cpp +27 -0
  73. package/originalCode/src/functions/lun_eclipse_how.cpp +34 -0
  74. package/originalCode/src/functions/lun_eclipse_when.cpp +31 -0
  75. package/originalCode/src/functions/lun_eclipse_when_loc.cpp +39 -0
  76. package/originalCode/src/functions/lun_occult_when_glob.cpp +35 -0
  77. package/originalCode/src/functions/lun_occult_when_loc.cpp +43 -0
  78. package/originalCode/src/functions/lun_occult_where.cpp +34 -0
  79. package/originalCode/src/functions/mooncross.cpp +26 -0
  80. package/originalCode/src/functions/mooncross_node.cpp +30 -0
  81. package/originalCode/src/functions/mooncross_node_ut.cpp +30 -0
  82. package/originalCode/src/functions/mooncross_ut.cpp +26 -0
  83. package/originalCode/src/functions/nod_aps.cpp +42 -0
  84. package/originalCode/src/functions/nod_aps_ut.cpp +42 -0
  85. package/originalCode/src/functions/orbit_max_min_true_distance.cpp +37 -0
  86. package/originalCode/src/functions/pheno.cpp +29 -0
  87. package/originalCode/src/functions/pheno_ut.cpp +29 -0
  88. package/originalCode/src/functions/radnorm.cpp +15 -0
  89. package/originalCode/src/functions/refrac.cpp +23 -0
  90. package/originalCode/src/functions/refrac_extended.cpp +32 -0
  91. package/originalCode/src/functions/revjul.cpp +33 -0
  92. package/originalCode/src/functions/rise_trans.cpp +44 -0
  93. package/originalCode/src/functions/rise_trans_true_hor.cpp +46 -0
  94. package/originalCode/src/functions/set_delta_t_userdef.cpp +14 -0
  95. package/originalCode/src/functions/set_ephe_path.cpp +14 -0
  96. package/originalCode/src/functions/set_jpl_file.cpp +14 -0
  97. package/originalCode/src/functions/set_sid_mode.cpp +20 -0
  98. package/originalCode/src/functions/set_tid_acc.cpp +14 -0
  99. package/originalCode/src/functions/set_topo.cpp +20 -0
  100. package/originalCode/src/functions/sidtime.cpp +15 -0
  101. package/originalCode/src/functions/sidtime0.cpp +21 -0
  102. package/originalCode/src/functions/sol_eclipse_how.cpp +34 -0
  103. package/originalCode/src/functions/sol_eclipse_when_glob.cpp +31 -0
  104. package/originalCode/src/functions/sol_eclipse_when_loc.cpp +39 -0
  105. package/originalCode/src/functions/sol_eclipse_where.cpp +30 -0
  106. package/originalCode/src/functions/solcross.cpp +26 -0
  107. package/originalCode/src/functions/solcross_ut.cpp +26 -0
  108. package/originalCode/src/functions/split_deg.cpp +35 -0
  109. package/originalCode/src/functions/time_equ.cpp +25 -0
  110. package/originalCode/src/functions/utc_time_zone.cpp +48 -0
  111. package/originalCode/src/functions/utc_to_jd.cpp +37 -0
  112. package/originalCode/src/functions/version.cpp +8 -0
  113. package/originalCode/src/functions/vis_limit_mag.cpp +50 -0
  114. package/originalCode/src/sweph.cpp +150 -0
  115. package/originalCode/src/sweph.h +119 -0
  116. package/originalCode/swisseph/swecl.c +6428 -0
  117. package/originalCode/swisseph/swedate.c +588 -0
  118. package/originalCode/swisseph/swedate.h +81 -0
  119. package/originalCode/swisseph/swehel.c +3511 -0
  120. package/originalCode/swisseph/swehouse.c +3143 -0
  121. package/originalCode/swisseph/swehouse.h +98 -0
  122. package/originalCode/swisseph/swejpl.c +958 -0
  123. package/originalCode/swisseph/swejpl.h +103 -0
  124. package/originalCode/swisseph/swemmoon.c +1930 -0
  125. package/originalCode/swisseph/swemplan.c +967 -0
  126. package/originalCode/swisseph/swemptab.h +10640 -0
  127. package/originalCode/swisseph/swenut2000a.h +2819 -0
  128. package/originalCode/swisseph/sweodef.h +326 -0
  129. package/originalCode/swisseph/sweph.c +8614 -0
  130. package/originalCode/swisseph/sweph.h +849 -0
  131. package/originalCode/swisseph/swephexp.h +1020 -0
  132. package/originalCode/swisseph/swephlib.c +4634 -0
  133. package/originalCode/swisseph/swephlib.h +189 -0
  134. package/package.json +28 -0
  135. package/scripts/gen-swemptab.js +177 -0
  136. package/scripts/gen-swenut2000a.js +106 -0
  137. package/src/SwissEph/README.md +268 -0
  138. package/src/SwissEph/UseCases/Ayanamsa.md +363 -0
  139. package/src/SwissEph/UseCases/AzimuthAltitude.md +408 -0
  140. package/src/SwissEph/UseCases/CoordinateSystems.md +337 -0
  141. package/src/SwissEph/UseCases/DateAndTime.md +368 -0
  142. package/src/SwissEph/UseCases/DeltaT.md +258 -0
  143. package/src/SwissEph/UseCases/EphemerisFiles.md +338 -0
  144. package/src/SwissEph/UseCases/FixedStars.md +300 -0
  145. package/src/SwissEph/UseCases/GauquelinSectors.md +304 -0
  146. package/src/SwissEph/UseCases/HeliacalEvents.md +396 -0
  147. package/src/SwissEph/UseCases/HelioCrossings.md +325 -0
  148. package/src/SwissEph/UseCases/HousePosition.md +254 -0
  149. package/src/SwissEph/UseCases/HouseSystems.md +279 -0
  150. package/src/SwissEph/UseCases/LunarEclipse.md +326 -0
  151. package/src/SwissEph/UseCases/MeridianTransit.md +279 -0
  152. package/src/SwissEph/UseCases/MoonCrossings.md +373 -0
  153. package/src/SwissEph/UseCases/NodesAndApsides.md +307 -0
  154. package/src/SwissEph/UseCases/Occultation.md +352 -0
  155. package/src/SwissEph/UseCases/OrbitalElements.md +469 -0
  156. package/src/SwissEph/UseCases/Phenomena.md +328 -0
  157. package/src/SwissEph/UseCases/PlanetPositions.md +366 -0
  158. package/src/SwissEph/UseCases/Planetocentric.md +278 -0
  159. package/src/SwissEph/UseCases/Refraction.md +314 -0
  160. package/src/SwissEph/UseCases/RiseAndSet.md +433 -0
  161. package/src/SwissEph/UseCases/SiderealTime.md +302 -0
  162. package/src/SwissEph/UseCases/SolarEclipse.md +379 -0
  163. package/src/SwissEph/UseCases/SunCrossings.md +275 -0
  164. package/src/SwissEph/UseCases/TopocentricCorrection.md +335 -0
  165. package/src/SwissEph/errors.ts +10 -0
  166. package/src/SwissEph/index.ts +823 -0
  167. package/src/SwissEph/types.ts +291 -0
  168. package/src/constants.ts +762 -0
  169. package/src/file-reader.ts +147 -0
  170. package/src/index.ts +10 -0
  171. package/src/swecl.ts +4526 -0
  172. package/src/swedate.ts +376 -0
  173. package/src/swehel.ts +1939 -0
  174. package/src/swehouse.ts +2167 -0
  175. package/src/swejpl.ts +470 -0
  176. package/src/swemmoon.ts +1318 -0
  177. package/src/swemplan.ts +585 -0
  178. package/src/swemptab.ts +4448 -0
  179. package/src/swenut2000a.ts +2763 -0
  180. package/src/sweph.ts +3993 -0
  181. package/src/swephlib.ts +2720 -0
  182. package/src/types.ts +490 -0
  183. package/tests/c-style/ayanamsa.test.ts +63 -0
  184. package/tests/c-style/config.test.ts +96 -0
  185. package/tests/c-style/crossings.test.ts +81 -0
  186. package/tests/c-style/date-time.test.ts +114 -0
  187. package/tests/c-style/eclipses.test.ts +84 -0
  188. package/tests/c-style/fixed-stars.test.ts +66 -0
  189. package/tests/c-style/heliacal.test.ts +34 -0
  190. package/tests/c-style/houses.test.ts +135 -0
  191. package/tests/c-style/math-utils.test.ts +160 -0
  192. package/tests/c-style/orbital.test.ts +78 -0
  193. package/tests/c-style/phenomena.test.ts +42 -0
  194. package/tests/c-style/planetocentric.test.ts +26 -0
  195. package/tests/c-style/planets.test.ts +117 -0
  196. package/tests/c-style/rise-set.test.ts +71 -0
  197. package/tests/helpers.ts +21 -0
  198. package/tests/modern/ayanamsa.test.ts +47 -0
  199. package/tests/modern/calc.test.ts +113 -0
  200. package/tests/modern/config.test.ts +46 -0
  201. package/tests/modern/crossings.test.ts +45 -0
  202. package/tests/modern/eclipses.test.ts +81 -0
  203. package/tests/modern/errors.test.ts +71 -0
  204. package/tests/modern/heliacal.test.ts +30 -0
  205. package/tests/modern/houses.test.ts +87 -0
  206. package/tests/modern/orbital.test.ts +79 -0
  207. package/tests/modern/phenomena.test.ts +41 -0
  208. package/tests/modern/rise-set.test.ts +60 -0
  209. package/tests/modern/statics.test.ts +99 -0
  210. package/tests/modern/utilities.test.ts +70 -0
  211. package/tsconfig.json +20 -0
package/src/types.ts ADDED
@@ -0,0 +1,490 @@
1
+ /*************************************************************
2
+ * Swiss Ephemeris TypeScript type definitions
3
+ * Translated from sweph.h, swephexp.h, sweodef.h, swehouse.h
4
+ *
5
+ * Copyright (C) 1997 - 2021 Astrodienst AG, Switzerland.
6
+ * All rights reserved. (AGPL)
7
+ *************************************************************/
8
+
9
+ import {
10
+ SEI_NPLANETS, SEI_NNODE_ETC, SE_NPLANETS,
11
+ SEI_NEPHFILES, SEI_FILE_NMAXPLAN, SEI_NMODELS,
12
+ } from './constants';
13
+
14
+ import type { SE1FileReader } from './file-reader';
15
+
16
+ /* ---- Public result types ---- */
17
+
18
+ /** Result from swe_calc / swe_calc_ut */
19
+ export interface CalcResult {
20
+ longitude: number;
21
+ latitude: number;
22
+ distance: number;
23
+ longitudeSpeed: number;
24
+ latitudeSpeed: number;
25
+ distanceSpeed: number;
26
+ flags: number;
27
+ error?: string;
28
+ }
29
+
30
+ /** Result from swe_houses */
31
+ export interface HouseResult {
32
+ cusps: number[]; // cusps[1]..cusps[12] (index 0 unused, to match C convention)
33
+ ascendant: number;
34
+ mc: number; // Midheaven
35
+ armc: number; // ARMC (sidereal time in degrees)
36
+ vertex: number;
37
+ equatorialAscendant: number;
38
+ coAscendantKoch: number;
39
+ coAscendantMunkasey: number;
40
+ polarAscendant: number;
41
+ }
42
+
43
+ /** Result from swe_revjul */
44
+ export interface DateResult {
45
+ year: number;
46
+ month: number;
47
+ day: number;
48
+ hour: number; // fractional hours
49
+ }
50
+
51
+ /** Result from swe_utc_to_jd */
52
+ export interface UtcToJdResult {
53
+ tjdEt: number; // Julian day in ET
54
+ tjdUt: number; // Julian day in UT1
55
+ error?: string;
56
+ }
57
+
58
+ /** Result from swe_jdet_to_utc / swe_jdut1_to_utc */
59
+ export interface JdToUtcResult {
60
+ year: number;
61
+ month: number;
62
+ day: number;
63
+ hour: number;
64
+ minute: number;
65
+ second: number;
66
+ }
67
+
68
+ /* ---- Internal data structures ---- */
69
+
70
+ /** Obliquity of ecliptic (struct epsilon) */
71
+ export interface Epsilon {
72
+ teps: number; // JD for which eps was computed
73
+ eps: number; // obliquity in radians
74
+ seps: number; // sin(eps)
75
+ ceps: number; // cos(eps)
76
+ }
77
+
78
+ export function createEpsilon(): Epsilon {
79
+ return { teps: 0, eps: 0, seps: 0, ceps: 0 };
80
+ }
81
+
82
+ /** Nutation data (struct nut) */
83
+ export interface Nut {
84
+ tnut: number;
85
+ nutlo: [number, number]; // nutation in longitude and obliquity
86
+ snut: number; // sin(nut obliquity)
87
+ cnut: number; // cos(nut obliquity)
88
+ matrix: number[][]; // 3x3 nutation matrix
89
+ }
90
+
91
+ export function createNut(): Nut {
92
+ return {
93
+ tnut: 0,
94
+ nutlo: [0, 0],
95
+ snut: 0,
96
+ cnut: 0,
97
+ matrix: [
98
+ [0, 0, 0],
99
+ [0, 0, 0],
100
+ [0, 0, 0],
101
+ ],
102
+ };
103
+ }
104
+
105
+ /** Planetary data from ephemeris (struct plan_data) */
106
+ export interface PlanData {
107
+ ibdy: number; // internal body number
108
+ iflg: number; // SEI_FLG_HELIO, SEI_FLG_ROTATE, etc.
109
+ ncoe: number; // polynomial order + 1
110
+ lndx0: number; // file position of planet's index
111
+ nndx: number; // number of index entries
112
+ tfstart: number; // ephemeris start JD
113
+ tfend: number; // ephemeris end JD
114
+ dseg: number; // segment size in days
115
+ telem: number; // epoch of orbital elements
116
+ prot: number;
117
+ qrot: number;
118
+ dprot: number;
119
+ dqrot: number;
120
+ rmax: number; // normalisation factor of Chebyshev coefficients
121
+ peri: number; // for reference ellipse
122
+ dperi: number;
123
+ refep: Float64Array | null; // Chebyshev coefficients of reference ellipse (2*ncoe)
124
+ tseg0: number; // start JD of current segment
125
+ tseg1: number; // end JD of current segment
126
+ segp: Float64Array | null; // unpacked Chebyshev coefficients (3*ncoe)
127
+ neval: number; // how many coefficients to evaluate
128
+ teval: number; // time of last evaluation
129
+ iephe: number; // which ephemeris was used
130
+ x: Float64Array; // position & speed, equatorial J2000 (6 elements)
131
+ xflgs: number;
132
+ xreturn: Float64Array; // return positions (24 elements: 4 coord systems × 6)
133
+ }
134
+
135
+ export function createPlanData(): PlanData {
136
+ return {
137
+ ibdy: 0, iflg: 0, ncoe: 0, lndx0: 0, nndx: 0,
138
+ tfstart: 0, tfend: 0, dseg: 0, telem: 0,
139
+ prot: 0, qrot: 0, dprot: 0, dqrot: 0, rmax: 0,
140
+ peri: 0, dperi: 0,
141
+ refep: null, tseg0: 0, tseg1: 0, segp: null,
142
+ neval: 0, teval: 0, iephe: 0,
143
+ x: new Float64Array(6),
144
+ xflgs: 0,
145
+ xreturn: new Float64Array(24),
146
+ };
147
+ }
148
+
149
+ /** File data (struct file_data) */
150
+ export interface FileData {
151
+ fnam: string;
152
+ fversion: number;
153
+ astnam: string;
154
+ swephDenum: number; // DE number of source JPL ephemeris
155
+ tfstart: number;
156
+ tfend: number;
157
+ iflg: number; // byte order flags
158
+ npl: number; // how many planets in file
159
+ ipl: Int32Array; // planet numbers
160
+ reader: SE1FileReader | null; // replaces C FILE*
161
+ }
162
+
163
+ export function createFileData(): FileData {
164
+ return {
165
+ fnam: '', fversion: 0, astnam: '', swephDenum: 0,
166
+ tfstart: 0, tfend: 0, iflg: 0, npl: 0,
167
+ ipl: new Int32Array(SEI_FILE_NMAXPLAN),
168
+ reader: null,
169
+ };
170
+ }
171
+
172
+ /** General constants from ephemeris file (struct gen_const) */
173
+ export interface GenConst {
174
+ clight: number;
175
+ aunit: number;
176
+ helgravconst: number;
177
+ ratme: number;
178
+ sunradius: number;
179
+ }
180
+
181
+ export function createGenConst(): GenConst {
182
+ return { clight: 0, aunit: 0, helgravconst: 0, ratme: 0, sunradius: 0 };
183
+ }
184
+
185
+ /** Saved calculation positions (struct save_positions) */
186
+ export interface SavePositions {
187
+ ipl: number;
188
+ tsave: number;
189
+ iflgsave: number;
190
+ xsaves: Float64Array; // 24 doubles (4 coord systems × 6)
191
+ }
192
+
193
+ export function createSavePositions(): SavePositions {
194
+ return {
195
+ ipl: 0, tsave: 0, iflgsave: 0,
196
+ xsaves: new Float64Array(24),
197
+ };
198
+ }
199
+
200
+ /** Node/apside data (struct node_data, but actually uses plan_data in C) */
201
+ export type NodeData = PlanData;
202
+ export const createNodeData = createPlanData;
203
+
204
+ /** Topocentric observer (struct topo_data) */
205
+ export interface TopoData {
206
+ geolon: number;
207
+ geolat: number;
208
+ geoalt: number;
209
+ teval: number;
210
+ tjdUt: number;
211
+ xobs: Float64Array; // 6 elements
212
+ }
213
+
214
+ export function createTopoData(): TopoData {
215
+ return {
216
+ geolon: 0, geolat: 0, geoalt: 0,
217
+ teval: 0, tjdUt: 0,
218
+ xobs: new Float64Array(6),
219
+ };
220
+ }
221
+
222
+ /** Sidereal mode data (struct sid_data) */
223
+ export interface SidData {
224
+ sidMode: number;
225
+ ayanT0: number;
226
+ t0: number;
227
+ t0IsUT: boolean;
228
+ }
229
+
230
+ export function createSidData(): SidData {
231
+ return { sidMode: 0, ayanT0: 0, t0: 0, t0IsUT: false };
232
+ }
233
+
234
+ /** Nutation interpolation data (struct interpol) */
235
+ export interface Interpol {
236
+ tjdNut0: number;
237
+ tjdNut2: number;
238
+ nutDpsi0: number;
239
+ nutDpsi1: number;
240
+ nutDpsi2: number;
241
+ nutDeps0: number;
242
+ nutDeps1: number;
243
+ nutDeps2: number;
244
+ }
245
+
246
+ export function createInterpol(): Interpol {
247
+ return {
248
+ tjdNut0: 0, tjdNut2: 0,
249
+ nutDpsi0: 0, nutDpsi1: 0, nutDpsi2: 0,
250
+ nutDeps0: 0, nutDeps1: 0, nutDeps2: 0,
251
+ };
252
+ }
253
+
254
+ /** Moshier planet table (struct plantbl) */
255
+ export interface Plantbl {
256
+ maxHarmonic: number[]; // 9 elements
257
+ maxPowerOfT: number;
258
+ argTbl: Int8Array;
259
+ lonTbl: Float64Array;
260
+ latTbl: Float64Array;
261
+ radTbl: Float64Array;
262
+ distance: number;
263
+ }
264
+
265
+ /** House calculation data (struct houses from swehouse.h) */
266
+ export interface Houses {
267
+ cusp: Float64Array; // 37 cusps
268
+ cuspSpeed: Float64Array; // 37 cusp speeds
269
+ ac: number;
270
+ acSpeed: number;
271
+ mc: number;
272
+ mcSpeed: number;
273
+ armcSpeed: number;
274
+ vertex: number;
275
+ vertexSpeed: number;
276
+ equasc: number;
277
+ equascSpeed: number;
278
+ coasc1: number;
279
+ coasc1Speed: number;
280
+ coasc2: number;
281
+ coasc2Speed: number;
282
+ polasc: number;
283
+ polascSpeed: number;
284
+ sundec: number;
285
+ doSpeed: boolean;
286
+ doHspeed: boolean;
287
+ doInterpol: boolean;
288
+ serr: string;
289
+ }
290
+
291
+ export function createHouses(): Houses {
292
+ return {
293
+ cusp: new Float64Array(37),
294
+ cuspSpeed: new Float64Array(37),
295
+ ac: 0, acSpeed: 0,
296
+ mc: 0, mcSpeed: 0,
297
+ armcSpeed: 0,
298
+ vertex: 0, vertexSpeed: 0,
299
+ equasc: 0, equascSpeed: 0,
300
+ coasc1: 0, coasc1Speed: 0,
301
+ coasc2: 0, coasc2Speed: 0,
302
+ polasc: 0, polascSpeed: 0,
303
+ sundec: 0,
304
+ doSpeed: false,
305
+ doHspeed: false,
306
+ doInterpol: false,
307
+ serr: '',
308
+ };
309
+ }
310
+
311
+ /** JPL ephemeris save state (struct jpl_save) */
312
+ export interface JplSave {
313
+ jplReader: SE1FileReader | null;
314
+ doReorder: boolean;
315
+ ehCval: Float64Array; // [400]
316
+ ehSs: Float64Array; // [3] start, end, segment size
317
+ ehAu: number;
318
+ ehEmrat: number;
319
+ ehDenum: number;
320
+ ehNcon: number;
321
+ ehIpt: Int32Array; // [39]
322
+ chCnam: string;
323
+ pv: Float64Array; // [78]
324
+ pvsun: Float64Array; // [6]
325
+ buf: Float64Array; // [1500]
326
+ pc: Float64Array; // [18]
327
+ vc: Float64Array; // [18]
328
+ ac: Float64Array; // [18]
329
+ jc: Float64Array; // [18]
330
+ doKm: boolean;
331
+ // static TLS vars from interp()
332
+ interpNp: number;
333
+ interpNv: number;
334
+ interpNac: number;
335
+ interpNjk: number;
336
+ interpTwot: number;
337
+ // static TLS vars from state()
338
+ stateIrecsz: number;
339
+ stateNrl: number;
340
+ stateNcoeffs: number;
341
+ stateLpt: Int32Array; // [3]
342
+ }
343
+
344
+ export function createJplSave(): JplSave {
345
+ return {
346
+ jplReader: null,
347
+ doReorder: false,
348
+ ehCval: new Float64Array(400),
349
+ ehSs: new Float64Array(3),
350
+ ehAu: 0,
351
+ ehEmrat: 0,
352
+ ehDenum: 0,
353
+ ehNcon: 0,
354
+ ehIpt: new Int32Array(39),
355
+ chCnam: '',
356
+ pv: new Float64Array(78),
357
+ pvsun: new Float64Array(6),
358
+ buf: new Float64Array(1500),
359
+ pc: new Float64Array(18),
360
+ vc: new Float64Array(18),
361
+ ac: new Float64Array(18),
362
+ jc: new Float64Array(18),
363
+ doKm: false,
364
+ interpNp: 0,
365
+ interpNv: 0,
366
+ interpNac: 0,
367
+ interpNjk: 0,
368
+ interpTwot: 0,
369
+ stateIrecsz: 0,
370
+ stateNrl: 0,
371
+ stateNcoeffs: 0,
372
+ stateLpt: new Int32Array(3),
373
+ };
374
+ }
375
+
376
+ /** Main Swiss Ephemeris state (struct swe_data) */
377
+ export interface SweData {
378
+ ephePathIsSet: boolean;
379
+ jplFileIsOpen: boolean;
380
+ ephepath: string;
381
+ jplfnam: string;
382
+ jpldenum: number;
383
+ lastEpheflag: number;
384
+ geoposIsSet: boolean;
385
+ ayanaIsSet: boolean;
386
+ isOldStarfile: boolean;
387
+ eopTjdBeg: number;
388
+ eopTjdBegHorizons: number;
389
+ eopTjdEnd: number;
390
+ eopTjdEndAdd: number;
391
+ eopDpsiLoaded: number;
392
+ tidAcc: number;
393
+ isTidAccManual: boolean;
394
+ initDtDone: boolean;
395
+ swedIsInitialised: boolean;
396
+ deltaTUserdefIsSet: boolean;
397
+ deltaTUserdef: number;
398
+ astG: number;
399
+ astH: number;
400
+ astDiam: number;
401
+ astelem: string;
402
+ iSavedPlanetName: number;
403
+ savedPlanetName: string;
404
+ dpsi: Float64Array | null;
405
+ deps: Float64Array | null;
406
+ timeout: number;
407
+ astroModels: Int32Array;
408
+ doInterpolateNut: boolean;
409
+ interpol: Interpol;
410
+ fidat: FileData[];
411
+ gcdat: GenConst;
412
+ pldat: PlanData[];
413
+ nddat: PlanData[]; // node data uses PlanData
414
+ savedat: SavePositions[];
415
+ oec: Epsilon;
416
+ oec2000: Epsilon;
417
+ nut: Nut;
418
+ nut2000: Nut;
419
+ nutv: Nut;
420
+ topd: TopoData;
421
+ sidd: SidData;
422
+ nFixstarsReal: number;
423
+ nFixstarsNamed: number;
424
+ nFixstarsRecords: number;
425
+ jplSave: JplSave | null;
426
+ ephemerisFiles?: Map<string, ArrayBuffer>;
427
+ }
428
+
429
+ /** Create the default SweData state */
430
+ export function createDefaultSweData(): SweData {
431
+ const fidat: FileData[] = [];
432
+ for (let i = 0; i < SEI_NEPHFILES; i++) fidat.push(createFileData());
433
+ const pldat: PlanData[] = [];
434
+ for (let i = 0; i < SEI_NPLANETS; i++) pldat.push(createPlanData());
435
+ const nddat: PlanData[] = [];
436
+ for (let i = 0; i < SEI_NNODE_ETC; i++) nddat.push(createPlanData());
437
+ const savedat: SavePositions[] = [];
438
+ for (let i = 0; i < SE_NPLANETS + 1; i++) savedat.push(createSavePositions());
439
+
440
+ return {
441
+ ephePathIsSet: false,
442
+ jplFileIsOpen: false,
443
+ ephepath: '',
444
+ jplfnam: '',
445
+ jpldenum: 0,
446
+ lastEpheflag: 0,
447
+ geoposIsSet: false,
448
+ ayanaIsSet: false,
449
+ isOldStarfile: false,
450
+ eopTjdBeg: 0,
451
+ eopTjdBegHorizons: 0,
452
+ eopTjdEnd: 0,
453
+ eopTjdEndAdd: 0,
454
+ eopDpsiLoaded: 0,
455
+ tidAcc: 0,
456
+ isTidAccManual: false,
457
+ initDtDone: false,
458
+ swedIsInitialised: false,
459
+ deltaTUserdefIsSet: false,
460
+ deltaTUserdef: 0,
461
+ astG: 0,
462
+ astH: 0,
463
+ astDiam: 0,
464
+ astelem: '',
465
+ iSavedPlanetName: 0,
466
+ savedPlanetName: '',
467
+ dpsi: null,
468
+ deps: null,
469
+ timeout: 0,
470
+ astroModels: new Int32Array(SEI_NMODELS),
471
+ doInterpolateNut: false,
472
+ interpol: createInterpol(),
473
+ fidat,
474
+ gcdat: createGenConst(),
475
+ pldat,
476
+ nddat,
477
+ savedat,
478
+ oec: createEpsilon(),
479
+ oec2000: createEpsilon(),
480
+ nut: createNut(),
481
+ nut2000: createNut(),
482
+ nutv: createNut(),
483
+ topd: createTopoData(),
484
+ sidd: createSidData(),
485
+ nFixstarsReal: 0,
486
+ nFixstarsNamed: 0,
487
+ nFixstarsRecords: 0,
488
+ jplSave: null,
489
+ };
490
+ }
@@ -0,0 +1,63 @@
1
+ import { describe, it, before, after } from 'node:test';
2
+ import { strict as assert } from 'node:assert';
3
+ import { near, J2000 } from '../helpers';
4
+ import { createDefaultSweData } from '../../src/types';
5
+ import {
6
+ sweSetSidMode, sweGetAyanamsa, sweGetAyanamsaUt,
7
+ sweGetAyanamsaEx, sweGetAyanamsaExUt, sweGetAyanamsaName, sweClose,
8
+ } from '../../src/sweph';
9
+ import { SE_SIDM_LAHIRI, SE_SIDM_TRUE_CITRA, SE_SIDM_FAGAN_BRADLEY, SEFLG_MOSEPH } from '../../src/constants';
10
+
11
+ describe('Ayanamsa (C-style)', () => {
12
+ let swed: ReturnType<typeof createDefaultSweData>;
13
+
14
+ before(() => { swed = createDefaultSweData(); });
15
+ after(() => { sweClose(swed); });
16
+
17
+ describe('Lahiri', () => {
18
+ it('should be ~23.86 at J2000', () => {
19
+ sweSetSidMode(swed, SE_SIDM_LAHIRI, 0, 0);
20
+ const aya = sweGetAyanamsa(swed, J2000);
21
+ near(aya, 23.86, 0.1);
22
+ });
23
+
24
+ it('UT variant should be close to ET', () => {
25
+ sweSetSidMode(swed, SE_SIDM_LAHIRI, 0, 0);
26
+ const et = sweGetAyanamsa(swed, J2000);
27
+ const ut = sweGetAyanamsaUt(swed, J2000);
28
+ near(et, ut, 0.01);
29
+ });
30
+
31
+ it('Ex variant should match basic', () => {
32
+ sweSetSidMode(swed, SE_SIDM_LAHIRI, 0, 0);
33
+ const basic = sweGetAyanamsa(swed, J2000);
34
+ const ex = sweGetAyanamsaEx(swed, J2000, SEFLG_MOSEPH);
35
+ near(ex.daya, basic, 0.001);
36
+ });
37
+
38
+ it('ExUt variant should match basic', () => {
39
+ sweSetSidMode(swed, SE_SIDM_LAHIRI, 0, 0);
40
+ const basic = sweGetAyanamsa(swed, J2000);
41
+ const exUt = sweGetAyanamsaExUt(swed, J2000, SEFLG_MOSEPH);
42
+ near(exUt.daya, basic, 0.01);
43
+ });
44
+ });
45
+
46
+ describe('True Citra', () => {
47
+ it('should be ~23.84 at J2000', () => {
48
+ sweSetSidMode(swed, SE_SIDM_TRUE_CITRA, 0, 0);
49
+ const aya = sweGetAyanamsa(swed, J2000);
50
+ near(aya, 23.84, 0.2);
51
+ });
52
+ });
53
+
54
+ describe('sweGetAyanamsaName', () => {
55
+ it('should return "Lahiri" for SE_SIDM_LAHIRI', () => {
56
+ assert.strictEqual(sweGetAyanamsaName(SE_SIDM_LAHIRI), 'Lahiri');
57
+ });
58
+
59
+ it('should return "Fagan/Bradley" for SE_SIDM_FAGAN_BRADLEY', () => {
60
+ assert.strictEqual(sweGetAyanamsaName(SE_SIDM_FAGAN_BRADLEY), 'Fagan/Bradley');
61
+ });
62
+ });
63
+ });
@@ -0,0 +1,96 @@
1
+ import { describe, it, before, after } from 'node:test';
2
+ import { strict as assert } from 'node:assert';
3
+ import { near, J2000 } from '../helpers';
4
+ import { createDefaultSweData } from '../../src/types';
5
+ import {
6
+ sweCalc, sweVersion, sweGetPlanetName, sweClose,
7
+ sweGetCurrentFileData, sweGetLibraryPath,
8
+ } from '../../src/sweph';
9
+ import {
10
+ sweSetTidAcc, sweGetTidAcc,
11
+ sweSetDeltaTUserdef, sweSetInterpolateNut,
12
+ sweSetAstroModels, sweGetAstroModels,
13
+ } from '../../src/swephlib';
14
+ import { SE_SUN, SE_MOON, SE_MARS, SEFLG_MOSEPH, SEFLG_JPLEPH, SEFLG_SPEED } from '../../src/constants';
15
+
16
+ describe('Configuration (C-style)', () => {
17
+ let swed: ReturnType<typeof createDefaultSweData>;
18
+
19
+ before(() => { swed = createDefaultSweData(); });
20
+ after(() => { sweClose(swed); });
21
+
22
+ describe('sweVersion', () => {
23
+ it('should return a non-empty string', () => {
24
+ const ver = sweVersion();
25
+ assert.ok(typeof ver === 'string' && ver.length > 0);
26
+ });
27
+ });
28
+
29
+ describe('sweGetPlanetName', () => {
30
+ it('should return Sun for SE_SUN', () => {
31
+ assert.strictEqual(sweGetPlanetName(SE_SUN, swed), 'Sun');
32
+ });
33
+
34
+ it('should return Moon for SE_MOON', () => {
35
+ assert.strictEqual(sweGetPlanetName(SE_MOON, swed), 'Moon');
36
+ });
37
+
38
+ it('should return Mars for SE_MARS', () => {
39
+ assert.strictEqual(sweGetPlanetName(SE_MARS, swed), 'Mars');
40
+ });
41
+ });
42
+
43
+ describe('sweGetLibraryPath', () => {
44
+ it('should return empty string when not set', () => {
45
+ assert.strictEqual(sweGetLibraryPath(), '');
46
+ });
47
+ });
48
+
49
+ describe('sweGetCurrentFileData', () => {
50
+ it('should return null when no files loaded', () => {
51
+ assert.strictEqual(sweGetCurrentFileData(swed, 0), null);
52
+ });
53
+ });
54
+
55
+ describe('Tidal acceleration', () => {
56
+ it('should set and get tidal acceleration', () => {
57
+ sweSetTidAcc(swed, -25.8);
58
+ near(sweGetTidAcc(swed), -25.8, 0.01);
59
+ });
60
+ });
61
+
62
+ describe('Delta-T user-defined', () => {
63
+ it('should not throw when setting', () => {
64
+ sweSetDeltaTUserdef(swed, 0);
65
+ });
66
+ });
67
+
68
+ describe('Interpolate nutation', () => {
69
+ it('should not throw when setting', () => {
70
+ sweSetInterpolateNut(swed, false);
71
+ });
72
+ });
73
+
74
+ describe('Astro models', () => {
75
+ it('should get and set models', () => {
76
+ sweSetAstroModels(swed, '');
77
+ const am = sweGetAstroModels(swed);
78
+ assert.ok(typeof am === 'string');
79
+ });
80
+ });
81
+
82
+ describe('JPL fallback', () => {
83
+ it('should fall back when no JPL file loaded', () => {
84
+ const r = sweCalc(swed, J2000, SE_SUN, SEFLG_JPLEPH | SEFLG_SPEED);
85
+ assert.ok(r.xx[0] > 0, `${r.xx[0]}`);
86
+ assert.strictEqual(r.flags & SEFLG_JPLEPH, 0, 'JPL flag should be cleared');
87
+ });
88
+ });
89
+
90
+ describe('sweClose', () => {
91
+ it('should not crash', () => {
92
+ const tmp = createDefaultSweData();
93
+ sweClose(tmp);
94
+ });
95
+ });
96
+ });