{"version":3,"sources":["../src/croniq.ts"],"names":["MONTH_NAMES","DOW_NAMES","DOW_LABELS","MONTH_LABELS","MACROS","LIMIT","resolveName","token","spec","lower","idx","parseField","raw","normalize","v","values","out","part","rangePart","stepPart","step","lo","hi","a","b","bound","localAccessor","d","utcAccessor","Cron","expression","options","trimmed","parts","secRaw","minRaw","hourRaw","domRaw","monthRaw","dowRaw","sec","min","hour","dom","month","dow","dm","dw","date","from","count","cursor","probe","dir","secMax","unit","t","iter","two","n","time","everyMin","everyHour","listText","dowText","m","capitalize","sorted","i","s","parse","isValid"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * croniq — a tiny, zero-dependency cron expression toolkit.\n *\n * Parse standard 5-field (and 6-field \"with seconds\") cron expressions, then\n * compute the next/previous run times and a human-readable description. The\n * time arithmetic uses field-jumping (not minute-by-minute scanning), so even\n * sparse schedules resolve quickly.\n */\n\nexport interface CronOptions {\n  /** Interpret and emit times in UTC instead of local time. Default: `false`. */\n  utc?: boolean;\n}\n\nconst MONTH_NAMES = [\"jan\", \"feb\", \"mar\", \"apr\", \"may\", \"jun\", \"jul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"];\nconst DOW_NAMES = [\"sun\", \"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\"];\nconst DOW_LABELS = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\nconst MONTH_LABELS = [\n  \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n  \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n];\n\nconst MACROS: Record<string, string> = {\n  \"@yearly\": \"0 0 1 1 *\",\n  \"@annually\": \"0 0 1 1 *\",\n  \"@monthly\": \"0 0 1 * *\",\n  \"@weekly\": \"0 0 * * 0\",\n  \"@daily\": \"0 0 * * *\",\n  \"@midnight\": \"0 0 * * *\",\n  \"@hourly\": \"0 * * * *\",\n};\n\ninterface FieldSpec {\n  name: string;\n  min: number;\n  max: number; // value used to generate \"*\"\n  accept: number; // highest accepted literal (dow accepts 7)\n  names?: string[];\n}\n\nconst LIMIT = 500_000; // safety bound for field-jump loops\n\nfunction resolveName(token: string, spec: FieldSpec): number {\n  const lower = token.toLowerCase();\n  if (spec.names) {\n    const idx = spec.names.indexOf(lower);\n    if (idx !== -1) return idx + (spec.name === \"month\" ? 1 : 0);\n  }\n  if (!/^\\d+$/.test(token)) {\n    throw new SyntaxError(`croniq: invalid value \"${token}\" in ${spec.name} field`);\n  }\n  return Number(token);\n}\n\nfunction parseField(raw: string, spec: FieldSpec): { values: number[]; restricted: boolean } {\n  const normalize = (v: number): number => (spec.name === \"dayOfWeek\" && v === 7 ? 0 : v);\n\n  if (raw === \"*\" || raw === \"?\") {\n    const values: number[] = [];\n    for (let v = spec.min; v <= spec.max; v++) values.push(v);\n    return { values, restricted: false };\n  }\n\n  const out = new Set<number>();\n  for (const part of raw.split(\",\")) {\n    const [rangePart, stepPart] = part.split(\"/\") as [string, string | undefined];\n    const step = stepPart === undefined ? 1 : Number(stepPart);\n    if (!Number.isInteger(step) || step < 1) {\n      throw new SyntaxError(`croniq: invalid step \"${stepPart}\" in ${spec.name} field`);\n    }\n\n    let lo: number;\n    let hi: number;\n    if (rangePart === \"*\") {\n      lo = spec.min;\n      hi = spec.max;\n    } else if (rangePart.includes(\"-\")) {\n      const [a, b] = rangePart.split(\"-\") as [string, string];\n      lo = resolveName(a, spec);\n      hi = resolveName(b, spec);\n    } else {\n      lo = resolveName(rangePart, spec);\n      hi = stepPart === undefined ? lo : spec.max;\n    }\n\n    for (const bound of [lo, hi]) {\n      if (bound < spec.min || bound > spec.accept) {\n        throw new RangeError(\n          `croniq: value ${bound} out of range (${spec.min}-${spec.accept}) in ${spec.name} field`,\n        );\n      }\n    }\n    if (lo > hi) {\n      throw new RangeError(`croniq: range start ${lo} > end ${hi} in ${spec.name} field`);\n    }\n    for (let v = lo; v <= hi; v += step) out.add(normalize(v));\n  }\n\n  return { values: [...out].sort((a, b) => a - b), restricted: true };\n}\n\ninterface Accessor {\n  year(d: Date): number;\n  month0(d: Date): number; // 0-based\n  date(d: Date): number;\n  hours(d: Date): number;\n  minutes(d: Date): number;\n  seconds(d: Date): number;\n  dow(d: Date): number;\n  setMonth0(d: Date, v: number): void;\n  setDate(d: Date, v: number): void;\n  setHours(d: Date, v: number): void;\n  setMinutes(d: Date, v: number): void;\n  setSeconds(d: Date, v: number): void;\n}\n\nconst localAccessor: Accessor = {\n  year: (d) => d.getFullYear(),\n  month0: (d) => d.getMonth(),\n  date: (d) => d.getDate(),\n  hours: (d) => d.getHours(),\n  minutes: (d) => d.getMinutes(),\n  seconds: (d) => d.getSeconds(),\n  dow: (d) => d.getDay(),\n  setMonth0: (d, v) => void d.setMonth(v),\n  setDate: (d, v) => void d.setDate(v),\n  setHours: (d, v) => void d.setHours(v),\n  setMinutes: (d, v) => void d.setMinutes(v),\n  setSeconds: (d, v) => void d.setSeconds(v),\n};\n\nconst utcAccessor: Accessor = {\n  year: (d) => d.getUTCFullYear(),\n  month0: (d) => d.getUTCMonth(),\n  date: (d) => d.getUTCDate(),\n  hours: (d) => d.getUTCHours(),\n  minutes: (d) => d.getUTCMinutes(),\n  seconds: (d) => d.getUTCSeconds(),\n  dow: (d) => d.getUTCDay(),\n  setMonth0: (d, v) => void d.setUTCMonth(v),\n  setDate: (d, v) => void d.setUTCDate(v),\n  setHours: (d, v) => void d.setUTCHours(v),\n  setMinutes: (d, v) => void d.setUTCMinutes(v),\n  setSeconds: (d, v) => void d.setUTCSeconds(v),\n};\n\n/** A parsed cron expression. Create one with {@link parse} (or `new Cron(...)`). */\nexport class Cron {\n  readonly expression: string;\n  readonly hasSeconds: boolean;\n  readonly seconds: number[];\n  readonly minutes: number[];\n  readonly hours: number[];\n  readonly daysOfMonth: number[];\n  readonly months: number[];\n  readonly daysOfWeek: number[];\n  /** Raw field tokens (after macro expansion), for description. */\n  readonly raw: { seconds?: string; minute: string; hour: string; dayOfMonth: string; month: string; dayOfWeek: string };\n  private readonly domRestricted: boolean;\n  private readonly dowRestricted: boolean;\n  private readonly utc: boolean;\n\n  constructor(expression: string, options: CronOptions = {}) {\n    this.utc = options.utc ?? false;\n    const trimmed = expression.trim();\n    const expanded = MACROS[trimmed.toLowerCase()] ?? trimmed;\n    const parts = expanded.split(/\\s+/);\n\n    if (parts.length !== 5 && parts.length !== 6) {\n      throw new SyntaxError(\n        `croniq: expected 5 or 6 fields, got ${parts.length} in \"${expression}\"`,\n      );\n    }\n\n    this.hasSeconds = parts.length === 6;\n    const [secRaw, minRaw, hourRaw, domRaw, monthRaw, dowRaw] = this.hasSeconds\n      ? (parts as [string, string, string, string, string, string])\n      : ([\"0\", ...parts] as unknown as [string, string, string, string, string, string]);\n\n    const sec = parseField(secRaw, { name: \"second\", min: 0, max: 59, accept: 59 });\n    const min = parseField(minRaw, { name: \"minute\", min: 0, max: 59, accept: 59 });\n    const hour = parseField(hourRaw, { name: \"hour\", min: 0, max: 23, accept: 23 });\n    const dom = parseField(domRaw, { name: \"dayOfMonth\", min: 1, max: 31, accept: 31 });\n    const month = parseField(monthRaw, { name: \"month\", min: 1, max: 12, accept: 12, names: MONTH_NAMES });\n    const dow = parseField(dowRaw, { name: \"dayOfWeek\", min: 0, max: 6, accept: 7, names: DOW_NAMES });\n\n    this.seconds = sec.values;\n    this.minutes = min.values;\n    this.hours = hour.values;\n    this.daysOfMonth = dom.values;\n    this.months = month.values;\n    this.daysOfWeek = dow.values;\n    this.domRestricted = dom.restricted;\n    this.dowRestricted = dow.restricted;\n    this.expression = trimmed;\n    this.raw = {\n      ...(this.hasSeconds ? { seconds: secRaw } : {}),\n      minute: minRaw,\n      hour: hourRaw,\n      dayOfMonth: domRaw,\n      month: monthRaw,\n      dayOfWeek: dowRaw,\n    };\n  }\n\n  private acc(): Accessor {\n    return this.utc ? utcAccessor : localAccessor;\n  }\n\n  private dayMatches(d: Date, a: Accessor): boolean {\n    const dm = this.daysOfMonth.includes(a.date(d));\n    const dw = this.daysOfWeek.includes(a.dow(d));\n    if (this.domRestricted && this.dowRestricted) return dm || dw;\n    if (this.domRestricted) return dm;\n    if (this.dowRestricted) return dw;\n    return true;\n  }\n\n  /** Does `date` satisfy this expression (to minute, or second, precision)? */\n  matches(date: Date = new Date()): boolean {\n    const a = this.acc();\n    if (!this.months.includes(a.month0(date) + 1)) return false;\n    if (!this.dayMatches(date, a)) return false;\n    if (!this.hours.includes(a.hours(date))) return false;\n    if (!this.minutes.includes(a.minutes(date))) return false;\n    if (this.hasSeconds) return this.seconds.includes(a.seconds(date));\n    return a.seconds(date) === 0;\n  }\n\n  /** The next run time strictly after `from` (default: now). Throws if none within ~bounds. */\n  next(from: Date = new Date()): Date {\n    return this.step(from, 1);\n  }\n\n  /** The previous run time strictly before `from` (default: now). */\n  prev(from: Date = new Date()): Date {\n    return this.step(from, -1);\n  }\n\n  /** The next `count` run times after `from`. */\n  nextN(count: number, from: Date = new Date()): Date[] {\n    const out: Date[] = [];\n    let cursor = from;\n    for (let i = 0; i < count; i++) {\n      cursor = this.next(cursor);\n      out.push(cursor);\n    }\n    return out;\n  }\n\n  /** The previous `count` run times before `from`. */\n  prevN(count: number, from: Date = new Date()): Date[] {\n    const out: Date[] = [];\n    let cursor = from;\n    for (let i = 0; i < count; i++) {\n      cursor = this.prev(cursor);\n      out.push(cursor);\n    }\n    return out;\n  }\n\n  private daysInMonth(d: Date, a: Accessor): number {\n    // Day 0 of next month = last day of this month.\n    const probe = new Date(d.getTime());\n    a.setDate(probe, 1);\n    a.setMonth0(probe, a.month0(probe) + 1);\n    a.setDate(probe, 0);\n    return a.date(probe);\n  }\n\n  private step(from: Date, dir: 1 | -1): Date {\n    const a = this.acc();\n    const secMax = this.hasSeconds ? 59 : 0;\n    const unit = this.hasSeconds ? 1000 : 60_000;\n\n    // Start strictly past `from`, snapped to the resolution boundary.\n    let t = Math.floor(from.getTime() / unit) * unit + dir * unit;\n    const d = new Date(t);\n    if (!this.hasSeconds) a.setSeconds(d, 0);\n\n    for (let iter = 0; iter < LIMIT; iter++) {\n      if (!this.months.includes(a.month0(d) + 1)) {\n        if (dir === 1) {\n          a.setDate(d, 1);\n          a.setHours(d, 0);\n          a.setMinutes(d, 0);\n          a.setSeconds(d, 0);\n          a.setMonth0(d, a.month0(d) + 1);\n        } else {\n          a.setDate(d, 1);\n          a.setMonth0(d, a.month0(d) - 1);\n          a.setDate(d, this.daysInMonth(d, a));\n          a.setHours(d, 23);\n          a.setMinutes(d, 59);\n          a.setSeconds(d, secMax);\n        }\n        continue;\n      }\n      if (!this.dayMatches(d, a)) {\n        if (dir === 1) {\n          a.setHours(d, 0);\n          a.setMinutes(d, 0);\n          a.setSeconds(d, 0);\n          a.setDate(d, a.date(d) + 1);\n        } else {\n          a.setHours(d, 23);\n          a.setMinutes(d, 59);\n          a.setSeconds(d, secMax);\n          a.setDate(d, a.date(d) - 1);\n        }\n        continue;\n      }\n      if (!this.hours.includes(a.hours(d))) {\n        if (dir === 1) {\n          a.setMinutes(d, 0);\n          a.setSeconds(d, 0);\n          a.setHours(d, a.hours(d) + 1);\n        } else {\n          a.setMinutes(d, 59);\n          a.setSeconds(d, secMax);\n          a.setHours(d, a.hours(d) - 1);\n        }\n        continue;\n      }\n      if (!this.minutes.includes(a.minutes(d))) {\n        if (dir === 1) {\n          a.setSeconds(d, 0);\n          a.setMinutes(d, a.minutes(d) + 1);\n        } else {\n          a.setSeconds(d, secMax);\n          a.setMinutes(d, a.minutes(d) - 1);\n        }\n        continue;\n      }\n      if (this.hasSeconds && !this.seconds.includes(a.seconds(d))) {\n        a.setSeconds(d, a.seconds(d) + dir);\n        continue;\n      }\n      return new Date(d.getTime());\n    }\n    throw new RangeError(`croniq: no matching time found for \"${this.expression}\" within bounds`);\n  }\n\n  /** A human-readable English description, e.g. \"At 09:00, Monday through Friday\". */\n  describe(): string {\n    const a = this.raw;\n    const two = (n: number) => n.toString().padStart(2, \"0\");\n\n    let time: string;\n    const everyMin = a.minute === \"*\";\n    const everyHour = a.hour === \"*\";\n    if (this.hasSeconds && a.seconds === \"*\" && everyMin) {\n      time = \"every second\";\n    } else if (everyMin && everyHour) {\n      time = \"every minute\";\n    } else if (this.minutes.length === 1 && this.hours.length === 1) {\n      time = `at ${two(this.hours[0] as number)}:${two(this.minutes[0] as number)}`;\n    } else if (everyHour && this.minutes.length === 1) {\n      time = `at ${this.minutes[0]} minutes past every hour`;\n    } else if (a.minute.startsWith(\"*/\")) {\n      time = `every ${a.minute.slice(2)} minutes`;\n    } else {\n      time = `at minute ${listText(this.minutes)} past hour ${listText(this.hours)}`;\n    }\n\n    const parts = [time];\n\n    if (this.dowRestricted) {\n      parts.push(dowText(this.daysOfWeek));\n    }\n    if (this.domRestricted) {\n      parts.push(`on day-of-month ${listText(this.daysOfMonth)}`);\n    }\n    if (a.month !== \"*\") {\n      parts.push(`in ${this.months.map((m) => MONTH_LABELS[m - 1]).join(\", \")}`);\n    }\n\n    return capitalize(parts.join(\", \"));\n  }\n}\n\nfunction listText(values: number[]): string {\n  if (values.length === 1) return String(values[0]);\n  if (values.length === 2) return `${values[0]} and ${values[1]}`;\n  return values.slice(0, -1).join(\", \") + \", and \" + values[values.length - 1];\n}\n\nfunction dowText(values: number[]): string {\n  // Detect a contiguous run for nicer \"X through Y\" phrasing.\n  const sorted = [...values].sort((a, b) => a - b);\n  const contiguous = sorted.every((v, i) => i === 0 || v === (sorted[i - 1] as number) + 1);\n  if (contiguous && sorted.length > 2) {\n    return `${DOW_LABELS[sorted[0] as number]} through ${DOW_LABELS[sorted[sorted.length - 1] as number]}`;\n  }\n  return sorted.map((d) => DOW_LABELS[d]).join(\", \");\n}\n\nfunction capitalize(s: string): string {\n  return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\n/**\n * Parse a cron expression into a {@link Cron} you can query.\n *\n * ```ts\n * const cron = parse(\"0 9 * * 1-5\");      // 09:00 on weekdays\n * cron.next();                            // → next weekday 09:00\n * cron.describe();                        // \"At 09:00, Monday through Friday\"\n * ```\n *\n * Supports 5 fields (min hour dom month dow) or 6 (with a leading seconds\n * field), ranges (`1-5`), lists (`1,3,5`), steps (`*​/15`), names (`JAN`,\n * `MON`), `?`, and macros (`@daily`, `@hourly`, …).\n */\nexport function parse(expression: string, options?: CronOptions): Cron {\n  return new Cron(expression, options);\n}\n\n/** Returns `true` if `expression` is a valid cron expression. */\nexport function isValid(expression: string, options?: CronOptions): boolean {\n  try {\n    new Cron(expression, options);\n    return true;\n  } catch {\n    return false;\n  }\n}\n"]}