soff-date 0.1.0 → 0.1.2

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.
Files changed (55) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +21 -18
  3. package/dist/core/algorithms/shifts.cjs +1 -1
  4. package/dist/core/algorithms/shifts.cjs.map +1 -1
  5. package/dist/core/algorithms/shifts.js +1 -1
  6. package/dist/core/algorithms/shifts.js.map +1 -1
  7. package/dist/core/engine.cjs +1 -1
  8. package/dist/core/engine.cjs.map +1 -1
  9. package/dist/core/engine.js +1 -1
  10. package/dist/core/engine.js.map +1 -1
  11. package/dist/core/types.d.cts +2 -2
  12. package/dist/core/types.d.ts +2 -2
  13. package/dist/i18n/es.cjs +1 -1
  14. package/dist/i18n/es.cjs.map +1 -1
  15. package/dist/i18n/es.js +1 -1
  16. package/dist/i18n/es.js.map +1 -1
  17. package/dist/i18n/index.cjs +1 -1
  18. package/dist/i18n/index.cjs.map +1 -1
  19. package/dist/i18n/index.js +1 -1
  20. package/dist/i18n/index.js.map +1 -1
  21. package/dist/i18n/pt.cjs +1 -1
  22. package/dist/i18n/pt.cjs.map +1 -1
  23. package/dist/i18n/pt.js +1 -1
  24. package/dist/i18n/pt.js.map +1 -1
  25. package/dist/index.cjs +1 -1
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.js +1 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/locales/ar.cjs +2 -0
  30. package/dist/locales/ar.cjs.map +1 -0
  31. package/dist/locales/ar.d.cts +10 -0
  32. package/dist/locales/ar.d.ts +10 -0
  33. package/dist/locales/ar.js +2 -0
  34. package/dist/locales/ar.js.map +1 -0
  35. package/dist/locales/br.cjs +2 -0
  36. package/dist/locales/br.cjs.map +1 -0
  37. package/dist/locales/br.d.cts +10 -0
  38. package/dist/locales/br.d.ts +10 -0
  39. package/dist/locales/br.js +2 -0
  40. package/dist/locales/br.js.map +1 -0
  41. package/dist/locales/co.cjs +1 -1
  42. package/dist/locales/co.cjs.map +1 -1
  43. package/dist/locales/co.js +1 -1
  44. package/dist/locales/co.js.map +1 -1
  45. package/dist/locales/mx.cjs +2 -0
  46. package/dist/locales/mx.cjs.map +1 -0
  47. package/dist/locales/mx.d.cts +10 -0
  48. package/dist/locales/mx.d.ts +10 -0
  49. package/dist/locales/mx.js +2 -0
  50. package/dist/locales/mx.js.map +1 -0
  51. package/dist/locales/us.cjs +1 -1
  52. package/dist/locales/us.cjs.map +1 -1
  53. package/dist/locales/us.js +1 -1
  54. package/dist/locales/us.js.map +1 -1
  55. package/package.json +51 -3
