UNPKG

renovate

Version:

Automated dependency updates. Flexible so you don't need to be.

66 lines (65 loc) 1.95 kB
import { regEx } from "./regex.js"; import { logger } from "../logger/index.js"; import { isNonEmptyString, isNumber } from "@sindresorhus/is"; import { DateTime } from "luxon"; import ms from "ms"; //#region lib/util/pretty-time.ts const splitRegex = regEx(/(.*?[a-z]+)/); function split(time) { return time.split(splitRegex).map((x) => x.trim()).filter(isNonEmptyString); } function applyCustomFormat(spec) { const monthRegex = regEx(/^(\d+)\s*(?:months?|M)$/); return spec.replace(monthRegex, (_, months) => `${months * 30} days`); } function toMs(time) { try { const specs = split(time).map(applyCustomFormat); if (!specs.length) { logger.debug({ time }, `Invalid time specifier: '${time}'`); return null; } let totalMillis = 0; for (const spec of specs) { const millis = ms(spec); if (!isNumber(millis)) { logger.debug({ time }, `Invalid time specifier: '${spec}'`); return null; } totalMillis += millis; } return totalMillis; } catch (err) { logger.debug({ time, err }, `Invalid time specifier: '${time}'`); return null; } } const rangeRegex = regEx(/^(?<operator>(>=|<=|<|>))\s*(?<age>.*)$/); function satisfiesDateRange(date, range) { const grps = range.trim().match(rangeRegex)?.groups; if (!grps) return null; const { operator, age } = grps; const luxonDate = DateTime.fromISO(date, { zone: "utc" }); if (!luxonDate.isValid) { logger.trace(`Invalid date when computing satisfiesDateRange: '${date}'`); return null; } const dateMs = luxonDate.toMillis(); const ageMs = toMs(age); if (!isNumber(ageMs)) return null; const rangeMs = Date.now() - ageMs; switch (operator) { case ">": return dateMs < rangeMs; case ">=": return dateMs <= rangeMs; case "<": return dateMs > rangeMs; case "<=": return dateMs >= rangeMs; } // v8 ignore next: can never happen return null; } //#endregion export { satisfiesDateRange, toMs }; //# sourceMappingURL=pretty-time.js.map