Releases: svarbhanu/grahan
Release list
v1.0.1 — first tokenless release
No code changes. This is the first release published entirely from CI via npm trusted publishing (OIDC): no tokens exist anywhere, every package now carries a SLSA provenance attestation (verify with npm audit signatures), and the release workflow refuses to publish a partial release — every package must pass an OIDC exchange preflight before any of them publishes.
v1.0.0 — the stability release
No calculation changed; everything around them became production-grade.
- Frozen public API — the exact export surface of all three packages is pinned by tests; from 1.0.0 breaking changes only ship with a major version.
- Input contract — bad inputs (latitude 95, an invalid Date, month 13, an unknown IANA zone) throw a RangeError naming the offending value instead of propagating NaN. Validators exported from @grahan/core.
- Tokenless releases — a GitHub Actions release workflow publishes via npm trusted publishing (OIDC) with provenance, after an in-workflow tarball inspection.
- API reference — https://svarbhanu.github.io/grahan/ built from the JSDoc on every public function.
- Browser proof in CI — the shipped tarballs bundle for the browser with zero Node builtins; a panchang-only bundle is 9.7 KB gzipped vs 92 KB for everything.
- transits() gained the node: 'mean' | 'true' option; SECURITY.md and CONTRIBUTING.md added.
Full details in the CHANGELOG.
v0.5.0 — the day view
panchangAtSunrise(): a civil date labelled by its sunrise panchang, with the transition instant of every element — ordered span lists that render kshaya and vriddhi days honestly. The end-time solvers (tithiEndTime, nakshatraEndTime, yogaEndTime, karanaEndTime) measure max 37.5 s vs Swiss Ephemeris over 122 boundaries and were spot-checked against drikpanchang.com. Plus the true (osculating) lunar node — trueLunarNode(), max 66 arcsec vs swe.TRUE_NODE — with a node: 'mean' | 'true' option in kundali().
Full details in the CHANGELOG.
v0.4.0 - eclipses
The namesake release: ग्रहण (grahan) means eclipse - now it computes them.
nextLunarEclipse()- penumbral/partial/total, magnitudes, all contact timesnextSolarEclipse()- global: type incl. hybrids, centrality, greatest-eclipse instant/point/magnitudenextSolarEclipseAt()- local circumstances for any lat/lon: visibility, magnitude, obscuration, four contacts, visible-maximum conventionnextNewMoon()/nextFullMoon()/nextSyzygy()
Verified against every eclipse 1900-2100 (457 lunar + 452 solar): detection and type exact, instants mean ~20 s vs Swiss Ephemeris, magnitudes within 0.002. Reference fixtures independently cross-checked against NASA/Espenak's Five Millennium Canon.
Full details in the CHANGELOG.
v0.3.0 — Bikram Sambat
The calendar release: @grahan/calendars joins the family.
New package: @grahan/calendars
Bikram Sambat (the Nepali civil calendar) ↔ Gregorian conversion, BS 1975–2200:
bsFromDate({ year, month, day })— AD → BS with month names (roman + Devanagari), weekday, and a data-quality flagdateFromBs({ year, month, day })— BS → AD, validated against real month lengthstodayBs({ timezone })— today's BS date in any IANA timezone
Data provenance, stated plainly: BS 1975–2083 is verified — month tables cross-validated between two independently maintained datasets and anchor dates checked against the published hamropatro.com calendar and documented historical events. BS 2084–2200 is projected from textbook Surya Siddhanta sankrantis (the classical solar model Nepal's calendar committee follows) with a civil-day rule fitted on the 109 verified years — 99.77% of verified month starts reproduce exactly; projected dates carry projected: true and may sit ±1 day off the calendar the authority eventually publishes.
npm install @grahan/calendars@grahan/core and @grahan/vedic are version-aligned at 0.3.0 (no functional changes since 0.2.0).
Full details in the CHANGELOG.
v0.2.0 — the chart release
From panchang to full jyotish: kundali() (nine grahas, whole-sign bhavas, navamsa), SVG chart rendering in the North & South Indian styles, Vimshottari dashas, transits, muhurta finding, and 36-point gun-milan — plus the astronomy underneath: Mercury–Saturn positions (max 7.8″ vs Swiss Ephemeris, 1900–2100) and the ascendant (max 3.1″).
Zero runtime dependencies, verified against committed Swiss Ephemeris fixtures. See the CHANGELOG for the full surface.
v0.1.0 — one perfect function
First release: panchang() end-to-end. @grahan/core (julian day, delta-T, timezones, apparent Sun/Moon, mean node, sidereal time, sunrise/sunset with polar states, moon phase) and @grahan/vedic (Lahiri ayanamsa, tithi, nakshatra, yoga, karana, vaar, Rahu Kaal, panchang). Verified against Swiss Ephemeris 2.10 fixtures: Sun max 4.6 arcsec, Moon max 65 arcsec, sunrise/sunset max 4.6 s. Install: npm install @grahan/vedic