temporal-hijri/.wiki/API-Reference.md
Aric Camarata 51e07a65b3 feat: initial release of temporal-hijri v1.0.0
Temporal Calendar Protocol implementation for Hijri calendar via hijri-core.
Provides HijriCalendar base class, UaqCalendar (UAQ engine), FcnaCalendar
(FCNA engine), and convenience singletons uaqCalendar/fcnaCalendar.

Calendar protocol: year, month, monthCode, day, daysInMonth, daysInYear,
monthsInYear, inLeapYear, dayOfWeek, dayOfYear, weekOfYear, daysInWeek,
dateFromFields, yearMonthFromFields, monthDayFromFields, dateAdd,
dateUntil, mergeFields.

dateAdd applies year/month increments in Hijri coordinate space (correct
semantics for variable-length lunar months), then applies days/weeks in
ISO space. Day-of-month clamped on month boundary changes. 18 ESM + 8 CJS
tests passing. Dual CJS/ESM build.
2026-02-25 14:17:27 -05:00

4.5 KiB
Raw Blame History

API Reference

Exports

// Classes
export { HijriCalendar } from 'temporal-hijri';
export { UaqCalendar }   from 'temporal-hijri';
export { FcnaCalendar }  from 'temporal-hijri';

// Singletons
export { uaqCalendar }  from 'temporal-hijri'; // new UaqCalendar()
export { fcnaCalendar } from 'temporal-hijri'; // new FcnaCalendar()

// Types (re-exported from hijri-core)
export type { HijriDate, ConversionOptions } from 'temporal-hijri';
export type { HijriCalendarOptions }         from 'temporal-hijri';

HijriCalendar

Base class. Implements the Temporal Calendar Protocol using a CalendarEngine from hijri-core.

Constructor

new HijriCalendar(engine: CalendarEngine)

Accepts any engine registered via hijri-core's registerCalendar(). The calendar's id is hijri-${engine.id}.


UaqCalendar

new UaqCalendar()

Wraps the uaq engine from hijri-core. Calendar ID: "hijri-uaq".


FcnaCalendar

new FcnaCalendar()

Wraps the fcna engine from hijri-core. Calendar ID: "hijri-fcna".


Calendar Protocol Methods

All methods are available on HijriCalendar, UaqCalendar, and FcnaCalendar. Each method receives a Temporal.PlainDate with the ISO (Gregorian) calendar.

Field accessors

Method Signature Returns Notes
year (date: PlainDate) => number Hijri year
month (date: PlainDate) => number Hijri month (1-12)
monthCode (date: PlainDate) => string "M01" "M12" Zero-padded
day (date: PlainDate) => number Day of month (1-29/30)

Year and month metrics

Method Signature Returns Notes
daysInMonth (date: PlainDate) => number 29 or 30 Varies by month and calendar
daysInYear (date: PlainDate) => number 354 or 355 Sum of all 12 months
monthsInYear (date: PlainDate) => number Always 12
inLeapYear (date: PlainDate) => boolean true if 355-day year

Week and day position

Method Signature Returns Notes
dayOfWeek (date: PlainDate) => number 1-7 (Mon=1, Sun=7) ISO weekday
dayOfYear (date: PlainDate) => number 1-354 or 1-355 Within the Hijri year
weekOfYear (date: PlainDate) => number 1-51 ceil(dayOfYear / 7)
daysInWeek (date: PlainDate) => number Always 7

Construction from fields

Method Signature Returns
dateFromFields (fields: {year, month, day}, options?) => PlainDate ISO PlainDate
yearMonthFromFields (fields: {year, month}, options?) => PlainYearMonth ISO PlainYearMonth
monthDayFromFields (fields: {month, day, year?}, options?) => PlainMonthDay ISO PlainMonthDay

monthDayFromFields uses year 1444 AH as a default reference if no year is supplied.

Arithmetic

dateAdd

dateAdd(
  date: Temporal.PlainDate,
  duration: Temporal.Duration,
  options?: { overflow?: 'constrain' | 'reject' }
): Temporal.PlainDate

Adds a duration to a Hijri date. Year and month components are applied in Hijri space (preserving calendar semantics); day and week components are applied in ISO space afterward.

When a month addition causes the day-of-month to exceed the target month's length, the day is clamped to the last valid day of that month.

dateUntil

dateUntil(
  one: Temporal.PlainDate,
  two: Temporal.PlainDate,
  options?: { largestUnit?: 'years' | 'months' | 'weeks' | 'days' }
): Temporal.Duration

Computes the difference between two dates. When largestUnit is 'years' or 'months', the difference is calculated in Hijri space. For 'days' and 'weeks' it delegates to ISO arithmetic, which is exact.

Other

Method Signature Returns
mergeFields (fields, additionalFields) => Record Merged field object
toString () => string Calendar identifier

Types

HijriDate (from hijri-core)

interface HijriDate {
  hy: number; // Hijri year
  hm: number; // Hijri month (1-12)
  hd: number; // Hijri day (1-30)
}

ConversionOptions (from hijri-core)

interface ConversionOptions {
  calendar?: string; // defaults to 'uaq'
}

HijriCalendarOptions

interface HijriCalendarOptions {
  calendar?: string;
}

Home · API Reference · Architecture