UNPKG

@empellio/business-hours

Version:

A lightweight and accurate TypeScript library for handling business opening hours. Supports multiple daily time slots, holidays, exceptions, overnight openings, and timezone-aware calculations.

1 lines 27.3 kB
{"version":3,"sources":["../src/helpers/parseHHMM.ts","../src/helpers/mergeSlots.ts","../src/core/normalize.ts","../src/core/tz.ts","../src/core/compute.ts","../src/core/format.ts","../src/index.ts"],"names":["DateTime","Interval"],"mappings":"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","file":"index.cjs","sourcesContent":["export function isHHMM(value: string): boolean {\n return /^\\d{2}:\\d{2}$/.test(value)\n}\n\nexport function parseHHMM(value: string): { hours: number; minutes: number } {\n if (!isHHMM(value)) throw new Error(`Invalid HH:MM: ${value}`)\n const [h, m] = value.split(':').map(Number)\n if (h < 0 || h > 23 || m < 0 || m > 59) {\n throw new Error(`Invalid time components: ${value}`)\n }\n return { hours: h, minutes: m }\n}\n\n","import type { SlotInput } from '../core/types'\nimport { isHHMM, parseHHMM } from './parseHHMM'\n\ntype Slot = { open: string; close: string }\n\nexport function validateAndSortDay(slots: SlotInput[], strict: boolean): SlotInput[] {\n const valid: SlotInput[] = []\n for (const s of slots) {\n if (!isHHMM(s.open) || !isHHMM(s.close)) {\n if (strict) throw new Error(`Invalid HH:MM in slot ${s.open}-${s.close}`)\n else continue\n }\n valid.push({ open: s.open, close: s.close })\n }\n\n valid.sort((a, b) => (a.open < b.open ? -1 : a.open > b.open ? 1 : 0))\n\n // Merge overlapping or touching slots within the same day (ignoring overnight)\n const merged: SlotInput[] = []\n for (const s of valid) {\n const last = merged[merged.length - 1]\n if (!last) {\n merged.push(s)\n continue\n }\n if (s.open <= last.close) {\n // overlap or touch\n if (s.close > last.close) last.close = s.close as any\n } else {\n merged.push({ ...s })\n }\n }\n\n return merged\n}\n\nexport function splitOvernight(slots: SlotInput[]): {\n sameDay: SlotInput[]\n overnight: SlotInput[]\n} {\n const sameDay: SlotInput[] = []\n const overnight: SlotInput[] = []\n for (const s of slots) {\n if (s.open <= s.close) sameDay.push(s)\n else overnight.push(s)\n }\n return { sameDay, overnight }\n}\n\nexport function addMinutesToHHMM(hhmm: string, minutesToAdd: number): string {\n const { hours, minutes } = parseHHMM(hhmm)\n const total = hours * 60 + minutes + minutesToAdd\n const norm = ((total % (24 * 60)) + 24 * 60) % (24 * 60)\n const h = Math.floor(norm / 60)\n const m = norm % 60\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`\n}\n\n","import { DateTime } from 'luxon'\nimport type {\n Config,\n DaySpec,\n Exception,\n Holiday,\n SlotInput,\n WeekdayKey,\n} from './types'\nimport { validateAndSortDay, splitOvernight } from '../helpers/mergeSlots'\n\nconst WEEK_KEYS: WeekdayKey[] = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']\n\nexport type NormalizedConfig = Required<Config>\n\nexport function normalizeConfig(input: Config): NormalizedConfig {\n const strict = Boolean(input.strictValidation)\n const locale = input.locale ?? 'en-US'\n const firstDayOfWeek = input.firstDayOfWeek ?? 'mon'\n const holidays = input.holidays ?? []\n const exceptions = input.exceptions ?? []\n\n const week: Record<WeekdayKey, DaySpec> = { ...input.week } as any\n for (const k of WEEK_KEYS) {\n if (!(k in week)) {\n if (strict) throw new Error(`Missing weekday: ${k}`)\n week[k] = 'closed'\n }\n const v = week[k]\n if (v !== 'closed') {\n week[k] = validateAndSortDay(v, strict)\n }\n }\n\n return {\n timezone: input.timezone,\n week: week as Record<WeekdayKey, DaySpec>,\n holidays,\n exceptions,\n locale,\n firstDayOfWeek,\n strictValidation: strict,\n }\n}\n\nexport function dayKeyFromLuxon(dt: DateTime): WeekdayKey {\n // Luxon: Monday = 1 ... Sunday = 7\n const map: Record<number, WeekdayKey> = {\n 1: 'mon',\n 2: 'tue',\n 3: 'wed',\n 4: 'thu',\n 5: 'fri',\n 6: 'sat',\n 7: 'sun',\n }\n return map[dt.weekday]\n}\n\nexport function toJSON(config: Config): Config {\n return JSON.parse(JSON.stringify(config))\n}\n\nexport function fromJSON(configLike: any): Config {\n return configLike as Config\n}\n\nexport function resolveDaySpecForDate(\n dateISO: string,\n cfg: NormalizedConfig,\n): DaySpec {\n // exceptions override holidays\n const ex = cfg.exceptions?.find((e) => e.date === dateISO)\n if (ex) return ex.closed ? 'closed' : ex.slots ?? 'closed'\n\n const hol = cfg.holidays?.find((h) => h.date === dateISO)\n if (hol) return hol.closed ? 'closed' : hol.slots ?? 'closed'\n\n // fallback to week\n const dt = DateTime.fromISO(dateISO, { zone: cfg.timezone })\n const key = dayKeyFromLuxon(dt)\n return cfg.week[key]\n}\n\nexport function expandDaySlotsForDate(\n dateISO: string,\n cfg: NormalizedConfig,\n): SlotInput[] {\n const spec = resolveDaySpecForDate(dateISO, cfg)\n if (spec === 'closed') return []\n const { sameDay, overnight } = splitOvernight(spec)\n\n // Overnight: split into end-of-day and next-day ranges in HH:MM space\n const expanded: SlotInput[] = [...sameDay]\n for (const s of overnight) {\n // part 1: dateISO from s.open to 24:00 -> represent as 23:59 for inclusivity\n expanded.push({ open: s.open, close: '23:59' as any })\n // part 2 handled on next date when computing actual Date ranges\n }\n return expanded\n}\n\n","import { DateTime, Interval } from 'luxon'\n\nimport type { DateLike } from './types'\n\nexport function dtFrom(date: DateLike | undefined, zone: string): DateTime {\n if (date === undefined) return DateTime.now().setZone(zone)\n if (date instanceof Date) return DateTime.fromJSDate(date).setZone(zone)\n // ISO-like strings interpreted in the given zone\n const parsed = DateTime.fromISO(date, { setZone: true })\n return parsed.isValid ? parsed.setZone(zone) : DateTime.invalid('Invalid date')\n}\n\nexport function toDate(dt: DateTime): Date {\n return dt.toJSDate()\n}\n\nexport function createDayInterval(dt: DateTime): Interval {\n const start = dt.startOf('day')\n const end = dt.endOf('day')\n return Interval.fromDateTimes(start, end)\n}\n\nexport function normalizeISODate(dateISO: string, zone: string): string {\n // Ensures YYYY-MM-DD for given zone's calendar day\n const dt = DateTime.fromISO(dateISO, { zone })\n return dt.toISODate()!\n}\n\n","import { DateTime, Interval } from 'luxon'\nimport type {\n BusinessHours,\n CloseAt,\n Config,\n DateLike,\n OpenCloseWindow,\n SlotInput,\n WeekdayKey,\n} from './types'\nimport { normalizeConfig, resolveDaySpecForDate } from './normalize'\nimport { dtFrom, toDate } from './tz'\n\ntype SlotRange = { open: DateTime; close: DateTime }\n\nexport function createBusinessHours(config: Config): BusinessHours {\n const cfg = normalizeConfig(config)\n const cache = new Map<string, Array<{ open: Date; close: Date }>>()\n const MAX_CACHE_DAYS = 14\n\n function slotsOn(date: DateLike): Array<{ open: Date; close: Date }> {\n const dt = dtFrom(date as any, cfg.timezone)\n const startOfDay = dt.startOf('day')\n const dateISO = startOfDay.toISODate()!\n const cached = cache.get(dateISO)\n if (cached) return cached\n const spec = resolveDaySpecForDate(dateISO, cfg)\n const ranges: SlotRange[] = []\n\n if (spec !== 'closed') {\n for (const s of spec) {\n if (s.open <= s.close) {\n // same-day\n ranges.push(rangeFor(startOfDay, s))\n } else {\n // overnight: split\n ranges.push(rangeFor(startOfDay, { open: s.open, close: '23:59' as any }))\n // note: next-day portion will be added when computing that day's slots via previous-day check below\n }\n }\n }\n\n // Include previous day's overnight spill into current day\n const prevDay = startOfDay.minus({ days: 1 }).startOf('day')\n const prevISO = prevDay.toISODate()!\n const prevSpec = resolveDaySpecForDate(prevISO, cfg)\n if (prevSpec !== 'closed') {\n for (const s of prevSpec) {\n if (s.open > s.close) {\n // spill from 00:00 to s.close on current date\n ranges.push(rangeFor(startOfDay, { open: '00:00' as any, close: s.close }))\n }\n }\n }\n\n const result = ranges\n .map((r) => ({ open: r.open.toJSDate(), close: r.close.toJSDate() }))\n .sort((a, b) => a.open.getTime() - b.open.getTime())\n\n // simple LRU behavior\n cache.set(dateISO, result)\n if (cache.size > MAX_CACHE_DAYS) {\n const firstKey = cache.keys().next().value as string | undefined\n if (firstKey) cache.delete(firstKey)\n }\n return result\n }\n\n function currentSlot(at?: DateLike): { open: Date; close: Date } | null {\n const now = dtFrom(at, cfg.timezone)\n const todays = slotsOn(now.toJSDate())\n for (const s of todays) {\n const o = DateTime.fromJSDate(s.open)\n const c = DateTime.fromJSDate(s.close)\n if (Interval.fromDateTimes(o, c).contains(now)) return s\n }\n return null\n }\n\n function isOpenAt(date: DateLike): boolean {\n return currentSlot(date) !== null\n }\n\n function isOpenNow(): boolean {\n return isOpenAt(dtFrom(undefined, cfg.timezone).toJSDate())\n }\n\n function nextOpen(from?: DateLike): OpenCloseWindow | null {\n const start = dtFrom(from, cfg.timezone)\n // check today first\n const todaySlots = slotsOn(start.toJSDate())\n for (const slot of todaySlots) {\n const o = DateTime.fromJSDate(slot.open)\n const c = DateTime.fromJSDate(slot.close)\n if (c <= start) continue\n if (start < o) return { start: o.toJSDate(), end: c.toJSDate() }\n if (Interval.fromDateTimes(o, c).contains(start)) return { start: start.toJSDate(), end: c.toJSDate() }\n }\n\n // look ahead up to 14 days (cache window)\n for (let i = 1; i <= 14; i++) {\n const day = start.plus({ days: i }).startOf('day')\n const slots = slotsOn(day.toJSDate())\n if (slots.length > 0) {\n return { start: slots[0].open, end: slots[0].close }\n }\n }\n return null\n }\n\n function nextClose(from?: DateLike): CloseAt | null {\n const start = dtFrom(from, cfg.timezone)\n const slot = currentSlot(start.toJSDate())\n if (slot) return { at: slot.close }\n\n const upcoming = nextOpen(start.toJSDate())\n if (!upcoming) return null\n return { at: upcoming.end }\n }\n\n function timeUntilClose(at?: DateLike): { ms: number; minutes: number } | null {\n const start = dtFrom(at, cfg.timezone)\n const slot = currentSlot(start.toJSDate())\n if (!slot) return null\n const diff = DateTime.fromJSDate(slot.close).diff(start).as('milliseconds')\n if (diff <= 0) return null\n return { ms: diff, minutes: Math.ceil(diff / 60000) }\n }\n\n function timeUntilOpen(at?: DateLike): { ms: number; minutes: number } | null {\n const start = dtFrom(at, cfg.timezone)\n if (currentSlot(start.toJSDate())) return { ms: 0, minutes: 0 }\n const upcoming = nextOpen(start.toJSDate())\n if (!upcoming) return null\n const diff = DateTime.fromJSDate(upcoming.start).diff(start).as('milliseconds')\n return { ms: diff, minutes: Math.ceil(diff / 60000) }\n }\n\n function todaysSlots(at?: DateLike): Array<{ open: Date; close: Date }> {\n const dt = dtFrom(at, cfg.timezone)\n return slotsOn(dt.toJSDate())\n }\n\n function weeklySummary(options?: { join?: boolean }): string[] | string {\n const lines: string[] = []\n const start = DateTime.now().setZone(cfg.timezone).startOf('week')\n for (let i = 0; i < 7; i++) {\n const day = start.plus({ days: i })\n const slots = slotsOn(day.toJSDate())\n if (slots.length === 0) {\n lines.push(`${day.toFormat('EEE')} closed`)\n } else {\n const parts = slots.map((s) => {\n const o = DateTime.fromJSDate(s.open).setZone(cfg.timezone)\n const c = DateTime.fromJSDate(s.close).setZone(cfg.timezone)\n return `${o.toFormat('HH:mm')}–${c.toFormat('HH:mm')}`\n })\n lines.push(`${day.toFormat('EEE')} ${parts.join(', ')}`)\n }\n }\n return options?.join ? lines.join('\\n') : lines\n }\n\n function listUpcomingSlots(daysAhead = 14): Array<{ date: string; slots: Array<{ open: Date; close: Date }> }> {\n const now = DateTime.now().setZone(cfg.timezone).startOf('day')\n const out: Array<{ date: string; slots: Array<{ open: Date; close: Date }> }> = []\n for (let i = 0; i <= daysAhead; i++) {\n const day = now.plus({ days: i })\n const dateISO = day.toISODate()!\n const slots = slotsOn(day.toJSDate())\n out.push({ date: dateISO, slots })\n }\n return out\n }\n\n function withOverrides(overrides: Partial<Config>): BusinessHours {\n return createBusinessHours({ ...cfg, ...overrides })\n }\n\n function toJSONLocal(): Config {\n return {\n timezone: cfg.timezone,\n week: cfg.week,\n holidays: cfg.holidays,\n exceptions: cfg.exceptions,\n locale: cfg.locale,\n firstDayOfWeek: cfg.firstDayOfWeek,\n strictValidation: cfg.strictValidation,\n }\n }\n\n return {\n isOpenNow,\n isOpenAt,\n nextOpen,\n nextClose,\n currentSlot,\n timeUntilClose,\n timeUntilOpen,\n todaysSlots,\n slotsOn,\n weeklySummary,\n listUpcomingSlots,\n withOverrides,\n toJSON: toJSONLocal,\n }\n}\n\nfunction rangeFor(dayStart: DateTime, slot: SlotInput): { open: DateTime; close: DateTime } {\n const [oh, om] = slot.open.split(':').map(Number)\n const [ch, cm] = slot.close.split(':').map(Number)\n const open = dayStart.set({ hour: oh, minute: om, second: 0, millisecond: 0 })\n const close = dayStart.set({ hour: ch, minute: cm, second: 0, millisecond: 0 })\n return { open, close }\n}\n\n","import { DateTime } from 'luxon'\nimport type { WeekdayNumbers } from 'luxon'\nimport type { WeekdayKey } from './types'\n\nexport function formatSlot(\n slot: { open: Date; close: Date },\n options?: { locale?: string; timezone?: string },\n): string {\n const zone = options?.timezone\n const locale = options?.locale ?? 'en-US'\n const o = DateTime.fromJSDate(slot.open).setZone(zone).setLocale(locale)\n const c = DateTime.fromJSDate(slot.close).setZone(zone).setLocale(locale)\n return `${o.toFormat('HH:mm')}–${c.toFormat('HH:mm')}`\n}\n\nexport function formatDayName(\n weekday: WeekdayKey,\n options?: { locale?: string },\n): string {\n const locale = options?.locale ?? 'en-US'\n const map: Record<WeekdayKey, WeekdayNumbers> = {\n mon: 1,\n tue: 2,\n wed: 3,\n thu: 4,\n fri: 5,\n sat: 6,\n sun: 7,\n }\n const dt = DateTime.now().set({ weekday: map[weekday] }).setLocale(locale)\n return dt.toFormat('EEE')\n}\n\n","export * from './core/types'\nexport { createBusinessHours } from './core/compute'\nexport { formatSlot, formatDayName } from './core/format'\nexport { toJSON } from './core/normalize'\n\nimport type { BusinessHours, Config } from './core/types'\nimport { createBusinessHours as _create } from './core/compute'\n\nexport function fromJSON(configLike: Config): BusinessHours {\n return _create(configLike)\n}\n\n"]}