UNPKG

muwaqqit

Version:

A powerful and flexible TypeScript library for calculating Islamic prayer times based on location, with customizable settings.

66 lines (54 loc) 2.07 kB
import { fetchPrayerTimes, fetchPrayerCalendar, fetchPrayerCalendarRange, convertToHijri, convertToGregorian } from './api'; import { PrayerTimesOptions, PrayerTimings, CalendarResponse, HijriDate, GregorianDate } from './types'; export class PrayerTimes { private options: PrayerTimesOptions; constructor(options: PrayerTimesOptions) { this.options = options; } async getTimes(date: Date): Promise<PrayerTimings> { const timings = await fetchPrayerTimes(this.options, date); return this.formatTimings(timings); } async getMonth(month: number, year: number): Promise<CalendarResponse> { const data = await fetchPrayerCalendar(this.options, month, year); return data.map(entry => ({ ...entry, timings: this.formatTimings(entry.timings), })); } async getRange(start: string, end: string): Promise<CalendarResponse> { const data = await fetchPrayerCalendarRange(this.options, start, end); return data.map(entry => ({ ...entry, timings: this.formatTimings(entry.timings), })); } async toHijri(date: string): Promise<HijriDate> { return await convertToHijri(date); } async toGregorian(date: string): Promise<GregorianDate> { return await convertToGregorian(date); } private formatTimings(timings: PrayerTimings): PrayerTimings { if (this.options.format === 'iso') return timings; const formatted: Record<string, string> = {}; for (const [key, time] of Object.entries(timings)) { if (this.options.format === '12h') { formatted[key] = this.to12h(time); } else { formatted[key] = this.to24h(time); } } return formatted as PrayerTimings; } private to12h(time: string): string { const clean = time.replace(/\s*\(.*?\)\s*/g, '').trim(); const [h, m] = clean.split(':').map(Number); const period = h >= 12 ? 'PM' : 'AM'; const hour = h % 12 || 12; return `${hour}:${m.toString().padStart(2, '0')} ${period}`; } private to24h(time: string): string { return time.replace(/( AM| PM)/, ''); } }