astro-ascendant 0.1.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 (303) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +185 -0
  3. package/dist/astro-params/index.d.ts +3 -0
  4. package/dist/astro-params/index.d.ts.map +1 -0
  5. package/dist/astro-params/index.js +3 -0
  6. package/dist/astro-params/index.js.map +1 -0
  7. package/dist/astro-params/model.d.ts +11 -0
  8. package/dist/astro-params/model.d.ts.map +1 -0
  9. package/dist/astro-params/model.js +63 -0
  10. package/dist/astro-params/model.js.map +1 -0
  11. package/dist/astro-params/service.d.ts +12 -0
  12. package/dist/astro-params/service.d.ts.map +1 -0
  13. package/dist/astro-params/service.js +13 -0
  14. package/dist/astro-params/service.js.map +1 -0
  15. package/dist/chart/bhava/calculate.d.ts +6 -0
  16. package/dist/chart/bhava/calculate.d.ts.map +1 -0
  17. package/dist/chart/bhava/calculate.js +89 -0
  18. package/dist/chart/bhava/calculate.js.map +1 -0
  19. package/dist/chart/bhava/helper.d.ts +6 -0
  20. package/dist/chart/bhava/helper.d.ts.map +1 -0
  21. package/dist/chart/bhava/helper.js +22 -0
  22. package/dist/chart/bhava/helper.js.map +1 -0
  23. package/dist/chart/bhava/index.d.ts +2 -0
  24. package/dist/chart/bhava/index.d.ts.map +1 -0
  25. package/dist/chart/bhava/index.js +2 -0
  26. package/dist/chart/bhava/index.js.map +1 -0
  27. package/dist/chart/charts.d.ts +5 -0
  28. package/dist/chart/charts.d.ts.map +1 -0
  29. package/dist/chart/charts.js +74 -0
  30. package/dist/chart/charts.js.map +1 -0
  31. package/dist/chart/divisional-mapping/calculate.d.ts +6 -0
  32. package/dist/chart/divisional-mapping/calculate.d.ts.map +1 -0
  33. package/dist/chart/divisional-mapping/calculate.js +24 -0
  34. package/dist/chart/divisional-mapping/calculate.js.map +1 -0
  35. package/dist/chart/divisional-mapping/error.d.ts +9 -0
  36. package/dist/chart/divisional-mapping/error.d.ts.map +1 -0
  37. package/dist/chart/divisional-mapping/error.js +7 -0
  38. package/dist/chart/divisional-mapping/error.js.map +1 -0
  39. package/dist/chart/divisional-mapping/helper.d.ts +11 -0
  40. package/dist/chart/divisional-mapping/helper.d.ts.map +1 -0
  41. package/dist/chart/divisional-mapping/helper.js +92 -0
  42. package/dist/chart/divisional-mapping/helper.js.map +1 -0
  43. package/dist/chart/divisional-mapping/index.d.ts +4 -0
  44. package/dist/chart/divisional-mapping/index.d.ts.map +1 -0
  45. package/dist/chart/divisional-mapping/index.js +4 -0
  46. package/dist/chart/divisional-mapping/index.js.map +1 -0
  47. package/dist/chart/divisional-mapping/model.d.ts +16 -0
  48. package/dist/chart/divisional-mapping/model.d.ts.map +1 -0
  49. package/dist/chart/divisional-mapping/model.js +2 -0
  50. package/dist/chart/divisional-mapping/model.js.map +1 -0
  51. package/dist/chart/error.d.ts +21 -0
  52. package/dist/chart/error.d.ts.map +1 -0
  53. package/dist/chart/error.js +18 -0
  54. package/dist/chart/error.js.map +1 -0
  55. package/dist/chart/generate.d.ts +7 -0
  56. package/dist/chart/generate.d.ts.map +1 -0
  57. package/dist/chart/generate.js +62 -0
  58. package/dist/chart/generate.js.map +1 -0
  59. package/dist/chart/helper.d.ts +4 -0
  60. package/dist/chart/helper.d.ts.map +1 -0
  61. package/dist/chart/helper.js +21 -0
  62. package/dist/chart/helper.js.map +1 -0
  63. package/dist/chart/index.d.ts +5 -0
  64. package/dist/chart/index.d.ts.map +1 -0
  65. package/dist/chart/index.js +5 -0
  66. package/dist/chart/index.js.map +1 -0
  67. package/dist/chart/internal/constants.d.ts +210 -0
  68. package/dist/chart/internal/constants.d.ts.map +1 -0
  69. package/dist/chart/internal/constants.js +461 -0
  70. package/dist/chart/internal/constants.js.map +1 -0
  71. package/dist/chart/internal/position.d.ts +5 -0
  72. package/dist/chart/internal/position.d.ts.map +1 -0
  73. package/dist/chart/internal/position.js +14 -0
  74. package/dist/chart/internal/position.js.map +1 -0
  75. package/dist/chart/model.d.ts +153 -0
  76. package/dist/chart/model.d.ts.map +1 -0
  77. package/dist/chart/model.js +124 -0
  78. package/dist/chart/model.js.map +1 -0
  79. package/dist/chart/placements.d.ts +10 -0
  80. package/dist/chart/placements.d.ts.map +1 -0
  81. package/dist/chart/placements.js +41 -0
  82. package/dist/chart/placements.js.map +1 -0
  83. package/dist/dasha/calculate.d.ts +15 -0
  84. package/dist/dasha/calculate.d.ts.map +1 -0
  85. package/dist/dasha/calculate.js +106 -0
  86. package/dist/dasha/calculate.js.map +1 -0
  87. package/dist/dasha/error.d.ts +9 -0
  88. package/dist/dasha/error.d.ts.map +1 -0
  89. package/dist/dasha/error.js +7 -0
  90. package/dist/dasha/error.js.map +1 -0
  91. package/dist/dasha/index.d.ts +5 -0
  92. package/dist/dasha/index.d.ts.map +1 -0
  93. package/dist/dasha/index.js +5 -0
  94. package/dist/dasha/index.js.map +1 -0
  95. package/dist/dasha/model.d.ts +56 -0
  96. package/dist/dasha/model.d.ts.map +1 -0
  97. package/dist/dasha/model.js +20 -0
  98. package/dist/dasha/model.js.map +1 -0
  99. package/dist/dasha/query.d.ts +31 -0
  100. package/dist/dasha/query.d.ts.map +1 -0
  101. package/dist/dasha/query.js +19 -0
  102. package/dist/dasha/query.js.map +1 -0
  103. package/dist/ephemeris/error.d.ts +9 -0
  104. package/dist/ephemeris/error.d.ts.map +1 -0
  105. package/dist/ephemeris/error.js +7 -0
  106. package/dist/ephemeris/error.js.map +1 -0
  107. package/dist/ephemeris/index.d.ts +4 -0
  108. package/dist/ephemeris/index.d.ts.map +1 -0
  109. package/dist/ephemeris/index.js +4 -0
  110. package/dist/ephemeris/index.js.map +1 -0
  111. package/dist/ephemeris/model.d.ts +28 -0
  112. package/dist/ephemeris/model.d.ts.map +1 -0
  113. package/dist/ephemeris/model.js +14 -0
  114. package/dist/ephemeris/model.js.map +1 -0
  115. package/dist/ephemeris/service.d.ts +14 -0
  116. package/dist/ephemeris/service.d.ts.map +1 -0
  117. package/dist/ephemeris/service.js +8 -0
  118. package/dist/ephemeris/service.js.map +1 -0
  119. package/dist/index.d.ts +13 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +13 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/jaimini/argala/calculate.d.ts +28 -0
  124. package/dist/jaimini/argala/calculate.d.ts.map +1 -0
  125. package/dist/jaimini/argala/calculate.js +56 -0
  126. package/dist/jaimini/argala/calculate.js.map +1 -0
  127. package/dist/jaimini/argala/helper.d.ts +8 -0
  128. package/dist/jaimini/argala/helper.d.ts.map +1 -0
  129. package/dist/jaimini/argala/helper.js +12 -0
  130. package/dist/jaimini/argala/helper.js.map +1 -0
  131. package/dist/jaimini/argala/index.d.ts +3 -0
  132. package/dist/jaimini/argala/index.d.ts.map +1 -0
  133. package/dist/jaimini/argala/index.js +3 -0
  134. package/dist/jaimini/argala/index.js.map +1 -0
  135. package/dist/jaimini/argala/model.d.ts +96 -0
  136. package/dist/jaimini/argala/model.d.ts.map +1 -0
  137. package/dist/jaimini/argala/model.js +38 -0
  138. package/dist/jaimini/argala/model.js.map +1 -0
  139. package/dist/jaimini/arudha-pada/calculate.d.ts +16 -0
  140. package/dist/jaimini/arudha-pada/calculate.d.ts.map +1 -0
  141. package/dist/jaimini/arudha-pada/calculate.js +36 -0
  142. package/dist/jaimini/arudha-pada/calculate.js.map +1 -0
  143. package/dist/jaimini/arudha-pada/helper.d.ts +6 -0
  144. package/dist/jaimini/arudha-pada/helper.d.ts.map +1 -0
  145. package/dist/jaimini/arudha-pada/helper.js +8 -0
  146. package/dist/jaimini/arudha-pada/helper.js.map +1 -0
  147. package/dist/jaimini/arudha-pada/index.d.ts +3 -0
  148. package/dist/jaimini/arudha-pada/index.d.ts.map +1 -0
  149. package/dist/jaimini/arudha-pada/index.js +3 -0
  150. package/dist/jaimini/arudha-pada/index.js.map +1 -0
  151. package/dist/jaimini/arudha-pada/model.d.ts +31 -0
  152. package/dist/jaimini/arudha-pada/model.d.ts.map +1 -0
  153. package/dist/jaimini/arudha-pada/model.js +22 -0
  154. package/dist/jaimini/arudha-pada/model.js.map +1 -0
  155. package/dist/jaimini/chara-karakas/calculate.d.ts +21 -0
  156. package/dist/jaimini/chara-karakas/calculate.d.ts.map +1 -0
  157. package/dist/jaimini/chara-karakas/calculate.js +85 -0
  158. package/dist/jaimini/chara-karakas/calculate.js.map +1 -0
  159. package/dist/jaimini/chara-karakas/helper.d.ts +15 -0
  160. package/dist/jaimini/chara-karakas/helper.d.ts.map +1 -0
  161. package/dist/jaimini/chara-karakas/helper.js +50 -0
  162. package/dist/jaimini/chara-karakas/helper.js.map +1 -0
  163. package/dist/jaimini/chara-karakas/index.d.ts +3 -0
  164. package/dist/jaimini/chara-karakas/index.d.ts.map +1 -0
  165. package/dist/jaimini/chara-karakas/index.js +3 -0
  166. package/dist/jaimini/chara-karakas/index.js.map +1 -0
  167. package/dist/jaimini/chara-karakas/model.d.ts +60 -0
  168. package/dist/jaimini/chara-karakas/model.d.ts.map +1 -0
  169. package/dist/jaimini/chara-karakas/model.js +45 -0
  170. package/dist/jaimini/chara-karakas/model.js.map +1 -0
  171. package/dist/jaimini/karakamsha/calculate.d.ts +18 -0
  172. package/dist/jaimini/karakamsha/calculate.d.ts.map +1 -0
  173. package/dist/jaimini/karakamsha/calculate.js +46 -0
  174. package/dist/jaimini/karakamsha/calculate.js.map +1 -0
  175. package/dist/jaimini/karakamsha/helper.d.ts +3 -0
  176. package/dist/jaimini/karakamsha/helper.d.ts.map +1 -0
  177. package/dist/jaimini/karakamsha/helper.js +8 -0
  178. package/dist/jaimini/karakamsha/helper.js.map +1 -0
  179. package/dist/jaimini/karakamsha/index.d.ts +3 -0
  180. package/dist/jaimini/karakamsha/index.d.ts.map +1 -0
  181. package/dist/jaimini/karakamsha/index.js +3 -0
  182. package/dist/jaimini/karakamsha/index.js.map +1 -0
  183. package/dist/jaimini/karakamsha/model.d.ts +42 -0
  184. package/dist/jaimini/karakamsha/model.d.ts.map +1 -0
  185. package/dist/jaimini/karakamsha/model.js +28 -0
  186. package/dist/jaimini/karakamsha/model.js.map +1 -0
  187. package/dist/jaimini/rashi-drishti/calculate.d.ts +11 -0
  188. package/dist/jaimini/rashi-drishti/calculate.d.ts.map +1 -0
  189. package/dist/jaimini/rashi-drishti/calculate.js +16 -0
  190. package/dist/jaimini/rashi-drishti/calculate.js.map +1 -0
  191. package/dist/jaimini/rashi-drishti/helper.d.ts +3 -0
  192. package/dist/jaimini/rashi-drishti/helper.d.ts.map +1 -0
  193. package/dist/jaimini/rashi-drishti/helper.js +41 -0
  194. package/dist/jaimini/rashi-drishti/helper.js.map +1 -0
  195. package/dist/jaimini/rashi-drishti/index.d.ts +3 -0
  196. package/dist/jaimini/rashi-drishti/index.d.ts.map +1 -0
  197. package/dist/jaimini/rashi-drishti/index.js +3 -0
  198. package/dist/jaimini/rashi-drishti/index.js.map +1 -0
  199. package/dist/jaimini/rashi-drishti/model.d.ts +20 -0
  200. package/dist/jaimini/rashi-drishti/model.d.ts.map +1 -0
  201. package/dist/jaimini/rashi-drishti/model.js +13 -0
  202. package/dist/jaimini/rashi-drishti/model.js.map +1 -0
  203. package/dist/jaimini/upapada/calculate.d.ts +15 -0
  204. package/dist/jaimini/upapada/calculate.d.ts.map +1 -0
  205. package/dist/jaimini/upapada/calculate.js +19 -0
  206. package/dist/jaimini/upapada/calculate.js.map +1 -0
  207. package/dist/jaimini/upapada/helper.d.ts +18 -0
  208. package/dist/jaimini/upapada/helper.d.ts.map +1 -0
  209. package/dist/jaimini/upapada/helper.js +10 -0
  210. package/dist/jaimini/upapada/helper.js.map +1 -0
  211. package/dist/jaimini/upapada/index.d.ts +3 -0
  212. package/dist/jaimini/upapada/index.d.ts.map +1 -0
  213. package/dist/jaimini/upapada/index.js +3 -0
  214. package/dist/jaimini/upapada/index.js.map +1 -0
  215. package/dist/jaimini/upapada/model.d.ts +31 -0
  216. package/dist/jaimini/upapada/model.d.ts.map +1 -0
  217. package/dist/jaimini/upapada/model.js +22 -0
  218. package/dist/jaimini/upapada/model.js.map +1 -0
  219. package/dist/sav/calculate.d.ts +282 -0
  220. package/dist/sav/calculate.d.ts.map +1 -0
  221. package/dist/sav/calculate.js +128 -0
  222. package/dist/sav/calculate.js.map +1 -0
  223. package/dist/sav/constants.d.ts +108 -0
  224. package/dist/sav/constants.d.ts.map +1 -0
  225. package/dist/sav/constants.js +131 -0
  226. package/dist/sav/constants.js.map +1 -0
  227. package/dist/sav/error.d.ts +9 -0
  228. package/dist/sav/error.d.ts.map +1 -0
  229. package/dist/sav/error.js +7 -0
  230. package/dist/sav/error.js.map +1 -0
  231. package/dist/sav/index.d.ts +4 -0
  232. package/dist/sav/index.d.ts.map +1 -0
  233. package/dist/sav/index.js +4 -0
  234. package/dist/sav/index.js.map +1 -0
  235. package/dist/sav/model.d.ts +58 -0
  236. package/dist/sav/model.d.ts.map +1 -0
  237. package/dist/sav/model.js +40 -0
  238. package/dist/sav/model.js.map +1 -0
  239. package/dist/swisseph/calculate.d.ts +19 -0
  240. package/dist/swisseph/calculate.d.ts.map +1 -0
  241. package/dist/swisseph/calculate.js +54 -0
  242. package/dist/swisseph/calculate.js.map +1 -0
  243. package/dist/swisseph/helper.d.ts +14 -0
  244. package/dist/swisseph/helper.d.ts.map +1 -0
  245. package/dist/swisseph/helper.js +43 -0
  246. package/dist/swisseph/helper.js.map +1 -0
  247. package/dist/swisseph/index.d.ts +2 -0
  248. package/dist/swisseph/index.d.ts.map +1 -0
  249. package/dist/swisseph/index.js +2 -0
  250. package/dist/swisseph/index.js.map +1 -0
  251. package/dist/swisseph/model.d.ts +7 -0
  252. package/dist/swisseph/model.d.ts.map +1 -0
  253. package/dist/swisseph/model.js +70 -0
  254. package/dist/swisseph/model.js.map +1 -0
  255. package/dist/swisseph/service.d.ts +5 -0
  256. package/dist/swisseph/service.d.ts.map +1 -0
  257. package/dist/swisseph/service.js +10 -0
  258. package/dist/swisseph/service.js.map +1 -0
  259. package/dist/yoga/calculate.d.ts +9 -0
  260. package/dist/yoga/calculate.d.ts.map +1 -0
  261. package/dist/yoga/calculate.js +48 -0
  262. package/dist/yoga/calculate.js.map +1 -0
  263. package/dist/yoga/catalog.d.ts +7 -0
  264. package/dist/yoga/catalog.d.ts.map +1 -0
  265. package/dist/yoga/catalog.js +129 -0
  266. package/dist/yoga/catalog.js.map +1 -0
  267. package/dist/yoga/definitions/house-patterns.d.ts +42 -0
  268. package/dist/yoga/definitions/house-patterns.d.ts.map +1 -0
  269. package/dist/yoga/definitions/house-patterns.js +73 -0
  270. package/dist/yoga/definitions/house-patterns.js.map +1 -0
  271. package/dist/yoga/definitions/moon-relative.d.ts +94 -0
  272. package/dist/yoga/definitions/moon-relative.d.ts.map +1 -0
  273. package/dist/yoga/definitions/moon-relative.js +123 -0
  274. package/dist/yoga/definitions/moon-relative.js.map +1 -0
  275. package/dist/yoga/error.d.ts +38 -0
  276. package/dist/yoga/error.d.ts.map +1 -0
  277. package/dist/yoga/error.js +37 -0
  278. package/dist/yoga/error.js.map +1 -0
  279. package/dist/yoga/evaluate.d.ts +36 -0
  280. package/dist/yoga/evaluate.d.ts.map +1 -0
  281. package/dist/yoga/evaluate.js +173 -0
  282. package/dist/yoga/evaluate.js.map +1 -0
  283. package/dist/yoga/format.d.ts +3 -0
  284. package/dist/yoga/format.d.ts.map +1 -0
  285. package/dist/yoga/format.js +5 -0
  286. package/dist/yoga/format.js.map +1 -0
  287. package/dist/yoga/index.d.ts +6 -0
  288. package/dist/yoga/index.d.ts.map +1 -0
  289. package/dist/yoga/index.js +6 -0
  290. package/dist/yoga/index.js.map +1 -0
  291. package/dist/yoga/internal.d.ts +274 -0
  292. package/dist/yoga/internal.d.ts.map +1 -0
  293. package/dist/yoga/internal.js +4 -0
  294. package/dist/yoga/internal.js.map +1 -0
  295. package/dist/yoga/model.d.ts +107 -0
  296. package/dist/yoga/model.d.ts.map +1 -0
  297. package/dist/yoga/model.js +66 -0
  298. package/dist/yoga/model.js.map +1 -0
  299. package/dist/yoga/provenance.d.ts +3 -0
  300. package/dist/yoga/provenance.d.ts.map +1 -0
  301. package/dist/yoga/provenance.js +5 -0
  302. package/dist/yoga/provenance.js.map +1 -0
  303. package/package.json +122 -0
