From 9defe5dfde90f95123533dcf4176d650fdcb9a21 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 7 Sep 2022 07:15:20 +0000 Subject: [PATCH] feat(regex): add ip regexes --- packages/regex/src/__tests__/index.ts | 53 +++++++++++++++++++++++++++ packages/regex/src/index.ts | 24 ++++++++++++ 2 files changed, 77 insertions(+) diff --git a/packages/regex/src/__tests__/index.ts b/packages/regex/src/__tests__/index.ts index 6709cab23..2413b0a80 100644 --- a/packages/regex/src/__tests__/index.ts +++ b/packages/regex/src/__tests__/index.ts @@ -23,6 +23,9 @@ import { email, fourDigitsCode, hexadecimal, + ip, + ipv4, + ipv6, macAddress, phone, sixDigitsCode, @@ -661,4 +664,54 @@ describe('@regex', () => { expect(hexadecimal.test(string)).toBe(expected) }) }) + + describe('ipv4', () => { + test.each([ + ['192.168.1.1', true], + ['127.0.0.1', true], + ['0.0.0.0', true], + ['255.255.255.255', true], + ['1.2.3.4 hi', false], + ['256.256.256.256', false], + ['999.999.999.999', false], + ['1.2.3', false], + ])('should match regex %s to be %s', (string, expected) => { + expect(ipv4.test(string)).toBe(expected) + }) + }) + + describe('ipv6', () => { + test.each([ + ['1:2:3:4:5:6:7::', true], + ['1:2:3:4:5:6::8', true], + ['1:2::4:5:6:7:8', true], + ['1::3:4:5:6:7:8', true], + ['::2:3:4:5:6:7:8', true], + ['::1.2.3.4', true], + ['1:2::4:5:6:7:8 hi', false], + ['192.168.1.1', false], + ['127.0.0.1', false], + ['typebot.io', false], + ['256.256.256.256', false], + ])('should match regex %s to be %s', (string, expected) => { + expect(ipv6.test(string)).toBe(expected) + }) + }) + + describe('ip', () => { + test.each([ + ['1:2:3:4:5:6:7::', true], + ['1:2:3:4:5:6::8', true], + ['::2:3:4:5:6:7:8', true], + ['::1.2.3.4', true], + ['192.168.1.1', true], + ['127.0.0.1', true], + ['0.0.0.0', true], + ['255.255.255.255', true], + ['256.256.256.256', false], + ['1:2:3::5:6:7:900.2.3.4', false], + ])('should match regex %s to be %s', (string, expected) => { + expect(ip.test(string)).toBe(expected) + }) + }) }) diff --git a/packages/regex/src/index.ts b/packages/regex/src/index.ts index 73785350f..7bd16e1d1 100644 --- a/packages/regex/src/index.ts +++ b/packages/regex/src/index.ts @@ -33,3 +33,27 @@ export const sixDigitsCode = /^[0-9]{6}$/ export const url = /^http(s)?:\/\/?[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=.]+$/ export const hexadecimal = /^[0-9a-fA-F]+$/ + +// Pasted from `ip-regex` package (https://github.com/sindresorhus/ip-regex/blob/main/index.js) +const v4 = + '(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}' +const v6segment = '[a-fA-F\\d]{1,4}' +const v6 = ` +(?: +(?:${v6segment}:){7}(?:${v6segment}|:)| +(?:${v6segment}:){6}(?:${v4}|:${v6segment}|:)| +(?:${v6segment}:){5}(?::${v4}|(?::${v6segment}){1,2}|:)| +(?:${v6segment}:){4}(?:(?::${v6segment}){0,1}:${v4}|(?::${v6segment}){1,3}|:)| +(?:${v6segment}:){3}(?:(?::${v6segment}){0,2}:${v4}|(?::${v6segment}){1,4}|:)| +(?:${v6segment}:){2}(?:(?::${v6segment}){0,3}:${v4}|(?::${v6segment}){1,5}|:)| +(?:${v6segment}:){1}(?:(?::${v6segment}){0,4}:${v4}|(?::${v6segment}){1,6}|:)| +(?::(?:(?::${v6segment}){0,5}:${v4}|(?::${v6segment}){1,7}|:)) +)(?:%[0-9a-zA-Z]{1,})? +` + .replace(/\s*\/\/.*$/gm, '') + .replace(/\n/g, '') + .trim() + +export const ip = new RegExp(`^(?:${v4}|${v6})$`) +export const ipv4 = new RegExp(`^${v4}$`) +export const ipv6 = new RegExp(`^${v6}$`)