@intech-software/chronera 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/local-date.d.ts +1 -0
- package/dist/core/local-date.js +1 -0
- package/dist/core/local-date.js.map +1 -1
- package/dist/holidays/countries/ae.d.ts +6 -0
- package/dist/holidays/countries/ae.js +70 -0
- package/dist/holidays/countries/ae.js.map +1 -0
- package/dist/holidays/countries/au.d.ts +6 -0
- package/dist/holidays/countries/au.js +79 -0
- package/dist/holidays/countries/au.js.map +1 -0
- package/dist/holidays/countries/cn.d.ts +6 -0
- package/dist/holidays/countries/cn.js +57 -0
- package/dist/holidays/countries/cn.js.map +1 -0
- package/dist/holidays/countries/de.d.ts +6 -0
- package/dist/holidays/countries/de.js +81 -0
- package/dist/holidays/countries/de.js.map +1 -0
- package/dist/holidays/countries/fr.d.ts +6 -0
- package/dist/holidays/countries/fr.js +97 -0
- package/dist/holidays/countries/fr.js.map +1 -0
- package/dist/holidays/countries/gb.d.ts +6 -0
- package/dist/holidays/countries/gb.js +80 -0
- package/dist/holidays/countries/gb.js.map +1 -0
- package/dist/holidays/countries/hk.d.ts +6 -0
- package/dist/holidays/countries/hk.js +87 -0
- package/dist/holidays/countries/hk.js.map +1 -0
- package/dist/holidays/countries/in.d.ts +6 -0
- package/dist/holidays/countries/in.js +52 -0
- package/dist/holidays/countries/in.js.map +1 -0
- package/dist/holidays/countries/index.d.ts +18 -0
- package/dist/holidays/countries/index.js +34 -0
- package/dist/holidays/countries/index.js.map +1 -0
- package/dist/holidays/countries/ir.d.ts +7 -0
- package/dist/holidays/countries/ir.js +93 -0
- package/dist/holidays/countries/ir.js.map +1 -0
- package/dist/holidays/countries/jp.d.ts +6 -0
- package/dist/holidays/countries/jp.js +140 -0
- package/dist/holidays/countries/jp.js.map +1 -0
- package/dist/holidays/countries/sa.d.ts +7 -0
- package/dist/holidays/countries/sa.js +56 -0
- package/dist/holidays/countries/sa.js.map +1 -0
- package/dist/holidays/countries/sg.d.ts +6 -0
- package/dist/holidays/countries/sg.js +71 -0
- package/dist/holidays/countries/sg.js.map +1 -0
- package/dist/holidays/countries/th.d.ts +6 -0
- package/dist/holidays/countries/th.js +151 -0
- package/dist/holidays/countries/th.js.map +1 -0
- package/dist/holidays/countries/tw.d.ts +6 -0
- package/dist/holidays/countries/tw.js +57 -0
- package/dist/holidays/countries/tw.js.map +1 -0
- package/dist/holidays/countries/us.d.ts +6 -0
- package/dist/holidays/countries/us.js +112 -0
- package/dist/holidays/countries/us.js.map +1 -0
- package/dist/holidays/easter.d.ts +23 -0
- package/dist/holidays/easter.js +49 -0
- package/dist/holidays/easter.js.map +1 -0
- package/dist/holidays/index.d.ts +5 -0
- package/dist/holidays/index.js +6 -0
- package/dist/holidays/index.js.map +1 -0
- package/dist/holidays/registry.d.ts +14 -0
- package/dist/holidays/registry.js +79 -0
- package/dist/holidays/registry.js.map +1 -0
- package/dist/holidays/rules/easter-rule.d.ts +5 -0
- package/dist/holidays/rules/easter-rule.js +26 -0
- package/dist/holidays/rules/easter-rule.js.map +1 -0
- package/dist/holidays/rules/fixed-rule.d.ts +5 -0
- package/dist/holidays/rules/fixed-rule.js +72 -0
- package/dist/holidays/rules/fixed-rule.js.map +1 -0
- package/dist/holidays/rules/floating-rule.d.ts +6 -0
- package/dist/holidays/rules/floating-rule.js +53 -0
- package/dist/holidays/rules/floating-rule.js.map +1 -0
- package/dist/holidays/rules/hijri-rule.d.ts +6 -0
- package/dist/holidays/rules/hijri-rule.js +44 -0
- package/dist/holidays/rules/hijri-rule.js.map +1 -0
- package/dist/holidays/rules/index.d.ts +9 -0
- package/dist/holidays/rules/index.js +26 -0
- package/dist/holidays/rules/index.js.map +1 -0
- package/dist/holidays/types.d.ts +106 -0
- package/dist/holidays/types.js +2 -0
- package/dist/holidays/types.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/operations/business-days.d.ts +30 -14
- package/dist/operations/business-days.js +115 -37
- package/dist/operations/business-days.js.map +1 -1
- package/dist/operations/holidays.d.ts +15 -0
- package/dist/operations/holidays.js +36 -0
- package/dist/operations/holidays.js.map +1 -0
- package/package.json +10 -1
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FixedHolidayRule, PublicHoliday, CountryCode } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Evaluates a fixed solar holiday rule for a given year.
|
|
4
|
+
*/
|
|
5
|
+
export declare function evaluateFixedRule(rule: FixedHolidayRule, year: number, country: CountryCode | (string & {}), includeObserved?: boolean): readonly PublicHoliday[];
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createLocalDate } from "../../core/local-date.js";
|
|
2
|
+
import { getIsoDayOfWeek } from "../../core/iso-week.js";
|
|
3
|
+
import { addDays, getAbsoluteDay } from "../../operations/convenience.js";
|
|
4
|
+
/**
|
|
5
|
+
* Applies legal substitution roll rules when a holiday lands on a weekend.
|
|
6
|
+
*/
|
|
7
|
+
function applyObservedRoll(date, rule) {
|
|
8
|
+
const roll = rule.observed ?? "none";
|
|
9
|
+
if (roll === "none") {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const abs = getAbsoluteDay(date);
|
|
13
|
+
const dow = getIsoDayOfWeek(abs); // 1 = Mon ... 6 = Sat, 7 = Sun
|
|
14
|
+
if (roll === "sunday-to-monday" && dow === 7) {
|
|
15
|
+
return addDays(date, 1);
|
|
16
|
+
}
|
|
17
|
+
if (roll === "weekend-to-monday") {
|
|
18
|
+
if (dow === 6)
|
|
19
|
+
return addDays(date, 2);
|
|
20
|
+
if (dow === 7)
|
|
21
|
+
return addDays(date, 1);
|
|
22
|
+
}
|
|
23
|
+
if (roll === "sat-to-fri-sun-to-mon") {
|
|
24
|
+
if (dow === 6)
|
|
25
|
+
return addDays(date, -1);
|
|
26
|
+
if (dow === 7)
|
|
27
|
+
return addDays(date, 1);
|
|
28
|
+
}
|
|
29
|
+
if (roll === "iran-roll") {
|
|
30
|
+
// Iran weekend is Thursday (4) & Friday (5)
|
|
31
|
+
if (dow === 4 || dow === 5) {
|
|
32
|
+
return addDays(date, dow === 4 ? 2 : 1);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Evaluates a fixed solar holiday rule for a given year.
|
|
39
|
+
*/
|
|
40
|
+
export function evaluateFixedRule(rule, year, country, includeObserved = true) {
|
|
41
|
+
if (rule.validFromYear && year < rule.validFromYear)
|
|
42
|
+
return [];
|
|
43
|
+
if (rule.validUntilYear && year > rule.validUntilYear)
|
|
44
|
+
return [];
|
|
45
|
+
const originalDate = createLocalDate(year, rule.month, rule.day);
|
|
46
|
+
const results = [
|
|
47
|
+
{
|
|
48
|
+
id: rule.id,
|
|
49
|
+
date: originalDate,
|
|
50
|
+
name: rule.name,
|
|
51
|
+
nameEn: rule.nameEn,
|
|
52
|
+
country,
|
|
53
|
+
isObserved: false,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
if (includeObserved) {
|
|
57
|
+
const observedDate = applyObservedRoll(originalDate, rule);
|
|
58
|
+
if (observedDate) {
|
|
59
|
+
results.push({
|
|
60
|
+
id: `${rule.id}-observed`,
|
|
61
|
+
date: observedDate,
|
|
62
|
+
name: `${rule.name} (ชดเชย / Observed)`,
|
|
63
|
+
nameEn: `${rule.nameEn} (Observed)`,
|
|
64
|
+
country,
|
|
65
|
+
isObserved: true,
|
|
66
|
+
originalDate,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return results;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=fixed-rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixed-rule.js","sourceRoot":"","sources":["../../../src/holidays/rules/fixed-rule.ts"],"names":[],"mappings":"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","sourcesContent":["import { createLocalDate } from \"../../core/local-date.js\";\nimport { getIsoDayOfWeek } from \"../../core/iso-week.js\";\nimport { addDays, getAbsoluteDay } from \"../../operations/convenience.js\";\n\nimport type { FixedHolidayRule, PublicHoliday, CountryCode } from \"../types.js\";\nimport type { LocalDate } from \"../../public-types.js\";\n\n/**\n * Applies legal substitution roll rules when a holiday lands on a weekend.\n */\nfunction applyObservedRoll(\n date: LocalDate,\n rule: FixedHolidayRule,\n): LocalDate | null {\n const roll = rule.observed ?? \"none\";\n if (roll === \"none\") {\n return null;\n }\n\n const abs = getAbsoluteDay(date);\n const dow = getIsoDayOfWeek(abs); // 1 = Mon ... 6 = Sat, 7 = Sun\n\n if (roll === \"sunday-to-monday\" && dow === 7) {\n return addDays(date, 1);\n }\n\n if (roll === \"weekend-to-monday\") {\n if (dow === 6) return addDays(date, 2);\n if (dow === 7) return addDays(date, 1);\n }\n\n if (roll === \"sat-to-fri-sun-to-mon\") {\n if (dow === 6) return addDays(date, -1);\n if (dow === 7) return addDays(date, 1);\n }\n\n if (roll === \"iran-roll\") {\n // Iran weekend is Thursday (4) & Friday (5)\n if (dow === 4 || dow === 5) {\n return addDays(date, dow === 4 ? 2 : 1);\n }\n }\n\n return null;\n}\n\n/**\n * Evaluates a fixed solar holiday rule for a given year.\n */\nexport function evaluateFixedRule(\n rule: FixedHolidayRule,\n year: number,\n country: CountryCode | (string & {}),\n includeObserved = true,\n): readonly PublicHoliday[] {\n if (rule.validFromYear && year < rule.validFromYear) return [];\n if (rule.validUntilYear && year > rule.validUntilYear) return [];\n\n const originalDate = createLocalDate(year, rule.month, rule.day);\n const results: PublicHoliday[] = [\n {\n id: rule.id,\n date: originalDate,\n name: rule.name,\n nameEn: rule.nameEn,\n country,\n isObserved: false,\n },\n ];\n\n if (includeObserved) {\n const observedDate = applyObservedRoll(originalDate, rule);\n if (observedDate) {\n results.push({\n id: `${rule.id}-observed`,\n date: observedDate,\n name: `${rule.name} (ชดเชย / Observed)`,\n nameEn: `${rule.nameEn} (Observed)`,\n country,\n isObserved: true,\n originalDate,\n });\n }\n }\n\n return results;\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FloatingHolidayRule, PublicHoliday, CountryCode } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Evaluates a floating weekday rule for a given year.
|
|
4
|
+
* e.g., 4th Thursday of November (Thanksgiving), 2nd Monday of January (Coming of Age Day).
|
|
5
|
+
*/
|
|
6
|
+
export declare function evaluateFloatingRule(rule: FloatingHolidayRule, year: number, country: CountryCode | (string & {})): readonly PublicHoliday[];
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createLocalDate } from "../../core/local-date.js";
|
|
2
|
+
import { getIsoDayOfWeek } from "../../core/iso-week.js";
|
|
3
|
+
import { getAbsoluteDay } from "../../operations/convenience.js";
|
|
4
|
+
function getGregorianDaysInMonth(year, month) {
|
|
5
|
+
if (month === 2) {
|
|
6
|
+
const isLeap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
7
|
+
return isLeap ? 29 : 28;
|
|
8
|
+
}
|
|
9
|
+
return month === 4 || month === 6 || month === 9 || month === 11 ? 30 : 31;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Evaluates a floating weekday rule for a given year.
|
|
13
|
+
* e.g., 4th Thursday of November (Thanksgiving), 2nd Monday of January (Coming of Age Day).
|
|
14
|
+
*/
|
|
15
|
+
export function evaluateFloatingRule(rule, year, country) {
|
|
16
|
+
if (rule.validFromYear && year < rule.validFromYear)
|
|
17
|
+
return [];
|
|
18
|
+
if (rule.validUntilYear && year > rule.validUntilYear)
|
|
19
|
+
return [];
|
|
20
|
+
const targetWeekday = rule.weekday; // 1 = Mon ... 7 = Sun
|
|
21
|
+
let targetDay;
|
|
22
|
+
if (rule.occurrence === -1) {
|
|
23
|
+
// Last occurrence in the month
|
|
24
|
+
const totalDays = getGregorianDaysInMonth(year, rule.month);
|
|
25
|
+
const lastDate = createLocalDate(year, rule.month, totalDays);
|
|
26
|
+
const lastDow = getIsoDayOfWeek(getAbsoluteDay(lastDate));
|
|
27
|
+
const diff = (lastDow - targetWeekday + 7) % 7;
|
|
28
|
+
targetDay = totalDays - diff;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// 1st, 2nd, 3rd, 4th, or 5th occurrence
|
|
32
|
+
const firstDate = createLocalDate(year, rule.month, 1);
|
|
33
|
+
const firstDow = getIsoDayOfWeek(getAbsoluteDay(firstDate));
|
|
34
|
+
const firstOccurrenceDay = 1 + ((targetWeekday - firstDow + 7) % 7);
|
|
35
|
+
targetDay = firstOccurrenceDay + (rule.occurrence - 1) * 7;
|
|
36
|
+
const totalDays = getGregorianDaysInMonth(year, rule.month);
|
|
37
|
+
if (targetDay > totalDays) {
|
|
38
|
+
return []; // Month doesn't have a 5th occurrence
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const date = createLocalDate(year, rule.month, targetDay);
|
|
42
|
+
return [
|
|
43
|
+
{
|
|
44
|
+
id: rule.id,
|
|
45
|
+
date,
|
|
46
|
+
name: rule.name,
|
|
47
|
+
nameEn: rule.nameEn,
|
|
48
|
+
country,
|
|
49
|
+
isObserved: false,
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=floating-rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floating-rule.js","sourceRoot":"","sources":["../../../src/holidays/rules/floating-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAQjE,SAAS,uBAAuB,CAAC,IAAY,EAAE,KAAa;IAC1D,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAyB,EACzB,IAAY,EACZ,OAAoC;IAEpC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAC/D,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc;QAAE,OAAO,EAAE,CAAC;IAEjE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,sBAAsB;IAC1D,IAAI,SAAiB,CAAC;IAEtB,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3B,+BAA+B;QAC/B,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,eAAe,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,CAAC,OAAO,GAAG,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,wCAAwC;QACxC,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5D,MAAM,kBAAkB,GAAG,CAAC,GAAG,CAAC,CAAC,aAAa,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,SAAS,GAAG,kBAAkB,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAE3D,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC,CAAC,sCAAsC;QACnD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1D,OAAO;QACL;YACE,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO;YACP,UAAU,EAAE,KAAK;SAClB;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { createLocalDate } from \"../../core/local-date.js\";\nimport { getIsoDayOfWeek } from \"../../core/iso-week.js\";\nimport { getAbsoluteDay } from \"../../operations/convenience.js\";\n\nimport type {\n FloatingHolidayRule,\n PublicHoliday,\n CountryCode,\n} from \"../types.js\";\n\nfunction getGregorianDaysInMonth(year: number, month: number): number {\n if (month === 2) {\n const isLeap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n return isLeap ? 29 : 28;\n }\n return month === 4 || month === 6 || month === 9 || month === 11 ? 30 : 31;\n}\n\n/**\n * Evaluates a floating weekday rule for a given year.\n * e.g., 4th Thursday of November (Thanksgiving), 2nd Monday of January (Coming of Age Day).\n */\nexport function evaluateFloatingRule(\n rule: FloatingHolidayRule,\n year: number,\n country: CountryCode | (string & {}),\n): readonly PublicHoliday[] {\n if (rule.validFromYear && year < rule.validFromYear) return [];\n if (rule.validUntilYear && year > rule.validUntilYear) return [];\n\n const targetWeekday = rule.weekday; // 1 = Mon ... 7 = Sun\n let targetDay: number;\n\n if (rule.occurrence === -1) {\n // Last occurrence in the month\n const totalDays = getGregorianDaysInMonth(year, rule.month);\n const lastDate = createLocalDate(year, rule.month, totalDays);\n const lastDow = getIsoDayOfWeek(getAbsoluteDay(lastDate));\n const diff = (lastDow - targetWeekday + 7) % 7;\n targetDay = totalDays - diff;\n } else {\n // 1st, 2nd, 3rd, 4th, or 5th occurrence\n const firstDate = createLocalDate(year, rule.month, 1);\n const firstDow = getIsoDayOfWeek(getAbsoluteDay(firstDate));\n const firstOccurrenceDay = 1 + ((targetWeekday - firstDow + 7) % 7);\n targetDay = firstOccurrenceDay + (rule.occurrence - 1) * 7;\n\n const totalDays = getGregorianDaysInMonth(year, rule.month);\n if (targetDay > totalDays) {\n return []; // Month doesn't have a 5th occurrence\n }\n }\n\n const date = createLocalDate(year, rule.month, targetDay);\n return [\n {\n id: rule.id,\n date,\n name: rule.name,\n nameEn: rule.nameEn,\n country,\n isObserved: false,\n },\n ];\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { HijriHolidayRule, PublicHoliday, CountryCode } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Evaluates an Islamic Lunar Hijri holiday rule for a given Gregorian solar year.
|
|
4
|
+
* Handles single or multi-day statutory festivals (e.g. Eid al-Fitr, Eid al-Adha).
|
|
5
|
+
*/
|
|
6
|
+
export declare function evaluateHijriRule(rule: HijriHolidayRule, year: number, country: CountryCode | (string & {})): readonly PublicHoliday[];
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { islamicCivilToAbsoluteDay, islamicCivilFromAbsoluteDay, } from "../../calendar/hijri/civil-adapter.js";
|
|
2
|
+
import { absoluteDayFromGregorianFields } from "../../core/absolute-day.js";
|
|
3
|
+
import { gregorianFromAbsoluteDay } from "../../calendar/gregory/absolute-day.js";
|
|
4
|
+
import { localDate } from "../../core/local-date.js";
|
|
5
|
+
import { addDays } from "../../operations/convenience.js";
|
|
6
|
+
/**
|
|
7
|
+
* Evaluates an Islamic Lunar Hijri holiday rule for a given Gregorian solar year.
|
|
8
|
+
* Handles single or multi-day statutory festivals (e.g. Eid al-Fitr, Eid al-Adha).
|
|
9
|
+
*/
|
|
10
|
+
export function evaluateHijriRule(rule, year, country) {
|
|
11
|
+
if (rule.validFromYear && year < rule.validFromYear)
|
|
12
|
+
return [];
|
|
13
|
+
if (rule.validUntilYear && year > rule.validUntilYear)
|
|
14
|
+
return [];
|
|
15
|
+
const startAbs = absoluteDayFromGregorianFields(year, 1, 1);
|
|
16
|
+
const endAbs = absoluteDayFromGregorianFields(year, 12, 31);
|
|
17
|
+
const startHijri = islamicCivilFromAbsoluteDay(startAbs);
|
|
18
|
+
const endHijri = islamicCivilFromAbsoluteDay(endAbs);
|
|
19
|
+
const duration = rule.durationDays ?? 1;
|
|
20
|
+
const results = [];
|
|
21
|
+
for (let hYear = startHijri.year - 1; hYear <= endHijri.year + 1; hYear++) {
|
|
22
|
+
const baseAbs = islamicCivilToAbsoluteDay(hYear, rule.hijriMonth, rule.hijriDay);
|
|
23
|
+
const gFields = gregorianFromAbsoluteDay(baseAbs);
|
|
24
|
+
const baseDate = localDate(gFields.year, gFields.month, gFields.day);
|
|
25
|
+
for (let dayOffset = 0; dayOffset < duration; dayOffset++) {
|
|
26
|
+
const date = dayOffset === 0 ? baseDate : addDays(baseDate, dayOffset);
|
|
27
|
+
if (date.year === year) {
|
|
28
|
+
const idSuffix = duration > 1 ? `-day-${dayOffset + 1}` : "";
|
|
29
|
+
const nameSuffix = duration > 1 ? ` (วันที่ ${dayOffset + 1})` : "";
|
|
30
|
+
const nameEnSuffix = duration > 1 ? ` (Day ${dayOffset + 1})` : "";
|
|
31
|
+
results.push({
|
|
32
|
+
id: `${rule.id}${idSuffix}`,
|
|
33
|
+
date,
|
|
34
|
+
name: `${rule.name}${nameSuffix}`,
|
|
35
|
+
nameEn: `${rule.nameEn}${nameEnSuffix}`,
|
|
36
|
+
country,
|
|
37
|
+
isObserved: false,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return results;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=hijri-rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hijri-rule.js","sourceRoot":"","sources":["../../../src/holidays/rules/hijri-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAI1D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAsB,EACtB,IAAY,EACZ,OAAoC;IAEpC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAC/D,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc;QAAE,OAAO,EAAE,CAAC;IAEjE,MAAM,QAAQ,GAAG,8BAA8B,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,8BAA8B,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAE5D,MAAM,UAAU,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,KAAK,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1E,MAAM,OAAO,GAAG,yBAAyB,CACvC,KAAK,EACL,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,QAAQ,CACd,CAAC;QACF,MAAM,OAAO,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAErE,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,MAAM,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpE,MAAM,YAAY,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEnE,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE;oBAC3B,IAAI;oBACJ,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,EAAE;oBACjC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE;oBACvC,OAAO;oBACP,UAAU,EAAE,KAAK;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import {\n islamicCivilToAbsoluteDay,\n islamicCivilFromAbsoluteDay,\n} from \"../../calendar/hijri/civil-adapter.js\";\nimport { absoluteDayFromGregorianFields } from \"../../core/absolute-day.js\";\nimport { gregorianFromAbsoluteDay } from \"../../calendar/gregory/absolute-day.js\";\nimport { localDate } from \"../../core/local-date.js\";\nimport { addDays } from \"../../operations/convenience.js\";\n\nimport type { HijriHolidayRule, PublicHoliday, CountryCode } from \"../types.js\";\n\n/**\n * Evaluates an Islamic Lunar Hijri holiday rule for a given Gregorian solar year.\n * Handles single or multi-day statutory festivals (e.g. Eid al-Fitr, Eid al-Adha).\n */\nexport function evaluateHijriRule(\n rule: HijriHolidayRule,\n year: number,\n country: CountryCode | (string & {}),\n): readonly PublicHoliday[] {\n if (rule.validFromYear && year < rule.validFromYear) return [];\n if (rule.validUntilYear && year > rule.validUntilYear) return [];\n\n const startAbs = absoluteDayFromGregorianFields(year, 1, 1);\n const endAbs = absoluteDayFromGregorianFields(year, 12, 31);\n\n const startHijri = islamicCivilFromAbsoluteDay(startAbs);\n const endHijri = islamicCivilFromAbsoluteDay(endAbs);\n\n const duration = rule.durationDays ?? 1;\n const results: PublicHoliday[] = [];\n\n for (let hYear = startHijri.year - 1; hYear <= endHijri.year + 1; hYear++) {\n const baseAbs = islamicCivilToAbsoluteDay(\n hYear,\n rule.hijriMonth,\n rule.hijriDay,\n );\n const gFields = gregorianFromAbsoluteDay(baseAbs);\n const baseDate = localDate(gFields.year, gFields.month, gFields.day);\n\n for (let dayOffset = 0; dayOffset < duration; dayOffset++) {\n const date = dayOffset === 0 ? baseDate : addDays(baseDate, dayOffset);\n if (date.year === year) {\n const idSuffix = duration > 1 ? `-day-${dayOffset + 1}` : \"\";\n const nameSuffix = duration > 1 ? ` (วันที่ ${dayOffset + 1})` : \"\";\n const nameEnSuffix = duration > 1 ? ` (Day ${dayOffset + 1})` : \"\";\n\n results.push({\n id: `${rule.id}${idSuffix}`,\n date,\n name: `${rule.name}${nameSuffix}`,\n nameEn: `${rule.nameEn}${nameEnSuffix}`,\n country,\n isObserved: false,\n });\n }\n }\n }\n\n return results;\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HolidayRule, PublicHoliday, CountryCode } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Dispatches and evaluates any HolidayRule for a specified Gregorian year.
|
|
4
|
+
*/
|
|
5
|
+
export declare function evaluateRule(rule: HolidayRule, year: number, country: CountryCode | (string & {}), includeObserved?: boolean): readonly PublicHoliday[];
|
|
6
|
+
export * from "./fixed-rule.js";
|
|
7
|
+
export * from "./floating-rule.js";
|
|
8
|
+
export * from "./easter-rule.js";
|
|
9
|
+
export * from "./hijri-rule.js";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { evaluateFixedRule } from "./fixed-rule.js";
|
|
2
|
+
import { evaluateFloatingRule } from "./floating-rule.js";
|
|
3
|
+
import { evaluateEasterRule } from "./easter-rule.js";
|
|
4
|
+
import { evaluateHijriRule } from "./hijri-rule.js";
|
|
5
|
+
/**
|
|
6
|
+
* Dispatches and evaluates any HolidayRule for a specified Gregorian year.
|
|
7
|
+
*/
|
|
8
|
+
export function evaluateRule(rule, year, country, includeObserved = true) {
|
|
9
|
+
switch (rule.type) {
|
|
10
|
+
case "fixed":
|
|
11
|
+
return evaluateFixedRule(rule, year, country, includeObserved);
|
|
12
|
+
case "floating":
|
|
13
|
+
return evaluateFloatingRule(rule, year, country);
|
|
14
|
+
case "easter":
|
|
15
|
+
return evaluateEasterRule(rule, year, country);
|
|
16
|
+
case "hijri":
|
|
17
|
+
return evaluateHijriRule(rule, year, country);
|
|
18
|
+
case "custom":
|
|
19
|
+
return rule.evaluate(year);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export * from "./fixed-rule.js";
|
|
23
|
+
export * from "./floating-rule.js";
|
|
24
|
+
export * from "./easter-rule.js";
|
|
25
|
+
export * from "./hijri-rule.js";
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/holidays/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIpD;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAiB,EACjB,IAAY,EACZ,OAAoC,EACpC,eAAe,GAAG,IAAI;IAEtB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QACjE,KAAK,UAAU;YACb,OAAO,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACnD,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,KAAK,OAAO;YACV,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAChD,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC","sourcesContent":["import { evaluateFixedRule } from \"./fixed-rule.js\";\nimport { evaluateFloatingRule } from \"./floating-rule.js\";\nimport { evaluateEasterRule } from \"./easter-rule.js\";\nimport { evaluateHijriRule } from \"./hijri-rule.js\";\n\nimport type { HolidayRule, PublicHoliday, CountryCode } from \"../types.js\";\n\n/**\n * Dispatches and evaluates any HolidayRule for a specified Gregorian year.\n */\nexport function evaluateRule(\n rule: HolidayRule,\n year: number,\n country: CountryCode | (string & {}),\n includeObserved = true,\n): readonly PublicHoliday[] {\n switch (rule.type) {\n case \"fixed\":\n return evaluateFixedRule(rule, year, country, includeObserved);\n case \"floating\":\n return evaluateFloatingRule(rule, year, country);\n case \"easter\":\n return evaluateEasterRule(rule, year, country);\n case \"hijri\":\n return evaluateHijriRule(rule, year, country);\n case \"custom\":\n return rule.evaluate(year);\n }\n}\n\nexport * from \"./fixed-rule.js\";\nexport * from \"./floating-rule.js\";\nexport * from \"./easter-rule.js\";\nexport * from \"./hijri-rule.js\";\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { LocalDate } from "../public-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Supported 15 country codes (ISO 3166-1 alpha-2).
|
|
4
|
+
*/
|
|
5
|
+
export type CountryCode = "TH" | "JP" | "SA" | "AE" | "IR" | "TW" | "IN" | "SG" | "US" | "GB" | "DE" | "FR" | "AU" | "CN" | "HK";
|
|
6
|
+
/**
|
|
7
|
+
* Substitution rule when a holiday falls on a weekend or statutory non-working day.
|
|
8
|
+
*/
|
|
9
|
+
export type ObservedRollRule = "none" | "sunday-to-monday" | "weekend-to-monday" | "sat-to-fri-sun-to-mon" | "iran-roll";
|
|
10
|
+
/**
|
|
11
|
+
* Fixed solar calendar date rule (e.g., Songkran April 13-15, New Year Jan 1).
|
|
12
|
+
*/
|
|
13
|
+
export interface FixedHolidayRule {
|
|
14
|
+
readonly type: "fixed";
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly month: number;
|
|
17
|
+
readonly day: number;
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly nameEn: string;
|
|
20
|
+
readonly observed?: ObservedRollRule;
|
|
21
|
+
readonly validFromYear?: number;
|
|
22
|
+
readonly validUntilYear?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Floating weekday rule (e.g., US Thanksgiving 4th Thursday of November, Japan Happy Monday 2nd Monday).
|
|
26
|
+
*/
|
|
27
|
+
export interface FloatingHolidayRule {
|
|
28
|
+
readonly type: "floating";
|
|
29
|
+
readonly id: string;
|
|
30
|
+
readonly month: number;
|
|
31
|
+
readonly weekday: number;
|
|
32
|
+
readonly occurrence: 1 | 2 | 3 | 4 | 5 | -1;
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly nameEn: string;
|
|
35
|
+
readonly validFromYear?: number;
|
|
36
|
+
readonly validUntilYear?: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Western Christian astronomical Easter cycle rule (Meeus/Jones/Butcher algorithm).
|
|
40
|
+
* e.g., Good Friday (offset -2), Easter Monday (offset +1), Ascension (offset +39).
|
|
41
|
+
*/
|
|
42
|
+
export interface EasterHolidayRule {
|
|
43
|
+
readonly type: "easter";
|
|
44
|
+
readonly id: string;
|
|
45
|
+
readonly offsetDays: number;
|
|
46
|
+
readonly name: string;
|
|
47
|
+
readonly nameEn: string;
|
|
48
|
+
readonly validFromYear?: number;
|
|
49
|
+
readonly validUntilYear?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Islamic Lunar Hijri holiday rule mapped to solar Gregorian years via Chronera Hijri adapters.
|
|
53
|
+
* e.g., Eid al-Fitr (1 Shawwal = Month 10 Day 1), Eid al-Adha (10 Dhu al-Hijjah = Month 12 Day 10).
|
|
54
|
+
*/
|
|
55
|
+
export interface HijriHolidayRule {
|
|
56
|
+
readonly type: "hijri";
|
|
57
|
+
readonly id: string;
|
|
58
|
+
readonly hijriMonth: number;
|
|
59
|
+
readonly hijriDay: number;
|
|
60
|
+
readonly durationDays?: number;
|
|
61
|
+
readonly name: string;
|
|
62
|
+
readonly nameEn: string;
|
|
63
|
+
readonly validFromYear?: number;
|
|
64
|
+
readonly validUntilYear?: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Dynamic custom rule for arbitrary mathematical or cultural evaluations.
|
|
68
|
+
*/
|
|
69
|
+
export interface CustomHolidayRule {
|
|
70
|
+
readonly type: "custom";
|
|
71
|
+
readonly id: string;
|
|
72
|
+
readonly name: string;
|
|
73
|
+
readonly nameEn: string;
|
|
74
|
+
readonly evaluate: (year: number) => readonly PublicHoliday[];
|
|
75
|
+
}
|
|
76
|
+
export type HolidayRule = FixedHolidayRule | FloatingHolidayRule | EasterHolidayRule | HijriHolidayRule | CustomHolidayRule;
|
|
77
|
+
/**
|
|
78
|
+
* Evaluated public holiday representation.
|
|
79
|
+
*/
|
|
80
|
+
export interface PublicHoliday {
|
|
81
|
+
readonly id: string;
|
|
82
|
+
readonly date: LocalDate;
|
|
83
|
+
readonly name: string;
|
|
84
|
+
readonly nameEn: string;
|
|
85
|
+
readonly country: CountryCode | (string & {});
|
|
86
|
+
readonly isObserved: boolean;
|
|
87
|
+
readonly originalDate?: LocalDate;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Complete country holiday calendar definition.
|
|
91
|
+
*/
|
|
92
|
+
export interface HolidayCalendar {
|
|
93
|
+
readonly country: CountryCode | (string & {});
|
|
94
|
+
readonly countryName?: string;
|
|
95
|
+
readonly defaultWeekendDays?: readonly number[];
|
|
96
|
+
readonly rules: readonly HolidayRule[];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Options for holiday queries.
|
|
100
|
+
*/
|
|
101
|
+
export interface HolidayOptions {
|
|
102
|
+
/** Include substituted/observed holidays when falling on weekends (default: true) */
|
|
103
|
+
readonly includeObserved?: boolean;
|
|
104
|
+
/** Additional custom holidays to include */
|
|
105
|
+
readonly additionalHolidays?: readonly LocalDate[];
|
|
106
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/holidays/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { LocalDate } from \"../public-types.js\";\n\n/**\n * Supported 15 country codes (ISO 3166-1 alpha-2).\n */\nexport type CountryCode =\n | \"TH\" // Thailand 🇹🇭\n | \"JP\" // Japan 🇯🇵\n | \"SA\" // Saudi Arabia 🇸🇦\n | \"AE\" // United Arab Emirates 🇦🇪\n | \"IR\" // Iran 🇮🇷\n | \"TW\" // Taiwan 🇹🇼\n | \"IN\" // India 🇮🇳\n | \"SG\" // Singapore 🇸🇬\n | \"US\" // United States 🇺🇸\n | \"GB\" // United Kingdom 🇬🇧\n | \"DE\" // Germany 🇩🇪\n | \"FR\" // France 🇫🇷\n | \"AU\" // Australia 🇦🇺\n | \"CN\" // China 🇨🇳\n | \"HK\"; // Hong Kong 🇭🇰\n\n/**\n * Substitution rule when a holiday falls on a weekend or statutory non-working day.\n */\nexport type ObservedRollRule =\n | \"none\"\n | \"sunday-to-monday\" // If Sunday -> roll to Monday (e.g., Thailand, Hong Kong, Japan)\n | \"weekend-to-monday\" // If Saturday or Sunday -> roll to Monday (e.g., UK, Singapore)\n | \"sat-to-fri-sun-to-mon\" // If Saturday -> Friday, If Sunday -> Monday (e.g., US Federal)\n | \"iran-roll\"; // Iran weekend roll (Thursday/Friday)\n\n/**\n * Fixed solar calendar date rule (e.g., Songkran April 13-15, New Year Jan 1).\n */\nexport interface FixedHolidayRule {\n readonly type: \"fixed\";\n readonly id: string;\n readonly month: number; // 1-12\n readonly day: number; // 1-31\n readonly name: string;\n readonly nameEn: string;\n readonly observed?: ObservedRollRule;\n readonly validFromYear?: number;\n readonly validUntilYear?: number;\n}\n\n/**\n * Floating weekday rule (e.g., US Thanksgiving 4th Thursday of November, Japan Happy Monday 2nd Monday).\n */\nexport interface FloatingHolidayRule {\n readonly type: \"floating\";\n readonly id: string;\n readonly month: number; // 1-12\n readonly weekday: number; // 1 (Mon) .. 7 (Sun)\n readonly occurrence: 1 | 2 | 3 | 4 | 5 | -1; // -1 represents the last weekday of the month\n readonly name: string;\n readonly nameEn: string;\n readonly validFromYear?: number;\n readonly validUntilYear?: number;\n}\n\n/**\n * Western Christian astronomical Easter cycle rule (Meeus/Jones/Butcher algorithm).\n * e.g., Good Friday (offset -2), Easter Monday (offset +1), Ascension (offset +39).\n */\nexport interface EasterHolidayRule {\n readonly type: \"easter\";\n readonly id: string;\n readonly offsetDays: number;\n readonly name: string;\n readonly nameEn: string;\n readonly validFromYear?: number;\n readonly validUntilYear?: number;\n}\n\n/**\n * Islamic Lunar Hijri holiday rule mapped to solar Gregorian years via Chronera Hijri adapters.\n * e.g., Eid al-Fitr (1 Shawwal = Month 10 Day 1), Eid al-Adha (10 Dhu al-Hijjah = Month 12 Day 10).\n */\nexport interface HijriHolidayRule {\n readonly type: \"hijri\";\n readonly id: string;\n readonly hijriMonth: number; // 1-12\n readonly hijriDay: number; // 1-30\n readonly durationDays?: number; // default 1\n readonly name: string;\n readonly nameEn: string;\n readonly validFromYear?: number;\n readonly validUntilYear?: number;\n}\n\n/**\n * Dynamic custom rule for arbitrary mathematical or cultural evaluations.\n */\nexport interface CustomHolidayRule {\n readonly type: \"custom\";\n readonly id: string;\n readonly name: string;\n readonly nameEn: string;\n readonly evaluate: (year: number) => readonly PublicHoliday[];\n}\n\nexport type HolidayRule =\n | FixedHolidayRule\n | FloatingHolidayRule\n | EasterHolidayRule\n | HijriHolidayRule\n | CustomHolidayRule;\n\n/**\n * Evaluated public holiday representation.\n */\nexport interface PublicHoliday {\n readonly id: string;\n readonly date: LocalDate;\n readonly name: string;\n readonly nameEn: string;\n readonly country: CountryCode | (string & {});\n readonly isObserved: boolean;\n readonly originalDate?: LocalDate;\n}\n\n/**\n * Complete country holiday calendar definition.\n */\nexport interface HolidayCalendar {\n readonly country: CountryCode | (string & {});\n readonly countryName?: string;\n readonly defaultWeekendDays?: readonly number[]; // 1 = Mon ... 7 = Sun\n readonly rules: readonly HolidayRule[];\n}\n\n/**\n * Options for holiday queries.\n */\nexport interface HolidayOptions {\n /** Include substituted/observed holidays when falling on weekends (default: true) */\n readonly includeObserved?: boolean;\n /** Additional custom holidays to include */\n readonly additionalHolidays?: readonly LocalDate[];\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,11 @@ export { createChronera } from "./create-chronera.js";
|
|
|
2
2
|
export { compareInstants, compareLocalDates, sameAbsoluteDate, sameCalendarDate, } from "./operations/compare.js";
|
|
3
3
|
export { getAbsoluteDay, isBefore, isAfter, isEqual, isSameDay, isBetween, isToday, addDays, subtractDays, addMonths, subtractMonths, addYears, subtractYears, diffInDays, startOfMonth, endOfMonth, startOfYear, endOfYear, } from "./operations/convenience.js";
|
|
4
4
|
export { startOfDay, endOfDay, isPast, isFuture, addHours, subtractHours, addMinutes, subtractMinutes, addSeconds, subtractSeconds, } from "./operations/time-convenience.js";
|
|
5
|
-
export { isWeekend, isWeekday, addBusinessDays, subtractBusinessDays, diffInBusinessDays, } from "./operations/business-days.js";
|
|
5
|
+
export { isWeekend, isWeekday, isBusinessDay, addBusinessDays, subtractBusinessDays, diffInBusinessDays, } from "./operations/business-days.js";
|
|
6
|
+
export { isPublicHoliday, getPublicHolidays, getHolidayDetails, } from "./operations/holidays.js";
|
|
7
|
+
export { registerHolidayCalendar, getHolidayCalendar, resolveAnnualHolidays, calculateEasterSunday, calculateGoodFriday, calculateEasterMonday, calculateAscensionDay, calculateWhitMonday, BUILT_IN_HOLIDAYS, thailandHolidays, japanHolidays, saudiArabiaHolidays, uaeHolidays, iranHolidays, taiwanHolidays, indiaHolidays, singaporeHolidays, unitedStatesHolidays, unitedKingdomHolidays, germanyHolidays, franceHolidays, australiaHolidays, chinaHolidays, hongKongHolidays, } from "./holidays/index.js";
|
|
8
|
+
export type { CountryCode, PublicHoliday, HolidayCalendar, HolidayRule, HolidayOptions, ObservedRollRule, } from "./holidays/types.js";
|
|
9
|
+
export type { BusinessDaysOptions } from "./operations/business-days.js";
|
|
6
10
|
export { formatInTimeZone, getTimeZoneOffset, isSameTimeZone, } from "./operations/timezone.js";
|
|
7
11
|
export { convertCalendarDate } from "./operations/convert-calendar-date.js";
|
|
8
12
|
export { daysInMonth, getCalendarCapabilities, isLeapYear, isValidCalendarDate, } from "./operations/validate.js";
|
|
@@ -15,7 +19,7 @@ export { parseInstant, parseLocalDate, safeParseInstant, safeParseLocalDate, } f
|
|
|
15
19
|
export { instantFromDate, instantFromEpochMilliseconds, instantFromEpochSeconds, } from "./core/instant.js";
|
|
16
20
|
export { getRuntimeCapabilities } from "./runtime/capabilities.js";
|
|
17
21
|
export { calendarDate } from "./core/calendar-date.js";
|
|
18
|
-
export { localDate } from "./core/local-date.js";
|
|
22
|
+
export { localDate, createLocalDate } from "./core/local-date.js";
|
|
19
23
|
export { localTime } from "./core/local-time.js";
|
|
20
24
|
export { localDateTime } from "./core/local-date-time.js";
|
|
21
25
|
export { dateRange } from "./core/range.js";
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,9 @@ export { createChronera } from "./create-chronera.js";
|
|
|
2
2
|
export { compareInstants, compareLocalDates, sameAbsoluteDate, sameCalendarDate, } from "./operations/compare.js";
|
|
3
3
|
export { getAbsoluteDay, isBefore, isAfter, isEqual, isSameDay, isBetween, isToday, addDays, subtractDays, addMonths, subtractMonths, addYears, subtractYears, diffInDays, startOfMonth, endOfMonth, startOfYear, endOfYear, } from "./operations/convenience.js";
|
|
4
4
|
export { startOfDay, endOfDay, isPast, isFuture, addHours, subtractHours, addMinutes, subtractMinutes, addSeconds, subtractSeconds, } from "./operations/time-convenience.js";
|
|
5
|
-
export { isWeekend, isWeekday, addBusinessDays, subtractBusinessDays, diffInBusinessDays, } from "./operations/business-days.js";
|
|
5
|
+
export { isWeekend, isWeekday, isBusinessDay, addBusinessDays, subtractBusinessDays, diffInBusinessDays, } from "./operations/business-days.js";
|
|
6
|
+
export { isPublicHoliday, getPublicHolidays, getHolidayDetails, } from "./operations/holidays.js";
|
|
7
|
+
export { registerHolidayCalendar, getHolidayCalendar, resolveAnnualHolidays, calculateEasterSunday, calculateGoodFriday, calculateEasterMonday, calculateAscensionDay, calculateWhitMonday, BUILT_IN_HOLIDAYS, thailandHolidays, japanHolidays, saudiArabiaHolidays, uaeHolidays, iranHolidays, taiwanHolidays, indiaHolidays, singaporeHolidays, unitedStatesHolidays, unitedKingdomHolidays, germanyHolidays, franceHolidays, australiaHolidays, chinaHolidays, hongKongHolidays, } from "./holidays/index.js";
|
|
6
8
|
export { formatInTimeZone, getTimeZoneOffset, isSameTimeZone, } from "./operations/timezone.js";
|
|
7
9
|
export { convertCalendarDate } from "./operations/convert-calendar-date.js";
|
|
8
10
|
export { daysInMonth, getCalendarCapabilities, isLeapYear, isValidCalendarDate, } from "./operations/validate.js";
|
|
@@ -15,7 +17,7 @@ export { parseInstant, parseLocalDate, safeParseInstant, safeParseLocalDate, } f
|
|
|
15
17
|
export { instantFromDate, instantFromEpochMilliseconds, instantFromEpochSeconds, } from "./core/instant.js";
|
|
16
18
|
export { getRuntimeCapabilities } from "./runtime/capabilities.js";
|
|
17
19
|
export { calendarDate } from "./core/calendar-date.js";
|
|
18
|
-
export { localDate } from "./core/local-date.js";
|
|
20
|
+
export { localDate, createLocalDate } from "./core/local-date.js";
|
|
19
21
|
export { localTime } from "./core/local-time.js";
|
|
20
22
|
export { localDateTime } from "./core/local-date-time.js";
|
|
21
23
|
export { dateRange } from "./core/range.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,cAAc,EACd,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAS,EACT,SAAS,EACT,OAAO,EACP,OAAO,EACP,YAAY,EACZ,SAAS,EACT,cAAc,EACd,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,GACV,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,UAAU,EACV,eAAe,EACf,UAAU,EACV,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,SAAS,EACT,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,UAAU,EACV,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EACL,UAAU,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,4BAA4B,EAC5B,uCAAuC,EACvC,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,8BAA8B,EAC9B,sBAAsB,EACtB,0BAA0B,EAC1B,6BAA6B,EAC7B,6BAA6B,EAC7B,sBAAsB,EACtB,6BAA6B,EAC7B,4BAA4B,EAC5B,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,8BAA8B,EAC9B,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { createChronera } from \"./create-chronera.js\";\n\nexport {\n compareInstants,\n compareLocalDates,\n sameAbsoluteDate,\n sameCalendarDate,\n} from \"./operations/compare.js\";\n\nexport {\n getAbsoluteDay,\n isBefore,\n isAfter,\n isEqual,\n isSameDay,\n isBetween,\n isToday,\n addDays,\n subtractDays,\n addMonths,\n subtractMonths,\n addYears,\n subtractYears,\n diffInDays,\n startOfMonth,\n endOfMonth,\n startOfYear,\n endOfYear,\n} from \"./operations/convenience.js\";\n\nexport {\n startOfDay,\n endOfDay,\n isPast,\n isFuture,\n addHours,\n subtractHours,\n addMinutes,\n subtractMinutes,\n addSeconds,\n subtractSeconds,\n} from \"./operations/time-convenience.js\";\n\nexport {\n isWeekend,\n isWeekday,\n isBusinessDay,\n addBusinessDays,\n subtractBusinessDays,\n diffInBusinessDays,\n} from \"./operations/business-days.js\";\n\nexport {\n isPublicHoliday,\n getPublicHolidays,\n getHolidayDetails,\n} from \"./operations/holidays.js\";\n\nexport {\n registerHolidayCalendar,\n getHolidayCalendar,\n resolveAnnualHolidays,\n calculateEasterSunday,\n calculateGoodFriday,\n calculateEasterMonday,\n calculateAscensionDay,\n calculateWhitMonday,\n BUILT_IN_HOLIDAYS,\n thailandHolidays,\n japanHolidays,\n saudiArabiaHolidays,\n uaeHolidays,\n iranHolidays,\n taiwanHolidays,\n indiaHolidays,\n singaporeHolidays,\n unitedStatesHolidays,\n unitedKingdomHolidays,\n germanyHolidays,\n franceHolidays,\n australiaHolidays,\n chinaHolidays,\n hongKongHolidays,\n} from \"./holidays/index.js\";\n\nexport type {\n CountryCode,\n PublicHoliday,\n HolidayCalendar,\n HolidayRule,\n HolidayOptions,\n ObservedRollRule,\n} from \"./holidays/types.js\";\n\nexport type { BusinessDaysOptions } from \"./operations/business-days.js\";\n\nexport {\n formatInTimeZone,\n getTimeZoneOffset,\n isSameTimeZone,\n} from \"./operations/timezone.js\";\n\nexport { convertCalendarDate } from \"./operations/convert-calendar-date.js\";\n\nexport {\n daysInMonth,\n getCalendarCapabilities,\n isLeapYear,\n isValidCalendarDate,\n} from \"./operations/validate.js\";\n\nexport { getIsoWeek, formatIsoWeek } from \"./operations/iso-week.js\";\n\nexport {\n getDayOfYear,\n getDayOfYearWithRegistry,\n formatOrdinalDate,\n} from \"./operations/day-of-year.js\";\n\nexport {\n toJulianDayNumber,\n toModifiedJulianDay,\n localDateFromJulianDayNumber,\n localDateFromModifiedJulianDay,\n} from \"./operations/julian-day.js\";\n\nexport { getQuarter, getFiscalYear } from \"./operations/fiscal.js\";\n\nexport {\n formatDate,\n formatDateRange,\n formatDateTime,\n formatRelative,\n formatTime,\n formatWithPattern,\n formatRfc2822,\n formatJapaneseOfficialPreset,\n formatJapaneseOfficialWithWeekdayPreset,\n formatTaiwanOfficialPreset,\n formatThaiOfficialPreset,\n formatArabicGregorianPreset,\n formatArabicHijriPreset,\n formatChineseShortPreset,\n formatChineseStandardPreset,\n formatChineseWithWeekdayPreset,\n formatFrenchLongPreset,\n formatFrenchStandardPreset,\n formatFrenchWithWeekdayPreset,\n formatGermanDinStandardPreset,\n formatGermanLongPreset,\n formatGermanWithWeekdayPreset,\n formatJapaneseEraShortPreset,\n formatJapaneseSeirekiPreset,\n formatSpanishLongPreset,\n formatSpanishStandardPreset,\n formatSpanishWithWeekdayPreset,\n formatThaiShortDatePreset,\n formatThaiSlashDatePreset,\n formatUkLongPreset,\n formatUkStandardPreset,\n formatUkWithWeekdayPreset,\n formatUsLongPreset,\n formatUsStandardPreset,\n formatUsWithWeekdayPreset,\n} from \"./format/index.js\";\n\nexport {\n parseInstant,\n parseLocalDate,\n safeParseInstant,\n safeParseLocalDate,\n} from \"./parse/index.js\";\n\nexport {\n instantFromDate,\n instantFromEpochMilliseconds,\n instantFromEpochSeconds,\n} from \"./core/instant.js\";\n\nexport { getRuntimeCapabilities } from \"./runtime/capabilities.js\";\n\nexport { calendarDate } from \"./core/calendar-date.js\";\n\nexport { localDate, createLocalDate } from \"./core/local-date.js\";\n\nexport { localTime } from \"./core/local-time.js\";\n\nexport { localDateTime } from \"./core/local-date-time.js\";\n\nexport { dateRange } from \"./core/range.js\";\n\nexport {\n ChroneraError,\n ChroneraParseError,\n ChroneraRangeError,\n ChroneraUnsupportedError,\n} from \"./errors/index.js\";\n\nexport type {\n BuiltInCalendarId,\n CalendarPlugin,\n CalendarCapabilities,\n CalendarConversionMetadata,\n CalendarConversionResult,\n CalendarDate,\n CalendarId,\n ChroneraErrorCode,\n ChroneraConfig,\n ChroneraInstance,\n ChroneraIssue,\n Comparison,\n ConvertCalendarOptions,\n DateOrCalendarDate,\n DateRange,\n DayOfYearFields,\n Duration,\n EraId,\n FiscalFields,\n FiscalOptions,\n FormatDateBaseOptions,\n FormatDateInput,\n FormatDateOptions,\n FormatDateRangeOptions,\n FormatDateTimeOptions,\n FormatInTimeZoneOptions,\n FormatRelativeOptions,\n FormatTimeOptions,\n Instant,\n IntervalInclusivity,\n IsoWeekFields,\n LocalDate,\n LocalDateTime,\n LocalTime,\n LocaleId,\n MonthCode,\n NumberingSystemId,\n PatternFormatOptions,\n ParseInstantOptions,\n ParseLocalDateOptions,\n PresetName,\n QuarterNumber,\n ResolvedChroneraOptions,\n Rfc2822Options,\n RuntimeCapabilities,\n SafeParseResult,\n SameTimeZoneOptions,\n TimeZoneId,\n TimeZoneOffsetFormat,\n TimeZoneOffsetInfo,\n TimeOrDateTimeOrInstant,\n ZonedDateTime,\n} from \"./public-types.js\";\n"]}
|
|
@@ -1,27 +1,43 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CountryCode, HolidayCalendar } from "../holidays/types.js";
|
|
2
|
+
import type { DateOrCalendarDate, LocalDate } from "../public-types.js";
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
* Works across all calendars (Gregorian, Thai Buddhist, Japanese, Hijri, etc.).
|
|
4
|
+
* Options for business days arithmetic and queries.
|
|
5
5
|
*/
|
|
6
|
-
export
|
|
6
|
+
export interface BusinessDaysOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Country code (e.g. "TH", "JP", "US") or custom HolidayCalendar or holiday date list or holiday predicate.
|
|
9
|
+
*/
|
|
10
|
+
readonly holidays?: CountryCode | string | HolidayCalendar | readonly DateOrCalendarDate[] | ((date: LocalDate) => boolean);
|
|
11
|
+
/**
|
|
12
|
+
* Custom weekend days (defaults to [6, 7], or [4, 5] if country is Iran, etc.).
|
|
13
|
+
*/
|
|
14
|
+
readonly weekendDays?: readonly number[];
|
|
15
|
+
}
|
|
7
16
|
/**
|
|
8
|
-
* Returns true if the specified date falls on a
|
|
9
|
-
*
|
|
17
|
+
* Returns true if the specified date falls on a weekend.
|
|
18
|
+
* Supports custom weekend definitions per country (e.g. Thursday & Friday for Iran).
|
|
10
19
|
*/
|
|
11
|
-
export declare function
|
|
20
|
+
export declare function isWeekend(date: DateOrCalendarDate, options?: Pick<BusinessDaysOptions, "weekendDays" | "holidays">): boolean;
|
|
12
21
|
/**
|
|
13
|
-
*
|
|
22
|
+
* Returns true if the specified date falls on a weekday.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isWeekday(date: DateOrCalendarDate, options?: Pick<BusinessDaysOptions, "weekendDays" | "holidays">): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Returns true if the specified date is a business day (neither weekend nor public holiday).
|
|
27
|
+
*/
|
|
28
|
+
export declare function isBusinessDay(date: DateOrCalendarDate, options?: BusinessDaysOptions): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Adds business days to a LocalDate or CalendarDate, skipping weekends and optionally public holidays.
|
|
14
31
|
* Supports positive, negative, and zero day additions.
|
|
15
|
-
* Uses O(1) mathematical week advancement
|
|
32
|
+
* Uses O(1) mathematical week advancement when no holidays are provided, or iterative evaluation with holiday constraints.
|
|
16
33
|
*/
|
|
17
|
-
export declare function addBusinessDays<T extends DateOrCalendarDate>(date: T, amount: number): T;
|
|
34
|
+
export declare function addBusinessDays<T extends DateOrCalendarDate>(date: T, amount: number, options?: BusinessDaysOptions): T;
|
|
18
35
|
/**
|
|
19
|
-
* Subtracts business days from a LocalDate or CalendarDate, skipping weekends.
|
|
36
|
+
* Subtracts business days from a LocalDate or CalendarDate, skipping weekends and optional holidays.
|
|
20
37
|
*/
|
|
21
|
-
export declare function subtractBusinessDays<T extends DateOrCalendarDate>(date: T, amount: number): T;
|
|
38
|
+
export declare function subtractBusinessDays<T extends DateOrCalendarDate>(date: T, amount: number, options?: BusinessDaysOptions): T;
|
|
22
39
|
/**
|
|
23
40
|
* Returns the signed count of business days between two dates (left - right).
|
|
24
41
|
* Positive if left is after right, negative if left is before right, 0 if identical.
|
|
25
|
-
* Works across all calendar systems with O(1) mathematical week acceleration.
|
|
26
42
|
*/
|
|
27
|
-
export declare function diffInBusinessDays(left: DateOrCalendarDate, right: DateOrCalendarDate): number;
|
|
43
|
+
export declare function diffInBusinessDays(left: DateOrCalendarDate, right: DateOrCalendarDate, options?: BusinessDaysOptions): number;
|