{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * A lightweight date utility class for parsing, formatting, and manipulating dates.\n */\nexport class ProDate {\n  private date: Date;\n\n  constructor(date?: string | number | Date) {\n    this.date = new Date(date || Date.now());\n  }\n\n  // Factory Methods\n\n  /**\n   * Create a ProDate instance from a string.\n   * @param dateString - A date string to parse.\n   */\n  static fromString(dateString: string): ProDate {\n    return new ProDate(new Date(dateString));\n  }\n\n  /**\n   * Create a ProDate instance from a timestamp.\n   * @param timestamp - The number of milliseconds since January 1, 1970.\n   */\n  static fromTimestamp(timestamp: number): ProDate {\n    return new ProDate(new Date(timestamp));\n  }\n\n  /**\n   * Create a new ProDate instance representing the current date and time.\n   */\n  static now(): ProDate {\n    return new ProDate();\n  }\n\n  // Formatting Methods\n\n  /**\n   * Formats the date according to the specified format string.\n   *\n   * ### Supported Format Tokens:\n   *\n   * #### **Year**:\n   * - `YYYY`: Full year (e.g., 2024)\n   * - `YY`: Two-digit year (e.g., 24)\n   * - `Y`: Year without padding (e.g., 2024)\n   *\n   * #### **Quarter**:\n   * - `Q`: Quarter of the year (1-4)\n   *\n   * #### **Month**:\n   * - `MMMM`: Full month name (e.g., January)\n   * - `MMM`: Abbreviated month name (e.g., Jan)\n   * - `MM`: Two-digit month (01-12)\n   * - `M`: Month without padding (1-12)\n   * - `Mo`: Month as an ordinal number (e.g., 1st, 2nd)\n   *\n   * #### **Day of Month**:\n   * - `DD`: Two-digit day of the month (01-31)\n   * - `D`: Day of the month without padding (1-31)\n   * - `Do`: Ordinal day of the month (e.g., 1st, 2nd)\n   *\n   * #### **Day of Year**:\n   * - `DDD`: Three-digit day of the year (001-365 or 366)\n   * - `DDDD`: Day of the year (1-365 or 366)\n   *\n   * #### **Day of Week**:\n   * - `dddd`: Full day name (e.g., Monday)\n   * - `ddd`: Abbreviated day name (e.g., Mon)\n   * - `dd`: Minimal day name (e.g., Mo, Tu)\n   * - `d`: Day of the week (0 = Sunday, 6 = Saturday)\n   * - `E`: ISO day of the week (1 = Monday, 7 = Sunday)\n   *\n   * #### **Week of Year**:\n   * - `w`: Week of the year (1-52 or 1-53)\n   * - `ww`: Week of the year, zero-padded (01-52 or 01-53)\n   * - `W`: ISO week of the year (1-52 or 1-53)\n   * - `WW`: ISO week of the year, zero-padded (01-52 or 01-53)\n   *\n   * #### **Hour (24-hour format)**:\n   * - `HH`: Two-digit hour in 24-hour format (00-23)\n   * - `H`: Hour in 24-hour format (0-23)\n   *\n   * #### **Hour (12-hour format)**:\n   * - `hh`: Two-digit hour in 12-hour format (01-12)\n   * - `h`: Hour in 12-hour format (1-12)\n   *\n   * #### **Minute**:\n   * - `mm`: Two-digit minutes (00-59)\n   * - `m`: Minutes without padding (0-59)\n   *\n   * #### **Second**:\n   * - `ss`: Two-digit seconds (00-59)\n   * - `s`: Seconds without padding (0-59)\n   *\n   * #### **Fractional Seconds**:\n   * - `SSS`: Three-digit milliseconds (000-999)\n   * - `SS`: Hundredths of a second (00-99)\n   * - `S`: Tenths of a second (0-9)\n   *\n   * #### **Period (AM/PM)**:\n   * - `A`: Uppercase AM/PM\n   * - `a`: Lowercase am/pm\n   *\n   * #### **Timezone**:\n   * - `Z`: Timezone offset with colon (e.g., +02:00)\n   * - `ZZ`: Timezone offset without colon (e.g., +0200)\n   * - `z`: Abbreviated timezone name (e.g., EST, PST)\n   *\n   * #### **Unix Timestamp**:\n   * - `X`: Unix timestamp in seconds\n   * - `x`: Unix timestamp in milliseconds\n   *\n   * #### **Custom Formats**:\n   * - `LT`: Time in format 'h:mm A' (e.g., 2:30 PM)\n   * - `LTS`: Time in format 'h:mm:ss A' (e.g., 2:30:15 PM)\n   * - `L`: Date in format 'MM/DD/YYYY' (e.g., 02/27/2024)\n   * - `LL`: Date in format 'MMMM D, YYYY' (e.g., February 27, 2024)\n   * - `LLL`: DateTime in format 'MMMM D, YYYY h:mm A' (e.g., February 27, 2024 2:30 PM)\n   * - `LLLL`: DateTime in format 'dddd, MMMM D, YYYY h:mm A' (e.g., Tuesday, February 27, 2024 2:30 PM)\n   *\n   * @param formatString - The format string containing tokens.\n   */\n  format(formatString: string): string {\n    const map = {\n      // Year\n      YYYY: this.date.getFullYear().toString(), // Full year (e.g., 2024)\n      YY: this.date.getFullYear().toString().slice(-2), // Two-digit year (e.g., 24)\n      Y: this.date.getFullYear().toString(), // Year, no padding (e.g., 2024)\n\n      // Quarter\n      Q: Math.ceil((this.date.getMonth() + 1) / 3).toString(), // Quarter of the year (1-4)\n\n      // Month\n      MMMM: this.date.toLocaleString(\"default\", { month: \"long\" }), // Full month name (January)\n      MMM: this.date.toLocaleString(\"default\", { month: \"short\" }), // Abbreviated month name (Jan)\n      MM: (this.date.getMonth() + 1).toString().padStart(2, \"0\"), // Two-digit month (01-12)\n      M: (this.date.getMonth() + 1).toString(), // Month without padding (1-12)\n      Mo: `${this.date.getMonth() + 1}${this.getOrdinal(this.date.getMonth() + 1)}`, // Ordinal month\n\n      // Day of Month\n      DD: this.date.getDate().toString().padStart(2, \"0\"), // Two-digit day (01-31)\n      D: this.date.getDate().toString(), // Day without padding (1-31)\n      Do: `${this.date.getDate()}${this.getOrdinal(this.date.getDate())}`, // Ordinal day (1st, 2nd)\n\n      // Day of Year\n      DDD: this.getDayOfYear().toString().padStart(3, \"0\"), // Three-digit day of the year\n      DDDD: this.getDayOfYear().toString(), // Day of the year\n\n      // Day of Week\n      dddd: this.date.toLocaleString(\"default\", { weekday: \"long\" }), // Full day name (Monday)\n      ddd: this.date.toLocaleString(\"default\", { weekday: \"short\" }), // Abbreviated day name (Mon)\n      dd: this.date.toLocaleString(\"default\", { weekday: \"narrow\" }), // Minimal day name (Mo)\n      d: this.date.getDay().toString(), // Day of the week (0 = Sunday, 6 = Saturday)\n      E: (this.date.getDay() + 1).toString(), // ISO day of the week (1 = Monday)\n\n      // Week of Year\n      w: this.getWeekOfYear().toString(), // Week of the year\n      ww: this.getWeekOfYear().toString().padStart(2, \"0\"), // Zero-padded week of the year\n\n      // ISO Week of Year\n      W: this.getISOWeekOfYear().toString(), // ISO week of the year\n      WW: this.getISOWeekOfYear().toString().padStart(2, \"0\"), // Zero-padded ISO week\n\n      // Hour (24-hour format)\n      HH: this.date.getHours().toString().padStart(2, \"0\"), // Two-digit 24-hour format (00-23)\n      H: this.date.getHours().toString(), // 24-hour format (0-23)\n\n      // Hour (12-hour format)\n      hh: (this.date.getHours() % 12 || 12).toString().padStart(2, \"0\"), // Two-digit 12-hour format (01-12)\n      h: (this.date.getHours() % 12 || 12).toString(), // 12-hour format (1-12)\n\n      // Minute\n      mm: this.date.getMinutes().toString().padStart(2, \"0\"), // Two-digit minutes (00-59)\n      m: this.date.getMinutes().toString(), // Minutes (0-59)\n\n      // Second\n      ss: this.date.getSeconds().toString().padStart(2, \"0\"), // Two-digit seconds (00-59)\n      s: this.date.getSeconds().toString(), // Seconds (0-59)\n\n      // Fractional Seconds\n      SSS: this.date.getMilliseconds().toString().padStart(3, \"0\"), // Three-digit milliseconds (000-999)\n      SS: this.date.getMilliseconds().toString().slice(0, 2), // Hundredths of a second (00-99)\n      S: this.date.getMilliseconds().toString().charAt(0), // Tenths of a second (0-9)\n\n      // AM/PM\n      A: this.date.getHours() < 12 ? \"AM\" : \"PM\", // Uppercase AM/PM\n      a: this.date.getHours() < 12 ? \"am\" : \"pm\", // Lowercase am/pm\n\n      // Timezone\n      Z: this.formatTimezoneOffset(true), // Timezone offset with colon (+02:00)\n      ZZ: this.formatTimezoneOffset(false), // Timezone offset without colon (+0200)\n      z: this.getTimeZoneName(), // Abbreviated timezone name (PST)\n\n      // Unix Timestamp\n      X: Math.floor(this.date.getTime() / 1000).toString(), // Unix timestamp (seconds)\n      x: this.date.getTime().toString(), // Unix timestamp (milliseconds)\n\n      // Custom\n      LT: this.format(\"h:mm A\"), // Time in format 'h:mm A' (e.g., 2:30 PM)\n      LTS: this.format(\"h:mm:ss A\"), // Time in format 'h:mm:ss A' (e.g., 2:30:15 PM)\n      L: this.format(\"MM/DD/YYYY\"), // Date in format 'MM/DD/YYYY' (e.g., 02/27/2024)\n      LL: this.format(\"MMMM D, YYYY\"), // Date in format 'MMMM D, YYYY' (e.g., February 27, 2024)\n      LLL: this.format(\"MMMM D, YYYY h:mm A\"), // DateTime in format 'MMMM D, YYYY h:mm A' (e.g., February 27, 2024 2:30 PM)\n      LLLL: this.format(\"dddd, MMMM D, YYYY h:mm A\"), // DateTime in format 'dddd, MMMM D, YYYY h:mm A' (e.g., Tuesday, February 27, 2024 2:30 PM)\n    };\n\n    return formatString.replace(\n      /YYYY|YY|Y|Q|MMMM|MMM|MM|M|Mo|DD|D|Do|DDD|DDDD|dddd|ddd|dd|d|E|w|ww|W|WW|HH|H|hh|h|mm|m|ss|s|SSS|SS|S|A|a|Z|ZZ|z|X|x|LT|LTS|L|LL|LLL|LLLL/g,\n      (matched) => map[matched as keyof typeof map],\n    );\n  }\n\n  /**\n   * Helper function to get ordinal suffix for a given number.\n   * E.g., 1 -> 'st', 2 -> 'nd', 3 -> 'rd', etc.\n   */\n  private getOrdinal(n: number): string {\n    const s = [\"th\", \"st\", \"nd\", \"rd\"];\n    const v = n % 100;\n    return s[(v - 20) % 10] || s[v] || s[0];\n  }\n\n  /**\n   * Helper function to get the day of the year (1-365 or 1-366 for leap years).\n   */\n  private getDayOfYear(): number {\n    const start = new Date(this.date.getFullYear(), 0, 0);\n    const diff =\n      this.date.getTime() -\n      start.getTime() +\n      (start.getTimezoneOffset() - this.date.getTimezoneOffset()) * 60 * 1000;\n    return Math.floor(diff / (1000 * 60 * 60 * 24));\n  }\n\n  /**\n   * Helper function to get the week number (ISO 8601).\n   */\n  private getWeekOfYear(): number {\n    const oneJan = new Date(this.date.getFullYear(), 0, 1);\n    const days = Math.floor(\n      (this.date.getTime() - oneJan.getTime()) / (24 * 60 * 60 * 1000),\n    );\n    return Math.ceil((this.date.getDay() + 1 + days) / 7);\n  }\n\n  /**\n   * Helper function to get the ISO week number (week starting on Monday).\n   */\n  private getISOWeekOfYear(): number {\n    const date = new Date(this.date);\n    const dayNum = date.getUTCDay() || 7;\n    date.setUTCDate(date.getUTCDate() + 4 - dayNum);\n    const yearStart = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));\n    return Math.ceil(\n      ((date.getTime() - yearStart.getTime()) / 86400000 + 1) / 7,\n    );\n  }\n\n  /**\n   * Helper function to format the timezone offset.\n   * @param colon - Whether to include a colon in the offset (e.g., +02:00 vs +0200).\n   */\n  private formatTimezoneOffset(colon: boolean): string {\n    const offset = this.date.getTimezoneOffset();\n    const sign = offset > 0 ? \"-\" : \"+\";\n    const absOffset = Math.abs(offset);\n    const hours = Math.floor(absOffset / 60)\n      .toString()\n      .padStart(2, \"0\");\n    const minutes = (absOffset % 60).toString().padStart(2, \"0\");\n    return colon ? `${sign}${hours}:${minutes}` : `${sign}${hours}${minutes}`;\n  }\n\n  /**\n   * Helper function to get the timezone name (abbreviation).\n   */\n  private getTimeZoneName(): string {\n    return this.date\n      .toLocaleTimeString(\"en-us\", { timeZoneName: \"short\" })\n      .split(\" \")[2];\n  }\n\n  /**\n   * Converts the date to an ISO 8601 string (e.g., '2024-09-23T14:00:00Z').\n   */\n  toISOString(): string {\n    return this.date.toISOString();\n  }\n\n  /**\n   * Converts the date to a UTC string.\n   */\n  toUTCString(): string {\n    return this.date.toUTCString();\n  }\n\n  /**\n   * Converts the date to a locale string, using an optional locale parameter.\n   * @param locale - The locale to use for formatting (default is 'en-US').\n   */\n  toLocaleString(locale?: string): string {\n    return this.date.toLocaleString(locale || \"en-US\");\n  }\n\n  // Date Part Getters\n\n  /**\n   * Gets the full year of the date (e.g., 2024).\n   */\n  getYear(): number {\n    return this.date.getFullYear();\n  }\n\n  /**\n   * Gets the month of the date (1-12).\n   */\n  getMonth(): number {\n    return this.date.getMonth() + 1;\n  }\n\n  /**\n   * Gets the day of the month (1-31).\n   */\n  getDayOfMonth(): number {\n    return this.date.getDate();\n  }\n\n  /**\n   * Gets the day of the week (0 = Sunday, 6 = Saturday).\n   */\n  getDayOfWeek(): number {\n    return this.date.getDay();\n  }\n\n  /**\n   * Gets the hours (0-23).\n   */\n  getHours(): number {\n    return this.date.getHours();\n  }\n\n  /**\n   * Gets the minutes (0-59).\n   */\n  getMinutes(): number {\n    return this.date.getMinutes();\n  }\n\n  /**\n   * Gets the seconds (0-59).\n   */\n  getSeconds(): number {\n    return this.date.getSeconds();\n  }\n\n  /**\n   * Gets the milliseconds (0-999).\n   */\n  getMilliseconds(): number {\n    return this.date.getMilliseconds();\n  }\n\n  // Date Manipulation Methods\n\n  /**\n   * Adds the specified number of years to the date.\n   * @param amount - The number of years to add.\n   */\n  addYears(amount: number): ProDate {\n    this.date.setFullYear(this.date.getFullYear() + amount);\n    return this;\n  }\n\n  /**\n   * Adds the specified number of months to the date.\n   * @param amount - The number of months to add.\n   */\n  addMonths(amount: number): ProDate {\n    this.date.setMonth(this.date.getMonth() + amount);\n    return this;\n  }\n\n  /**\n   * Adds the specified number of days to the date.\n   * @param amount - The number of days to add.\n   */\n  addDays(amount: number): ProDate {\n    this.date.setDate(this.date.getDate() + amount);\n    return this;\n  }\n\n  /**\n   * Adds the specified number of hours to the date.\n   * @param amount - The number of hours to add.\n   */\n  addHours(amount: number): ProDate {\n    this.date.setHours(this.date.getHours() + amount);\n    return this;\n  }\n\n  /**\n   * Adds the specified number of minutes to the date.\n   * @param amount - The number of minutes to add.\n   */\n  addMinutes(amount: number): ProDate {\n    this.date.setMinutes(this.date.getMinutes() + amount);\n    return this;\n  }\n\n  /**\n   * Adds the specified number of seconds to the date.\n   * @param amount - The number of seconds to add.\n   */\n  addSeconds(amount: number): ProDate {\n    this.date.setSeconds(this.date.getSeconds() + amount);\n    return this;\n  }\n\n  // Subtraction (Inverse Manipulation)\n\n  /**\n   * Subtracts the specified number of years from the date.\n   * @param amount - The number of years to subtract.\n   */\n  subtractYears(amount: number): ProDate {\n    return this.addYears(-amount);\n  }\n\n  /**\n   * Subtracts the specified number of months from the date.\n   * @param amount - The number of months to subtract.\n   */\n  subtractMonths(amount: number): ProDate {\n    return this.addMonths(-amount);\n  }\n\n  /**\n   * Subtracts the specified number of days from the date.\n   * @param amount - The number of days to subtract.\n   */\n  subtractDays(amount: number): ProDate {\n    return this.addDays(-amount);\n  }\n\n  /**\n   * Subtracts the specified number of hours from the date.\n   * @param amount - The number of hours to subtract.\n   */\n  subtractHours(amount: number): ProDate {\n    return this.addHours(-amount);\n  }\n\n  /**\n   * Subtracts the specified number of minutes from the date.\n   * @param amount - The number of minutes to subtract.\n   */\n  subtractMinutes(amount: number): ProDate {\n    return this.addMinutes(-amount);\n  }\n\n  /**\n   * Subtracts the specified number of seconds from the date.\n   * @param amount - The number of seconds to subtract.\n   */\n  subtractSeconds(amount: number): ProDate {\n    return this.addSeconds(-amount);\n  }\n\n  // Comparison Methods\n\n  /**\n   * Determines if this date is the same day as the provided date.\n   * @param otherDate - The other ProDate instance to compare to.\n   */\n  isSameDay(otherDate: ProDate): boolean {\n    return (\n      this.getYear() === otherDate.getYear() &&\n      this.getMonth() === otherDate.getMonth() &&\n      this.getDayOfMonth() === otherDate.getDayOfMonth()\n    );\n  }\n\n  // Utility Methods\n\n  /**\n   * Gets the timestamp (milliseconds since January 1, 1970).\n   */\n  getTime(): number {\n    return this.date.getTime();\n  }\n\n  /**\n   * Returns the number of days in the current month.\n   */\n  daysInMonth(): number {\n    return new Date(this.getYear(), this.getMonth(), 0).getDate();\n  }\n\n  /**\n   * Sets the time to the start of the day (00:00:00).\n   */\n  startOfDay(): ProDate {\n    this.date.setHours(0, 0, 0, 0);\n    return this;\n  }\n\n  /**\n   * Sets the time to the end of the day (23:59:59.999).\n   */\n  endOfDay(): ProDate {\n    this.date.setHours(23, 59, 59, 999);\n    return this;\n  }\n\n  /**\n   * Sets the date to the start of the current month.\n   */\n  startOfMonth(): ProDate {\n    return new ProDate(new Date(this.getYear(), this.getMonth() - 1, 1));\n  }\n\n  /**\n   * Sets the date to the end of the current month.\n   */\n  endOfMonth(): ProDate {\n    return new ProDate(new Date(this.getYear(), this.getMonth(), 0));\n  }\n\n  // Validation Methods\n\n  /**\n   * Validates if the date is a valid Date object.\n   */\n  isValid(): boolean {\n    return !isNaN(this.date.getTime());\n  }\n\n  /**\n   * Checks if the date falls on a weekend (Saturday or Sunday).\n   */\n  isWeekend(): boolean {\n    const day = this.getDayOfWeek();\n    return day === 0 || day === 6;\n  }\n\n  // Business Day Methods\n\n  /**\n   * Adds business days (Monday to Friday) to the date, skipping weekends.\n   * @param days - The number of business days to add.\n   */\n  addBusinessDays(days: number): ProDate {\n    let count = 0;\n    while (count < days) {\n      this.addDays(1);\n      if (!this.isWeekend()) {\n        count++;\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Subtracts business days (Monday to Friday) from the date, skipping weekends.\n   * @param days - The number of business days to subtract.\n   */\n  subtractBusinessDays(days: number): ProDate {\n    let count = 0;\n    while (count < days) {\n      this.subtractDays(1);\n      if (!this.isWeekend()) {\n        count++;\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Gets the quarter of the year (1-4).\n   */\n  getQuarter(): number {\n    return Math.floor((this.getMonth() - 1) / 3) + 1;\n  }\n\n  /**\n   * Adds the specified number of quarters to the date.\n   * @param quarters - The number of quarters to add.\n   */\n  addQuarters(quarters: number): ProDate {\n    this.addMonths(quarters * 3);\n    return this;\n  }\n\n  /**\n   * Subtracts the specified number of quarters from the date.\n   * @param quarters - The number of quarters to subtract.\n   */\n  subtractQuarters(quarters: number): ProDate {\n    return this.addQuarters(-quarters);\n  }\n\n  /**\n   * Gets the start of the current quarter.\n   */\n  startOfQuarter(): ProDate {\n    const quarter = this.getQuarter();\n    const firstMonthOfQuarter = (quarter - 1) * 3;\n    return new ProDate(new Date(this.getYear(), firstMonthOfQuarter, 1));\n  }\n\n  /**\n   * Gets the end of the current quarter.\n   */\n  endOfQuarter(): ProDate {\n    const quarter = this.getQuarter();\n    const lastMonthOfQuarter = quarter * 3;\n    const endOfMonth = new Date(this.getYear(), lastMonthOfQuarter, 0);\n    return new ProDate(endOfMonth);\n  }\n\n  /**\n   * Adds the specified number of weeks to the date.\n   * @param weeks - The number of weeks to add.\n   */\n  addWeeks(weeks: number): ProDate {\n    this.addDays(weeks * 7);\n    return this;\n  }\n\n  /**\n   * Subtracts the specified number of weeks from the date.\n   * @param weeks - The number of weeks to subtract.\n   */\n  subtractWeeks(weeks: number): ProDate {\n    return this.addWeeks(-weeks);\n  }\n\n  /**\n   * Gets the start of the current week (Monday).\n   */\n  startOfWeek(): ProDate {\n    const dayOfWeek = this.getDayOfWeek();\n    const diff = (dayOfWeek === 0 ? -6 : 1) - dayOfWeek;\n    return new ProDate(this.addDays(diff).getTime());\n  }\n\n  /**\n   * Gets the end of the current week (Sunday).\n   */\n  endOfWeek(): ProDate {\n    const dayOfWeek = this.getDayOfWeek();\n    const diff = 7 - dayOfWeek;\n    return new ProDate(this.addDays(diff).getTime());\n  }\n\n  /**\n   * Checks if the current year is a leap year.\n   */\n  isLeapYear(): boolean {\n    const year = this.getYear();\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n  }\n\n  /**\n   * Gets the number of days in the current year (365 or 366).\n   */\n  daysInYear(): number {\n    return this.isLeapYear() ? 366 : 365;\n  }\n\n  /**\n   * Adds the specified number of fiscal years to the date (assuming fiscal year starts in April).\n   * @param years - The number of fiscal years to add.\n   */\n  addFiscalYears(years: number): ProDate {\n    const fiscalStartMonth = 3; // April\n    this.addYears(years);\n    if (this.getMonth() < fiscalStartMonth) {\n      this.setMonth(fiscalStartMonth);\n    }\n    return this;\n  }\n\n  /**\n   * Gets the start of the fiscal year (assuming fiscal year starts in April).\n   */\n  startOfFiscalYear(): ProDate {\n    return new ProDate(new Date(this.getYear(), 3, 1)); // April 1st\n  }\n\n  /**\n   * Gets the end of the fiscal year (assuming fiscal year ends in March).\n   */\n  endOfFiscalYear(): ProDate {\n    return new ProDate(new Date(this.getYear() + 1, 2, 31)); // March 31st\n  }\n\n  /**\n   * Checks if the current date is a weekday (Monday-Friday).\n   */\n  isWeekday(): boolean {\n    const dayOfWeek = this.getDayOfWeek();\n    return dayOfWeek >= 1 && dayOfWeek <= 5;\n  }\n\n  /**\n   * Converts the current date to a Unix timestamp.\n   */\n  toUnixTimestamp(): number {\n    return Math.floor(this.getTime() / 1000);\n  }\n\n  /**\n   * Gets the timezone offset in minutes.\n   */\n  getTimezoneOffset(): number {\n    return this.date.getTimezoneOffset();\n  }\n\n  /**\n   * Converts the current date to UTC.\n   */\n  toUTC(): ProDate {\n    return new ProDate(this.date.toUTCString());\n  }\n\n  /**\n   * Converts the current date to local time.\n   */\n  toLocal(): ProDate {\n    const localDate = new Date(this.date.toLocaleString());\n    return new ProDate(localDate);\n  }\n\n  /**\n   * Checks if the current date is in the past.\n   */\n  isPast(): boolean {\n    return this.getTime() < Date.now();\n  }\n\n  /**\n   * Checks if the current date is in the future.\n   */\n  isFuture(): boolean {\n    return this.getTime() > Date.now();\n  }\n\n  /**\n   * Checks if the current date is today.\n   */\n  isToday(): boolean {\n    const today = new Date();\n    return (\n      this.getYear() === today.getFullYear() &&\n      this.getMonth() === today.getMonth() + 1 &&\n      this.getDayOfMonth() === today.getDate()\n    );\n  }\n\n  /**\n   * Rounds the date to the nearest minute.\n   */\n  roundToNearestMinute(): ProDate {\n    const seconds = this.getSeconds();\n    if (seconds >= 30) {\n      this.addMinutes(1);\n    }\n    this.setSeconds(0);\n    return this;\n  }\n\n  /**\n   * Rounds the date to the nearest hour.\n   */\n  roundToNearestHour(): ProDate {\n    const minutes = this.getMinutes();\n    if (minutes >= 30) {\n      this.addHours(1);\n    }\n    this.setMinutes(0);\n    return this;\n  }\n\n  /**\n   * Rounds the date to the nearest day.\n   */\n  roundToNearestDay(): ProDate {\n    const hours = this.getHours();\n    if (hours >= 12) {\n      this.addDays(1);\n    }\n    this.startOfDay();\n    return this;\n  }\n\n  /**\n   * Sets the year of the date.\n   * @param year - The year to set.\n   */\n  setYear(year: number): ProDate {\n    this.date.setFullYear(year);\n    return this;\n  }\n\n  /**\n   * Sets the month of the date (1-12).\n   * @param month - The month to set (1 = January, 12 = December).\n   */\n  setMonth(month: number): ProDate {\n    this.date.setMonth(month - 1);\n    return this;\n  }\n\n  /**\n   * Sets the day of the month (1-31).\n   * @param day - The day of the month to set.\n   */\n  setDayOfMonth(day: number): ProDate {\n    this.date.setDate(day);\n    return this;\n  }\n\n  /**\n   * Sets the hours of the date (0-23).\n   * @param hours - The hours to set.\n   */\n  setHours(hours: number): ProDate {\n    this.date.setHours(hours);\n    return this;\n  }\n\n  /**\n   * Sets the minutes of the date (0-59).\n   * @param minutes - The minutes to set.\n   */\n  setMinutes(minutes: number): ProDate {\n    this.date.setMinutes(minutes);\n    return this;\n  }\n\n  /**\n   * Sets the seconds of the date (0-59).\n   * @param seconds - The seconds to set.\n   */\n  setSeconds(seconds: number): ProDate {\n    this.date.setSeconds(seconds);\n    return this;\n  }\n\n  /**\n   * Sets the milliseconds of the date (0-999).\n   * @param milliseconds - The milliseconds to set.\n   */\n  setMilliseconds(milliseconds: number): ProDate {\n    this.date.setMilliseconds(milliseconds);\n    return this;\n  }\n\n  /**\n   * Gets the difference between this date and another date in days.\n   * @param otherDate - The date to compare with.\n   */\n  differenceInDays(otherDate: ProDate): number {\n    const diffInMs = this.getTime() - otherDate.getTime();\n    return Math.floor(diffInMs / (1000 * 60 * 60 * 24));\n  }\n\n  /**\n   * Gets the difference between this date and another date in hours.\n   * @param otherDate - The date to compare with.\n   */\n  differenceInHours(otherDate: ProDate): number {\n    const diffInMs = this.getTime() - otherDate.getTime();\n    return Math.floor(diffInMs / (1000 * 60 * 60));\n  }\n\n  /**\n   * Gets the difference between this date and another date in minutes.\n   * @param otherDate - The date to compare with.\n   */\n  differenceInMinutes(otherDate: ProDate): number {\n    const diffInMs = this.getTime() - otherDate.getTime();\n    return Math.floor(diffInMs / (1000 * 60));\n  }\n\n  /**\n   * Gets the difference between this date and another date in seconds.\n   * @param otherDate - The date to compare with.\n   */\n  differenceInSeconds(otherDate: ProDate): number {\n    const diffInMs = this.getTime() - otherDate.getTime();\n    return Math.floor(diffInMs / 1000);\n  }\n\n  /**\n   * Gets the start of the current decade.\n   */\n  startOfDecade(): ProDate {\n    const decadeStart = Math.floor(this.getYear() / 10) * 10;\n    return new ProDate(new Date(decadeStart, 0, 1));\n  }\n\n  /**\n   * Gets the end of the current decade.\n   */\n  endOfDecade(): ProDate {\n    const decadeEnd = Math.floor(this.getYear() / 10) * 10 + 9;\n    return new ProDate(new Date(decadeEnd, 11, 31, 23, 59, 59, 999));\n  }\n\n  /**\n   * Gets the start of the current century.\n   */\n  startOfCentury(): ProDate {\n    const centuryStart = Math.floor(this.getYear() / 100) * 100;\n    return new ProDate(new Date(centuryStart, 0, 1));\n  }\n\n  /**\n   * Gets the end of the current century.\n   */\n  endOfCentury(): ProDate {\n    const centuryEnd = Math.floor(this.getYear() / 100) * 100 + 99;\n    return new ProDate(new Date(centuryEnd, 11, 31, 23, 59, 59, 999));\n  }\n\n  /**\n   * Gets the start of the current millennium.\n   */\n  startOfMillennium(): ProDate {\n    const millenniumStart = Math.floor(this.getYear() / 1000) * 1000;\n    return new ProDate(new Date(millenniumStart, 0, 1));\n  }\n\n  /**\n   * Gets the end of the current millennium.\n   */\n  endOfMillennium(): ProDate {\n    const millenniumEnd = Math.floor(this.getYear() / 1000) * 1000 + 999;\n    return new ProDate(new Date(millenniumEnd, 11, 31, 23, 59, 59, 999));\n  }\n\n  /**\n   * Gets the number of weeks in the current year (52 or 53 weeks).\n   */\n  weeksInYear(): number {\n    const lastDayOfYear = new Date(this.getYear(), 11, 31);\n    const firstDayOfYear = new Date(this.getYear(), 0, 1);\n    const lastWeekDay = lastDayOfYear.getDay();\n    const firstWeekDay = firstDayOfYear.getDay();\n    return lastWeekDay === 0 || firstWeekDay === 1 ? 53 : 52;\n  }\n\n  /**\n   * Adds a number of milliseconds to the date.\n   * @param milliseconds - The number of milliseconds to add.\n   */\n  addMilliseconds(milliseconds: number): ProDate {\n    this.date.setMilliseconds(this.date.getMilliseconds() + milliseconds);\n    return this;\n  }\n\n  /**\n   * Subtracts a number of milliseconds from the date.\n   * @param milliseconds - The number of milliseconds to subtract.\n   */\n  subtractMilliseconds(milliseconds: number): ProDate {\n    this.date.setMilliseconds(this.date.getMilliseconds() - milliseconds);\n    return this;\n  }\n\n  /**\n   * Checks if the current date is the start of the month.\n   */\n  isStartOfMonth(): boolean {\n    return this.getDayOfMonth() === 1;\n  }\n\n  /**\n   * Checks if the current date is the end of the month.\n   */\n  isEndOfMonth(): boolean {\n    const lastDayOfMonth = new Date(\n      this.getYear(),\n      this.getMonth(),\n      0,\n    ).getDate();\n    return this.getDayOfMonth() === lastDayOfMonth;\n  }\n\n  /**\n   * Checks if the current date is the start of the week (Monday).\n   */\n  isStartOfWeek(): boolean {\n    return this.getDayOfWeek() === 1; // Monday\n  }\n\n  /**\n   * Checks if the current date is the end of the week (Sunday).\n   */\n  isEndOfWeek(): boolean {\n    return this.getDayOfWeek() === 0; // Sunday\n  }\n\n  /**\n   * Returns the current date as a JavaScript object.\n   */\n  toJSObject(): Object {\n    return {\n      year: this.getYear(),\n      month: this.getMonth(),\n      day: this.getDayOfMonth(),\n      hours: this.getHours(),\n      minutes: this.getMinutes(),\n      seconds: this.getSeconds(),\n      milliseconds: this.getMilliseconds(),\n    };\n  }\n\n  /**\n   * Gets the number of seconds since the Unix epoch.\n   */\n  getEpochSeconds(): number {\n    return Math.floor(this.getTime() / 1000);\n  }\n\n  /**\n   * Returns the current date in the ISO 8601 week date format (YYYY-Www-D).\n   */\n  toISOWeekDate(): string {\n    const weekOfYear = this.getWeekOfYear();\n    return `${this.getYear()}-W${weekOfYear.toString().padStart(2, \"0\")}-${this.getDayOfWeek() || 7}`;\n  }\n\n  /**\n   * Converts the current date to the ISO 8601 string (YYYY-MM-DDTHH:mm:ss.sssZ).\n   */\n  toISO8601(): string {\n    return this.toISOString();\n  }\n\n  /**\n   * Adds the specified number of leap years to the current date.\n   * @param leapYears - The number of leap years to add.\n   */\n  addLeapYears(leapYears: number): ProDate {\n    let addedYears = 0;\n    while (addedYears < leapYears) {\n      this.addYears(1);\n      if (this.isLeapYear()) {\n        addedYears++;\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Subtracts the specified number of leap years from the current date.\n   * @param leapYears - The number of leap years to subtract.\n   */\n  subtractLeapYears(leapYears: number): ProDate {\n    let subtractedYears = 0;\n    while (subtractedYears < leapYears) {\n      this.subtractYears(1);\n      if (this.isLeapYear()) {\n        subtractedYears++;\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Checks if the current date is a holiday (based on a predefined list of holidays).\n   * @param holidays - An array of holiday strings in 'MM-DD' format.\n   */\n  isHoliday(holidays: string[]): boolean {\n    const monthDay = `${this.getMonth().toString().padStart(2, \"0\")}-${this.getDayOfMonth().toString().padStart(2, \"0\")}`;\n    return holidays.includes(monthDay);\n  }\n\n  /**\n   * Gets the start of the next day.\n   */\n  startOfNextDay(): ProDate {\n    return this.addDays(1).startOfDay();\n  }\n\n  /**\n   * Gets the end of the previous day.\n   */\n  endOfPreviousDay(): ProDate {\n    return this.subtractDays(1).endOfDay();\n  }\n\n  /**\n   * Adds or subtracts the specified number of decades.\n   * @param decades - The number of decades to add or subtract.\n   */\n  addDecades(decades: number): ProDate {\n    return this.addYears(decades * 10);\n  }\n\n  /**\n   * Subtracts the specified number of decades.\n   * @param decades - The number of decades to subtract.\n   */\n  subtractDecades(decades: number): ProDate {\n    return this.addYears(decades * -10);\n  }\n\n  /**\n   * Adds or subtracts the specified number of centuries.\n   * @param centuries - The number of centuries to add or subtract.\n   */\n  addCenturies(centuries: number): ProDate {\n    return this.addYears(centuries * 100);\n  }\n\n  /**\n   * Subtracts the specified number of centuries.\n   * @param centuries - The number of centuries to subtract.\n   */\n  subtractCenturies(centuries: number): ProDate {\n    return this.addYears(centuries * -100);\n  }\n\n  /**\n   * Checks if the current time is before noon (12:00 PM).\n   */\n  isBeforeNoon(): boolean {\n    return this.getHours() < 12;\n  }\n\n  /**\n   * Checks if the current time is after noon (12:00 PM).\n   */\n  isAfterNoon(): boolean {\n    return this.getHours() >= 12;\n  }\n\n  /**\n   * Checks if the current date is in the current decade.\n   */\n  isInCurrentDecade(): boolean {\n    const currentYear = new Date().getFullYear();\n    const currentDecade = Math.floor(currentYear / 10) * 10;\n    return (\n      this.getYear() >= currentDecade && this.getYear() < currentDecade + 10\n    );\n  }\n\n  /**\n   * Checks if the current date is in the current century.\n   */\n  isInCurrentCentury(): boolean {\n    const currentYear = new Date().getFullYear();\n    const currentCentury = Math.floor(currentYear / 100) * 100;\n    return (\n      this.getYear() >= currentCentury && this.getYear() < currentCentury + 100\n    );\n  }\n\n  /**\n   * Converts the current date to a simple human-readable format (e.g., \"2 days ago\", \"in 3 hours\").\n   */\n  toHumanReadable(): string {\n    const now = new Date();\n    const diffInMs = this.getTime() - now.getTime();\n    const diffInMinutes = Math.floor(diffInMs / (1000 * 60));\n    if (diffInMinutes < 0) {\n      return Math.abs(diffInMinutes) < 60\n        ? `${Math.abs(diffInMinutes)} minutes ago`\n        : `${Math.abs(Math.floor(diffInMinutes / 60))} hours ago`;\n    } else {\n      return diffInMinutes < 60\n        ? `in ${diffInMinutes} minutes`\n        : `in ${Math.floor(diffInMinutes / 60)} hours`;\n    }\n  }\n\n  /**\n   * Adds or subtracts a specific unit (like years, months, days) from the date.\n   * @param amount - The amount to add or subtract (use negative for subtraction).\n   * @param unit - The unit ('years', 'months', 'days', etc.).\n   */\n  addSubtract(amount: number, unit: string): ProDate {\n    switch (unit.toLowerCase()) {\n      case \"years\":\n        return this.addYears(amount);\n      case \"months\":\n        return this.addMonths(amount);\n      case \"weeks\":\n        return this.addWeeks(amount);\n      case \"days\":\n        return this.addDays(amount);\n      case \"hours\":\n        return this.addHours(amount);\n      case \"minutes\":\n        return this.addMinutes(amount);\n      case \"seconds\":\n        return this.addSeconds(amount);\n      case \"milliseconds\":\n        return this.addMilliseconds(amount);\n      default:\n        throw new Error(`Unknown unit: ${unit}`);\n    }\n  }\n\n  /**\n   * Gets the number of days in a specific month of a given year.\n   * @param year - The year.\n   * @param month - The month (1-12).\n   */\n  static daysInMonth(year: number, month: number): number {\n    return new Date(year, month, 0).getDate();\n  }\n\n  /**\n   * Checks if a specific date is a leap year.\n   * @param year - The year.\n   */\n  static isLeapYear(year: number): boolean {\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n  }\n\n  /**\n   * Returns the difference between two dates in a specific unit.\n   * @param date - The date to compare with.\n   * @param unit - The unit of difference ('years', 'months', 'days', etc.).\n   */\n  diff(date: ProDate, unit: string): number {\n    const diffInMs = this.getTime() - date.getTime();\n    switch (unit.toLowerCase()) {\n      case \"years\":\n        return diffInMs / (1000 * 60 * 60 * 24 * 365.25);\n      case \"months\":\n        return diffInMs / (1000 * 60 * 60 * 24 * 30.44);\n      case \"weeks\":\n        return diffInMs / (1000 * 60 * 60 * 24 * 7);\n      case \"days\":\n        return diffInMs / (1000 * 60 * 60 * 24);\n      case \"hours\":\n        return diffInMs / (1000 * 60 * 60);\n      case \"minutes\":\n        return diffInMs / (1000 * 60);\n      case \"seconds\":\n        return diffInMs / 1000;\n      case \"milliseconds\":\n        return diffInMs;\n      default:\n        throw new Error(`Unknown unit: ${unit}`);\n    }\n  }\n\n  /**\n   * Returns the start of a given unit of time.\n   * @param unit - The unit ('year', 'month', 'week', 'day', 'hour', etc.).\n   */\n  startOf(unit: string): ProDate {\n    switch (unit.toLowerCase()) {\n      case \"year\":\n        return new ProDate(new Date(this.getYear(), 0, 1));\n      case \"month\":\n        return new ProDate(new Date(this.getYear(), this.getMonth() - 1, 1));\n      case \"week\":\n        return this.startOfWeek();\n      case \"day\":\n        return this.startOfDay();\n      case \"hour\":\n        return new ProDate(new Date(this.getTime()).setMinutes(0, 0, 0));\n      case \"minute\":\n        return new ProDate(new Date(this.getTime()).setSeconds(0, 0));\n      case \"second\":\n        return new ProDate(new Date(this.getTime()).setMilliseconds(0));\n      default:\n        throw new Error(`Unknown unit: ${unit}`);\n    }\n  }\n\n  /**\n   * Returns the end of a given unit of time.\n   * @param unit - The unit ('year', 'month', 'week', 'day', 'hour', etc.).\n   */\n  endOf(unit: string): ProDate {\n    switch (unit.toLowerCase()) {\n      case \"year\":\n        return new ProDate(new Date(this.getYear(), 11, 31, 23, 59, 59, 999));\n      case \"month\":\n        return new ProDate(\n          new Date(this.getYear(), this.getMonth(), 0, 23, 59, 59, 999),\n        );\n      case \"week\":\n        return this.endOfWeek();\n      case \"day\":\n        return this.endOfDay();\n      case \"hour\":\n        return new ProDate(new Date(this.getTime()).setMinutes(59, 59, 999));\n      case \"minute\":\n        return new ProDate(new Date(this.getTime()).setSeconds(59, 999));\n      case \"second\":\n        return new ProDate(new Date(this.getTime()).setMilliseconds(999));\n      default:\n        throw new Error(`Unknown unit: ${unit}`);\n    }\n  }\n\n  /**\n   * Checks if the current date is before a given date.\n   * @param date - The date to compare with.\n   */\n  isBefore(date: ProDate): boolean {\n    return this.getTime() < date.getTime();\n  }\n\n  /**\n   * Checks if the current date is after a given date.\n   * @param date - The date to compare with.\n   */\n  isAfter(date: ProDate): boolean {\n    return this.getTime() > date.getTime();\n  }\n\n  /**\n   * Checks if two dates are the same in terms of a specific unit (e.g., same year, month, etc.).\n   * @param date - The date to compare with.\n   * @param unit - The unit to compare ('year', 'month', 'day', etc.).\n   */\n  isSame(date: ProDate, unit: string): boolean {\n    switch (unit.toLowerCase()) {\n      case \"year\":\n        return this.getYear() === date.getYear();\n      case \"month\":\n        return (\n          this.getYear() === date.getYear() &&\n          this.getMonth() === date.getMonth()\n        );\n      case \"week\":\n        return this.getWeekOfYear() === date.getWeekOfYear();\n      case \"day\":\n        return this.isSameDay(date);\n      case \"hour\":\n        return (\n          this.getYear() === date.getYear() &&\n          this.getMonth() === date.getMonth() &&\n          this.getDayOfMonth() === date.getDayOfMonth() &&\n          this.getHours() === date.getHours()\n        );\n      case \"minute\":\n        return (\n          this.getYear() === date.getYear() &&\n          this.getMonth() === date.getMonth() &&\n          this.getDayOfMonth() === date.getDayOfMonth() &&\n          this.getHours() === date.getHours() &&\n          this.getMinutes() === date.getMinutes()\n        );\n      case \"second\":\n        return (\n          this.getYear() === date.getYear() &&\n          this.getMonth() === date.getMonth() &&\n          this.getDayOfMonth() === date.getDayOfMonth() &&\n          this.getHours() === date.getHours() &&\n          this.getMinutes() === date.getMinutes() &&\n          this.getSeconds() === date.getSeconds()\n        );\n      default:\n        throw new Error(`Unknown unit: ${unit}`);\n    }\n  }\n\n  /**\n   * Formats the date in relative time (e.g., '2 hours ago', 'in 3 days') with full configurability.\n   *\n   * ### Features:\n   * - **Units Supported**: Seconds, Minutes, Hours, Days, Weeks, Months, Years.\n   * - **Pluralization**: Automatically adjusts for singular or plural forms.\n   * - **Past and Future**: Handles both past and future dates, with correct phrasing.\n   * - **Thresholds**: Customizable thresholds for rounding and displaying \"just now\" for recent times.\n   * - **Granularity**: Supports fine-grained time differences (e.g., \"3 minutes\", \"2 days\").\n   *\n   * @param date - The date to compare with (optional, defaults to now).\n   * @param options - Optional configuration:\n   *   - `round`: Whether to round time units (default: true).\n   *   - `thresholds`: Custom time thresholds for switching between units.\n   *   - `futureText`: Text for future times (default: \"in\").\n   *   - `pastText`: Text for past times (default: \"ago\").\n   *   - `justNowText`: Text for very recent times (default: \"just now\").\n   *   - `maxUnits`: Maximum number of units to display (e.g., 1 shows \"1 day ago\" instead of \"1 day, 3 hours ago\").\n   * @returns A relative time string (e.g., '2 hours ago', 'in 3 days').\n   */\n  fromNow(\n    date: ProDate = new ProDate(),\n    options?: {\n      round?: boolean;\n      thresholds?: {\n        seconds?: number;\n        minutes?: number;\n        hours?: number;\n        days?: number;\n        weeks?: number;\n        months?: number;\n        years?: number;\n      };\n      futureText?: string;\n      pastText?: string;\n      justNowText?: string;\n      maxUnits?: number;\n    },\n  ): string {\n    const {\n      round = true,\n      thresholds = {\n        seconds: 45, // Display \"just now\" for under 45 seconds\n        minutes: 60, // Display minutes for under 60 minutes\n        hours: 24, // Display hours for under 24 hours\n        days: 7, // Display days for under 7 days\n        weeks: 4, // Display weeks for under 4 weeks\n        months: 12, // Display months for under 12 months\n      },\n      futureText = \"in\",\n      pastText = \"ago\",\n      justNowText = \"just now\",\n      maxUnits = 1,\n    } = options || {};\n\n    // Get the difference in various units\n    const diffInSeconds = this.diff(date, \"seconds\");\n    const absDiffInSeconds = Math.abs(diffInSeconds);\n    const diffInMinutes = absDiffInSeconds / 60;\n    const diffInHours = absDiffInSeconds / 3600;\n    const diffInDays = absDiffInSeconds / 86400;\n    const diffInWeeks = absDiffInSeconds / (86400 * 7);\n    const diffInMonths = absDiffInSeconds / (86400 * 30.44); // Average month length\n    const diffInYears = absDiffInSeconds / (86400 * 365.25); // Average year length\n\n    const isPast = diffInSeconds < 0;\n\n    // Determine which unit to display\n    let result = \"\";\n    let unitCount = 0;\n\n    if (absDiffInSeconds < thresholds.seconds!) {\n      // \"Just now\"\n      result = justNowText;\n    } else if (diffInMinutes < thresholds.minutes!) {\n      // Seconds or minutes\n      const minutes = round\n        ? Math.round(diffInMinutes)\n        : Math.floor(diffInMinutes);\n      result = `${minutes} ${this.pluralize(minutes, \"minute\")}`;\n    } else if (diffInHours < thresholds.hours!) {\n      // Hours\n      const hours = round ? Math.round(diffInHours) : Math.floor(diffInHours);\n      result = `${hours} ${this.pluralize(hours, \"hour\")}`;\n    } else if (diffInDays < thresholds.days!) {\n      // Days\n      const days = round ? Math.round(diffInDays) : Math.floor(diffInDays);\n      result = `${days} ${this.pluralize(days, \"day\")}`;\n    } else if (diffInWeeks < thresholds.weeks!) {\n      // Weeks\n      const weeks = round ? Math.round(diffInWeeks) : Math.floor(diffInWeeks);\n      result = `${weeks} ${this.pluralize(weeks, \"week\")}`;\n    } else if (diffInMonths < thresholds.months!) {\n      // Months\n      const months = round\n        ? Math.round(diffInMonths)\n        : Math.floor(diffInMonths);\n      result = `${months} ${this.pluralize(months, \"month\")}`;\n    } else {\n      // Years\n      const years = round ? Math.round(diffInYears) : Math.floor(diffInYears);\n      result = `${years} ${this.pluralize(years, \"year\")}`;\n    }\n\n    // Apply past/future text\n    if (result !== justNowText) {\n      result = isPast ? `${result} ${pastText}` : `${futureText} ${result}`;\n    }\n\n    // Optionally limit to the max number of units\n    if (unitCount >= maxUnits) {\n      return result;\n    }\n\n    return result;\n  }\n\n  /**\n   * Helper function to pluralize units (e.g., '1 minute' vs '2 minutes').\n   * @param value - The number of units.\n   * @param unit - The unit to pluralize.\n   */\n  private pluralize(value: number, unit: string): string {\n    if (value === 1) {\n      return unit;\n    }\n    return `${unit}s`;\n  }\n\n  /**\n   * Returns a human-readable string indicating how long ago the date was or how far in the future it is.\n   *\n   * ### Features:\n   * - **Singular/Plural**: Automatically adjusts for singular or plural forms.\n   * - **Supports Past and Future Dates**: Can handle both past and future dates.\n   * - **Configurable Precision**: Can display seconds, minutes, hours, or days based on the difference.\n   * - **Customizable Rounding**: Optionally enable or disable rounding.\n   *\n   * @param options - Optional configuration for the output:\n   *   - `round`: Whether to round time units (default: true).\n   *   - `futureText`: Text for future times (default: \"in\").\n   *   - `pastText`: Text for past times (default: \"ago\").\n   *   - `justNowText`: Text for very recent times (default: \"just now\").\n   *   - `maxUnits`: Maximum number of units to display (default: 1).\n   * @returns A relative time string (e.g., '2 hours ago', 'in 3 days').\n   */\n  timeAgo(options?: {\n    round?: boolean;\n    futureText?: string;\n    pastText?: string;\n    justNowText?: string;\n    maxUnits?: number;\n  }): string {\n    const {\n      round = true,\n      futureText = \"in\",\n      pastText = \"ago\",\n      justNowText = \"just now\",\n      maxUnits = 1,\n    } = options || {};\n\n    // Get the current time and compute the difference in seconds\n    const now = new ProDate();\n    const diffInSeconds = this.diff(now, \"seconds\");\n    const absDiffInSeconds = Math.abs(diffInSeconds);\n\n    // Determine the time unit differences\n    const diffInMinutes = absDiffInSeconds / 60;\n    const diffInHours = absDiffInSeconds / 3600;\n    const diffInDays = absDiffInSeconds / 86400;\n\n    // Check if the date is in the past or future\n    const isPast = diffInSeconds < 0;\n\n    // Helper function to handle rounding and pluralization\n    const formatUnit = (value: number, unit: string): string => {\n      const roundedValue = round ? Math.round(value) : Math.floor(value);\n      return `${roundedValue} ${this.pluralize(roundedValue, unit)}`;\n    };\n\n    // Build the result string based on the difference\n    let result = \"\";\n    if (absDiffInSeconds < 60) {\n      // Just now or seconds ago\n      result =\n        absDiffInSeconds < 45\n          ? justNowText\n          : formatUnit(absDiffInSeconds, \"second\");\n    } else if (diffInMinutes < 60) {\n      // Minutes ago\n      result = formatUnit(diffInMinutes, \"minute\");\n    } else if (diffInHours < 24) {\n      // Hours ago\n      result = formatUnit(diffInHours, \"hour\");\n    } else {\n      // Days ago\n      result = formatUnit(diffInDays, \"day\");\n    }\n\n    // Apply past or future text\n    if (result !== justNowText) {\n      result = isPast ? `${result} ${pastText}` : `${futureText} ${result}`;\n    }\n\n    return result;\n  }\n\n  /**\n   * Parses a date string in the ISO 8601 format.\n   * @param isoString - The ISO string to parse.\n   */\n  static fromISO(isoString: string): ProDate {\n    return new ProDate(new Date(isoString));\n  }\n\n  /**\n   * Parses a date string from a Unix timestamp (in seconds).\n   * @param unixSeconds - The Unix timestamp in seconds.\n   */\n  static fromUnix(unixSeconds: number): ProDate {\n    return new ProDate(unixSeconds * 1000);\n  }\n\n  /**\n   * Checks if the current date is within a specific date range.\n   * @param startDate - The start date.\n   * @param endDate - The end date.\n   */\n  isBetween(startDate: ProDate, endDate: ProDate): boolean {\n    return this.isAfter(startDate) && this.isBefore(endDate);\n  }\n\n  /**\n   * Returns the number of business days between two dates (excluding weekends).\n   * @param date - The date to compare with.\n   */\n  businessDaysBetween(date: ProDate): number {\n    let count = 0;\n    let currentDate = new ProDate(Math.min(this.getTime(), date.getTime()));\n    const endDate = new ProDate(Math.max(this.getTime(), date.getTime()));\n    while (currentDate.isBefore(endDate)) {\n      if (!currentDate.isWeekend()) {\n        count++;\n      }\n      currentDate = currentDate.addDays(1);\n    }\n    return count;\n  }\n\n  /**\n   * Formats the date as 'Day Month Year' (e.g., '27 February 2024').\n   */\n  formatDayMonthYear(): string {\n    return this.format(\"D MMMM YYYY\");\n  }\n\n  /**\n   * Returns the start of the next month.\n   */\n  startOfNextMonth(): ProDate {\n    return this.addMonths(1).startOf(\"month\");\n  }\n\n  /**\n   * Returns the end of the previous month.\n   */\n  endOfPreviousMonth(): ProDate {\n    return this.subtractMonths(1).endOf(\"month\");\n  }\n\n  /**\n   * Formats the date using the \"full\" locale string format (e.g., Tuesday, February 27, 2024 2:30 PM).\n   */\n  formatFull(): string {\n    return this.format(\"LLLL\");\n  }\n\n  /**\n   * Converts the current date to an array `[year, month, day, hour, minute, second, millisecond]`.\n   */\n  toArray(): number[] {\n    return [\n      this.getYear(),\n      this.getMonth(),\n      this.getDayOfMonth(),\n      this.getHours(),\n      this.getMinutes(),\n      this.getSeconds(),\n      this.getMilliseconds(),\n    ];\n  }\n\n  /**\n   * Converts the current date to a JavaScript object.\n   */\n  toObject(): {\n    year: number;\n    month: number;\n    day: number;\n    hour: number;\n    minute: number;\n    second: number;\n    millisecond: number;\n  } {\n    return {\n      year: this.getYear(),\n      month: this.getMonth(),\n      day: this.getDayOfMonth(),\n      hour: this.getHours(),\n      minute: this.getMinutes(),\n      second: this.getSeconds(),\n      millisecond: this.getMilliseconds(),\n    };\n  }\n\n  /**\n   * Converts the date to JSON format.\n   */\n  toJSON(): string {\n    return this.toISOString();\n  }\n\n  /**\n   * Returns the difference between two dates in quarters.\n   * @param date - The date to compare.\n   */\n  diffInQuarters(date: ProDate): number {\n    return Math.floor(this.diff(date, \"months\") / 3);\n  }\n\n  /**\n   * Returns the difference between two dates in business days (Monday-Friday).\n   * @param date - The date to compare with.\n   */\n  diffInBusinessDays(date: ProDate): number {\n    let diff = 0;\n    let currentDate = new ProDate(Math.min(this.getTime(), date.getTime()));\n    const endDate = new ProDate(Math.max(this.getTime(), date.getTime()));\n    while (currentDate.isBefore(endDate)) {\n      if (!currentDate.isWeekend()) {\n        diff++;\n      }\n      currentDate = currentDate.addDays(1);\n    }\n    return diff;\n  }\n\n  /**\n   * Gets the ISO week number of the year.\n   */\n  getISOWeek(): number {\n    const date = new Date(this.getTime());\n    date.setHours(0, 0, 0, 0);\n    date.setDate(date.getDate() + 4 - (date.getDay() || 7));\n    const yearStart = new Date(Date.UTC(date.getFullYear(), 0, 1));\n    return Math.ceil(\n      ((date.getTime() - yearStart.getTime()) / 86400000 + 1) / 7,\n    );\n  }\n\n  /**\n   * Gets the ISO year corresponding to the ISO week number.\n   */\n  getISOYear(): number {\n    const date = new Date(this.getTime());\n    date.setDate(date.getDate() + 4 - (date.getDay() || 7));\n    return date.getFullYear();\n  }\n\n  /**\n   * Checks if the current date falls within the same ISO week as another date.\n   * @param date - The date to compare.\n   */\n  isSameISOWeek(date: ProDate): boolean {\n    return (\n      this.getISOWeek() === date.getISOWeek() &&\n      this.getISOYear() === date.getISOYear()\n    );\n  }\n\n  /**\n   * Checks if the current date falls within the same quarter as another date.\n   * @param date - The date to compare.\n   */\n  isSameQuarter(date: ProDate): boolean {\n    return (\n      this.getYear() === date.getYear() &&\n      Math.floor((this.getMonth() - 1) / 3) ===\n        Math.floor((date.getMonth() - 1) / 3)\n    );\n  }\n\n  /**\n   * Checks if the current date falls within the same ISO week as today.\n   */\n  isThisISOWeek(): boolean {\n    return this.isSameISOWeek(new ProDate());\n  }\n\n  /**\n   * Converts the current date to the Unix timestamp in milliseconds.\n   */\n  toUnixMilliseconds(): number {\n    return this.getTime();\n  }\n\n  /**\n   * Converts the current date to the Unix timestamp in seconds.\n   */\n  toUnixSeconds(): number {\n    return Math.floor(this.getTime() / 1000);\n  }\n\n  /**\n   * Checks if the current date is in the current quarter.\n   */\n  isInCurrentQuarter(): boolean {\n    const currentDate = new ProDate();\n    return this.isSameQuarter(currentDate);\n  }\n\n  /**\n   * Checks if the date is within the current week.\n   */\n  isInCurrentWeek(): boolean {\n    const currentWeekStart = new ProDate().startOf(\"week\");\n    const currentWeekEnd = new ProDate().endOf(\"week\");\n    return this.isBetween(currentWeekStart, currentWeekEnd);\n  }\n\n  /**\n   * Converts the current date to a readable string showing only the time (HH:mm).\n   */\n  toTimeString(): string {\n    return this.format(\"HH:mm\");\n  }\n\n  /**\n   * Converts the current date to a readable string showing only the date (YYYY-MM-DD).\n   */\n  toDateString(): string {\n    return this.format(\"YYYY-MM-DD\");\n  }\n\n  /**\n   * Converts the current date to the start of the current UTC day.\n   */\n  startOfUTCDay(): ProDate {\n    const utcDate = new Date(this.date.toISOString().slice(0, 10));\n    return new ProDate(utcDate);\n  }\n\n  /**\n   * Converts the current date to the end of the current UTC day.\n   */\n  endOfUTCDay(): ProDate {\n    const utcDate = new Date(\n      this.date.toISOString().slice(0, 10) + \"T23:59:59.999Z\",\n    );\n    return new ProDate(utcDate);\n  }\n\n  /**\n   * Returns whether the date is the same year as another date.\n   * @param date - The date to compare.\n   */\n  isSameYear(date: ProDate): boolean {\n    return this.getYear() === date.getYear();\n  }\n\n  /**\n   * Checks if the date is tomorrow.\n   */\n  isTomorrow(): boolean {\n    const tomorrow = new ProDate().addDays(1);\n    return this.isSameDay(tomorrow);\n  }\n\n  /**\n   * Checks if the date is yesterday.\n   */\n  isYesterday(): boolean {\n    const yesterday = new ProDate().subtractDays(1);\n    return this.isSameDay(yesterday);\n  }\n\n  /**\n   * Returns the number of remaining days in the current month.\n   */\n  daysRemainingInMonth(): number {\n    const lastDayOfMonth = new Date(\n      this.getYear(),\n      this.getMonth(),\n      0,\n    ).getDate();\n    return lastDayOfMonth - this.getDayOfMonth();\n  }\n\n  /**\n   * Adds a specific number of years, months, weeks, days, hours, minutes, or seconds to the date.\n   * @param amount - The amount of time to add.\n   * @param unit - The unit of time (e.g., 'years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds').\n   */\n  add(amount: number, unit: string): ProDate {\n    switch (unit.toLowerCase()) {\n      case \"years\":\n        return this.addYears(amount);\n      case \"months\":\n        return this.addMonths(amount);\n      case \"weeks\":\n        return this.addWeeks(amount);\n      case \"days\":\n        return this.addDays(amount);\n      case \"hours\":\n        return this.addHours(amount);\n      case \"minutes\":\n        return this.addMinutes(amount);\n      case \"seconds\":\n        return this.addSeconds(amount);\n      default:\n        throw new Error(`Unknown unit: ${unit}`);\n    }\n  }\n\n  /**\n   * Subtracts a specific number of years, months, weeks, days, hours, minutes, or seconds from the date.\n   * @param amount - The amount of time to subtract.\n   * @param unit - The unit of time (e.g., 'years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds').\n   */\n  subtract(amount: number, unit: string): ProDate {\n    return this.add(-amount, unit);\n  }\n\n  /**\n   * Returns the first day of the current year.\n   */\n  startOfYear(): ProDate {\n    return new ProDate(new Date(this.getYear(), 0, 1));\n  }\n\n  /**\n   * Returns the last day of the current year.\n   */\n  endOfYear(): ProDate {\n    return new ProDate(new Date(this.getYear(), 11, 31, 23, 59, 59, 999));\n  }\n\n  /**\n   * Returns the current date in UTC.\n   */\n  toUTCDate(): ProDate {\n    return new ProDate(this.date.toISOString());\n  }\n\n  /**\n   * Returns the current date in a specified time zone.\n   * @param timeZone - The time zone to convert to (e.g., 'America/New_York').\n   */\n  toTimeZone(timeZone: string): ProDate {\n    const dateInTimeZone = new Date(\n      this.date.toLocaleString(\"en-US\", { timeZone }),\n    );\n    return new ProDate(dateInTimeZone);\n  }\n\n  /**\n   * Checks if the current date is during daylight saving time (DST).\n   */\n  isDST(): boolean {\n    const jan = new Date(this.getYear(), 0, 1);\n    const jul = new Date(this.getYear(), 6, 1);\n    return (\n      this.date.getTimezoneOffset() <\n      Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset())\n    );\n  }\n\n  /**\n   * Checks if the current date is the same as another date (ignoring time).\n   * @param date - The date to compare.\n   */\n  isSameDate(date: ProDate): boolean {\n    return (\n      this.getYear() === date.getYear() &&\n      this.getMonth() === date.getMonth() &&\n      this.getDayOfMonth() === date.getDayOfMonth()\n    );\n  }\n\n  /**\n   * Checks if the current date is the same as another date (including time).\n   * @param date - The date to compare.\n   */\n  isSameExact(date: ProDate): boolean {\n    return this.getTime() === date.getTime();\n  }\n\n  /**\n   * Converts the current date to an object with `year`, `month`, `day`, `hour`, `minute`, `second`, `millisecond`.\n   */\n  toDateObject(): {\n    year: number;\n    month: number;\n    day: number;\n    hour: number;\n    minute: number;\n    second: number;\n    millisecond: number;\n  } {\n    return {\n      year: this.getYear(),\n      month: this.getMonth(),\n      day: this.getDayOfMonth(),\n      hour: this.getHours(),\n      minute: this.getMinutes(),\n      second: this.getSeconds(),\n      millisecond: this.getMilliseconds(),\n    };\n  }\n\n  /**\n   * Returns the number of days between the current date and another date.\n   * @param date - The date to compare.\n   */\n  daysBetween(date: ProDate): number {\n    return Math.abs(this.diff(date, \"days\"));\n  }\n\n  /**\n   * Returns the number of months between the current date and another date.\n   * @param date - The date to compare.\n   */\n  monthsBetween(date: ProDate): number {\n    return Math.abs(this.diff(date, \"months\"));\n  }\n\n  /**\n   * Returns the number of years between the current date and another date.\n   * @param date - The date to compare.\n   */\n  yearsBetween(date: ProDate): number {\n    return Math.abs(this.diff(date, \"years\"));\n  }\n\n  /**\n   * Checks if the date falls within the specified date range (inclusive).\n   * @param startDate - The start of the range.\n   * @param endDate - The end of the range.\n   */\n  isInRange(startDate: ProDate, endDate: ProDate): boolean {\n    return this.isAfter(startDate) && this.isBefore(endDate);\n  }\n\n  /**\n   * Returns the difference between two dates in weeks.\n   * @param date - The date to compare.\n   */\n  weeksBetween(date: ProDate): number {\n    return Math.abs(this.diff(date, \"weeks\"));\n  }\n\n  /**\n   * Returns the first Monday after the current date.\n   */\n  nextMonday(): ProDate {\n    const dayOfWeek = this.getDayOfWeek();\n    const daysUntilNextMonday = (8 - dayOfWeek) % 7;\n    return this.addDays(daysUntilNextMonday);\n  }\n\n  /**\n   * Checks if the current time is in the AM period.\n   */\n  isAM(): boolean {\n    return this.getHours() < 12;\n  }\n\n  /**\n   * Checks if the current time is in the PM period.\n   */\n  isPM(): boolean {\n    return this.getHours() >= 12;\n  }\n\n  /**\n   * Converts the current date to UTC and returns it as an ISO string.\n   */\n  toUTCISO(): string {\n    return this.toUTCDate().toISO8601();\n  }\n\n  /**\n   * Returns a short localized date string (e.g., '09/23/2023').\n   * @param locale - The locale to format the date (default: 'en-US').\n   */\n  toShortDateString(locale: string = \"en-US\"): string {\n    return this.date.toLocaleDateString(locale);\n  }\n\n  /**\n   * Adds a specified duration to the current date using an object.\n   * @param duration - Object with units like { days: 3, hours: 2 }.\n   */\n  addDuration(duration: {\n    years?: number;\n    months?: number;\n    weeks?: number;\n    days?: number;\n    hours?: number;\n    minutes?: number;\n    seconds?: number;\n  }): ProDate {\n    if (duration.years) this.addYears(duration.years);\n    if (duration.months) this.addMonths(duration.months);\n    if (duration.weeks) this.addWeeks(duration.weeks);\n    if (duration.days) this.addDays(duration.days);\n    if (duration.hours) this.addHours(duration.hours);\n    if (duration.minutes) this.addMinutes(duration.minutes);\n    if (duration.seconds) this.addSeconds(duration.seconds);\n    return this;\n  }\n\n  /**\n   * Subtracts a specified duration from the current date using an object.\n   * @param duration - Object with units like { days: 3, hours: 2 }.\n   */\n  subtractDuration(duration: {\n    years?: number;\n    months?: number;\n    weeks?: number;\n    days?: number;\n    hours?: number;\n    minutes?: number;\n    seconds?: number;\n  }): ProDate {\n    return this.addDuration({\n      years: -(duration.years || 0),\n      months: -(duration.months || 0),\n      weeks: -(duration.weeks || 0),\n      days: -(duration.days || 0),\n      hours: -(duration.hours || 0),\n      minutes: -(duration.minutes || 0),\n      seconds: -(duration.seconds || 0),\n    });\n  }\n\n  /**\n   * Formats the date into a localized human-readable format.\n   * @param locale - The locale to format the date (e.g., 'en-US').\n   * @param options - Optional formatting options.\n   */\n  toLocalizedString(\n    locale: string = \"en-US\",\n    options?: Intl.DateTimeFormatOptions,\n  ): string {\n    return this.date.toLocaleDateString(locale, options);\n  }\n\n  /**\n   * Returns the ISO week number for the current date, accounting for years starting on any day.\n   */\n  getWeekOfYearISO(): number {\n    const tempDate = new Date(this.date.getTime());\n    tempDate.setHours(0, 0, 0, 0);\n    tempDate.setDate(tempDate.getDate() + 3 - ((tempDate.getDay() + 6) % 7)); // Set to nearest Thursday\n    const yearStart = new Date(Date.UTC(tempDate.getFullYear(), 0, 4)); // ISO week starts on Jan 4\n    return Math.ceil(\n      ((tempDate.getTime() - yearStart.getTime()) / 86400000 + 1) / 7,\n    );\n  }\n\n  /**\n   * Returns the difference between two dates as a human-readable string (e.g., \"2 days\", \"3 months\").\n   * @param date - The date to compare.\n   */\n  humanizeDiff(date: ProDate): string {\n    const diffInSeconds = this.diff(date, \"seconds\");\n    const absDiff = Math.abs(diffInSeconds);\n    if (absDiff < 60) {\n      return `${absDiff} seconds`;\n    } else if (absDiff < 3600) {\n      return `${Math.floor(absDiff / 60)} minutes`;\n    } else if (absDiff < 86400) {\n      return `${Math.floor(absDiff / 3600)} hours`;\n    } else if (absDiff < 2592000) {\n      // Less than 30 days\n      return `${Math.floor(absDiff / 86400)} days`;\n    } else if (absDiff < 31536000) {\n      // Less than 365 days\n      return `${Math.floor(absDiff / 2592000)} months`;\n    } else {\n      return `${Math.floor(absDiff / 31536000)} years`;\n    }\n  }\n\n  /**\n   * Parses a date string with the given format.\n   * This function supports a wide range of format tokens and provides flexible parsing capabilities.\n   *\n   * ### Supported Tokens:\n   * - `YYYY` (4-digit year)\n   * - `YY` (2-digit year)\n   * - `MM` (2-digit month)\n   * - `M` (1 or 2-digit month)\n   * - `DD` (2-digit day of the month)\n   * - `D` (1 or 2-digit day of the month)\n   * - `HH` (2-digit 24-hour format)\n   * - `H` (1 or 2-digit 24-hour format)\n   * - `hh` (2-digit 12-hour format)\n   * - `h` (1 or 2-digit 12-hour format)\n   * - `mm` (2-digit minutes)\n   * - `ss` (2-digit seconds)\n   * - `A` / `a` (AM/PM)\n   *\n   * ### Example Usage:\n   * ```typescript\n   * ProDate.parse('2023-09-24 14:30', 'YYYY-MM-DD HH:mm');\n   * ProDate.parse('09/24/23', 'MM/DD/YY');\n   * ```\n   *\n   * @param dateString - The date string to parse (e.g., '2023-09-24').\n   * @param format - The format of the date string (e.g., 'YYYY-MM-DD').\n   * @returns A ProDate object.\n   * @throws Will throw an error if the format doesn't match the date string.\n   */\n  static parse(dateString: string, format: string): ProDate {\n    const formatTokens: Record<string, string> = {\n      YYYY: \"\\\\d{4}\", // Full year\n      YY: \"\\\\d{2}\", // Two-digit year\n      MM: \"0[1-9]|1[0-2]\", // Two-digit month\n      M: \"[1-9]|1[0-2]\", // One or two-digit month\n      DD: \"0[1-9]|[12]\\\\d|3[01]\", // Two-digit day\n      D: \"[1-9]|[12]\\\\d|3[01]\", // One or two-digit day\n      HH: \"[01]\\\\d|2[0-3]\", // Two-digit 24-hour format\n      H: \"\\\\d|1\\\\d|2[0-3]\", // One or two-digit 24-hour format\n      hh: \"0[1-9]|1[0-2]\", // Two-digit 12-hour format\n      h: \"[1-9]|1[0-2]\", // One or two-digit 12-hour format\n      mm: \"[0-5]\\\\d\", // Two-digit minutes\n      ss: \"[0-5]\\\\d\", // Two-digit seconds\n      A: \"AM|PM\", // AM/PM uppercase\n      a: \"am|pm\", // AM/PM lowercase\n    };\n\n    // Build regex pattern by replacing tokens with their corresponding regex\n    const formatRegex = format.replace(\n      /YYYY|YY|MM|M|DD|D|HH|H|hh|h|mm|ss|A|a/g,\n      (match) => formatTokens[match] || \"\",\n    );\n\n    // Create the regex pattern to parse the date string\n    const regex = new RegExp(`^${formatRegex}$`);\n    const match = regex.exec(dateString);\n\n    if (!match) {\n      throw new Error(\n        `Invalid date format: \"${dateString}\" does not match the expected format \"${format}\".`,\n      );\n    }\n\n    // Extract parts from the match and convert them to numbers\n    const extract = (\n      token: string,\n      index: number,\n      defaultValue = 0,\n    ): number => {\n      const tokenValue = match[index + 1];\n      if (!tokenValue) return defaultValue;\n\n      switch (token) {\n        case \"MM\":\n        case \"M\":\n        case \"DD\":\n        case \"D\":\n        case \"HH\":\n        case \"H\":\n        case \"hh\":\n        case \"h\":\n        case \"mm\":\n        case \"ss\":\n          return parseInt(tokenValue, 10);\n        case \"YYYY\":\n          return parseInt(tokenValue, 10);\n        case \"YY\":\n          return parseInt(`20${tokenValue}`, 10); // Assume 2000s for YY format\n        case \"A\":\n        case \"a\":\n          return tokenValue.toUpperCase() === \"PM\" ? 12 : 0;\n        default:\n          return defaultValue;\n      }\n    };\n\n    let year = 1970,\n      month = 0,\n      day = 1,\n      hour = 0,\n      minute = 0,\n      second = 0;\n\n    // Extract date parts based on the format\n    let currentIndex = 0;\n    const formatOrder = format.match(/YYYY|YY|MM|M|DD|D|HH|H|hh|h|mm|ss|A|a/g);\n\n    if (formatOrder) {\n      formatOrder.forEach((token) => {\n        switch (token) {\n          case \"YYYY\":\n            year = extract(token, currentIndex);\n            break;\n          case \"YY\":\n            year = extract(token, currentIndex);\n            break;\n          case \"MM\":\n          case \"M\":\n            month = extract(token, currentIndex) - 1; // Months are zero-indexed\n            break;\n          case \"DD\":\n          case \"D\":\n            day = extract(token, currentIndex);\n            break;\n          case \"HH\":\n          case \"H\":\n            hour = extract(token, currentIndex);\n            break;\n          case \"hh\":\n          case \"h\":\n            hour = extract(token, currentIndex);\n            if (/a|A/.test(format) && match[currentIndex + 1]) {\n              hour += extract(\"A\", currentIndex + 1);\n            }\n            break;\n          case \"mm\":\n            minute = extract(token, currentIndex);\n            break;\n          case \"ss\":\n            second = extract(token, currentIndex);\n            break;\n        }\n        currentIndex++;\n      });\n    }\n\n    // Handle AM/PM adjustments if format includes it\n    if (format.includes(\"A\") || format.includes(\"a\")) {\n      const isPM = match[format.indexOf(\"A\") + 1]?.toUpperCase() === \"PM\";\n      if (isPM && hour < 12) {\n        hour += 12;\n      } else if (!isPM && hour === 12) {\n        hour = 0;\n      }\n    }\n\n    // Construct the final parsed date\n    const parsedDate = new Date(year, month, day, hour, minute, second);\n\n    // Validate if the parsed date is a valid date\n    if (isNaN(parsedDate.getTime())) {\n      throw new Error(\n        `Invalid date value: \"${dateString}\" could not be parsed.`,\n      );\n    }\n\n    return new ProDate(parsedDate);\n  }\n\n  /**\n   * Adds a specific duration using a string (e.g., '2 years', '3 days').\n   * @param durationString - The duration string (e.g., '2 years', '3 days').\n   */\n  addDurationString(durationString: string): ProDate {\n    const [amount, unit] = durationString.split(\" \");\n    return this.add(parseInt(amount), unit);\n  }\n\n  /**\n   * Subtracts a specific duration using a string (e.g., '2 years', '3 days').\n   * @param durationString - The duration string (e.g., '2 years', '3 days').\n   */\n  subtractDurationString(durationString: string): ProDate {\n    const [amount, unit] = durationString.split(\" \");\n    return this.subtract(parseInt(amount), unit);\n  }\n\n  /**\n   * Returns the difference between two dates in months, rounding down.\n   * @param date - The date to compare.\n   */\n  diffInFullMonths(date: ProDate): number {\n    const months = this.diff(date, \"months\");\n    return Math.floor(months);\n  }\n\n  /**\n   * Returns the difference between two dates in years, rounding down.\n   * @param date - The date to compare.\n   */\n  diffInFullYears(date: ProDate): number {\n    const years = this.diff(date, \"years\");\n    return Math.floor(years);\n  }\n\n  /**\n   * Checks if the current date is the same day of the year as another date.\n   * @param date - The date to compare.\n   */\n  isSameDayOfYear(date: ProDate): boolean {\n    return this.getDayOfYear() === date.getDayOfYear();\n  }\n\n  /**\n   * Checks if the current time is between two times on the same day.\n   * @param startTime - The start time in 'HH:mm' format.\n   * @param endTime - The end time in 'HH:mm' format.\n   */\n  isTimeBetween(startTime: string, endTime: string): boolean {\n    const [startHour, startMinute] = startTime.split(\":\").map(Number);\n    const [endHour, endMinute] = endTime.split(\":\").map(Number);\n    const currentHour = this.getHours();\n    const currentMinute = this.getMinutes();\n    const isAfterStart =\n      currentHour > startHour ||\n      (currentHour === startHour && currentMinute >= startMinute);\n    const isBeforeEnd =\n      currentHour < endHour ||\n      (currentHour === endHour && currentMinute <= endMinute);\n    return isAfterStart && isBeforeEnd;\n  }\n\n  /**\n   * Gets the start of the previous month.\n   */\n  startOfPreviousMonth(): ProDate {\n    return this.subtractMonths(1).startOfMonth();\n  }\n\n  /**\n   * Returns whether the current time is between noon and midnight (PM hours).\n   */\n  isPMHours(): boolean {\n    return this.getHours() >= 12;\n  }\n\n  /**\n   * Returns whether the current time is between midnight and noon (AM hours).\n   */\n  isAMHours(): boolean {\n    return this.getHours() < 12;\n  }\n\n  /**\n   * Checks if the current date falls on the same day of the week as another date.\n   * @param date - The date to compare.\n   */\n  isSameDayOfWeek(date: ProDate): boolean {\n    return this.getDayOfWeek() === date.getDayOfWeek();\n  }\n\n  /**\n   * Gets the difference between two dates in weeks, rounding down.\n   * @param date - The date to compare.\n   */\n  diffInFullWeeks(date: ProDate): number {\n    const weeks = this.diff(date, \"weeks\");\n    return Math.floor(weeks);\n  }\n\n  /**\n   * Checks if the current date falls within a leap year.\n   */\n  isCurrentYearLeap(): boolean {\n    return this.isLeapYear();\n  }\n\n  /**\n   * Returns the current quarter's start date.\n   */\n  startOfCurrentQuarter(): ProDate {\n    const quarter = this.getQuarter();\n    const startMonth = (quarter - 1) * 3;\n    return new ProDate(new Date(this.getYear(), startMonth, 1));\n  }\n\n  /**\n   * Returns the current quarter's end date.\n   */\n  endOfCurrentQuarter(): ProDate {\n    const quarter = this.getQuarter();\n    const endMonth = quarter * 3;\n    return new ProDate(new Date(this.getYear(), endMonth, 0, 23, 59, 59, 999));\n  }\n\n  /**\n   * Returns whether the current date is the first day of the year.\n   */\n  isFirstDayOfYear(): boolean {\n    return this.getDayOfMonth() === 1 && this.getMonth() === 1;\n  }\n\n  /**\n   * Returns whether the current date is the last day of the year.\n   */\n  isLastDayOfYear(): boolean {\n    return this.getDayOfMonth() === 31 && this.getMonth() === 12;\n  }\n\n  /**\n   * Returns a human-readable relative time string with customizable rounding.\n   * @param options - Optional configuration for rounding and units.\n   */\n  humanizeTimeAgo(options?: { round?: boolean }): string {\n    const round = options?.round ?? true;\n    const diffInMinutes = this.diff(new ProDate(), \"minutes\");\n    if (diffInMinutes < 60) {\n      return `${Math.round(diffInMinutes)} minutes ago`;\n    } else if (diffInMinutes < 1440) {\n      return `${Math.round(diffInMinutes / 60)} hours ago`;\n    } else {\n      return `${Math.round(diffInMinutes / 1440)} days ago`;\n    }\n  }\n\n  /**\n   * Parses a date string in ISO 8601 format.\n   * @param isoString - The ISO string to parse.\n   */\n  static parseISO(isoString: string): ProDate {\n    return new ProDate(new Date(isoString));\n  }\n}\n"],"mappings":"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","names":["match"]}