Skip to content

Commit 98c6ded

Browse files
feat(regex): add ip regexes (#972)
Co-authored-by: Scaleway Bot <[email protected]>
1 parent 3bdd710 commit 98c6ded

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

packages/regex/src/__tests__/index.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ import {
2323
email,
2424
fourDigitsCode,
2525
hexadecimal,
26+
ip,
27+
ipv4,
28+
ipv6,
2629
macAddress,
2730
phone,
2831
sixDigitsCode,
@@ -661,4 +664,54 @@ describe('@regex', () => {
661664
expect(hexadecimal.test(string)).toBe(expected)
662665
})
663666
})
667+
668+
describe('ipv4', () => {
669+
test.each([
670+
['192.168.1.1', true],
671+
['127.0.0.1', true],
672+
['0.0.0.0', true],
673+
['255.255.255.255', true],
674+
['1.2.3.4 hi', false],
675+
['256.256.256.256', false],
676+
['999.999.999.999', false],
677+
['1.2.3', false],
678+
])('should match regex %s to be %s', (string, expected) => {
679+
expect(ipv4.test(string)).toBe(expected)
680+
})
681+
})
682+
683+
describe('ipv6', () => {
684+
test.each([
685+
['1:2:3:4:5:6:7::', true],
686+
['1:2:3:4:5:6::8', true],
687+
['1:2::4:5:6:7:8', true],
688+
['1::3:4:5:6:7:8', true],
689+
['::2:3:4:5:6:7:8', true],
690+
['::1.2.3.4', true],
691+
['1:2::4:5:6:7:8 hi', false],
692+
['192.168.1.1', false],
693+
['127.0.0.1', false],
694+
['typebot.io', false],
695+
['256.256.256.256', false],
696+
])('should match regex %s to be %s', (string, expected) => {
697+
expect(ipv6.test(string)).toBe(expected)
698+
})
699+
})
700+
701+
describe('ip', () => {
702+
test.each([
703+
['1:2:3:4:5:6:7::', true],
704+
['1:2:3:4:5:6::8', true],
705+
['::2:3:4:5:6:7:8', true],
706+
['::1.2.3.4', true],
707+
['192.168.1.1', true],
708+
['127.0.0.1', true],
709+
['0.0.0.0', true],
710+
['255.255.255.255', true],
711+
['256.256.256.256', false],
712+
['1:2:3::5:6:7:900.2.3.4', false],
713+
])('should match regex %s to be %s', (string, expected) => {
714+
expect(ip.test(string)).toBe(expected)
715+
})
716+
})
664717
})

packages/regex/src/index.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,27 @@ export const sixDigitsCode = /^[0-9]{6}$/
3333
export const url =
3434
/^http(s)?:\/\/?[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=.]+$/
3535
export const hexadecimal = /^[0-9a-fA-F]+$/
36+
37+
// Pasted from `ip-regex` package (https://github.com/sindresorhus/ip-regex/blob/main/index.js)
38+
const v4 =
39+
'(?: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}'
40+
const v6segment = '[a-fA-F\\d]{1,4}'
41+
const v6 = `
42+
(?:
43+
(?:${v6segment}:){7}(?:${v6segment}|:)|
44+
(?:${v6segment}:){6}(?:${v4}|:${v6segment}|:)|
45+
(?:${v6segment}:){5}(?::${v4}|(?::${v6segment}){1,2}|:)|
46+
(?:${v6segment}:){4}(?:(?::${v6segment}){0,1}:${v4}|(?::${v6segment}){1,3}|:)|
47+
(?:${v6segment}:){3}(?:(?::${v6segment}){0,2}:${v4}|(?::${v6segment}){1,4}|:)|
48+
(?:${v6segment}:){2}(?:(?::${v6segment}){0,3}:${v4}|(?::${v6segment}){1,5}|:)|
49+
(?:${v6segment}:){1}(?:(?::${v6segment}){0,4}:${v4}|(?::${v6segment}){1,6}|:)|
50+
(?::(?:(?::${v6segment}){0,5}:${v4}|(?::${v6segment}){1,7}|:))
51+
)(?:%[0-9a-zA-Z]{1,})?
52+
`
53+
.replace(/\s*\/\/.*$/gm, '')
54+
.replace(/\n/g, '')
55+
.trim()
56+
57+
export const ip = new RegExp(`^(?:${v4}|${v6})$`)
58+
export const ipv4 = new RegExp(`^${v4}$`)
59+
export const ipv6 = new RegExp(`^${v6}$`)

0 commit comments

Comments
 (0)