Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

z.date({ coerce: 'iso' }) #3646

Open
wants to merge 3 commits into
base: v4
Choose a base branch
from
Open

z.date({ coerce: 'iso' }) #3646

wants to merge 3 commits into from

Conversation

mmkal
Copy link
Contributor

@mmkal mmkal commented Jul 17, 2024

Closes #3643

I got one whole 👍 on that issue and I think it's a good idea so opening a PR.


hi - I find z.date({ coerce: true }) very useful when using with trpc or another tool that uses JSON to cross an i/o boundary. Because, it forces the client to use a Date value - which is then serialized via its toJSON method into an ISO string and correctly converted back to a Date on the other side. So you get nice Date types on either side of the boundary.

But a not-ideal effect of using that trick is that it will also accept values like null and 0 which both parse to 1970-01-01T00:00:00.000Z, so it's a bit dangerous.

The change here is to change coerce: boolean to coerce: boolean | 'iso', then update this block:

zod/src/types.ts

Lines 1798 to 1800 in 9257ab7

if (this._def.coerce) {
input.data = new Date(input.data);
}

This PR makes that type change, and implements it by using new Date(...) and checking that the original input exactly matches the resultant .toISOString() value.

It also adds some tests to 1) highlight the danger of coerce: true and 2) make sure everything works sensibly with coerce: 'iso'.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant