Skip to content

Commit

Permalink
Merge pull request #4296 from TedDriggs:develop
Browse files Browse the repository at this point in the history
[feature] Accept custom relative thresholds in duration.humanize
  • Loading branch information
ichernev committed Apr 25, 2020
2 parents 7165c2d + a26ea03 commit 757d4ff
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 4 deletions.
15 changes: 14 additions & 1 deletion moment.d.ts
Expand Up @@ -154,10 +154,23 @@ declare namespace moment {
milliseconds: number;
}

interface HumanizeOptions {
withSuffix?: boolean;
thresholds?: {
ss?: number;
s?: number;
m?: number;
h?: number;
d?: number;
w?: number | void;
M?: number;
};
}

interface Duration {
clone(): Duration;

humanize(withSuffix?: boolean): string;
humanize(withSuffixOrOptions?: boolean | HumanizeOptions): string;

abs(): Duration;

Expand Down
28 changes: 25 additions & 3 deletions src/lib/duration/humanize.js
Expand Up @@ -16,7 +16,7 @@ function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
}

function relativeTime (posNegDuration, withoutSuffix, locale) {
function relativeTime (posNegDuration, withoutSuffix, thresholds, locale) {
var duration = createDuration(posNegDuration).abs();
var seconds = round(duration.as('s'));
var minutes = round(duration.as('m'));
Expand Down Expand Up @@ -78,13 +78,35 @@ export function getSetRelativeTimeThreshold (threshold, limit) {
return true;
}

export function humanize (withSuffix) {
export function humanize (withSuffixOrOptions) {
if (!this.isValid()) {
return this.localeData().invalidDate();
}

var withSuffix = false;
var th = thresholds;

if (typeof withSuffixOrOptions === 'boolean') {
withSuffix = withSuffixOrOptions;
}
else if (typeof withSuffixOrOptions === 'object') {
var ws = withSuffixOrOptions.withSuffix;
if (typeof ws === 'boolean') {
withSuffix = ws;
}

var t = withSuffixOrOptions.thresholds;
if (typeof t === 'object') {
// Fill in missing keys with the current values
th = Object.assign({}, thresholds, t);
if (typeof t.s === 'number') {
th.ss = t.s - 1;
}
}
}

var locale = this.localeData();
var output = relativeTime(this, !withSuffix, locale);
var output = relativeTime(this, !withSuffix, th, locale);

if (withSuffix) {
output = locale.pastFuture(+this, output);
Expand Down
23 changes: 23 additions & 0 deletions src/test/moment/duration.js
Expand Up @@ -464,6 +464,29 @@ test('humanize duration with suffix', function (assert) {
assert.equal(moment.duration({seconds: 44}).humanize(true), 'in a few seconds', '44 seconds = a few seconds');
assert.equal(moment.duration({seconds: -44}).humanize(true), 'a few seconds ago', '44 seconds = a few seconds');
assert.equal(moment.duration({seconds: +44}).humanize(true), 'in a few seconds', '44 seconds = a few seconds');
assert.equal(moment.duration({seconds: 44}).humanize({withSuffix: true}), 'in a few seconds', '44 seconds = a few seconds');
assert.equal(moment.duration({seconds: -44}).humanize({withSuffix: true}), 'a few seconds ago', '44 seconds = a few seconds');
assert.equal(moment.duration({seconds: +44}).humanize({withSuffix: true}), 'in a few seconds', '44 seconds = a few seconds');
});

test('humanize duration with options', function (assert) {
var thresholds = {s: 9};
moment.locale('en');
assert.equal(
moment.duration({seconds: -10}).humanize({thresholds: thresholds}),
'a minute',
'10 seconds = a minute (with thresholds)'
);
assert.equal(
moment.duration({seconds: 10}).humanize({thresholds: thresholds, withSuffix: true}),
'in a minute',
'10 seconds = a minute (with thresholds and suffix)'
);
assert.equal(
moment.duration({weeks: 3}).humanize({thresholds: {d: 7, w: 4}, withSuffix: true}),
'in 3 weeks',
'in 3 weeks = in 3 weeks (with thresholds and suffix)'
);
});

test('bubble value up', function (assert) {
Expand Down

0 comments on commit 757d4ff

Please sign in to comment.