package/README.md ADDED
@@ -0,0 +1,185 @@
1
+ # astro-ascendant
2
+
3
+ `astro-ascendant` is an Effect-first TypeScript library for Vedic astrology calculations. It calculates sidereal Placements, D1 and divisional Charts, Vimshottari Dasha timelines, and classical Parashari Ashtakavarga.
4
+
5
+ The library calculates planetary positions once for a Located Moment. Chart, Dasha, and SAV modules then share those Placements without repeating ephemeris work.
6
+
7
+ ## Features
8
+
9
+ - **Shared Placements**: sidereal longitudes, motion states, nakshatras, and pada
10
+ - **Charts**: D1, 15 divisional Charts, and a configured Bhava chart from one calculation
11
+ - **Methodologies**: 39 predefined ayanamsas and 13 house systems
12
+ - **Vimshottari Dasha**: Mahadasha and Antardasha timelines with date queries
13
+ - **Ashtakavarga**: BAV, SAV, reduced BAV, and Shodhya Pinda
14
+ - **Yogas**: classical Yoga catalog with structured evidence and bounded concurrency
15
+ - **Effect integration**: named effects, typed context, layers, schemas, and domain errors
16
+ - **Runtime-neutral core**: use the bundled Node/Bun adapter or provide another Ephemeris adapter
17
+
18
+ ## Installation
19
+
20
+ Install the library with its Effect peer dependency. Add the Swiss Ephemeris adapter when you run calculations in Node.js or Bun.
21
+
22
+ ```bash
23
+ npm install astro-ascendant effect @swisseph/node
24
+ ```
25
+
26
+ The package uses ES modules and ships TypeScript declarations.
27
+
28
+ ## Calculate a chart
29
+
30
+ Create a Located Moment, provide the runtime layers once, and request the divisions you need. D1 is always included as the first Chart.
31
+
32
+ ```typescript
33
+ import { BunRuntime } from "@effect/platform-bun";
34
+ import { AstroParams, Chart } from "astro-ascendant";
35
+ import * as Swisseph from "astro-ascendant/swisseph";
36
+ import { Console, DateTime, Effect, Layer } from "effect";
37
+
38
+ const moment = Chart.Moment.make({
39
+ date: DateTime.makeUnsafe("2000-01-01T12:00:00.000Z"),
40
+ });
41
+ const input = Chart.LocatedMoment.make({
42
+ moment,
43
+ latitude: 12.9716,
44
+ longitude: 77.5946,
45
+ });
46
+
47
+ const program = Chart.generate(input, [9, 10]);
48
+ const runtimeLayer = Layer.merge(AstroParams.DefaultAstroParams, Swisseph.SwissephLayer);
49
+
50
+ BunRuntime.runMain(program.pipe(Effect.provide(runtimeLayer)));
51
+ ```
52
+
53
+ `calculation.placements` contains the shared source longitudes. `calculation.charts` contains D1, D9, and D10 in deterministic order. `calculation.bhava` contains the twelve cusp-defined houses and all eight house angles. `calculation.astroParams` records the resolved methodology used for the result.
54
+
55
+ ## Derive Dasha and Ashtakavarga
56
+
57
+ Pass the shared Placements to the Dasha and SAV modules. Both calculations stay in process and do not call the Ephemeris adapter again.
58
+
59
+ ```typescript
60
+ import { Dasha, SAV } from "astro-ascendant";
61
+
62
+ const derivedProgram = Effect.gen(function* () {
63
+ const timeline = yield* Dasha.calculate(moment, calculation.placements);
64
+ const current = yield* Dasha.at(timeline);
65
+ const ashtakavarga = yield* SAV.calculate(calculation.placements);
66
+
67
+ return { timeline, current, ashtakavarga };
68
+ });
69
+ ```
70
+
71
+ `Dasha.at` queries the active Mahadasha and Antardasha with half-open UTC intervals. The SAV result contains these fields:
72
+
73
+ - `bhinna`: BAV tables for the 7 classical planets and Lagna
74
+ - `sarva`: the 12 SAV scores, excluding Lagna BAV
75
+ - `reduced`: Trikona and Ekadhipatya reduced planetary BAV tables
76
+ - `shodhya_pinda`: Rashi, Graha, and total Shodhya Pinda by planet
77
+ - `totals`: classical BAV checksums and the SAV total of 337
78
+
79
+ ## Evaluate Yogas
80
+
81
+ Evaluate the built-in Yoga rule set against an existing Chart calculation. The module preflights the required divisions, then runs the definitions with bounded concurrency and returns structured evidence per definition.
82
+
83
+ ```typescript
84
+ import { Yoga } from "astro-ascendant";
85
+
86
+ const yogaProgram = Effect.gen(function* () {
87
+ const evaluation = yield* Yoga.evaluateAll(calculation);
88
+
89
+ for (const { yoga: descriptor, present } of evaluation.results) {
90
+ if (present) yield* Console.log(descriptor.name);
91
+ }
92
+
93
+ return yield* Yoga.evaluateSelected(calculation, [
94
+ Yoga.YogaId.make("gajakesari"),
95
+ Yoga.YogaId.make("sunapha"),
96
+ ]);
97
+ });
98
+ ```
99
+
100
+ `Yoga.catalog` lists every definition's descriptor without running any calculation. Unknown, duplicate, or empty selections and missing Chart divisions fail through the typed error channel before definitions start. Each result carries a `YogaEvidence` tree that `Yoga.formatEvidence` renders as text.
101
+
102
+ ## Configure calculation parameters
103
+
104
+ `AstroParams.DefaultAstroParams` uses Lahiri ayanamsa and Whole Sign houses. Provide another layer for a different supported methodology.
105
+
106
+ ```typescript
107
+ const paramsLayer = AstroParams.layer({
108
+ ayanamsa: "Raman",
109
+ houseSystem: "Placidus",
110
+ });
111
+ ```
112
+
113
+ The Chart module produces sign-based D1 and divisional Charts, so their houses remain Whole Sign. The configured `houseSystem` changes only `calculation.bhava`; the shared Placements and sign-based Charts retain their own semantics.
114
+
115
+ ### Supported ayanamsas
116
+
117
+ The stable public ayanamsa set follows the predefined Swiss Ephemeris identifiers:
118
+
119
+ `FaganBradley`, `Lahiri`, `DeLuce`, `Raman`, `Ushashashi`, `Krishnamurti`, `DjwhalKhul`, `Yukteshwar`, `JNBhasin`, `BabylKugler1`, `BabylKugler2`, `BabylKugler3`, `BabylHuber`, `BabylEtPSC`, `Aldebaran15Tau`, `Hipparchos`, `Sassanian`, `GalacticCenter0Sag`, `J2000`, `J1900`, `B1950`, `SuryaSiddhanta`, `SuryaSiddhantaMeanSun`, `Aryabhata`, `AryabhataMeanSun`, `SSRevati`, `SSCitra`, `TrueCitra`, `TrueRevati`, `TruePushya`, `GalacticCenterGilBrand`, `GalacticEquatorIAU1958`, `GalacticEquator`, `GalacticEquatorMidMula`, `Skydram`, `TrueMula`, `DhruvaGalCenterMulaWilhelm`, `Aryabhata522`, and `BabylBritton`.
120
+
121
+ `UserDefined` is not supported because it requires custom epoch and offset parameters that are outside the public AstroParams contract.
122
+
123
+ ### Supported house systems
124
+
125
+ The supported house systems are `Placidus`, `Koch`, `Porphyrius`, `Regiomontanus`, `Campanus`, `Equal`, `VehlowEqual`, `WholeSign`, `Meridian`, `Azimuthal`, `PolichPage`, `Alcabitus`, and `Morinus`.
126
+
127
+ Some systems, including Placidus and Koch, cannot be calculated at certain polar latitudes. These cases fail through the typed Effect error channel; the adapter does not silently return a different house system.
128
+
129
+ ## Supported divisions
130
+
131
+ The Chart module supports these divisions:
132
+
133
+ `D1`, `D2`, `D3`, `D4`, `D7`, `D9`, `D10`, `D12`, `D16`, `D20`, `D24`, `D27`, `D30`, `D40`, `D45`, and `D60`.
134
+
135
+ Duplicate requests are calculated once. The returned collection always begins with D1 and orders the remaining divisions numerically.
136
+
137
+ ## Package exports
138
+
139
+ Import namespaces from the package root or use focused entry points:
140
+
141
+ | Import | Purpose |
142
+ | ------------------------------------------ | ------------------------------------------------------------------ |
143
+ | `astro-ascendant` | `AstroParams`, `Chart`, `Dasha`, `Ephemeris`, and `SAV` namespaces |
144
+ | `astro-ascendant/chart` | Chart models, schemas, errors, generation, and projection |
145
+ | `astro-ascendant/dasha` | Vimshottari Dasha models, calculation, and UTC lookup |
146
+ | `astro-ascendant/sav` | Ashtakavarga models, errors, and calculation |
147
+ | `astro-ascendant/yoga` | Yoga models, rule set, errors, evaluation, and evidence formatting |
148
+ | `astro-ascendant/astro-params` | Calculation parameter models and layers |
149
+ | `astro-ascendant/ephemeris` | Runtime-neutral ephemeris contract and models |
150
+ | `astro-ascendant/swisseph` | Swiss Ephemeris adapter for Node.js and Bun |
151
+ | `astro-ascendant/chart/divisional-mapping` | Focused divisional mapping functions |
152
+
153
+ ## Examples
154
+
155
+ The executable examples read `MOMENT_DATE`, `LATITUDE`, and `LONGITUDE` from the environment:
156
+
157
+ ```bash
158
+ MOMENT_DATE=2000-01-01T12:00:00.000Z \
159
+ LATITUDE=12.9716 \
160
+ LONGITUDE=77.5946 \
161
+ bun run examples/chart.ts
162
+ ```
163
+
164
+ Replace `chart.ts` with `dasha.ts`, `sav.ts`, `yoga.ts`, or `jaimini.ts` to print the
165
+ corresponding tables.
166
+ The Jaimini example composes Chara Karakas, Rashi Drishti, Karakamsha, Arudha Pada,
167
+ Upapada, and Argala through their separately named operations.
168
+
169
+ ## Development
170
+
171
+ Install dependencies and run the complete verification suite:
172
+
173
+ ```bash
174
+ bun install
175
+ make check
176
+ ```
177
+
178
+ Use `make help` to list the available development commands.
179
+
180
+ Run the non-gating Yoga benchmark with `bun run benchmark:yoga`; see
181
+ [benchmarks/README.md](benchmarks/README.md) for methodology and recent numbers.
182
+
183
+ ## License
184
+
185
+ `astro-ascendant` is available under the [GNU Affero General Public License v3.0 or later](LICENSE).
@@ -0,0 +1,3 @@
1
+ export * from "./model.js";
2
+ export * from "./service.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/astro-params/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./model.js";
2
+ export * from "./service.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/astro-params/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Schema } from "effect";
2
+ export declare const Ayanamsa: Schema.Literals<readonly ["FaganBradley", "Lahiri", "DeLuce", "Raman", "Ushashashi", "Krishnamurti", "DjwhalKhul", "Yukteshwar", "JNBhasin", "BabylKugler1", "BabylKugler2", "BabylKugler3", "BabylHuber", "BabylEtPSC", "Aldebaran15Tau", "Hipparchos", "Sassanian", "GalacticCenter0Sag", "J2000", "J1900", "B1950", "SuryaSiddhanta", "SuryaSiddhantaMeanSun", "Aryabhata", "AryabhataMeanSun", "SSRevati", "SSCitra", "TrueCitra", "TrueRevati", "TruePushya", "GalacticCenterGilBrand", "GalacticEquatorIAU1958", "GalacticEquator", "GalacticEquatorMidMula", "Skydram", "TrueMula", "DhruvaGalCenterMulaWilhelm", "Aryabhata522", "BabylBritton"]>;
3
+ export declare const HouseSystem: Schema.Literals<readonly ["Placidus", "Koch", "Porphyrius", "Regiomontanus", "Campanus", "Equal", "VehlowEqual", "WholeSign", "Meridian", "Azimuthal", "PolichPage", "Alcabitus", "Morinus"]>;
4
+ declare const Options_base: Schema.Class<Options, Schema.Struct<{
5
+ readonly ayanamsa: Schema.Literals<readonly ["FaganBradley", "Lahiri", "DeLuce", "Raman", "Ushashashi", "Krishnamurti", "DjwhalKhul", "Yukteshwar", "JNBhasin", "BabylKugler1", "BabylKugler2", "BabylKugler3", "BabylHuber", "BabylEtPSC", "Aldebaran15Tau", "Hipparchos", "Sassanian", "GalacticCenter0Sag", "J2000", "J1900", "B1950", "SuryaSiddhanta", "SuryaSiddhantaMeanSun", "Aryabhata", "AryabhataMeanSun", "SSRevati", "SSCitra", "TrueCitra", "TrueRevati", "TruePushya", "GalacticCenterGilBrand", "GalacticEquatorIAU1958", "GalacticEquator", "GalacticEquatorMidMula", "Skydram", "TrueMula", "DhruvaGalCenterMulaWilhelm", "Aryabhata522", "BabylBritton"]>;
6
+ readonly houseSystem: Schema.Literals<readonly ["Placidus", "Koch", "Porphyrius", "Regiomontanus", "Campanus", "Equal", "VehlowEqual", "WholeSign", "Meridian", "Azimuthal", "PolichPage", "Alcabitus", "Morinus"]>;
7
+ }>, {}>;
8
+ export declare class Options extends Options_base {
9
+ }
10
+ export {};
11
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/astro-params/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,eAAO,MAAM,QAAQ,2nBAwCnB,CAAC;AAEH,eAAO,MAAM,WAAW,+LActB,CAAC;;;;;AAEH,qBAAa,OAAQ,SAAQ,YAG3B;CAAG"}
@@ -0,0 +1,63 @@
1
+ import { Schema } from "effect";
2
+ export const Ayanamsa = Schema.Literals([
3
+ "FaganBradley",
4
+ "Lahiri",
5
+ "DeLuce",
6
+ "Raman",
7
+ "Ushashashi",
8
+ "Krishnamurti",
9
+ "DjwhalKhul",
10
+ "Yukteshwar",
11
+ "JNBhasin",
12
+ "BabylKugler1",
13
+ "BabylKugler2",
14
+ "BabylKugler3",
15
+ "BabylHuber",
16
+ "BabylEtPSC",
17
+ "Aldebaran15Tau",
18
+ "Hipparchos",
19
+ "Sassanian",
20
+ "GalacticCenter0Sag",
21
+ "J2000",
22
+ "J1900",
23
+ "B1950",
24
+ "SuryaSiddhanta",
25
+ "SuryaSiddhantaMeanSun",
26
+ "Aryabhata",
27
+ "AryabhataMeanSun",
28
+ "SSRevati",
29
+ "SSCitra",
30
+ "TrueCitra",
31
+ "TrueRevati",
32
+ "TruePushya",
33
+ "GalacticCenterGilBrand",
34
+ "GalacticEquatorIAU1958",
35
+ "GalacticEquator",
36
+ "GalacticEquatorMidMula",
37
+ "Skydram",
38
+ "TrueMula",
39
+ "DhruvaGalCenterMulaWilhelm",
40
+ "Aryabhata522",
41
+ "BabylBritton",
42
+ ]);
43
+ export const HouseSystem = Schema.Literals([
44
+ "Placidus",
45
+ "Koch",
46
+ "Porphyrius",
47
+ "Regiomontanus",
48
+ "Campanus",
49
+ "Equal",
50
+ "VehlowEqual",
51
+ "WholeSign",
52
+ "Meridian",
53
+ "Azimuthal",
54
+ "PolichPage",
55
+ "Alcabitus",
56
+ "Morinus",
57
+ ]);
58
+ export class Options extends Schema.Class("AstroParams")({
59
+ ayanamsa: Ayanamsa,
60
+ houseSystem: HouseSystem,
61
+ }) {
62
+ }
63
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/astro-params/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACtC,cAAc;IACd,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,cAAc;IACd,cAAc;IACd,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,gBAAgB;IAChB,YAAY;IACZ,WAAW;IACX,oBAAoB;IACpB,OAAO;IACP,OAAO;IACP,OAAO;IACP,gBAAgB;IAChB,uBAAuB;IACvB,WAAW;IACX,kBAAkB;IAClB,UAAU;IACV,SAAS;IACT,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,wBAAwB;IACxB,wBAAwB;IACxB,iBAAiB;IACjB,wBAAwB;IACxB,SAAS;IACT,UAAU;IACV,4BAA4B;IAC5B,cAAc;IACd,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;IACzC,UAAU;IACV,MAAM;IACN,YAAY;IACZ,eAAe;IACf,UAAU;IACV,OAAO;IACP,aAAa;IACb,WAAW;IACX,UAAU;IACV,WAAW;IACX,YAAY;IACZ,WAAW;IACX,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,OAAO,OAAQ,SAAQ,MAAM,CAAC,KAAK,CAAU,aAAa,CAAC,CAAC;IAChE,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,WAAW;CACzB,CAAC;CAAG"}
@@ -0,0 +1,12 @@
1
+ import { Context, Layer } from "effect";
2
+ import { Ayanamsa, HouseSystem, type Options } from "./model.js";
3
+ declare const Service_base: Context.ServiceClass<Service, "astro-ascendant/astro-params/service", {
4
+ readonly ayanamsa: typeof Ayanamsa.Type;
5
+ readonly houseSystem: typeof HouseSystem.Type;
6
+ }>;
7
+ declare class Service extends Service_base {
8
+ }
9
+ export declare function layer(options: Options): Layer.Layer<Service, never, never>;
10
+ declare const defaultLayer: Layer.Layer<Service, never, never>;
11
+ export { Service as AstroParams, defaultLayer as DefaultAstroParams };
12
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/astro-params/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;;uBAK1C,OAAO,QAAQ,CAAC,IAAI;0BACjB,OAAO,WAAW,CAAC,IAAI;;AAJjD,cAAM,OAAQ,SAAQ,YAMqB;CAAG;AAE9C,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,sCAErC;AAED,QAAA,MAAM,YAAY,oCAGhB,CAAC;AAEH,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,YAAY,IAAI,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Context, Layer } from "effect";
2
+ import { Ayanamsa, HouseSystem } from "./model.js";
3
+ class Service extends Context.Service()("astro-ascendant/astro-params/service") {
4
+ }
5
+ export function layer(options) {
6
+ return Layer.succeed(Service, Service.of(options));
7
+ }
8
+ const defaultLayer = layer({
9
+ ayanamsa: "Lahiri",
10
+ houseSystem: "WholeSign",
11
+ });
12
+ export { Service as AstroParams, defaultLayer as DefaultAstroParams };
13
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/astro-params/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AAEjE,MAAM,OAAQ,SAAQ,OAAO,CAAC,OAAO,EAMlC,CAAC,sCAAsC,CAAC;CAAG;AAE9C,MAAM,UAAU,KAAK,CAAC,OAAgB;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,YAAY,GAAG,KAAK,CAAC;IACzB,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,WAAW;CACzB,CAAC,CAAC;AAEH,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,YAAY,IAAI,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Effect } from "effect";
2
+ import type { HouseData } from "../../ephemeris/model.js";
3
+ import { ChartCalculationError } from "../error.js";
4
+ import { BhavaChart, type Chart } from "../model.js";
5
+ export declare const bhavaFromHouseData: (houses: HouseData, d1: Chart) => Effect.Effect<BhavaChart, ChartCalculationError, never>;
6
+ //# sourceMappingURL=calculate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate.d.ts","sourceRoot":"","sources":["../../../src/chart/bhava/calculate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAkB,MAAM,QAAQ,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAEL,UAAU,EAIV,KAAK,KAAK,EAEX,MAAM,aAAa,CAAC;AAKrB,eAAO,MAAM,kBAAkB,2FAoG7B,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { Effect, Record, Schema } from "effect";
2
+ import { ChartCalculationError } from "../error.js";
3
+ import { BhavaAngles, BhavaChart, BhavaHouse, BhavaHouses, CircleAngle, Longitude, } from "../model.js";
4
+ import { distributePlanets, forwardDistance, normalizeAngle } from "./helper.js";
5
+ const HOUSE_NUMBERS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
6
+ export const bhavaFromHouseData = Effect.fn("Chart.Bhava.fromHouseData")(function* (houses, d1) {
7
+ const rawCusps = houses.cusps.slice(1, 13);
8
+ const rawAngles = [
9
+ houses.ascendant,
10
+ houses.mc,
11
+ houses.armc,
12
+ houses.vertex,
13
+ houses.equatorialAscendant,
14
+ houses.coAscendant1,
15
+ houses.coAscendant2,
16
+ houses.polarAscendant,
17
+ ];
18
+ if (rawCusps.length !== HOUSE_NUMBERS.length ||
19
+ rawCusps.some((cusp) => !Number.isFinite(cusp)) ||
20
+ rawAngles.some((angle) => !Number.isFinite(angle))) {
21
+ return yield* ChartCalculationError.make({
22
+ stage: "mapping",
23
+ message: "Could not calculate Bhava chart",
24
+ cause: houses,
25
+ });
26
+ }
27
+ const cusps = rawCusps.map((cusp) => normalizeAngle(cusp));
28
+ const spans = cusps.map((cusp, index) => {
29
+ const nextCusp = cusps[(index + 1) % cusps.length];
30
+ return nextCusp === undefined ? Number.NaN : forwardDistance(cusp, nextCusp);
31
+ });
32
+ const fullCircle = spans.reduce((total, span) => total + span, 0);
33
+ if (spans.some((span) => span === 0) || Math.abs(fullCircle - 360) > 1e-7) {
34
+ return yield* ChartCalculationError.make({
35
+ stage: "mapping",
36
+ message: "Could not calculate Bhava chart",
37
+ cause: houses.cusps,
38
+ });
39
+ }
40
+ const planets = Record.values(d1.houses).flatMap((house) => house.planets);
41
+ const lagna = d1.houses[1].lagna;
42
+ if (lagna === null) {
43
+ return yield* ChartCalculationError.make({
44
+ stage: "mapping",
45
+ message: "Could not calculate Bhava chart",
46
+ cause: d1,
47
+ });
48
+ }
49
+ const planetsByHouse = distributePlanets(planets, cusps, spans);
50
+ const bhavaHouseEntries = [];
51
+ for (const [index, houseNumber] of HOUSE_NUMBERS.entries()) {
52
+ const cusp = cusps[index];
53
+ const housePlanets = planetsByHouse[index];
54
+ if (cusp === undefined || housePlanets === undefined) {
55
+ return yield* ChartCalculationError.make({
56
+ stage: "mapping",
57
+ message: "Could not calculate Bhava chart",
58
+ cause: houses.cusps,
59
+ });
60
+ }
61
+ bhavaHouseEntries.push([
62
+ String(houseNumber),
63
+ BhavaHouse.make({
64
+ cusp: Longitude.make(cusp),
65
+ planets: housePlanets,
66
+ lagna: index === 0 ? lagna : null,
67
+ }),
68
+ ]);
69
+ }
70
+ const bhavaHouses = yield* Schema.decodeUnknownEffect(BhavaHouses)(Record.fromEntries(bhavaHouseEntries)).pipe(Effect.mapError((cause) => ChartCalculationError.make({
71
+ stage: "mapping",
72
+ message: "Could not calculate Bhava chart",
73
+ cause,
74
+ })));
75
+ return BhavaChart.make({
76
+ houses: bhavaHouses,
77
+ angles: BhavaAngles.make({
78
+ ascendant: CircleAngle.make(normalizeAngle(houses.ascendant)),
79
+ mc: CircleAngle.make(normalizeAngle(houses.mc)),
80
+ armc: CircleAngle.make(normalizeAngle(houses.armc)),
81
+ vertex: CircleAngle.make(normalizeAngle(houses.vertex)),
82
+ equatorialAscendant: CircleAngle.make(normalizeAngle(houses.equatorialAscendant)),
83
+ coAscendant1: CircleAngle.make(normalizeAngle(houses.coAscendant1)),
84
+ coAscendant2: CircleAngle.make(normalizeAngle(houses.coAscendant2)),
85
+ polarAscendant: CircleAngle.make(normalizeAngle(houses.polarAscendant)),
86
+ }),
87
+ });
88
+ });
89
+ //# sourceMappingURL=calculate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate.js","sourceRoot":"","sources":["../../../src/chart/bhava/calculate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Planet } from "../model.js";
2
+ export declare function normalizeAngle(angle: number): number;
3
+ export declare const forwardDistance: ((to: number) => (from: number) => number) & ((from: number, to: number) => number);
4
+ export declare const houseFor: ((cusps: readonly number[], spans: readonly number[]) => (longitude: number) => number) & ((longitude: number, cusps: readonly number[], spans: readonly number[]) => number);
5
+ export declare const distributePlanets: ((cusps: readonly number[], spans: readonly number[]) => (planets: readonly Planet[]) => readonly (readonly Planet[])[]) & ((planets: readonly Planet[], cusps: readonly number[], spans: readonly number[]) => readonly (readonly Planet[])[]);
6
+ //# sourceMappingURL=helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/chart/bhava/helper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,eAAO,MAAM,eAAe,QACrB,MAAM,KAAK,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,YACjC,MAAM,MAAM,MAAM,KAAK,MAAM,CACO,CAAC;AAE9C,eAAO,MAAM,QAAQ,WACX,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,iBACzE,MAAM,SAAS,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,EAAE,KAAK,MAAM,CAMlF,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAEnB,SAAS,MAAM,EAAE,SACjB,SAAS,MAAM,EAAE,KACrB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,eAExD,SAAS,MAAM,EAAE,SACnB,SAAS,MAAM,EAAE,SACjB,SAAS,MAAM,EAAE,KACrB,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAcnC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Function } from "effect";
2
+ export function normalizeAngle(angle) {
3
+ return ((angle % 360) + 360) % 360;
4
+ }
5
+ export const forwardDistance = Function.dual(2, (from, to) => normalizeAngle(to - from));
6
+ export const houseFor = Function.dual(3, (longitude, cusps, spans) => cusps.findIndex((cusp, index) => {
7
+ const span = spans[index];
8
+ return span !== undefined && forwardDistance(cusp, longitude) < span;
9
+ }));
10
+ export const distributePlanets = Function.dual(3, (planets, cusps, spans) => {
11
+ const planetsByHouse = Array.from({ length: 12 }, () => []);
12
+ for (const planet of planets) {
13
+ const houseIndex = houseFor(planet.longitude, cusps, spans);
14
+ const housePlanets = planetsByHouse[houseIndex];
15
+ if (housePlanets === undefined) {
16
+ throw new Error("Could not calculate Bhava chart");
17
+ }
18
+ housePlanets.push(planet);
19
+ }
20
+ return planetsByHouse;
21
+ });
22
+ //# sourceMappingURL=helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/chart/bhava/helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIlC,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAG1C,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;AAE9C,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAGnC,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAC/B,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,IAAI,KAAK,SAAS,IAAI,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;AACvE,CAAC,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAU5C,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAC7B,MAAM,cAAc,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAExE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { bhavaFromHouseData } from "./calculate.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/chart/bhava/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { bhavaFromHouseData } from "./calculate.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/chart/bhava/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Effect } from "effect";
2
+ import { ChartCalculationError } from "./error.js";
3
+ import { Chart, type Placements } from "./model.js";
4
+ export declare const project: (placements: Placements, divisions?: readonly (1 | 2 | 3 | 4 | 7 | 9 | 10 | 12 | 16 | 20 | 24 | 27 | 30 | 40 | 45 | 60)[] | undefined) => Effect.Effect<[Chart, ...Chart[]], ChartCalculationError, never>;
5
+ //# sourceMappingURL=charts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"charts.d.ts","sourceRoot":"","sources":["../../src/chart/charts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAiC,MAAM,QAAQ,CAAC;AAGtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EACL,KAAK,EAKL,KAAK,UAAU,EAIhB,MAAM,YAAY,CAAC;AA4FpB,eAAO,MAAM,OAAO,4MAmBnB,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { Array, Effect, Order, pipe, Record as Struct } from "effect";
2
+ import { getDivisionalTarget } from "./divisional-mapping/calculate.js";
3
+ import { ChartCalculationError } from "./error.js";
4
+ import { inSignStatus } from "./helper.js";
5
+ import { SIGN_LORDS } from "./internal/constants.js";
6
+ import { Chart, House, Houses, Lagna, Planet, Rashis, Sign, } from "./model.js";
7
+ function chartFromMappedPlacements({ division, lagna, planets, }) {
8
+ const lagnaSignIndex = Rashis.literals.indexOf(lagna.sign.name);
9
+ const houses = Struct.fromEntries(Array.range(0, 11).map((index) => {
10
+ const house = (index + 1);
11
+ const houseSign = Array.getUnsafe(Rashis.literals, (lagnaSignIndex + index) % 12);
12
+ return [
13
+ String(house),
14
+ House.make({
15
+ sign: houseSign,
16
+ planets: planets.filter((planet) => planet.sign.name === houseSign),
17
+ lagna: house === 1 ? lagna : null,
18
+ }),
19
+ ];
20
+ }));
21
+ return Chart.make({
22
+ provenance: {
23
+ method: "ascendant-divisional-mapping",
24
+ version: "1",
25
+ },
26
+ division,
27
+ houses,
28
+ });
29
+ }
30
+ const chartFromPlacements = Effect.fn("astro-ascendant/chart/chartFromPlacements")(function* (placements, division) {
31
+ const lagna = yield* getDivisionalTarget(placements.lagna.longitude, division).pipe(Effect.map((mapped) => {
32
+ const mappedSign = Array.getUnsafe(Rashis.literals, mapped.signIndex);
33
+ return Lagna.make({
34
+ name: "Lagna",
35
+ longitude: mapped.longitude,
36
+ degree: mapped.degree,
37
+ sign: Sign.make({
38
+ name: mappedSign,
39
+ lord: SIGN_LORDS[mappedSign],
40
+ }),
41
+ });
42
+ }));
43
+ const planets = yield* Effect.all(placements.planets.map((source) => getDivisionalTarget(source.longitude, division).pipe(Effect.map((mapped) => {
44
+ const mappedSign = Array.getUnsafe(Rashis.literals, mapped.signIndex);
45
+ return Planet.make({
46
+ name: source.name,
47
+ longitude: mapped.longitude,
48
+ degree: mapped.degree,
49
+ is_retrograde: source.is_retrograde,
50
+ in_sign: inSignStatus(source.name, source.longitude),
51
+ sign: Sign.make({
52
+ name: mappedSign,
53
+ lord: SIGN_LORDS[mappedSign],
54
+ }),
55
+ });
56
+ }))), { concurrency: "unbounded" });
57
+ return chartFromMappedPlacements({ division, lagna, planets });
58
+ });
59
+ function requestedDivisions(divisions) {
60
+ const requested = pipe(divisions, Array.filter((division) => division !== 1), Array.dedupe, Array.sort(Order.Number));
61
+ return [1, ...requested];
62
+ }
63
+ export const project = Effect.fn("astro-ascendant/chart/project")(function* (placements, divisions = []) {
64
+ const requested = requestedDivisions(divisions);
65
+ const [firstDivision, ...remainingDivisions] = requested;
66
+ const firstChart = yield* chartFromPlacements(placements, firstDivision);
67
+ const remainingCharts = yield* Effect.all(remainingDivisions.map((division) => chartFromPlacements(placements, division)), { concurrency: "unbounded" });
68
+ return [firstChart, ...remainingCharts];
69
+ }, Effect.mapError((cause) => ChartCalculationError.make({
70
+ stage: "mapping",
71
+ message: "Could not map one or more requested Divisions",
72
+ cause,
73
+ })));
74
+ //# sourceMappingURL=charts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"charts.js","sourceRoot":"","sources":["../../src/chart/charts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Effect } from "effect";
2
+ import { DivisionalMappingError } from "./error.js";
3
+ export declare const DIVISIONAL_MAPPING: "ascendant-divisional-mapping";
4
+ export declare const normalizeLongitude: (longitude: number) => Effect.Effect<number & import("effect/Brand").Brand<"Longitude">, DivisionalMappingError, never>;
5
+ export declare const getDivisionalTarget: (longitude: number, division: 1 | 2 | 3 | 4 | 7 | 9 | 10 | 12 | 16 | 20 | 24 | 27 | 30 | 40 | 45 | 60) => Effect.Effect<import("./model.js").DivisionalTarget, DivisionalMappingError, never>;
6
+ //# sourceMappingURL=calculate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate.d.ts","sourceRoot":"","sources":["../../../src/chart/divisional-mapping/calculate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAQ,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AASpD,eAAO,MAAM,kBAAkB,EAAG,8BAAuC,CAAC;AAE1E,eAAO,MAAM,kBAAkB,yHAe9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,+LAa/B,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { Effect, pipe } from "effect";
2
+ import { Longitude } from "../model.js";
3
+ import { DivisionalMappingError } from "./error.js";
4
+ import { divisionalTargetOf, identityTargetOf, sourcePositionOf, subdivisionOf, targetSignOf, } from "./helper.js";
5
+ export const DIVISIONAL_MAPPING = "ascendant-divisional-mapping";
6
+ export const normalizeLongitude = Effect.fn("Chart.DivisionalMapping.normalizeLongitude")(function* (longitude) {
7
+ if (!Number.isFinite(longitude)) {
8
+ return yield* DivisionalMappingError.make({
9
+ message: "Longitude must be finite",
10
+ cause: longitude,
11
+ });
12
+ }
13
+ return pipe(longitude % 360, (remainder) => (remainder < 0 ? remainder + 360 : remainder), (normalized) => Longitude.make(normalized));
14
+ });
15
+ export const getDivisionalTarget = Effect.fn("Chart.DivisionalMapping.getDivisionalTarget")(function* (longitude, division) {
16
+ const source = yield* normalizeLongitude(longitude).pipe(Effect.map(sourcePositionOf));
17
+ if (division === 1) {
18
+ return pipe(source, identityTargetOf);
19
+ }
20
+ const subdivision = subdivisionOf(source.degree, division);
21
+ const signIndex = targetSignOf(source, subdivision, division);
22
+ return pipe({ signIndex, degree: subdivision.degree }, divisionalTargetOf);
23
+ });
24
+ //# sourceMappingURL=calculate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate.js","sourceRoot":"","sources":["../../../src/chart/divisional-mapping/calculate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAiB,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,kBAAkB,GAAG,8BAAuC,CAAC;AAE1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,4CAA4C,CAAC,CACvF,QAAQ,CAAC,EAAE,SAAiB;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC;YACxC,OAAO,EAAE,0BAA0B;YACnC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CACT,SAAS,GAAG,GAAG,EACf,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAC5D,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAC3C,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,6CAA6C,CAAC,CACzF,QAAQ,CAAC,EAAE,SAAiB,EAAE,QAAkB;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvF,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE9D,OAAO,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC7E,CAAC,CACF,CAAC"}