soff-date 1.1.0 → 1.2.0
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/README.md +15 -0
- package/dist/core/algorithms/easter.cjs +1 -1
- package/dist/core/algorithms/easter.cjs.map +1 -1
- package/dist/core/algorithms/easter.js +1 -1
- package/dist/core/algorithms/easter.js.map +1 -1
- package/dist/core/algorithms/nth-weekday.cjs +1 -1
- package/dist/core/algorithms/nth-weekday.cjs.map +1 -1
- package/dist/core/algorithms/nth-weekday.js +1 -1
- package/dist/core/algorithms/nth-weekday.js.map +1 -1
- package/dist/core/algorithms/shifts.cjs +1 -1
- package/dist/core/algorithms/shifts.cjs.map +1 -1
- package/dist/core/algorithms/shifts.js +1 -1
- package/dist/core/algorithms/shifts.js.map +1 -1
- package/dist/core/engine.cjs +1 -1
- package/dist/core/engine.cjs.map +1 -1
- package/dist/core/engine.js +1 -1
- package/dist/core/engine.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.cjs +1 -1
- package/dist/locales/ar.cjs.map +1 -1
- package/dist/locales/ar.js +1 -1
- package/dist/locales/ar.js.map +1 -1
- package/dist/locales/br.cjs +1 -1
- package/dist/locales/br.cjs.map +1 -1
- package/dist/locales/br.js +1 -1
- package/dist/locales/br.js.map +1 -1
- package/dist/locales/co.cjs +1 -1
- package/dist/locales/co.cjs.map +1 -1
- package/dist/locales/co.js +1 -1
- package/dist/locales/co.js.map +1 -1
- package/dist/locales/index.cjs +1 -1
- package/dist/locales/index.cjs.map +1 -1
- package/dist/locales/index.js +1 -1
- package/dist/locales/index.js.map +1 -1
- package/dist/locales/mx.cjs +1 -1
- package/dist/locales/mx.cjs.map +1 -1
- package/dist/locales/mx.js +1 -1
- package/dist/locales/mx.js.map +1 -1
- package/dist/locales/us.cjs +1 -1
- package/dist/locales/us.cjs.map +1 -1
- package/dist/locales/us.js +1 -1
- package/dist/locales/us.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -241,6 +241,12 @@ applyShift(new Date('2026-07-04'), 'observedUS');
|
|
|
241
241
|
// → { date: Date(2026-07-03), shifted: true }
|
|
242
242
|
```
|
|
243
243
|
|
|
244
|
+
`getNthWeekday()` returns `Invalid Date` when the requested occurrence does not exist in the target month or when the input is out of range.
|
|
245
|
+
|
|
246
|
+
`getEasterSunday()` returns `Invalid Date` for unsupported years outside the Gregorian calendar (`< 1583`) and for non-integer years.
|
|
247
|
+
|
|
248
|
+
`applyShift()` preserves `Invalid Date` inputs and returns `shifted: false` instead of marking a move on invalid data.
|
|
249
|
+
|
|
244
250
|
## Bundle Size
|
|
245
251
|
|
|
246
252
|
| Import | Size (minified) |
|
|
@@ -274,6 +280,8 @@ interface Holiday {
|
|
|
274
280
|
}
|
|
275
281
|
```
|
|
276
282
|
|
|
283
|
+
`year` must be an integer. Non-integer values return an empty array.
|
|
284
|
+
|
|
277
285
|
### `isHoliday(date, options?)`
|
|
278
286
|
|
|
279
287
|
Returns holiday info if the date is a holiday, `null` otherwise.
|
|
@@ -326,6 +334,13 @@ diffBusinessDays(new Date('2025-01-06'), new Date('2025-01-10'));
|
|
|
326
334
|
// → 4
|
|
327
335
|
```
|
|
328
336
|
|
|
337
|
+
Invalid inputs are handled safely:
|
|
338
|
+
|
|
339
|
+
- `isBusinessDay(invalidDate)` returns `false`
|
|
340
|
+
- `businessDays(invalidDate, amount)` returns `Invalid Date`
|
|
341
|
+
- `businessDays(date, Infinity)` returns `Invalid Date`
|
|
342
|
+
- `diffBusinessDays(invalidDate, date)` returns `NaN`
|
|
343
|
+
|
|
329
344
|
## Types
|
|
330
345
|
|
|
331
346
|
```typescript
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';function
|
|
1
|
+
'use strict';function i(t){if(!Number.isInteger(t)||t<1583)return new Date(Number.NaN);let s=t%19,o=Math.floor(t/100),e=t%100,a=Math.floor(o/4),f=o%4,h=Math.floor((o+8)/25),l=Math.floor((o-h+1)/3),n=(19*s+o-a-l+15)%30,u=Math.floor(e/4),M=e%4,c=(32+2*f+2*u-n-M)%7,r=Math.floor((s+11*n+22*c)/451),m=Math.floor((n+c-7*r+114)/31),b=(n+c-7*r+114)%31+1;return new Date(Date.UTC(t,m-1,b))}exports.getEasterSunday=i;//# sourceMappingURL=easter.cjs.map
|
|
2
2
|
//# sourceMappingURL=easter.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/algorithms/easter.ts"],"names":["getEasterSunday","year","a","b","c","d","e","f","g","h","i","k","l","m","month","day"],"mappings":"aAIO,SAASA,CAAAA,CAAgBC,
|
|
1
|
+
{"version":3,"sources":["../../../src/core/algorithms/easter.ts"],"names":["getEasterSunday","year","a","b","c","d","e","f","g","h","i","k","l","m","month","day"],"mappings":"aAIO,SAASA,CAAAA,CAAgBC,CAAAA,CAAoB,CAClD,GAAI,CAAC,MAAA,CAAO,SAAA,CAAUA,CAAI,CAAA,EAAKA,CAAAA,CAAO,IAAA,CACpC,OAAO,IAAI,KAAK,MAAA,CAAO,GAAG,CAAA,CAG5B,IAAMC,CAAAA,CAAID,CAAAA,CAAO,EAAA,CACXE,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMF,CAAAA,CAAO,GAAG,CAAA,CACzBG,CAAAA,CAAIH,EAAO,GAAA,CACXI,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMF,CAAAA,CAAI,CAAC,CAAA,CACpBG,CAAAA,CAAIH,CAAAA,CAAI,CAAA,CACRI,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAA,CAAOJ,CAAAA,CAAI,CAAA,EAAK,EAAE,CAAA,CAC3BK,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAA,CAAOL,CAAAA,CAAII,CAAAA,CAAI,CAAA,EAAK,CAAC,CAAA,CAC9BE,CAAAA,CAAAA,CAAK,EAAA,CAAKP,CAAAA,CAAIC,CAAAA,CAAIE,CAAAA,CAAIG,EAAI,EAAA,EAAM,EAAA,CAChCE,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMN,CAAAA,CAAI,CAAC,CAAA,CACpBO,CAAAA,CAAIP,CAAAA,CAAI,CAAA,CACRQ,CAAAA,CAAAA,CAAK,EAAA,CAAK,CAAA,CAAIN,EAAI,CAAA,CAAII,CAAAA,CAAID,CAAAA,CAAIE,CAAAA,EAAK,CAAA,CACnCE,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAA,CAAOX,CAAAA,CAAI,EAAA,CAAKO,CAAAA,CAAI,EAAA,CAAKG,CAAAA,EAAK,GAAG,EAC1CE,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAA,CAAOL,CAAAA,CAAIG,CAAAA,CAAI,CAAA,CAAIC,CAAAA,CAAI,GAAA,EAAO,EAAE,CAAA,CAC7CE,CAAAA,CAAAA,CAAQN,CAAAA,CAAIG,CAAAA,CAAI,CAAA,CAAIC,CAAAA,CAAI,GAAA,EAAO,EAAA,CAAM,CAAA,CAE3C,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAIZ,CAAAA,CAAMa,CAAAA,CAAQ,CAAA,CAAGC,CAAG,CAAC,CAChD","file":"easter.cjs","sourcesContent":["/**\n * Calculates Easter Sunday (Meeus/Jones/Butcher algorithm)\n * Valid for Gregorian calendar (1583+)\n */\nexport function getEasterSunday(year: number): Date {\n if (!Number.isInteger(year) || year < 1583) {\n return new Date(Number.NaN);\n }\n\n const a = year % 19;\n const b = Math.floor(year / 100);\n const c = year % 100;\n const d = Math.floor(b / 4);\n const e = b % 4;\n const f = Math.floor((b + 8) / 25);\n const g = Math.floor((b - f + 1) / 3);\n const h = (19 * a + b - d - g + 15) % 30;\n const i = Math.floor(c / 4);\n const k = c % 4;\n const l = (32 + 2 * e + 2 * i - h - k) % 7;\n const m = Math.floor((a + 11 * h + 22 * l) / 451);\n const month = Math.floor((h + l - 7 * m + 114) / 31);\n const day = ((h + l - 7 * m + 114) % 31) + 1;\n\n return new Date(Date.UTC(year, month - 1, day));\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
1
|
+
function i(t){if(!Number.isInteger(t)||t<1583)return new Date(Number.NaN);let s=t%19,o=Math.floor(t/100),e=t%100,a=Math.floor(o/4),f=o%4,h=Math.floor((o+8)/25),l=Math.floor((o-h+1)/3),n=(19*s+o-a-l+15)%30,u=Math.floor(e/4),M=e%4,c=(32+2*f+2*u-n-M)%7,r=Math.floor((s+11*n+22*c)/451),m=Math.floor((n+c-7*r+114)/31),b=(n+c-7*r+114)%31+1;return new Date(Date.UTC(t,m-1,b))}export{i as getEasterSunday};//# sourceMappingURL=easter.js.map
|
|
2
2
|
//# sourceMappingURL=easter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/algorithms/easter.ts"],"names":["getEasterSunday","year","a","b","c","d","e","f","g","h","i","k","l","m","month","day"],"mappings":"AAIO,SAASA,CAAAA,CAAgBC,
|
|
1
|
+
{"version":3,"sources":["../../../src/core/algorithms/easter.ts"],"names":["getEasterSunday","year","a","b","c","d","e","f","g","h","i","k","l","m","month","day"],"mappings":"AAIO,SAASA,CAAAA,CAAgBC,CAAAA,CAAoB,CAClD,GAAI,CAAC,MAAA,CAAO,SAAA,CAAUA,CAAI,CAAA,EAAKA,CAAAA,CAAO,IAAA,CACpC,OAAO,IAAI,KAAK,MAAA,CAAO,GAAG,CAAA,CAG5B,IAAMC,CAAAA,CAAID,CAAAA,CAAO,EAAA,CACXE,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMF,CAAAA,CAAO,GAAG,CAAA,CACzBG,CAAAA,CAAIH,EAAO,GAAA,CACXI,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMF,CAAAA,CAAI,CAAC,CAAA,CACpBG,CAAAA,CAAIH,CAAAA,CAAI,CAAA,CACRI,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAA,CAAOJ,CAAAA,CAAI,CAAA,EAAK,EAAE,CAAA,CAC3BK,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAA,CAAOL,CAAAA,CAAII,CAAAA,CAAI,CAAA,EAAK,CAAC,CAAA,CAC9BE,CAAAA,CAAAA,CAAK,EAAA,CAAKP,CAAAA,CAAIC,CAAAA,CAAIE,CAAAA,CAAIG,EAAI,EAAA,EAAM,EAAA,CAChCE,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMN,CAAAA,CAAI,CAAC,CAAA,CACpBO,CAAAA,CAAIP,CAAAA,CAAI,CAAA,CACRQ,CAAAA,CAAAA,CAAK,EAAA,CAAK,CAAA,CAAIN,EAAI,CAAA,CAAII,CAAAA,CAAID,CAAAA,CAAIE,CAAAA,EAAK,CAAA,CACnCE,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAA,CAAOX,CAAAA,CAAI,EAAA,CAAKO,CAAAA,CAAI,EAAA,CAAKG,CAAAA,EAAK,GAAG,EAC1CE,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAA,CAAOL,CAAAA,CAAIG,CAAAA,CAAI,CAAA,CAAIC,CAAAA,CAAI,GAAA,EAAO,EAAE,CAAA,CAC7CE,CAAAA,CAAAA,CAAQN,CAAAA,CAAIG,CAAAA,CAAI,CAAA,CAAIC,CAAAA,CAAI,GAAA,EAAO,EAAA,CAAM,CAAA,CAE3C,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAIZ,CAAAA,CAAMa,CAAAA,CAAQ,CAAA,CAAGC,CAAG,CAAC,CAChD","file":"easter.js","sourcesContent":["/**\n * Calculates Easter Sunday (Meeus/Jones/Butcher algorithm)\n * Valid for Gregorian calendar (1583+)\n */\nexport function getEasterSunday(year: number): Date {\n if (!Number.isInteger(year) || year < 1583) {\n return new Date(Number.NaN);\n }\n\n const a = year % 19;\n const b = Math.floor(year / 100);\n const c = year % 100;\n const d = Math.floor(b / 4);\n const e = b % 4;\n const f = Math.floor((b + 8) / 25);\n const g = Math.floor((b - f + 1) / 3);\n const h = (19 * a + b - d - g + 15) % 30;\n const i = Math.floor(c / 4);\n const k = c % 4;\n const l = (32 + 2 * e + 2 * i - h - k) % 7;\n const m = Math.floor((a + 11 * h + 22 * l) / 451);\n const month = Math.floor((h + l - 7 * m + 114) / 31);\n const day = ((h + l - 7 * m + 114) % 31) + 1;\n\n return new Date(Date.UTC(year, month - 1, day));\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';function
|
|
1
|
+
'use strict';function i(t,e,s,n){if(!Number.isInteger(t)||!Number.isInteger(e)||e<1||e>12||!Number.isInteger(s)||s<0||s>6||!Number.isInteger(n)||n===0)return new Date(Number.NaN);let D=e-1;if(n>0){let N=new Date(Date.UTC(t,e-1,1)).getUTCDay(),u=1+(s-N+7)%7+(n-1)*7,r=new Date(Date.UTC(t,e-1,u));return r.getUTCMonth()===D?r:new Date(Number.NaN)}else {let a=new Date(Date.UTC(t,e,0)),c=(a.getUTCDay()-s+7)%7,u=a.getUTCDate()-c+(n+1)*7,r=new Date(Date.UTC(t,e-1,u));return r.getUTCMonth()===D?r:new Date(Number.NaN)}}exports.getNthWeekday=i;//# sourceMappingURL=nth-weekday.cjs.map
|
|
2
2
|
//# sourceMappingURL=nth-weekday.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/algorithms/nth-weekday.ts"],"names":["getNthWeekday","year","month","weekday","
|
|
1
|
+
{"version":3,"sources":["../../../src/core/algorithms/nth-weekday.ts"],"names":["getNthWeekday","year","month","weekday","expectedMonth","firstWeekday","day","result","last","diff"],"mappings":"aAOO,SAASA,CAAAA,CAAcC,CAAAA,CAAcC,CAAAA,CAAeC,CAAAA,CAAiB,EAAiB,CAC3F,GACE,CAAC,MAAA,CAAO,SAAA,CAAUF,CAAI,CAAA,EACtB,CAAC,OAAO,SAAA,CAAUC,CAAK,CAAA,EACvBA,CAAAA,CAAQ,CAAA,EACRA,CAAAA,CAAQ,EAAA,EACR,CAAC,OAAO,SAAA,CAAUC,CAAO,CAAA,EACzBA,CAAAA,CAAU,GACVA,CAAAA,CAAU,CAAA,EACV,CAAC,MAAA,CAAO,UAAU,CAAC,CAAA,EACnB,CAAA,GAAM,CAAA,CAEN,OAAO,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,CAG5B,IAAMC,CAAAA,CAAgBF,CAAAA,CAAQ,EAE9B,GAAI,CAAA,CAAI,CAAA,CAAG,CAGT,IAAMG,CAAAA,CADQ,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAIJ,CAAAA,CAAMC,CAAAA,CAAQ,CAAA,CAAG,CAAC,CAAC,CAAA,CACxB,SAAA,EAAU,CAE/BI,EAAM,CAAA,CAAA,CADEH,CAAAA,CAAUE,CAAAA,CAAe,CAAA,EAAK,GACpB,CAAA,CAAI,CAAA,EAAK,CAAA,CAC3BE,CAAAA,CAAS,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAIN,EAAMC,CAAAA,CAAQ,CAAA,CAAGI,CAAG,CAAC,CAAA,CACtD,OAAOC,CAAAA,CAAO,WAAA,KAAkBH,CAAAA,CAAgBG,CAAAA,CAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAC9E,CAAA,KAAO,CAGL,IAAMC,CAAAA,CAAO,IAAI,IAAA,CAAK,KAAK,GAAA,CAAIP,CAAAA,CAAMC,CAAAA,CAAO,CAAC,CAAC,CAAA,CAExCO,CAAAA,CAAAA,CADcD,CAAAA,CAAK,SAAA,EAAU,CACPL,CAAAA,CAAU,CAAA,EAAK,CAAA,CACrCG,EAAME,CAAAA,CAAK,UAAA,EAAW,CAAIC,CAAAA,CAAAA,CAAQ,EAAI,CAAA,EAAK,CAAA,CAC3CF,CAAAA,CAAS,IAAI,KAAK,IAAA,CAAK,GAAA,CAAIN,CAAAA,CAAMC,CAAAA,CAAQ,CAAA,CAAGI,CAAG,CAAC,CAAA,CACtD,OAAOC,CAAAA,CAAO,WAAA,EAAY,GAAMH,CAAAA,CAAgBG,EAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAC9E,CACF","file":"nth-weekday.cjs","sourcesContent":["/**\n * Calculates the Nth weekday of a month\n * @param year - Year\n * @param month - Month (1-12)\n * @param weekday - Weekday (0=Sun, 1=Mon, ..., 6=Sat)\n * @param n - Occurrence (1=first, 2=second, -1=last)\n */\nexport function getNthWeekday(year: number, month: number, weekday: number, n: number): Date {\n if (\n !Number.isInteger(year) ||\n !Number.isInteger(month) ||\n month < 1 ||\n month > 12 ||\n !Number.isInteger(weekday) ||\n weekday < 0 ||\n weekday > 6 ||\n !Number.isInteger(n) ||\n n === 0\n ) {\n return new Date(Number.NaN);\n }\n\n const expectedMonth = month - 1;\n\n if (n > 0) {\n // From start of month\n const first = new Date(Date.UTC(year, month - 1, 1));\n const firstWeekday = first.getUTCDay();\n const diff = (weekday - firstWeekday + 7) % 7;\n const day = 1 + diff + (n - 1) * 7;\n const result = new Date(Date.UTC(year, month - 1, day));\n return result.getUTCMonth() === expectedMonth ? result : new Date(Number.NaN);\n } else {\n // From end of month (n = -1 = last)\n // month is 1-12. Date.UTC(year, month, 0) gives the last day of month 'month'\n const last = new Date(Date.UTC(year, month, 0));\n const lastWeekday = last.getUTCDay();\n const diff = (lastWeekday - weekday + 7) % 7;\n const day = last.getUTCDate() - diff + (n + 1) * 7;\n const result = new Date(Date.UTC(year, month - 1, day));\n return result.getUTCMonth() === expectedMonth ? result : new Date(Number.NaN);\n }\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
1
|
+
function i(t,e,s,n){if(!Number.isInteger(t)||!Number.isInteger(e)||e<1||e>12||!Number.isInteger(s)||s<0||s>6||!Number.isInteger(n)||n===0)return new Date(Number.NaN);let D=e-1;if(n>0){let N=new Date(Date.UTC(t,e-1,1)).getUTCDay(),u=1+(s-N+7)%7+(n-1)*7,r=new Date(Date.UTC(t,e-1,u));return r.getUTCMonth()===D?r:new Date(Number.NaN)}else {let a=new Date(Date.UTC(t,e,0)),c=(a.getUTCDay()-s+7)%7,u=a.getUTCDate()-c+(n+1)*7,r=new Date(Date.UTC(t,e-1,u));return r.getUTCMonth()===D?r:new Date(Number.NaN)}}export{i as getNthWeekday};//# sourceMappingURL=nth-weekday.js.map
|
|
2
2
|
//# sourceMappingURL=nth-weekday.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/algorithms/nth-weekday.ts"],"names":["getNthWeekday","year","month","weekday","
|
|
1
|
+
{"version":3,"sources":["../../../src/core/algorithms/nth-weekday.ts"],"names":["getNthWeekday","year","month","weekday","expectedMonth","firstWeekday","day","result","last","diff"],"mappings":"AAOO,SAASA,CAAAA,CAAcC,CAAAA,CAAcC,CAAAA,CAAeC,CAAAA,CAAiB,EAAiB,CAC3F,GACE,CAAC,MAAA,CAAO,SAAA,CAAUF,CAAI,CAAA,EACtB,CAAC,OAAO,SAAA,CAAUC,CAAK,CAAA,EACvBA,CAAAA,CAAQ,CAAA,EACRA,CAAAA,CAAQ,EAAA,EACR,CAAC,OAAO,SAAA,CAAUC,CAAO,CAAA,EACzBA,CAAAA,CAAU,GACVA,CAAAA,CAAU,CAAA,EACV,CAAC,MAAA,CAAO,UAAU,CAAC,CAAA,EACnB,CAAA,GAAM,CAAA,CAEN,OAAO,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,CAG5B,IAAMC,CAAAA,CAAgBF,CAAAA,CAAQ,EAE9B,GAAI,CAAA,CAAI,CAAA,CAAG,CAGT,IAAMG,CAAAA,CADQ,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAIJ,CAAAA,CAAMC,CAAAA,CAAQ,CAAA,CAAG,CAAC,CAAC,CAAA,CACxB,SAAA,EAAU,CAE/BI,EAAM,CAAA,CAAA,CADEH,CAAAA,CAAUE,CAAAA,CAAe,CAAA,EAAK,GACpB,CAAA,CAAI,CAAA,EAAK,CAAA,CAC3BE,CAAAA,CAAS,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAIN,EAAMC,CAAAA,CAAQ,CAAA,CAAGI,CAAG,CAAC,CAAA,CACtD,OAAOC,CAAAA,CAAO,WAAA,KAAkBH,CAAAA,CAAgBG,CAAAA,CAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAC9E,CAAA,KAAO,CAGL,IAAMC,CAAAA,CAAO,IAAI,IAAA,CAAK,KAAK,GAAA,CAAIP,CAAAA,CAAMC,CAAAA,CAAO,CAAC,CAAC,CAAA,CAExCO,CAAAA,CAAAA,CADcD,CAAAA,CAAK,SAAA,EAAU,CACPL,CAAAA,CAAU,CAAA,EAAK,CAAA,CACrCG,EAAME,CAAAA,CAAK,UAAA,EAAW,CAAIC,CAAAA,CAAAA,CAAQ,EAAI,CAAA,EAAK,CAAA,CAC3CF,CAAAA,CAAS,IAAI,KAAK,IAAA,CAAK,GAAA,CAAIN,CAAAA,CAAMC,CAAAA,CAAQ,CAAA,CAAGI,CAAG,CAAC,CAAA,CACtD,OAAOC,CAAAA,CAAO,WAAA,EAAY,GAAMH,CAAAA,CAAgBG,EAAS,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAC9E,CACF","file":"nth-weekday.js","sourcesContent":["/**\n * Calculates the Nth weekday of a month\n * @param year - Year\n * @param month - Month (1-12)\n * @param weekday - Weekday (0=Sun, 1=Mon, ..., 6=Sat)\n * @param n - Occurrence (1=first, 2=second, -1=last)\n */\nexport function getNthWeekday(year: number, month: number, weekday: number, n: number): Date {\n if (\n !Number.isInteger(year) ||\n !Number.isInteger(month) ||\n month < 1 ||\n month > 12 ||\n !Number.isInteger(weekday) ||\n weekday < 0 ||\n weekday > 6 ||\n !Number.isInteger(n) ||\n n === 0\n ) {\n return new Date(Number.NaN);\n }\n\n const expectedMonth = month - 1;\n\n if (n > 0) {\n // From start of month\n const first = new Date(Date.UTC(year, month - 1, 1));\n const firstWeekday = first.getUTCDay();\n const diff = (weekday - firstWeekday + 7) % 7;\n const day = 1 + diff + (n - 1) * 7;\n const result = new Date(Date.UTC(year, month - 1, day));\n return result.getUTCMonth() === expectedMonth ? result : new Date(Number.NaN);\n } else {\n // From end of month (n = -1 = last)\n // month is 1-12. Date.UTC(year, month, 0) gives the last day of month 'month'\n const last = new Date(Date.UTC(year, month, 0));\n const lastWeekday = last.getUTCDay();\n const diff = (lastWeekday - weekday + 7) % 7;\n const day = last.getUTCDate() - diff + (n + 1) * 7;\n const result = new Date(Date.UTC(year, month - 1, day));\n return result.getUTCMonth() === expectedMonth ? result : new Date(Number.NaN);\n }\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';function
|
|
1
|
+
'use strict';function f(e){return e instanceof Date&&Number.isFinite(e.getTime())}function n(e,i){if(!f(e))return {date:e,shifted:false};let t=e.getUTCDay();if(i==="none")return {date:e,shifted:false};let s=new Date(e);switch(i){case "emiliani":case "nextMonday":{if(t===1)return {date:e,shifted:false};let a=(8-t)%7;s.setUTCDate(e.getUTCDate()+a);break}case "observedUS":if(t===0)s.setUTCDate(e.getUTCDate()+1);else if(t===6)s.setUTCDate(e.getUTCDate()-1);else return {date:e,shifted:false};break;case "nearestMonday":if(t===2)s.setUTCDate(e.getUTCDate()-1);else if(t===3)s.setUTCDate(e.getUTCDate()-2);else if(t===4)s.setUTCDate(e.getUTCDate()+4);else if(t===5)s.setUTCDate(e.getUTCDate()+3);else return {date:e,shifted:false};break;default:return {date:e,shifted:false}}return {date:s,shifted:true}}exports.applyShift=n;//# sourceMappingURL=shifts.cjs.map
|
|
2
2
|
//# sourceMappingURL=shifts.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/algorithms/shifts.ts"],"names":["
|
|
1
|
+
{"version":3,"sources":["../../../src/core/algorithms/shifts.ts"],"names":["isValidDate","date","applyShift","rule","day","result","daysToNextMonday"],"mappings":"aAEA,SAASA,EAAYC,CAAAA,CAAqB,CACxC,OAAOA,CAAAA,YAAgB,IAAA,EAAQ,OAAO,QAAA,CAASA,CAAAA,CAAK,OAAA,EAAS,CAC/D,CAMO,SAASC,EAAWD,CAAAA,CAAYE,CAAAA,CAAmD,CACxF,GAAI,CAACH,CAAAA,CAAYC,CAAI,EACnB,OAAO,CAAE,KAAAA,CAAAA,CAAM,OAAA,CAAS,KAAM,CAAA,CAGhC,IAAMG,CAAAA,CAAMH,CAAAA,CAAK,WAAU,CAE3B,GAAIE,IAAS,MAAA,CACX,OAAO,CAAE,IAAA,CAAAF,CAAAA,CAAM,OAAA,CAAS,KAAM,EAGhC,IAAMI,CAAAA,CAAS,IAAI,IAAA,CAAKJ,CAAI,EAE5B,OAAQE,CAAAA,EACN,KAAK,WACL,KAAK,YAAA,CAAc,CAEjB,GAAIC,CAAAA,GAAQ,EACV,OAAO,CAAE,IAAA,CAAAH,CAAAA,CAAM,QAAS,KAAM,CAAA,CAOhC,IAAMK,CAAAA,CAAAA,CAAoB,CAAA,CAAIF,GAAO,CAAA,CACrCC,CAAAA,CAAO,WAAWJ,CAAAA,CAAK,UAAA,GAAeK,CAAgB,CAAA,CACtD,KACF,CAEA,KAAK,aAEH,GAAIF,CAAAA,GAAQ,CAAA,CAEVC,CAAAA,CAAO,WAAWJ,CAAAA,CAAK,UAAA,GAAe,CAAC,CAAA,CAAA,KAAA,GAC9BG,IAAQ,CAAA,CAEjBC,CAAAA,CAAO,UAAA,CAAWJ,CAAAA,CAAK,YAAW,CAAI,CAAC,OAEvC,OAAO,CAAE,KAAAA,CAAAA,CAAM,OAAA,CAAS,KAAM,CAAA,CAEhC,MAEF,KAAK,eAAA,CAIH,GAAIG,CAAAA,GAAQ,CAAA,CAEVC,EAAO,UAAA,CAAWJ,CAAAA,CAAK,UAAA,EAAW,CAAI,CAAC,CAAA,CAAA,KAAA,GAC9BG,CAAAA,GAAQ,EAEjBC,CAAAA,CAAO,UAAA,CAAWJ,EAAK,UAAA,EAAW,CAAI,CAAC,CAAA,CAAA,KAAA,GAC9BG,IAAQ,CAAA,CAEjBC,CAAAA,CAAO,WAAWJ,CAAAA,CAAK,UAAA,GAAe,CAAC,CAAA,CAAA,KAAA,GAC9BG,CAAAA,GAAQ,CAAA,CAEjBC,EAAO,UAAA,CAAWJ,CAAAA,CAAK,YAAW,CAAI,CAAC,OAEvC,OAAO,CAAE,IAAA,CAAAA,CAAAA,CAAM,QAAS,KAAM,CAAA,CAEhC,MAEF,QACE,OAAO,CAAE,IAAA,CAAAA,CAAAA,CAAM,QAAS,KAAM,CAClC,CAEA,OAAO,CAAE,KAAMI,CAAAA,CAAQ,OAAA,CAAS,IAAK,CACvC","file":"shifts.cjs","sourcesContent":["import type { ShiftRule } from '../types';\n\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && Number.isFinite(date.getTime());\n}\n\n/**\n * Applies a shift rule to a date\n * @returns { date: Date, shifted: boolean }\n */\nexport function applyShift(date: Date, rule: ShiftRule): { date: Date; shifted: boolean } {\n if (!isValidDate(date)) {\n return { date, shifted: false };\n }\n\n const day = date.getUTCDay(); // 0=Sun, 6=Sat\n\n if (rule === 'none') {\n return { date, shifted: false };\n }\n\n const result = new Date(date);\n\n switch (rule) {\n case 'emiliani':\n case 'nextMonday': {\n // If it's already Monday (1), do not move\n if (day === 1) {\n return { date, shifted: false };\n }\n // Move to next Monday\n // (8 - day) % 7 gives days until next Monday\n // Ex: Sun(0) -> (8-0)%7 = 1 (+1 day) -> Mon\n // Ex: Sat(6) -> (8-6)%7 = 2 (+2 days) -> Mon\n // Ex: Wed(3) -> (8-3)%7 = 5 (+5 days) -> Mon\n const daysToNextMonday = (8 - day) % 7;\n result.setUTCDate(date.getUTCDate() + daysToNextMonday);\n break;\n }\n\n case 'observedUS':\n // Only affects weekends\n if (day === 0) {\n // Sunday -> Monday (+1)\n result.setUTCDate(date.getUTCDate() + 1);\n } else if (day === 6) {\n // Saturday -> Friday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else {\n return { date, shifted: false };\n }\n break;\n\n case 'nearestMonday':\n // Argentina rule:\n // Tue/Wed -> Previous Monday\n // Thu/Fri -> Next Monday\n if (day === 2) {\n // Tuesday -> Monday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else if (day === 3) {\n // Wednesday -> Monday (-2)\n result.setUTCDate(date.getUTCDate() - 2);\n } else if (day === 4) {\n // Thursday -> Next Monday (+4)\n result.setUTCDate(date.getUTCDate() + 4);\n } else if (day === 5) {\n // Friday -> Next Monday (+3)\n result.setUTCDate(date.getUTCDate() + 3);\n } else {\n return { date, shifted: false };\n }\n break;\n\n default:\n return { date, shifted: false };\n }\n\n return { date: result, shifted: true };\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
1
|
+
function f(e){return e instanceof Date&&Number.isFinite(e.getTime())}function n(e,i){if(!f(e))return {date:e,shifted:false};let t=e.getUTCDay();if(i==="none")return {date:e,shifted:false};let s=new Date(e);switch(i){case "emiliani":case "nextMonday":{if(t===1)return {date:e,shifted:false};let a=(8-t)%7;s.setUTCDate(e.getUTCDate()+a);break}case "observedUS":if(t===0)s.setUTCDate(e.getUTCDate()+1);else if(t===6)s.setUTCDate(e.getUTCDate()-1);else return {date:e,shifted:false};break;case "nearestMonday":if(t===2)s.setUTCDate(e.getUTCDate()-1);else if(t===3)s.setUTCDate(e.getUTCDate()-2);else if(t===4)s.setUTCDate(e.getUTCDate()+4);else if(t===5)s.setUTCDate(e.getUTCDate()+3);else return {date:e,shifted:false};break;default:return {date:e,shifted:false}}return {date:s,shifted:true}}export{n as applyShift};//# sourceMappingURL=shifts.js.map
|
|
2
2
|
//# sourceMappingURL=shifts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/algorithms/shifts.ts"],"names":["
|
|
1
|
+
{"version":3,"sources":["../../../src/core/algorithms/shifts.ts"],"names":["isValidDate","date","applyShift","rule","day","result","daysToNextMonday"],"mappings":"AAEA,SAASA,EAAYC,CAAAA,CAAqB,CACxC,OAAOA,CAAAA,YAAgB,IAAA,EAAQ,OAAO,QAAA,CAASA,CAAAA,CAAK,OAAA,EAAS,CAC/D,CAMO,SAASC,EAAWD,CAAAA,CAAYE,CAAAA,CAAmD,CACxF,GAAI,CAACH,CAAAA,CAAYC,CAAI,EACnB,OAAO,CAAE,KAAAA,CAAAA,CAAM,OAAA,CAAS,KAAM,CAAA,CAGhC,IAAMG,CAAAA,CAAMH,CAAAA,CAAK,WAAU,CAE3B,GAAIE,IAAS,MAAA,CACX,OAAO,CAAE,IAAA,CAAAF,CAAAA,CAAM,OAAA,CAAS,KAAM,EAGhC,IAAMI,CAAAA,CAAS,IAAI,IAAA,CAAKJ,CAAI,EAE5B,OAAQE,CAAAA,EACN,KAAK,WACL,KAAK,YAAA,CAAc,CAEjB,GAAIC,CAAAA,GAAQ,EACV,OAAO,CAAE,IAAA,CAAAH,CAAAA,CAAM,QAAS,KAAM,CAAA,CAOhC,IAAMK,CAAAA,CAAAA,CAAoB,CAAA,CAAIF,GAAO,CAAA,CACrCC,CAAAA,CAAO,WAAWJ,CAAAA,CAAK,UAAA,GAAeK,CAAgB,CAAA,CACtD,KACF,CAEA,KAAK,aAEH,GAAIF,CAAAA,GAAQ,CAAA,CAEVC,CAAAA,CAAO,WAAWJ,CAAAA,CAAK,UAAA,GAAe,CAAC,CAAA,CAAA,KAAA,GAC9BG,IAAQ,CAAA,CAEjBC,CAAAA,CAAO,UAAA,CAAWJ,CAAAA,CAAK,YAAW,CAAI,CAAC,OAEvC,OAAO,CAAE,KAAAA,CAAAA,CAAM,OAAA,CAAS,KAAM,CAAA,CAEhC,MAEF,KAAK,eAAA,CAIH,GAAIG,CAAAA,GAAQ,CAAA,CAEVC,EAAO,UAAA,CAAWJ,CAAAA,CAAK,UAAA,EAAW,CAAI,CAAC,CAAA,CAAA,KAAA,GAC9BG,CAAAA,GAAQ,EAEjBC,CAAAA,CAAO,UAAA,CAAWJ,EAAK,UAAA,EAAW,CAAI,CAAC,CAAA,CAAA,KAAA,GAC9BG,IAAQ,CAAA,CAEjBC,CAAAA,CAAO,WAAWJ,CAAAA,CAAK,UAAA,GAAe,CAAC,CAAA,CAAA,KAAA,GAC9BG,CAAAA,GAAQ,CAAA,CAEjBC,EAAO,UAAA,CAAWJ,CAAAA,CAAK,YAAW,CAAI,CAAC,OAEvC,OAAO,CAAE,IAAA,CAAAA,CAAAA,CAAM,QAAS,KAAM,CAAA,CAEhC,MAEF,QACE,OAAO,CAAE,IAAA,CAAAA,CAAAA,CAAM,QAAS,KAAM,CAClC,CAEA,OAAO,CAAE,KAAMI,CAAAA,CAAQ,OAAA,CAAS,IAAK,CACvC","file":"shifts.js","sourcesContent":["import type { ShiftRule } from '../types';\n\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && Number.isFinite(date.getTime());\n}\n\n/**\n * Applies a shift rule to a date\n * @returns { date: Date, shifted: boolean }\n */\nexport function applyShift(date: Date, rule: ShiftRule): { date: Date; shifted: boolean } {\n if (!isValidDate(date)) {\n return { date, shifted: false };\n }\n\n const day = date.getUTCDay(); // 0=Sun, 6=Sat\n\n if (rule === 'none') {\n return { date, shifted: false };\n }\n\n const result = new Date(date);\n\n switch (rule) {\n case 'emiliani':\n case 'nextMonday': {\n // If it's already Monday (1), do not move\n if (day === 1) {\n return { date, shifted: false };\n }\n // Move to next Monday\n // (8 - day) % 7 gives days until next Monday\n // Ex: Sun(0) -> (8-0)%7 = 1 (+1 day) -> Mon\n // Ex: Sat(6) -> (8-6)%7 = 2 (+2 days) -> Mon\n // Ex: Wed(3) -> (8-3)%7 = 5 (+5 days) -> Mon\n const daysToNextMonday = (8 - day) % 7;\n result.setUTCDate(date.getUTCDate() + daysToNextMonday);\n break;\n }\n\n case 'observedUS':\n // Only affects weekends\n if (day === 0) {\n // Sunday -> Monday (+1)\n result.setUTCDate(date.getUTCDate() + 1);\n } else if (day === 6) {\n // Saturday -> Friday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else {\n return { date, shifted: false };\n }\n break;\n\n case 'nearestMonday':\n // Argentina rule:\n // Tue/Wed -> Previous Monday\n // Thu/Fri -> Next Monday\n if (day === 2) {\n // Tuesday -> Monday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else if (day === 3) {\n // Wednesday -> Monday (-2)\n result.setUTCDate(date.getUTCDate() - 2);\n } else if (day === 4) {\n // Thursday -> Next Monday (+4)\n result.setUTCDate(date.getUTCDate() + 4);\n } else if (day === 5) {\n // Friday -> Next Monday (+3)\n result.setUTCDate(date.getUTCDate() + 3);\n } else {\n return { date, shifted: false };\n }\n break;\n\n default:\n return { date, shifted: false };\n }\n\n return { date: result, shifted: true };\n}\n"]}
|
package/dist/core/engine.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';function y(
|
|
1
|
+
'use strict';function y(e){if(!Number.isInteger(e)||e<1583)return new Date(Number.NaN);let n=e%19,r=Math.floor(e/100),t=e%100,s=Math.floor(r/4),i=r%4,o=Math.floor((r+8)/25),u=Math.floor((r-o+1)/3),a=(19*n+r-s-u+15)%30,l=Math.floor(t/4),m=t%4,c=(32+2*i+2*l-a-m)%7,g=Math.floor((n+11*a+22*c)/451),C=Math.floor((a+c-7*g+114)/31),U=(a+c-7*g+114)%31+1;return new Date(Date.UTC(e,C-1,U))}function T(e,n,r,t){if(!Number.isInteger(e)||!Number.isInteger(n)||n<1||n>12||!Number.isInteger(r)||r<0||r>6||!Number.isInteger(t)||t===0)return new Date(Number.NaN);let s=n-1;if(t>0){let o=new Date(Date.UTC(e,n-1,1)).getUTCDay(),a=1+(r-o+7)%7+(t-1)*7,l=new Date(Date.UTC(e,n-1,a));return l.getUTCMonth()===s?l:new Date(Number.NaN)}else {let i=new Date(Date.UTC(e,n,0)),u=(i.getUTCDay()-r+7)%7,a=i.getUTCDate()-u+(t+1)*7,l=new Date(Date.UTC(e,n-1,a));return l.getUTCMonth()===s?l:new Date(Number.NaN)}}function b(e){return e instanceof Date&&Number.isFinite(e.getTime())}function h(e,n){if(!b(e))return {date:e,shifted:false};let r=e.getUTCDay();if(n==="none")return {date:e,shifted:false};let t=new Date(e);switch(n){case "emiliani":case "nextMonday":{if(r===1)return {date:e,shifted:false};let s=(8-r)%7;t.setUTCDate(e.getUTCDate()+s);break}case "observedUS":if(r===0)t.setUTCDate(e.getUTCDate()+1);else if(r===6)t.setUTCDate(e.getUTCDate()-1);else return {date:e,shifted:false};break;case "nearestMonday":if(r===2)t.setUTCDate(e.getUTCDate()-1);else if(r===3)t.setUTCDate(e.getUTCDate()-2);else if(r===4)t.setUTCDate(e.getUTCDate()+4);else if(r===5)t.setUTCDate(e.getUTCDate()+3);else return {date:e,shifted:false};break;default:return {date:e,shifted:false}}return {date:t,shifted:true}}function N(e,n){switch(e.type){case "fixed":return new Date(Date.UTC(n,e.month-1,e.day));case "nthWeekday":return T(n,e.month,e.weekday,e.n);case "easterRelative":{let r=y(n),t=new Date(r);return t.setUTCDate(r.getUTCDate()+e.offset),t}case "custom":return e.calc(n)}}function d(e){try{return e.toISOString().split("T")[0]}catch{return ""}}function f(e){return e instanceof Date&&!Number.isNaN(e.getTime())}function D(e,n,r={}){return typeof n!="number"||!Number.isInteger(n)?[]:e.map(t=>{let s=N(t.rule,n);if(!s||!f(s))return null;let{date:i,shifted:o}=h(s,t.shift??"none");return f(i)?{date:d(i),key:t.key,name:r[t.key]??t.key,...o&&{isShifted:true}}:null}).filter(t=>t!==null).sort((t,s)=>t.date.localeCompare(s.date))}function S(e,n,r){if(!f(n))return null;let t=n.getUTCFullYear(),s=d(n);return s?D(e,t,r).find(o=>o.date===s)??null:null}function I(e,n,r){if(!f(n))return null;let t=d(n);if(!t)return null;let s=n.getUTCFullYear(),i=D(e,s,r),o=i.find(u=>u.date>=t);return o||(i=D(e,s+1,r),o=i[0]),o??null}exports.checkIsHoliday=S;exports.findNextHoliday=I;exports.resolveHolidays=D;//# sourceMappingURL=engine.cjs.map
|
|
2
2
|
//# sourceMappingURL=engine.cjs.map
|
package/dist/core/engine.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/algorithms/easter.ts","../../src/core/algorithms/nth-weekday.ts","../../src/core/algorithms/shifts.ts","../../src/core/engine.ts"],"names":["getEasterSunday","year","a","b","c","d","e","f","g","h","i","k","l","m","month","day","getNthWeekday","weekday","n","firstWeekday","last","diff","applyShift","date","rule","result","daysToNextMonday","resolveRule","easter","toISODate","isValidDate","resolveHolidays","definitions","names","def","rawDate","shifted","checkIsHoliday","isoDate","findNextHoliday","from","isoFrom","holidays","next"],"mappings":"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","file":"engine.cjs","sourcesContent":["/**\n * Calculates Easter Sunday (Meeus/Jones/Butcher algorithm)\n * Valid for Gregorian calendar (1583+)\n */\nexport function getEasterSunday(year: number): Date {\n const a = year % 19;\n const b = Math.floor(year / 100);\n const c = year % 100;\n const d = Math.floor(b / 4);\n const e = b % 4;\n const f = Math.floor((b + 8) / 25);\n const g = Math.floor((b - f + 1) / 3);\n const h = (19 * a + b - d - g + 15) % 30;\n const i = Math.floor(c / 4);\n const k = c % 4;\n const l = (32 + 2 * e + 2 * i - h - k) % 7;\n const m = Math.floor((a + 11 * h + 22 * l) / 451);\n const month = Math.floor((h + l - 7 * m + 114) / 31);\n const day = ((h + l - 7 * m + 114) % 31) + 1;\n\n return new Date(Date.UTC(year, month - 1, day));\n}\n","/**\n * Calculates the Nth weekday of a month\n * @param year - Year\n * @param month - Month (1-12)\n * @param weekday - Weekday (0=Sun, 1=Mon, ..., 6=Sat)\n * @param n - Occurrence (1=first, 2=second, -1=last)\n */\nexport function getNthWeekday(year: number, month: number, weekday: number, n: number): Date {\n if (n > 0) {\n // From start of month\n const first = new Date(Date.UTC(year, month - 1, 1));\n const firstWeekday = first.getUTCDay();\n const diff = (weekday - firstWeekday + 7) % 7;\n const day = 1 + diff + (n - 1) * 7;\n return new Date(Date.UTC(year, month - 1, day));\n } else {\n // From end of month (n = -1 = last)\n // month is 1-12. Date.UTC(year, month, 0) gives the last day of month 'month'\n const last = new Date(Date.UTC(year, month, 0));\n const lastWeekday = last.getUTCDay();\n const diff = (lastWeekday - weekday + 7) % 7;\n const day = last.getUTCDate() - diff + (n + 1) * 7;\n return new Date(Date.UTC(year, month - 1, day));\n }\n}\n","import type { ShiftRule } from '../types';\n\n/**\n * Applies a shift rule to a date\n * @returns { date: Date, shifted: boolean }\n */\nexport function applyShift(date: Date, rule: ShiftRule): { date: Date; shifted: boolean } {\n const day = date.getUTCDay(); // 0=Sun, 6=Sat\n\n if (rule === 'none') {\n return { date, shifted: false };\n }\n\n const result = new Date(date);\n\n switch (rule) {\n case 'emiliani':\n case 'nextMonday': {\n // If it's already Monday (1), do not move\n if (day === 1) {\n return { date, shifted: false };\n }\n // Move to next Monday\n // (8 - day) % 7 gives days until next Monday\n // Ex: Sun(0) -> (8-0)%7 = 1 (+1 day) -> Mon\n // Ex: Sat(6) -> (8-6)%7 = 2 (+2 days) -> Mon\n // Ex: Wed(3) -> (8-3)%7 = 5 (+5 days) -> Mon\n const daysToNextMonday = (8 - day) % 7;\n result.setUTCDate(date.getUTCDate() + daysToNextMonday);\n break;\n }\n\n case 'observedUS':\n // Only affects weekends\n if (day === 0) {\n // Sunday -> Monday (+1)\n result.setUTCDate(date.getUTCDate() + 1);\n } else if (day === 6) {\n // Saturday -> Friday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else {\n return { date, shifted: false };\n }\n break;\n\n case 'nearestMonday':\n // Argentina rule:\n // Tue/Wed -> Previous Monday\n // Thu/Fri -> Next Monday\n if (day === 2) {\n // Tuesday -> Monday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else if (day === 3) {\n // Wednesday -> Monday (-2)\n result.setUTCDate(date.getUTCDate() - 2);\n } else if (day === 4) {\n // Thursday -> Next Monday (+4)\n result.setUTCDate(date.getUTCDate() + 4);\n } else if (day === 5) {\n // Friday -> Next Monday (+3)\n result.setUTCDate(date.getUTCDate() + 3);\n } else {\n return { date, shifted: false };\n }\n break;\n\n default:\n return { date, shifted: false };\n }\n\n return { date: result, shifted: true };\n}\n","import type { HolidayDefinition, HolidayRule, Holiday } from './types';\nimport { getEasterSunday } from './algorithms/easter';\nimport { getNthWeekday } from './algorithms/nth-weekday';\nimport { applyShift } from './algorithms/shifts';\n\n/** Resolves a rule to a concrete date */\nfunction resolveRule(rule: HolidayRule, year: number): Date | null {\n switch (rule.type) {\n case 'fixed':\n return new Date(Date.UTC(year, rule.month - 1, rule.day));\n\n case 'nthWeekday':\n return getNthWeekday(year, rule.month, rule.weekday, rule.n);\n\n case 'easterRelative': {\n const easter = getEasterSunday(year);\n const result = new Date(easter);\n result.setUTCDate(easter.getUTCDate() + rule.offset);\n return result;\n }\n\n case 'custom':\n return rule.calc(year);\n }\n}\n\n/** Formats Date to ISO string (date only) */\nfunction toISODate(date: Date): string {\n try {\n return date.toISOString().split('T')[0];\n } catch {\n return '';\n }\n}\n\n/** Checks if a date is valid */\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && !Number.isNaN(date.getTime());\n}\n\n/** Generates holidays for a year */\nexport function resolveHolidays(\n definitions: HolidayDefinition[],\n year: number,\n names: Record<string, string> = {},\n): Holiday[] {\n if (typeof year !== 'number' || Number.isNaN(year)) {\n return [];\n }\n\n return definitions\n .map((def) => {\n const rawDate = resolveRule(def.rule, year);\n if (!rawDate || !isValidDate(rawDate)) return null;\n\n const { date, shifted } = applyShift(rawDate, def.shift ?? 'none');\n if (!isValidDate(date)) return null;\n\n return {\n date: toISODate(date),\n key: def.key,\n name: names[def.key] ?? def.key,\n ...(shifted && { isShifted: true }),\n };\n })\n .filter((h): h is Holiday => h !== null)\n .sort((a, b) => a.date.localeCompare(b.date));\n}\n\n/** Checks if a date is a holiday */\nexport function checkIsHoliday(\n definitions: HolidayDefinition[],\n date: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(date)) return null;\n\n const year = date.getUTCFullYear();\n const isoDate = toISODate(date);\n if (!isoDate) return null;\n\n const holidays = resolveHolidays(definitions, year, names);\n return holidays.find((h) => h.date === isoDate) ?? null;\n}\n\n/** Gets the next holiday from a date */\nexport function findNextHoliday(\n definitions: HolidayDefinition[],\n from: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(from)) return null;\n\n const isoFrom = toISODate(from);\n if (!isoFrom) return null;\n\n const year = from.getUTCFullYear();\n\n // Search in current year\n let holidays = resolveHolidays(definitions, year, names);\n let next = holidays.find((h) => h.date >= isoFrom);\n\n // If none, search in next year\n if (!next) {\n holidays = resolveHolidays(definitions, year + 1, names);\n next = holidays[0];\n }\n\n return next ?? null;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/algorithms/easter.ts","../../src/core/algorithms/nth-weekday.ts","../../src/core/algorithms/shifts.ts","../../src/core/engine.ts"],"names":["getEasterSunday","year","a","b","c","d","e","f","g","h","i","k","l","m","month","day","getNthWeekday","weekday","n","expectedMonth","firstWeekday","result","last","diff","isValidDate","date","applyShift","rule","daysToNextMonday","resolveRule","easter","toISODate","resolveHolidays","definitions","names","def","rawDate","shifted","checkIsHoliday","isoDate","findNextHoliday","from","isoFrom","holidays","next"],"mappings":"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","file":"engine.cjs","sourcesContent":["/**\n * Calculates Easter Sunday (Meeus/Jones/Butcher algorithm)\n * Valid for Gregorian calendar (1583+)\n */\nexport function getEasterSunday(year: number): Date {\n if (!Number.isInteger(year) || year < 1583) {\n return new Date(Number.NaN);\n }\n\n const a = year % 19;\n const b = Math.floor(year / 100);\n const c = year % 100;\n const d = Math.floor(b / 4);\n const e = b % 4;\n const f = Math.floor((b + 8) / 25);\n const g = Math.floor((b - f + 1) / 3);\n const h = (19 * a + b - d - g + 15) % 30;\n const i = Math.floor(c / 4);\n const k = c % 4;\n const l = (32 + 2 * e + 2 * i - h - k) % 7;\n const m = Math.floor((a + 11 * h + 22 * l) / 451);\n const month = Math.floor((h + l - 7 * m + 114) / 31);\n const day = ((h + l - 7 * m + 114) % 31) + 1;\n\n return new Date(Date.UTC(year, month - 1, day));\n}\n","/**\n * Calculates the Nth weekday of a month\n * @param year - Year\n * @param month - Month (1-12)\n * @param weekday - Weekday (0=Sun, 1=Mon, ..., 6=Sat)\n * @param n - Occurrence (1=first, 2=second, -1=last)\n */\nexport function getNthWeekday(year: number, month: number, weekday: number, n: number): Date {\n if (\n !Number.isInteger(year) ||\n !Number.isInteger(month) ||\n month < 1 ||\n month > 12 ||\n !Number.isInteger(weekday) ||\n weekday < 0 ||\n weekday > 6 ||\n !Number.isInteger(n) ||\n n === 0\n ) {\n return new Date(Number.NaN);\n }\n\n const expectedMonth = month - 1;\n\n if (n > 0) {\n // From start of month\n const first = new Date(Date.UTC(year, month - 1, 1));\n const firstWeekday = first.getUTCDay();\n const diff = (weekday - firstWeekday + 7) % 7;\n const day = 1 + diff + (n - 1) * 7;\n const result = new Date(Date.UTC(year, month - 1, day));\n return result.getUTCMonth() === expectedMonth ? result : new Date(Number.NaN);\n } else {\n // From end of month (n = -1 = last)\n // month is 1-12. Date.UTC(year, month, 0) gives the last day of month 'month'\n const last = new Date(Date.UTC(year, month, 0));\n const lastWeekday = last.getUTCDay();\n const diff = (lastWeekday - weekday + 7) % 7;\n const day = last.getUTCDate() - diff + (n + 1) * 7;\n const result = new Date(Date.UTC(year, month - 1, day));\n return result.getUTCMonth() === expectedMonth ? result : new Date(Number.NaN);\n }\n}\n","import type { ShiftRule } from '../types';\n\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && Number.isFinite(date.getTime());\n}\n\n/**\n * Applies a shift rule to a date\n * @returns { date: Date, shifted: boolean }\n */\nexport function applyShift(date: Date, rule: ShiftRule): { date: Date; shifted: boolean } {\n if (!isValidDate(date)) {\n return { date, shifted: false };\n }\n\n const day = date.getUTCDay(); // 0=Sun, 6=Sat\n\n if (rule === 'none') {\n return { date, shifted: false };\n }\n\n const result = new Date(date);\n\n switch (rule) {\n case 'emiliani':\n case 'nextMonday': {\n // If it's already Monday (1), do not move\n if (day === 1) {\n return { date, shifted: false };\n }\n // Move to next Monday\n // (8 - day) % 7 gives days until next Monday\n // Ex: Sun(0) -> (8-0)%7 = 1 (+1 day) -> Mon\n // Ex: Sat(6) -> (8-6)%7 = 2 (+2 days) -> Mon\n // Ex: Wed(3) -> (8-3)%7 = 5 (+5 days) -> Mon\n const daysToNextMonday = (8 - day) % 7;\n result.setUTCDate(date.getUTCDate() + daysToNextMonday);\n break;\n }\n\n case 'observedUS':\n // Only affects weekends\n if (day === 0) {\n // Sunday -> Monday (+1)\n result.setUTCDate(date.getUTCDate() + 1);\n } else if (day === 6) {\n // Saturday -> Friday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else {\n return { date, shifted: false };\n }\n break;\n\n case 'nearestMonday':\n // Argentina rule:\n // Tue/Wed -> Previous Monday\n // Thu/Fri -> Next Monday\n if (day === 2) {\n // Tuesday -> Monday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else if (day === 3) {\n // Wednesday -> Monday (-2)\n result.setUTCDate(date.getUTCDate() - 2);\n } else if (day === 4) {\n // Thursday -> Next Monday (+4)\n result.setUTCDate(date.getUTCDate() + 4);\n } else if (day === 5) {\n // Friday -> Next Monday (+3)\n result.setUTCDate(date.getUTCDate() + 3);\n } else {\n return { date, shifted: false };\n }\n break;\n\n default:\n return { date, shifted: false };\n }\n\n return { date: result, shifted: true };\n}\n","import type { HolidayDefinition, HolidayRule, Holiday } from './types';\nimport { getEasterSunday } from './algorithms/easter';\nimport { getNthWeekday } from './algorithms/nth-weekday';\nimport { applyShift } from './algorithms/shifts';\n\n/** Resolves a rule to a concrete date */\nfunction resolveRule(rule: HolidayRule, year: number): Date | null {\n switch (rule.type) {\n case 'fixed':\n return new Date(Date.UTC(year, rule.month - 1, rule.day));\n\n case 'nthWeekday':\n return getNthWeekday(year, rule.month, rule.weekday, rule.n);\n\n case 'easterRelative': {\n const easter = getEasterSunday(year);\n const result = new Date(easter);\n result.setUTCDate(easter.getUTCDate() + rule.offset);\n return result;\n }\n\n case 'custom':\n return rule.calc(year);\n }\n}\n\n/** Formats Date to ISO string (date only) */\nfunction toISODate(date: Date): string {\n try {\n return date.toISOString().split('T')[0];\n } catch {\n return '';\n }\n}\n\n/** Checks if a date is valid */\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && !Number.isNaN(date.getTime());\n}\n\n/** Generates holidays for a year */\nexport function resolveHolidays(\n definitions: HolidayDefinition[],\n year: number,\n names: Record<string, string> = {},\n): Holiday[] {\n if (typeof year !== 'number' || !Number.isInteger(year)) {\n return [];\n }\n\n return definitions\n .map((def) => {\n const rawDate = resolveRule(def.rule, year);\n if (!rawDate || !isValidDate(rawDate)) return null;\n\n const { date, shifted } = applyShift(rawDate, def.shift ?? 'none');\n if (!isValidDate(date)) return null;\n\n return {\n date: toISODate(date),\n key: def.key,\n name: names[def.key] ?? def.key,\n ...(shifted && { isShifted: true }),\n };\n })\n .filter((h): h is Holiday => h !== null)\n .sort((a, b) => a.date.localeCompare(b.date));\n}\n\n/** Checks if a date is a holiday */\nexport function checkIsHoliday(\n definitions: HolidayDefinition[],\n date: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(date)) return null;\n\n const year = date.getUTCFullYear();\n const isoDate = toISODate(date);\n if (!isoDate) return null;\n\n const holidays = resolveHolidays(definitions, year, names);\n return holidays.find((h) => h.date === isoDate) ?? null;\n}\n\n/** Gets the next holiday from a date */\nexport function findNextHoliday(\n definitions: HolidayDefinition[],\n from: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(from)) return null;\n\n const isoFrom = toISODate(from);\n if (!isoFrom) return null;\n\n const year = from.getUTCFullYear();\n\n // Search in current year\n let holidays = resolveHolidays(definitions, year, names);\n let next = holidays.find((h) => h.date >= isoFrom);\n\n // If none, search in next year\n if (!next) {\n holidays = resolveHolidays(definitions, year + 1, names);\n next = holidays[0];\n }\n\n return next ?? null;\n}\n"]}
|
package/dist/core/engine.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function y(
|
|
1
|
+
function y(e){if(!Number.isInteger(e)||e<1583)return new Date(Number.NaN);let n=e%19,r=Math.floor(e/100),t=e%100,s=Math.floor(r/4),i=r%4,o=Math.floor((r+8)/25),u=Math.floor((r-o+1)/3),a=(19*n+r-s-u+15)%30,l=Math.floor(t/4),m=t%4,c=(32+2*i+2*l-a-m)%7,g=Math.floor((n+11*a+22*c)/451),C=Math.floor((a+c-7*g+114)/31),U=(a+c-7*g+114)%31+1;return new Date(Date.UTC(e,C-1,U))}function T(e,n,r,t){if(!Number.isInteger(e)||!Number.isInteger(n)||n<1||n>12||!Number.isInteger(r)||r<0||r>6||!Number.isInteger(t)||t===0)return new Date(Number.NaN);let s=n-1;if(t>0){let o=new Date(Date.UTC(e,n-1,1)).getUTCDay(),a=1+(r-o+7)%7+(t-1)*7,l=new Date(Date.UTC(e,n-1,a));return l.getUTCMonth()===s?l:new Date(Number.NaN)}else {let i=new Date(Date.UTC(e,n,0)),u=(i.getUTCDay()-r+7)%7,a=i.getUTCDate()-u+(t+1)*7,l=new Date(Date.UTC(e,n-1,a));return l.getUTCMonth()===s?l:new Date(Number.NaN)}}function b(e){return e instanceof Date&&Number.isFinite(e.getTime())}function h(e,n){if(!b(e))return {date:e,shifted:false};let r=e.getUTCDay();if(n==="none")return {date:e,shifted:false};let t=new Date(e);switch(n){case "emiliani":case "nextMonday":{if(r===1)return {date:e,shifted:false};let s=(8-r)%7;t.setUTCDate(e.getUTCDate()+s);break}case "observedUS":if(r===0)t.setUTCDate(e.getUTCDate()+1);else if(r===6)t.setUTCDate(e.getUTCDate()-1);else return {date:e,shifted:false};break;case "nearestMonday":if(r===2)t.setUTCDate(e.getUTCDate()-1);else if(r===3)t.setUTCDate(e.getUTCDate()-2);else if(r===4)t.setUTCDate(e.getUTCDate()+4);else if(r===5)t.setUTCDate(e.getUTCDate()+3);else return {date:e,shifted:false};break;default:return {date:e,shifted:false}}return {date:t,shifted:true}}function N(e,n){switch(e.type){case "fixed":return new Date(Date.UTC(n,e.month-1,e.day));case "nthWeekday":return T(n,e.month,e.weekday,e.n);case "easterRelative":{let r=y(n),t=new Date(r);return t.setUTCDate(r.getUTCDate()+e.offset),t}case "custom":return e.calc(n)}}function d(e){try{return e.toISOString().split("T")[0]}catch{return ""}}function f(e){return e instanceof Date&&!Number.isNaN(e.getTime())}function D(e,n,r={}){return typeof n!="number"||!Number.isInteger(n)?[]:e.map(t=>{let s=N(t.rule,n);if(!s||!f(s))return null;let{date:i,shifted:o}=h(s,t.shift??"none");return f(i)?{date:d(i),key:t.key,name:r[t.key]??t.key,...o&&{isShifted:true}}:null}).filter(t=>t!==null).sort((t,s)=>t.date.localeCompare(s.date))}function S(e,n,r){if(!f(n))return null;let t=n.getUTCFullYear(),s=d(n);return s?D(e,t,r).find(o=>o.date===s)??null:null}function I(e,n,r){if(!f(n))return null;let t=d(n);if(!t)return null;let s=n.getUTCFullYear(),i=D(e,s,r),o=i.find(u=>u.date>=t);return o||(i=D(e,s+1,r),o=i[0]),o??null}export{S as checkIsHoliday,I as findNextHoliday,D as resolveHolidays};//# sourceMappingURL=engine.js.map
|
|
2
2
|
//# sourceMappingURL=engine.js.map
|
package/dist/core/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/algorithms/easter.ts","../../src/core/algorithms/nth-weekday.ts","../../src/core/algorithms/shifts.ts","../../src/core/engine.ts"],"names":["getEasterSunday","year","a","b","c","d","e","f","g","h","i","k","l","m","month","day","getNthWeekday","weekday","n","firstWeekday","last","diff","applyShift","date","rule","result","daysToNextMonday","resolveRule","easter","toISODate","isValidDate","resolveHolidays","definitions","names","def","rawDate","shifted","checkIsHoliday","isoDate","findNextHoliday","from","isoFrom","holidays","next"],"mappings":"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","file":"engine.js","sourcesContent":["/**\n * Calculates Easter Sunday (Meeus/Jones/Butcher algorithm)\n * Valid for Gregorian calendar (1583+)\n */\nexport function getEasterSunday(year: number): Date {\n const a = year % 19;\n const b = Math.floor(year / 100);\n const c = year % 100;\n const d = Math.floor(b / 4);\n const e = b % 4;\n const f = Math.floor((b + 8) / 25);\n const g = Math.floor((b - f + 1) / 3);\n const h = (19 * a + b - d - g + 15) % 30;\n const i = Math.floor(c / 4);\n const k = c % 4;\n const l = (32 + 2 * e + 2 * i - h - k) % 7;\n const m = Math.floor((a + 11 * h + 22 * l) / 451);\n const month = Math.floor((h + l - 7 * m + 114) / 31);\n const day = ((h + l - 7 * m + 114) % 31) + 1;\n\n return new Date(Date.UTC(year, month - 1, day));\n}\n","/**\n * Calculates the Nth weekday of a month\n * @param year - Year\n * @param month - Month (1-12)\n * @param weekday - Weekday (0=Sun, 1=Mon, ..., 6=Sat)\n * @param n - Occurrence (1=first, 2=second, -1=last)\n */\nexport function getNthWeekday(year: number, month: number, weekday: number, n: number): Date {\n if (n > 0) {\n // From start of month\n const first = new Date(Date.UTC(year, month - 1, 1));\n const firstWeekday = first.getUTCDay();\n const diff = (weekday - firstWeekday + 7) % 7;\n const day = 1 + diff + (n - 1) * 7;\n return new Date(Date.UTC(year, month - 1, day));\n } else {\n // From end of month (n = -1 = last)\n // month is 1-12. Date.UTC(year, month, 0) gives the last day of month 'month'\n const last = new Date(Date.UTC(year, month, 0));\n const lastWeekday = last.getUTCDay();\n const diff = (lastWeekday - weekday + 7) % 7;\n const day = last.getUTCDate() - diff + (n + 1) * 7;\n return new Date(Date.UTC(year, month - 1, day));\n }\n}\n","import type { ShiftRule } from '../types';\n\n/**\n * Applies a shift rule to a date\n * @returns { date: Date, shifted: boolean }\n */\nexport function applyShift(date: Date, rule: ShiftRule): { date: Date; shifted: boolean } {\n const day = date.getUTCDay(); // 0=Sun, 6=Sat\n\n if (rule === 'none') {\n return { date, shifted: false };\n }\n\n const result = new Date(date);\n\n switch (rule) {\n case 'emiliani':\n case 'nextMonday': {\n // If it's already Monday (1), do not move\n if (day === 1) {\n return { date, shifted: false };\n }\n // Move to next Monday\n // (8 - day) % 7 gives days until next Monday\n // Ex: Sun(0) -> (8-0)%7 = 1 (+1 day) -> Mon\n // Ex: Sat(6) -> (8-6)%7 = 2 (+2 days) -> Mon\n // Ex: Wed(3) -> (8-3)%7 = 5 (+5 days) -> Mon\n const daysToNextMonday = (8 - day) % 7;\n result.setUTCDate(date.getUTCDate() + daysToNextMonday);\n break;\n }\n\n case 'observedUS':\n // Only affects weekends\n if (day === 0) {\n // Sunday -> Monday (+1)\n result.setUTCDate(date.getUTCDate() + 1);\n } else if (day === 6) {\n // Saturday -> Friday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else {\n return { date, shifted: false };\n }\n break;\n\n case 'nearestMonday':\n // Argentina rule:\n // Tue/Wed -> Previous Monday\n // Thu/Fri -> Next Monday\n if (day === 2) {\n // Tuesday -> Monday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else if (day === 3) {\n // Wednesday -> Monday (-2)\n result.setUTCDate(date.getUTCDate() - 2);\n } else if (day === 4) {\n // Thursday -> Next Monday (+4)\n result.setUTCDate(date.getUTCDate() + 4);\n } else if (day === 5) {\n // Friday -> Next Monday (+3)\n result.setUTCDate(date.getUTCDate() + 3);\n } else {\n return { date, shifted: false };\n }\n break;\n\n default:\n return { date, shifted: false };\n }\n\n return { date: result, shifted: true };\n}\n","import type { HolidayDefinition, HolidayRule, Holiday } from './types';\nimport { getEasterSunday } from './algorithms/easter';\nimport { getNthWeekday } from './algorithms/nth-weekday';\nimport { applyShift } from './algorithms/shifts';\n\n/** Resolves a rule to a concrete date */\nfunction resolveRule(rule: HolidayRule, year: number): Date | null {\n switch (rule.type) {\n case 'fixed':\n return new Date(Date.UTC(year, rule.month - 1, rule.day));\n\n case 'nthWeekday':\n return getNthWeekday(year, rule.month, rule.weekday, rule.n);\n\n case 'easterRelative': {\n const easter = getEasterSunday(year);\n const result = new Date(easter);\n result.setUTCDate(easter.getUTCDate() + rule.offset);\n return result;\n }\n\n case 'custom':\n return rule.calc(year);\n }\n}\n\n/** Formats Date to ISO string (date only) */\nfunction toISODate(date: Date): string {\n try {\n return date.toISOString().split('T')[0];\n } catch {\n return '';\n }\n}\n\n/** Checks if a date is valid */\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && !Number.isNaN(date.getTime());\n}\n\n/** Generates holidays for a year */\nexport function resolveHolidays(\n definitions: HolidayDefinition[],\n year: number,\n names: Record<string, string> = {},\n): Holiday[] {\n if (typeof year !== 'number' || Number.isNaN(year)) {\n return [];\n }\n\n return definitions\n .map((def) => {\n const rawDate = resolveRule(def.rule, year);\n if (!rawDate || !isValidDate(rawDate)) return null;\n\n const { date, shifted } = applyShift(rawDate, def.shift ?? 'none');\n if (!isValidDate(date)) return null;\n\n return {\n date: toISODate(date),\n key: def.key,\n name: names[def.key] ?? def.key,\n ...(shifted && { isShifted: true }),\n };\n })\n .filter((h): h is Holiday => h !== null)\n .sort((a, b) => a.date.localeCompare(b.date));\n}\n\n/** Checks if a date is a holiday */\nexport function checkIsHoliday(\n definitions: HolidayDefinition[],\n date: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(date)) return null;\n\n const year = date.getUTCFullYear();\n const isoDate = toISODate(date);\n if (!isoDate) return null;\n\n const holidays = resolveHolidays(definitions, year, names);\n return holidays.find((h) => h.date === isoDate) ?? null;\n}\n\n/** Gets the next holiday from a date */\nexport function findNextHoliday(\n definitions: HolidayDefinition[],\n from: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(from)) return null;\n\n const isoFrom = toISODate(from);\n if (!isoFrom) return null;\n\n const year = from.getUTCFullYear();\n\n // Search in current year\n let holidays = resolveHolidays(definitions, year, names);\n let next = holidays.find((h) => h.date >= isoFrom);\n\n // If none, search in next year\n if (!next) {\n holidays = resolveHolidays(definitions, year + 1, names);\n next = holidays[0];\n }\n\n return next ?? null;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/algorithms/easter.ts","../../src/core/algorithms/nth-weekday.ts","../../src/core/algorithms/shifts.ts","../../src/core/engine.ts"],"names":["getEasterSunday","year","a","b","c","d","e","f","g","h","i","k","l","m","month","day","getNthWeekday","weekday","n","expectedMonth","firstWeekday","result","last","diff","isValidDate","date","applyShift","rule","daysToNextMonday","resolveRule","easter","toISODate","resolveHolidays","definitions","names","def","rawDate","shifted","checkIsHoliday","isoDate","findNextHoliday","from","isoFrom","holidays","next"],"mappings":"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","file":"engine.js","sourcesContent":["/**\n * Calculates Easter Sunday (Meeus/Jones/Butcher algorithm)\n * Valid for Gregorian calendar (1583+)\n */\nexport function getEasterSunday(year: number): Date {\n if (!Number.isInteger(year) || year < 1583) {\n return new Date(Number.NaN);\n }\n\n const a = year % 19;\n const b = Math.floor(year / 100);\n const c = year % 100;\n const d = Math.floor(b / 4);\n const e = b % 4;\n const f = Math.floor((b + 8) / 25);\n const g = Math.floor((b - f + 1) / 3);\n const h = (19 * a + b - d - g + 15) % 30;\n const i = Math.floor(c / 4);\n const k = c % 4;\n const l = (32 + 2 * e + 2 * i - h - k) % 7;\n const m = Math.floor((a + 11 * h + 22 * l) / 451);\n const month = Math.floor((h + l - 7 * m + 114) / 31);\n const day = ((h + l - 7 * m + 114) % 31) + 1;\n\n return new Date(Date.UTC(year, month - 1, day));\n}\n","/**\n * Calculates the Nth weekday of a month\n * @param year - Year\n * @param month - Month (1-12)\n * @param weekday - Weekday (0=Sun, 1=Mon, ..., 6=Sat)\n * @param n - Occurrence (1=first, 2=second, -1=last)\n */\nexport function getNthWeekday(year: number, month: number, weekday: number, n: number): Date {\n if (\n !Number.isInteger(year) ||\n !Number.isInteger(month) ||\n month < 1 ||\n month > 12 ||\n !Number.isInteger(weekday) ||\n weekday < 0 ||\n weekday > 6 ||\n !Number.isInteger(n) ||\n n === 0\n ) {\n return new Date(Number.NaN);\n }\n\n const expectedMonth = month - 1;\n\n if (n > 0) {\n // From start of month\n const first = new Date(Date.UTC(year, month - 1, 1));\n const firstWeekday = first.getUTCDay();\n const diff = (weekday - firstWeekday + 7) % 7;\n const day = 1 + diff + (n - 1) * 7;\n const result = new Date(Date.UTC(year, month - 1, day));\n return result.getUTCMonth() === expectedMonth ? result : new Date(Number.NaN);\n } else {\n // From end of month (n = -1 = last)\n // month is 1-12. Date.UTC(year, month, 0) gives the last day of month 'month'\n const last = new Date(Date.UTC(year, month, 0));\n const lastWeekday = last.getUTCDay();\n const diff = (lastWeekday - weekday + 7) % 7;\n const day = last.getUTCDate() - diff + (n + 1) * 7;\n const result = new Date(Date.UTC(year, month - 1, day));\n return result.getUTCMonth() === expectedMonth ? result : new Date(Number.NaN);\n }\n}\n","import type { ShiftRule } from '../types';\n\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && Number.isFinite(date.getTime());\n}\n\n/**\n * Applies a shift rule to a date\n * @returns { date: Date, shifted: boolean }\n */\nexport function applyShift(date: Date, rule: ShiftRule): { date: Date; shifted: boolean } {\n if (!isValidDate(date)) {\n return { date, shifted: false };\n }\n\n const day = date.getUTCDay(); // 0=Sun, 6=Sat\n\n if (rule === 'none') {\n return { date, shifted: false };\n }\n\n const result = new Date(date);\n\n switch (rule) {\n case 'emiliani':\n case 'nextMonday': {\n // If it's already Monday (1), do not move\n if (day === 1) {\n return { date, shifted: false };\n }\n // Move to next Monday\n // (8 - day) % 7 gives days until next Monday\n // Ex: Sun(0) -> (8-0)%7 = 1 (+1 day) -> Mon\n // Ex: Sat(6) -> (8-6)%7 = 2 (+2 days) -> Mon\n // Ex: Wed(3) -> (8-3)%7 = 5 (+5 days) -> Mon\n const daysToNextMonday = (8 - day) % 7;\n result.setUTCDate(date.getUTCDate() + daysToNextMonday);\n break;\n }\n\n case 'observedUS':\n // Only affects weekends\n if (day === 0) {\n // Sunday -> Monday (+1)\n result.setUTCDate(date.getUTCDate() + 1);\n } else if (day === 6) {\n // Saturday -> Friday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else {\n return { date, shifted: false };\n }\n break;\n\n case 'nearestMonday':\n // Argentina rule:\n // Tue/Wed -> Previous Monday\n // Thu/Fri -> Next Monday\n if (day === 2) {\n // Tuesday -> Monday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else if (day === 3) {\n // Wednesday -> Monday (-2)\n result.setUTCDate(date.getUTCDate() - 2);\n } else if (day === 4) {\n // Thursday -> Next Monday (+4)\n result.setUTCDate(date.getUTCDate() + 4);\n } else if (day === 5) {\n // Friday -> Next Monday (+3)\n result.setUTCDate(date.getUTCDate() + 3);\n } else {\n return { date, shifted: false };\n }\n break;\n\n default:\n return { date, shifted: false };\n }\n\n return { date: result, shifted: true };\n}\n","import type { HolidayDefinition, HolidayRule, Holiday } from './types';\nimport { getEasterSunday } from './algorithms/easter';\nimport { getNthWeekday } from './algorithms/nth-weekday';\nimport { applyShift } from './algorithms/shifts';\n\n/** Resolves a rule to a concrete date */\nfunction resolveRule(rule: HolidayRule, year: number): Date | null {\n switch (rule.type) {\n case 'fixed':\n return new Date(Date.UTC(year, rule.month - 1, rule.day));\n\n case 'nthWeekday':\n return getNthWeekday(year, rule.month, rule.weekday, rule.n);\n\n case 'easterRelative': {\n const easter = getEasterSunday(year);\n const result = new Date(easter);\n result.setUTCDate(easter.getUTCDate() + rule.offset);\n return result;\n }\n\n case 'custom':\n return rule.calc(year);\n }\n}\n\n/** Formats Date to ISO string (date only) */\nfunction toISODate(date: Date): string {\n try {\n return date.toISOString().split('T')[0];\n } catch {\n return '';\n }\n}\n\n/** Checks if a date is valid */\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && !Number.isNaN(date.getTime());\n}\n\n/** Generates holidays for a year */\nexport function resolveHolidays(\n definitions: HolidayDefinition[],\n year: number,\n names: Record<string, string> = {},\n): Holiday[] {\n if (typeof year !== 'number' || !Number.isInteger(year)) {\n return [];\n }\n\n return definitions\n .map((def) => {\n const rawDate = resolveRule(def.rule, year);\n if (!rawDate || !isValidDate(rawDate)) return null;\n\n const { date, shifted } = applyShift(rawDate, def.shift ?? 'none');\n if (!isValidDate(date)) return null;\n\n return {\n date: toISODate(date),\n key: def.key,\n name: names[def.key] ?? def.key,\n ...(shifted && { isShifted: true }),\n };\n })\n .filter((h): h is Holiday => h !== null)\n .sort((a, b) => a.date.localeCompare(b.date));\n}\n\n/** Checks if a date is a holiday */\nexport function checkIsHoliday(\n definitions: HolidayDefinition[],\n date: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(date)) return null;\n\n const year = date.getUTCFullYear();\n const isoDate = toISODate(date);\n if (!isoDate) return null;\n\n const holidays = resolveHolidays(definitions, year, names);\n return holidays.find((h) => h.date === isoDate) ?? null;\n}\n\n/** Gets the next holiday from a date */\nexport function findNextHoliday(\n definitions: HolidayDefinition[],\n from: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(from)) return null;\n\n const isoFrom = toISODate(from);\n if (!isoFrom) return null;\n\n const year = from.getUTCFullYear();\n\n // Search in current year\n let holidays = resolveHolidays(definitions, year, names);\n let next = holidays.find((h) => h.date >= isoFrom);\n\n // If none, search in next year\n if (!next) {\n holidays = resolveHolidays(definitions, year + 1, names);\n next = holidays[0];\n }\n\n return next ?? null;\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';function
|
|
1
|
+
'use strict';function g(e){if(!Number.isInteger(e)||e<1583)return new Date(Number.NaN);let n=e%19,i=Math.floor(e/100),t=e%100,o=Math.floor(i/4),s=i%4,r=Math.floor((i+8)/25),a=Math.floor((i-r+1)/3),u=(19*n+i-o-a+15)%30,l=Math.floor(t/4),c=t%4,f=(32+2*s+2*l-u-c)%7,D=Math.floor((n+11*u+22*f)/451),H=Math.floor((u+f-7*D+114)/31),w=(u+f-7*D+114)%31+1;return new Date(Date.UTC(e,H-1,w))}function T(e,n,i,t){if(!Number.isInteger(e)||!Number.isInteger(n)||n<1||n>12||!Number.isInteger(i)||i<0||i>6||!Number.isInteger(t)||t===0)return new Date(Number.NaN);let o=n-1;if(t>0){let r=new Date(Date.UTC(e,n-1,1)).getUTCDay(),u=1+(i-r+7)%7+(t-1)*7,l=new Date(Date.UTC(e,n-1,u));return l.getUTCMonth()===o?l:new Date(Number.NaN)}else {let s=new Date(Date.UTC(e,n,0)),a=(s.getUTCDay()-i+7)%7,u=s.getUTCDate()-a+(t+1)*7,l=new Date(Date.UTC(e,n-1,u));return l.getUTCMonth()===o?l:new Date(Number.NaN)}}function x(e){return e instanceof Date&&Number.isFinite(e.getTime())}function h(e,n){if(!x(e))return {date:e,shifted:false};let i=e.getUTCDay();if(n==="none")return {date:e,shifted:false};let t=new Date(e);switch(n){case "emiliani":case "nextMonday":{if(i===1)return {date:e,shifted:false};let o=(8-i)%7;t.setUTCDate(e.getUTCDate()+o);break}case "observedUS":if(i===0)t.setUTCDate(e.getUTCDate()+1);else if(i===6)t.setUTCDate(e.getUTCDate()-1);else return {date:e,shifted:false};break;case "nearestMonday":if(i===2)t.setUTCDate(e.getUTCDate()-1);else if(i===3)t.setUTCDate(e.getUTCDate()-2);else if(i===4)t.setUTCDate(e.getUTCDate()+4);else if(i===5)t.setUTCDate(e.getUTCDate()+3);else return {date:e,shifted:false};break;default:return {date:e,shifted:false}}return {date:t,shifted:true}}function k(e,n){switch(e.type){case "fixed":return new Date(Date.UTC(n,e.month-1,e.day));case "nthWeekday":return T(n,e.month,e.weekday,e.n);case "easterRelative":{let i=g(n),t=new Date(i);return t.setUTCDate(i.getUTCDate()+e.offset),t}case "custom":return e.calc(n)}}function p(e){try{return e.toISOString().split("T")[0]}catch{return ""}}function d(e){return e instanceof Date&&!Number.isNaN(e.getTime())}function m(e,n,i={}){return typeof n!="number"||!Number.isInteger(n)?[]:e.map(t=>{let o=k(t.rule,n);if(!o||!d(o))return null;let{date:s,shifted:r}=h(o,t.shift??"none");return d(s)?{date:p(s),key:t.key,name:i[t.key]??t.key,...r&&{isShifted:true}}:null}).filter(t=>t!==null).sort((t,o)=>t.date.localeCompare(o.date))}function b(e,n,i){if(!d(n))return null;let t=n.getUTCFullYear(),o=p(n);return o?m(e,t,i).find(r=>r.date===o)??null:null}function M(e,n,i){if(!d(n))return null;let t=p(n);if(!t)return null;let o=n.getUTCFullYear(),s=m(e,o,i),r=s.find(a=>a.date>=t);return r||(s=m(e,o+1,i),r=s[0]),r??null}function y(e){return e instanceof Date&&Number.isFinite(e.getTime())}function R(){return new Date(Number.NaN)}function C(e){let n=e.getUTCDay();return n===0||n===6}function U(e,n){return !y(n)||C(n)?false:b(e,n)===null}function I(e,n,i){if(!y(n)||!Number.isFinite(i))return R();let t=new Date(n),o=Math.abs(i),s=i>=0?1:-1;for(;o>0;)t.setUTCDate(t.getUTCDate()+s),U(e,t)&&o--;return t}function S(e,n,i){if(!y(n)||!y(i))return Number.NaN;let t=new Date(n),o=new Date(i);if(t.setUTCHours(0,0,0,0),o.setUTCHours(0,0,0,0),t.getTime()===o.getTime())return 0;let s=t<o?1:-1,r=0,a=new Date(t);for(;a.getTime()!==o.getTime();)a.setUTCDate(a.getUTCDate()+s),U(e,a)&&(r+=s);return r}function N(e){return e instanceof Date&&Number.isFinite(e.getTime())}function v(e,n={}){let{locale:i="en",baseDate:t=new Date,numeric:o="always",style:s="long"}=n;if(!N(e)||!N(t))return "";let r=e.getTime()-t.getTime(),a=Math.round(r/1e3),u=new Intl.RelativeTimeFormat(i,{numeric:o,style:s}),l=[{unit:"year",seconds:3600*24*365},{unit:"month",seconds:3600*24*30},{unit:"week",seconds:3600*24*7},{unit:"day",seconds:3600*24},{unit:"hour",seconds:3600},{unit:"minute",seconds:60},{unit:"second",seconds:1}];for(let{unit:c,seconds:f}of l)if(Math.abs(a)>=f||c==="second"){let D=Math.round(a/f);return u.format(D,c)}return ""}exports.addBusinessDays=I;exports.applyShift=h;exports.checkIsBusinessDay=U;exports.checkIsHoliday=b;exports.findNextHoliday=M;exports.formatRelativeTime=v;exports.getBusinessDaysBetween=S;exports.getEasterSunday=g;exports.getNthWeekday=T;exports.isWeekend=C;exports.resolveHolidays=m;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/algorithms/easter.ts","../src/core/algorithms/nth-weekday.ts","../src/core/algorithms/shifts.ts","../src/core/engine.ts","../src/core/business.ts","../src/core/relative-time.ts"],"names":["getEasterSunday","year","a","b","c","d","e","f","g","h","i","k","l","m","month","day","getNthWeekday","weekday","n","firstWeekday","last","diff","applyShift","date","rule","result","daysToNextMonday","resolveRule","easter","toISODate","isValidDate","resolveHolidays","definitions","names","def","rawDate","shifted","checkIsHoliday","isoDate","findNextHoliday","from","isoFrom","holidays","next","isWeekend","checkIsBusinessDay","addBusinessDays","startDate","amount","remaining","direction","getBusinessDaysBetween","endDate","start","end","count","current","isFiniteDate","formatRelativeTime","options","locale","baseDate","numeric","style","diffMs","diffSecs","formatter","units","unit","seconds","value"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Calculates Easter Sunday (Meeus/Jones/Butcher algorithm)\n * Valid for Gregorian calendar (1583+)\n */\nexport function getEasterSunday(year: number): Date {\n const a = year % 19;\n const b = Math.floor(year / 100);\n const c = year % 100;\n const d = Math.floor(b / 4);\n const e = b % 4;\n const f = Math.floor((b + 8) / 25);\n const g = Math.floor((b - f + 1) / 3);\n const h = (19 * a + b - d - g + 15) % 30;\n const i = Math.floor(c / 4);\n const k = c % 4;\n const l = (32 + 2 * e + 2 * i - h - k) % 7;\n const m = Math.floor((a + 11 * h + 22 * l) / 451);\n const month = Math.floor((h + l - 7 * m + 114) / 31);\n const day = ((h + l - 7 * m + 114) % 31) + 1;\n\n return new Date(Date.UTC(year, month - 1, day));\n}\n","/**\n * Calculates the Nth weekday of a month\n * @param year - Year\n * @param month - Month (1-12)\n * @param weekday - Weekday (0=Sun, 1=Mon, ..., 6=Sat)\n * @param n - Occurrence (1=first, 2=second, -1=last)\n */\nexport function getNthWeekday(year: number, month: number, weekday: number, n: number): Date {\n if (n > 0) {\n // From start of month\n const first = new Date(Date.UTC(year, month - 1, 1));\n const firstWeekday = first.getUTCDay();\n const diff = (weekday - firstWeekday + 7) % 7;\n const day = 1 + diff + (n - 1) * 7;\n return new Date(Date.UTC(year, month - 1, day));\n } else {\n // From end of month (n = -1 = last)\n // month is 1-12. Date.UTC(year, month, 0) gives the last day of month 'month'\n const last = new Date(Date.UTC(year, month, 0));\n const lastWeekday = last.getUTCDay();\n const diff = (lastWeekday - weekday + 7) % 7;\n const day = last.getUTCDate() - diff + (n + 1) * 7;\n return new Date(Date.UTC(year, month - 1, day));\n }\n}\n","import type { ShiftRule } from '../types';\n\n/**\n * Applies a shift rule to a date\n * @returns { date: Date, shifted: boolean }\n */\nexport function applyShift(date: Date, rule: ShiftRule): { date: Date; shifted: boolean } {\n const day = date.getUTCDay(); // 0=Sun, 6=Sat\n\n if (rule === 'none') {\n return { date, shifted: false };\n }\n\n const result = new Date(date);\n\n switch (rule) {\n case 'emiliani':\n case 'nextMonday': {\n // If it's already Monday (1), do not move\n if (day === 1) {\n return { date, shifted: false };\n }\n // Move to next Monday\n // (8 - day) % 7 gives days until next Monday\n // Ex: Sun(0) -> (8-0)%7 = 1 (+1 day) -> Mon\n // Ex: Sat(6) -> (8-6)%7 = 2 (+2 days) -> Mon\n // Ex: Wed(3) -> (8-3)%7 = 5 (+5 days) -> Mon\n const daysToNextMonday = (8 - day) % 7;\n result.setUTCDate(date.getUTCDate() + daysToNextMonday);\n break;\n }\n\n case 'observedUS':\n // Only affects weekends\n if (day === 0) {\n // Sunday -> Monday (+1)\n result.setUTCDate(date.getUTCDate() + 1);\n } else if (day === 6) {\n // Saturday -> Friday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else {\n return { date, shifted: false };\n }\n break;\n\n case 'nearestMonday':\n // Argentina rule:\n // Tue/Wed -> Previous Monday\n // Thu/Fri -> Next Monday\n if (day === 2) {\n // Tuesday -> Monday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else if (day === 3) {\n // Wednesday -> Monday (-2)\n result.setUTCDate(date.getUTCDate() - 2);\n } else if (day === 4) {\n // Thursday -> Next Monday (+4)\n result.setUTCDate(date.getUTCDate() + 4);\n } else if (day === 5) {\n // Friday -> Next Monday (+3)\n result.setUTCDate(date.getUTCDate() + 3);\n } else {\n return { date, shifted: false };\n }\n break;\n\n default:\n return { date, shifted: false };\n }\n\n return { date: result, shifted: true };\n}\n","import type { HolidayDefinition, HolidayRule, Holiday } from './types';\nimport { getEasterSunday } from './algorithms/easter';\nimport { getNthWeekday } from './algorithms/nth-weekday';\nimport { applyShift } from './algorithms/shifts';\n\n/** Resolves a rule to a concrete date */\nfunction resolveRule(rule: HolidayRule, year: number): Date | null {\n switch (rule.type) {\n case 'fixed':\n return new Date(Date.UTC(year, rule.month - 1, rule.day));\n\n case 'nthWeekday':\n return getNthWeekday(year, rule.month, rule.weekday, rule.n);\n\n case 'easterRelative': {\n const easter = getEasterSunday(year);\n const result = new Date(easter);\n result.setUTCDate(easter.getUTCDate() + rule.offset);\n return result;\n }\n\n case 'custom':\n return rule.calc(year);\n }\n}\n\n/** Formats Date to ISO string (date only) */\nfunction toISODate(date: Date): string {\n try {\n return date.toISOString().split('T')[0];\n } catch {\n return '';\n }\n}\n\n/** Checks if a date is valid */\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && !Number.isNaN(date.getTime());\n}\n\n/** Generates holidays for a year */\nexport function resolveHolidays(\n definitions: HolidayDefinition[],\n year: number,\n names: Record<string, string> = {},\n): Holiday[] {\n if (typeof year !== 'number' || Number.isNaN(year)) {\n return [];\n }\n\n return definitions\n .map((def) => {\n const rawDate = resolveRule(def.rule, year);\n if (!rawDate || !isValidDate(rawDate)) return null;\n\n const { date, shifted } = applyShift(rawDate, def.shift ?? 'none');\n if (!isValidDate(date)) return null;\n\n return {\n date: toISODate(date),\n key: def.key,\n name: names[def.key] ?? def.key,\n ...(shifted && { isShifted: true }),\n };\n })\n .filter((h): h is Holiday => h !== null)\n .sort((a, b) => a.date.localeCompare(b.date));\n}\n\n/** Checks if a date is a holiday */\nexport function checkIsHoliday(\n definitions: HolidayDefinition[],\n date: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(date)) return null;\n\n const year = date.getUTCFullYear();\n const isoDate = toISODate(date);\n if (!isoDate) return null;\n\n const holidays = resolveHolidays(definitions, year, names);\n return holidays.find((h) => h.date === isoDate) ?? null;\n}\n\n/** Gets the next holiday from a date */\nexport function findNextHoliday(\n definitions: HolidayDefinition[],\n from: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(from)) return null;\n\n const isoFrom = toISODate(from);\n if (!isoFrom) return null;\n\n const year = from.getUTCFullYear();\n\n // Search in current year\n let holidays = resolveHolidays(definitions, year, names);\n let next = holidays.find((h) => h.date >= isoFrom);\n\n // If none, search in next year\n if (!next) {\n holidays = resolveHolidays(definitions, year + 1, names);\n next = holidays[0];\n }\n\n return next ?? null;\n}\n","import type { HolidayDefinition } from './types';\nimport { checkIsHoliday } from './engine';\n\n/**\n * Checks if a date is a weekend (Saturday or Sunday)\n * Uses UTC date to avoid timezone issues\n */\nexport function isWeekend(date: Date): boolean {\n const day = date.getUTCDay();\n return day === 0 || day === 6; // 0 = Sunday, 6 = Saturday\n}\n\n/**\n * Checks if a date is a business day (not weekend AND not holiday)\n */\nexport function checkIsBusinessDay(definitions: HolidayDefinition[], date: Date): boolean {\n if (isWeekend(date)) return false;\n return checkIsHoliday(definitions, date) === null;\n}\n\n/**\n * Adds (or subtracts) business days to a date\n */\nexport function addBusinessDays(\n definitions: HolidayDefinition[],\n startDate: Date,\n amount: number,\n): Date {\n const result = new Date(startDate);\n let remaining = Math.abs(amount);\n const direction = amount >= 0 ? 1 : -1;\n\n while (remaining > 0) {\n result.setUTCDate(result.getUTCDate() + direction);\n if (checkIsBusinessDay(definitions, result)) {\n remaining--;\n }\n }\n\n return result;\n}\n\n/**\n * Calculates the number of business days between two dates\n * Returns the number of days to add to startDate to get endDate (can be negative)\n * If startDate and endDate are the same, returns 0\n */\nexport function getBusinessDaysBetween(\n definitions: HolidayDefinition[],\n startDate: Date,\n endDate: Date,\n): number {\n const start = new Date(startDate);\n const end = new Date(endDate);\n\n // Reset hours to avoid issues with daylight saving time or partial days\n start.setUTCHours(0, 0, 0, 0);\n end.setUTCHours(0, 0, 0, 0);\n\n if (start.getTime() === end.getTime()) return 0;\n\n const direction = start < end ? 1 : -1;\n let count = 0;\n const current = new Date(start);\n\n // If direction is positive, we count days starting from start+1 until end\n // If direction is negative, we count days starting from start-1 until end\n\n while (current.getTime() !== end.getTime()) {\n current.setUTCDate(current.getUTCDate() + direction);\n if (checkIsBusinessDay(definitions, current)) {\n count += direction;\n }\n }\n\n return count;\n}\n","/**\n * Options for relative time formatting\n */\nexport interface RelativeTimeOptions {\n /** The locale to use for formatting (default: 'en') */\n locale?: string;\n /** The base date to compare against (default: new Date()) */\n baseDate?: Date;\n /** numeric option for Intl.RelativeTimeFormat (default: 'auto') */\n numeric?: 'always' | 'auto';\n /** style option for Intl.RelativeTimeFormat (default: 'long') */\n style?: 'long' | 'short' | 'narrow';\n}\n\nfunction isFiniteDate(date: Date): boolean {\n return date instanceof Date && Number.isFinite(date.getTime());\n}\n\n/**\n * Formats a date relative to another date (usually \"now\").\n * Uses Intl.RelativeTimeFormat for localization.\n *\n * @param date The date to format\n * @param options Configuration options\n * @returns The formatted relative time string (e.g., \"2 days ago\")\n */\nexport function formatRelativeTime(date: Date, options: RelativeTimeOptions = {}): string {\n const { locale = 'en', baseDate = new Date(), numeric = 'always', style = 'long' } = options;\n\n if (!isFiniteDate(date) || !isFiniteDate(baseDate)) {\n return '';\n }\n\n const diffMs = date.getTime() - baseDate.getTime();\n const diffSecs = Math.round(diffMs / 1000);\n const formatter = new Intl.RelativeTimeFormat(locale, { numeric, style });\n\n // Array of units and their values in seconds\n const units: { unit: Intl.RelativeTimeFormatUnit; seconds: number }[] = [\n { unit: 'year', seconds: 60 * 60 * 24 * 365 },\n { unit: 'month', seconds: 60 * 60 * 24 * 30 },\n { unit: 'week', seconds: 60 * 60 * 24 * 7 },\n { unit: 'day', seconds: 60 * 60 * 24 },\n { unit: 'hour', seconds: 60 * 60 },\n { unit: 'minute', seconds: 60 },\n { unit: 'second', seconds: 1 },\n ];\n\n for (const { unit, seconds } of units) {\n if (Math.abs(diffSecs) >= seconds || unit === 'second') {\n const value = Math.round(diffSecs / seconds);\n return formatter.format(value, unit);\n }\n }\n\n return '';\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/algorithms/easter.ts","../src/core/algorithms/nth-weekday.ts","../src/core/algorithms/shifts.ts","../src/core/engine.ts","../src/core/business.ts","../src/core/relative-time.ts"],"names":["getEasterSunday","year","a","b","c","d","e","f","g","h","i","k","l","m","month","day","getNthWeekday","weekday","n","expectedMonth","firstWeekday","result","last","diff","isValidDate","date","applyShift","rule","daysToNextMonday","resolveRule","easter","toISODate","resolveHolidays","definitions","names","def","rawDate","shifted","checkIsHoliday","isoDate","findNextHoliday","from","isoFrom","holidays","next","createInvalidDate","isWeekend","checkIsBusinessDay","addBusinessDays","startDate","amount","remaining","direction","getBusinessDaysBetween","endDate","start","end","count","current","isFiniteDate","formatRelativeTime","options","locale","baseDate","numeric","style","diffMs","diffSecs","formatter","units","unit","seconds","value"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Calculates Easter Sunday (Meeus/Jones/Butcher algorithm)\n * Valid for Gregorian calendar (1583+)\n */\nexport function getEasterSunday(year: number): Date {\n if (!Number.isInteger(year) || year < 1583) {\n return new Date(Number.NaN);\n }\n\n const a = year % 19;\n const b = Math.floor(year / 100);\n const c = year % 100;\n const d = Math.floor(b / 4);\n const e = b % 4;\n const f = Math.floor((b + 8) / 25);\n const g = Math.floor((b - f + 1) / 3);\n const h = (19 * a + b - d - g + 15) % 30;\n const i = Math.floor(c / 4);\n const k = c % 4;\n const l = (32 + 2 * e + 2 * i - h - k) % 7;\n const m = Math.floor((a + 11 * h + 22 * l) / 451);\n const month = Math.floor((h + l - 7 * m + 114) / 31);\n const day = ((h + l - 7 * m + 114) % 31) + 1;\n\n return new Date(Date.UTC(year, month - 1, day));\n}\n","/**\n * Calculates the Nth weekday of a month\n * @param year - Year\n * @param month - Month (1-12)\n * @param weekday - Weekday (0=Sun, 1=Mon, ..., 6=Sat)\n * @param n - Occurrence (1=first, 2=second, -1=last)\n */\nexport function getNthWeekday(year: number, month: number, weekday: number, n: number): Date {\n if (\n !Number.isInteger(year) ||\n !Number.isInteger(month) ||\n month < 1 ||\n month > 12 ||\n !Number.isInteger(weekday) ||\n weekday < 0 ||\n weekday > 6 ||\n !Number.isInteger(n) ||\n n === 0\n ) {\n return new Date(Number.NaN);\n }\n\n const expectedMonth = month - 1;\n\n if (n > 0) {\n // From start of month\n const first = new Date(Date.UTC(year, month - 1, 1));\n const firstWeekday = first.getUTCDay();\n const diff = (weekday - firstWeekday + 7) % 7;\n const day = 1 + diff + (n - 1) * 7;\n const result = new Date(Date.UTC(year, month - 1, day));\n return result.getUTCMonth() === expectedMonth ? result : new Date(Number.NaN);\n } else {\n // From end of month (n = -1 = last)\n // month is 1-12. Date.UTC(year, month, 0) gives the last day of month 'month'\n const last = new Date(Date.UTC(year, month, 0));\n const lastWeekday = last.getUTCDay();\n const diff = (lastWeekday - weekday + 7) % 7;\n const day = last.getUTCDate() - diff + (n + 1) * 7;\n const result = new Date(Date.UTC(year, month - 1, day));\n return result.getUTCMonth() === expectedMonth ? result : new Date(Number.NaN);\n }\n}\n","import type { ShiftRule } from '../types';\n\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && Number.isFinite(date.getTime());\n}\n\n/**\n * Applies a shift rule to a date\n * @returns { date: Date, shifted: boolean }\n */\nexport function applyShift(date: Date, rule: ShiftRule): { date: Date; shifted: boolean } {\n if (!isValidDate(date)) {\n return { date, shifted: false };\n }\n\n const day = date.getUTCDay(); // 0=Sun, 6=Sat\n\n if (rule === 'none') {\n return { date, shifted: false };\n }\n\n const result = new Date(date);\n\n switch (rule) {\n case 'emiliani':\n case 'nextMonday': {\n // If it's already Monday (1), do not move\n if (day === 1) {\n return { date, shifted: false };\n }\n // Move to next Monday\n // (8 - day) % 7 gives days until next Monday\n // Ex: Sun(0) -> (8-0)%7 = 1 (+1 day) -> Mon\n // Ex: Sat(6) -> (8-6)%7 = 2 (+2 days) -> Mon\n // Ex: Wed(3) -> (8-3)%7 = 5 (+5 days) -> Mon\n const daysToNextMonday = (8 - day) % 7;\n result.setUTCDate(date.getUTCDate() + daysToNextMonday);\n break;\n }\n\n case 'observedUS':\n // Only affects weekends\n if (day === 0) {\n // Sunday -> Monday (+1)\n result.setUTCDate(date.getUTCDate() + 1);\n } else if (day === 6) {\n // Saturday -> Friday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else {\n return { date, shifted: false };\n }\n break;\n\n case 'nearestMonday':\n // Argentina rule:\n // Tue/Wed -> Previous Monday\n // Thu/Fri -> Next Monday\n if (day === 2) {\n // Tuesday -> Monday (-1)\n result.setUTCDate(date.getUTCDate() - 1);\n } else if (day === 3) {\n // Wednesday -> Monday (-2)\n result.setUTCDate(date.getUTCDate() - 2);\n } else if (day === 4) {\n // Thursday -> Next Monday (+4)\n result.setUTCDate(date.getUTCDate() + 4);\n } else if (day === 5) {\n // Friday -> Next Monday (+3)\n result.setUTCDate(date.getUTCDate() + 3);\n } else {\n return { date, shifted: false };\n }\n break;\n\n default:\n return { date, shifted: false };\n }\n\n return { date: result, shifted: true };\n}\n","import type { HolidayDefinition, HolidayRule, Holiday } from './types';\nimport { getEasterSunday } from './algorithms/easter';\nimport { getNthWeekday } from './algorithms/nth-weekday';\nimport { applyShift } from './algorithms/shifts';\n\n/** Resolves a rule to a concrete date */\nfunction resolveRule(rule: HolidayRule, year: number): Date | null {\n switch (rule.type) {\n case 'fixed':\n return new Date(Date.UTC(year, rule.month - 1, rule.day));\n\n case 'nthWeekday':\n return getNthWeekday(year, rule.month, rule.weekday, rule.n);\n\n case 'easterRelative': {\n const easter = getEasterSunday(year);\n const result = new Date(easter);\n result.setUTCDate(easter.getUTCDate() + rule.offset);\n return result;\n }\n\n case 'custom':\n return rule.calc(year);\n }\n}\n\n/** Formats Date to ISO string (date only) */\nfunction toISODate(date: Date): string {\n try {\n return date.toISOString().split('T')[0];\n } catch {\n return '';\n }\n}\n\n/** Checks if a date is valid */\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && !Number.isNaN(date.getTime());\n}\n\n/** Generates holidays for a year */\nexport function resolveHolidays(\n definitions: HolidayDefinition[],\n year: number,\n names: Record<string, string> = {},\n): Holiday[] {\n if (typeof year !== 'number' || !Number.isInteger(year)) {\n return [];\n }\n\n return definitions\n .map((def) => {\n const rawDate = resolveRule(def.rule, year);\n if (!rawDate || !isValidDate(rawDate)) return null;\n\n const { date, shifted } = applyShift(rawDate, def.shift ?? 'none');\n if (!isValidDate(date)) return null;\n\n return {\n date: toISODate(date),\n key: def.key,\n name: names[def.key] ?? def.key,\n ...(shifted && { isShifted: true }),\n };\n })\n .filter((h): h is Holiday => h !== null)\n .sort((a, b) => a.date.localeCompare(b.date));\n}\n\n/** Checks if a date is a holiday */\nexport function checkIsHoliday(\n definitions: HolidayDefinition[],\n date: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(date)) return null;\n\n const year = date.getUTCFullYear();\n const isoDate = toISODate(date);\n if (!isoDate) return null;\n\n const holidays = resolveHolidays(definitions, year, names);\n return holidays.find((h) => h.date === isoDate) ?? null;\n}\n\n/** Gets the next holiday from a date */\nexport function findNextHoliday(\n definitions: HolidayDefinition[],\n from: Date,\n names?: Record<string, string>,\n): Holiday | null {\n if (!isValidDate(from)) return null;\n\n const isoFrom = toISODate(from);\n if (!isoFrom) return null;\n\n const year = from.getUTCFullYear();\n\n // Search in current year\n let holidays = resolveHolidays(definitions, year, names);\n let next = holidays.find((h) => h.date >= isoFrom);\n\n // If none, search in next year\n if (!next) {\n holidays = resolveHolidays(definitions, year + 1, names);\n next = holidays[0];\n }\n\n return next ?? null;\n}\n","import type { HolidayDefinition } from './types';\nimport { checkIsHoliday } from './engine';\n\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && Number.isFinite(date.getTime());\n}\n\nfunction createInvalidDate(): Date {\n return new Date(Number.NaN);\n}\n\n/**\n * Checks if a date is a weekend (Saturday or Sunday)\n * Uses UTC date to avoid timezone issues\n */\nexport function isWeekend(date: Date): boolean {\n const day = date.getUTCDay();\n return day === 0 || day === 6; // 0 = Sunday, 6 = Saturday\n}\n\n/**\n * Checks if a date is a business day (not weekend AND not holiday)\n */\nexport function checkIsBusinessDay(definitions: HolidayDefinition[], date: Date): boolean {\n if (!isValidDate(date)) return false;\n if (isWeekend(date)) return false;\n return checkIsHoliday(definitions, date) === null;\n}\n\n/**\n * Adds (or subtracts) business days to a date\n */\nexport function addBusinessDays(\n definitions: HolidayDefinition[],\n startDate: Date,\n amount: number,\n): Date {\n if (!isValidDate(startDate) || !Number.isFinite(amount)) {\n return createInvalidDate();\n }\n\n const result = new Date(startDate);\n let remaining = Math.abs(amount);\n const direction = amount >= 0 ? 1 : -1;\n\n while (remaining > 0) {\n result.setUTCDate(result.getUTCDate() + direction);\n if (checkIsBusinessDay(definitions, result)) {\n remaining--;\n }\n }\n\n return result;\n}\n\n/**\n * Calculates the number of business days between two dates\n * Returns the number of days to add to startDate to get endDate (can be negative)\n * If startDate and endDate are the same, returns 0\n */\nexport function getBusinessDaysBetween(\n definitions: HolidayDefinition[],\n startDate: Date,\n endDate: Date,\n): number {\n if (!isValidDate(startDate) || !isValidDate(endDate)) {\n return Number.NaN;\n }\n\n const start = new Date(startDate);\n const end = new Date(endDate);\n\n // Reset hours to avoid issues with daylight saving time or partial days\n start.setUTCHours(0, 0, 0, 0);\n end.setUTCHours(0, 0, 0, 0);\n\n if (start.getTime() === end.getTime()) return 0;\n\n const direction = start < end ? 1 : -1;\n let count = 0;\n const current = new Date(start);\n\n // If direction is positive, we count days starting from start+1 until end\n // If direction is negative, we count days starting from start-1 until end\n\n while (current.getTime() !== end.getTime()) {\n current.setUTCDate(current.getUTCDate() + direction);\n if (checkIsBusinessDay(definitions, current)) {\n count += direction;\n }\n }\n\n return count;\n}\n","/**\n * Options for relative time formatting\n */\nexport interface RelativeTimeOptions {\n /** The locale to use for formatting (default: 'en') */\n locale?: string;\n /** The base date to compare against (default: new Date()) */\n baseDate?: Date;\n /** numeric option for Intl.RelativeTimeFormat (default: 'auto') */\n numeric?: 'always' | 'auto';\n /** style option for Intl.RelativeTimeFormat (default: 'long') */\n style?: 'long' | 'short' | 'narrow';\n}\n\nfunction isFiniteDate(date: Date): boolean {\n return date instanceof Date && Number.isFinite(date.getTime());\n}\n\n/**\n * Formats a date relative to another date (usually \"now\").\n * Uses Intl.RelativeTimeFormat for localization.\n *\n * @param date The date to format\n * @param options Configuration options\n * @returns The formatted relative time string (e.g., \"2 days ago\")\n */\nexport function formatRelativeTime(date: Date, options: RelativeTimeOptions = {}): string {\n const { locale = 'en', baseDate = new Date(), numeric = 'always', style = 'long' } = options;\n\n if (!isFiniteDate(date) || !isFiniteDate(baseDate)) {\n return '';\n }\n\n const diffMs = date.getTime() - baseDate.getTime();\n const diffSecs = Math.round(diffMs / 1000);\n const formatter = new Intl.RelativeTimeFormat(locale, { numeric, style });\n\n // Array of units and their values in seconds\n const units: { unit: Intl.RelativeTimeFormatUnit; seconds: number }[] = [\n { unit: 'year', seconds: 60 * 60 * 24 * 365 },\n { unit: 'month', seconds: 60 * 60 * 24 * 30 },\n { unit: 'week', seconds: 60 * 60 * 24 * 7 },\n { unit: 'day', seconds: 60 * 60 * 24 },\n { unit: 'hour', seconds: 60 * 60 },\n { unit: 'minute', seconds: 60 },\n { unit: 'second', seconds: 1 },\n ];\n\n for (const { unit, seconds } of units) {\n if (Math.abs(diffSecs) >= seconds || unit === 'second') {\n const value = Math.round(diffSecs / seconds);\n return formatter.format(value, unit);\n }\n }\n\n return '';\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
1
|
+
function g(e){if(!Number.isInteger(e)||e<1583)return new Date(Number.NaN);let n=e%19,i=Math.floor(e/100),t=e%100,o=Math.floor(i/4),s=i%4,r=Math.floor((i+8)/25),a=Math.floor((i-r+1)/3),u=(19*n+i-o-a+15)%30,l=Math.floor(t/4),c=t%4,f=(32+2*s+2*l-u-c)%7,D=Math.floor((n+11*u+22*f)/451),H=Math.floor((u+f-7*D+114)/31),w=(u+f-7*D+114)%31+1;return new Date(Date.UTC(e,H-1,w))}function T(e,n,i,t){if(!Number.isInteger(e)||!Number.isInteger(n)||n<1||n>12||!Number.isInteger(i)||i<0||i>6||!Number.isInteger(t)||t===0)return new Date(Number.NaN);let o=n-1;if(t>0){let r=new Date(Date.UTC(e,n-1,1)).getUTCDay(),u=1+(i-r+7)%7+(t-1)*7,l=new Date(Date.UTC(e,n-1,u));return l.getUTCMonth()===o?l:new Date(Number.NaN)}else {let s=new Date(Date.UTC(e,n,0)),a=(s.getUTCDay()-i+7)%7,u=s.getUTCDate()-a+(t+1)*7,l=new Date(Date.UTC(e,n-1,u));return l.getUTCMonth()===o?l:new Date(Number.NaN)}}function x(e){return e instanceof Date&&Number.isFinite(e.getTime())}function h(e,n){if(!x(e))return {date:e,shifted:false};let i=e.getUTCDay();if(n==="none")return {date:e,shifted:false};let t=new Date(e);switch(n){case "emiliani":case "nextMonday":{if(i===1)return {date:e,shifted:false};let o=(8-i)%7;t.setUTCDate(e.getUTCDate()+o);break}case "observedUS":if(i===0)t.setUTCDate(e.getUTCDate()+1);else if(i===6)t.setUTCDate(e.getUTCDate()-1);else return {date:e,shifted:false};break;case "nearestMonday":if(i===2)t.setUTCDate(e.getUTCDate()-1);else if(i===3)t.setUTCDate(e.getUTCDate()-2);else if(i===4)t.setUTCDate(e.getUTCDate()+4);else if(i===5)t.setUTCDate(e.getUTCDate()+3);else return {date:e,shifted:false};break;default:return {date:e,shifted:false}}return {date:t,shifted:true}}function k(e,n){switch(e.type){case "fixed":return new Date(Date.UTC(n,e.month-1,e.day));case "nthWeekday":return T(n,e.month,e.weekday,e.n);case "easterRelative":{let i=g(n),t=new Date(i);return t.setUTCDate(i.getUTCDate()+e.offset),t}case "custom":return e.calc(n)}}function p(e){try{return e.toISOString().split("T")[0]}catch{return ""}}function d(e){return e instanceof Date&&!Number.isNaN(e.getTime())}function m(e,n,i={}){return typeof n!="number"||!Number.isInteger(n)?[]:e.map(t=>{let o=k(t.rule,n);if(!o||!d(o))return null;let{date:s,shifted:r}=h(o,t.shift??"none");return d(s)?{date:p(s),key:t.key,name:i[t.key]??t.key,...r&&{isShifted:true}}:null}).filter(t=>t!==null).sort((t,o)=>t.date.localeCompare(o.date))}function b(e,n,i){if(!d(n))return null;let t=n.getUTCFullYear(),o=p(n);return o?m(e,t,i).find(r=>r.date===o)??null:null}function M(e,n,i){if(!d(n))return null;let t=p(n);if(!t)return null;let o=n.getUTCFullYear(),s=m(e,o,i),r=s.find(a=>a.date>=t);return r||(s=m(e,o+1,i),r=s[0]),r??null}function y(e){return e instanceof Date&&Number.isFinite(e.getTime())}function R(){return new Date(Number.NaN)}function C(e){let n=e.getUTCDay();return n===0||n===6}function U(e,n){return !y(n)||C(n)?false:b(e,n)===null}function I(e,n,i){if(!y(n)||!Number.isFinite(i))return R();let t=new Date(n),o=Math.abs(i),s=i>=0?1:-1;for(;o>0;)t.setUTCDate(t.getUTCDate()+s),U(e,t)&&o--;return t}function S(e,n,i){if(!y(n)||!y(i))return Number.NaN;let t=new Date(n),o=new Date(i);if(t.setUTCHours(0,0,0,0),o.setUTCHours(0,0,0,0),t.getTime()===o.getTime())return 0;let s=t<o?1:-1,r=0,a=new Date(t);for(;a.getTime()!==o.getTime();)a.setUTCDate(a.getUTCDate()+s),U(e,a)&&(r+=s);return r}function N(e){return e instanceof Date&&Number.isFinite(e.getTime())}function v(e,n={}){let{locale:i="en",baseDate:t=new Date,numeric:o="always",style:s="long"}=n;if(!N(e)||!N(t))return "";let r=e.getTime()-t.getTime(),a=Math.round(r/1e3),u=new Intl.RelativeTimeFormat(i,{numeric:o,style:s}),l=[{unit:"year",seconds:3600*24*365},{unit:"month",seconds:3600*24*30},{unit:"week",seconds:3600*24*7},{unit:"day",seconds:3600*24},{unit:"hour",seconds:3600},{unit:"minute",seconds:60},{unit:"second",seconds:1}];for(let{unit:c,seconds:f}of l)if(Math.abs(a)>=f||c==="second"){let D=Math.round(a/f);return u.format(D,c)}return ""}export{I as addBusinessDays,h as applyShift,U as checkIsBusinessDay,b as checkIsHoliday,M as findNextHoliday,v as formatRelativeTime,S as getBusinessDaysBetween,g as getEasterSunday,T as getNthWeekday,C as isWeekend,m as resolveHolidays};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|