{"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 { inject, InjectFlags, 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 * Provides the TimeDiffGenerator preferring a custom provider for internal usage\n *\n * @internal\n */\nexport const TIME_DIFF_GENERATOR = new InjectionToken<TimeDiffGenerator>(\n  'Time Diff Generator',\n  {\n    factory: () => {\n      const customGenerator = inject(\n        CUSTOM_TIME_DIFF_GENERATOR,\n        InjectFlags.Optional\n      );\n      return customGenerator ?? defaultTimeDiffGenerator;\n    },\n  }\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 { inject, InjectFlags, 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/**\n * Provides the `UpdateIntervalGenerator` preferring a custom provider for internal usage\n *\n * @internal\n */\nexport const UPDATE_INTERVAL_GENERATOR = new InjectionToken<UpdateIntervalGenerator>('Update Interval Generator', {\n  factory: () => {\n    const customGenerator = inject(CUSTOM_UPDATE_INTERVAL_GENERATOR, InjectFlags.Optional);\n    return customGenerator ?? defaultUpdateIntervalGenerator;\n  },\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: TAInput): boolean => {\n  return (typeof value === 'number' || typeof value === 'string' || value instanceof Date);\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 {\n  ChangeDetectorRef,\n  Inject,\n  OnDestroy,\n  Pipe,\n  PipeTransform,\n} from '@angular/core';\nimport {\n  createTimeDiff,\n  TIME_DIFF_GENERATOR,\n  TimeDiffGenerator,\n} from './time-diff';\nimport {\n  UPDATE_INTERVAL_GENERATOR,\n  UpdateIntervalGenerator,\n} from './time-interval';\nimport { parseInputValue, TAInput, validateTAInputType } from './time-past';\nimport { TIME_PAST_TICKER } from './ticker';\nimport { Observable, Subscription } from 'rxjs';\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 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: Subscription;\n\n  /**\n   * TimePastPipe Class Constructor\n   */\n  constructor(\n    private readonly changeDetectorRef: ChangeDetectorRef,\n    @Inject(TIME_PAST_TICKER) private readonly ticker: Observable<number>,\n    @Inject(TIME_DIFF_GENERATOR)\n    private readonly timeDiffGenerator: TimeDiffGenerator,\n    @Inject(UPDATE_INTERVAL_GENERATOR)\n    private readonly updateIntervalGenerator: UpdateIntervalGenerator\n  ) {\n    this.intervalSubscription = this.intervalTimer.subscribe(() => {\n      this.changeDetectorRef.markForCheck();\n    });\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): 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 } from '@angular/core';\nimport { createTimeDiff, TIME_DIFF_GENERATOR, 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  constructor(@Inject(TIME_DIFF_GENERATOR) private readonly timeDiffGenerator: TimeDiffGenerator) { }\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): string {\n    if (validateTAInputType(value) === false) {\n      return undefined;\n    }\n\n    const seconds = parseInputValue(value);\n    const timeDiff = createTimeDiff(seconds);\n\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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"}