icambron/twix.js

isValid() does not take locale into account

marduone opened this issue · 2 comments

It seems that twix isValid() does not check the validity of the moment objects themselves.
Moment 2.10.6
Twix 0.7.2

Consider the following:

> var moment = require('moment')
undefined
> require('twix')
{ [Function: Twix] _extend: [Function], formatTemplate: [Function] }
> moment.locale('es')
'es'
> var start = moment('15 Aug 2015', 'DD MMM YYYY')
undefined
> start.isValid()
false
> var end = moment('20 Aug 2015', 'DD MMM YYYY')
undefined
> end.isValid()
false
> var range = start.twix(end)
undefined
> range.format()
'Invalid date, Invalid date'
> range.isValid()
true
>
> start
{ [Number: 1421272800000]
  _isAMomentObject: true,
  _i: '15 Aug 2015',
  _f: 'DD MMM YYYY',
  _isUTC: false,
  _pf: 
   { empty: false,
     unusedTokens: [],
     unusedInput: [],
     overflow: -1,
     charsLeftOver: 0,
     nullInput: false,
     invalidMonth: 'Aug',
     invalidFormat: false,
     userInvalidated: false,
     iso: false },
  _locale: 
   { _months: 
      [ 'Enero',
        'Febrero',
        'Marzo',
        'Abril',
        'Mayo',
        'Junio',
        'Julio',
        'Agosto',
        'Septiembre',
        'Octubre',
        'Noviembre',
        'Diciembre' ],
     monthsShort: [Function],
     _weekdays: 
      [ 'Domingo',
        'Lunes',
        'Martes',
        'Miércoles',
        'Jueves',
        'Viernes',
        'Sábado' ],
     _weekdaysShort: [ 'Dom.', 'Lun.', 'Mar.', 'Mié.', 'Jue.', 'Vie.', 'Sáb.' ],
     _weekdaysMin: [ 'Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá' ],
     _longDateFormat: 
      { LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY H:mm',
        LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm' },
     _calendar: 
      { sameDay: [Function],
        nextDay: [Function],
        nextWeek: [Function],
        lastDay: [Function],
        lastWeek: [Function],
        sameElse: 'L' },
     _relativeTime: 
      { future: 'en %s',
        past: 'hace %s',
        s: 'unos segundos',
        m: 'un minuto',
        mm: '%d minutos',
        h: 'una hora',
        hh: '%d horas',
        d: 'un día',
        dd: '%d días',
        M: 'un mes',
        MM: '%d meses',
        y: 'un año',
        yy: '%d años' },
     _ordinalParse: /\d{1,2}º/,
     _ordinal: '%dº',
     _week: { dow: 1, doy: 4 },
     _abbr: 'es',
     _ordinalParseLenient: /\d{1,2}º|\d{1,2}/,
     _monthsParse: 
      [ /^Enero|^Ene/i,
        /^Febrero|^Feb/i,
        /^Marzo|^Mar/i,
        /^Abril|^Abr/i,
        /^Mayo|^May/i,
        /^Junio|^Jun/i,
        /^Julio|^Jul/i,
        /^Agosto|^Ago/i,
        /^Septiembre|^Sep/i,
        /^Octubre|^Oct/i,
        /^Noviembre|^Nov/i,
        /^Diciembre|^Dic/i ],
     _longMonthsParse: [],
     _shortMonthsParse: [] },
  _d: Thu Jan 15 2015 00:00:00 GMT+0200 (EET),
  _isValid: false }
>
> range
{ start: 
   { [Number: 1421272800000]
     _isAMomentObject: true,
     _i: '15 Aug 2015',
     _f: 'DD MMM YYYY',
     _isUTC: false,
     _pf: 
      { empty: false,
        unusedTokens: [],
        unusedInput: [],
        overflow: -1,
        charsLeftOver: 0,
        nullInput: false,
        invalidMonth: 'Aug',
        invalidFormat: false,
        userInvalidated: false,
        iso: false },
     _locale: 
      { _months: [Object],
        monthsShort: [Function],
        _weekdays: [Object],
        _weekdaysShort: [Object],
        _weekdaysMin: [Object],
        _longDateFormat: [Object],
        _calendar: [Object],
        _relativeTime: [Object],
        _ordinalParse: /\d{1,2}º/,
        _ordinal: '%dº',
        _week: [Object],
        _abbr: 'es',
        _ordinalParseLenient: /\d{1,2}º|\d{1,2}/,
        _monthsParse: [Object],
        _longMonthsParse: [],
        _shortMonthsParse: [] },
     _d: Thu Jan 15 2015 00:00:00 GMT+0200 (EET),
     _isValid: false },
  end: 
   { [Number: 1421704800000]
     _isAMomentObject: true,
     _i: '20 Aug 2015',
     _f: 'DD MMM YYYY',
     _isUTC: false,
     _pf: 
      { empty: false,
        unusedTokens: [],
        unusedInput: [],
        overflow: -1,
        charsLeftOver: 0,
        nullInput: false,
        invalidMonth: 'Aug',
        invalidFormat: false,
        userInvalidated: false,
        iso: false },
     _locale: 
      { _months: [Object],
        monthsShort: [Function],
        _weekdays: [Object],
        _weekdaysShort: [Object],
        _weekdaysMin: [Object],
        _longDateFormat: [Object],
        _calendar: [Object],
        _relativeTime: [Object],
        _ordinalParse: /\d{1,2}º/,
        _ordinal: '%dº',
        _week: [Object],
        _abbr: 'es',
        _ordinalParseLenient: /\d{1,2}º|\d{1,2}/,
        _monthsParse: [Object],
        _longMonthsParse: [],
        _shortMonthsParse: [] },
     _d: Tue Jan 20 2015 00:00:00 GMT+0200 (EET),
     _isValid: false },
  allDay: false,
  _trueStart: 
   { [Number: 1421272800000]
     _isAMomentObject: true,
     _i: '15 Aug 2015',
     _f: 'DD MMM YYYY',
     _isUTC: false,
     _pf: 
      { empty: false,
        unusedTokens: [],
        unusedInput: [],
        overflow: -1,
        charsLeftOver: 0,
        nullInput: false,
        invalidMonth: 'Aug',
        invalidFormat: false,
        userInvalidated: false,
        iso: false },
     _locale: 
      { _months: [Object],
        monthsShort: [Function],
        _weekdays: [Object],
        _weekdaysShort: [Object],
        _weekdaysMin: [Object],
        _longDateFormat: [Object],
        _calendar: [Object],
        _relativeTime: [Object],
        _ordinalParse: /\d{1,2}º/,
        _ordinal: '%dº',
        _week: [Object],
        _abbr: 'es',
        _ordinalParseLenient: /\d{1,2}º|\d{1,2}/,
        _monthsParse: [Object],
        _longMonthsParse: [],
        _shortMonthsParse: [] },
     _d: Thu Jan 15 2015 00:00:00 GMT+0200 (EET),
     _isValid: false },
  _lastMilli: 
   { [Number: 1421704800000]
     _isAMomentObject: true,
     _i: '20 Aug 2015',
     _f: 'DD MMM YYYY',
     _isUTC: false,
     _pf: 
      { empty: false,
        unusedTokens: [],
        unusedInput: [],
        overflow: -1,
        charsLeftOver: 0,
        nullInput: false,
        invalidMonth: 'Aug',
        invalidFormat: false,
        userInvalidated: false,
        iso: false },
     _locale: 
      { _months: [Object],
        monthsShort: [Function],
        _weekdays: [Object],
        _weekdaysShort: [Object],
        _weekdaysMin: [Object],
        _longDateFormat: [Object],
        _calendar: [Object],
        _relativeTime: [Object],
        _ordinalParse: /\d{1,2}º/,
        _ordinal: '%dº',
        _week: [Object],
        _abbr: 'es',
        _ordinalParseLenient: /\d{1,2}º|\d{1,2}/,
        _monthsParse: [Object],
        _longMonthsParse: [],
        _shortMonthsParse: [] },
     _d: Tue Jan 20 2015 00:00:00 GMT+0200 (EET),
     _isValid: false },
  _transferrableEnd: 
   { [Number: 1421704800000]
     _isAMomentObject: true,
     _i: '20 Aug 2015',
     _f: 'DD MMM YYYY',
     _isUTC: false,
     _pf: 
      { empty: false,
        unusedTokens: [],
        unusedInput: [],
        overflow: -1,
        charsLeftOver: 0,
        nullInput: false,
        invalidMonth: 'Aug',
        invalidFormat: false,
        userInvalidated: false,
        iso: false },
     _locale: 
      { _months: [Object],
        monthsShort: [Function],
        _weekdays: [Object],
        _weekdaysShort: [Object],
        _weekdaysMin: [Object],
        _longDateFormat: [Object],
        _calendar: [Object],
        _relativeTime: [Object],
        _ordinalParse: /\d{1,2}º/,
        _ordinal: '%dº',
        _week: [Object],
        _abbr: 'es',
        _ordinalParseLenient: /\d{1,2}º|\d{1,2}/,
        _monthsParse: [Object],
        _longMonthsParse: [],
        _shortMonthsParse: [] },
     _d: Tue Jan 20 2015 00:00:00 GMT+0200 (EET),
     _isValid: false },
  _displayEnd: 
   { [Number: 1421704800000]
     _isAMomentObject: true,
     _i: '20 Aug 2015',
     _f: 'DD MMM YYYY',
     _isUTC: false,
     _pf: 
      { empty: false,
        unusedTokens: [],
        unusedInput: [],
        overflow: -1,
        charsLeftOver: 0,
        nullInput: false,
        invalidMonth: 'Aug',
        invalidFormat: false,
        userInvalidated: false,
        iso: false },
     _locale: 
      { _months: [Object],
        monthsShort: [Function],
        _weekdays: [Object],
        _weekdaysShort: [Object],
        _weekdaysMin: [Object],
        _longDateFormat: [Object],
        _calendar: [Object],
        _relativeTime: [Object],
        _ordinalParse: /\d{1,2}º/,
        _ordinal: '%dº',
        _week: [Object],
        _abbr: 'es',
        _ordinalParseLenient: /\d{1,2}º|\d{1,2}/,
        _monthsParse: [Object],
        _longMonthsParse: [],
        _shortMonthsParse: [] },
     _d: Tue Jan 20 2015 00:00:00 GMT+0200 (EET),
     _isValid: false } }

Hmm, yeah, I'd accept a PR that checks that the start and end times are valid in isValid().

Fixed in the develop branch. Will go into the next release (probably 0.8.1)