From 72d155325bfa1fc4dc2b3a7ba11ef0bf12b3322f Mon Sep 17 00:00:00 2001 From: AnatoleLucet Date: Mon, 12 Dec 2022 23:13:14 +0100 Subject: [PATCH] fix: #1668 email regex safari compat --- deno/lib/__tests__/string.test.ts | 6 ++++-- deno/lib/types.ts | 2 +- src/__tests__/string.test.ts | 6 ++++-- src/types.ts | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/deno/lib/__tests__/string.test.ts b/deno/lib/__tests__/string.test.ts index f45ec0ad8..b71ab9757 100644 --- a/deno/lib/__tests__/string.test.ts +++ b/deno/lib/__tests__/string.test.ts @@ -38,8 +38,10 @@ test("email validations", () => { expect(() => email.parse("asdf")).toThrow(); expect(() => email.parse("@lkjasdf.com")).toThrow(); expect(() => email.parse("asdf@sdf.")).toThrow(); - // expect(() => email.parse("asdf@asdf.com-")).toThrow(); - // expect(() => email.parse("asdf@-asdf.com")).toThrow(); + expect(() => email.parse("asdf@asdf.com-")).toThrow(); + expect(() => email.parse("asdf@-asdf.com")).toThrow(); + expect(() => email.parse("asdf@-a(sdf.com")).toThrow(); + expect(() => email.parse("asdf@-asdf.com(")).toThrow(); }); test("more email validations", () => { diff --git a/deno/lib/types.ts b/deno/lib/types.ts index 59680c296..c272fb944 100644 --- a/deno/lib/types.ts +++ b/deno/lib/types.ts @@ -515,7 +515,7 @@ const uuidRegex = // const emailRegex = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i; // eslint-disable-next-line const emailRegex = - /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; + /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@((?!-)([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{1,})[^-<>()[\].,;:\s@"]$/i; // interface IsDateStringOptions extends StringDateOptions { /** diff --git a/src/__tests__/string.test.ts b/src/__tests__/string.test.ts index 28e4049a9..31df263c7 100644 --- a/src/__tests__/string.test.ts +++ b/src/__tests__/string.test.ts @@ -37,8 +37,10 @@ test("email validations", () => { expect(() => email.parse("asdf")).toThrow(); expect(() => email.parse("@lkjasdf.com")).toThrow(); expect(() => email.parse("asdf@sdf.")).toThrow(); - // expect(() => email.parse("asdf@asdf.com-")).toThrow(); - // expect(() => email.parse("asdf@-asdf.com")).toThrow(); + expect(() => email.parse("asdf@asdf.com-")).toThrow(); + expect(() => email.parse("asdf@-asdf.com")).toThrow(); + expect(() => email.parse("asdf@-a(sdf.com")).toThrow(); + expect(() => email.parse("asdf@-asdf.com(")).toThrow(); }); test("more email validations", () => { diff --git a/src/types.ts b/src/types.ts index ef27ec585..314ff546f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -515,7 +515,7 @@ const uuidRegex = // const emailRegex = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i; // eslint-disable-next-line const emailRegex = - /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; + /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@((?!-)([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{1,})[^-<>()[\].,;:\s@"]$/i; // interface IsDateStringOptions extends StringDateOptions { /**