From fdde971ccf9ac81724c9653c30d81aa1043ee87b Mon Sep 17 00:00:00 2001 From: Lucas Sanders Date: Sat, 18 Mar 2017 22:49:28 -0400 Subject: [PATCH] Fix Duration#isValid after #add or #subtract Also make the Duration#add and Duration#subtract implementations internally immutable (so we don't need to wrap them for the prototype). --- src/lib/duration/add-subtract.js | 18 +++++++++++------- src/lib/duration/prototype.js | 4 ++-- src/test/moment/duration_invalid.js | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/lib/duration/add-subtract.js b/src/lib/duration/add-subtract.js index 3b44e186f..bfc1a3723 100644 --- a/src/lib/duration/add-subtract.js +++ b/src/lib/duration/add-subtract.js @@ -1,13 +1,17 @@ +import { isDuration } from './constructor'; import { createDuration } from './create'; +import { createInvalid } from './valid'; function addSubtract (duration, input, value, direction) { - var other = createDuration(input, value); - - duration._milliseconds += direction * other._milliseconds; - duration._days += direction * other._days; - duration._months += direction * other._months; - - return duration._bubble(); + var other = isDuration(input) ? input : createDuration(input, value); + if (!duration.isValid() || !other.isValid()) { + return createInvalid(); + } + return createDuration({ + ms: duration._milliseconds + direction * other._milliseconds, + d: duration._days + direction * other._days, + M: duration._months + direction * other._months + }); } // supports only 2.0-style add(1, 's') or add(duration) diff --git a/src/lib/duration/prototype.js b/src/lib/duration/prototype.js index 7eaca4461..ff6c70ae7 100644 --- a/src/lib/duration/prototype.js +++ b/src/lib/duration/prototype.js @@ -15,8 +15,8 @@ import { isValid } from './valid'; proto.isValid = isValid; proto.abs = abs; -proto.add = wrap(Duration, add); -proto.subtract = wrap(Duration, subtract); +proto.add = add; +proto.subtract = subtract; proto.as = as; proto.asMilliseconds = asMilliseconds; proto.asSeconds = asSeconds; diff --git a/src/test/moment/duration_invalid.js b/src/test/moment/duration_invalid.js index 4b023a880..acfe3c02a 100644 --- a/src/test/moment/duration_invalid.js +++ b/src/test/moment/duration_invalid.js @@ -1,7 +1,7 @@ import { module, test } from '../qunit'; import moment from '../../moment'; -module('invalid'); +module('duration invalid'); test('invalid duration', function (assert) { var m = moment.duration.invalid(); // should be invalid -- 2.47.2