@@ -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/i18n/en.ts","../../src/locales/us.ts"],"names":["getEasterSunday","year","a","b","c","d","e","f","g","h","i","k","l","m","month","day","getNthWeekday","weekday","firstWeekday","last","diff","applyShift","date","rule","result","daysToNextMonday","resolveRule","easter","toISODate","resolveHolidays","definitions","names","def","rawDate","shifted","checkIsHoliday","isoDate","findNextHoliday","from","isoFrom","holidays","next","en","getHolidays","options","isHoliday","getNextHoliday"],"mappings":"AAIO,SAASA,CAAAA,CAAgBC,EAAoB,CAClD,IAAMC,EAAID,CAAAA,CAAO,EAAA,CACXE,EAAI,IAAA,CAAK,KAAA,CAAMF,EAAO,GAAG,CAAA,CACzBG,EAAIH,CAAAA,CAAO,GAAA,CACXI,EAAI,IAAA,CAAK,KAAA,CAAMF,EAAI,CAAC,CAAA,CACpBG,EAAIH,CAAAA,CAAI,CAAA,CACRI,EAAI,IAAA,CAAK,KAAA,CAAA,CAAOJ,EAAI,CAAA,EAAK,EAAE,EAC3BK,CAAAA,CAAI,IAAA,CAAK,OAAOL,CAAAA,CAAII,CAAAA,CAAI,GAAK,CAAC,CAAA,CAC9BE,GAAK,EAAA,CAAKP,CAAAA,CAAIC,CAAAA,CAAIE,CAAAA,CAAIG,CAAAA,CAAI,EAAA,EAAM,GAChCE,CAAAA,CAAI,IAAA,CAAK,MAAMN,CAAAA,CAAI,CAAC,EACpBO,CAAAA,CAAIP,CAAAA,CAAI,EACRQ,CAAAA,CAAAA,CAAK,EAAA,CAAK,EAAIN,CAAAA,CAAI,CAAA,CAAII,EAAID,CAAAA,CAAIE,CAAAA,EAAK,EACnCE,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAA,CAAOX,CAAAA,CAAI,EAAA,CAAKO,CAAAA,CAAI,GAAKG,CAAAA,EAAK,GAAG,EAC1CE,CAAAA,CAAQ,IAAA,CAAK,OAAOL,CAAAA,CAAIG,CAAAA,CAAI,EAAIC,CAAAA,CAAI,GAAA,EAAO,EAAE,CAAA,CAC7CE,CAAAA,CAAAA,CAAQN,EAAIG,CAAAA,CAAI,CAAA,CAAIC,EAAI,GAAA,EAAO,EAAA,CAAM,CAAA,CAE3C,OAAO,IAAI,IAAA,CAAK,KAAK,GAAA,CAAIZ,CAAAA,CAAMa,EAAQ,CAAA,CAAGC,CAAG,CAAC,CAChD,CCdO,SAASC,CAAAA,CAAcf,CAAAA,CAAca,EAAeG,CAAAA,CAAiB,CAAA,CAAiB,CAC3F,GAAI,CAAA,CAAI,EAAG,CAGT,IAAMC,CAAAA,CADQ,IAAI,IAAA,CAAK,IAAA,CAAK,IAAIjB,CAAAA,CAAMa,CAAAA,CAAQ,EAAG,CAAC,CAAC,EACxB,SAAA,EAAU,CAE/BC,EAAM,CAAA,CAAA,CADEE,CAAAA,CAAUC,EAAe,CAAA,EAAK,CAAA,CAAA,CACpB,EAAI,CAAA,EAAK,CAAA,CACjC,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAIjB,CAAAA,CAAMa,CAAAA,CAAQ,EAAGC,CAAG,CAAC,CAChD,CAAA,KAAO,CAGL,IAAMI,CAAAA,CAAO,IAAI,KAAK,IAAA,CAAK,GAAA,CAAIlB,EAAMa,CAAAA,CAAO,CAAC,CAAC,CAAA,CAExCM,CAAAA,CAAAA,CADcD,EAAK,SAAA,EAAU,CACPF,CAAAA,CAAU,CAAA,EAAK,CAAA,CACrCF,CAAAA,CAAMI,EAAK,UAAA,EAAW,CAAIC,GAAQ,CAAA,CAAI,CAAA,EAAK,EACjD,OAAO,IAAI,KAAK,IAAA,CAAK,GAAA,CAAInB,EAAMa,CAAAA,CAAQ,CAAA,CAAGC,CAAG,CAAC,CAChD,CACF,CClBO,SAASM,CAAAA,CAAWC,CAAAA,CAAYC,CAAAA,CAAmD,CACxF,IAAMR,CAAAA,CAAMO,CAAAA,CAAK,WAAU,CAE3B,GAAIC,IAAS,MAAA,CACX,OAAO,CAAE,IAAA,CAAAD,CAAAA,CAAM,QAAS,KAAM,CAAA,CAGhC,IAAME,CAAAA,CAAS,IAAI,KAAKF,CAAI,CAAA,CAE5B,OAAQC,CAAAA,EACN,KAAK,UAAA,CACL,KAAK,aAAc,CAEjB,GAAIR,IAAQ,CAAA,CACV,OAAO,CAAE,IAAA,CAAAO,CAAAA,CAAM,QAAS,KAAM,CAAA,CAOhC,IAAMG,CAAAA,CAAAA,CAAoB,CAAA,CAAIV,GAAO,CAAA,CACrCS,CAAAA,CAAO,UAAA,CAAWF,CAAAA,CAAK,UAAA,EAAW,CAAIG,CAAgB,CAAA,CACtD,KACF,CAEA,KAAK,YAAA,CAEH,GAAIV,CAAAA,GAAQ,CAAA,CAEVS,EAAO,UAAA,CAAWF,CAAAA,CAAK,YAAW,CAAI,CAAC,UAC9BP,CAAAA,GAAQ,CAAA,CAEjBS,EAAO,UAAA,CAAWF,CAAAA,CAAK,UAAA,EAAW,CAAI,CAAC,CAAA,CAAA,YAEhC,CAAE,IAAA,CAAAA,EAAM,OAAA,CAAS,KAAM,EAEhC,MAEF,QACE,OAAO,CAAE,IAAA,CAAAA,EAAM,OAAA,CAAS,KAAM,CAClC,CAEA,OAAO,CAAE,IAAA,CAAME,CAAAA,CAAQ,OAAA,CAAS,IAAK,CACvC,CC5CA,SAASE,CAAAA,CAAYH,CAAAA,CAAmBtB,EAAoB,CAC1D,OAAQsB,EAAK,IAAA,EACX,KAAK,OAAA,CACH,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,IAAItB,CAAAA,CAAMsB,CAAAA,CAAK,MAAQ,CAAA,CAAGA,CAAAA,CAAK,GAAG,CAAC,CAAA,CAE1D,KAAK,aACH,OAAOP,CAAAA,CAAcf,EAAMsB,CAAAA,CAAK,KAAA,CAAOA,EAAK,OAAA,CAASA,CAAAA,CAAK,CAAC,CAAA,CAE7D,KAAK,iBAAkB,CACrB,IAAMI,EAAS3B,CAAAA,CAAgBC,CAAI,EAC7BuB,CAAAA,CAAS,IAAI,IAAA,CAAKG,CAAM,CAAA,CAC9B,OAAAH,EAAO,UAAA,CAAWG,CAAAA,CAAO,YAAW,CAAIJ,CAAAA,CAAK,MAAM,CAAA,CAC5CC,CACT,CAEA,KAAK,QAAA,CACH,OAAOD,CAAAA,CAAK,IAAA,CAAKtB,CAAI,CACzB,CACF,CAGA,SAAS2B,CAAAA,CAAUN,CAAAA,CAAoB,CACrC,OAAOA,CAAAA,CAAK,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CACxC,CAGO,SAASO,EACdC,CAAAA,CACA7B,CAAAA,CACA8B,EAAgC,EAAC,CACtB,CACX,OAAOD,CAAAA,CACJ,IAAKE,CAAAA,EAAQ,CACZ,IAAMC,CAAAA,CAAUP,CAAAA,CAAYM,CAAAA,CAAI,KAAM/B,CAAI,CAAA,CACpC,CAAE,IAAA,CAAAqB,CAAAA,CAAM,QAAAY,CAAQ,CAAA,CAAIb,EAAWY,CAAAA,CAASD,CAAAA,CAAI,OAAS,MAAM,CAAA,CAEjE,OAAO,CACL,IAAA,CAAMJ,EAAUN,CAAI,CAAA,CACpB,IAAKU,CAAAA,CAAI,GAAA,CACT,KAAMD,CAAAA,CAAMC,CAAAA,CAAI,GAAG,CAAA,EAAKA,CAAAA,CAAI,IAC5B,GAAIE,CAAAA,EAAW,CAAE,SAAA,CAAW,IAAK,CACnC,CACF,CAAC,EACA,IAAA,CAAK,CAAChC,EAAGC,CAAAA,GAAMD,CAAAA,CAAE,IAAA,CAAK,aAAA,CAAcC,CAAAA,CAAE,IAAI,CAAC,CAChD,CAGO,SAASgC,CAAAA,CACdL,CAAAA,CACAR,EACAS,CAAAA,CACgB,CAChB,IAAM9B,CAAAA,CAAOqB,CAAAA,CAAK,gBAAe,CAC3Bc,CAAAA,CAAUR,EAAUN,CAAI,CAAA,CAE9B,OADiBO,CAAAA,CAAgBC,CAAAA,CAAa7B,CAAAA,CAAM8B,CAAK,CAAA,CACzC,IAAA,CAAMtB,GAAMA,CAAAA,CAAE,IAAA,GAAS2B,CAAO,CAAA,EAAK,IACrD,CAGO,SAASC,CAAAA,CACdP,EACAQ,CAAAA,CACAP,CAAAA,CACgB,CAChB,IAAMQ,CAAAA,CAAUX,EAAUU,CAAI,CAAA,CACxBrC,EAAOqC,CAAAA,CAAK,cAAA,EAAe,CAG7BE,CAAAA,CAAWX,CAAAA,CAAgBC,CAAAA,CAAa7B,EAAM8B,CAAK,CAAA,CACnDU,EAAOD,CAAAA,CAAS,IAAA,CAAM/B,GAAMA,CAAAA,CAAE,IAAA,EAAQ8B,CAAO,CAAA,CAGjD,OAAKE,IACHD,CAAAA,CAAWX,CAAAA,CAAgBC,EAAa7B,CAAAA,CAAO,CAAA,CAAG8B,CAAK,CAAA,CACvDU,CAAAA,CAAOD,CAAAA,CAAS,CAAC,CAAA,CAAA,CAGZC,CAAAA,EAAQ,IACjB,CClFO,IAAMC,EAAmB,CAE9B,OAAA,CAAS,iBACT,QAAA,CAAU,UAAA,CACV,aAAc,eAAA,CACd,UAAA,CAAY,cACZ,YAAA,CAAc,eAAA,CACd,SAAU,WAAA,CACV,SAAA,CAAW,gBACX,aAAA,CAAe,gBAAA,CACf,SAAA,CAAW,eAAA,CACX,YAAA,CAAc,eAAA,CACd,YAAa,gBAAA,CACb,SAAA,CAAW,kBAGX,WAAA,CAAa,oBAAA,CACb,YAAa,cAAA,CACb,cAAA,CAAgB,6BAChB,eAAA,CAAiB,kBAAA,CACjB,aAAc,qBAAA,CACd,cAAA,CAAgB,qBAChB,WAAA,CAAa,cAAA,CACb,sBAAuB,2BAAA,CACvB,oBAAA,CAAsB,uBAAA,CAGtB,eAAA,CAAiB,kBAAA,CACjB,YAAA,CAAc,4BACd,aAAA,CAAe,gBAAA,CACf,gBAAiB,uBAAA,CAGjB,MAAA,CAAQ,6BACR,aAAA,CAAe,iBAAA,CACf,YAAa,cAAA,CACb,iBAAA,CAAmB,mBACnB,eAAA,CAAiB,kBAAA,CACjB,YAAa,cACf,CAAA,CCnCA,IAAMZ,CAAAA,CAAmC,CAEvC,CACE,GAAA,CAAK,SAAA,CACL,IAAA,CAAM,CAAE,IAAA,CAAM,OAAA,CAAS,MAAO,CAAA,CAAG,GAAA,CAAK,CAAE,CAAA,CACxC,KAAA,CAAO,YACT,CAAA,CACA,CACE,IAAK,mBAAA,CACL,IAAA,CAAM,CAAE,IAAA,CAAM,OAAA,CAAS,MAAO,CAAA,CAAG,GAAA,CAAK,CAAE,CAAA,CACxC,KAAA,CAAO,YACT,EACA,CACE,GAAA,CAAK,cACL,IAAA,CAAM,CAAE,KAAM,OAAA,CAAS,KAAA,CAAO,GAAI,GAAA,CAAK,EAAG,EAC1C,KAAA,CAAO,YACT,EACA,CACE,GAAA,CAAK,YACL,IAAA,CAAM,CAAE,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,EAAA,CAAI,IAAK,EAAG,CAAA,CAC1C,MAAO,YACT,CAAA,CAGA,CACE,GAAA,CAAK,QAAA,CACL,KAAM,CAAE,IAAA,CAAM,aAAc,KAAA,CAAO,CAAA,CAAG,QAAS,CAAA,CAAG,CAAA,CAAG,CAAE,CACzD,CAAA,CACA,CACE,GAAA,CAAK,eAAA,CACL,IAAA,CAAM,CAAE,IAAA,CAAM,YAAA,CAAc,MAAO,CAAA,CAAG,OAAA,CAAS,EAAG,CAAA,CAAG,CAAE,CACzD,CAAA,CACA,CACE,IAAK,aAAA,CACL,IAAA,CAAM,CAAE,IAAA,CAAM,YAAA,CAAc,MAAO,CAAA,CAAG,OAAA,CAAS,CAAA,CAAG,CAAA,CAAG,EAAG,CAC1D,EACA,CACE,GAAA,CAAK,WACL,IAAA,CAAM,CAAE,KAAM,YAAA,CAAc,KAAA,CAAO,EAAG,OAAA,CAAS,CAAA,CAAG,EAAG,CAAE,CACzD,EACA,CACE,GAAA,CAAK,cACL,IAAA,CAAM,CAAE,IAAA,CAAM,YAAA,CAAc,KAAA,CAAO,EAAA,CAAI,QAAS,CAAA,CAAG,CAAA,CAAG,CAAE,CAC1D,CAAA,CACA,CACE,GAAA,CAAK,iBAAA,CACL,KAAM,CAAE,IAAA,CAAM,aAAc,KAAA,CAAO,EAAA,CAAI,QAAS,CAAA,CAAG,CAAA,CAAG,CAAE,CAC1D,CACF,CAAA,CAMO,SAASa,CAAAA,CAAY1C,CAAAA,CAAc2C,EAAyC,CACjF,IAAMb,EAAQa,CAAAA,EAAS,IAAA,EAAQF,EAC/B,OAAOb,CAAAA,CAAgBC,EAAa7B,CAAAA,CAAM8B,CAAK,CACjD,CAEO,SAASc,EAAUvB,CAAAA,CAAYsB,CAAAA,CAA8C,CAClF,IAAMb,CAAAA,CAAQa,CAAAA,EAAS,IAAA,EAAQF,CAAAA,CAC/B,OAAOP,EAAeL,CAAAA,CAAaR,CAAAA,CAAMS,CAAK,CAChD,CAEO,SAASe,CAAAA,CACdR,CAAAA,CAAa,IAAI,IAAA,CACjBM,CAAAA,CACgB,CAChB,IAAMb,CAAAA,CAAQa,GAAS,IAAA,EAAQF,CAAAA,CAC/B,OAAOL,CAAAA,CAAgBP,CAAAA,CAAaQ,CAAAA,CAAMP,CAAK,CACjD","file":"us.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 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 {\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 return date.toISOString().split('T')[0];\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 return definitions\n .map((def) => {\n const rawDate = resolveRule(def.rule, year);\n const { date, shifted } = applyShift(rawDate, def.shift ?? 'none');\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 .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 const year = date.getUTCFullYear();\n const isoDate = toISODate(date);\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 const isoFrom = toISODate(from);\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 { HolidayNames } from '../core/types';\n\nexport const en: HolidayNames = {\n // Common\n newYear: \"New Year's Day\",\n epiphany: 'Epiphany',\n holyThursday: 'Holy Thursday',\n goodFriday: 'Good Friday',\n easterSunday: 'Easter Sunday',\n laborDay: 'Labor Day',\n ascension: 'Ascension Day',\n corpusChristi: 'Corpus Christi',\n christmas: 'Christmas Day',\n christmasEve: 'Christmas Eve',\n newYearsEve: \"New Year's Eve\",\n allSaints: \"All Saints' Day\",\n\n // Colombia\n saintJoseph: \"Saint Joseph's Day\",\n sacredHeart: 'Sacred Heart',\n saintPeterPaul: 'Saint Peter and Saint Paul',\n independenceDay: 'Independence Day',\n boyacaBattle: 'Battle of Boyacá',\n assumptionMary: 'Assumption of Mary',\n columbusDay: 'Columbus Day',\n independenceCartagena: 'Independence of Cartagena',\n immaculateConception: 'Immaculate Conception',\n\n // Mexico\n constitutionDay: 'Constitution Day',\n benitoJuarez: 'Benito Juárez Birthday',\n revolutionDay: 'Revolution Day',\n virginGuadalupe: 'Our Lady of Guadalupe',\n\n // USA\n mlkDay: 'Martin Luther King Jr. Day',\n presidentsDay: \"Presidents' Day\",\n memorialDay: 'Memorial Day',\n independenceDayUS: 'Independence Day',\n thanksgivingDay: 'Thanksgiving Day',\n veteransDay: 'Veterans Day',\n};\n","// src/locales/us.ts\n\nimport type { HolidayDefinition, Holiday, HolidayNames } from '../core/types';\nimport { resolveHolidays, checkIsHoliday, findNextHoliday } from '../core/engine';\nimport { en } from '../i18n/en';\n\nconst definitions: HolidayDefinition[] = [\n // Fijos con observed\n {\n key: 'newYear',\n rule: { type: 'fixed', month: 1, day: 1 },\n shift: 'observedUS',\n },\n {\n key: 'independenceDayUS',\n rule: { type: 'fixed', month: 7, day: 4 },\n shift: 'observedUS',\n },\n {\n key: 'veteransDay',\n rule: { type: 'fixed', month: 11, day: 11 },\n shift: 'observedUS',\n },\n {\n key: 'christmas',\n rule: { type: 'fixed', month: 12, day: 25 },\n shift: 'observedUS',\n },\n\n // Nth weekday\n {\n key: 'mlkDay',\n rule: { type: 'nthWeekday', month: 1, weekday: 1, n: 3 },\n },\n {\n key: 'presidentsDay',\n rule: { type: 'nthWeekday', month: 2, weekday: 1, n: 3 },\n },\n {\n key: 'memorialDay',\n rule: { type: 'nthWeekday', month: 5, weekday: 1, n: -1 },\n },\n {\n key: 'laborDay',\n rule: { type: 'nthWeekday', month: 9, weekday: 1, n: 1 },\n },\n {\n key: 'columbusDay',\n rule: { type: 'nthWeekday', month: 10, weekday: 1, n: 2 },\n },\n {\n key: 'thanksgivingDay',\n rule: { type: 'nthWeekday', month: 11, weekday: 4, n: 4 },\n },\n];\n\nexport interface GetHolidaysOptions {\n lang?: HolidayNames;\n}\n\nexport function getHolidays(year: number, options?: GetHolidaysOptions): Holiday[] {\n const names = options?.lang ?? en;\n return resolveHolidays(definitions, year, names);\n}\n\nexport function isHoliday(date: Date, options?: GetHolidaysOptions): Holiday | null {\n const names = options?.lang ?? en;\n return checkIsHoliday(definitions, date, names);\n}\n\nexport function getNextHoliday(\n from: Date = new Date(),\n options?: GetHolidaysOptions,\n): Holiday | null {\n const names = options?.lang ?? en;\n return findNextHoliday(definitions, from, names);\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/i18n/en.ts","../../src/locales/us.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","resolveHolidays","definitions","names","def","rawDate","shifted","checkIsHoliday","isoDate","findNextHoliday","from","isoFrom","holidays","next","en","getHolidays","options","isHoliday","getNextHoliday"],"mappings":"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","file":"us.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 return date.toISOString().split('T')[0];\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 return definitions\n .map((def) => {\n const rawDate = resolveRule(def.rule, year);\n if (!rawDate) return null;\n\n const { date, shifted } = applyShift(rawDate, def.shift ?? 'none');\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 const year = date.getUTCFullYear();\n const isoDate = toISODate(date);\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 const isoFrom = toISODate(from);\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 { HolidayNames } from '../core/types';\n\nexport const en: HolidayNames = {\n // Common\n newYear: \"New Year's Day\",\n epiphany: 'Epiphany',\n holyThursday: 'Holy Thursday',\n goodFriday: 'Good Friday',\n easterSunday: 'Easter Sunday',\n laborDay: 'Labor Day',\n ascension: 'Ascension Day',\n corpusChristi: 'Corpus Christi',\n christmas: 'Christmas Day',\n christmasEve: 'Christmas Eve',\n newYearsEve: \"New Year's Eve\",\n allSaints: \"All Saints' Day\",\n\n // Colombia\n saintJoseph: \"Saint Joseph's Day\",\n sacredHeart: 'Sacred Heart',\n saintPeterPaul: 'Saint Peter and Saint Paul',\n independenceDay: 'Independence Day',\n boyacaBattle: 'Battle of Boyacá',\n assumptionMary: 'Assumption of Mary',\n columbusDay: 'Columbus Day',\n independenceCartagena: 'Independence of Cartagena',\n immaculateConception: 'Immaculate Conception',\n\n // Mexico\n constitutionDay: 'Constitution Day',\n benitoJuarez: 'Benito Juárez Birthday',\n revolutionDay: 'Revolution Day',\n virginGuadalupe: 'Our Lady of Guadalupe',\n\n // USA\n mlkDay: 'Martin Luther King Jr. Day',\n presidentsDay: \"Presidents' Day\",\n memorialDay: 'Memorial Day',\n independenceDayUS: 'Independence Day',\n thanksgivingDay: 'Thanksgiving Day',\n veteransDay: 'Veterans Day',\n};\n","// src/locales/us.ts\n\nimport type { HolidayDefinition, Holiday, HolidayNames } from '../core/types';\nimport { resolveHolidays, checkIsHoliday, findNextHoliday } from '../core/engine';\nimport { en } from '../i18n/en';\n\nconst definitions: HolidayDefinition[] = [\n // Fijos con observed\n {\n key: 'newYear',\n rule: { type: 'fixed', month: 1, day: 1 },\n shift: 'observedUS',\n },\n {\n key: 'independenceDayUS',\n rule: { type: 'fixed', month: 7, day: 4 },\n shift: 'observedUS',\n },\n {\n key: 'veteransDay',\n rule: { type: 'fixed', month: 11, day: 11 },\n shift: 'observedUS',\n },\n {\n key: 'christmas',\n rule: { type: 'fixed', month: 12, day: 25 },\n shift: 'observedUS',\n },\n\n // Nth weekday\n {\n key: 'mlkDay',\n rule: { type: 'nthWeekday', month: 1, weekday: 1, n: 3 },\n },\n {\n key: 'presidentsDay',\n rule: { type: 'nthWeekday', month: 2, weekday: 1, n: 3 },\n },\n {\n key: 'memorialDay',\n rule: { type: 'nthWeekday', month: 5, weekday: 1, n: -1 },\n },\n {\n key: 'laborDay',\n rule: { type: 'nthWeekday', month: 9, weekday: 1, n: 1 },\n },\n {\n key: 'columbusDay',\n rule: { type: 'nthWeekday', month: 10, weekday: 1, n: 2 },\n },\n {\n key: 'thanksgivingDay',\n rule: { type: 'nthWeekday', month: 11, weekday: 4, n: 4 },\n },\n];\n\nexport interface GetHolidaysOptions {\n lang?: HolidayNames;\n}\n\nexport function getHolidays(year: number, options?: GetHolidaysOptions): Holiday[] {\n const names = options?.lang ?? en;\n return resolveHolidays(definitions, year, names);\n}\n\nexport function isHoliday(date: Date, options?: GetHolidaysOptions): Holiday | null {\n const names = options?.lang ?? en;\n return checkIsHoliday(definitions, date, names);\n}\n\nexport function getNextHoliday(\n from: Date = new Date(),\n options?: GetHolidaysOptions,\n): Holiday | null {\n const names = options?.lang ?? en;\n return findNextHoliday(definitions, from, names);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "soff-date",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Lightweight, tree-shakeable holiday calculator with algorithmic date computation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -48,6 +48,36 @@
48
48
  "default": "./dist/locales/us.cjs"
49
49
  }
50
50
  },
51
+ "./locales/mx": {
52
+ "import": {
53
+ "types": "./dist/locales/mx.d.ts",
54
+ "default": "./dist/locales/mx.js"
55
+ },
56
+ "require": {
57
+ "types": "./dist/locales/mx.d.cts",
58
+ "default": "./dist/locales/mx.cjs"
59
+ }
60
+ },
61
+ "./locales/ar": {
62
+ "import": {
63
+ "types": "./dist/locales/ar.d.ts",
64
+ "default": "./dist/locales/ar.js"
65
+ },
66
+ "require": {
67
+ "types": "./dist/locales/ar.d.cts",
68
+ "default": "./dist/locales/ar.cjs"
69
+ }
70
+ },
71
+ "./locales/br": {
72
+ "import": {
73
+ "types": "./dist/locales/br.d.ts",
74
+ "default": "./dist/locales/br.js"
75
+ },
76
+ "require": {
77
+ "types": "./dist/locales/br.d.cts",
78
+ "default": "./dist/locales/br.cjs"
79
+ }
80
+ },
51
81
  "./i18n/es": {
52
82
  "import": {
53
83
  "types": "./dist/i18n/es.d.ts",
@@ -104,7 +134,7 @@
104
134
  "contributors:add": "all-contributors add",
105
135
  "contributors:generate": "all-contributors generate",
106
136
  "prepublishOnly": "npm run build",
107
- "version": "npm run build && git add -A dist",
137
+ "version": "npm run build",
108
138
  "postversion": "git push && git push --tags",
109
139
  "prepare": "husky",
110
140
  "commitlint": "commitlint --edit"
@@ -124,10 +154,28 @@
124
154
  "date",
125
155
  "festivos",
126
156
  "typescript",
127
- "tree-shaking"
157
+ "tree-shaking",
158
+ "colombia",
159
+ "usa",
160
+ "emiliani",
161
+ "working-days",
162
+ "business-days",
163
+ "date-manipulation",
164
+ "lightweight"
128
165
  ],
129
166
  "author": "Luis C. Rojas",
130
167
  "license": "MIT",
168
+ "repository": {
169
+ "type": "git",
170
+ "url": "git+https://github.com/bledxs/soff-date.git"
171
+ },
172
+ "bugs": {
173
+ "url": "https://github.com/bledxs/soff-date/issues"
174
+ },
175
+ "homepage": "https://github.com/bledxs/soff-date#readme",
176
+ "engines": {
177
+ "node": ">=20"
178
+ },
131
179
  "devDependencies": {
132
180
  "@commitlint/cli": "^20.1.0",
133
181
  "@commitlint/config-conventional": "^20.0.0",