{"version":3,"sources":["../src/conversion.ts","../src/world-clock.ts"],"names":["TimezoneCache","fromZonedTime","toZonedTime","memoize","formatInTimeZone","getTimezoneInfo","listAllTimezones"],"mappings":"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","file":"world-clock.cjs","sourcesContent":["import { toZonedTime, fromZonedTime, formatInTimeZone } from \"date-fns-tz\";\nimport type { ConvertTimezoneOptions } from \"@multisystemsuite/timezone-engine-shared-types\";\nimport { memoize, TimezoneCache } from \"@multisystemsuite/timezone-engine-utils\";\n\nconst conversionCache = new TimezoneCache();\n\nfunction toDate(input: Date | string | number): Date {\n  if (input instanceof Date) return input;\n  return new Date(input);\n}\n\n/** Convert date to UTC */\nexport function toUTC(date: Date | string | number, sourceTimezone: string): Date {\n  const d = toDate(date);\n  return fromZonedTime(d, sourceTimezone);\n}\n\n/** Convert UTC date to target timezone representation */\nexport function fromUTC(date: Date | string | number, targetTimezone: string): Date {\n  const d = toDate(date);\n  return toZonedTime(d, targetTimezone);\n}\n\n/** Convert date between timezones */\nexport function convertTimezone(options: ConvertTimezoneOptions): Date {\n  const { sourceTimezone, targetTimezone, date = new Date() } = options;\n  const utcDate = toUTC(date, sourceTimezone);\n  return fromUTC(utcDate, targetTimezone);\n}\n\nconst memoizedConvert = memoize(\n  (sourceTimezone: string, targetTimezone: string, timestamp: number) =>\n    convertTimezone({ sourceTimezone, targetTimezone, date: new Date(timestamp) }),\n  (source, target, ts) => `${source}:${target}:${ts}`,\n  conversionCache,\n);\n\n/** Cached timezone conversion for high-performance scenarios */\nexport function convertTimezoneCached(\n  sourceTimezone: string,\n  targetTimezone: string,\n  date: Date | string | number = new Date(),\n): Date {\n  return memoizedConvert(sourceTimezone, targetTimezone, toDate(date).getTime());\n}\n\n/** Detect if DST is active for a timezone at a given date */\nexport function detectDST(timezone: string, date: Date | string | number = new Date()): boolean {\n  const d = toDate(date);\n  const jan = new Date(d.getFullYear(), 0, 1);\n  const jul = new Date(d.getFullYear(), 6, 1);\n\n  const janOffset = getTimezoneOffsetMinutes(timezone, jan);\n  const julOffset = getTimezoneOffsetMinutes(timezone, jul);\n  const currentOffset = getTimezoneOffsetMinutes(timezone, d);\n\n  if (janOffset === julOffset) return false;\n  return currentOffset !== Math.max(janOffset, julOffset);\n}\n\n/** Get UTC offset string for a timezone (e.g. \"+05:30\") */\nexport function getUtcOffset(timezone: string, date: Date | string | number = new Date()): string {\n  const d = toDate(date);\n  const formatted = formatInTimeZone(d, timezone, \"xxx\");\n  return formatted;\n}\n\n/** Get offset in minutes from UTC */\nexport function getTimezoneOffsetMinutes(\n  timezone: string,\n  date: Date | string | number = new Date(),\n): number {\n  const d = toDate(date);\n  const utcDate = toUTC(d, timezone);\n  return (utcDate.getTime() - d.getTime()) / 60_000;\n}\n","import { formatInTimeZone } from \"date-fns-tz\";\nimport type { WorldClockEntry } from \"@multisystemsuite/timezone-engine-shared-types\";\nimport { getTimezoneInfo, listAllTimezones } from \"@multisystemsuite/timezone-engine-world-data\";\nimport { detectDST, getUtcOffset } from \"./conversion.js\";\n\nfunction buildClockEntry(timezone: string, label: string, now: Date): WorldClockEntry {\n  const info = getTimezoneInfo(timezone);\n  const formattedTime = formatInTimeZone(now, timezone, \"PPpp\");\n  const utcOffset = getUtcOffset(timezone, now);\n  const isDST = detectDST(timezone, now);\n\n  return {\n    timezone,\n    label: label || info?.city || timezone,\n    localTime: now,\n    formattedTime,\n    utcOffset,\n    isDST,\n  };\n}\n\n/** Get world clock for a single timezone */\nexport function getWorldClockTime(\n  timezone: string,\n  label?: string,\n  now: Date = new Date(),\n): WorldClockEntry {\n  return buildClockEntry(timezone, label ?? timezone, now);\n}\n\n/** Get world clock for multiple timezones */\nexport function getWorldClock(timezones: string[], now: Date = new Date()): WorldClockEntry[] {\n  return timezones.map((tz) => buildClockEntry(tz, tz, now));\n}\n\n/** Get default world clock with major cities */\nexport function getDefaultWorldClock(now: Date = new Date()): WorldClockEntry[] {\n  const defaults = [\n    \"UTC\",\n    \"America/New_York\",\n    \"Europe/London\",\n    \"Asia/Kolkata\",\n    \"Asia/Tokyo\",\n    \"Australia/Sydney\",\n  ];\n  return getWorldClock(defaults, now);\n}\n\n/** Get all registered world clock entries */\nexport function getFullWorldClock(now: Date = new Date()): WorldClockEntry[] {\n  return getWorldClock(listAllTimezones(), now);\n}\n\n/** Create a live clock updater callback */\nexport function createLiveClockUpdater(\n  timezones: string[],\n  onUpdate: (clocks: WorldClockEntry[]) => void,\n  intervalMs = 1000,\n): { start: () => void; stop: () => void } {\n  let timerId: ReturnType<typeof setInterval> | undefined;\n\n  const tick = () => {\n    onUpdate(getWorldClock(timezones));\n  };\n\n  return {\n    start: () => {\n      tick();\n      timerId = setInterval(tick, intervalMs);\n    },\n    stop: () => {\n      if (timerId !== undefined) {\n        clearInterval(timerId);\n        timerId = undefined;\n      }\n    },\n  };\n}\n"]}