{"version":3,"file":"get-dates-range.mjs","names":[],"sources":["../../../src/Heatmap/get-dates-range/get-dates-range.ts"],"sourcesContent":["function formatDate(date: Date): string {\n  const y = date.getUTCFullYear();\n  const m = String(date.getUTCMonth() + 1).padStart(2, '0');\n  const d = String(date.getUTCDate()).padStart(2, '0');\n  return `${y}-${m}-${d}`;\n}\n\nfunction addDays(date: Date, days: number): Date {\n  return new Date(date.getTime() + days * 86400000);\n}\n\nfunction toUtcMidnight(input: Date | string): Date {\n  if (typeof input === 'string') {\n    const m = input.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n    if (m) {\n      const year = Number(m[1]);\n      const month = Number(m[2]) - 1; // 0-indexed\n      const day = Number(m[3]);\n      return new Date(Date.UTC(year, month, day));\n    }\n\n    const d = new Date(input);\n    return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));\n  }\n\n  return new Date(Date.UTC(input.getFullYear(), input.getMonth(), input.getDate()));\n}\n\nfunction startOfWeekUtc(date: Date, firstDayOfWeek: number): Date {\n  let value = new Date(date);\n  while (value.getUTCDay() !== firstDayOfWeek) {\n    value = addDays(value, -1);\n  }\n\n  return value;\n}\n\nfunction endOfWeekUtc(date: Date, firstDayOfWeek: number): Date {\n  const day = date.getUTCDay();\n  const diff = (day < firstDayOfWeek ? 7 : 0) + day - firstDayOfWeek;\n  return addDays(date, 6 - diff);\n}\n\ninterface HeatmapOptions {\n  startDate?: Date | string;\n  endDate?: Date | string;\n  withOutsideDates?: boolean;\n  firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n}\n\nexport function getDatesRange({\n  startDate,\n  endDate,\n  withOutsideDates = true,\n  firstDayOfWeek = 1,\n}: HeatmapOptions = {}): (string | null)[][] {\n  const now = new Date();\n  const defaultStartLocal = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate());\n  const defaultEndLocal = now;\n\n  const start = startDate ? toUtcMidnight(startDate) : toUtcMidnight(defaultStartLocal);\n  const end = endDate ? toUtcMidnight(endDate) : toUtcMidnight(defaultEndLocal);\n\n  const startWeek = startOfWeekUtc(start, firstDayOfWeek);\n  const endWeek = endOfWeekUtc(end, firstDayOfWeek);\n  const dates: (string | null)[][] = [];\n\n  let current = startWeek;\n\n  while (current <= endWeek) {\n    const week = Array.from({ length: 7 }, (_, i) => {\n      const day = addDays(current, i);\n      return withOutsideDates || (day >= start && day <= end) ? formatDate(day) : null;\n    });\n\n    dates.push(week);\n    current = addDays(current, 7);\n  }\n\n  return dates;\n}\n"],"mappings":";;AAAA,SAAS,WAAW,MAAoB;AAItC,QAAO,GAHG,KAAK,gBAAgB,CAGnB,GAFF,OAAO,KAAK,aAAa,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,CAExC,GADP,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,GAAG,IAAI;;AAItD,SAAS,QAAQ,MAAY,MAAoB;AAC/C,QAAO,IAAI,KAAK,KAAK,SAAS,GAAG,OAAO,MAAS;;AAGnD,SAAS,cAAc,OAA4B;AACjD,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,IAAI,MAAM,MAAM,4BAA4B;AAClD,MAAI,GAAG;GACL,MAAM,OAAO,OAAO,EAAE,GAAG;GACzB,MAAM,QAAQ,OAAO,EAAE,GAAG,GAAG;GAC7B,MAAM,MAAM,OAAO,EAAE,GAAG;AACxB,UAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,IAAI,CAAC;;EAG7C,MAAM,IAAI,IAAI,KAAK,MAAM;AACzB,SAAO,IAAI,KAAK,KAAK,IAAI,EAAE,gBAAgB,EAAE,EAAE,aAAa,EAAE,EAAE,YAAY,CAAC,CAAC;;AAGhF,QAAO,IAAI,KAAK,KAAK,IAAI,MAAM,aAAa,EAAE,MAAM,UAAU,EAAE,MAAM,SAAS,CAAC,CAAC;;AAGnF,SAAS,eAAe,MAAY,gBAA8B;CAChE,IAAI,QAAQ,IAAI,KAAK,KAAK;AAC1B,QAAO,MAAM,WAAW,KAAK,eAC3B,SAAQ,QAAQ,OAAO,GAAG;AAG5B,QAAO;;AAGT,SAAS,aAAa,MAAY,gBAA8B;CAC9D,MAAM,MAAM,KAAK,WAAW;AAE5B,QAAO,QAAQ,MAAM,MADP,MAAM,iBAAiB,IAAI,KAAK,MAAM,gBACtB;;AAUhC,SAAgB,cAAc,EAC5B,WACA,SACA,mBAAmB,MACnB,iBAAiB,MACC,EAAE,EAAuB;CAC3C,MAAM,sBAAM,IAAI,MAAM;CACtB,MAAM,oBAAoB,IAAI,KAAK,IAAI,aAAa,GAAG,GAAG,IAAI,UAAU,EAAE,IAAI,SAAS,CAAC;CACxF,MAAM,kBAAkB;CAExB,MAAM,QAAQ,YAAY,cAAc,UAAU,GAAG,cAAc,kBAAkB;CACrF,MAAM,MAAM,UAAU,cAAc,QAAQ,GAAG,cAAc,gBAAgB;CAE7E,MAAM,YAAY,eAAe,OAAO,eAAe;CACvD,MAAM,UAAU,aAAa,KAAK,eAAe;CACjD,MAAM,QAA6B,EAAE;CAErC,IAAI,UAAU;AAEd,QAAO,WAAW,SAAS;EACzB,MAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,GAAG,MAAM;GAC/C,MAAM,MAAM,QAAQ,SAAS,EAAE;AAC/B,UAAO,oBAAqB,OAAO,SAAS,OAAO,MAAO,WAAW,IAAI,GAAG;IAC5E;AAEF,QAAM,KAAK,KAAK;AAChB,YAAU,QAAQ,SAAS,EAAE;;AAG/B,QAAO"}