angular / angular/components

bug(LuxonDateAdapter): LuxonDateAdapter.parse() returns valid date even though none of the given input date formats is matched

Ouverte
#25,590 7 commentaires 6 réactions 0 personnes assignées Voir sur GitHub
area: material/datepicker P3
Langage dominant
TypeScript
Étoiles
25k
Forks
6.8k
Merge moyen
1 j 8 h
PR mergées (30 j)
91

Description

### Is this a regression?

- [ ] Yes, this behavior used to work in the previous version

### The previous version in which this bug was not present was

_No response_

### Description

The "parse" function in the **LuxonDateAdapter** tries to parse any input as a **iso8601** date before it matches the given input formats.

For Example, if I declare ['d.L.yy', 'd-L-yy'] as valid input formats, I would expect that only dates using the separators "." and "-"
are valid input dates.
But due to the iso8601 parse a simple number input (eg. 12) will return a valid date, most times today.
You can see the iso8601 parse and return on line 162 of [luxon-date-.adapter.ts](https://github.com/angular/components/blob/main/src/material-luxon-adapter/adapter/luxon-date-adapter.ts)
Where as the formats are checked later on line 174.

```
parse(value: any, parseFormat: string | string[]): LuxonDateTime | null {
const options: LuxonDateTimeOptions = this._getOptions();

if (typeof value == 'string' && value.length > 0) {
const iso8601Date = LuxonDateTime.fromISO(value, options);

if (this.isValid(iso8601Date)) {
return iso8601Date; // This return is without any parseFormat check !!!!!!
}

const formats = Array.isArray(parseFormat) ? parseFormat : [parseFormat];

if (!parseFormat.length) {
throw Error('Formats array must not be empty.');
}

for (const format of formats) {
const fromFormat = LuxonDateTime.fromFormat(value, format, options); // Here are the formats checked

if (this.isValid(fromFormat)) {
return fromFormat;
}
}

return this.invalid();
} else if (typeof value === 'number') {
return LuxonDateTime.fromMillis(value, options);
} else if (value instanceof Date) {
return LuxonDateTime.fromJSDate(value, options);
} else if (value instanceof LuxonDateTime) {
return LuxonDateTime.fromMillis(value.toMillis(), options);
}

return null;
}
```

This parsing without any regard for the given input parseFormat seems to be incorrect.

### Reproduction

There is test in [luxon-date-adapter,spec.ts](https://github.com/angular/components/blob/main/src/material-luxon-adapter/adapter/luxon-date-adapter.spec.ts) on line 310 which shows the behaviour . The input format is LL/dd/yyyy, but just a number is given.

### Expected Behavior

The test mentioned above should return an invalid date, because the given parseFormat is not matched.

### Actual Behavior

The function returns a valid ISO date, based on the number.

### Environment

"@angular/animations": "12.2.16",
"@angular/cdk": "12.2.13",
"@angular/common": "12.2.16",
"@angular/compiler": "12.2.16",
"@angular/core": "12.2.16",
"@angular/forms": "12.2.16",
"@angular/material": "12.2.13",
"@angular/material-luxon-adapter": "12.2.13",
"@angular/platform-browser": "12.2.16",
"@angular/platform-browser-dynamic": "12.2.16",
"@angular/router": "12.2.16",
"luxon": "2.3.0",

Above are the versios we are using in our code, but the code pasted in the description is from the current @angular/material-luxon-adapter, so the bug is still there.

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez dans src/material-luxon-adapter/adapter/luxon-date-adapter.ts, au niveau de LuxonDateAdapter.parse(), puis lisez la reproduction autour de la ligne 310 dans luxon-date-adapter.spec.ts. Exécutez les tests de l’adaptateur de dates Luxon et vérifiez qu’une entrée qui ne correspond pas au format fourni renvoie une date invalide plutôt qu’une date ISO valide.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
angular, typescript
Domaine
frontend, testing
Type d'issue
Bug
Difficulté
2/5
Temps estimé
1-3 heures
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.