From 13a1bcc42f2042701bb758b047108e57148c8810 Mon Sep 17 00:00:00 2001
From: Tom Bremer <tom@tbremer.com>
Date: Mon, 16 Sep 2024 15:07:42 -0500
Subject: [PATCH 1/4] update regex and error messaging

---
 test/user.js  | 8 ++++++--
 user/index.js | 2 +-
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/test/user.js b/test/user.js
index f6eacad..137feaa 100644
--- a/test/user.js
+++ b/test/user.js
@@ -25,7 +25,7 @@ exports.test_username_invalid_pattern = () => {
 	assert.equal(ajv.errors[0].dataPath, '.username');
 	assert.equal(
 		ajv.errors[0].message,
-		'should match pattern "^[a-z0-9][a-z0-9-]*[a-z0-9]$"'
+		'should match pattern "^(?!-)(?:[a-z0-9-]{1,48})(?<!-)$"'
 	);
 };
 
@@ -43,7 +43,7 @@ exports.test_username_too_short = () => {
 	assert.equal(ajv.errors[1].dataPath, '.username');
 	assert.equal(
 		ajv.errors[1].message,
-		'should match pattern "^[a-z0-9][a-z0-9-]*[a-z0-9]$"'
+		'should match pattern "^(?!-)(?:[a-z0-9-]{1,48})(?<!-)$"'
 	);
 };
 
@@ -58,6 +58,10 @@ exports.test_username_too_long = () => {
 		ajv.errors[0].message,
 		'should NOT be longer than 48 characters'
 	);
+	assert.equal(
+		ajv.errors[1].message,
+		'should match pattern "^(?!-)(?:[a-z0-9-]{1,48})(?<!-)$"'
+	);
 };
 
 exports.test_username_valid = () => {
diff --git a/user/index.js b/user/index.js
index 714e62d..50b995d 100644
--- a/user/index.js
+++ b/user/index.js
@@ -2,7 +2,7 @@ const Username = {
 	type: 'string',
 	minLength: 1,
 	maxLength: 48,
-	pattern: '^[a-z0-9][a-z0-9-]*[a-z0-9]$'
+	pattern: '^(?!-)(?:[a-z0-9-]{1,48})(?<!-)$'
 };
 
 const Name = {

From 71e88b62df20877e55d03a0cef4de4c4ad4c1d8f Mon Sep 17 00:00:00 2001
From: Tom Bremer <tom@tbremer.com>
Date: Mon, 16 Sep 2024 15:08:29 -0500
Subject: [PATCH 2/4] update affected length test

---
 test/user.js | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/test/user.js b/test/user.js
index 137feaa..7faca36 100644
--- a/test/user.js
+++ b/test/user.js
@@ -48,11 +48,10 @@ exports.test_username_too_short = () => {
 };
 
 exports.test_username_too_long = () => {
-	const isValid = ajv.validate(User, {
-		username: 'a'.repeat(50)
-	});
+	const username = 'a'.repeat(50);
+	const isValid = ajv.validate(User, { username });
 	assert.equal(isValid, false);
-	assert.equal(ajv.errors.length, 1);
+	assert.equal(ajv.errors.length, 2);
 	assert.equal(ajv.errors[0].dataPath, '.username');
 	assert.equal(
 		ajv.errors[0].message,

From 85a00c54f0f6d7404a74727998584e4c4aad24b2 Mon Sep 17 00:00:00 2001
From: Tom Bremer <tom@tbremer.com>
Date: Mon, 16 Sep 2024 15:08:44 -0500
Subject: [PATCH 3/4] add test for single character usernames

---
 test/user.js | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/test/user.js b/test/user.js
index 7faca36..fe4d8fc 100644
--- a/test/user.js
+++ b/test/user.js
@@ -68,6 +68,11 @@ exports.test_username_valid = () => {
 	assert(ajv.validate(User, { username: 'rauchg' }));
 };
 
+exports.test_username_one_char = () => {
+	assert(ajv.validate(User, { username: 'a' }));
+	assert(ajv.validate(User, { username: '1' }));
+};
+
 // Name
 exports.test_name_too_short = () => {
 	const isValid = ajv.validate(User, {

From 6e857f4c4050a1e0d2d67e603578f3529ab1b863 Mon Sep 17 00:00:00 2001
From: Tom Bremer <tom@tbremer.com>
Date: Mon, 16 Sep 2024 15:24:34 -0500
Subject: [PATCH 4/4] version bump

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index a7155eb..44b5b49 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@zeit/schemas",
-  "version": "2.36.0",
+  "version": "2.37.0",
   "description": "All schemas used for validation that are shared between our projects",
   "scripts": {
     "test": "yarn run lint && best --verbose",