{"version":3,"sources":["../src/index.ts","../src/internal/constants.ts","../src/internal/time.ts","../src/internal/boundaries.ts","../src/internal/exclusions.ts","../src/internal/config.ts","../src/internal/slots.ts","../src/generate-timeslots.ts","../src/generate-daily-timeslots.ts","../src/timeslot.ts"],"sourcesContent":["export { generateTimeslots } from './generate-timeslots.js';\nexport { generateDailyTimeslots } from './generate-daily-timeslots.js';\nexport { createTimeslot, overlaps } from './timeslot.js';\n\nexport type {\n  AlignmentStrategy,\n  DateValue,\n  LabelFormatter,\n  TimeOfDayInput,\n  Timeslot,\n  TimeslotBoundaryInput,\n  TimeslotGenerationConfig,\n  TimeslotMetadata,\n  TimeslotRangeInput\n} from './types.js';\n","export const MILLIS_PER_MINUTE = 60_000;\n","import type { DateValue, TimeOfDayInput } from '../types.js';\nimport { MILLIS_PER_MINUTE } from './constants.js';\n\nexport type CalendarDate = {\n  year: number;\n  month: number;\n  day: number;\n};\n\nexport type TimeOfDay = {\n  hour: number;\n  minute: number;\n  second: number;\n};\n\nfunction isDate(value: unknown): value is Date {\n  return value instanceof Date;\n}\n\nfunction isTimeOfDayObject(value: unknown): value is { hour: number; minute?: number; second?: number } {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'hour' in value &&\n    typeof (value as { hour: unknown }).hour === 'number'\n  );\n}\n\nexport function isDateOnlyString(value: string): boolean {\n  return /^\\d{4}-\\d{2}-\\d{2}$/.test(value.trim());\n}\n\nexport function isTimeOnlyString(value: string): boolean {\n  return /^\\d{1,2}:\\d{2}(?::\\d{2})?$/.test(value.trim());\n}\n\nconst dateTimeFormatters = new Map<string, Intl.DateTimeFormat>();\n\nfunction getDateTimeFormatter(timeZone: string): Intl.DateTimeFormat {\n  let formatter = dateTimeFormatters.get(timeZone);\n  if (!formatter) {\n    formatter = new Intl.DateTimeFormat('en-US', {\n      timeZone,\n      hourCycle: 'h23',\n      year: 'numeric',\n      month: '2-digit',\n      day: '2-digit',\n      hour: '2-digit',\n      minute: '2-digit',\n      second: '2-digit'\n    });\n    dateTimeFormatters.set(timeZone, formatter);\n  }\n\n  return formatter;\n}\n\nfunction getCalendarFromParts(parts: Intl.DateTimeFormatPart[]): CalendarDate & TimeOfDay {\n  const map = new Map<string, string>();\n  for (const part of parts) {\n    if (part.type !== 'literal') {\n      map.set(part.type, part.value);\n    }\n  }\n\n  const year = Number(map.get('year'));\n  const month = Number(map.get('month'));\n  const day = Number(map.get('day'));\n  const hour = Number(map.get('hour'));\n  const minute = Number(map.get('minute'));\n  const second = Number(map.get('second'));\n\n  if ([year, month, day, hour, minute, second].some((num) => Number.isNaN(num))) {\n    throw new Error('Unable to derive date parts from Intl.DateTimeFormat');\n  }\n\n  return { year, month, day, hour, minute, second };\n}\n\nfunction getTimeZoneOffset(date: Date, timeZone: string): number {\n  const formatter = getDateTimeFormatter(timeZone);\n  const { year, month, day, hour, minute, second } = getCalendarFromParts(formatter.formatToParts(date));\n  const asUTC = Date.UTC(year, month - 1, day, hour, minute, second);\n  return (asUTC - date.getTime()) / MILLIS_PER_MINUTE;\n}\n\nfunction zonedTimeToUtc(calendar: CalendarDate, time: TimeOfDay, timeZone: string): Date {\n  const utcDate = new Date(Date.UTC(calendar.year, calendar.month - 1, calendar.day, time.hour, time.minute, time.second));\n  const offset = getTimeZoneOffset(utcDate, timeZone);\n  const adjusted = new Date(utcDate.getTime() - offset * MILLIS_PER_MINUTE);\n  const offsetAfter = getTimeZoneOffset(adjusted, timeZone);\n  if (offset !== offsetAfter) {\n    return new Date(utcDate.getTime() - offsetAfter * MILLIS_PER_MINUTE);\n  }\n  return adjusted;\n}\n\nexport function toCalendarDateFromInstant(date: Date, timeZone?: string): CalendarDate {\n  if (timeZone) {\n    const formatter = getDateTimeFormatter(timeZone);\n    const parts = formatter.formatToParts(date);\n    const { year, month, day } = getCalendarFromParts(parts);\n    return { year, month, day };\n  }\n\n  return {\n    year: date.getFullYear(),\n    month: date.getMonth() + 1,\n    day: date.getDate()\n  };\n}\n\nexport function calendarFromDateOnlyString(value: string): CalendarDate {\n  const trimmed = value.trim();\n  if (!isDateOnlyString(trimmed)) {\n    throw new TypeError(`Invalid date string: ${value}`);\n  }\n\n  const [yearStr, monthStr, dayStr] = trimmed.split('-');\n  const year = Number(yearStr);\n  const month = Number(monthStr);\n  const day = Number(dayStr);\n\n  if (month < 1 || month > 12) {\n    throw new RangeError(`Month out of range in date string: ${value}`);\n  }\n  if (day < 1 || day > 31) {\n    throw new RangeError(`Day out of range in date string: ${value}`);\n  }\n\n  return { year, month, day };\n}\n\nexport function calendarFromDateValue(value: DateValue, timeZone?: string): CalendarDate {\n  if (isDate(value)) {\n    return toCalendarDateFromInstant(new Date(value.getTime()), timeZone);\n  }\n\n  if (typeof value === 'string') {\n    const trimmed = value.trim();\n    if (isDateOnlyString(trimmed)) {\n      return calendarFromDateOnlyString(trimmed);\n    }\n\n    const normalized = trimmed.includes('T') ? trimmed : trimmed.replace(' ', 'T');\n    const parsed = new Date(normalized);\n    if (Number.isNaN(parsed.getTime())) {\n      throw new TypeError(`Invalid date string: ${value}`);\n    }\n    return toCalendarDateFromInstant(parsed, timeZone);\n  }\n\n  throw new TypeError('Unsupported date value');\n}\n\nexport function parseDateValue(value: DateValue, timeZone?: string, treatDateOnlyAsLocalMidnight = false): Date {\n  if (isDate(value)) {\n    const time = value.getTime();\n    if (Number.isNaN(time)) {\n      throw new TypeError('Invalid date provided');\n    }\n    return new Date(time);\n  }\n\n  if (typeof value === 'string') {\n    const trimmed = value.trim();\n    if (isDateOnlyString(trimmed) || treatDateOnlyAsLocalMidnight) {\n      const calendar = calendarFromDateOnlyString(trimmed);\n      return makeDateFromCalendarAndTime(calendar, { hour: 0, minute: 0, second: 0 }, timeZone);\n    }\n\n    const normalized = trimmed.includes('T') ? trimmed : trimmed.replace(' ', 'T');\n    const parsed = new Date(normalized);\n    if (Number.isNaN(parsed.getTime())) {\n      throw new TypeError(`Invalid date string: ${value}`);\n    }\n    return parsed;\n  }\n\n  throw new TypeError('Unsupported date value');\n}\n\nexport function parseTimeOfDay(input: TimeOfDayInput): TimeOfDay {\n  if (typeof input === 'string') {\n    const trimmed = input.trim();\n    const match = /^([0-9]{1,2}):([0-9]{2})(?::([0-9]{2}))?$/.exec(trimmed);\n    if (!match) {\n      throw new TypeError(`Invalid time string: ${input}`);\n    }\n    const hour = Number(match[1]);\n    const minute = Number(match[2]);\n    const second = match[3] ? Number(match[3]) : 0;\n\n    if (hour < 0 || hour > 23) {\n      throw new RangeError(`Hour out of range in time string: ${input}`);\n    }\n    if (minute < 0 || minute > 59) {\n      throw new RangeError(`Minute out of range in time string: ${input}`);\n    }\n    if (second < 0 || second > 59) {\n      throw new RangeError(`Second out of range in time string: ${input}`);\n    }\n\n    return { hour, minute, second };\n  }\n\n  if (isTimeOfDayObject(input)) {\n    const { hour, minute = 0, second = 0 } = input;\n    if (hour < 0 || hour > 23) {\n      throw new RangeError(`Hour out of range: ${hour}`);\n    }\n    if (minute < 0 || minute > 59) {\n      throw new RangeError(`Minute out of range: ${minute}`);\n    }\n    if (second < 0 || second > 59) {\n      throw new RangeError(`Second out of range: ${second}`);\n    }\n\n    return { hour, minute, second };\n  }\n\n  throw new TypeError('Unsupported time input');\n}\n\nexport function makeDateFromCalendarAndTime(calendar: CalendarDate, time: TimeOfDay, timeZone?: string): Date {\n  if (timeZone) {\n    return zonedTimeToUtc(calendar, time, timeZone);\n  }\n  return new Date(calendar.year, calendar.month - 1, calendar.day, time.hour, time.minute, time.second, 0);\n}\n","import type { TimeslotBoundaryInput, TimeslotRangeInput } from '../types.js';\nimport {\n  type CalendarDate,\n  makeDateFromCalendarAndTime,\n  parseDateValue,\n  parseTimeOfDay,\n  calendarFromDateOnlyString,\n  calendarFromDateValue,\n  isDateOnlyString,\n  isTimeOnlyString,\n  toCalendarDateFromInstant\n} from './time.js';\n\nexport interface BoundaryContext {\n  timeZone?: string;\n  defaultCalendarDate?: CalendarDate;\n}\n\nexport interface ResolvedBoundary {\n  instant: Date;\n  calendar: CalendarDate;\n}\n\nexport function resolveBoundary(input: TimeslotBoundaryInput, context: BoundaryContext): ResolvedBoundary {\n  const { timeZone, defaultCalendarDate } = context;\n\n  if (input instanceof Date) {\n    const instant = parseDateValue(input, timeZone);\n    return { instant, calendar: toCalendarDateFromInstant(instant, timeZone) };\n  }\n\n  if (typeof input === 'string') {\n    const trimmed = input.trim();\n    if (isTimeOnlyString(trimmed)) {\n      if (!defaultCalendarDate) {\n        throw new RangeError(`Time-only boundary \"${input}\" requires a default day (use config.day or provide a date).`);\n      }\n      const time = parseTimeOfDay(trimmed);\n      const instant = makeDateFromCalendarAndTime(defaultCalendarDate, time, timeZone);\n      return { instant, calendar: defaultCalendarDate };\n    }\n\n    if (isDateOnlyString(trimmed)) {\n      const calendar = calendarFromDateOnlyString(trimmed);\n      const instant = makeDateFromCalendarAndTime(calendar, { hour: 0, minute: 0, second: 0 }, timeZone);\n      return { instant, calendar };\n    }\n\n    const normalized = trimmed.includes('T') ? trimmed : trimmed.replace(' ', 'T');\n    const instant = new Date(normalized);\n    if (Number.isNaN(instant.getTime())) {\n      throw new TypeError(`Invalid boundary string: ${input}`);\n    }\n    return { instant, calendar: toCalendarDateFromInstant(instant, timeZone) };\n  }\n\n  if (typeof input === 'object' && input !== null && 'time' in input) {\n    const time = parseTimeOfDay(input.time);\n    const calendar = input.date\n      ? calendarFromDateValue(input.date, timeZone)\n      : defaultCalendarDate;\n\n    if (!calendar) {\n      throw new RangeError('Time boundary requires a date when no default day is provided.');\n    }\n\n    const instant = makeDateFromCalendarAndTime(calendar, time, timeZone);\n    return { instant, calendar };\n  }\n\n  throw new TypeError('Unsupported boundary input');\n}\n\nexport function resolveRange(range: TimeslotRangeInput, context: BoundaryContext): { start: Date; end: Date } {\n  const startResolved = resolveBoundary(range.start, context);\n  const endResolved = resolveBoundary(range.end, {\n    ...context,\n    defaultCalendarDate: startResolved.calendar ?? context.defaultCalendarDate\n  });\n\n  if (endResolved.instant.getTime() <= startResolved.instant.getTime()) {\n    throw new RangeError('Timeslot range end must be after its start');\n  }\n\n  return { start: startResolved.instant, end: endResolved.instant };\n}\n","import type { TimeslotRangeInput } from '../types.js';\nimport { resolveRange, type BoundaryContext } from './boundaries.js';\n\nexport type Interval = { start: Date; end: Date };\n\nexport function mergeIntervals(intervals: Interval[]): Interval[] {\n  if (intervals.length === 0) {\n    return [];\n  }\n\n  const sorted = [...intervals].sort((a, b) => a.start.getTime() - b.start.getTime());\n  const merged: Interval[] = [sorted[0]!];\n\n  for (let i = 1; i < sorted.length; i += 1) {\n    const current = sorted[i]!;\n    const last = merged[merged.length - 1]!;\n\n    if (current.start.getTime() <= last.end.getTime()) {\n      if (current.end.getTime() > last.end.getTime()) {\n        last.end = current.end;\n      }\n    } else {\n      merged.push({ start: current.start, end: current.end });\n    }\n  }\n\n  return merged;\n}\n\nexport function subtractExclusions(source: Interval, exclusions: Interval[]): Interval[] {\n  let segments: Interval[] = [source];\n\n  for (const exclusion of exclusions) {\n    const nextSegments: Interval[] = [];\n\n    for (const segment of segments) {\n      const segmentStart = segment.start.getTime();\n      const segmentEnd = segment.end.getTime();\n      const exclusionStart = Math.max(exclusion.start.getTime(), segmentStart);\n      const exclusionEnd = Math.min(exclusion.end.getTime(), segmentEnd);\n\n      if (exclusionEnd <= exclusionStart) {\n        nextSegments.push(segment);\n        continue;\n      }\n\n      if (exclusionStart > segmentStart) {\n        nextSegments.push({ start: segment.start, end: new Date(exclusionStart) });\n      }\n\n      if (exclusionEnd < segmentEnd) {\n        nextSegments.push({ start: new Date(exclusionEnd), end: segment.end });\n      }\n    }\n\n    segments = nextSegments;\n    if (segments.length === 0) {\n      break;\n    }\n  }\n\n  return segments;\n}\n\nexport function normalizeExclusions(\n  exclusions: TimeslotRangeInput[] | undefined,\n  context: BoundaryContext,\n  window: Interval\n): Interval[] {\n  if (!exclusions || exclusions.length === 0) {\n    return [];\n  }\n\n  const normalized: Interval[] = [];\n\n  for (const exclusion of exclusions) {\n    const resolved = resolveRange(exclusion, context);\n    const start = resolved.start.getTime();\n    const end = resolved.end.getTime();\n\n    const windowStart = window.start.getTime();\n    const windowEnd = window.end.getTime();\n\n    if (end <= windowStart || start >= windowEnd) {\n      continue;\n    }\n\n    const clampedStart = new Date(Math.max(start, windowStart));\n    const clampedEnd = new Date(Math.min(end, windowEnd));\n    if (clampedEnd.getTime() > clampedStart.getTime()) {\n      normalized.push({ start: clampedStart, end: clampedEnd });\n    }\n  }\n\n  return mergeIntervals(normalized);\n}\n","import { MILLIS_PER_MINUTE } from './constants.js';\nimport type {\n  AlignmentStrategy,\n  LabelFormatter,\n  TimeslotGenerationConfig\n} from '../types.js';\n\nexport interface NormalizedConfig {\n  durationMs: number;\n  intervalMs: number;\n  minDurationMs: number;\n  includeEdge: boolean;\n  alignment: AlignmentStrategy;\n  maxSlots?: number;\n  labelFormatter?: LabelFormatter;\n}\n\nexport function validateConfig(config: TimeslotGenerationConfig): NormalizedConfig {\n  if (!Number.isFinite(config.slotDurationMinutes) || config.slotDurationMinutes <= 0) {\n    throw new RangeError('slotDurationMinutes must be a positive number');\n  }\n\n  const durationMs = config.slotDurationMinutes * MILLIS_PER_MINUTE;\n  const intervalMinutes = config.slotIntervalMinutes ?? config.slotDurationMinutes;\n\n  if (!Number.isFinite(intervalMinutes) || intervalMinutes <= 0) {\n    throw new RangeError('slotIntervalMinutes must be a positive number');\n  }\n\n  const intervalMs = intervalMinutes * MILLIS_PER_MINUTE;\n\n  if (config.bufferBeforeMinutes && config.bufferBeforeMinutes < 0) {\n    throw new RangeError('bufferBeforeMinutes cannot be negative');\n  }\n\n  if (config.bufferAfterMinutes && config.bufferAfterMinutes < 0) {\n    throw new RangeError('bufferAfterMinutes cannot be negative');\n  }\n\n  if (config.minimumSlotDurationMinutes && config.minimumSlotDurationMinutes <= 0) {\n    throw new RangeError('minimumSlotDurationMinutes must be positive');\n  }\n\n  if (config.maxSlots && config.maxSlots <= 0) {\n    throw new RangeError('maxSlots must be greater than zero when provided');\n  }\n\n  const minDurationMs = (config.minimumSlotDurationMinutes ?? config.slotDurationMinutes) * MILLIS_PER_MINUTE;\n  const includeEdge = config.includeEdge ?? true;\n  const alignment: AlignmentStrategy = config.alignment ?? 'start';\n\n  return {\n    durationMs,\n    intervalMs,\n    minDurationMs,\n    includeEdge,\n    alignment,\n    maxSlots: config.maxSlots,\n    labelFormatter: config.labelFormatter\n  };\n}\n","import { MILLIS_PER_MINUTE } from './constants.js';\nimport type { NormalizedConfig } from './config.js';\nimport type { Timeslot, TimeslotMetadata } from '../types.js';\n\nexport function addMinutes(date: Date, minutes: number): Date {\n  return new Date(date.getTime() + minutes * MILLIS_PER_MINUTE);\n}\n\nfunction pushSlot(\n  slots: Timeslot[],\n  startMs: number,\n  endMs: number,\n  config: NormalizedConfig\n): void {\n  if (config.maxSlots !== undefined && slots.length >= config.maxSlots) {\n    return;\n  }\n\n  if (endMs <= startMs) {\n    return;\n  }\n\n  const start = new Date(startMs);\n  const end = new Date(endMs);\n  const durationMinutes = (endMs - startMs) / MILLIS_PER_MINUTE;\n  const index = slots.length;\n\n  const slot: Timeslot = { start, end };\n  const metadata: TimeslotMetadata = {\n    index,\n    durationMinutes\n  };\n\n  if (config.labelFormatter) {\n    const label = config.labelFormatter({ start, end }, index, durationMinutes);\n    if (label !== undefined) {\n      metadata.label = label;\n    }\n  }\n\n  slot.metadata = metadata;\n  slots.push(slot);\n}\n\nexport function generateSlotsForSegment(\n  slots: Timeslot[],\n  segment: { start: Date; end: Date },\n  config: NormalizedConfig\n): void {\n  const segmentStartMs = segment.start.getTime();\n  const segmentEndMs = segment.end.getTime();\n  const spanMs = segmentEndMs - segmentStartMs;\n\n  if (spanMs <= 0) {\n    return;\n  }\n\n  if (config.maxSlots !== undefined && slots.length >= config.maxSlots) {\n    return;\n  }\n\n  const { durationMs, intervalMs, minDurationMs, includeEdge, alignment } = config;\n\n  if (alignment === 'center') {\n    if (spanMs < durationMs) {\n      if (includeEdge && spanMs >= minDurationMs) {\n        pushSlot(slots, segmentStartMs, segmentEndMs, config);\n      }\n      return;\n    }\n\n    const slotCount = Math.floor((spanMs - durationMs) / intervalMs) + 1;\n    if (slotCount <= 0) {\n      if (includeEdge && spanMs >= minDurationMs) {\n        pushSlot(slots, segmentStartMs, segmentEndMs, config);\n      }\n      return;\n    }\n\n    const usedSpan = durationMs + (slotCount - 1) * intervalMs;\n    const leftover = spanMs - usedSpan;\n    const offset = Math.round(leftover / 2);\n\n    for (let i = 0; i < slotCount; i += 1) {\n      if (config.maxSlots !== undefined && slots.length >= config.maxSlots) {\n        break;\n      }\n      const start = segmentStartMs + offset + i * intervalMs;\n      const end = start + durationMs;\n      pushSlot(slots, start, end, config);\n    }\n    return;\n  }\n\n  if (alignment === 'start') {\n    for (\n      let slotStart = segmentStartMs;\n      slotStart < segmentEndMs && (config.maxSlots === undefined || slots.length < config.maxSlots);\n      slotStart += intervalMs\n    ) {\n      const slotEnd = slotStart + durationMs;\n      if (slotEnd <= segmentEndMs) {\n        pushSlot(slots, slotStart, slotEnd, config);\n      } else if (includeEdge) {\n        const remaining = segmentEndMs - slotStart;\n        if (remaining >= minDurationMs) {\n          pushSlot(slots, slotStart, segmentEndMs, config);\n        }\n      }\n    }\n    return;\n  }\n\n  // alignment === 'end'\n  if (spanMs < durationMs) {\n    if (includeEdge && spanMs >= minDurationMs) {\n      pushSlot(slots, segmentStartMs, segmentEndMs, config);\n    }\n    return;\n  }\n\n  const countFull = Math.floor((spanMs - durationMs) / intervalMs) + 1;\n  const firstStart = segmentEndMs - durationMs - (countFull - 1) * intervalMs;\n  const leftover = firstStart - segmentStartMs;\n\n  if (includeEdge && leftover >= minDurationMs) {\n    pushSlot(slots, segmentStartMs, segmentStartMs + leftover, config);\n  }\n\n  for (let i = 0; i < countFull; i += 1) {\n    if (config.maxSlots !== undefined && slots.length >= config.maxSlots) {\n      break;\n    }\n    const slotStart = firstStart + i * intervalMs;\n    const slotEnd = slotStart + durationMs;\n    pushSlot(slots, slotStart, slotEnd, config);\n  }\n}\n","import type { Timeslot, TimeslotGenerationConfig } from './types.js';\nimport { calendarFromDateValue } from './internal/time.js';\nimport { resolveRange, type BoundaryContext } from './internal/boundaries.js';\nimport { normalizeExclusions, subtractExclusions } from './internal/exclusions.js';\nimport { validateConfig } from './internal/config.js';\nimport { addMinutes, generateSlotsForSegment } from './internal/slots.js';\n\nexport function generateTimeslots(config: TimeslotGenerationConfig): Timeslot[] {\n  const normalized = validateConfig(config);\n\n  const defaultCalendarDate = config.day ? calendarFromDateValue(config.day, config.timezone) : undefined;\n  const rangeContext: BoundaryContext = {\n    timeZone: config.timezone,\n    defaultCalendarDate\n  };\n\n  const range = resolveRange(config.range, rangeContext);\n\n  let windowStart = range.start;\n  let windowEnd = range.end;\n\n  if (config.bufferBeforeMinutes) {\n    windowStart = addMinutes(windowStart, config.bufferBeforeMinutes);\n  }\n  if (config.bufferAfterMinutes) {\n    windowEnd = addMinutes(windowEnd, -config.bufferAfterMinutes);\n  }\n\n  if (windowEnd.getTime() <= windowStart.getTime()) {\n    throw new RangeError('Buffers eliminate the available window; adjust buffer values.');\n  }\n\n  const exclusions = normalizeExclusions(config.excludedWindows, rangeContext, { start: windowStart, end: windowEnd });\n  const baseSegments = subtractExclusions({ start: windowStart, end: windowEnd }, exclusions);\n\n  const slots: Timeslot[] = [];\n  for (const segment of baseSegments) {\n    if (normalized.maxSlots !== undefined && slots.length >= normalized.maxSlots) {\n      break;\n    }\n    generateSlotsForSegment(slots, segment, normalized);\n  }\n\n  return slots;\n}\n","import type { Timeslot, TimeslotGenerationConfig, TimeslotRangeInput } from './types.js';\nimport { generateTimeslots } from './generate-timeslots.js';\nimport { resolveRange, type BoundaryContext } from './internal/boundaries.js';\n\nexport function generateDailyTimeslots(\n  period: TimeslotRangeInput,\n  config: Omit<TimeslotGenerationConfig, 'day' | 'range'> & { range: TimeslotRangeInput }\n): Timeslot[] {\n  const periodContext: BoundaryContext = {\n    timeZone: config.timezone,\n  };\n\n  const periodRange = resolveRange(period, periodContext);\n  const start = periodRange.start;\n  const end = periodRange.end;\n\n  // DEBUG\n  console.log('generateDailyTimeslots period:', start.toISOString(), 'to', end.toISOString());\n\n  const results: Timeslot[] = [];\n  const MAX_DAYS = 10000;\n  let daysCount = 0;\n\n  const iterator = new Date(start);\n\n  while (iterator <= end) {\n    if (daysCount++ > MAX_DAYS) {\n      throw new RangeError('generateDailyTimeslots exceeded maximum day limit (10000)');\n    }\n\n    console.log('Iterating day:', iterator.toISOString());\n\n    const daySlots = generateTimeslots({\n      ...config,\n      day: new Date(iterator),\n    });\n\n    for (const slot of daySlots) {\n      if (slot.start >= start && slot.end <= end) {\n        results.push(slot);\n      }\n    }\n\n    iterator.setDate(iterator.getDate() + 1);\n  }\n\n  return results;\n}\n","import type { Timeslot } from './types.js';\n\n/**\n * Create a validated timeslot ensuring the start is before the end.\n */\nexport function createTimeslot(start: Date, end: Date): Timeslot {\n  if (Number.isNaN(start.valueOf()) || Number.isNaN(end.valueOf())) {\n    throw new TypeError('Invalid date provided');\n  }\n\n  if (end.getTime() <= start.getTime()) {\n    throw new RangeError('Timeslot end must be after its start');\n  }\n\n  return { start: new Date(start), end: new Date(end) };\n}\n\n/**\n * Determine if two timeslots overlap.\n */\nexport function overlaps(a: Timeslot, b: Timeslot): boolean {\n  return a.start < b.end && b.start < a.end;\n}\n"],"mappings":"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","names":["instant","leftover"]}