{"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"],"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","isWeekend","checkIsBusinessDay","addBusinessDays","startDate","amount","remaining","direction"],"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  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 { 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"]}