diff --git a/packages/payload/src/fields/validations.ts b/packages/payload/src/fields/validations.ts index a22e5cd5d8..5018948c51 100644 --- a/packages/payload/src/fields/validations.ts +++ b/packages/payload/src/fields/validations.ts @@ -200,7 +200,7 @@ export const email: EmailFieldValidation = ( * Supports multiple subdomains (e.g., user@sub.domain.example.com) */ const emailRegex = - /^(?!.*\.\.)[\w.%+-]+@[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\.[a-z]{2,}$/i + /^(?!.*\.\.)[\w!#$%&'*+/=?^`{|}~-](?:[\w!#$%&'*+/=?^`{|}~.-]*[\w!#$%&'*+/=?^`{|}~-])?@[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\.[a-z]{2,}$/i if ((value && !emailRegex.test(value)) || (!value && required)) { return t('validation:emailAddress') diff --git a/test/auth/int.spec.ts b/test/auth/int.spec.ts index 77b75798c6..ec6e6c0e53 100644 --- a/test/auth/int.spec.ts +++ b/test/auth/int.spec.ts @@ -1016,6 +1016,7 @@ describe('Auth', () => { expect(emailValidation('user.name+alias@example.co.uk', mockContext)).toBe(true) expect(emailValidation('user-name@example.org', mockContext)).toBe(true) expect(emailValidation('user@ex--ample.com', mockContext)).toBe(true) + expect(emailValidation("user'payload@example.org", mockContext)).toBe(true) }) it('should not allow emails with double quotes', () => { @@ -1045,5 +1046,11 @@ describe('Auth', () => { expect(emailValidation('user@-example.com', mockContext)).toBe('validation:emailAddress') expect(emailValidation('user@example-.com', mockContext)).toBe('validation:emailAddress') }) + it('should not allow emails that start with dot', () => { + expect(emailValidation('.user@example.com', mockContext)).toBe('validation:emailAddress') + }) + it('should not allow emails that have a comma', () => { + expect(emailValidation('user,name@example.com', mockContext)).toBe('validation:emailAddress') + }) }) }) diff --git a/tsconfig.base.json b/tsconfig.base.json index daa36c7211..c9793d25c6 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -31,7 +31,7 @@ } ], "paths": { - "@payload-config": ["./test/query-presets/config.ts"], + "@payload-config": ["./test/_community/config.ts"], "@payloadcms/admin-bar": ["./packages/admin-bar/src"], "@payloadcms/live-preview": ["./packages/live-preview/src"], "@payloadcms/live-preview-react": ["./packages/live-preview-react/src/index.ts"],