From 0d618739aea21985f7f12f0216663ec93847f2b7 Mon Sep 17 00:00:00 2001 From: Emmanuel Chambon Date: Mon, 25 Apr 2022 14:37:25 +0200 Subject: [PATCH 1/2] fix(regex): improve url regex --- packages/regex/src/__tests__/index.ts | 6 ++++++ packages/regex/src/index.ts | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/regex/src/__tests__/index.ts b/packages/regex/src/__tests__/index.ts index 166e31c80..39dbb7c54 100644 --- a/packages/regex/src/__tests__/index.ts +++ b/packages/regex/src/__tests__/index.ts @@ -51,6 +51,9 @@ const punctuation = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' const sixDigitsCodeTest = '123456' const url1 = 'http://console.scaleway.com' const url2 = 'https://www.scaleway.com' +const url3 = 'https://www.scaleway.online' +const url4 = 'http://www.scaleway.com:8080' +const url5 = 'http://255.255.255.255' const whitespace = ' \t\n\r\x0b\x0c' const macAddress1 = '1F:B5:FA:47:CD:C4' const linuxPaths = { @@ -606,6 +609,9 @@ describe('@regex', () => { [macAddress1, false], [url1, true], [url2, true], + [url3, true], + [url4, true], + [url5, true], ])('should match regex %s to be %s', (string, expected) => { expect(url.test(string)).toBe(expected) }) diff --git a/packages/regex/src/index.ts b/packages/regex/src/index.ts index a196baf4a..370f3d637 100644 --- a/packages/regex/src/index.ts +++ b/packages/regex/src/index.ts @@ -30,5 +30,5 @@ export const phone = /^\+[0-9]*/ export const spaces = /^\s*$/ export const sixDigitsCode = /^[0-9]{6}$/ export const url = - /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([-.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ + /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=.]+$/ export const hexadecimal = /^[0-9a-fA-F]+$/ From 993185385e81d611313492a70fe8b4e2fd3aa36d Mon Sep 17 00:00:00 2001 From: Emmanuel Chambon Date: Mon, 25 Apr 2022 14:42:26 +0200 Subject: [PATCH 2/2] test: more unit tests --- packages/regex/src/__tests__/index.ts | 26 ++++++++++++++------------ packages/regex/src/index.ts | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/regex/src/__tests__/index.ts b/packages/regex/src/__tests__/index.ts index 39dbb7c54..4f2bcb39c 100644 --- a/packages/regex/src/__tests__/index.ts +++ b/packages/regex/src/__tests__/index.ts @@ -49,11 +49,16 @@ const printable = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c' const punctuation = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' const sixDigitsCodeTest = '123456' -const url1 = 'http://console.scaleway.com' -const url2 = 'https://www.scaleway.com' -const url3 = 'https://www.scaleway.online' -const url4 = 'http://www.scaleway.com:8080' -const url5 = 'http://255.255.255.255' +const urls = [ + 'http://console.scaleway.com', + 'https://www.scaleway.com', + 'https://www.scaleway.online', + 'http://www.scaleway.com:8080', + 'http://255.255.255.255', + 'http://www.example.com/product', + 'http://www.example.com/products?id=1&page=2', + 'http://www.example.com#up', +] const whitespace = ' \t\n\r\x0b\x0c' const macAddress1 = '1F:B5:FA:47:CD:C4' const linuxPaths = { @@ -423,8 +428,7 @@ describe('@regex', () => { [whitespace, false], [cronTest, false], [macAddress1, false], - [url1, false], - [url2, false], + ...(urls.map(urlString => [urlString, false]) as [string, boolean][]), ])('should match regex %s to be %s', (string, expected) => { expect(basicDomain.test(string)).toBe(expected) }) @@ -607,11 +611,9 @@ describe('@regex', () => { [whitespace, false], [cronTest, false], [macAddress1, false], - [url1, true], - [url2, true], - [url3, true], - [url4, true], - [url5, true], + [domain, false], + [subDomain, false], + ...(urls.map(urlString => [urlString, true]) as [string, boolean][]), ])('should match regex %s to be %s', (string, expected) => { expect(url.test(string)).toBe(expected) }) diff --git a/packages/regex/src/index.ts b/packages/regex/src/index.ts index 370f3d637..026b3fde8 100644 --- a/packages/regex/src/index.ts +++ b/packages/regex/src/index.ts @@ -30,5 +30,5 @@ export const phone = /^\+[0-9]*/ export const spaces = /^\s*$/ export const sixDigitsCode = /^[0-9]{6}$/ export const url = - /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=.]+$/ + /^http(s)?:\/\/?[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=.]+$/ export const hexadecimal = /^[0-9a-fA-F]+$/