{"version":3,"file":"durationutil.cjs","sources":["../../../src/datetime/durationutil.ts"],"sourcesContent":["import { add, Duration, intervalToDuration, Interval, isAfter } from 'date-fns';\n\nconst durationMap: Record<string, string[]> = {\n  years: ['y', 'Y', 'years'],\n  months: ['M', 'months'],\n  weeks: ['w', 'W', 'weeks'],\n  days: ['d', 'D', 'days'],\n  hours: ['h', 'H', 'hours'],\n  minutes: ['m', 'minutes'],\n  seconds: ['s', 'S', 'seconds'],\n} satisfies { [key in keyof Duration]: string[] };\n\n/**\n * intervalToAbbreviatedDurationString converts interval to readable duration string\n *\n * @param interval - interval to convert\n * @param includeSeconds - optional, default true. If false, will not include seconds unless interval is less than 1 minute\n *\n * @public\n */\nexport function intervalToAbbreviatedDurationString(interval: Interval, includeSeconds = true): string {\n  // An edge case that causes the app to crash (e.g. browser's clock behind the rule/alert date)\n  // The code will again return a proper duration when the browser's clock >= rule/alert date\n  if (isAfter(interval.start, interval.end)) {\n    return '';\n  }\n\n  const duration = intervalToDuration(interval);\n  return reverseParseDuration(duration, includeSeconds);\n}\n\nexport function reverseParseDuration(duration: Duration, includeSeconds: boolean): string {\n  return Object.entries(duration).reduce((str, [unit, value]) => {\n    if (value && value !== 0 && !(unit === 'seconds' && !includeSeconds && str)) {\n      const padding = str !== '' ? ' ' : '';\n      return str + `${padding}${value}${durationMap[unit][0]}`;\n    }\n\n    return str;\n  }, '');\n}\n\n/**\n * parseDuration parses duration string into datefns Duration object\n *\n * @param durationString - string to convert. For example '2m', '5h 20s'\n *\n * @public\n */\nexport function parseDuration(durationString: string): Duration {\n  return durationString.split(' ').reduce<Duration>((acc, value) => {\n    const match = value.match(/(\\d+)(.+)/);\n\n    const rawLength = match?.[1];\n    const unit = match?.[2];\n\n    if (!(rawLength && unit)) {\n      return acc;\n    }\n\n    const mapping = Object.entries(durationMap).find(([_, abbreviations]) => abbreviations?.includes(match[2]));\n    const length = parseInt(rawLength, 10);\n\n    return mapping ? { ...acc, [mapping[0]]: length } : acc;\n  }, {});\n}\n\n/**\n * addDurationToDate adds given duration to given date and returns a new Date object\n *\n * @param date - date to add to. Can be either Date object or a number (milliseconds since epoch)\n * @param duration - duration to add. For example '2m', '5h 20s'\n *\n * @public\n */\nexport function addDurationToDate(date: Date | number, duration: Duration): Date {\n  return add(date, duration);\n}\n\n/**\n * durationToMilliseconds convert a duration object to milliseconds\n *\n * @param duration - datefns Duration object\n *\n * @public\n */\nexport function durationToMilliseconds(duration: Duration): number {\n  const now = new Date();\n  return addDurationToDate(now, duration).getTime() - now.getTime();\n}\n\n/**\n * isValidDate returns true if given string can be parsed into valid Date object, false otherwise\n *\n * @param dateString - string representation of a date\n *\n * @public\n */\nexport function isValidDate(dateString: string): boolean {\n  return !isNaN(Date.parse(dateString));\n}\n\n/**\n * isValidDuration returns true if the given string can be parsed into a valid `date-fns` `Duration` object, false otherwise\n *\n * Valid time units are \"y\", \"Y\", \"years\", \"M\", \"months\", \"w\", \"W\", \"weeks\", \"d\", \"D\", \"days\", \"h\", \"H\", \"hours\", \"m\", \"minutes\", \"s\", \"S\", \"seconds\"\n *\n * @see https://date-fns.org/v2.30.0/docs/Duration\n * @param durationString - string representation of a duration\n *\n * @public\n */\nexport function isValidDuration(durationString: string): boolean {\n  for (const value of durationString.trim().split(' ')) {\n    const match = value.match(/(\\d+)(.+)/);\n    if (match === null || match.length !== 3) {\n      return false;\n    }\n\n    const key = Object.entries(durationMap).find(([_, abbreviations]) => abbreviations?.includes(match[2]))?.[0];\n    if (!key) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * isValidGoDuration returns true if the given string can be parsed into a valid Duration object based on\n * Go's time.parseDuration, false otherwise.\n *\n * Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".\n *\n * @see https://pkg.go.dev/time#ParseDuration\n *\n * @param durationString - string representation of a duration\n *\n * @internal\n */\nexport function isValidGoDuration(durationString: string): boolean {\n  const timeUnits = ['h', 'm', 's', 'ms', 'us', 'µs', 'ns'];\n  return validateDurationByUnits(durationString, timeUnits);\n}\n\n/**\n * isValidGrafanaDuration returns `true` if the given string can be parsed into a valid Duration object based on\n * the Grafana SDK's gtime.parseDuration, `false` otherwise.\n *\n * Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\", \"d\", \"w\", \"M\", \"y\".\n *\n * @see https://pkg.go.dev/github.com/grafana/grafana-plugin-sdk-go/backend/gtime#ParseDuration\n *\n * @param durationString - string representation of a duration\n *\n * @internal\n */\nexport function isValidGrafanaDuration(durationString: string): boolean {\n  const timeUnits = ['y', 'M', 'w', 'd', 'h', 'm', 's', 'ms', 'us', 'µs', 'ns'];\n  return validateDurationByUnits(durationString, timeUnits);\n}\n\nfunction validateDurationByUnits(durationString: string, timeUnits: string[]): boolean {\n  for (const value of durationString.trim().split(' ')) {\n    const match = value.match(/([0-9]*[.]?[0-9]+)(.+)/);\n    if (match === null || match.length !== 3) {\n      return false;\n    }\n\n    const isValidUnit = timeUnits.includes(match[2]);\n    if (!isValidUnit) {\n      return false;\n    }\n  }\n\n  return true;\n}\n"],"names":["isAfter","intervalToDuration","add"],"mappings":";;;;;;;AAEA,MAAM,WAAA,GAAwC;AAAA,EAC5C,KAAA,EAAO,CAAC,GAAA,EAAK,GAAA,EAAK,OAAO,CAAA;AAAA,EACzB,MAAA,EAAQ,CAAC,GAAA,EAAK,QAAQ,CAAA;AAAA,EACtB,KAAA,EAAO,CAAC,GAAA,EAAK,GAAA,EAAK,OAAO,CAAA;AAAA,EACzB,IAAA,EAAM,CAAC,GAAA,EAAK,GAAA,EAAK,MAAM,CAAA;AAAA,EACvB,KAAA,EAAO,CAAC,GAAA,EAAK,GAAA,EAAK,OAAO,CAAA;AAAA,EACzB,OAAA,EAAS,CAAC,GAAA,EAAK,SAAS,CAAA;AAAA,EACxB,OAAA,EAAS,CAAC,GAAA,EAAK,GAAA,EAAK,SAAS;AAC/B,CAAA;AAUO,SAAS,mCAAA,CAAoC,QAAA,EAAoB,cAAA,GAAiB,IAAA,EAAc;AAGrG,EAAA,IAAIA,eAAA,CAAQ,QAAA,CAAS,KAAA,EAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACzC,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAWC,2BAAmB,QAAQ,CAAA;AAC5C,EAAA,OAAO,oBAAA,CAAqB,UAAU,cAAc,CAAA;AACtD;AAEO,SAAS,oBAAA,CAAqB,UAAoB,cAAA,EAAiC;AACxF,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM;AAC7D,IAAA,IAAI,KAAA,IAAS,UAAU,CAAA,IAAK,EAAE,SAAS,SAAA,IAAa,CAAC,kBAAkB,GAAA,CAAA,EAAM;AAC3E,MAAA,MAAM,OAAA,GAAU,GAAA,KAAQ,EAAA,GAAK,GAAA,GAAM,EAAA;AACnC,MAAA,OAAO,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,EAAG,KAAK,GAAG,WAAA,CAAY,IAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA;AAAA,IACxD;AAEA,IAAA,OAAO,GAAA;AAAA,EACT,GAAG,EAAE,CAAA;AACP;AASO,SAAS,cAAc,cAAA,EAAkC;AAC9D,EAAA,OAAO,eAAe,KAAA,CAAM,GAAG,EAAE,MAAA,CAAiB,CAAC,KAAK,KAAA,KAAU;AAChE,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AAErC,IAAA,MAAM,YAAY,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAQ,CAAA,CAAA;AAC1B,IAAA,MAAM,OAAO,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAQ,CAAA,CAAA;AAErB,IAAA,IAAI,EAAE,aAAa,IAAA,CAAA,EAAO;AACxB,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,WAAW,EAAE,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,aAAa,CAAA,KAAM,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAe,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA;AAC1G,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAA,EAAW,EAAE,CAAA;AAErC,IAAA,OAAO,OAAA,GAAU,EAAE,GAAG,GAAA,EAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAA,EAAO,GAAI,GAAA;AAAA,EACtD,CAAA,EAAG,EAAE,CAAA;AACP;AAUO,SAAS,iBAAA,CAAkB,MAAqB,QAAA,EAA0B;AAC/E,EAAA,OAAOC,WAAA,CAAI,MAAM,QAAQ,CAAA;AAC3B;AASO,SAAS,uBAAuB,QAAA,EAA4B;AACjE,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,OAAO,kBAAkB,GAAA,EAAK,QAAQ,EAAE,OAAA,EAAQ,GAAI,IAAI,OAAA,EAAQ;AAClE;AASO,SAAS,YAAY,UAAA,EAA6B;AACvD,EAAA,OAAO,CAAC,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,CAAA;AACtC;AAYO,SAAS,gBAAgB,cAAA,EAAiC;AAhHjE,EAAA,IAAA,EAAA;AAiHE,EAAA,KAAA,MAAW,SAAS,cAAA,CAAe,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,CAAA,EAAG;AACpD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AACrC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACxC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAM,EAAA,GAAA,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA,EAAG,aAAa,MAAM,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAe,QAAA,CAAS,MAAM,CAAC,CAAA,CAAE,MAA1F,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA8F,CAAA,CAAA;AAC1G,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAcO,SAAS,kBAAkB,cAAA,EAAiC;AACjE,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,IAAA,EAAM,IAAA,EAAM,SAAM,IAAI,CAAA;AACxD,EAAA,OAAO,uBAAA,CAAwB,gBAAgB,SAAS,CAAA;AAC1D;AAcO,SAAS,uBAAuB,cAAA,EAAiC;AACtE,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,OAAA,EAAM,IAAI,CAAA;AAC5E,EAAA,OAAO,uBAAA,CAAwB,gBAAgB,SAAS,CAAA;AAC1D;AAEA,SAAS,uBAAA,CAAwB,gBAAwB,SAAA,EAA8B;AACrF,EAAA,KAAA,MAAW,SAAS,cAAA,CAAe,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,CAAA,EAAG;AACpD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,wBAAwB,CAAA;AAClD,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACxC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,SAAA,CAAU,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AAC/C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;;;;;;;;;;"}