Skip to content

Commit

Permalink
Merge pull request #4611 from thorn0:parse-without-fallback-2469
Browse files Browse the repository at this point in the history
[feature] Support for strict formatless parsing
  • Loading branch information
ichernev committed Apr 27, 2020
2 parents 4b615b9 + 6486033 commit 022dc03
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 4 deletions.
15 changes: 15 additions & 0 deletions 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 {
Expand Down
5 changes: 5 additions & 0 deletions src/lib/create/from-anything.js
Expand Up @@ -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;
Expand Down
11 changes: 7 additions & 4 deletions src/lib/create/from-string.js
Expand Up @@ -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;
Expand All @@ -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(
Expand Down
20 changes: 20 additions & 0 deletions src/test/moment/create.js
Expand Up @@ -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');

Expand Down
2 changes: 2 additions & 0 deletions typing-tests/moment-tests.ts
Expand Up @@ -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);
Expand Down

0 comments on commit 022dc03

Please sign in to comment.