{"version":3,"sources":["../../src/use-time-ago/format-time-ago.ts"],"sourcesContent":["// mainly from https://github.com/vueuse/vueuse/blob/main/packages/core/useTimeAgo/index.ts\n\nimport { isFunction, isNumber } from '../utils/basic'\n\nexport type TimeAgoFormatter<T = number> = (value: T, isPast: boolean) => string\nexport type TimeAgoUnitNamesDefault = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year'\nexport type TimeAgeFullDateFormatter = (date: Date) => string\nexport type TimeAgoMessagesBuiltIn = {\n  justNow: string\n  past: string | TimeAgoFormatter<string>\n  future: string | TimeAgoFormatter<string>\n  invalid: string\n}\n\nexport type TimeAgoMessages<UnitNames extends string = TimeAgoUnitNamesDefault> = TimeAgoMessagesBuiltIn &\n  Record<UnitNames, string | TimeAgoFormatter<number>>\n\nexport type FormatTimeAgoOptions<UnitNames extends string = TimeAgoUnitNamesDefault> = {\n  /**\n   * Maximum unit (of diff in milliseconds) to display the full date instead of relative\n   *\n   * @defaultValue undefined\n   */\n  max?: UnitNames | number\n  /**\n   * Formatter for full date\n   */\n  fullDateFormatter?: TimeAgeFullDateFormatter\n  /**\n   * Messages for formatting the string\n   */\n  messages?: TimeAgoMessages<UnitNames>\n  /**\n   * Minimum display time unit (default is minute)\n   *\n   * @defaultValue false\n   */\n  showSecond?: boolean\n  /**\n   * Rounding method to apply.\n   *\n   * @defaultValue 'round'\n   */\n  rounding?: 'round' | 'ceil' | 'floor' | number\n  /**\n   * Custom units\n   */\n  units?: TimeAgoUnit<UnitNames>[]\n}\n\nexport type TimeAgoUnit<Unit extends string = TimeAgoUnitNamesDefault> = {\n  max: number\n  value: number\n  name: Unit\n}\n\nconst DEFAULT_UNITS: TimeAgoUnit<TimeAgoUnitNamesDefault>[] = [\n  { max: 60000, value: 1000, name: 'second' },\n  { max: 2760000, value: 60000, name: 'minute' },\n  { max: 72000000, value: 3600000, name: 'hour' },\n  { max: 518400000, value: 86400000, name: 'day' },\n  { max: 2419200000, value: 604800000, name: 'week' },\n  { max: 28512000000, value: 2592000000, name: 'month' },\n  { max: Number.POSITIVE_INFINITY, value: 31536000000, name: 'year' },\n]\n\nexport const DEFAULT_MESSAGES: TimeAgoMessages<TimeAgoUnitNamesDefault> = {\n  justNow: 'just now',\n  past: (n) => (n.match(/\\d/) ? `${n} ago` : n),\n  future: (n) => (n.match(/\\d/) ? `in ${n}` : n),\n  month: (n, past) => (n === 1 ? (past ? 'last month' : 'next month') : `${n} month${n > 1 ? 's' : ''}`),\n  year: (n, past) => (n === 1 ? (past ? 'last year' : 'next year') : `${n} year${n > 1 ? 's' : ''}`),\n  day: (n, past) => (n === 1 ? (past ? 'yesterday' : 'tomorrow') : `${n} day${n > 1 ? 's' : ''}`),\n  week: (n, past) => (n === 1 ? (past ? 'last week' : 'next week') : `${n} week${n > 1 ? 's' : ''}`),\n  hour: (n) => `${n} hour${n > 1 ? 's' : ''}`,\n  minute: (n) => `${n} minute${n > 1 ? 's' : ''}`,\n  second: (n) => `${n} second${n > 1 ? 's' : ''}`,\n  invalid: '',\n}\n\nconst DEFAULT_FORMATTER: TimeAgeFullDateFormatter = (date: Date) => date.toISOString().slice(0, 10)\n\nexport function formatTimeAgo<UnitNames extends string = TimeAgoUnitNamesDefault>(\n  from: Date,\n  options: FormatTimeAgoOptions<UnitNames> = {},\n  now: Date | number = Date.now(),\n): string {\n  const {\n    max,\n    messages = DEFAULT_MESSAGES as TimeAgoMessages<UnitNames>,\n    fullDateFormatter = DEFAULT_FORMATTER,\n    units = DEFAULT_UNITS as TimeAgoUnit<UnitNames>[],\n    showSecond = false,\n    rounding = 'round',\n  } = options\n\n  const roundFn = isNumber(rounding) ? (n: number) => +n.toFixed(rounding) : Math[rounding]\n\n  const diff = +now - +from\n  const absDiff = Math.abs(diff)\n\n  function getValue(diff: number, unit: TimeAgoUnit<UnitNames>) {\n    return roundFn(Math.abs(diff) / unit.value)\n  }\n\n  function format(diff: number, unit: TimeAgoUnit<UnitNames>) {\n    const val = getValue(diff, unit)\n    const past = diff > 0\n\n    const str = applyFormat(unit.name as UnitNames, val, past)\n    return applyFormat(past ? 'past' : 'future', str, past)\n  }\n\n  function applyFormat(name: UnitNames | keyof TimeAgoMessagesBuiltIn, val: number | string, isPast: boolean) {\n    const formatter = messages[name]\n    if (isFunction(formatter)) return formatter(val as never, isPast)\n    return formatter.replace('{0}', val.toString())\n  }\n\n  if (absDiff < 60000 && !showSecond) return messages.justNow\n\n  if (isNumber(max) && absDiff > max) return fullDateFormatter(new Date(from))\n\n  if (typeof max === 'string') {\n    const unitMax = units.find((i) => i.name === max)?.max\n    if (unitMax && absDiff > unitMax) return fullDateFormatter(new Date(from))\n  }\n\n  for (const [idx, unit] of units.entries()) {\n    const val = getValue(diff, unit)\n    if (val <= 0 && units[idx - 1]) return format(diff, units[idx - 1])\n    if (absDiff < unit.max) return format(diff, unit)\n  }\n\n  return messages.invalid\n}\n"],"names":["DEFAULT_MESSAGES","formatTimeAgo","DEFAULT_UNITS","max","value","name","Number","POSITIVE_INFINITY","justNow","past","n","match","future","month","year","day","week","hour","minute","second","invalid","DEFAULT_FORMATTER","date","toISOString","slice","from","options","now","Date","messages","fullDateFormatter","units","showSecond","rounding","roundFn","isNumber","toFixed","Math","diff","absDiff","abs","getValue","unit","format","val","str","applyFormat","isPast","formatter","isFunction","replace","toString","unitMax","find","i","entries","idx"],"mappings":"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"}