ZodのemailバリデーションでRFCで違反はないのにエラーになってしまった話

ZodのEmailバリデーションでとくに問題ないメールアドレスなのにエラーっていわれてしまった。
Zodのバージョンは [email protected] なので 2023/08/01時点で最新かと思います。
そのようなメールアドレスが問題なのか?
[email protected]
上記のメールアドレスにおいて、ドメイン部のハイフンがエラーになると怒らました。
どうやら c.email.polidog.jp もしくは em-ail.polidog.jp なら問題ないようです。
問題はなにか?
メールアドレス用の正規表現に問題があるようです。
https://github.com/colinhacks/zod/blob/22f3cc6ed52a28c984a0319a1a03e1af244cee02/src/types.ts#L553
どの用に対処するべきか?
じつはmasterブランチではこの問題は修正されています。
https://github.com/colinhacks/zod/blob/78a409012a4dc34a455f5c4a7e028ca47c921e1b/src/types.ts#L560
自分の場合は email() を使わずに regex() でメールアドレスのバリデーションをするように修正しました。
そのうち新しいバージョンがリリースされたら再度 email() を使うと思っています。
// export const loginSchema = z.object({
// email: z.string().regex(/^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, { message: '不正なメールアドレスです' }),
// password: z
// .string()
// .nonempty({ message: 'パスワードを入力してください' }),
//})
追記
上記の正規表現にはReDoS脆弱性があると @wwwdddw1 さんから教えていただきました!!!
https://twitter.com/wwwdddw1/status/1709948651588796782
こちらzod本体でも脆弱性の指摘、及び修正が入っています。
https://github.com/colinhacks/zod/issues/2609
最新のコードは修正されているようです。
https://github.com/colinhacks/zod/pull/2824
https://github.com/colinhacks/zod/blob/master/src/types.ts#L567
ということで基本zodは最新のバージョンを使うのが望ましいかと思います。
ただし何かしらの理由でアップデートできない場合は下記の正規表現で対応できるかと思います。
export const loginSchema = z.object({
email: z.string().regex(/^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, { message: '不正なメールアドレスです' }),
password: z
.string()
.nonempty({ message: 'パスワードを入力してください' }),
})