Skip to content

Commit 4352f81

Browse files
499/get holiday (#500)
* refactor(#499): use valueAsDate for isHoliday * feat(#499): add getHoliday helper * docs(#499): update readme * test(#499): add timezones checks
1 parent 359d588 commit 4352f81

File tree

7 files changed

+149
-17
lines changed

7 files changed

+149
-17
lines changed

README.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ Returns `true` if the given date is a colombian holiday, otherwise returns `fals
245245
```js
246246
import { isHoliday } from "colombian-holidays/lib/utils/isHoliday";
247247

248-
const date = new Date("2018-01-01T05:00:00.000Z");
248+
const date = new Date("2018-01-01");
249249

250250
if (isHoliday(date)) {
251251
console.log("it is a colombian holiday");
@@ -254,6 +254,32 @@ if (isHoliday(date)) {
254254
}
255255
```
256256

257+
### getHoliday
258+
259+
Similar to `isHoliday` but will return the corresponding holiday for a given date or `null` if there is no matching holiday.
260+
261+
```js
262+
import { getHoliday } from "colombian-holidays/lib/utils/getHoliday";
263+
264+
const date = new Date("2018-01-01");
265+
266+
const newYear = getHoliday(date);
267+
/*
268+
{
269+
celebrationDate: "2018-01-01",
270+
date: "2018-01-01",
271+
name: { en: "New Year's Day", es: "Año Nuevo" },
272+
nextMonday: false,
273+
}
274+
*/
275+
```
276+
277+
To get the values as date use the options argument:
278+
279+
```js
280+
const newYearAsDate = getHoliday(date, { valueAsDate: true });
281+
```
282+
257283
### holidaysWithinInterval
258284

259285
Returns an array with the colombian holidays within two dates:
@@ -264,6 +290,7 @@ import { holidaysWithinInterval } from "colombian-holidays/lib/utils/holidaysWit
264290
const start = new Date("2021-01-01");
265291
const end = new Date("2021-01-11");
266292
const holidays = holidaysWithinInterval({ start, end });
293+
// const holidays = holidaysWithinInterval({ start, end, valueAsDate: true });
267294
```
268295

269296
returns:

src/helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ function generateUtcStringFromDateParts(
5151
)}`;
5252
}
5353

54-
function generateUtcStringFromDate(date: Date): string {
54+
export function generateUtcStringFromDate(date: Date): string {
5555
return generateUtcStringFromDateParts(
5656
date.getUTCFullYear(),
5757
date.getUTCMonth() + 1,

src/utils/getHoliday.test.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import timezone_mock, { TimeZone } from "timezone-mock";
2+
import { getHoliday } from "./getHoliday";
3+
4+
const timezones: TimeZone[] = [
5+
"US/Pacific",
6+
"US/Eastern",
7+
"Brazil/East",
8+
"UTC",
9+
"Europe/London",
10+
"Australia/Adelaide",
11+
];
12+
13+
afterEach(() => {
14+
timezone_mock.unregister();
15+
});
16+
17+
describe("test getHoliday", () => {
18+
describe.each(timezones)("%p", (timezone) => {
19+
timezone_mock.register(timezone);
20+
21+
it(`should return holiday for a holiday date object`, () => {
22+
const expectedHoliday = {
23+
celebrationDate: "2018-01-01",
24+
date: "2018-01-01",
25+
name: { en: "New Year's Day", es: "Año Nuevo" },
26+
nextMonday: false,
27+
};
28+
const holiday = getHoliday(new Date("2018-01-01"));
29+
expect(holiday).toEqual(expectedHoliday);
30+
});
31+
32+
it(`should return holiday with values as dates for a holiday date object`, () => {
33+
const expectedHoliday = {
34+
celebrationDate: new Date("2018-01-01T00:00:00.000Z"),
35+
date: new Date("2018-01-01T00:00:00.000Z"),
36+
name: { en: "New Year's Day", es: "Año Nuevo" },
37+
nextMonday: false,
38+
};
39+
const holiday = getHoliday(new Date("2018-01-01"), {
40+
valueAsDate: true,
41+
});
42+
expect(holiday).toEqual(expectedHoliday);
43+
});
44+
});
45+
46+
it(`should return false for a non holiday date object`, () => {
47+
expect(getHoliday(new Date("2018-01-02T05:00:00.000Z"))).toBe(null);
48+
});
49+
});

src/utils/getHoliday.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import colombianHolidays from "..";
2+
import { generateUtcStringFromDate } from "../helpers";
3+
import { ColombianHoliday, ColombianHolidayWithNativeDate } from "../types";
4+
import { isSameDate } from "./helpers";
5+
6+
export function getHoliday(
7+
date: Date,
8+
options: { valueAsDate: true }
9+
): ColombianHolidayWithNativeDate;
10+
export function getHoliday(
11+
date: Date,
12+
options?: undefined | { valueAsDate: false }
13+
): ColombianHoliday;
14+
export function getHoliday(
15+
date: Date,
16+
options: { valueAsDate: boolean } = { valueAsDate: false }
17+
): ColombianHoliday | ColombianHolidayWithNativeDate | null {
18+
const { valueAsDate } = options;
19+
const holiday = colombianHolidays({
20+
year: date.getUTCFullYear(),
21+
valueAsDate: true,
22+
}).find(({ celebrationDate }) => isSameDate(celebrationDate, date));
23+
if (!holiday) {
24+
return null;
25+
}
26+
27+
if (valueAsDate) {
28+
return holiday;
29+
}
30+
return {
31+
...holiday,
32+
date: generateUtcStringFromDate(holiday.date),
33+
celebrationDate: generateUtcStringFromDate(holiday.celebrationDate),
34+
};
35+
}

src/utils/helpers.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export function isSameDate(date1: Date, date2: Date): boolean {
2+
return (
3+
date1.getUTCDate() === date2.getUTCDate() &&
4+
date1.getUTCMonth() === date2.getUTCMonth() &&
5+
date1.getUTCFullYear() === date2.getUTCFullYear()
6+
);
7+
}

src/utils/isHoliday.test.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,29 @@
1+
import timezone_mock, { TimeZone } from "timezone-mock";
12
import { isHoliday } from "./isHoliday";
23

4+
const timezones: TimeZone[] = [
5+
"US/Pacific",
6+
"US/Eastern",
7+
"Brazil/East",
8+
"UTC",
9+
"Europe/London",
10+
"Australia/Adelaide",
11+
];
12+
13+
afterEach(() => {
14+
timezone_mock.unregister();
15+
});
16+
317
describe("test isHoliday", () => {
4-
it(`should return true for a holiday date object`, () => {
5-
expect(isHoliday(new Date("2018-01-01T05:00:00.000Z"))).toBe(true);
6-
});
7-
it(`should return false for a non holiday date object`, () => {
8-
expect(isHoliday(new Date("2018-01-02T05:00:00.000Z"))).toBe(false);
18+
describe.each(timezones)("%p", (timezone) => {
19+
timezone_mock.register(timezone);
20+
21+
it(`should return true for a holiday date object`, () => {
22+
expect(isHoliday(new Date("2018-01-01"))).toBe(true);
23+
});
24+
25+
it(`should return false for a non holiday date object`, () => {
26+
expect(isHoliday(new Date("2018-01-02"))).toBe(false);
27+
});
928
});
1029
});

src/utils/isHoliday.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
import colombianHolidays from "..";
2+
import { isSameDate } from "./helpers";
23

34
export function isHoliday(date: Date): boolean {
4-
return colombianHolidays({ year: date.getUTCFullYear() }).some(
5-
({ celebrationDate }) => {
6-
const d = new Date(celebrationDate);
7-
return (
8-
d.getUTCDate() === date.getUTCDate() &&
9-
d.getUTCMonth() === date.getUTCMonth() &&
10-
d.getUTCFullYear() === date.getUTCFullYear()
11-
);
12-
}
13-
);
5+
return colombianHolidays({
6+
year: date.getUTCFullYear(),
7+
valueAsDate: true,
8+
}).some(({ celebrationDate }) => isSameDate(celebrationDate, date));
149
}

0 commit comments

Comments
 (0)