From 6486033d296fced492e5f765fdad4e87b78ec1ef Mon Sep 17 00:00:00 2001 From: Georgii Dolzhykov Date: Fri, 4 May 2018 19:16:21 +0300 Subject: [PATCH] [feature] Support for `moment(String, true)` Closes #2469 --- moment.d.ts | 15 +++++++++++++++ src/lib/create/from-anything.js | 5 +++++ src/lib/create/from-string.js | 11 +++++++---- src/test/moment/create.js | 20 ++++++++++++++++++++ typing-tests/moment-tests.ts | 2 ++ 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/moment.d.ts b/moment.d.ts index 78a76b2adc..c676fad37b 100644 --- a/moment.d.ts +++ b/moment.d.ts @@ -1,4 +1,19 @@ +/** + * @param strict Strict parsing disables the deprecated fallback to the native Date constructor when + * parsing a string. + */ +declare function moment(inp?: moment.MomentInput, strict?: boolean): moment.Moment; +/** + * @param strict Strict parsing requires that the format and input match exactly, including delimeters. + * Strict parsing is frequently the best parsing option. For more information about choosing strict vs + * forgiving parsing, see the [parsing guide](https://momentjs.com/guides/#/parsing/). + */ declare function moment(inp?: moment.MomentInput, format?: moment.MomentFormatSpecification, strict?: boolean): moment.Moment; +/** + * @param strict Strict parsing requires that the format and input match exactly, including delimeters. + * Strict parsing is frequently the best parsing option. For more information about choosing strict vs + * forgiving parsing, see the [parsing guide](https://momentjs.com/guides/#/parsing/). + */ declare function moment(inp?: moment.MomentInput, format?: moment.MomentFormatSpecification, language?: string, strict?: boolean): moment.Moment; declare namespace moment { diff --git a/src/lib/create/from-anything.js b/src/lib/create/from-anything.js index f501de6c55..0c5d772364 100644 --- a/src/lib/create/from-anything.js +++ b/src/lib/create/from-anything.js @@ -88,6 +88,11 @@ function configFromInput(config) { export function createLocalOrUTC(input, format, locale, strict, isUTC) { var c = {}; + if (format === true || format === false) { + strict = format; + format = undefined; + } + if (locale === true || locale === false) { strict = locale; locale = undefined; diff --git a/src/lib/create/from-string.js b/src/lib/create/from-string.js index 99a7fe0aa0..dd1ff9d9f8 100644 --- a/src/lib/create/from-string.js +++ b/src/lib/create/from-string.js @@ -214,10 +214,9 @@ export function configFromRFC2822(config) { } } -// date from iso format or fallback +// date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict export function configFromString(config) { var matched = aspNetJsonRegex.exec(config._i); - if (matched !== null) { config._d = new Date(+matched[1]); return; @@ -237,8 +236,12 @@ export function configFromString(config) { return; } - // Final attempt, use Input Fallback - hooks.createFromInputFallback(config); + if (config._strict) { + config._isValid = false; + } else { + // Final attempt, use Input Fallback + hooks.createFromInputFallback(config); + } } hooks.createFromInputFallback = deprecate( diff --git a/src/test/moment/create.js b/src/test/moment/create.js index 9be49fef06..d2966323b2 100644 --- a/src/test/moment/create.js +++ b/src/test/moment/create.js @@ -347,6 +347,26 @@ test('string without format - json', function (assert) { ); }); +test('string without format - strict parsing', function (assert) { + assert.equal( + moment('Date(1325132654000)', false).valueOf(), + 1325132654000, + 'Date(1325132654000)' + ); + assert.equal( + moment('Date(1325132654000)', true).valueOf(), + 1325132654000, + 'Date(1325132654000)' + ); + assert.equal( + moment('/Date(1325132654000)/', true).valueOf(), + 1325132654000, + '/Date(1325132654000)/' + ); + assert.equal(moment('1/1/2001', true).isValid(), false, '1/1/2001'); + assert.equal(moment.utc('1/1/2001', true).isValid(), false, '1/1/2001 utc'); +}); + test('string with format dropped am/pm bug', function (assert) { moment.locale('en'); diff --git a/typing-tests/moment-tests.ts b/typing-tests/moment-tests.ts index 6d4d1635f5..41cff85cf6 100644 --- a/typing-tests/moment-tests.ts +++ b/typing-tests/moment-tests.ts @@ -23,6 +23,8 @@ var day10 = moment([2010, 6, 10]); var array = [2010, 1, 14, 15, 25, 50, 125]; var day11 = moment(Date.UTC.apply({}, array)); var day12 = moment.unix(1318781876); +var day13 = moment("/Date(1198908717056-0700)/", true); +var day14 = moment("foobazbar", 'L', true); // TODO: reenable in 2.0 // moment(null);