From e13691abb36c69662777a0738a2b75c445108055 Mon Sep 17 00:00:00 2001 From: mjolly Date: Tue, 16 Dec 2025 16:36:15 +0100 Subject: [PATCH] feat: add webhosting username email regex --- .changeset/modern-brooms-open.md | 5 +++++ packages/regex/src/__tests__/index.test.ts | 20 ++++++++++++++++++++ packages/regex/src/index.ts | 4 ++++ 3 files changed, 29 insertions(+) create mode 100644 .changeset/modern-brooms-open.md diff --git a/.changeset/modern-brooms-open.md b/.changeset/modern-brooms-open.md new file mode 100644 index 000000000..6ef759923 --- /dev/null +++ b/.changeset/modern-brooms-open.md @@ -0,0 +1,5 @@ +--- +"@scaleway/regex": minor +--- + +feat: add webhosting username email regex diff --git a/packages/regex/src/__tests__/index.test.ts b/packages/regex/src/__tests__/index.test.ts index 5d5e8f926..42798407b 100644 --- a/packages/regex/src/__tests__/index.test.ts +++ b/packages/regex/src/__tests__/index.test.ts @@ -54,6 +54,7 @@ import { uppercaseBasicSubdomain, url, uuid, + webhostingUsernameEmailRegex, } from '..' const alphanumDashDotsText = 'testwithdashdots-.' @@ -1167,6 +1168,25 @@ describe('@regex', () => { }) }) + describe('webhostingUsernameEmailRegex', () => { + test.each([ + ['test', true], + ['test_test', true], + ['test-test', true], + ['test.test', true], + ['test.test.', false], + ['test..test', false], + ['test-test-', false], + ['test_test_', false], + ['test.test.', false], + ['test..test', false], + ['test..test', false], + ['test..test', false], + ])('should match regex %s to be %s', (string, expected) => { + expect(webhostingUsernameEmailRegex.test(string)).toBe(expected) + }) + }) + describe('uuid', () => { test.each([ [asciiLetters, false], diff --git a/packages/regex/src/index.ts b/packages/regex/src/index.ts index 270c4f28a..8ec88d254 100644 --- a/packages/regex/src/index.ts +++ b/packages/regex/src/index.ts @@ -102,3 +102,7 @@ export const password = /^(?!@)[^`]*$/ // A kafka username contains lowercase letters and numbers, with each segment starting and ending with a letter or number. Hyphens are only allowed in the middle of segments. Example: "username", "user-name", "my-group.user-name" export const kafkaUsernameRegex = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$/ + +// The username cannot begin or end with a period, cannot contain two consecutive periods, and can only contain letters, numbers, periods, hyphens, and underscores. Example: "test", "test_test", "test-test" +export const webhostingUsernameEmailRegex = + /^(?!.*\.\.)[a-zA-Z0-9_-][a-zA-Z0-9._-]*[a-zA-Z0-9_-]$/