UNPKG

ngx-timeago

Version:

Live updating timestamps in Angular 6+.

119 lines 18.9 kB
import { Injectable } from '@angular/core'; import { MINUTE, HOUR, DAY, WEEK, MONTH, YEAR } from './util'; import * as i0 from "@angular/core"; import * as i1 from "./timeago.intl"; const defaultFormattter = function (then) { const now = Date.now(); const seconds = Math.round(Math.abs(now - then) / 1000); const suffix = then < now ? 'ago' : 'from now'; const [value, unit] = seconds < MINUTE ? [Math.round(seconds), 'second'] : seconds < HOUR ? [Math.round(seconds / MINUTE), 'minute'] : seconds < DAY ? [Math.round(seconds / HOUR), 'hour'] : seconds < WEEK ? [Math.round(seconds / DAY), 'day'] : seconds < MONTH ? [Math.round(seconds / WEEK), 'week'] : seconds < YEAR ? [Math.round(seconds / MONTH), 'month'] : [Math.round(seconds / YEAR), 'year']; return { value, unit, suffix }; }; export class TimeagoFormatter { } class TimeagoDefaultFormatter extends TimeagoFormatter { format(then) { const { suffix, value, unit } = defaultFormattter(then); return this.parse(value, unit, suffix); } parse(value, unit, suffix) { if (value !== 1) { unit += 's'; } return value + ' ' + unit + ' ' + suffix; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: TimeagoDefaultFormatter, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: TimeagoDefaultFormatter }); } } export { TimeagoDefaultFormatter }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: TimeagoDefaultFormatter, decorators: [{ type: Injectable }] }); class TimeagoCustomFormatter extends TimeagoFormatter { constructor(intl) { super(); this.intl = intl; } format(then) { const { suffix, value, unit } = defaultFormattter(then); return this.parse(value, unit, suffix, Date.now(), then); } parse(value, unit, suffix, now, then) { /** convert weeks to days if strings don't handle weeks */ if (unit === 'week' && !this.intl.strings.week && !this.intl.strings.weeks) { const days = Math.round(Math.abs(now - then) / (1000 * 60 * 60 * 24)); value = days; unit = 'day'; } /** create a normalize function for given value */ const normalize = this.normalizeFn(value, now - then, this.intl.strings.numbers); /** The eventual return value stored in an array so that the wordSeparator can be used */ const dateString = []; /** handle prefixes */ if (suffix === 'ago' && this.intl.strings.prefixAgo) { dateString.push(normalize(this.intl.strings.prefixAgo)); } if (suffix === 'from now' && this.intl.strings.prefixFromNow) { dateString.push(normalize(this.intl.strings.prefixFromNow)); } /** Handle Main number and unit */ const isPlural = value > 1; if (isPlural) { const stringFn = this.intl.strings[unit + 's'] || this.intl.strings[unit] || '%d ' + unit; dateString.push(normalize(stringFn)); } else { const stringFn = this.intl.strings[unit] || this.intl.strings[unit + 's'] || '%d ' + unit; dateString.push(normalize(stringFn)); } /** Handle Suffixes */ if (suffix === 'ago' && this.intl.strings.suffixAgo) { dateString.push(normalize(this.intl.strings.suffixAgo)); } if (suffix === 'from now' && this.intl.strings.suffixFromNow) { dateString.push(normalize(this.intl.strings.suffixFromNow)); } /** join the array into a string and return it */ const wordSeparator = typeof this.intl.strings.wordSeparator === 'string' ? this.intl.strings.wordSeparator : ' '; return dateString.join(wordSeparator); } /** * If the numbers array is present, format numbers with it, * otherwise just cast the number to a string and return it */ normalizeNumber(numbers, value) { return numbers && numbers.length === 10 ? String(value).split('') .map((digit) => digit.match(/^[0-9]$/) ? numbers[parseInt(digit, 10)] : digit) .join('') : String(value); } /** * Take a string or a function that takes number of days and returns a string * and provide a uniform API to create string parts */ normalizeFn(value, millisDelta, numbers) { return (stringOrFn) => typeof stringOrFn === 'function' ? stringOrFn(value, millisDelta).replace(/%d/g, this.normalizeNumber(numbers, value)) : stringOrFn.replace(/%d/g, this.normalizeNumber(numbers, value)); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: TimeagoCustomFormatter, deps: [{ token: i1.TimeagoIntl }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: TimeagoCustomFormatter }); } } export { TimeagoCustomFormatter }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: TimeagoCustomFormatter, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.TimeagoIntl }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWFnby5mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvc3JjL3RpbWVhZ28uZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDOzs7QUFVOUQsTUFBTSxpQkFBaUIsR0FBRyxVQUFTLElBQVk7SUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDeEQsTUFBTSxNQUFNLEdBQVcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFFdkQsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FDakIsT0FBTyxHQUFHLE1BQU07UUFDZCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQztRQUNqQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUk7WUFDZCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUM7WUFDMUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHO2dCQUNiLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQztnQkFDdEMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJO29CQUNk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QUMzRSxPQUFPLENBQUMsVUFBc0IsRUFBRSxFQUFFLENBQ2hDLE9BQU8sVUFBVSxLQUFLLFVBQVU7WUFDaEMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDOzhHQTVFVSxzQkFBc0I7a0hBQXRCLHNCQUFzQjs7U0FBdEIsc0JBQXNCOzJGQUF0QixzQkFBc0I7a0JBRGxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaW1lYWdvSW50bCB9IGZyb20gJy4vdGltZWFnby5pbnRsJztcbmltcG9ydCB7IE1JTlVURSwgSE9VUiwgREFZLCBXRUVLLCBNT05USCwgWUVBUiB9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCB0eXBlIFVuaXQgPSAnc2Vjb25kJyB8ICdtaW51dGUnIHwgJ2hvdXInIHwgJ2RheScgfCAnd2VlaycgfCAnbW9udGgnIHwgJ3llYXInO1xuXG5leHBvcnQgdHlwZSBTdWZmaXggPSAnYWdvJyB8ICdmcm9tIG5vdyc7XG5cbmV4cG9ydCB0eXBlIFN0cmluZ09yRm4gPSAoKHZhbHVlOiBudW1iZXIsIG1pbGxpc0RlbHRhOiAgbnVtYmVyKSA9PiBzdHJpbmcpIHwgc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBOdW1iZXJBcnJheSA9IFsgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nIF07XG5cbmNvbnN0IGRlZmF1bHRGb3JtYXR0dGVyID0gZnVuY3Rpb24odGhlbjogbnVtYmVyKToge3ZhbHVlOiBudW1iZXIsIHVuaXQ6IFVuaXQsIHN1ZmZpeDogU3VmZml4fSB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLnJvdW5kKE1hdGguYWJzKG5vdyAtIHRoZW4pIC8gMTAwMCk7XG4gIGNvbnN0IHN1ZmZpeDogU3VmZml4ID0gdGhlbiA8IG5vdyA/ICdhZ28nIDogJ2Zyb20gbm93JztcblxuICBjb25zdCBbdmFsdWUsIHVuaXRdOiBbbnVtYmVyLCBVbml0XSA9XG4gICAgc2Vjb25kcyA8IE1JTlVURVxuICAgICAgPyBbTWF0aC5yb3VuZChzZWNvbmRzKSwgJ3NlY29uZCddXG4gICAgICA6IHNlY29uZHMgPCBIT1VSXG4gICAgICAgID8gW01hdGgucm91bmQoc2Vjb25kcyAvIE1JTlVURSksICdtaW51dGUnXVxuICAgICAgICA6IHNlY29uZHMgPCBEQVlcbiAgICAgICAgICA/IFtNYXRoLnJvdW5kKHNlY29uZHMgLyBIT1VSKSwgJ2hvdXInXVxuICAgICAgICAgIDogc2Vjb25kcyA8IFdFRUtcbiAgICAgICAgICAgID8gW01hdGgucm91bmQoc2Vjb25kcyAvIERBWSksICdkYXknXVxuICAgICAgICAgICAgOiBzZWNvbmRzIDwgTU9OVEhcbiAgICAgICAgICAgICAgPyBbTWF0aC5yb3VuZChzZWNvbmRzIC8gV0VFSyksICd3ZWVrJ11cbiAgICAgICAgICAgICAgOiBzZWNvbmRzIDwgWUVBUlxuICAgICAgICAgICAgICAgID8gW01hdGgucm91bmQoc2Vjb25kcyAvIE1PTlRIKSwgJ21vbnRoJ11cbiAgICAgICAgICAgICAgICA6IFtNYXRoLnJvdW5kKHNlY29uZHMgLyBZRUFSKSwgJ3llYXInXTtcblxuICByZXR1cm4ge3ZhbHVlLCB1bml0LCBzdWZmaXh9O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGltZWFnb0Zvcm1hdHRlciB7XG4gIGFic3RyYWN0IGZvcm1hdCh0aGVuOiBudW1iZXIpOiBzdHJpbmdcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRpbWVhZ29EZWZhdWx0Rm9ybWF0dGVyIGV4dGVuZHMgVGltZWFnb0Zvcm1hdHRlciB7XG4gIGZvcm1hdCh0aGVuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtzdWZmaXgsIHZhbHVlLCB1bml0fSA9IGRlZmF1bHRGb3JtYXR0dGVyKHRoZW4pO1xuICAgIHJldHVybiB0aGlzLnBhcnNlKHZhbHVlLCB1bml0LCBzdWZmaXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZSh2YWx1ZTogbnVtYmVyLCB1bml0OiBVbml0LCBzdWZmaXg6IFN1ZmZpeCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlICE9PSAxKSB7XG4gICAgICB1bml0ICs9ICdzJztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlICsgJyAnICsgdW5pdCArICcgJyArIHN1ZmZpeDtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGltZWFnb0N1c3RvbUZvcm1hdHRlciBleHRlbmRzIFRpbWVhZ29Gb3JtYXR0ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGludGw6IFRpbWVhZ29JbnRsKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGZvcm1hdCh0aGVuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtzdWZmaXgsIHZhbHVlLCB1bml0fSA9IGRlZmF1bHRGb3JtYXR0dGVyKHRoZW4pO1xuICAgIHJldHVybiB0aGlzLnBhcnNlKHZhbHVlLCB1bml0LCBzdWZmaXgsIERhdGUubm93KCksIHRoZW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZSh2YWx1ZTogbnVtYmVyLCB1bml0OiBVbml0LCBzdWZmaXg6IFN1ZmZpeCwgbm93OiBudW1iZXIsIHRoZW46IG51bWJlcikge1xuICAgIC8qKiBjb252ZXJ0IHdlZWtzIHRvIGRheXMgaWYgc3RyaW5ncyBkb24ndCBoYW5kbGUgd2Vla3MgKi9cbiAgICBpZiAodW5pdCA9PT0gJ3dlZWsnICYmICF0aGlzLmludGwuc3RyaW5ncy53ZWVrICYmICF0aGlzLmludGwuc3RyaW5ncy53ZWVrcykge1xuICAgICAgY29uc3QgZGF5cyA9IE1hdGgucm91bmQoTWF0aC5hYnMobm93IC0gdGhlbikgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpO1xuICAgICAgdmFsdWUgPSBkYXlzO1xuICAgICAgdW5pdCA9ICdkYXknO1xuICAgIH1cblxuICAgIC8qKiBjcmVhdGUgYSBub3JtYWxpemUgZnVuY3Rpb24gZm9yIGdpdmVuIHZhbHVlICovXG4gICAgY29uc3Qgbm9ybWFsaXplID0gdGhpcy5ub3JtYWxpemVGbih2YWx1ZSwgbm93IC0gdGhlbiwgdGhpcy5pbnRsLnN0cmluZ3MubnVtYmVycyk7XG5cbiAgICAvKiogVGhlIGV2ZW50dWFsIHJldHVybiB2YWx1ZSBzdG9yZWQgaW4gYW4gYXJyYXkgc28gdGhhdCB0aGUgd29yZFNlcGFyYXRvciBjYW4gYmUgdXNlZCAqL1xuICAgIGNvbnN0IGRhdGVTdHJpbmc6IHN0cmluZ1tdID0gW107XG5cbiAgICAvKiogaGFuZGxlIHByZWZpeGVzICovXG4gICAgaWYgKHN1ZmZpeCA9PT0gJ2FnbycgJiYgdGhpcy5pbnRsLnN0cmluZ3MucHJlZml4QWdvKSB7XG4gICAgICBkYXRlU3RyaW5nLnB1c2gobm9ybWFsaXplKHRoaXMuaW50bC5zdHJpbmdzLnByZWZpeEFnbykpO1xuICAgIH1cbiAgICBpZiAoc3VmZml4ID09PSAnZnJvbSBub3cnICYmIHRoaXMuaW50bC5zdHJpbmdzLnByZWZpeEZyb21Ob3cpIHtcbiAgICAgIGRhdGVTdHJpbmcucHVzaChub3JtYWxpemUodGhpcy5pbnRsLnN0cmluZ3MucHJlZml4RnJvbU5vdykpO1xuICAgIH1cblxuICAgIC8qKiBIYW5kbGUgTWFpbiBudW1iZXIgYW5kIHVuaXQgKi9cbiAgICBjb25zdCBpc1BsdXJhbCA9IHZhbHVlID4gMTtcbiAgICBpZiAoaXNQbHVyYWwpIHtcbiAgICAgIGNvbnN0IHN0cmluZ0ZuOiBTdHJpbmdPckZuID0gdGhpcy5pbnRsLnN0cmluZ3NbdW5pdCArICdzJ10gfHwgdGhpcy5pbnRsLnN0cmluZ3NbdW5pdF0gfHwgJyVkICcgKyB1bml0O1xuICAgICAgZGF0ZVN0cmluZy5wdXNoKG5vcm1hbGl6ZShzdHJpbmdGbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzdHJpbmdGbjogU3RyaW5nT3JGbiA9IHRoaXMuaW50bC5zdHJpbmdzW3VuaXRdIHx8IHRoaXMuaW50bC5zdHJpbmdzW3VuaXQgKyAncyddIHx8ICclZCAnICsgdW5pdDtcbiAgICAgIGRhdGVTdHJpbmcucHVzaChub3JtYWxpemUoc3RyaW5nRm4pKTtcbiAgICB9XG5cbiAgICAvKiogSGFuZGxlIFN1ZmZpeGVzICovXG4gICAgaWYgKHN1ZmZpeCA9PT0gJ2FnbycgJiYgdGhpcy5pbnRsLnN0cmluZ3Muc3VmZml4QWdvKSB7XG4gICAgICBkYXRlU3RyaW5nLnB1c2gobm9ybWFsaXplKHRoaXMuaW50bC5zdHJpbmdzLnN1ZmZpeEFnbykpO1xuICAgIH1cbiAgICBpZiAoc3VmZml4ID09PSAnZnJvbSBub3cnICYmIHRoaXMuaW50bC5zdHJpbmdzLnN1ZmZpeEZyb21Ob3cpIHtcbiAgICAgIGRhdGVTdHJpbmcucHVzaChub3JtYWxpemUodGhpcy5pbnRsLnN0cmluZ3Muc3VmZml4RnJvbU5vdykpO1xuICAgIH1cblxuICAgIC8qKiBqb2luIHRoZSBhcnJheSBpbnRvIGEgc3RyaW5nIGFuZCByZXR1cm4gaXQgKi9cbiAgICBjb25zdCB3b3JkU2VwYXJhdG9yID0gdHlwZW9mIHRoaXMuaW50bC5zdHJpbmdzLndvcmRTZXBhcmF0b3IgPT09ICdzdHJpbmcnID8gdGhpcy5pbnRsLnN0cmluZ3Mud29yZFNlcGFyYXRvciA6ICcgJztcbiAgICByZXR1cm4gZGF0ZVN0cmluZy5qb2luKHdvcmRTZXBhcmF0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBudW1iZXJzIGFycmF5IGlzIHByZXNlbnQsIGZvcm1hdCBudW1iZXJzIHdpdGggaXQsXG4gICAqIG90aGVyd2lzZSBqdXN0IGNhc3QgdGhlIG51bWJlciB0byBhIHN0cmluZyBhbmQgcmV0dXJuIGl0XG4gICovXG4gIHByaXZhdGUgbm9ybWFsaXplTnVtYmVyKG51bWJlcnM6IE51bWJlckFycmF5LCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG51bWJlcnMgJiYgbnVtYmVycy5sZW5ndGggPT09IDEwXG4gICAgICA/IFN0cmluZyh2YWx1ZSkuc3BsaXQoJycpXG4gICAgICAgICAgLm1hcCgoZGlnaXQ6IHN0cmluZykgPT4gZGlnaXQubWF0Y2goL15bMC05XSQvKSA/IG51bWJlcnNbcGFyc2VJbnQoZGlnaXQsIDEwKV0gOiBkaWdpdClcbiAgICAgICAgICAuam9pbignJylcbiAgICAgIDogU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBudW1iZXIgb2YgZGF5cyBhbmQgcmV0dXJucyBhIHN0cmluZ1xuICAgKiBhbmQgcHJvdmlkZSBhIHVuaWZvcm0gQVBJIHRvIGNyZWF0ZSBzdHJpbmcgcGFydHNcbiAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVGbih2YWx1ZTogbnVtYmVyLCBtaWxsaXNEZWx0YTogbnVtYmVyLCBudW1iZXJzPzogTnVtYmVyQXJyYXkpIHtcbiAgICByZXR1cm4gKHN0cmluZ09yRm46IFN0cmluZ09yRm4pID0+XG4gICAgICB0eXBlb2Ygc3RyaW5nT3JGbiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBzdHJpbmdPckZuKHZhbHVlLCBtaWxsaXNEZWx0YSkucmVwbGFjZSgvJWQvZywgdGhpcy5ub3JtYWxpemVOdW1iZXIobnVtYmVycywgdmFsdWUpKVxuICAgICAgOiBzdHJpbmdPckZuLnJlcGxhY2UoLyVkL2csIHRoaXMubm9ybWFsaXplTnVtYmVyKG51bWJlcnMsIHZhbHVlKSk7XG4gIH1cbn1cbiJdfQ==