hijri-core/CHANGELOG.md
Aric Camarata 34193780f3 fix: interpret Dates by UTC calendar day in UAQ engine for exact round-trips
Bug: uaqToHijri read local date components (getFullYear/getMonth/getDate)
and passed them to Date.UTC(), producing a UTC midnight that does not match
the input's intended Gregorian day on hosts west of UTC. Concretely, a Date
returned by toGregorian() (UTC midnight) would map to the *previous* Hijri
day on UTC-5 or UTC-13 hosts, breaking the toHijri(toGregorian(hy,hm,hd))
round-trip.

Fix: switch line 44 to read UTC components (getUTCFullYear/getUTCMonth/
getUTCDate), matching how the FCNA engine already worked. Both engines now
share the same UTC-day contract: toHijri reads the UTC calendar day of the
input, and toGregorian returns a UTC-midnight Date. Round-trips are exact;
results are host-timezone-independent.

Behavior change: on non-UTC hosts, toHijri results may shift to the UTC
calendar day rather than the local calendar day. Users passing local
wall-clock dates should use new Date(Date.UTC(y, m-1, d)).

Also:
- Fix misleading comment in uaqToHijri (previously claimed local components
  were "timezone-safe")
- Add UTC-day contract to toHijri JSDoc in src/index.ts
- Fix wrong constraint comment in hijri-core.test.ts header
- Add "day boundaries (UTC contract)" describe block to vitest suite
- Convert LOCAL Date constructors in test.mjs and test-cjs.cjs to
  Date.UTC() form; add UAQ round-trip assertion to test.mjs
- Add "Day boundaries and time zones" section to README.md
- Add [Unreleased] Fixed entry to CHANGELOG.md
2026-06-10 16:32:01 -04:00

1.3 KiB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

Fixed

  • UAQ engine toHijri was reading local date components (getFullYear/getMonth/getDate) instead of UTC components, causing incorrect results on hosts west of UTC (e.g. America/New_York, Pacific/Auckland) when the input Date was a UTC-midnight value such as those returned by toGregorian or ISO date-only strings. toHijri now reads UTC calendar day components (getUTCFullYear/getUTCMonth/getUTCDate), matching the FCNA engine. Behavior change: on non-UTC hosts the converted Hijri day may shift to the UTC calendar day; round-trips via toGregorian are now exact on every machine.

[1.0.2] - 2026-05-30

Changed

  • Apply TypeScript strict null-check fixes in uaq.ts and fcna.ts (non-null assertions compile away; no behavior change)

[1.0.1] - 2026-05-28

Changed

  • Flatten exports map to ADR-015 standard (import/require/types at top level)
  • Add "./package.json" export condition
  • Add coverage script (c8 --reporter=lcov)
  • Migrate CI from pnpm/action-setup to corepack enable

[1.0.0] - 2026-05-28

Added

  • Initial release