{"version":3,"file":"ng-time-past-pipe.mjs","sources":["../../../projects/ng-time-past-pipe/src/lib/time-diff.ts","../../../projects/ng-time-past-pipe/src/lib/time-interval.ts","../../../projects/ng-time-past-pipe/src/lib/time-past.ts","../../../projects/ng-time-past-pipe/src/lib/ticker.ts","../../../projects/ng-time-past-pipe/src/lib/time-past.pipe.ts","../../../projects/ng-time-past-pipe/src/lib/time-past.service.ts","../../../projects/ng-time-past-pipe/src/ng-time-past-pipe.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Represents the Time Difference in the different time units\n *\n * @public\n * @api\n */\nexport interface TimeDiff {\n  seconds: number;\n  minutes: number;\n  hours: number;\n  months: number;\n  days: number;\n  years: number;\n  isFuture?: boolean;\n}\n\n/**\n * Function Type for the `TimeDiffGenerator`\n *\n * @public\n * @api\n */\nexport type TimeDiffGenerator = (diff: TimeDiff) => string;\n\n/**\n * Custom `TimeDiffGenerator` Injection Token\n *\n * @public\n * @api\n */\nexport const CUSTOM_TIME_DIFF_GENERATOR = new InjectionToken<TimeDiffGenerator>(\n  'Custom Time Diff Generator'\n);\n\n/**\n * Return a respective textual representation of the input, as the input is a timespan that has been passed.\n *\n * @param diff The time diff object\n * @public\n * @api\n */\nexport const defaultTimeDiffGenerator: TimeDiffGenerator = (\n  diff: TimeDiff\n): string => {\n  if (diff.seconds === 0) {\n    return 'about now';\n  }\n\n  return diff.isFuture ? getFutureDiffString(diff) : getPastDiffString(diff);\n};\n\nexport const getPastDiffString = (diff: TimeDiff) => {\n  const { seconds, minutes, hours, months, days, years } = diff;\n\n  if (seconds <= 5) {\n    return 'a few seconds ago';\n  } else if (seconds <= 59) {\n    return seconds + ' seconds ago';\n  } else if (seconds <= 90) {\n    return 'about a minute ago';\n  }\n\n  if (minutes <= 45) {\n    return minutes + ' minutes ago';\n  } else if (minutes <= 90) {\n    return 'one hour ago';\n  }\n\n  if (hours <= 22) {\n    return hours + ' hours ago';\n  } else if (hours <= 36) {\n    return 'a day ago';\n  }\n\n  if (days <= 25) {\n    return days + ' days ago';\n  } else if (days <= 45) {\n    return 'a month ago';\n  }\n\n  if (days <= 345) {\n    return months + ' months ago';\n  } else if (days <= 545) {\n    return 'a year ago';\n  }\n\n  return years + ' years ago';\n};\n\nexport const getFutureDiffString = (diff: TimeDiff): string => {\n  const { seconds, minutes, hours, months, days, years } = diff;\n\n  if (seconds <= 59) {\n    return 'in ' + seconds + ' seconds';\n  }\n\n  if (seconds <= 90) {\n    return 'in one minute';\n  } else if (minutes <= 59) {\n    return 'in ' + minutes + ' minutes';\n  }\n\n  if (minutes <= 90) {\n    return 'in one hour';\n  } else if (hours <= 22) {\n    return 'in ' + hours + ' hours';\n  }\n\n  if (hours <= 36) {\n    return 'in one day';\n  } else if (days <= 25) {\n    return 'in ' + days + ' days';\n  }\n\n  if (days <= 45) {\n    return 'in one month';\n  } else if (days <= 345) {\n    return 'in ' + months + ' months';\n  }\n\n  if (days <= 545) {\n    return 'in one year';\n  }\n\n  return 'in ' + years + ' years';\n};\n\n/**\n * TimeDiff Factory\n *\n * @param seconds The time difference in seconds. Negative values are considered as a future event\n * @internal\n */\nexport const createTimeDiff = (seconds: number): TimeDiff => {\n  const isFuture = seconds < 0;\n\n  if (isFuture) {\n    seconds = Math.abs(seconds);\n  }\n\n  const diff: Partial<TimeDiff> = { seconds, isFuture };\n\n  diff.minutes = Math.round(seconds / 60);\n  diff.hours = Math.round(diff.minutes / 60);\n  diff.days = Math.round(diff.hours / 24);\n  diff.months = Math.round(diff.days / 30.416);\n  diff.years = Math.round(diff.days / 365);\n\n  return diff as TimeDiff;\n};\n","import { TimeDiff } from './time-diff';\nimport { InjectionToken } from '@angular/core';\n\n/**\n * Function Type for the `UpdateIntervalGenerator`\n *\n * @public\n * @api\n */\nexport type UpdateIntervalGenerator = (diff: TimeDiff) => number;\n\n/**\n * Custom `UpdateIntervalGenerator` Injection Token\n *\n * @public\n * @api\n */\nexport const CUSTOM_UPDATE_INTERVAL_GENERATOR = new InjectionToken<UpdateIntervalGenerator>('Custom Update Interval Generator');\n\n/**\n * Determinate the point of time on when the output should be checked for a update\n *\n * @param diff The time diff object\n * @return A point of time in future in seconds\n * @public\n * @api\n */\nexport const defaultUpdateIntervalGenerator: UpdateIntervalGenerator = (diff: TimeDiff): number => {\n  if (diff.seconds < 60) { // less than 1 min, update every second\n    return 1;\n  } else if (diff.seconds < 3600) { // less than an hour, update every 30 secs\n    return 30;\n  } else if (diff.seconds < 86400) { // less than a day, update every 5 min\n    return 300;\n  }\n  // update every hour\n  return 3600;\n};\n","/**\n * Accessor Input Type\n */\nexport type TAInput = number | string | Date;\n\n/**\n * Optimistic parse a given input to seconds that past between it and now\n *\n * @param value A value of type string, number or date\n * @return The time past in seconds between now and input value\n * @internal\n */\nexport const parseInputValue = (value: TAInput): number => {\n  let dateValueTime;\n  if (typeof value === 'number') {\n    if (value <= 0) {\n      // Negative number will always be handled as seconds in the future\n      return value;\n    }\n\n    const length = Math.ceil(Math.log10(value + 1));\n    if (length < 10 && length > 0) {\n      return value; // Guessing the input is already the passed seconds\n    }\n\n    if (length === 10) { value *= 1000; } // Guessing UnixTimestamp\n    dateValueTime = value; // All other lengths are considered intentional and therefore processed\n  } else {\n    // Use Date constructor to determine the microseconds\n    dateValueTime = (value instanceof Date ? value : new Date(value)).getTime();\n  }\n\n  return Math.floor((Date.now() - dateValueTime) / 1000);\n};\n\n/**\n * Strict TAInput Type Validator\n *\n * @param value The optimistic input value to validate\n * @internal\n */\nexport const validateTAInputType = (value: any): boolean => {\n  return typeof value === 'number' || !isNaN(Date.parse(value));\n};\n","import { InjectionToken } from '@angular/core';\nimport { interval, Observable } from 'rxjs';\n\nexport const TIME_PAST_TICKER = new InjectionToken<Observable<number>>('TimePastTimer', {\n  factory: () => interval(1000),\n  providedIn: 'root'\n});\n","import { ChangeDetectorRef, inject, OnDestroy, Pipe, PipeTransform, } from '@angular/core';\nimport { createTimeDiff, CUSTOM_TIME_DIFF_GENERATOR, defaultTimeDiffGenerator, } from './time-diff';\nimport { CUSTOM_UPDATE_INTERVAL_GENERATOR, defaultUpdateIntervalGenerator } from './time-interval';\nimport { parseInputValue, TAInput, validateTAInputType } from './time-past';\nimport { TIME_PAST_TICKER } from './ticker';\nimport { filter, map } from 'rxjs/operators';\n\n@Pipe({\n  standalone: true,\n  name: 'timePast',\n  pure: false,\n})\nexport class TimePastPipe implements PipeTransform, OnDestroy {\n  private readonly changeDetectorRef = inject(ChangeDetectorRef);\n  private readonly ticker = inject(TIME_PAST_TICKER);\n  private readonly timeDiffGenerator =\n    inject(CUSTOM_TIME_DIFF_GENERATOR, { optional: true }) ?? defaultTimeDiffGenerator;\n  private readonly updateIntervalGenerator =\n    inject(CUSTOM_UPDATE_INTERVAL_GENERATOR, { optional: true }) ?? defaultUpdateIntervalGenerator;\n\n  private initialSeconds: any;\n  private lastInput: any;\n  private lastSeconds?: number;\n  private lastResult?: string;\n\n  private currentPeriod = 1;\n  private readonly intervalTimer = this.ticker.pipe(\n    filter((tick) => tick % this.currentPeriod === 0),\n    map((tick) => tick / this.currentPeriod)\n  );\n  private readonly intervalSubscription = this.intervalTimer.subscribe(() =>\n    this.changeDetectorRef.markForCheck()\n  );\n\n  /**\n   * Transform anything that can be parsed to a Date in the past, to a string that represent the relative\n   *  time that has been passed between now and this point of time.\n   *\n   * @param value A value that can be parsed to a Date in the past or future\n   * @param overflow Overflow to time in past when initial date was in future\n   * @return The textual representation of the time that has been passed between the given Date\n   *  and the current.\n   */\n  transform<T extends TAInput>(value: T, overflow = true): undefined | string | T {\n    if (this.isValidInput(value) === false) {\n      return value;\n    }\n\n    const seconds = parseInputValue(value);\n    this.initialSeconds ||= seconds;\n\n    if (this.lastSeconds === seconds || (overflow === false && this.initialSeconds < 0 && seconds > 0)) {\n      return this.lastResult;\n    }\n\n    // The ChangeDetector should not call transform again while the new value is being resolved\n    this.changeDetectorRef.detach();\n\n    this.lastSeconds = seconds;\n\n    const timeDiff = createTimeDiff(seconds);\n    const result = (this.lastResult = this.timeDiffGenerator(timeDiff));\n\n    // Make sure the update interval refreshed as well\n    this.currentPeriod = this.updateIntervalGenerator(timeDiff);\n\n    // Reattach the ChangeDetector so that further changes are being transformed\n    this.changeDetectorRef.reattach();\n\n    return result;\n  }\n\n  /**\n   * Validate the Input Value and log a warning per value when it fails\n   *\n   * @param value\n   * @private\n   */\n  private isValidInput(value: TAInput): boolean {\n    const validationResult = validateTAInputType(value);\n\n    if (validationResult === false && this.lastInput !== value) {\n      console.warn(\n        `[TimePastPipe] Invalid Input of type ${typeof value} (${value}).`\n      );\n    }\n\n    this.lastInput = value;\n\n    return validationResult;\n  }\n\n  /**\n   * Clear interval ticker subscription\n   */\n  ngOnDestroy(): void {\n    if (this.intervalSubscription) {\n      this.intervalSubscription.unsubscribe();\n    }\n  }\n}\n\n/**\n * @deprecated Use TimePastPipe instead\n */\nexport const NgTimePastPipePipe = TimePastPipe;\n","import {Inject, Injectable, Optional} from '@angular/core';\nimport {createTimeDiff, CUSTOM_TIME_DIFF_GENERATOR, defaultTimeDiffGenerator, TimeDiffGenerator} from './time-diff';\nimport { parseInputValue, TAInput, validateTAInputType } from './time-past';\n\n@Injectable({ providedIn: 'root' })\n/**\n * Public TimePast Service Class\n *\n * @public\n * @api\n */\nexport class TimePastService {\n  private readonly timeDiffGenerator: TimeDiffGenerator;\n\n  constructor(@Inject(CUSTOM_TIME_DIFF_GENERATOR) @Optional() timeDiffGenerator: TimeDiffGenerator) {\n    this.timeDiffGenerator = timeDiffGenerator ?? defaultTimeDiffGenerator;\n  }\n\n  /**\n   * Transform anything that can be parsed to a Date in the past, to a string that represent the relative\n   *  time that has been passed between now and this point of time.\n   *\n   * @param value A value that can be parsed to a Date in the past\n   * @return The textual representation of the time that has been passed between the given Date\n   *  and the current.\n   */\n  timePast(value: TAInput): undefined | string {\n    console.log(value, validateTAInputType(value), this.timeDiffGenerator);\n    if (!validateTAInputType(value)) {\n      return undefined;\n    }\n\n    const seconds = parseInputValue(value);\n    const timeDiff = createTimeDiff(seconds);\n\n    console.log(seconds, timeDiff);\n    return this.timeDiffGenerator(timeDiff);\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}