# umalqura
Zero dependency Hijri calendar based on Um AlQura
[![npm package](https://img.shields.io/npm/v/@umalqura/core.svg)](https://www.npmjs.org/package/@umalqura/core)
[![travis](https://travis-ci.com/umalqura/umalqura.svg?branch=master)](https://travis-ci.com/umalqura/umalqura)
[![Coverage Status](https://coveralls.io/repos/github/umalqura/umalqura/badge.svg?branch=master)](https://coveralls.io/github/umalqura/umalqura?branch=master)
### Getting Started
Run the following `npm` or `yran` command:
```sh
npm i @umalqura/core
-or-
yarn add @umalqura/core
```
You can also use the library directly in the browser by adding the following to your html:
```html
```
### Usage
#### NodeJS
```js
import uq from '@umalqura/core';
// Initializes a new umalqura instance using current date and time.
const now = uq();
// Do more stuff
// ...
```
#### Browser
A global var named `umalqura` will be available.
```js
// Initializes a new umalqura instance using current date and time.
var now = umalqura();
// Do more stuff
// ...
```
### API
##### Construction
```ts
// Initializes using current date and time.
umalqura();
// Initializes using provided date and time.
umalqura(date: Date);
// Initializes using provided Hijri year, month, day and the optionally provided time.
umalqura(hy: number, hm: number, hd: number, hour?: number, minute?: number, second?: number, millisecond?: number);
```
The `umalqura(...)` function returns an initialized `umalqura.UmAlQura` object which exposes the following properties and methods:
##### Properties
| Name | Description |
|---------------|-----------------------------------------------------------------|
| `date` | Returns the Date object. |
| `hy` | Returns the Hijri year. |
| `hm` | Returns the Hijri month. |
| `hd` | Returns the Hijri day of month. |
| `dayOfYear` | Returns the Hijri day of year. |
| `dayOfWeek` | Returns the day of week. |
| `weekOfYear` | Returns the Hijri week of year. |
| `daysInYear` | Returns the number of days in current Hijri year. |
| `daysInMonth` | Returns the number of days in current Hijri month and year. |
| `isLeapYear` | Returns true if leap year, false otherwise. |
| `monthArray` | Returns the dates of month arranged in a 2D array. |
Examples:
```js
import uq from '@umalqura/core';
const d = uq(new Date(2019, 6, 3)); // July 3rd 2019
console.log(d.hy, d.hm, d.hd); // Outputs 1440, 10, 30
// -or
const d = uq(1440, 10, 30);
console.log(d.date); // Outputs Wed Jul 03 2019 00:00:00 TZ...
```
##### Methods
Note that all methods are immutably.
| Name | Arguments | Description
|------------------|----------------------------------------|-----------------------------------------------------------------------------------------------------|
| `add` | `v:number`
`u:unitMs` | Returns a new `UmAlQura` object adding the specified number of Hijri units to the current instance. |
| `subtract` | `v:number`
`u:unitMs` | Returns a new `UmAlQura` object subtracting the specified number of Hijri units to the current instance. |
| `startOf` | `u:unit` | Returns a new `UmAlQura` object starting at the specified Hijri unit of time. |
| `endOf` | `u:unit` | Returns a new `UmAlQura` object ending at the specified Hijri unit of time. |
| `isBefore` | `cmp:UmAlQura\|Date`
`unit?:unitMs` | Returns whether current instance is before `cmp`. Check can be pinned down to `unitMs` which defaults to milliseconds. |
| `isAfter` | `cmp:UmAlQura\|Date`
`unit?:unitMs` | Returns whether current instance is after `cmp`. Check can be pinned down to `unitMs` which defaults to milliseconds. |
| `isSame` | `cmp:UmAlQura\|Date`
`unit?:unitMs` | Returns whether current instance is same as `cmp`. Check can be pinned down to `unitMs` which defaults to milliseconds. |
| `isSameOrBefore` | `cmp:UmAlQura\|Date`
`unit?:unitMs` | Returns whether current instance is same as or before `cmp`. Check can be pinned down to `unitMs` which defaults to milliseconds. |
| `isSameOrAfter` | `cmp:UmAlQura\|Date`
`unit?:unitMs` | Returns whether current instance is same as or after `cmp`. Check can be pinned down to `unitMs` which defaults to milliseconds. |
| `isBetween` | `from:UmAlQura\|Date`
`to:UmAlQura\|Date`
`fromIncl?:boolean`
`toIncl?:boolean`
`unit?:unitMs` | Returns whether current instance is between `from` and `to`. Check can be pinned down to `unitMs` which defaults to milliseconds. By, default the match is exclusive of both ends. This can be controlled via `fromIncl` and `toIncl`. |
| `format` | `mask:string`
`locale?:string` | Returns a formatted string of the Hijri date and time using the specified `mask` and optionally a `locale`. |
`unitMs` can be any of the following strings: `year, month, week, day, hour, minute, second, millisecond`.
`unit` can be any of the following string: `year, month, week, day, hour, minute, second`.
Examples:
```js
import uq from '@umalqura/core';
const d = uq(new Date(2019, 6, 3));
// Add 5 Hijri months
const after5HijriMonths = d.add(5, 'month');
// ٣٠/١٠/١٤٤٠
d.format('dd/MM/yyyy', 'ar');
// 30/03/1441
after5HijriMonths.format('dd/MM/yyyy');
// True
after5HijriMonths.isAfter(d);
// Shawwāl 1, 1440
d.startOf('month').format('longDate');
const endOf1440H = d.endOf('year');
// الجمعة، ٢٩ ذو الحجة، ١٤٤٠
endOf1440H.format('fullDate', 'ar');
// Fri Aug 30 2019 23:59:59 TZ...
endOf1440H.date;
```
The following properties and functions exist directly on the export `umalqura` object:
| Name | Description
|-----------------------------|----------------------------------------------------------------------------------------------
| `VERSION` | Returns the library version.
| `$` | Gives access to static methods.
| `min` | Returns the minimum supported Hijri date.
| `max` | Returns the maximum supported Hijri date.
| `locale(locale?: string)` | Gets or sets the local to be used globally.
| `rtl()` | Returns whether current locale supports RTL.
| `times()` | Returns the times names array according to currently set global locale.
| `days()` | Returns the days names array according to currently set global locale.
| `daysShort()` | Returns the short days names array according to currently set global locale.
| `months()` | Returns the Hijri months names array according to currently set global locale.
| `monthsShort()` | Returns the short Hijri month names array according to currently set global locale.
| `localizeNum(n: number)` | Returns a localized string representing the specified number according to currently set global locale.
Examples:
```js
import uq from '@umalqura/core';
// Set global locale to Arabic so that we no longer need to specify a locale when calling format() function.
uq.locale('ar');
// Returns true
uq.rtl();
// Returns ['محرم', 'صفر', 'ربيع الأول', 'ربيع الثاني', 'جمادى الأولى', 'جمادى الآخرة', 'رجب', 'شعبان', 'رمضان', 'شوال', 'ذو القعدة', 'ذو الحجة']
uq.months();
```
##### Pre-defined Formatting Masks
| Name | Format |
|--------------|-----------------------------------------------------------------------------|
| `default` | `ddd dd MMM yyyy HH:mm:ss` for `ar`
`ddd MMM dd yyyy HH:mm:ss` for `en` |
| `shortDate` | `yy/M/d` for `ar`
`M/d/yy` for `en` |
| `mediumDate` | `d MMM, yyyy` for `ar`
`MMM d, yyyy` for `en` |
| `longDate` | `d MMMM, yyyy` for `ar`
`MMMM d, yyyy` for `en` |
| `fullDate` | `dddd, d MMMM, yyyy` for `ar`
`dddd, MMMM d, yyyy` for `en` |
| `shortTime` | `h:mm TT` |
| `mediumTime` | `h:mm:ss TT` |
| `longTime` | `h:mm:ss.l TT` |
### Sample
An HTML-based sample is available in `./sample/browser.html` locally or online @ https://umalqura.github.io/.