UEA-Prodem

This commit is contained in:
2026-06-10 12:38:42 -03:00
parent 3f33154e16
commit c41625e542
9352 changed files with 1128292 additions and 14752 deletions
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 Tabby FZ-LLC
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+90
View File
@@ -0,0 +1,90 @@
# hijri-converter
A Javascript package to convert accurately between Hijri and Gregorian dates using the Umm al-Qura calendar.
This project uses a Typescript interpretation of a date conversion algorithm written in Python by Mohammed H Alshehri - [hijri-converter](https://github.com/mhalshehri/hijri-converter).
Therefore, it has the same accuracy and limitations.
## Limitations
- The date range supported by converter is limited to the period from the beginning of 1343 AH (1 August 1924 CE) to the end of 1500 AH (16 November 2077 CE).
- The conversion is not intended for religious purposes where sighting of the lunar crescent at the beginning of Hijri month is still preferred.
## Comparison
| Item | hijri-converter | moment-hijri |
|:--------------------------|:-------------------|:---------------------------------|
| Conversion range | 1343-1500 AH | 1356-1500 AH |
| Accuracy | 100% | 91,8% |
| Input validation | Yes | No |
| Typescript support | Typescript first | Types declarations |
| Functionality | Only convert dates | Parse, manipulate, display, etc. |
| Dependencies | Zero-dependency | moment |
| Size (minified + gzipped) | 11.4 kB | 74.4 kB |
## Installation
```bash
npm install @tabby.ai/hijri-converter
```
## Basic usage
```javascript
// CommonJS modules
const { gregorianToHijri } = require('@tabby.ai/hijri-converter');
const date = new Date();
const hijriDate = gregorianToHijri({
year: date.getFullYear(),
month: date.getMonth() + 1, // Month number in Javascript Date API is zero-based.
day: date.getDay(),
});
console.log(hijriDate); // { year: 1444, month: 7, day: 15 }
// or ESModules
import { hijriToGregorian } from '@tabby.ai/hijri-converter';
const gregorianDate = hijriToGregorian({ year: 1444, month: 7, day: 15 });
console.log(gregorianDate); // { year: 2023, month: 2, day: 6 }
```
## What about date formatting?
This library only converts dates. But you might not need any specific date libraries if you want to format dates. Browsers and Node.js widely support date formatting: [Date.prototype.toLocaleDateString](https://caniuse.com/?search=Date.prototype.toLocaleDateString), [Intl.DateTimeFormat](https://caniuse.com/?search=DateTimeFormat)
```javascript
const date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));
const options = {
timeZone: 'UTC',
weekday: 'short',
year: 'numeric',
month: 'long',
day: 'numeric',
};
// using Date.prototype.toLocaleDateString method
console.log(date.toLocaleDateString('ar-SA-u-ca-islamic-umalqura', options)); // -> "الخميس، ٧ صفر ١٤٣٤ هـ"
console.log(date.toLocaleDateString('en-SA-u-ca-islamic-umalqura', options)); // -> "Thu, Safar 7, 1434 AH"
// or using Intl.DateTimeFormat API
const arSaFormatter = new Intl.DateTimeFormat(
'ar-SA-u-ca-islamic-umalqura',
options
);
const enSaFormatter = new Intl.DateTimeFormat(
'en-SA-u-ca-islamic-umalqura',
options
);
console.log(arSaFormatter.format(date)); // -> 'الخميس، ٧ صفر ١٤٣٤ هـ'
console.log(enSaFormatter.format(date)); // -> "Thu, Safar 7, 1434 AH"
```
## License
This project is licensed under the terms of the MIT license.
+9
View File
@@ -0,0 +1,9 @@
import { DateType } from './types';
/**
* Check date values if within valid range.
*/
export declare function checkHijriRange(date: DateType): void;
/**
* Check if Gregorian date is within valid range.
*/
export declare function checkGregorianRange(date: DateType): void;
+39
View File
@@ -0,0 +1,39 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkGregorianRange = exports.checkHijriRange = void 0;
const ummalqura_1 = require("./ummalqura");
const isoFormat_1 = require("./isoFormat");
const dateHelpersHijri_1 = require("./dateHelpersHijri");
/**
* Check date values if within valid range.
*/
function checkHijriRange(date) {
// check year
const [[minYear], [maxYear]] = ummalqura_1.HIJRI_RANGE;
if (date.year < minYear || maxYear < date.year) {
throw Error('date out of range');
}
// check month
const maxMonths = 12;
if (date.month < 1 || maxMonths < date.month) {
throw Error(`month must be in 1..${maxMonths}`);
}
// check day
const monthLen = (0, dateHelpersHijri_1.hijriDaysInMonth)(date.year, date.month);
if (date.day < 1 || monthLen < date.day) {
throw Error(`day must be in 1..${monthLen}`);
}
}
exports.checkHijriRange = checkHijriRange;
/**
* Check if Gregorian date is within valid range.
*/
function checkGregorianRange(date) {
const [minDate, maxDate] = ummalqura_1.GREGORIAN_RANGE;
const isoCurrentDate = (0, isoFormat_1.isoFormat)(date.year, date.month, date.day);
if ((0, isoFormat_1.isoFormat)(...minDate) > isoCurrentDate ||
(0, isoFormat_1.isoFormat)(...maxDate) < isoCurrentDate) {
throw Error('date out of range');
}
}
exports.checkGregorianRange = checkGregorianRange;
+36
View File
@@ -0,0 +1,36 @@
export declare const DAYS_BEFORE_MONTH: number[];
/**
* year -> 1 if leap year, else 0
*/
export declare function isLeap(year: number): boolean;
/**
* year, month -> number of days in that month in that year.
*/
export declare function _daysInMonth(year: number, month: number): number;
/**
* ordinal -> (year, month, day), considering 01-Jan-0001 as day 1.
*
* n is a 1-based index, starting at 1-Jan-1. The pattern of leap years
* repeats exactly every 400 years. The basic strategy is to find the
* closest 400-year boundary at or before n, then work with the offset
* from that boundary to n. Life is much clearer if we subtract 1 from
* n first -- then the values of n at 400-year boundaries are exactly
* those divisible by _DI400Y:
*
* D M Y n n-1
* -- --- ---- ---------- ----------------
* 31 Dec -400 -_DI400Y -_DI400Y -1
* 1 Jan -399 -_DI400Y +1 -_DI400Y 400-year boundary
* ...
* 30 Dec 000 -1 -2
* 31 Dec 000 0 -1
* 1 Jan 001 1 0 400-year boundary
* 2 Jan 001 2 1
* 3 Jan 001 3 2
* ...
* 31 Dec 400 _DI400Y _DI400Y -1
* 1 Jan 401 _DI400Y +1 _DI400Y 400-year boundary
*
*
*/
export declare function ord2ymd(n: number): [number, number, number];
+173
View File
@@ -0,0 +1,173 @@
"use strict";
/*
* This file contains modifications to code that is licensed under
* the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2.
*
* Copyright © 2001-2023 Python Software Foundation. All rights reserved.
*
* 1. This LICENSE AGREEMENT is between the Python Software Foundation
* ("PSF"), and the Individual or Organization ("Licensee") accessing and
* otherwise using this software ("Python") in source or binary form and
* its associated documentation.
*
* 2. Subject to the terms and conditions of this License Agreement, PSF hereby
* grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
* analyze, test, perform and/or display publicly, prepare derivative works,
* distribute, and otherwise use Python alone or in any derivative version,
* provided, however, that PSF's License Agreement and PSF's notice of copyright,
* i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
* 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation;
* All Rights Reserved" are retained in Python alone or in any derivative version
* prepared by Licensee.
*
* 3. In the event Licensee prepares a derivative work that is based on
* or incorporates Python or any part thereof, and wants to make
* the derivative work available to others as provided herein, then
* Licensee hereby agrees to include in any such work a brief summary of
* the changes made to Python.
*
* 4. PSF is making Python available to Licensee on an "AS IS"
* basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
* IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
* DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
* FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
* INFRINGE ANY THIRD PARTY RIGHTS.
*
* 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
* FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
* A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
* OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
*
* 6. This License Agreement will automatically terminate upon a material
* breach of its terms and conditions.
*
* 7. Nothing in this License Agreement shall be deemed to create any
* relationship of agency, partnership, or joint venture between PSF and
* Licensee. This License Agreement does not grant permission to use PSF
* trademarks or trade name in a trademark sense to endorse or promote
* products or services of Licensee, or any third party.
*
* 8. By copying, installing or otherwise using Python, Licensee
* agrees to be bound by the terms and conditions of this License
* Agreement.
*
* This modified version of the Software is licensed under the MIT license.
*
* Copyright (c) 2023 Tabby FZ-LLC
*
* A copy of the license can be found in the LICENSE file at the root of this
* distribution.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ord2ymd = exports._daysInMonth = exports.isLeap = exports.DAYS_BEFORE_MONTH = void 0;
const divmod_1 = require("./utils/divmod");
// Constants for Gregorian calendar
const _DAYS_IN_MONTH = [-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
exports.DAYS_BEFORE_MONTH = [-1];
let dbm = 0;
for (let i = 1; i < _DAYS_IN_MONTH.length; i++) {
exports.DAYS_BEFORE_MONTH.push(dbm);
dbm += _DAYS_IN_MONTH[i];
}
/**
* year -> number of days before January 1st of year.
* @param year
*/
function _daysBeforeYear(year) {
const y = year - 1;
return (y * 365 + Math.floor(y / 4) - Math.floor(y / 100) + Math.floor(y / 400));
}
const _DI400Y = _daysBeforeYear(401); // number of days in 400 years
const _DI100Y = _daysBeforeYear(101); // number of days in 100 years
const _DI4Y = _daysBeforeYear(5); // number of days in 4 years
/**
* year -> 1 if leap year, else 0
*/
function isLeap(year) {
return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}
exports.isLeap = isLeap;
/**
* year, month -> number of days in that month in that year.
*/
function _daysInMonth(year, month) {
if (month < 1 || month > 12) {
throw Error(`AssertionError: Expected: 1 <= month <= 12; Actual: month = ${month}`);
}
if (month === 2 && isLeap(year)) {
return 29;
}
return _DAYS_IN_MONTH[month];
}
exports._daysInMonth = _daysInMonth;
/**
* ordinal -> (year, month, day), considering 01-Jan-0001 as day 1.
*
* n is a 1-based index, starting at 1-Jan-1. The pattern of leap years
* repeats exactly every 400 years. The basic strategy is to find the
* closest 400-year boundary at or before n, then work with the offset
* from that boundary to n. Life is much clearer if we subtract 1 from
* n first -- then the values of n at 400-year boundaries are exactly
* those divisible by _DI400Y:
*
* D M Y n n-1
* -- --- ---- ---------- ----------------
* 31 Dec -400 -_DI400Y -_DI400Y -1
* 1 Jan -399 -_DI400Y +1 -_DI400Y 400-year boundary
* ...
* 30 Dec 000 -1 -2
* 31 Dec 000 0 -1
* 1 Jan 001 1 0 400-year boundary
* 2 Jan 001 2 1
* 3 Jan 001 3 2
* ...
* 31 Dec 400 _DI400Y _DI400Y -1
* 1 Jan 401 _DI400Y +1 _DI400Y 400-year boundary
*
*
*/
function ord2ymd(n) {
n -= 1;
let n400, n100, n4, n1;
[n400, n] = (0, divmod_1.divmod)(n, _DI400Y);
let year = n400 * 400 + 1; // ..., -399, 1, 401, ...
// Now n is the (non-negative) offset, in days, from January 1 of year, to
// the desired date. Now compute how many 100-year cycles precede n.
// Note that it's possible for n100 to equal 4! In that case 4 full
// 100-year cycles precede the desired day, which implies the desired
// day is December 31 at the end of a 400-year cycle.
[n100, n] = (0, divmod_1.divmod)(n, _DI100Y);
// Now compute how many 4-year cycles precede it.
[n4, n] = (0, divmod_1.divmod)(n, _DI4Y);
// And now how many single years. Again n1 can be 4, and again meaning
// that the desired day is December 31 at the end of the 4-year cycle.
[n1, n] = (0, divmod_1.divmod)(n, 365);
year += n100 * 100 + n4 * 4 + n1;
if (n1 === 4 || n100 === 4) {
if (n !== 0) {
throw Error(`AssertionError: Expected: n = 0; Actual: n = ${n}`);
}
return [year - 1, 12, 31];
}
// Now the year is correct, and n is the offset from January 1. We find
// the month via an estimate that's either exact or one too large.
const leapYear = n1 === 3 && (n4 !== 24 || n100 === 3);
if (leapYear !== isLeap(year)) {
throw Error(`AssertionError: Expected: leapyear = ${isLeap(year)}; Actual: leapyear = ${leapYear}`);
}
let month = (n + 50) >> 5;
let preceding = exports.DAYS_BEFORE_MONTH[month] + Number(month > 2 && leapYear);
if (preceding > n) {
// estimate is too large
month -= 1;
preceding -= _DAYS_IN_MONTH[month] + Number(month === 2 && leapYear);
}
n -= preceding;
if (n < 0 || _daysInMonth(year, month) < n) {
throw Error(`AssertionError: Expected: 0 <= n <= ${_daysInMonth(year, month)}; Actual: n = ${n}`);
}
// Now the year and month are correct, and n is the offset from the
// start of that month: we're done!
return [year, month, n + 1];
}
exports.ord2ymd = ord2ymd;
+19
View File
@@ -0,0 +1,19 @@
import { DateType } from './types';
/**
* Return number of days in month.
*/
export declare function hijriDaysInMonth(year: number, month: number): number;
/**
* Return corresponding Julian day number (JDN) from Hijri date.
*/
export declare function hijriToJulian(date: DateType): number;
/**
* Return corresponding Julian day number (JDN) from Gregorian date.
*/
export declare function gregorianToJulian(date: DateType): number;
/**
* Construct a date from a proleptic Gregorian ordinal.
* January 1 of year 1 is day 1. Only the year, month and day are
* non-zero in the result.
*/
export declare function gregorianFromOrdinal(n: number): DateType;
+86
View File
@@ -0,0 +1,86 @@
"use strict";
/*
* This file contains modifications to code from https://github.com/mhalshehri/hijri-converter
* that is licensed under the MIT license.
*
* Copyright (c) 2018 Mohammed H Alshehri (@mhalshehri) and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the 'Software'), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software.
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* This modified version of the Software is also licensed under the MIT license,
* and is subject to the same conditions as the original version of the Software.
*
* Copyright (c) 2023 Tabby FZ-LLC
*
* A copy of the license can be found in the LICENSE file at the root of this
* distribution.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.gregorianFromOrdinal = exports.gregorianToJulian = exports.hijriToJulian = exports.hijriDaysInMonth = void 0;
const ummalqura_1 = require("./ummalqura");
const julianDayHelpers_1 = require("./julianDayHelpers");
const dateHelpers_1 = require("./dateHelpers");
/**
* Return months index in ummalqura month starts
*/
function _monthIndex(year, month) {
const priorMonth = (year - 1) * 12 + month - 1;
const index = priorMonth - ummalqura_1.HIJRI_OFFSET;
return index;
}
/**
* Return number of days in month.
*/
function hijriDaysInMonth(year, month) {
const index = _monthIndex(year, month);
return ummalqura_1.MONTH_STARTS[index + 1] - ummalqura_1.MONTH_STARTS[index];
}
exports.hijriDaysInMonth = hijriDaysInMonth;
/**
* Return corresponding Julian day number (JDN) from Hijri date.
*/
function hijriToJulian(date) {
const index = _monthIndex(date.year, date.month);
const rjd = ummalqura_1.MONTH_STARTS[index] + date.day - 1;
const jdn = (0, julianDayHelpers_1.rjdToJdn)(rjd);
return jdn;
}
exports.hijriToJulian = hijriToJulian;
/**
* Return corresponding Julian day number (JDN) from Gregorian date.
*/
function gregorianToJulian(date) {
const y = date.year - 1;
const m = date.month;
const daysBeforeYear = y * 365 + Math.floor(y / 4) - Math.floor(y / 100) + Math.floor(y / 400);
const daysBeforeMonth = dateHelpers_1.DAYS_BEFORE_MONTH[m] + Number(m > 2 && (0, dateHelpers_1.isLeap)(date.year));
const don = daysBeforeYear + daysBeforeMonth + date.day;
const jdn = (0, julianDayHelpers_1.ordinalToJdn)(don);
return jdn;
}
exports.gregorianToJulian = gregorianToJulian;
/**
* Construct a date from a proleptic Gregorian ordinal.
* January 1 of year 1 is day 1. Only the year, month and day are
* non-zero in the result.
*/
function gregorianFromOrdinal(n) {
const [year, month, day] = (0, dateHelpers_1.ord2ymd)(n);
return { year, month, day };
}
exports.gregorianFromOrdinal = gregorianFromOrdinal;
+4
View File
@@ -0,0 +1,4 @@
/**
* Return date in ISO format i.e. `YYYY-MM-DD`.
*/
export declare function isoFormat(year: number, month: number, day: number): string;
+14
View File
@@ -0,0 +1,14 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isoFormat = void 0;
/**
* Return date in ISO format i.e. `YYYY-MM-DD`.
*/
function isoFormat(year, month, day) {
return [
String(year).padStart(4, '0'),
String(month).padStart(2, '0'),
String(day).padStart(2, '0'),
].join('-');
}
exports.isoFormat = isoFormat;
+24
View File
@@ -0,0 +1,24 @@
/**
* Convert Julian day number (JDN) to date ordinal number.
* @param {number} jdn - Julian day number (JDN).
* @returns {number} Date ordinal number.
*/
export declare function jdnToOrdinal(jdn: number): number;
/**
* Convert date ordinal number to Julian day number (JDN).
* @param {number} don - Date ordinal number.
* @returns {number} Julian day number (JDN).
*/
export declare function ordinalToJdn(don: number): number;
/**
* Return Reduced Julian Day (RJD) number from Julian day number (JDN).
* @param {number} jdn - Julian day number (JDN).
* @returns {number} Reduced Julian Day (RJD) number.
*/
export declare function jdnToRjd(jdn: number): number;
/**
* Return Julian day number (JDN) from Reduced Julian Day (RJD) number.
* @param {number} rjd - Reduced Julian Day (RJD) number.
* @returns {number} Julian day number (JDN).
*/
export declare function rjdToJdn(rjd: number): number;
+70
View File
@@ -0,0 +1,70 @@
"use strict";
/*
* This file contains modifications to code from https://github.com/mhalshehri/hijri-converter
* that is licensed under the MIT license.
*
* Copyright (c) 2018 Mohammed H Alshehri (@mhalshehri) and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the 'Software'), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software.
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* This modified version of the Software is also licensed under the MIT license,
* and is subject to the same conditions as the original version of the Software.
*
* Copyright (c) 2023 Tabby FZ-LLC
*
* A copy of the license can be found in the LICENSE file at the root of this
* distribution.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.rjdToJdn = exports.jdnToRjd = exports.ordinalToJdn = exports.jdnToOrdinal = void 0;
/**
* Convert Julian day number (JDN) to date ordinal number.
* @param {number} jdn - Julian day number (JDN).
* @returns {number} Date ordinal number.
*/
function jdnToOrdinal(jdn) {
return jdn - 1721425;
}
exports.jdnToOrdinal = jdnToOrdinal;
/**
* Convert date ordinal number to Julian day number (JDN).
* @param {number} don - Date ordinal number.
* @returns {number} Julian day number (JDN).
*/
function ordinalToJdn(don) {
return don + 1721425;
}
exports.ordinalToJdn = ordinalToJdn;
/**
* Return Reduced Julian Day (RJD) number from Julian day number (JDN).
* @param {number} jdn - Julian day number (JDN).
* @returns {number} Reduced Julian Day (RJD) number.
*/
function jdnToRjd(jdn) {
return jdn - 2400000;
}
exports.jdnToRjd = jdnToRjd;
/**
* Return Julian day number (JDN) from Reduced Julian Day (RJD) number.
* @param {number} rjd - Reduced Julian Day (RJD) number.
* @returns {number} Julian day number (JDN).
*/
function rjdToJdn(rjd) {
return rjd + 2400000;
}
exports.rjdToJdn = rjdToJdn;
+5
View File
@@ -0,0 +1,5 @@
export type DateType = {
year: number;
month: number;
day: number;
};
+2
View File
@@ -0,0 +1,2 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
+21
View File
@@ -0,0 +1,21 @@
/**
* Umm al-Qura calendar constants.
*/
export type DateTuple = [number, number, number];
/**
* Inclusive range of supported Gregorian dates (year, month and day).
*/
export declare const GREGORIAN_RANGE: [DateTuple, DateTuple];
/**
* Inclusive range of supported Hijri dates (year, month and day).
*/
export declare const HIJRI_RANGE: [DateTuple, DateTuple];
/**
* Total Hijri months elapsed before the beginning of Hijri range.
*/
export declare const HIJRI_OFFSET: number;
/**
* Ordered list of Reduced Julian Day (RJD) numbers for the beginning of
* supported Hijri months.
*/
export declare const MONTH_STARTS: number[];
+231
View File
@@ -0,0 +1,231 @@
"use strict";
/*
* This file contains modifications to code from https://github.com/mhalshehri/hijri-converter
* that is licensed under the MIT license.
*
* Copyright (c) 2018 Mohammed H Alshehri (@mhalshehri) and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the 'Software'), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software.
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* This modified version of the Software is also licensed under the MIT license,
* and is subject to the same conditions as the original version of the Software.
*
* Copyright (c) 2023 Tabby FZ-LLC
*
* A copy of the license can be found in the LICENSE file at the root of this
* distribution.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.MONTH_STARTS = exports.HIJRI_OFFSET = exports.HIJRI_RANGE = exports.GREGORIAN_RANGE = void 0;
/**
* Inclusive range of supported Gregorian dates (year, month and day).
*/
exports.GREGORIAN_RANGE = [
[1924, 8, 1],
[2077, 11, 16],
];
/**
* Inclusive range of supported Hijri dates (year, month and day).
*/
exports.HIJRI_RANGE = [
[1343, 1, 1],
[1500, 12, 30],
];
/**
* Total Hijri months elapsed before the beginning of Hijri range.
*/
exports.HIJRI_OFFSET = 1342 * 12;
/**
* Ordered list of Reduced Julian Day (RJD) numbers for the beginning of
* supported Hijri months.
*/
exports.MONTH_STARTS = [
23999, 24029, 24058, 24088, 24118, 24147, 24177, 24207, 24237, 24265, 24295,
24325, 24355, 24384, 24413, 24443, 24472, 24502, 24531, 24561, 24590, 24620,
24649, 24679, 24708, 24738, 24767, 24797, 24826, 24857, 24886, 24916, 24944,
24974, 25004, 25033, 25063, 25092, 25121, 25151, 25181, 25210, 25240, 25270,
25299, 25328, 25358, 25388, 25417, 25446, 25475, 25505, 25535, 25564, 25594,
25624, 25653, 25683, 25713, 25742, 25771, 25801, 25830, 25860, 25889, 25919,
25948, 25978, 26008, 26037, 26066, 26097, 26125, 26155, 26184, 26214, 26243,
26273, 26302, 26332, 26362, 26392, 26420, 26451, 26481, 26510, 26540, 26569,
26599, 26628, 26657, 26687, 26716, 26746, 26776, 26805, 26835, 26865, 26894,
26924, 26953, 26983, 27012, 27041, 27070, 27100, 27130, 27159, 27189, 27219,
27248, 27278, 27307, 27337, 27366, 27396, 27425, 27455, 27484, 27514, 27543,
27573, 27602, 27632, 27662, 27691, 27721, 27750, 27780, 27810, 27839, 27868,
27898, 27927, 27957, 27986, 28016, 28045, 28075, 28105, 28134, 28164, 28193,
28223, 28252, 28282, 28311, 28341, 28370, 28400, 28429, 28459, 28488, 28518,
28548, 28577, 28607, 28636, 28665, 28695, 28724, 28754, 28783, 28813, 28843,
28872, 28901, 28931, 28960, 28990, 29019, 29049, 29078, 29108, 29137, 29167,
29196, 29226, 29255, 29285, 29315, 29345, 29375, 29404, 29434, 29463, 29492,
29522, 29551, 29580, 29610, 29640, 29669, 29699, 29729, 29759, 29788, 29818,
29847, 29876, 29906, 29935, 29964, 29994, 30023, 30053, 30082, 30112, 30141,
30171, 30200, 30230, 30259, 30289, 30318, 30348, 30378, 30408, 30437, 30467,
30496, 30526, 30555, 30585, 30614, 30644, 30673, 30703, 30732, 30762, 30791,
30821, 30850, 30880, 30909, 30939, 30968, 30998, 31027, 31057, 31086, 31116,
31145, 31175, 31204, 31234, 31263, 31293, 31322, 31352, 31381, 31411, 31441,
31471, 31500, 31530, 31559, 31589, 31618, 31648, 31676, 31706, 31736, 31766,
31795, 31825, 31854, 31884, 31913, 31943, 31972, 32002, 32031, 32061, 32090,
32120, 32150, 32180, 32209, 32239, 32268, 32298, 32327, 32357, 32386, 32416,
32445, 32475, 32504, 32534, 32563, 32593, 32622, 32652, 32681, 32711, 32740,
32770, 32799, 32829, 32858, 32888, 32917, 32947, 32976, 33006, 33035, 33065,
33094, 33124, 33153, 33183, 33213, 33243, 33272, 33302, 33331, 33361, 33390,
33420, 33450, 33479, 33509, 33539, 33568, 33598, 33627, 33657, 33686, 33716,
33745, 33775, 33804, 33834, 33863, 33893, 33922, 33952, 33981, 34011, 34040,
34069, 34099, 34128, 34158, 34187, 34217, 34247, 34277, 34306, 34336, 34365,
34395, 34424, 34454, 34483, 34512, 34542, 34571, 34601, 34631, 34660, 34690,
34719, 34749, 34778, 34808, 34837, 34867, 34896, 34926, 34955, 34985, 35015,
35044, 35074, 35103, 35133, 35162, 35192, 35222, 35251, 35280, 35310, 35340,
35370, 35399, 35429, 35458, 35488, 35517, 35547, 35576, 35605, 35635, 35665,
35694, 35723, 35753, 35782, 35811, 35841, 35871, 35901, 35930, 35960, 35989,
36019, 36048, 36078, 36107, 36136, 36166, 36195, 36225, 36254, 36284, 36314,
36343, 36373, 36403, 36433, 36462, 36492, 36521, 36551, 36580, 36610, 36639,
36669, 36698, 36728, 36757, 36786, 36816, 36845, 36875, 36904, 36934, 36963,
36993, 37022, 37052, 37081, 37111, 37141, 37170, 37200, 37229, 37259, 37288,
37318, 37347, 37377, 37406, 37436, 37465, 37495, 37524, 37554, 37584, 37613,
37643, 37672, 37701, 37731, 37760, 37790, 37819, 37849, 37878, 37908, 37938,
37967, 37997, 38027, 38056, 38085, 38115, 38144, 38174, 38203, 38233, 38262,
38292, 38322, 38351, 38381, 38410, 38440, 38469, 38499, 38528, 38558, 38587,
38617, 38646, 38676, 38705, 38735, 38764, 38794, 38823, 38853, 38882, 38912,
38941, 38971, 39001, 39030, 39059, 39089, 39118, 39148, 39178, 39208, 39237,
39267, 39297, 39326, 39355, 39385, 39414, 39444, 39473, 39503, 39532, 39562,
39592, 39621, 39650, 39680, 39709, 39739, 39768, 39798, 39827, 39857, 39886,
39916, 39946, 39975, 40005, 40035, 40064, 40094, 40123, 40153, 40182, 40212,
40241, 40271, 40300, 40330, 40359, 40389, 40418, 40448, 40477, 40507, 40536,
40566, 40595, 40625, 40655, 40685, 40714, 40744, 40773, 40803, 40832, 40862,
40892, 40921, 40951, 40980, 41009, 41039, 41068, 41098, 41127, 41157, 41186,
41216, 41245, 41275, 41304, 41334, 41364, 41393, 41422, 41452, 41481, 41511,
41540, 41570, 41599, 41629, 41658, 41688, 41718, 41748, 41777, 41807, 41836,
41865, 41894, 41924, 41953, 41983, 42012, 42042, 42072, 42102, 42131, 42161,
42190, 42220, 42249, 42279, 42308, 42337, 42367, 42397, 42426, 42456, 42485,
42515, 42545, 42574, 42604, 42633, 42662, 42692, 42721, 42751, 42780, 42810,
42839, 42869, 42899, 42929, 42958, 42988, 43017, 43046, 43076, 43105, 43135,
43164, 43194, 43223, 43253, 43283, 43312, 43342, 43371, 43401, 43430, 43460,
43489, 43519, 43548, 43578, 43607, 43637, 43666, 43696, 43726, 43755, 43785,
43814, 43844, 43873, 43903, 43932, 43962, 43991, 44021, 44050, 44080, 44109,
44139, 44169, 44198, 44228, 44258, 44287, 44317, 44346, 44375, 44405, 44434,
44464, 44493, 44523, 44553, 44582, 44612, 44641, 44671, 44700, 44730, 44759,
44788, 44818, 44847, 44877, 44906, 44936, 44966, 44996, 45025, 45055, 45084,
45114, 45143, 45172, 45202, 45231, 45261, 45290, 45320, 45350, 45380, 45409,
45439, 45468, 45498, 45527, 45556, 45586, 45615, 45644, 45674, 45704, 45733,
45763, 45793, 45823, 45852, 45882, 45911, 45940, 45970, 45999, 46028, 46058,
46088, 46117, 46147, 46177, 46206, 46236, 46265, 46295, 46324, 46354, 46383,
46413, 46442, 46472, 46501, 46531, 46560, 46590, 46620, 46649, 46679, 46708,
46738, 46767, 46797, 46826, 46856, 46885, 46915, 46944, 46974, 47003, 47033,
47063, 47092, 47122, 47151, 47181, 47210, 47240, 47269, 47298, 47328, 47357,
47387, 47417, 47446, 47476, 47506, 47535, 47565, 47594, 47624, 47653, 47682,
47712, 47741, 47771, 47800, 47830, 47860, 47890, 47919, 47949, 47978, 48008,
48037, 48066, 48096, 48125, 48155, 48184, 48214, 48244, 48273, 48303, 48333,
48362, 48392, 48421, 48450, 48480, 48509, 48538, 48568, 48598, 48627, 48657,
48687, 48717, 48746, 48776, 48805, 48834, 48864, 48893, 48922, 48952, 48982,
49011, 49041, 49071, 49100, 49130, 49160, 49189, 49218, 49248, 49277, 49306,
49336, 49365, 49395, 49425, 49455, 49484, 49514, 49543, 49573, 49602, 49632,
49661, 49690, 49720, 49749, 49779, 49809, 49838, 49868, 49898, 49927, 49957,
49986, 50016, 50045, 50075, 50104, 50133, 50163, 50192, 50222, 50252, 50281,
50311, 50340, 50370, 50400, 50429, 50459, 50488, 50518, 50547, 50576, 50606,
50635, 50665, 50694, 50724, 50754, 50784, 50813, 50843, 50872, 50902, 50931,
50960, 50990, 51019, 51049, 51078, 51108, 51138, 51167, 51197, 51227, 51256,
51286, 51315, 51345, 51374, 51403, 51433, 51462, 51492, 51522, 51552, 51582,
51611, 51641, 51670, 51699, 51729, 51758, 51787, 51816, 51846, 51876, 51906,
51936, 51965, 51995, 52025, 52054, 52083, 52113, 52142, 52171, 52200, 52230,
52260, 52290, 52319, 52349, 52379, 52408, 52438, 52467, 52497, 52526, 52555,
52585, 52614, 52644, 52673, 52703, 52733, 52762, 52792, 52822, 52851, 52881,
52910, 52939, 52969, 52998, 53028, 53057, 53087, 53116, 53146, 53176, 53205,
53235, 53264, 53294, 53324, 53353, 53383, 53412, 53441, 53471, 53500, 53530,
53559, 53589, 53619, 53648, 53678, 53708, 53737, 53767, 53796, 53825, 53855,
53884, 53914, 53943, 53973, 54003, 54032, 54062, 54092, 54121, 54151, 54180,
54209, 54239, 54268, 54297, 54327, 54357, 54387, 54416, 54446, 54476, 54505,
54535, 54564, 54593, 54623, 54652, 54681, 54711, 54741, 54770, 54800, 54830,
54859, 54889, 54919, 54948, 54977, 55007, 55036, 55066, 55095, 55125, 55154,
55184, 55213, 55243, 55273, 55302, 55332, 55361, 55391, 55420, 55450, 55479,
55508, 55538, 55567, 55597, 55627, 55657, 55686, 55716, 55745, 55775, 55804,
55834, 55863, 55892, 55922, 55951, 55981, 56011, 56040, 56070, 56100, 56129,
56159, 56188, 56218, 56247, 56276, 56306, 56335, 56365, 56394, 56424, 56454,
56483, 56513, 56543, 56572, 56601, 56631, 56660, 56690, 56719, 56749, 56778,
56808, 56837, 56867, 56897, 56926, 56956, 56985, 57015, 57044, 57074, 57103,
57133, 57162, 57192, 57221, 57251, 57280, 57310, 57340, 57369, 57399, 57429,
57458, 57487, 57517, 57546, 57576, 57605, 57634, 57664, 57694, 57723, 57753,
57783, 57813, 57842, 57871, 57901, 57930, 57959, 57989, 58018, 58048, 58077,
58107, 58137, 58167, 58196, 58226, 58255, 58285, 58314, 58343, 58373, 58402,
58432, 58461, 58491, 58521, 58551, 58580, 58610, 58639, 58669, 58698, 58727,
58757, 58786, 58816, 58845, 58875, 58905, 58934, 58964, 58994, 59023, 59053,
59082, 59111, 59141, 59170, 59200, 59229, 59259, 59288, 59318, 59348, 59377,
59407, 59436, 59466, 59495, 59525, 59554, 59584, 59613, 59643, 59672, 59702,
59731, 59761, 59791, 59820, 59850, 59879, 59909, 59939, 59968, 59997, 60027,
60056, 60086, 60115, 60145, 60174, 60204, 60234, 60264, 60293, 60323, 60352,
60381, 60411, 60440, 60469, 60499, 60528, 60558, 60588, 60618, 60647, 60677,
60707, 60736, 60765, 60795, 60824, 60853, 60883, 60912, 60942, 60972, 61002,
61031, 61061, 61090, 61120, 61149, 61179, 61208, 61237, 61267, 61296, 61326,
61356, 61385, 61415, 61445, 61474, 61504, 61533, 61563, 61592, 61621, 61651,
61680, 61710, 61739, 61769, 61799, 61828, 61858, 61888, 61917, 61947, 61976,
62006, 62035, 62064, 62094, 62123, 62153, 62182, 62212, 62242, 62271, 62301,
62331, 62360, 62390, 62419, 62448, 62478, 62507, 62537, 62566, 62596, 62625,
62655, 62685, 62715, 62744, 62774, 62803, 62832, 62862, 62891, 62921, 62950,
62980, 63009, 63039, 63069, 63099, 63128, 63157, 63187, 63216, 63246, 63275,
63305, 63334, 63363, 63393, 63423, 63453, 63482, 63512, 63541, 63571, 63600,
63630, 63659, 63689, 63718, 63747, 63777, 63807, 63836, 63866, 63895, 63925,
63955, 63984, 64014, 64043, 64073, 64102, 64131, 64161, 64190, 64220, 64249,
64279, 64309, 64339, 64368, 64398, 64427, 64457, 64486, 64515, 64545, 64574,
64603, 64633, 64663, 64692, 64722, 64752, 64782, 64811, 64841, 64870, 64899,
64929, 64958, 64987, 65017, 65047, 65076, 65106, 65136, 65166, 65195, 65225,
65254, 65283, 65313, 65342, 65371, 65401, 65431, 65460, 65490, 65520, 65549,
65579, 65608, 65638, 65667, 65697, 65726, 65755, 65785, 65815, 65844, 65874,
65903, 65933, 65963, 65992, 66022, 66051, 66081, 66110, 66140, 66169, 66199,
66228, 66258, 66287, 66317, 66346, 66376, 66405, 66435, 66465, 66494, 66524,
66553, 66583, 66612, 66641, 66671, 66700, 66730, 66760, 66789, 66819, 66849,
66878, 66908, 66937, 66967, 66996, 67025, 67055, 67084, 67114, 67143, 67173,
67203, 67233, 67262, 67292, 67321, 67351, 67380, 67409, 67439, 67468, 67497,
67527, 67557, 67587, 67617, 67646, 67676, 67705, 67735, 67764, 67793, 67823,
67852, 67882, 67911, 67941, 67971, 68000, 68030, 68060, 68089, 68119, 68148,
68177, 68207, 68236, 68266, 68295, 68325, 68354, 68384, 68414, 68443, 68473,
68502, 68532, 68561, 68591, 68620, 68650, 68679, 68708, 68738, 68768, 68797,
68827, 68857, 68886, 68916, 68946, 68975, 69004, 69034, 69063, 69092, 69122,
69152, 69181, 69211, 69240, 69270, 69300, 69330, 69359, 69388, 69418, 69447,
69476, 69506, 69535, 69565, 69595, 69624, 69654, 69684, 69713, 69743, 69772,
69802, 69831, 69861, 69890, 69919, 69949, 69978, 70008, 70038, 70067, 70097,
70126, 70156, 70186, 70215, 70245, 70274, 70303, 70333, 70362, 70392, 70421,
70451, 70481, 70510, 70540, 70570, 70599, 70629, 70658, 70687, 70717, 70746,
70776, 70805, 70835, 70864, 70894, 70924, 70954, 70983, 71013, 71042, 71071,
71101, 71130, 71159, 71189, 71218, 71248, 71278, 71308, 71337, 71367, 71397,
71426, 71455, 71485, 71514, 71543, 71573, 71602, 71632, 71662, 71691, 71721,
71751, 71781, 71810, 71839, 71869, 71898, 71927, 71957, 71986, 72016, 72046,
72075, 72105, 72135, 72164, 72194, 72223, 72253, 72282, 72311, 72341, 72370,
72400, 72429, 72459, 72489, 72518, 72548, 72577, 72607, 72637, 72666, 72695,
72725, 72754, 72784, 72813, 72843, 72872, 72902, 72931, 72961, 72991, 73020,
73050, 73080, 73109, 73139, 73168, 73197, 73227, 73256, 73286, 73315, 73345,
73375, 73404, 73434, 73464, 73493, 73523, 73552, 73581, 73611, 73640, 73669,
73699, 73729, 73758, 73788, 73818, 73848, 73877, 73907, 73936, 73965, 73995,
74024, 74053, 74083, 74113, 74142, 74172, 74202, 74231, 74261, 74291, 74320,
74349, 74379, 74408, 74437, 74467, 74497, 74526, 74556, 74585, 74615, 74645,
74675, 74704, 74733, 74763, 74792, 74822, 74851, 74881, 74910, 74940, 74969,
74999, 75029, 75058, 75088, 75117, 75147, 75176, 75206, 75235, 75264, 75294,
75323, 75353, 75383, 75412, 75442, 75472, 75501, 75531, 75560, 75590, 75619,
75648, 75678, 75707, 75737, 75766, 75796, 75826, 75856, 75885, 75915, 75944,
75974, 76003, 76032, 76062, 76091, 76121, 76150, 76180, 76210, 76239, 76269,
76299, 76328, 76358, 76387, 76416, 76446, 76475, 76505, 76534, 76564, 76593,
76623, 76653, 76682, 76712, 76741, 76771, 76801, 76830, 76859, 76889, 76918,
76948, 76977, 77007, 77036, 77066, 77096, 77125, 77155, 77185, 77214, 77243,
77273, 77302, 77332, 77361, 77390, 77420, 77450, 77479, 77509, 77539, 77569,
77598, 77627, 77657, 77686, 77715, 77745, 77774, 77804, 77833, 77863, 77893,
77923, 77952, 77982, 78011, 78041, 78070, 78099, 78129, 78158, 78188, 78217,
78247, 78277, 78307, 78336, 78366, 78395, 78425, 78454, 78483, 78513, 78542,
78572, 78601, 78631, 78661, 78690, 78720, 78750, 78779, 78808, 78838, 78867,
78897, 78926, 78956, 78985, 79015, 79044, 79074, 79104, 79133, 79163, 79192,
79222, 79251, 79281, 79310, 79340, 79369, 79399, 79428, 79458, 79487, 79517,
79546, 79576, 79606, 79635, 79665, 79695, 79724, 79753, 79783, 79812, 79841,
79871, 79900, 79930, 79960, 79990,
];
+13
View File
@@ -0,0 +1,13 @@
/**
* Locate the insertion point for `x` in `a` to maintain sorted order.
* The parameters `lo` and `hi` may be used to specify a subset of the list
* which should be considered; by default the entire list is used.
* If `x` is already present in `a`, the insertion point will be after (to the
* right of) any existing entries. The return value is suitable for use as
* the first parameter to Array.splice() assuming that `a` is already sorted.
*
* This is part of Python's algorithm of the `bisectRight` function.
*
* @throws {Error} if `lo` is negative number
*/
export declare function bisect<T>(a: T[], x: T, lo?: number, hi?: number): number;
+91
View File
@@ -0,0 +1,91 @@
"use strict";
/*
* This file contains modifications to code that is licensed under
* the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2.
*
* Copyright © 2001-2023 Python Software Foundation. All rights reserved.
*
* 1. This LICENSE AGREEMENT is between the Python Software Foundation
* ("PSF"), and the Individual or Organization ("Licensee") accessing and
* otherwise using this software ("Python") in source or binary form and
* its associated documentation.
*
* 2. Subject to the terms and conditions of this License Agreement, PSF hereby
* grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
* analyze, test, perform and/or display publicly, prepare derivative works,
* distribute, and otherwise use Python alone or in any derivative version,
* provided, however, that PSF's License Agreement and PSF's notice of copyright,
* i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
* 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation;
* All Rights Reserved" are retained in Python alone or in any derivative version
* prepared by Licensee.
*
* 3. In the event Licensee prepares a derivative work that is based on
* or incorporates Python or any part thereof, and wants to make
* the derivative work available to others as provided herein, then
* Licensee hereby agrees to include in any such work a brief summary of
* the changes made to Python.
*
* 4. PSF is making Python available to Licensee on an "AS IS"
* basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
* IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
* DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
* FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
* INFRINGE ANY THIRD PARTY RIGHTS.
*
* 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
* FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
* A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
* OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
*
* 6. This License Agreement will automatically terminate upon a material
* breach of its terms and conditions.
*
* 7. Nothing in this License Agreement shall be deemed to create any
* relationship of agency, partnership, or joint venture between PSF and
* Licensee. This License Agreement does not grant permission to use PSF
* trademarks or trade name in a trademark sense to endorse or promote
* products or services of Licensee, or any third party.
*
* 8. By copying, installing or otherwise using Python, Licensee
* agrees to be bound by the terms and conditions of this License
* Agreement.
*
* This modified version of the Software is licensed under the MIT license.
*
* Copyright (c) 2023 Tabby FZ-LLC
*
* A copy of the license can be found in the LICENSE file at the root of this
* distribution.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.bisect = void 0;
/**
* Locate the insertion point for `x` in `a` to maintain sorted order.
* The parameters `lo` and `hi` may be used to specify a subset of the list
* which should be considered; by default the entire list is used.
* If `x` is already present in `a`, the insertion point will be after (to the
* right of) any existing entries. The return value is suitable for use as
* the first parameter to Array.splice() assuming that `a` is already sorted.
*
* This is part of Python's algorithm of the `bisectRight` function.
*
* @throws {Error} if `lo` is negative number
*/
function bisect(a, x, lo = 0, hi) {
if (lo < 0)
throw Error('lo must be non-negative');
if (hi === undefined)
hi = a.length;
while (lo < hi) {
const mid = Math.floor((lo + hi) / 2);
if (x < a[mid]) {
hi = mid;
}
else {
lo = mid + 1;
}
}
return lo;
}
exports.bisect = bisect;
+5
View File
@@ -0,0 +1,5 @@
/**
* Take two (non-complex) numbers as arguments and return a pair of numbers
* consisting of their quotient and remainder when using integer division.
*/
export declare function divmod(a: number, b: number): number[];
+11
View File
@@ -0,0 +1,11 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.divmod = void 0;
/**
* Take two (non-complex) numbers as arguments and return a pair of numbers
* consisting of their quotient and remainder when using integer division.
*/
function divmod(a, b) {
return [Math.floor(a / b), a % b];
}
exports.divmod = divmod;
+6
View File
@@ -0,0 +1,6 @@
import { DateType } from './_lib/types';
/**
* Return Hijri object for the corresponding Gregorian date.
* @throws {Error} when date is out of supported Gregorian range.
*/
export declare function gregorianToHijri(date: DateType): DateType;
+56
View File
@@ -0,0 +1,56 @@
"use strict";
/*
* This file contains modifications to code from https://github.com/mhalshehri/hijri-converter
* that is licensed under the MIT license.
*
* Copyright (c) 2018 Mohammed H Alshehri (@mhalshehri) and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the 'Software'), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software.
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* This modified version of the Software is also licensed under the MIT license,
* and is subject to the same conditions as the original version of the Software.
*
* Copyright (c) 2023 Tabby FZ-LLC
*
* A copy of the license can be found in the LICENSE file at the root of this
* distribution.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.gregorianToHijri = void 0;
const checkDateRange_1 = require("./_lib/checkDateRange");
const dateHelpersHijri_1 = require("./_lib/dateHelpersHijri");
const julianDayHelpers_1 = require("./_lib/julianDayHelpers");
const bisect_1 = require("./_lib/utils/bisect");
const ummalqura_1 = require("./_lib/ummalqura");
/**
* Return Hijri object for the corresponding Gregorian date.
* @throws {Error} when date is out of supported Gregorian range.
*/
function gregorianToHijri(date) {
(0, checkDateRange_1.checkGregorianRange)(date);
const jdn = (0, dateHelpersHijri_1.gregorianToJulian)(date);
const rjd = (0, julianDayHelpers_1.jdnToRjd)(jdn);
const index = (0, bisect_1.bisect)(ummalqura_1.MONTH_STARTS, rjd) - 1;
const months = index + ummalqura_1.HIJRI_OFFSET;
const years = Math.floor(months / 12);
const year = years + 1;
const month = months - years * 12 + 1;
const day = rjd - ummalqura_1.MONTH_STARTS[index] + 1;
return { year, month, day };
}
exports.gregorianToHijri = gregorianToHijri;
+6
View File
@@ -0,0 +1,6 @@
import { DateType } from './_lib/types';
/**
* Return Gregorian object for the corresponding Hijri date.
* @throws {Error} when date is out of supported Hijri range.
*/
export declare function hijriToGregorian(date: DateType): DateType;
+48
View File
@@ -0,0 +1,48 @@
"use strict";
/*
* This file contains modifications to code from https://github.com/mhalshehri/hijri-converter
* that is licensed under the MIT license.
*
* Copyright (c) 2018 Mohammed H Alshehri (@mhalshehri) and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the 'Software'), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software.
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* This modified version of the Software is also licensed under the MIT license,
* and is subject to the same conditions as the original version of the Software.
*
* Copyright (c) 2023 Tabby FZ-LLC
*
* A copy of the license can be found in the LICENSE file at the root of this
* distribution.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.hijriToGregorian = void 0;
const checkDateRange_1 = require("./_lib/checkDateRange");
const dateHelpersHijri_1 = require("./_lib/dateHelpersHijri");
const julianDayHelpers_1 = require("./_lib/julianDayHelpers");
/**
* Return Gregorian object for the corresponding Hijri date.
* @throws {Error} when date is out of supported Hijri range.
*/
function hijriToGregorian(date) {
(0, checkDateRange_1.checkHijriRange)(date);
const jdn = (0, dateHelpersHijri_1.hijriToJulian)(date);
const don = (0, julianDayHelpers_1.jdnToOrdinal)(jdn);
return (0, dateHelpersHijri_1.gregorianFromOrdinal)(don);
}
exports.hijriToGregorian = hijriToGregorian;
+3
View File
@@ -0,0 +1,3 @@
import { gregorianToHijri } from './gregorianToHijri';
import { hijriToGregorian } from './hijriToGregorian';
export { gregorianToHijri, hijriToGregorian };
+7
View File
@@ -0,0 +1,7 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.hijriToGregorian = exports.gregorianToHijri = void 0;
const gregorianToHijri_1 = require("./gregorianToHijri");
Object.defineProperty(exports, "gregorianToHijri", { enumerable: true, get: function () { return gregorianToHijri_1.gregorianToHijri; } });
const hijriToGregorian_1 = require("./hijriToGregorian");
Object.defineProperty(exports, "hijriToGregorian", { enumerable: true, get: function () { return hijriToGregorian_1.hijriToGregorian; } });
+62
View File
@@ -0,0 +1,62 @@
{
"name": "@tabby_ai/hijri-converter",
"version": "1.0.5",
"description": "Typescript port of an accurate python Hijri-Gregorian dates converter based on the Umm al-Qura calendar: https://github.com/mhalshehri/hijri-converter",
"contributors": [
{
"name": "Dmitry Volovod",
"email": "dmitry.volovod@tabby.ai",
"url": "https://github.com/dimazollo"
}
],
"license": "MIT",
"keywords": [
"hijri",
"hijriah",
"date",
"converter",
"conversion",
"islamic",
"gregorian",
"ummalqura",
"ummulqura",
"Umm al-Qura",
"arabic",
"saudi-arabia"
],
"bugs": {
"url": "https://github.com/tabby-ai/hijri-converter/issues"
},
"scripts": {
"test": "jest && node ./tests/importCommonJS.test.cjs && node ./tests/importEsm.test.mjs",
"clean": "rimraf ./dist",
"build": "tsc -p src",
"clean-build": "npm run clean && npm run build",
"prepublishOnly": "npm run clean-build"
},
"devDependencies": {
"@babel/core": "^7.22.10",
"@babel/preset-env": "^7.22.10",
"@babel/preset-typescript": "^7.22.5",
"@jest/globals": "^29.6.2",
"@typescript-eslint/eslint-plugin": "^6.4.0",
"babel-jest": "^29.6.2",
"eslint": "^8.47.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-prettier": "^5.0.0",
"eslint-plugin-unicorn": "^48.0.1",
"jest": "^29.6.2",
"prettier": "^3.0.2",
"rimraf": "^5.0.1",
"typescript": "^5.1.6"
},
"type": "commonjs",
"private": false,
"main": "dist/index.js",
"files": [
"dist"
],
"engines": {
"node": ">=16.0.0"
}
}