pray-calc/src/getQiyam.ts
Aric Camarata c02f197ece v2.0.0 — TypeScript rewrite, dual ESM/CJS, 14 methods + PCD dynamic algorithm
Complete rewrite from plain JavaScript to TypeScript with dual CJS/ESM output
via tsup. Removes all legacy .js source files and the old CommonJS-only index.

Key changes:
- Full TypeScript source in src/ with strict mode and declaration maps
- tsup build: dist/index.cjs + dist/index.mjs + dual .d.ts / .d.mts types
- 14 traditional fixed-angle methods (UOIF through MUIS) + MSC seasonal method
- PCD dynamic algorithm: MSC seasonal base + Earth-Sun distance correction +
  ecliptic geometry + atmospheric refraction + observer elevation
- getTimesAll() batches all 14x2 zenith angles into a single SPA call
- getMscFajr() / getMscIsha() expose MSC seasonal reference directly
- getAngles() returns the PCD-computed fajrAngle and ishaAngle
- High-latitude bounds: angles clipped to [10, 20] above 55N
- 106 tests across ESM and CJS (test.mjs + test-cjs.cjs)
- CI matrix: Node 20/22/24, typecheck, pack-check
- Wiki: 12 reference pages + 6-page research section with global accuracy study,
  home-territory comparison, observational evidence, and field observation matrix
- Moon functions removed (migrated to moon-sighting package)
- pnpm-only, Node >=20, sideEffects: false
2026-02-25 18:11:20 -05:00

25 lines
940 B
TypeScript

/**
* Qiyam al-Layl (night prayer) time calculation.
*
* Returns the start of the last third of the night, which is the recommended
* time for Tahajjud / Qiyam al-Layl. The night is defined as the period
* from Isha to Fajr.
*/
/**
* Compute the start of the last third of the night.
*
* @param fajrTime - Fajr time in fractional hours
* @param ishaTime - Isha time in fractional hours
* @returns Start of the last third of the night (fractional hours)
*/
export function getQiyam(fajrTime: number, ishaTime: number): number {
// If Fajr is numerically earlier (e.g. 5.5) than Isha (e.g. 21.5), Fajr
// is actually the NEXT day — add 24 to get the correct night length.
const adjustedFajr = fajrTime < ishaTime ? fajrTime + 24 : fajrTime;
const nightLength = adjustedFajr - ishaTime;
const lastThirdStart = ishaTime + (2 * nightLength) / 3;
return lastThirdStart >= 24 ? lastThirdStart - 24 : lastThirdStart;
}