arabicfmt
Version:
Arabic-first formatting for numbers, currency, dates and bidirectional text across all 22 Arab League countries — with correct handling of the 2025–2026 Unicode currency-symbol transition (Saudi Riyal U+20C1, UAE Dirham U+20C3, Omani Rial U+20C4).
430 lines (424 loc) • 6.27 kB
JavaScript
'use strict';
var chunkN4EBTUD5_cjs = require('../chunk-N4EBTUD5.cjs');
require('../chunk-3NAF2S6Y.cjs');
// src/umalqura/table.generated.ts
var FIRST_YEAR = 1300;
var LAST_YEAR = 1599;
var EPOCH_GREGORIAN = [1882, 11, 12];
var TOTAL_DAYS = 106311;
var MONTH_LENGTH_BITS = [
1365,
683,
2359,
694,
1398,
876,
2901,
2730,
2390,
1182,
2397,
698,
1461,
938,
2891,
2710,
1326,
685,
1389,
2906,
1874,
3877,
3722,
3350,
2646,
2741,
1716,
3497,
2962,
2853,
1611,
2715,
858,
1753,
1492,
3493,
3402,
2709,
1334,
2421,
756,
1769,
1748,
1705,
1333,
605,
1213,
2490,
948,
2921,
2858,
2645,
1197,
2653,
730,
1753,
3754,
3732,
3370,
3158,
1198,
2669,
1386,
3413,
3402,
2707,
1323,
2651,
1338,
1717,
3753,
3410,
3369,
2645,
1197,
1389,
2794,
1764,
3793,
3490,
2730,
2394,
730,
1465,
2994,
1892,
1737,
1365,
683,
1243,
2746,
1460,
3497,
3410,
2725,
2349,
621,
2285,
730,
2773,
2725,
2635,
1175,
2359,
694,
2421,
3433,
3410,
3221,
2347,
603,
1243,
2517,
1490,
3493,
3402,
2709,
1357,
2733,
938,
3026,
3012,
2953,
2709,
1325,
1453,
2922,
1748,
3529,
3474,
2726,
2390,
686,
1389,
874,
2901,
2730,
2381,
1181,
2397,
698,
1461,
1450,
3413,
2714,
2350,
622,
1373,
2778,
1748,
1701,
2855,
2637,
1197,
1389,
2906,
1876,
3913,
3730,
3366,
2646,
854,
1717,
2986,
2962,
2853,
1675,
2715,
1370,
2778,
1460,
3497,
2898,
2714,
1334,
630,
1397,
2802,
1748,
1705,
1365,
685,
1213,
2490,
1396,
2921,
2898,
2709,
1325,
2653,
1242,
2777,
1714,
3733,
3626,
3222,
2350,
2733,
1386,
3429,
3402,
3349,
1579,
3163,
1338,
1717,
3506,
3428,
3369,
2645,
1197,
2413,
2794,
1768,
3793,
3492,
3402,
2666,
730,
1465,
2930,
2920,
1745,
1621,
1195,
2395,
698,
1461,
3497,
3410,
3238,
2382,
1134,
2397,
1242,
2773,
2730,
2637,
1179,
2359,
1206,
2421,
3434,
3410,
2725,
2379,
683,
1371,
2777,
1490,
3525,
3474,
2853,
1365,
2741,
1460,
2985,
1954,
1861,
1427,
2731,
1238,
2518,
1490,
2981,
2890,
2709,
1197,
349,
733,
2522,
1460,
1449,
1325,
603,
2231,
374,
1389,
2922,
2762,
2710,
1323,
347,
699,
1462,
3498,
2964,
3398,
2701,
1325,
2717,
1370,
1877,
1865,
3859,
3658,
2710,
1366,
1717,
2986
];
// src/umalqura/convert.ts
var EPOCH_JDN = chunkN4EBTUD5_cjs.gregorianToJDN(
EPOCH_GREGORIAN[0],
EPOCH_GREGORIAN[1],
EPOCH_GREGORIAN[2]
);
var UMALQURA_FIRST_YEAR = FIRST_YEAR;
var UMALQURA_LAST_YEAR = LAST_YEAR;
function yearDays(bits) {
let days = 0;
for (let m = 0; m < 12; m++) days += 29 + (bits >> m & 1);
return days;
}
var YEAR_OFFSET = (() => {
const offsets = [];
let acc = 0;
for (let i = 0; i < MONTH_LENGTH_BITS.length; i++) {
offsets.push(acc);
acc += yearDays(MONTH_LENGTH_BITS[i]);
}
offsets.push(acc);
return offsets;
})();
function monthLength(yearIndex, month) {
return 29 + (MONTH_LENGTH_BITS[yearIndex] >> month - 1 & 1);
}
function isUmalquraYear(year) {
return year >= FIRST_YEAR && year <= LAST_YEAR;
}
function umalquraToJDN(year, month, day) {
if (!isUmalquraYear(year)) {
throw new RangeError(
`arabicfmt/umalqura: year ${year} is outside the supported range AH ${FIRST_YEAR}\u2013${LAST_YEAR}.`
);
}
if (month < 1 || month > 12) {
throw new RangeError(`arabicfmt/umalqura: invalid month ${month}.`);
}
const yearIndex = year - FIRST_YEAR;
let days = YEAR_OFFSET[yearIndex];
for (let m = 1; m < month; m++) days += monthLength(yearIndex, m);
return EPOCH_JDN + days + (day - 1);
}
function jdnToUmalqura(jdn) {
const offset = jdn - EPOCH_JDN;
if (offset < 0 || offset >= TOTAL_DAYS) {
throw new RangeError(
`arabicfmt/umalqura: date is outside the supported Umm al-Qura range (AH ${FIRST_YEAR}\u2013${LAST_YEAR}).`
);
}
let lo = 0;
let hi = MONTH_LENGTH_BITS.length - 1;
let yearIndex = 0;
while (lo <= hi) {
const mid = lo + hi >> 1;
if (offset < YEAR_OFFSET[mid]) {
hi = mid - 1;
} else if (offset >= YEAR_OFFSET[mid + 1]) {
lo = mid + 1;
} else {
yearIndex = mid;
break;
}
}
let remainder = offset - YEAR_OFFSET[yearIndex];
let month = 1;
while (month < 12) {
const len = monthLength(yearIndex, month);
if (remainder < len) break;
remainder -= len;
month++;
}
return { year: FIRST_YEAR + yearIndex, month, day: remainder + 1 };
}
function gregorianToUmalqura(date) {
return jdnToUmalqura(chunkN4EBTUD5_cjs.dateToJDN(date));
}
function umalquraToGregorian(year, month, day) {
return chunkN4EBTUD5_cjs.jdnToDate(umalquraToJDN(year, month, day));
}
// src/umalqura/index.ts
function formatHijri(date, options) {
return chunkN4EBTUD5_cjs.formatHijriDate(gregorianToUmalqura(date), options);
}
Object.defineProperty(exports, "HIJRI_ERA_AR", {
enumerable: true,
get: function () { return chunkN4EBTUD5_cjs.HIJRI_ERA_AR; }
});
Object.defineProperty(exports, "HIJRI_ERA_EN", {
enumerable: true,
get: function () { return chunkN4EBTUD5_cjs.HIJRI_ERA_EN; }
});
Object.defineProperty(exports, "HIJRI_MONTHS_AR", {
enumerable: true,
get: function () { return chunkN4EBTUD5_cjs.HIJRI_MONTHS_AR; }
});
Object.defineProperty(exports, "HIJRI_MONTHS_EN", {
enumerable: true,
get: function () { return chunkN4EBTUD5_cjs.HIJRI_MONTHS_EN; }
});
Object.defineProperty(exports, "formatHijriDate", {
enumerable: true,
get: function () { return chunkN4EBTUD5_cjs.formatHijriDate; }
});
exports.UMALQURA_FIRST_YEAR = UMALQURA_FIRST_YEAR;
exports.UMALQURA_LAST_YEAR = UMALQURA_LAST_YEAR;
exports.formatHijri = formatHijri;
exports.fromHijri = umalquraToGregorian;
exports.gregorianToUmalqura = gregorianToUmalqura;
exports.isUmalquraYear = isUmalquraYear;
exports.jdnToUmalqura = jdnToUmalqura;
exports.toHijri = gregorianToUmalqura;
exports.umalquraToGregorian = umalquraToGregorian;
exports.umalquraToJDN = umalquraToJDN;