{"version":3,"sources":["../src/tz.ts","../src/sessions.ts","../src/presets.ts","../src/index.ts"],"names":["toMinutes","pad"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Timezone helpers — shared by MarketClock and the session functions.\n *\n * Two ways to resolve exchange-local time:\n *   1. `offsetMinutes` — a fixed offset ahead of UTC. Exact for exchanges with\n *      no daylight-saving (IST, JST, HKT, SGT).\n *   2. `timeZone` — an IANA zone name (e.g. \"America/New_York\"). DST-correct via\n *      `Intl.DateTimeFormat`. Takes precedence over `offsetMinutes` when present.\n *\n * Zero dependencies — `Intl` is a Web/Node built-in.\n */\n\nimport type { ExchangeSpec } from \"./index\";\n\nexport interface LocalParts {\n  y: number;\n  m: number;\n  d: number;\n  day: number;\n  minute: number;\n}\n\nconst WEEKDAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\n/** Minutes an IANA zone is ahead of UTC at a given instant (DST-aware). */\nfunction zoneOffsetMinutes(timeZone: string, date: Date): number {\n  const dtf = 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  const map: Record<string, number> = {};\n  for (const p of dtf.formatToParts(date)) {\n    if (p.type !== \"literal\") map[p.type] = Number(p.value);\n  }\n  const asUtc = Date.UTC(\n    map.year ?? 0,\n    (map.month ?? 1) - 1,\n    map.day ?? 1,\n    (map.hour ?? 0) % 24,\n    map.minute ?? 0,\n    map.second ?? 0,\n  );\n  return Math.round((asUtc - date.getTime()) / 60000);\n}\n\n/** Exchange-local calendar parts for an instant. */\nexport function localParts(spec: ExchangeSpec, date: Date): LocalParts {\n  if (spec.timeZone) {\n    const dtf = new Intl.DateTimeFormat(\"en-US\", {\n      timeZone: spec.timeZone,\n      hourCycle: \"h23\",\n      weekday: \"short\",\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n    });\n    const map: Record<string, string> = {};\n    for (const p of dtf.formatToParts(date)) map[p.type] = p.value;\n    return {\n      y: Number(map.year),\n      m: Number(map.month),\n      d: Number(map.day),\n      day: WEEKDAYS.indexOf(map.weekday ?? \"\"),\n      minute: (Number(map.hour) % 24) * 60 + Number(map.minute),\n    };\n  }\n  const local = new Date(date.getTime() + spec.offsetMinutes * 60000);\n  return {\n    y: local.getUTCFullYear(),\n    m: local.getUTCMonth() + 1,\n    d: local.getUTCDate(),\n    day: local.getUTCDay(),\n    minute: local.getUTCHours() * 60 + local.getUTCMinutes(),\n  };\n}\n\n/** UTC epoch millis for an exchange-local calendar day + minute-of-day. */\nexport function utcFromLocal(\n  spec: ExchangeSpec,\n  y: number,\n  m: number,\n  d: number,\n  minute: number,\n): number {\n  if (spec.timeZone) {\n    const guess = Date.UTC(y, m - 1, d) + minute * 60000;\n    const off = zoneOffsetMinutes(spec.timeZone, new Date(guess));\n    let utc = guess - off * 60000;\n    // Refine once for the wall-clock hour landing across a DST transition.\n    const off2 = zoneOffsetMinutes(spec.timeZone, new Date(utc));\n    if (off2 !== off) utc = guess - off2 * 60000;\n    return utc;\n  }\n  return Date.UTC(y, m - 1, d) + minute * 60000 - spec.offsetMinutes * 60000;\n}\n","/**\n * Session segments, countdowns and multi-session helpers.\n *\n * The base MarketClock answers \"open / pre-open / closed\". These pure functions\n * add the richer model: distinct **segments** (pre-open · regular · post ·\n * closed), the next segment change, half-day / early-close awareness, and the\n * next N trading sessions — all DST-correct via the same tz helpers.\n *\n * Every function is a pure function of `(spec, instant)` so results are fully\n * deterministic for a fixed instant, regardless of the host clock or timezone.\n */\n\nimport type { ExchangeSpec } from \"./index\";\nimport { localParts, utcFromLocal } from \"./tz\";\n\n/** A distinct trading-day segment. */\nexport type Segment = \"pre-open\" | \"regular\" | \"post\" | \"closed\";\n\n/** A single trading session (regular hours), half-day adjusted. */\nexport interface SessionWindow {\n  /** \"YYYY-MM-DD\" exchange-local date. */\n  date: string;\n  /** Regular-session open instant. */\n  open: Date;\n  /** Regular-session close instant (early on a half-day). */\n  close: Date;\n  /** True when this date is an early-close / half-day session. */\n  halfDay: boolean;\n}\n\n/** The next segment boundary: the segment that begins at `at`. */\nexport interface SegmentChange {\n  segment: Segment;\n  at: Date;\n}\n\nfunction toMinutes(hhmm: string): number {\n  const [h, m] = hhmm.split(\":\").map(Number);\n  return (h || 0) * 60 + (m || 0);\n}\n\nfunction pad(n: number): string {\n  return n < 10 ? \"0\" + n : String(n);\n}\n\nfunction isoDate(p: { y: number; m: number; d: number }): string {\n  return `${p.y}-${pad(p.m)}-${pad(p.d)}`;\n}\n\n/** Effective regular open/close for a date, applying a half-day override. */\nfunction regularFor(spec: ExchangeSpec, dateStr: string): { open: string; close: string } {\n  const hd = spec.halfDays?.[dateStr];\n  if (hd) return { open: hd.open ?? spec.regular.open, close: hd.close };\n  return spec.regular;\n}\n\nfunction isWeekend(spec: ExchangeSpec, date: Date): boolean {\n  return spec.weekend.includes(localParts(spec, date).day);\n}\n\n/** Is the date a full-day exchange holiday? */\nexport function isHoliday(spec: ExchangeSpec, date: Date = new Date()): boolean {\n  return spec.holidays.includes(isoDate(localParts(spec, date)));\n}\n\n/** A day the exchange trades (not weekend, not a full-day holiday). Half-days count. */\nexport function isTradingDay(spec: ExchangeSpec, date: Date = new Date()): boolean {\n  return !isWeekend(spec, date) && !isHoliday(spec, date);\n}\n\n/** Is the date an early-close / half-day trading session? */\nexport function isHalfDay(spec: ExchangeSpec, date: Date = new Date()): boolean {\n  return (\n    !!spec.halfDays &&\n    Object.prototype.hasOwnProperty.call(spec.halfDays, isoDate(localParts(spec, date))) &&\n    isTradingDay(spec, date)\n  );\n}\n\n/** The segment the market is in at `at`. */\nexport function currentSegment(spec: ExchangeSpec, at: Date = new Date()): Segment {\n  if (!isTradingDay(spec, at)) return \"closed\";\n  const p = localParts(spec, at);\n  const reg = regularFor(spec, isoDate(p));\n  if (p.minute >= toMinutes(reg.open) && p.minute < toMinutes(reg.close)) return \"regular\";\n  if (spec.preOpen) {\n    if (p.minute >= toMinutes(spec.preOpen.open) && p.minute < toMinutes(spec.preOpen.close)) {\n      return \"pre-open\";\n    }\n  }\n  if (spec.postClose) {\n    if (p.minute >= toMinutes(spec.postClose.open) && p.minute < toMinutes(spec.postClose.close)) {\n      return \"post\";\n    }\n  }\n  return \"closed\";\n}\n\n/** The next moment the current segment changes, strictly after `at`. */\nexport function nextSegmentChange(spec: ExchangeSpec, at: Date = new Date()): SegmentChange {\n  const current = currentSegment(spec, at);\n  const nowMs = at.getTime();\n  const start = localParts(spec, at);\n  for (let i = 0; i < 500; i++) {\n    const dp = new Date(Date.UTC(start.y, start.m - 1, start.d) + i * 86400000);\n    const p = { y: dp.getUTCFullYear(), m: dp.getUTCMonth() + 1, d: dp.getUTCDate() };\n    if (spec.weekend.includes(dp.getUTCDay())) continue;\n    const dateStr = isoDate(p);\n    if (spec.holidays.includes(dateStr)) continue;\n    const reg = regularFor(spec, dateStr);\n    const mins = new Set<number>();\n    if (spec.preOpen) {\n      mins.add(toMinutes(spec.preOpen.open));\n      mins.add(toMinutes(spec.preOpen.close));\n    }\n    mins.add(toMinutes(reg.open));\n    mins.add(toMinutes(reg.close));\n    if (spec.postClose) {\n      mins.add(toMinutes(spec.postClose.open));\n      mins.add(toMinutes(spec.postClose.close));\n    }\n    for (const mn of [...mins].sort((a, b) => a - b)) {\n      const t = utcFromLocal(spec, p.y, p.m, p.d, mn);\n      if (t <= nowMs) continue;\n      const seg = currentSegment(spec, new Date(t));\n      if (seg !== current) return { segment: seg, at: new Date(t) };\n    }\n  }\n  throw new Error(\"no segment change found within 500 days\");\n}\n\n/** The next regular-session open instant strictly after `from` (half-day aware). */\nexport function nextOpenAt(spec: ExchangeSpec, from: Date = new Date()): Date {\n  const start = localParts(spec, from);\n  for (let i = 0; i < 500; i++) {\n    const dp = new Date(Date.UTC(start.y, start.m - 1, start.d) + i * 86400000);\n    const p = { y: dp.getUTCFullYear(), m: dp.getUTCMonth() + 1, d: dp.getUTCDate() };\n    if (spec.weekend.includes(dp.getUTCDay())) continue;\n    const dateStr = isoDate(p);\n    if (spec.holidays.includes(dateStr)) continue;\n    const reg = regularFor(spec, dateStr);\n    const openUtc = utcFromLocal(spec, p.y, p.m, p.d, toMinutes(reg.open));\n    if (openUtc > from.getTime()) return new Date(openUtc);\n  }\n  throw new Error(\"no trading day found within 500 days\");\n}\n\n/** The next regular-session close instant strictly after `from` (half-day aware). */\nexport function nextCloseAt(spec: ExchangeSpec, from: Date = new Date()): Date {\n  const start = localParts(spec, from);\n  for (let i = 0; i < 500; i++) {\n    const dp = new Date(Date.UTC(start.y, start.m - 1, start.d) + i * 86400000);\n    const p = { y: dp.getUTCFullYear(), m: dp.getUTCMonth() + 1, d: dp.getUTCDate() };\n    if (spec.weekend.includes(dp.getUTCDay())) continue;\n    const dateStr = isoDate(p);\n    if (spec.holidays.includes(dateStr)) continue;\n    const reg = regularFor(spec, dateStr);\n    const closeUtc = utcFromLocal(spec, p.y, p.m, p.d, toMinutes(reg.close));\n    if (closeUtc > from.getTime()) return new Date(closeUtc);\n  }\n  throw new Error(\"no trading day found within 500 days\");\n}\n\n/** Milliseconds until the next regular open (always > 0). */\nexport function timeUntilOpen(spec: ExchangeSpec, now: Date = new Date()): number {\n  return nextOpenAt(spec, now).getTime() - now.getTime();\n}\n\n/** Milliseconds until the next regular close (always > 0; early on a half-day). */\nexport function timeUntilClose(spec: ExchangeSpec, now: Date = new Date()): number {\n  return nextCloseAt(spec, now).getTime() - now.getTime();\n}\n\n/**\n * The next `n` trading sessions at/after `now`, skipping weekends, holidays and\n * honouring half-day early closes. A session already underway (close still in\n * the future) is included as the first entry.\n */\nexport function nextSessions(spec: ExchangeSpec, now: Date = new Date(), n = 1): SessionWindow[] {\n  const out: SessionWindow[] = [];\n  const nowMs = now.getTime();\n  const start = localParts(spec, now);\n  for (let i = 0; i < 800 && out.length < n; i++) {\n    const dp = new Date(Date.UTC(start.y, start.m - 1, start.d) + i * 86400000);\n    const p = { y: dp.getUTCFullYear(), m: dp.getUTCMonth() + 1, d: dp.getUTCDate() };\n    if (spec.weekend.includes(dp.getUTCDay())) continue;\n    const dateStr = isoDate(p);\n    if (spec.holidays.includes(dateStr)) continue;\n    const reg = regularFor(spec, dateStr);\n    const close = utcFromLocal(spec, p.y, p.m, p.d, toMinutes(reg.close));\n    if (close <= nowMs) continue;\n    const open = utcFromLocal(spec, p.y, p.m, p.d, toMinutes(reg.open));\n    out.push({\n      date: dateStr,\n      open: new Date(open),\n      close: new Date(close),\n      halfDay: isHalfDay(spec, new Date(open)),\n    });\n  }\n  return out;\n}\n\n/**\n * All trading sessions whose open instant falls within `[a, b)`. Returns `[]`\n * when `b <= a`.\n */\nexport function sessionsBetween(spec: ExchangeSpec, a: Date, b: Date): SessionWindow[] {\n  const out: SessionWindow[] = [];\n  const aMs = a.getTime();\n  const bMs = b.getTime();\n  if (bMs <= aMs) return out;\n  const start = localParts(spec, a);\n  for (let i = 0; i < 2000; i++) {\n    const dp = new Date(Date.UTC(start.y, start.m - 1, start.d) + i * 86400000);\n    const p = { y: dp.getUTCFullYear(), m: dp.getUTCMonth() + 1, d: dp.getUTCDate() };\n    const dateStr = isoDate(p);\n    const reg = regularFor(spec, dateStr);\n    const open = utcFromLocal(spec, p.y, p.m, p.d, toMinutes(reg.open));\n    if (open >= bMs) break;\n    if (spec.weekend.includes(dp.getUTCDay())) continue;\n    if (spec.holidays.includes(dateStr)) continue;\n    if (open < aMs) continue;\n    const close = utcFromLocal(spec, p.y, p.m, p.d, toMinutes(reg.close));\n    out.push({\n      date: dateStr,\n      open: new Date(open),\n      close: new Date(close),\n      halfDay: isHalfDay(spec, new Date(open)),\n    });\n  }\n  return out;\n}\n","/**\n * Built-in exchange presets.\n *\n * Ready-made `ExchangeSpec`s for common exchanges. No-DST exchanges (IST/JST/\n * HKT/SGT) use an exact fixed `offsetMinutes`; DST exchanges (US/UK) use an IANA\n * `timeZone` so open/close stay correct across daylight-saving transitions.\n *\n * Bundled holiday lists are hand-maintained and cover 2025–2026 nationally-fixed\n * observances only — verify and extend from the official exchange circular:\n *   `new MarketClock({ ...NYSE, holidays: [...NYSE.holidays, \"2027-...\"] })`.\n *\n * Lunch breaks (TSE, HKEX) are NOT modelled — the single regular window spans\n * the whole trading day. Use a custom spec if intraday breaks matter to you.\n */\n\nimport type { ExchangeSpec } from \"./index\";\n\n/* ------------------------------------------------------------------ US ---- */\n\nconst US_HOLIDAYS: string[] = [\n  // 2025\n  \"2025-01-01\", \"2025-01-20\", \"2025-02-17\", \"2025-04-18\", \"2025-05-26\",\n  \"2025-06-19\", \"2025-07-04\", \"2025-09-01\", \"2025-11-27\", \"2025-12-25\",\n  // 2026\n  \"2026-01-01\", \"2026-01-19\", \"2026-02-16\", \"2026-04-03\", \"2026-05-25\",\n  \"2026-06-19\", \"2026-07-03\", \"2026-09-07\", \"2026-11-26\", \"2026-12-25\",\n];\n\n/** Early 13:00 closes (day-after-Thanksgiving, Christmas Eve). */\nconst US_HALF_DAYS: Record<string, { close: string }> = {\n  \"2025-11-28\": { close: \"13:00\" },\n  \"2025-12-24\": { close: \"13:00\" },\n  \"2026-11-27\": { close: \"13:00\" },\n  \"2026-12-24\": { close: \"13:00\" },\n};\n\n/** New York Stock Exchange. Pre-market 04:00, regular 09:30–16:00, after 16:00–20:00 ET. */\nexport const NYSE: ExchangeSpec = {\n  name: \"NYSE\",\n  timeZone: \"America/New_York\",\n  offsetMinutes: -300, // EST fallback; timeZone (DST) takes precedence\n  preOpen: { open: \"04:00\", close: \"09:30\" },\n  regular: { open: \"09:30\", close: \"16:00\" },\n  postClose: { open: \"16:00\", close: \"20:00\" },\n  weekend: [0, 6],\n  holidays: US_HOLIDAYS,\n  halfDays: US_HALF_DAYS,\n};\n\n/** NASDAQ — same sessions and calendar as NYSE. */\nexport const NASDAQ: ExchangeSpec = {\n  ...NYSE,\n  name: \"NASDAQ\",\n};\n\n/* ------------------------------------------------------------------ UK ---- */\n\nconst LSE_HOLIDAYS: string[] = [\n  // 2025\n  \"2025-01-01\", \"2025-04-18\", \"2025-04-21\", \"2025-05-05\", \"2025-05-26\",\n  \"2025-08-25\", \"2025-12-25\", \"2025-12-26\",\n  // 2026\n  \"2026-01-01\", \"2026-04-03\", \"2026-04-06\", \"2026-05-04\", \"2026-05-25\",\n  \"2026-08-31\", \"2026-12-25\", \"2026-12-28\",\n];\n\n/** Early 12:30 closes (Christmas Eve, New Year's Eve). */\nconst LSE_HALF_DAYS: Record<string, { close: string }> = {\n  \"2025-12-24\": { close: \"12:30\" },\n  \"2025-12-31\": { close: \"12:30\" },\n  \"2026-12-24\": { close: \"12:30\" },\n  \"2026-12-31\": { close: \"12:30\" },\n};\n\n/** London Stock Exchange. Opening auction 07:50, regular 08:00–16:30 London time. */\nexport const LSE: ExchangeSpec = {\n  name: \"LSE\",\n  timeZone: \"Europe/London\",\n  offsetMinutes: 0, // GMT fallback; timeZone (BST) takes precedence\n  preOpen: { open: \"07:50\", close: \"08:00\" },\n  regular: { open: \"08:00\", close: \"16:30\" },\n  weekend: [0, 6],\n  holidays: LSE_HOLIDAYS,\n  halfDays: LSE_HALF_DAYS,\n};\n\n/* -------------------------------------------------------------- Asia ---- */\n\nconst TSE_HOLIDAYS: string[] = [\n  // 2025\n  \"2025-01-01\", \"2025-01-02\", \"2025-01-03\", \"2025-01-13\", \"2025-02-11\",\n  \"2025-02-24\", \"2025-05-05\", \"2025-05-06\", \"2025-07-21\", \"2025-08-11\",\n  \"2025-09-15\", \"2025-09-23\", \"2025-10-13\", \"2025-11-03\", \"2025-11-24\",\n  \"2025-12-31\",\n  // 2026\n  \"2026-01-01\", \"2026-01-02\", \"2026-01-12\", \"2026-02-11\", \"2026-02-23\",\n  \"2026-05-04\", \"2026-05-05\", \"2026-05-06\", \"2026-09-21\", \"2026-11-03\",\n  \"2026-11-23\", \"2026-12-31\",\n];\n\n/**\n * Tokyo Stock Exchange (JST, no DST — exact offset). Regular 09:00–15:00.\n * Note: the 11:30–12:30 lunch break is NOT modelled.\n */\nexport const TSE: ExchangeSpec = {\n  name: \"TSE\",\n  offsetMinutes: 540,\n  preOpen: { open: \"08:00\", close: \"09:00\" },\n  regular: { open: \"09:00\", close: \"15:00\" },\n  weekend: [0, 6],\n  holidays: TSE_HOLIDAYS,\n};\n\nconst HKEX_HOLIDAYS: string[] = [\n  // 2025\n  \"2025-01-01\", \"2025-01-29\", \"2025-01-30\", \"2025-01-31\", \"2025-04-04\",\n  \"2025-04-18\", \"2025-04-21\", \"2025-05-01\", \"2025-05-05\", \"2025-07-01\",\n  \"2025-10-01\", \"2025-10-07\", \"2025-10-29\", \"2025-12-25\", \"2025-12-26\",\n  // 2026\n  \"2026-01-01\", \"2026-02-17\", \"2026-02-18\", \"2026-02-19\", \"2026-04-03\",\n  \"2026-04-06\", \"2026-05-01\", \"2026-05-25\", \"2026-07-01\", \"2026-10-01\",\n  \"2026-12-25\",\n];\n\n/**\n * Hong Kong Exchange (HKT, no DST — exact offset). Regular 09:30–16:00.\n * Note: the 12:00–13:00 lunch break is NOT modelled.\n */\nexport const HKEX: ExchangeSpec = {\n  name: \"HKEX\",\n  offsetMinutes: 480,\n  preOpen: { open: \"09:00\", close: \"09:30\" },\n  regular: { open: \"09:30\", close: \"16:00\" },\n  weekend: [0, 6],\n  holidays: HKEX_HOLIDAYS,\n};\n\nconst SGX_HOLIDAYS: string[] = [\n  // 2025\n  \"2025-01-01\", \"2025-01-29\", \"2025-01-30\", \"2025-03-31\", \"2025-04-18\",\n  \"2025-05-01\", \"2025-05-12\", \"2025-06-07\", \"2025-08-09\", \"2025-10-20\",\n  \"2025-12-25\",\n  // 2026\n  \"2026-01-01\", \"2026-02-17\", \"2026-02-18\", \"2026-03-21\", \"2026-04-03\",\n  \"2026-05-01\", \"2026-05-27\", \"2026-05-31\", \"2026-08-10\", \"2026-11-08\",\n  \"2026-12-25\",\n];\n\n/** Singapore Exchange (SGT, no DST — exact offset). Pre-open 08:30, regular 09:00–17:00. */\nexport const SGX: ExchangeSpec = {\n  name: \"SGX\",\n  offsetMinutes: 480,\n  preOpen: { open: \"08:30\", close: \"09:00\" },\n  regular: { open: \"09:00\", close: \"17:00\" },\n  weekend: [0, 6],\n  holidays: SGX_HOLIDAYS,\n};\n\n/* --------------------------------------------------------------- Nepal ---- */\n\n/**\n * Nepal Stock Exchange. Trades Sunday–Thursday (Friday and Saturday closed),\n * pre-open 10:30–10:45, regular 11:00–15:00 NPT (UTC+05:45, no DST).\n *\n * Holidays: Nepal's public holidays follow the Bikram Sambat / lunar calendar and are\n * announced by the government and NEPSE each year, so none are bundled. Add your\n * own list (e.g. loaded from your DB) with `withHolidays(NEPSE, [\"2026-10-20\", …])`.\n * @since 1.2.0\n */\nexport const NEPSE: ExchangeSpec = {\n  name: \"NEPSE\",\n  offsetMinutes: 345,\n  preOpen: { open: \"10:30\", close: \"10:45\" },\n  regular: { open: \"11:00\", close: \"15:00\" },\n  weekend: [5, 6],\n  holidays: [],\n};\n\n/**\n * A copy of `spec` with extra holidays (and optional half-days) merged in — for\n * exchanges whose calendar you maintain yourself. Dates are \"YYYY-MM-DD\" exchange-local.\n * @since 1.2.0\n */\nexport function withHolidays(spec: ExchangeSpec, holidays: string[], halfDays?: ExchangeSpec[\"halfDays\"]): ExchangeSpec {\n  return {\n    ...spec,\n    holidays: [...new Set([...spec.holidays, ...holidays])].sort(),\n    ...(halfDays || spec.halfDays ? { halfDays: { ...(spec.halfDays ?? {}), ...(halfDays ?? {}) } } : {}),\n  };\n}\n","/**\n * @lacspace/market-clock\n * Is the market open right now? When does it next open / close?\n *\n * A holiday-aware, timezone-correct trading clock for stock exchanges. Ships\n * with NSE / BSE (India) presets — India has no DST, so a fixed IST offset is\n * exact. Bring your own exchange spec or override the holiday list any time.\n *\n * Note: the bundled holiday lists are hand-maintained and only cover the years\n * listed. Extend them per year from the official exchange circular (e.g.\n * `new MarketClock({ ...NSE, holidays: [...NSE.holidays, \"2027-...\"] })`).\n *\n * Zero dependencies · isomorphic · fully typed.\n */\n\nimport { localParts, utcFromLocal } from \"./tz\";\nimport {\n  currentSegment,\n  nextSegmentChange,\n  timeUntilOpen,\n  timeUntilClose,\n  nextSessions,\n  sessionsBetween,\n  isHalfDay,\n  type Segment,\n  type SegmentChange,\n  type SessionWindow,\n} from \"./sessions\";\n\nexport interface Session {\n  /** \"HH:MM\" 24-hour, in exchange-local time. */\n  open: string;\n  close: string;\n}\n\n/** An early-close / half-day override for a single date. */\nexport interface HalfDay {\n  /** \"HH:MM\" early close in exchange-local time (e.g. \"13:00\"). */\n  close: string;\n  /** Optional early/late open; defaults to the regular open. */\n  open?: string;\n}\n\nexport interface ExchangeSpec {\n  name: string;\n  /** Minutes ahead of UTC (IST = +330). Exchanges without DST only. */\n  offsetMinutes: number;\n  regular: Session;\n  preOpen?: Session;\n  /**\n   * Post-market / after-hours session (optional). Enables the \"post\" segment.\n   * @since 1.1.0\n   */\n  postClose?: Session;\n  /**\n   * IANA timezone (e.g. \"America/New_York\"). When set it is DST-correct via\n   * `Intl` and takes precedence over `offsetMinutes`. Omit for no-DST exchanges.\n   * @since 1.1.0\n   */\n  timeZone?: string;\n  /**\n   * Early-close / half-day overrides, keyed by \"YYYY-MM-DD\" exchange-local date.\n   * @since 1.1.0\n   */\n  halfDays?: Record<string, HalfDay>;\n  /** Weekday numbers that are always closed (0 = Sunday … 6 = Saturday). */\n  weekend: number[];\n  /** Full-day holidays as \"YYYY-MM-DD\" in exchange-local dates. */\n  holidays: string[];\n}\n\nexport type MarketStatus = \"pre-open\" | \"open\" | \"closed\";\n\nfunction toMinutes(hhmm: string): number {\n  const [h, m] = hhmm.split(\":\").map(Number);\n  return (h || 0) * 60 + (m || 0);\n}\n\nfunction pad(n: number): string {\n  return n < 10 ? \"0\" + n : String(n);\n}\n\ninterface LocalParts {\n  y: number;\n  m: number;\n  d: number;\n  day: number;\n  minute: number;\n}\n\nexport class MarketClock {\n  private readonly regOpen: number;\n  private readonly regClose: number;\n  private readonly preOpen: number | null;\n  private readonly preClose: number | null;\n\n  constructor(public readonly spec: ExchangeSpec) {\n    this.regOpen = toMinutes(spec.regular.open);\n    this.regClose = toMinutes(spec.regular.close);\n    this.preOpen = spec.preOpen ? toMinutes(spec.preOpen.open) : null;\n    this.preClose = spec.preOpen ? toMinutes(spec.preOpen.close) : null;\n  }\n\n  /** Exchange-local calendar parts for an instant. */\n  private parts(date: Date): LocalParts {\n    return localParts(this.spec, date);\n  }\n\n  /** UTC epoch millis for an exchange-local calendar day + minute-of-day. */\n  private utcFor(y: number, m: number, d: number, minute: number): number {\n    return utcFromLocal(this.spec, y, m, d, minute);\n  }\n\n  private isoDate(p: { y: number; m: number; d: number }): string {\n    return `${p.y}-${pad(p.m)}-${pad(p.d)}`;\n  }\n\n  isWeekend(at: Date = new Date()): boolean {\n    return this.spec.weekend.includes(this.parts(at).day);\n  }\n\n  isHoliday(at: Date = new Date()): boolean {\n    return this.spec.holidays.includes(this.isoDate(this.parts(at)));\n  }\n\n  /** A day the exchange trades (not weekend, not a holiday). */\n  isTradingDay(at: Date = new Date()): boolean {\n    return !this.isWeekend(at) && !this.isHoliday(at);\n  }\n\n  isOpen(at: Date = new Date()): boolean {\n    if (!this.isTradingDay(at)) return false;\n    const { minute } = this.parts(at);\n    return minute >= this.regOpen && minute < this.regClose;\n  }\n\n  isPreOpen(at: Date = new Date()): boolean {\n    if (this.preOpen === null || this.preClose === null) return false;\n    if (!this.isTradingDay(at)) return false;\n    const { minute } = this.parts(at);\n    return minute >= this.preOpen && minute < this.preClose;\n  }\n\n  status(at: Date = new Date()): MarketStatus {\n    if (this.isOpen(at)) return \"open\";\n    if (this.isPreOpen(at)) return \"pre-open\";\n    return \"closed\";\n  }\n\n  /** The next moment the regular session opens, strictly after `from`. */\n  nextOpen(from: Date = new Date()): Date {\n    const start = this.parts(from);\n    for (let i = 0; i < 500; i++) {\n      const dayMs = Date.UTC(start.y, start.m - 1, start.d) + i * 86400000;\n      const dp = new Date(dayMs);\n      const p = { y: dp.getUTCFullYear(), m: dp.getUTCMonth() + 1, d: dp.getUTCDate() };\n      if (this.spec.weekend.includes(dp.getUTCDay())) continue;\n      if (this.spec.holidays.includes(this.isoDate(p))) continue;\n      const openUtc = this.utcFor(p.y, p.m, p.d, this.regOpen);\n      if (openUtc > from.getTime()) return new Date(openUtc);\n    }\n    throw new Error(\"no trading day found within 500 days\");\n  }\n\n  /** The next moment the regular session closes, strictly after `from`. */\n  nextClose(from: Date = new Date()): Date {\n    const start = this.parts(from);\n    for (let i = 0; i < 500; i++) {\n      const dayMs = Date.UTC(start.y, start.m - 1, start.d) + i * 86400000;\n      const dp = new Date(dayMs);\n      const p = { y: dp.getUTCFullYear(), m: dp.getUTCMonth() + 1, d: dp.getUTCDate() };\n      if (this.spec.weekend.includes(dp.getUTCDay())) continue;\n      if (this.spec.holidays.includes(this.isoDate(p))) continue;\n      const closeUtc = this.utcFor(p.y, p.m, p.d, this.regClose);\n      if (closeUtc > from.getTime()) return new Date(closeUtc);\n    }\n    throw new Error(\"no trading day found within 500 days\");\n  }\n\n  /** Milliseconds until the session closes, or 0 if not currently open. */\n  msToClose(at: Date = new Date()): number {\n    if (!this.isOpen(at)) return 0;\n    return this.nextClose(at).getTime() - at.getTime();\n  }\n\n  /** Milliseconds until the next open, or 0 if already open. */\n  msToOpen(at: Date = new Date()): number {\n    if (this.isOpen(at)) return 0;\n    return this.nextOpen(at).getTime() - at.getTime();\n  }\n\n  /* ---- 1.1.0: segments · countdowns · half-days · multi-session ---- */\n\n  /** Is `at` an early-close / half-day trading session? @since 1.1.0 */\n  isHalfDay(at: Date = new Date()): boolean {\n    return isHalfDay(this.spec, at);\n  }\n\n  /** The distinct segment at `at`: pre-open · regular · post · closed. @since 1.1.0 */\n  currentSegment(at: Date = new Date()): Segment {\n    return currentSegment(this.spec, at);\n  }\n\n  /** The next segment boundary strictly after `at`. @since 1.1.0 */\n  nextSegmentChange(at: Date = new Date()): SegmentChange {\n    return nextSegmentChange(this.spec, at);\n  }\n\n  /** Milliseconds until the next regular open (always > 0). @since 1.1.0 */\n  timeUntilOpen(now: Date = new Date()): number {\n    return timeUntilOpen(this.spec, now);\n  }\n\n  /** Milliseconds until the next regular close (early on a half-day). @since 1.1.0 */\n  timeUntilClose(now: Date = new Date()): number {\n    return timeUntilClose(this.spec, now);\n  }\n\n  /** The next `n` trading sessions at/after `now` (skips weekends/holidays). @since 1.1.0 */\n  nextSessions(now: Date = new Date(), n = 1): SessionWindow[] {\n    return nextSessions(this.spec, now, n);\n  }\n\n  /** All trading sessions whose open falls within `[a, b)`. @since 1.1.0 */\n  sessionsBetween(a: Date, b: Date): SessionWindow[] {\n    return sessionsBetween(this.spec, a, b);\n  }\n}\n\nexport function createClock(spec: ExchangeSpec): MarketClock {\n  return new MarketClock(spec);\n}\n\n/**\n * NSE trading holidays. Nationally-fixed days are reliable; the rest follow the\n * annual NSE circular and may shift year to year — verify and extend as needed\n * (spread via `new MarketClock({ ...NSE, holidays: [...NSE.holidays, ...] })`).\n */\nconst NSE_HOLIDAYS: string[] = [\n  // 2025\n  \"2025-02-26\", \"2025-03-14\", \"2025-03-31\", \"2025-04-10\", \"2025-04-14\",\n  \"2025-04-18\", \"2025-05-01\", \"2025-08-15\", \"2025-08-27\", \"2025-10-02\",\n  \"2025-10-21\", \"2025-10-22\", \"2025-11-05\", \"2025-12-25\",\n  // 2026 (nationally-fixed observances; confirm exchange circular for the rest)\n  \"2026-01-26\", \"2026-03-04\", \"2026-04-01\", \"2026-05-01\", \"2026-10-02\",\n  \"2026-11-09\", \"2026-12-25\",\n];\n\n/** National Stock Exchange of India. Pre-open 09:00–09:15, regular 09:15–15:30 IST. */\nexport const NSE: ExchangeSpec = {\n  name: \"NSE\",\n  offsetMinutes: 330,\n  preOpen: { open: \"09:00\", close: \"09:15\" },\n  regular: { open: \"09:15\", close: \"15:30\" },\n  weekend: [0, 6],\n  holidays: NSE_HOLIDAYS,\n};\n\n/** Bombay Stock Exchange — same session timings and holiday calendar as NSE. */\nexport const BSE: ExchangeSpec = {\n  ...NSE,\n  name: \"BSE\",\n};\n\n/* --------------------------------------------------------------------------\n * 1.1.0 — additive public API: presets + session/segment functions & types.\n * ------------------------------------------------------------------------ */\n\nimport { NYSE, NASDAQ, LSE, TSE, HKEX, SGX, NEPSE } from \"./presets\";\n\nexport { NYSE, NASDAQ, LSE, TSE, HKEX, SGX, NEPSE, withHolidays } from \"./presets\";\n\nexport {\n  currentSegment,\n  nextSegmentChange,\n  nextOpenAt,\n  nextCloseAt,\n  timeUntilOpen,\n  timeUntilClose,\n  nextSessions,\n  sessionsBetween,\n  isHalfDay,\n  isHoliday,\n  isTradingDay,\n  type Segment,\n  type SegmentChange,\n  type SessionWindow,\n} from \"./sessions\";\n\n/** All built-in exchange presets, keyed by name. @since 1.1.0 */\nexport const PRESETS = {\n  NSE,\n  BSE,\n  NYSE,\n  NASDAQ,\n  LSE,\n  TSE,\n  HKEX,\n  SGX,\n  NEPSE,\n} as const;\n\n/** Union of built-in preset keys. @since 1.1.0 */\nexport type PresetName = keyof typeof PRESETS;\n"]}