{"version":3,"file":"DateUtils.mjs","sources":["../src/DateUtils.ts"],"sourcesContent":["/**\n * @module DateUtils\n * @description Utility functions for date manipulation and calculations.\n *\n * This module provides a comprehensive set of functions for working with dates,\n * including date arithmetic, comparisons, formatting, and validation.\n *\n * @example\n * ```typescript\n * import { DateUtils } from 'houser-js-utils';\n *\n * // Add 2 days to current date\n * const tomorrow = DateUtils.add({ days: 2 });\n *\n * // Calculate age\n * const age = DateUtils.calculateAge(new Date('1990-01-01'));\n *\n * // Check if date is weekend\n * const isWeekend = DateUtils.isWeekend(new Date());\n * ```\n */\n\nexport type DateArg = Date | number | string;\n\n/**\n * Supported time units for date calculations\n */\nexport type TimeUnit =\n  | \"years\"\n  | \"months\"\n  | \"weeks\"\n  | \"days\"\n  | \"hours\"\n  | \"minutes\"\n  | \"seconds\";\n\n/**\n * Object type for specifying time units and their values\n */\nexport type TimeUnitArgs = {\n  [K in TimeUnit]?: number;\n};\n\n// Constants for time calculations\nconst MS_PER_SECOND = 1000;\nconst MS_PER_MINUTE = MS_PER_SECOND * 60;\nconst MS_PER_HOUR = MS_PER_MINUTE * 60;\nconst MS_PER_DAY = MS_PER_HOUR * 24;\n\nexport const DateUtils = {\n  /**\n   * Adds specified time units to a date.\n   * @param args - Object containing time units to add\n   * @param date - Date to add to (defaults to current date)\n   * @returns New date with added time units\n   * @throws {Error} If any time unit is negative\n   * @example\n   * ```typescript\n   * DateUtils.add({ days: 7, hours: 2 }); // Add 7 days and 2 hours to now\n   * DateUtils.add({ months: 1 }, new Date('2023-01-15')); // Add 1 month to specific date\n   * ```\n   */\n  add(args: TimeUnitArgs, date: DateArg = new Date()): Date {\n    this.validateTimeUnits(args);\n    const dt = this.convertToDate(date);\n    return this.adjustDate(args, dt, 1);\n  },\n\n  /**\n   * Internal helper for modifying a date by adding or subtracting time units\n   * @param args - Object containing time units\n   * @param date - Date to modify\n   * @param direction - 1 for addition, -1 for subtraction\n   * @returns New date with modified time units\n   */\n  adjustDate(args: TimeUnitArgs, date: DateArg, direction: 1 | -1): Date {\n    const result = new Date(date.valueOf());\n\n    if (args.years)\n      result.setFullYear(result.getFullYear() + args.years * direction);\n    if (args.months)\n      result.setMonth(result.getMonth() + args.months * direction);\n    if (args.weeks)\n      result.setDate(result.getDate() + args.weeks * 7 * direction);\n    if (args.days) result.setDate(result.getDate() + args.days * direction);\n    if (args.hours) result.setHours(result.getHours() + args.hours * direction);\n    if (args.minutes)\n      result.setMinutes(result.getMinutes() + args.minutes * direction);\n    if (args.seconds)\n      result.setSeconds(result.getSeconds() + args.seconds * direction);\n\n    return result;\n  },\n\n  /**\n   * Calculates age based on birth date\n   * @param date - Birth date to calculate age from\n   * @returns Age in years or null if date is invalid\n   */\n  calculateAge(date: Date | string | null): number | null {\n    if (!date) {\n      return null;\n    }\n    const now = new Date();\n    const dateOfBirth = date instanceof Date ? date : new Date(date);\n\n    let yearDif = now.getFullYear() - dateOfBirth.getFullYear();\n    const monthDif = now.getMonth() - dateOfBirth.getMonth();\n    const dateDif = now.getDate() - dateOfBirth.getDate();\n\n    if (monthDif < 0 || (monthDif === 0 && dateDif < 0)) {\n      yearDif--;\n    }\n\n    return yearDif;\n  },\n\n  /**\n   * Calculates the number of days between two dates\n   * @param first - First date\n   * @param second - Second date\n   * @returns Number of days between dates\n   */\n  calculateDaysBetween(first: DateArg, second: DateArg): number {\n    const a = this.convertToDate(first);\n    const b = this.convertToDate(second);\n\n    const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());\n    const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());\n\n    return Math.abs(Math.floor((utc2 - utc1) / MS_PER_DAY));\n  },\n\n  /**\n   * Compares two dates and returns the result based on order parameter\n   * @param a - First date to compare\n   * @param b - Second date to compare\n   * @param order - Sort order ('asc' or 'desc')\n   * @returns Comparison result (-1, 0, or 1)\n   */\n  compareDates(a: DateArg, b: DateArg, order: \"asc\" | \"desc\" = \"asc\"): number {\n    const dateA = this.normalizeDate(a);\n    const dateB = this.normalizeDate(b);\n\n    if (!dateA && !dateB) return 0;\n    if (!dateA) return order === \"asc\" ? 1 : -1;\n    if (!dateB) return order === \"asc\" ? -1 : 1;\n\n    const diff = dateA.getTime() - dateB.getTime();\n    return order === \"asc\" ? diff : -diff;\n  },\n\n  /**\n   * Converts various date formats to a Date object\n   * @param dateStr - Date to convert (Date, number, or string)\n   * @returns Date object\n   * @throws Error if date string is invalid\n   */\n  convertToDate(dateStr: DateArg): Date {\n    if (dateStr instanceof Date) {\n      return new Date(dateStr.valueOf());\n    }\n\n    if (typeof dateStr === \"number\") {\n      if (dateStr.toString().length === 10) {\n        return new Date(dateStr * MS_PER_SECOND);\n      }\n      return new Date(dateStr);\n    }\n\n    if (typeof dateStr === \"string\") {\n      const parsed = new Date(dateStr);\n      if (isNaN(parsed.getTime())) {\n        throw new Error(`Invalid date string: ${dateStr}`);\n      }\n      return parsed;\n    }\n\n    throw new Error(\"Invalid date argument\");\n  },\n\n  /**\n   * Copies time from one date to another\n   * @param fromDate - Source date to copy time from\n   * @param toDate - Target date to copy time to\n   * @returns New date with copied time\n   */\n  copyTimeToDate(fromDate: DateArg, toDate: DateArg): Date {\n    const from = this.convertToDate(fromDate);\n    const to = this.convertToDate(toDate);\n\n    to.setHours(\n      from.getHours(),\n      from.getMinutes(),\n      from.getSeconds(),\n      from.getMilliseconds()\n    );\n    return to;\n  },\n\n  /**\n   * Returns the age in years between two dates\n   * @param birthDate - Birth date\n   * @param referenceDate - Reference date (defaults to current date)\n   * @returns Age in years\n   */\n  getAge(birthDate: DateArg, referenceDate: DateArg = new Date()): number {\n    const birth = this.convertToDate(birthDate);\n    const reference = this.convertToDate(referenceDate);\n\n    let age = reference.getFullYear() - birth.getFullYear();\n    const monthDiff = reference.getMonth() - birth.getMonth();\n\n    if (\n      monthDiff < 0 ||\n      (monthDiff === 0 && reference.getDate() < birth.getDate())\n    ) {\n      age--;\n    }\n\n    return age;\n  },\n\n  /**\n   * Returns the number of days in a given month\n   * @param year - Year to check\n   * @param month - Month to check (0-11)\n   * @returns Number of days in the month\n   */\n  getDaysInMonth(year: number, month: number): number {\n    return new Date(year, month + 1, 0).getDate();\n  },\n\n  /**\n   * Returns the number of days between two dates, inclusive\n   * @param startDate - Start date\n   * @param endDate - End date\n   * @returns Number of days between dates, inclusive\n   */\n  getDaysBetweenInclusive(startDate: DateArg, endDate: DateArg): number {\n    return this.calculateDaysBetween(startDate, endDate) + 1;\n  },\n\n  /**\n   * Returns the first day of the month\n   * @param date - Date to get first day of month for (defaults to current date)\n   * @returns Date set to first day of month\n   */\n  getFirstDayOfMonth(date: DateArg = new Date()): Date {\n    const newDate = this.convertToDate(date);\n    newDate.setDate(1);\n    return this.getStartOfDay(newDate);\n  },\n\n  /**\n   * Returns the first day of the quarter\n   * @param date - Date to get first day of quarter for (defaults to current date)\n   * @returns Date set to first day of quarter\n   */\n  getFirstDayOfQuarter(date: DateArg = new Date()): Date {\n    const newDate = this.convertToDate(date);\n    const quarter = this.getQuarter(newDate);\n    newDate.setMonth((quarter - 1) * 3, 1);\n    return this.getStartOfDay(newDate);\n  },\n\n  /**\n   * Returns the first day of the week (Sunday)\n   * @param date - Date to get first day of week for (defaults to current date)\n   * @returns Date set to first day of week\n   */\n  getFirstDayOfWeek(date: DateArg = new Date()): Date {\n    const newDate = this.convertToDate(date);\n    const day = newDate.getDay();\n    newDate.setDate(newDate.getDate() - day);\n    return this.getStartOfDay(newDate);\n  },\n\n  /**\n   * Returns the first day of the year\n   * @param date - Date to get first day of year for (defaults to current date)\n   * @returns Date set to first day of year\n   */\n  getFirstDayOfYear(date: DateArg = new Date()): Date {\n    const newDate = this.convertToDate(date);\n    newDate.setMonth(0, 1);\n    return this.getStartOfDay(newDate);\n  },\n\n  /**\n   * Returns the end of the day (23:59:59.999)\n   * @param date - Date to get end of day for (defaults to current date)\n   * @returns Date set to end of day\n   */\n  getEndOfDay(date?: DateArg): Date {\n    const newDate = this.convertToDate(date || new Date());\n    newDate.setHours(23, 59, 59, 999);\n    return newDate;\n  },\n\n  /**\n   * Returns the last day of the month\n   * @param date - Date to get last day of month for (defaults to current date)\n   * @returns Date set to last day of month\n   */\n  getLastDayOfMonth(date: DateArg = new Date()): Date {\n    const newDate = this.convertToDate(date);\n    newDate.setMonth(newDate.getMonth() + 1);\n    newDate.setDate(0);\n    return this.getEndOfDay(newDate);\n  },\n\n  /**\n   * Returns the last day of the quarter\n   * @param date - Date to get last day of quarter for (defaults to current date)\n   * @returns Date set to last day of quarter\n   */\n  getLastDayOfQuarter(date: DateArg = new Date()): Date {\n    const newDate = this.convertToDate(date);\n    const quarter = this.getQuarter(newDate);\n    newDate.setMonth(quarter * 3, 0);\n    return this.getEndOfDay(newDate);\n  },\n\n  /**\n   * Returns the last day of the week (Saturday)\n   * @param date - Date to get last day of week for (defaults to current date)\n   * @returns Date set to last day of week\n   */\n  getLastDayOfWeek(date: DateArg = new Date()): Date {\n    const newDate = this.convertToDate(date);\n    const day = newDate.getDay();\n    newDate.setDate(newDate.getDate() + (6 - day));\n    return this.getEndOfDay(newDate);\n  },\n\n  /**\n   * Returns the last day of the year\n   * @param date - Date to get last day of year for (defaults to current date)\n   * @returns Date set to last day of year\n   */\n  getLastDayOfYear(date: DateArg = new Date()): Date {\n    const newDate = this.convertToDate(date);\n    newDate.setMonth(11, 31);\n    return this.getEndOfDay(newDate);\n  },\n\n  /**\n   * Returns the quarter (1-4) of the year\n   * @param date - Date to get quarter for (defaults to current date)\n   * @returns Quarter number\n   */\n  getQuarter(date: DateArg = new Date()): number {\n    const month = this.convertToDate(date).getMonth();\n    return Math.floor(month / 3) + 1;\n  },\n\n  /**\n   * Returns the start of the day (00:00:00.000)\n   * @param date - Date to get start of day for (defaults to current date)\n   * @returns Date set to start of day\n   */\n  getStartOfDay(date?: DateArg): Date {\n    const newDate = this.convertToDate(date || new Date());\n    newDate.setHours(0, 0, 0, 0);\n    return newDate;\n  },\n\n  /**\n   * Returns the week number of the year (1-53)\n   * @param date - Date to get week number for (defaults to current date)\n   * @returns Week number\n   */\n  getWeekNumber(date: DateArg = new Date()): number {\n    const newDate = this.convertToDate(date);\n    const firstDayOfYear = new Date(newDate.getFullYear(), 0, 1);\n    const pastDaysOfYear =\n      (newDate.getTime() - firstDayOfYear.getTime()) / MS_PER_DAY;\n    return Math.ceil((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7);\n  },\n\n  /**\n   * Checks if a date is after another date\n   * @param date1 - First date to compare\n   * @param date2 - Second date to compare\n   * @returns True if date1 is after date2\n   */\n  isAfter(date1: DateArg, date2: DateArg): boolean {\n    return (\n      this.convertToDate(date1).valueOf() > this.convertToDate(date2).valueOf()\n    );\n  },\n\n  /**\n   * Checks if a date is before another date\n   * @param date1 - First date to compare\n   * @param date2 - Second date to compare\n   * @returns True if date1 is before date2\n   */\n  isBefore(date1: DateArg, date2: DateArg): boolean {\n    return (\n      this.convertToDate(date1).valueOf() < this.convertToDate(date2).valueOf()\n    );\n  },\n\n  /**\n   * Checks if a date is in the past\n   * @param date - Date to check\n   * @returns True if date is in the past\n   */\n  isDateInThePast(date: DateArg): boolean {\n    const dateObj = this.convertToDate(date);\n    return dateObj <= new Date();\n  },\n\n  /**\n   * Checks if two dates are the same day\n   * @param date1 - First date to compare\n   * @param date2 - Second date to compare\n   * @returns True if dates are the same day\n   */\n  isSameDay(date1: DateArg, date2: DateArg): boolean {\n    const date1Obj = this.convertToDate(date1);\n    const date2Obj = this.convertToDate(date2);\n    return (\n      date1Obj.getDate() === date2Obj.getDate() &&\n      date1Obj.getMonth() === date2Obj.getMonth() &&\n      date1Obj.getFullYear() === date2Obj.getFullYear()\n    );\n  },\n\n  /**\n   * Checks if two dates have the same time\n   * @param date1 - First date to compare\n   * @param date2 - Second date to compare\n   * @returns True if dates have the same time\n   */\n  isSameTime(date1: DateArg, date2: DateArg): boolean {\n    return (\n      this.convertToDate(date1).valueOf() ===\n      this.convertToDate(date2).valueOf()\n    );\n  },\n\n  /**\n   * Checks if a date is today\n   * @param date - Date to check\n   * @returns True if date is today\n   */\n  isToday(date: DateArg): boolean {\n    const convertedDate = this.convertToDate(date);\n    return (\n      !convertedDate ||\n      convertedDate.toLocaleDateString() === new Date().toLocaleDateString()\n    );\n  },\n\n  /**\n   * Checks if a date is tomorrow\n   * @param date - Date to check\n   * @returns True if date is tomorrow\n   */\n  isTomorrow(date: DateArg): boolean {\n    const tomorrow = new Date();\n    tomorrow.setDate(tomorrow.getDate() + 1);\n    return this.isSameDay(date, tomorrow);\n  },\n\n  /**\n   * Checks if a date is valid\n   * @param date - Date to check\n   * @returns True if date is valid\n   */\n  isValidDate(date: DateArg): boolean {\n    try {\n      return !Number.isNaN(this.convertToDate(date).getTime());\n    } catch {\n      return false;\n    }\n  },\n\n  /**\n   * Checks if a date falls on a weekday\n   * @param date - Date to check\n   * @returns True if the date is a weekday\n   */\n  isWeekday(date: DateArg): boolean {\n    return !this.isWeekend(date);\n  },\n\n  /**\n   * Checks if a date falls on a weekend\n   * @param date - Date to check\n   * @returns True if the date is a weekend\n   */\n  isWeekend(date: DateArg): boolean {\n    const day = this.convertToDate(date).getUTCDay();\n    return day === 0 || day === 6;\n  },\n\n  /**\n   * Checks if a date is yesterday\n   * @param date - Date to check\n   * @returns True if date is yesterday\n   */\n  isYesterday(date: DateArg): boolean {\n    const yesterday = new Date();\n    yesterday.setDate(yesterday.getDate() - 1);\n    return this.isSameDay(date, yesterday);\n  },\n\n  /**\n   * Normalizes a date to UTC midnight\n   * @param date - Date to normalize\n   * @returns Normalized date or null if invalid\n   */\n  normalizeDate(date: DateArg): Date | null {\n    if (!date) return null;\n\n    try {\n      // Handle MM/YYYY format first\n      if (typeof date === \"string\") {\n        const parts = date.split(\"/\");\n        if (\n          parts.length === 2 &&\n          parts[0].length === 2 &&\n          parts[1].length === 4\n        ) {\n          const month = parseInt(parts[0], 10);\n          const year = parseInt(parts[1], 10);\n          if (!isNaN(month) && !isNaN(year) && month >= 1 && month <= 12) {\n            return new Date(Date.UTC(year, month - 1, 1));\n          }\n        }\n      }\n\n      // Handle other date formats\n      const parsedDate = this.convertToDate(date);\n      if (!isNaN(parsedDate.valueOf())) {\n        return new Date(\n          Date.UTC(\n            parsedDate.getUTCFullYear(),\n            parsedDate.getUTCMonth(),\n            parsedDate.getUTCDate()\n          )\n        );\n      }\n    } catch {\n      // Invalid date, return null\n    }\n\n    return null;\n  },\n\n  /**\n   * Subtracts specified time units from a date\n   * @param args - Object containing time units to subtract\n   * @param date - Date to subtract from (defaults to current date)\n   * @returns New date with subtracted time units\n   * @throws Error if any time unit is negative\n   */\n  subtract(args: TimeUnitArgs, date: DateArg = new Date()): Date {\n    this.validateTimeUnits(args);\n    const dt = this.convertToDate(date);\n    return this.adjustDate(args, dt, -1);\n  },\n\n  /**\n   * Converts a date to a local ISO string\n   * @param date - Date to convert\n   * @returns Local ISO string representation\n   */\n  toLocalISOString(date: Date): string {\n    const pad = (num: number): string => String(num).padStart(2, \"0\");\n    return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(\n      date.getDate()\n    )}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(\n      date.getSeconds()\n    )}.${String(date.getMilliseconds()).padStart(3, \"0\")}`;\n  },\n\n  /**\n   * Validates time unit arguments\n   * @param args - Time unit arguments to validate\n   * @throws Error if any time unit is negative\n   */\n  validateTimeUnits(args: TimeUnitArgs): void {\n    for (const [unit, value] of Object.entries(args)) {\n      if (value !== undefined && value < 0) {\n        throw new Error(\n          `Negative values are not allowed for time unit: ${unit}`\n        );\n      }\n    }\n  },\n};\n"],"names":[],"mappings":"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"}