mirror of https://github.com/cupcakearmy/zod.git
Make email regex reasonable (#2157)
* Remove logging * Clean up email testsg * Add back 1char tld test * Final tweaks to email regex * Fix test * Update test
This commit is contained in:
parent
af08390139
commit
36fef58410
|
@ -39,70 +39,97 @@ test("failing validations", () => {
|
|||
});
|
||||
|
||||
test("email validations", () => {
|
||||
const email = z.string().email();
|
||||
email.parse("mojojojo@example.com");
|
||||
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@-a(sdf.com")).toThrow();
|
||||
expect(() => email.parse("asdf@-asdf.com(")).toThrow();
|
||||
expect(() =>
|
||||
email.parse("pawan.anand@%9y83&#$%R&#$%R&%#$R%%^^%5rw3ewe.d.d.aaaa.wef.co")
|
||||
).toThrow();
|
||||
});
|
||||
|
||||
test("more email validations", () => {
|
||||
const validEmails = [
|
||||
`email@domain.com`,
|
||||
`firstname.lastname@domain.com`,
|
||||
`email@subdomain.domain.com`,
|
||||
`firstname+lastname@domain.com`,
|
||||
`1234567890@domain.com`,
|
||||
`email@domain-one.com`,
|
||||
`_______@domain.com`,
|
||||
`email@domain.name`,
|
||||
`email@domain.co.jp`,
|
||||
`firstname-lastname@domain.com`,
|
||||
`very.common@example.com`,
|
||||
`disposable.style.email.with+symbol@example.com`,
|
||||
`other.email-with-hyphen@example.com`,
|
||||
`fully-qualified-domain@example.com`,
|
||||
`user.name+tag+sorting@example.com`,
|
||||
`x@example.com`,
|
||||
`mojojojo@asdf.example.com`,
|
||||
`example-indeed@strange-example.com`,
|
||||
`test/test@test.com`,
|
||||
`example@s.example`,
|
||||
`" "@example.org`,
|
||||
`"john..doe"@example.org`,
|
||||
`mailhost!username@example.org`,
|
||||
`"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com`,
|
||||
`user%example.com@example.org`,
|
||||
`user-@example.org`,
|
||||
`postmaster@[123.123.123.123]`,
|
||||
`user@my-example.com`,
|
||||
`a@b.cd`,
|
||||
`work+user@mail.com`,
|
||||
`tom@test.te-st.com`,
|
||||
`something@subdomain.domain-with-hyphens.tld`,
|
||||
`francois@etu.inp-n7.fr`,
|
||||
];
|
||||
const invalidEmails = [
|
||||
// no "printable characters"
|
||||
// `user%example.com@example.org`,
|
||||
// `mailhost!username@example.org`,
|
||||
// `test/test@test.com`,
|
||||
|
||||
// double @
|
||||
`francois@@etu.inp-n7.fr`,
|
||||
// do not support quotes
|
||||
`"email"@domain.com`,
|
||||
`"e asdf sadf ?<>ail"@domain.com`,
|
||||
`" "@example.org`,
|
||||
`"john..doe"@example.org`,
|
||||
`"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com`,
|
||||
|
||||
// do not support IPv4
|
||||
`email@123.123.123.123`,
|
||||
`email@[123.123.123.123]`,
|
||||
`postmaster@123.123.123.123`,
|
||||
`user@[68.185.127.196]`,
|
||||
`ipv4@[85.129.96.247]`,
|
||||
`valid@[79.208.229.53]`,
|
||||
`valid@[255.255.255.255]`,
|
||||
`valid@[255.0.55.2]`,
|
||||
`valid@[255.0.55.2]`,
|
||||
|
||||
// do not support ipv6
|
||||
`hgrebert0@[IPv6:4dc8:ac7:ce79:8878:1290:6098:5c50:1f25]`,
|
||||
`bshapiro4@[IPv6:3669:c709:e981:4884:59a3:75d1:166b:9ae]`,
|
||||
`jsmith@[IPv6:2001:db8::1]`,
|
||||
`postmaster@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]`,
|
||||
`postmaster@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:192.168.1.1]`,
|
||||
`test@any.th1ng.com`,
|
||||
`me@y.z.com`,
|
||||
`me@y.z.co.jp`,
|
||||
`example@subdomain.hyphenated-domain.com`,
|
||||
`example@atlanta.k12.ga.us`,
|
||||
`a.b@c.d`,
|
||||
];
|
||||
const invalidEmails = [
|
||||
|
||||
// microsoft test cases
|
||||
`plainaddress`,
|
||||
`#@%^%#$@#$@#.com`,
|
||||
`@domain.com`,
|
||||
`Joe Smith <email@domain.com>`,
|
||||
`email.domain.com`,
|
||||
`email@domain@domain.com`,
|
||||
`.email@domain.com`,
|
||||
`email.@domain.com`,
|
||||
`email..email@domain.com`,
|
||||
`あいうえお@domain.com`,
|
||||
`email@domain.com (Joe Smith)`,
|
||||
`email@domain`,
|
||||
`email@-domain.com`,
|
||||
`email@111.222.333.44444`,
|
||||
`email@domain..com`,
|
||||
`Abc.example.com`,
|
||||
`A@b@c@example.com`,
|
||||
`colin..hacks@domain.com`,
|
||||
`a"b(c)d,e:f;g<h>i[j\k]l@example.com`,
|
||||
`just"not"right@example.com`,
|
||||
`this is"not\allowed@example.com`,
|
||||
`this\ still\"not\\allowed@example.com`,
|
||||
|
||||
// random
|
||||
`i_like_underscore@but_its_not_allowed_in_this_part.example.com`,
|
||||
`QA[icon]CHOCOLATE[icon]@test.com`,
|
||||
`invalid@-start.com`,
|
||||
`invalid@end.com-`,
|
||||
`a.b@c.d`,
|
||||
`invalid@[1.1.1.-1]`,
|
||||
`invalid@[68.185.127.196.55]`,
|
||||
`temp@[192.168.1]`,
|
||||
|
@ -121,13 +148,16 @@ test("more email validations", () => {
|
|||
`test@.com`,
|
||||
];
|
||||
const emailSchema = z.string().email();
|
||||
|
||||
expect(
|
||||
validEmails.every((email) => emailSchema.safeParse(email).success)
|
||||
validEmails.every((email) => {
|
||||
return emailSchema.safeParse(email).success;
|
||||
})
|
||||
).toBe(true);
|
||||
expect(
|
||||
invalidEmails.every(
|
||||
(email) => emailSchema.safeParse(email).success === false
|
||||
)
|
||||
invalidEmails.every((email) => {
|
||||
return emailSchema.safeParse(email).success === false;
|
||||
})
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
|
|
|
@ -551,9 +551,17 @@ const uuidRegex =
|
|||
//old email regex
|
||||
// const emailRegex = /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@((?!-)([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{1,})[^-<>()[\].,;:\s@"]$/i;
|
||||
// eslint-disable-next-line
|
||||
|
||||
// const emailRegex =
|
||||
// /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\])|(\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\.[A-Za-z]{2,})+))$/;
|
||||
// const emailRegex =
|
||||
// /^[a-zA-Z0-9\.\!\#\$\%\&\'\*\+\/\=\?\^\_\`\{\|\}\~\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
||||
// const emailRegex =
|
||||
// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i;
|
||||
const emailRegex =
|
||||
/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\])|(\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\])|([A-Za-z0-9]\.?([A-Za-z0-9-]+\.)*([A-Za-z0-9-])*[A-Za-z0-9]))$/;
|
||||
/^([A-Z0-9_+-]+\.?)*[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i;
|
||||
// const emailRegex =
|
||||
// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\.[a-z0-9\-]+)*$/i;
|
||||
|
||||
// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression
|
||||
const emojiRegex = /^(\p{Extended_Pictographic}|\p{Emoji_Component})+$/u;
|
||||
|
||||
|
@ -4174,7 +4182,10 @@ export class ZodPromise<T extends ZodTypeAny> extends ZodType<
|
|||
//////////////////////////////////////////////
|
||||
|
||||
export type Refinement<T> = (arg: T, ctx: RefinementCtx) => any;
|
||||
export type SuperRefinement<T> = (arg: T, ctx: RefinementCtx) => void | Promise<void>;
|
||||
export type SuperRefinement<T> = (
|
||||
arg: T,
|
||||
ctx: RefinementCtx
|
||||
) => void | Promise<void>;
|
||||
|
||||
export type RefinementEffect<T> = {
|
||||
type: "refinement";
|
||||
|
|
128
playground.ts
128
playground.ts
|
@ -1,2 +1,130 @@
|
|||
import { z } from "./src";
|
||||
z;
|
||||
|
||||
const validEmails = [
|
||||
`email@domain.com`,
|
||||
`firstname.lastname@domain.com`,
|
||||
`email@subdomain.domain.com`,
|
||||
`firstname+lastname@domain.com`,
|
||||
`1234567890@domain.com`,
|
||||
`email@domain-one.com`,
|
||||
`_______@domain.com`,
|
||||
`email@domain.name`,
|
||||
`email@domain.co.jp`,
|
||||
`firstname-lastname@domain.com`,
|
||||
`very.common@example.com`,
|
||||
`disposable.style.email.with+symbol@example.com`,
|
||||
`other.email-with-hyphen@example.com`,
|
||||
`fully-qualified-domain@example.com`,
|
||||
`user.name+tag+sorting@example.com`,
|
||||
`x@example.com`,
|
||||
`mojojojo@asdf.example.com`,
|
||||
`example-indeed@strange-example.com`,
|
||||
`example@s.example`,
|
||||
`user-@example.org`,
|
||||
`user@my-example.com`,
|
||||
`a@b.cd`,
|
||||
`work+user@mail.com`,
|
||||
`tom@test.te-st.com`,
|
||||
`something@subdomain.domain-with-hyphens.tld`,
|
||||
`francois@etu.inp-n7.fr`,
|
||||
];
|
||||
const invalidEmails = [
|
||||
// no "printable characters"
|
||||
// `user%example.com@example.org`,
|
||||
// `mailhost!username@example.org`,
|
||||
// `test/test@test.com`,
|
||||
|
||||
// double @
|
||||
`francois@@etu.inp-n7.fr`,
|
||||
|
||||
// do not support quotes
|
||||
`"email"@domain.com`,
|
||||
`"e asdf sadf ?<>ail"@domain.com`,
|
||||
`" "@example.org`,
|
||||
`"john..doe"@example.org`,
|
||||
`"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com`,
|
||||
|
||||
// do not support IPv4
|
||||
`email@123.123.123.123`,
|
||||
`email@[123.123.123.123]`,
|
||||
`postmaster@123.123.123.123`,
|
||||
`user@[68.185.127.196]`,
|
||||
`ipv4@[85.129.96.247]`,
|
||||
`valid@[79.208.229.53]`,
|
||||
`valid@[255.255.255.255]`,
|
||||
`valid@[255.0.55.2]`,
|
||||
`valid@[255.0.55.2]`,
|
||||
|
||||
// do not support ipv6
|
||||
`hgrebert0@[IPv6:4dc8:ac7:ce79:8878:1290:6098:5c50:1f25]`,
|
||||
`bshapiro4@[IPv6:3669:c709:e981:4884:59a3:75d1:166b:9ae]`,
|
||||
`jsmith@[IPv6:2001:db8::1]`,
|
||||
`postmaster@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]`,
|
||||
`postmaster@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:192.168.1.1]`,
|
||||
|
||||
// microsoft test cases
|
||||
`plainaddress`,
|
||||
`#@%^%#$@#$@#.com`,
|
||||
`@domain.com`,
|
||||
`Joe Smith <email@domain.com>`,
|
||||
`email.domain.com`,
|
||||
`email@domain@domain.com`,
|
||||
`.email@domain.com`,
|
||||
`email.@domain.com`,
|
||||
`email..email@domain.com`,
|
||||
`あいうえお@domain.com`,
|
||||
`email@domain.com (Joe Smith)`,
|
||||
`email@domain`,
|
||||
`email@-domain.com`,
|
||||
`email@111.222.333.44444`,
|
||||
`email@domain..com`,
|
||||
`Abc.example.com`,
|
||||
`A@b@c@example.com`,
|
||||
`colin..hacks@domain.com`,
|
||||
`a"b(c)d,e:f;g<h>i[j\k]l@example.com`,
|
||||
`just"not"right@example.com`,
|
||||
`this is"not\allowed@example.com`,
|
||||
`this\ still\"not\\allowed@example.com`,
|
||||
|
||||
// random
|
||||
`i_like_underscore@but_its_not_allowed_in_this_part.example.com`,
|
||||
`QA[icon]CHOCOLATE[icon]@test.com`,
|
||||
`invalid@-start.com`,
|
||||
`invalid@end.com-`,
|
||||
`a.b@c.d`,
|
||||
`invalid@[1.1.1.-1]`,
|
||||
`invalid@[68.185.127.196.55]`,
|
||||
`temp@[192.168.1]`,
|
||||
`temp@[9.18.122.]`,
|
||||
`double..point@test.com`,
|
||||
`asdad@test..com`,
|
||||
`asdad@hghg...sd...au`,
|
||||
`asdad@hghg........au`,
|
||||
`invalid@[256.2.2.48]`,
|
||||
`invalid@[256.2.2.48]`,
|
||||
`invalid@[999.465.265.1]`,
|
||||
`jkibbey4@[IPv6:82c4:19a8::70a9:2aac:557::ea69:d985:28d]`,
|
||||
`mlivesay3@[9952:143f:b4df:2179:49a1:5e82:b92e:6b6]`,
|
||||
`gbacher0@[IPv6:bc37:4d3f:5048:2e26:37cc:248e:df8e:2f7f:af]`,
|
||||
`invalid@[IPv6:5348:4ed3:5d38:67fb:e9b:acd2:c13:192.168.256.1]`,
|
||||
];
|
||||
|
||||
const emailSchema = z.string().email();
|
||||
console.log(
|
||||
validEmails.every((email) => {
|
||||
const val = emailSchema.safeParse(email).success;
|
||||
if (!val) console.log(`fail`, email);
|
||||
return val;
|
||||
})
|
||||
);
|
||||
// for (const email of validEmails) {
|
||||
// console.log("good", email);
|
||||
// emailSchema.parse(email);
|
||||
// }
|
||||
for (const email of invalidEmails) {
|
||||
try {
|
||||
emailSchema.parse(email);
|
||||
console.log(`PASS`, email);
|
||||
} catch (_) {}
|
||||
}
|
||||
|
|
|
@ -38,70 +38,97 @@ test("failing validations", () => {
|
|||
});
|
||||
|
||||
test("email validations", () => {
|
||||
const email = z.string().email();
|
||||
email.parse("mojojojo@example.com");
|
||||
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@-a(sdf.com")).toThrow();
|
||||
expect(() => email.parse("asdf@-asdf.com(")).toThrow();
|
||||
expect(() =>
|
||||
email.parse("pawan.anand@%9y83&#$%R&#$%R&%#$R%%^^%5rw3ewe.d.d.aaaa.wef.co")
|
||||
).toThrow();
|
||||
});
|
||||
|
||||
test("more email validations", () => {
|
||||
const validEmails = [
|
||||
`email@domain.com`,
|
||||
`firstname.lastname@domain.com`,
|
||||
`email@subdomain.domain.com`,
|
||||
`firstname+lastname@domain.com`,
|
||||
`1234567890@domain.com`,
|
||||
`email@domain-one.com`,
|
||||
`_______@domain.com`,
|
||||
`email@domain.name`,
|
||||
`email@domain.co.jp`,
|
||||
`firstname-lastname@domain.com`,
|
||||
`very.common@example.com`,
|
||||
`disposable.style.email.with+symbol@example.com`,
|
||||
`other.email-with-hyphen@example.com`,
|
||||
`fully-qualified-domain@example.com`,
|
||||
`user.name+tag+sorting@example.com`,
|
||||
`x@example.com`,
|
||||
`mojojojo@asdf.example.com`,
|
||||
`example-indeed@strange-example.com`,
|
||||
`test/test@test.com`,
|
||||
`example@s.example`,
|
||||
`" "@example.org`,
|
||||
`"john..doe"@example.org`,
|
||||
`mailhost!username@example.org`,
|
||||
`"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com`,
|
||||
`user%example.com@example.org`,
|
||||
`user-@example.org`,
|
||||
`postmaster@[123.123.123.123]`,
|
||||
`user@my-example.com`,
|
||||
`a@b.cd`,
|
||||
`work+user@mail.com`,
|
||||
`tom@test.te-st.com`,
|
||||
`something@subdomain.domain-with-hyphens.tld`,
|
||||
`francois@etu.inp-n7.fr`,
|
||||
];
|
||||
const invalidEmails = [
|
||||
// no "printable characters"
|
||||
// `user%example.com@example.org`,
|
||||
// `mailhost!username@example.org`,
|
||||
// `test/test@test.com`,
|
||||
|
||||
// double @
|
||||
`francois@@etu.inp-n7.fr`,
|
||||
// do not support quotes
|
||||
`"email"@domain.com`,
|
||||
`"e asdf sadf ?<>ail"@domain.com`,
|
||||
`" "@example.org`,
|
||||
`"john..doe"@example.org`,
|
||||
`"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com`,
|
||||
|
||||
// do not support IPv4
|
||||
`email@123.123.123.123`,
|
||||
`email@[123.123.123.123]`,
|
||||
`postmaster@123.123.123.123`,
|
||||
`user@[68.185.127.196]`,
|
||||
`ipv4@[85.129.96.247]`,
|
||||
`valid@[79.208.229.53]`,
|
||||
`valid@[255.255.255.255]`,
|
||||
`valid@[255.0.55.2]`,
|
||||
`valid@[255.0.55.2]`,
|
||||
|
||||
// do not support ipv6
|
||||
`hgrebert0@[IPv6:4dc8:ac7:ce79:8878:1290:6098:5c50:1f25]`,
|
||||
`bshapiro4@[IPv6:3669:c709:e981:4884:59a3:75d1:166b:9ae]`,
|
||||
`jsmith@[IPv6:2001:db8::1]`,
|
||||
`postmaster@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]`,
|
||||
`postmaster@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:192.168.1.1]`,
|
||||
`test@any.th1ng.com`,
|
||||
`me@y.z.com`,
|
||||
`me@y.z.co.jp`,
|
||||
`example@subdomain.hyphenated-domain.com`,
|
||||
`example@atlanta.k12.ga.us`,
|
||||
`a.b@c.d`,
|
||||
];
|
||||
const invalidEmails = [
|
||||
|
||||
// microsoft test cases
|
||||
`plainaddress`,
|
||||
`#@%^%#$@#$@#.com`,
|
||||
`@domain.com`,
|
||||
`Joe Smith <email@domain.com>`,
|
||||
`email.domain.com`,
|
||||
`email@domain@domain.com`,
|
||||
`.email@domain.com`,
|
||||
`email.@domain.com`,
|
||||
`email..email@domain.com`,
|
||||
`あいうえお@domain.com`,
|
||||
`email@domain.com (Joe Smith)`,
|
||||
`email@domain`,
|
||||
`email@-domain.com`,
|
||||
`email@111.222.333.44444`,
|
||||
`email@domain..com`,
|
||||
`Abc.example.com`,
|
||||
`A@b@c@example.com`,
|
||||
`colin..hacks@domain.com`,
|
||||
`a"b(c)d,e:f;g<h>i[j\k]l@example.com`,
|
||||
`just"not"right@example.com`,
|
||||
`this is"not\allowed@example.com`,
|
||||
`this\ still\"not\\allowed@example.com`,
|
||||
|
||||
// random
|
||||
`i_like_underscore@but_its_not_allowed_in_this_part.example.com`,
|
||||
`QA[icon]CHOCOLATE[icon]@test.com`,
|
||||
`invalid@-start.com`,
|
||||
`invalid@end.com-`,
|
||||
`a.b@c.d`,
|
||||
`invalid@[1.1.1.-1]`,
|
||||
`invalid@[68.185.127.196.55]`,
|
||||
`temp@[192.168.1]`,
|
||||
|
@ -120,13 +147,16 @@ test("more email validations", () => {
|
|||
`test@.com`,
|
||||
];
|
||||
const emailSchema = z.string().email();
|
||||
|
||||
expect(
|
||||
validEmails.every((email) => emailSchema.safeParse(email).success)
|
||||
validEmails.every((email) => {
|
||||
return emailSchema.safeParse(email).success;
|
||||
})
|
||||
).toBe(true);
|
||||
expect(
|
||||
invalidEmails.every(
|
||||
(email) => emailSchema.safeParse(email).success === false
|
||||
)
|
||||
invalidEmails.every((email) => {
|
||||
return emailSchema.safeParse(email).success === false;
|
||||
})
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
|
|
17
src/types.ts
17
src/types.ts
|
@ -551,9 +551,17 @@ const uuidRegex =
|
|||
//old email regex
|
||||
// const emailRegex = /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@((?!-)([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{1,})[^-<>()[\].,;:\s@"]$/i;
|
||||
// eslint-disable-next-line
|
||||
|
||||
// const emailRegex =
|
||||
// /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\])|(\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\.[A-Za-z]{2,})+))$/;
|
||||
// const emailRegex =
|
||||
// /^[a-zA-Z0-9\.\!\#\$\%\&\'\*\+\/\=\?\^\_\`\{\|\}\~\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
||||
// const emailRegex =
|
||||
// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i;
|
||||
const emailRegex =
|
||||
/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\])|(\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\])|([A-Za-z0-9]\.?([A-Za-z0-9-]+\.)*([A-Za-z0-9-])*[A-Za-z0-9]))$/;
|
||||
/^([A-Z0-9_+-]+\.?)*[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i;
|
||||
// const emailRegex =
|
||||
// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\.[a-z0-9\-]+)*$/i;
|
||||
|
||||
// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression
|
||||
const emojiRegex = /^(\p{Extended_Pictographic}|\p{Emoji_Component})+$/u;
|
||||
|
||||
|
@ -4174,7 +4182,10 @@ export class ZodPromise<T extends ZodTypeAny> extends ZodType<
|
|||
//////////////////////////////////////////////
|
||||
|
||||
export type Refinement<T> = (arg: T, ctx: RefinementCtx) => any;
|
||||
export type SuperRefinement<T> = (arg: T, ctx: RefinementCtx) => void | Promise<void>;
|
||||
export type SuperRefinement<T> = (
|
||||
arg: T,
|
||||
ctx: RefinementCtx
|
||||
) => void | Promise<void>;
|
||||
|
||||
export type RefinementEffect<T> = {
|
||||
type: "refinement";
|
||||
|
|
Loading…
Reference in New Issue