diff --git a/.changeset/rude-windows-return.md b/.changeset/rude-windows-return.md new file mode 100644 index 000000000..eb6247024 --- /dev/null +++ b/.changeset/rude-windows-return.md @@ -0,0 +1,5 @@ +--- +"@scaleway/regex": minor +--- + +Add new regex for port security group handling diff --git a/packages/regex/src/__tests__/index.test.ts b/packages/regex/src/__tests__/index.test.ts index 821b8ae37..01242d819 100644 --- a/packages/regex/src/__tests__/index.test.ts +++ b/packages/regex/src/__tests__/index.test.ts @@ -44,6 +44,7 @@ import { phone, reverseDNS, s3BucketName, + sgPortRange, sixDigitsCode, spaces, uppercaseBasicDomain, @@ -1062,4 +1063,58 @@ describe('@regex', () => { expect(absolutePath.test(string)).toBe(expected) }) }) + + describe('sgPortRange', () => { + test.each([ + // Valid single ports + ['1', true], + ['80', true], + ['443', true], + ['8080', true], + ['65535', true], + + // Valid port ranges + ['1-80', true], + ['80-443', true], + ['1000-2000', true], + ['1-65535', true], + ['8080-8090', true], + + // Edge cases for valid ports + ['1-1', true], + ['65535-65535', true], + + // Invalid: Port 0 not allowed => but regex was like that so product might accept it, keep it like that for now + ['0', true], + ['0-80', true], + ['80-0', true], + + // Invalid: Ports above 65535 + ['65536', false], + ['70000', false], + ['1-70000', false], + ['65536-65537', false], + + // Invalid formats + ['', false], + ['a', false], + ['1a', false], + ['a1', false], + ['1,2', false], + ['1:2', false], + ['1 - 2', false], + ['1~2', false], + ['1-2-3', false], + ['1-', false], + ['-1', false], + ['-', false], + ['1--2', false], + + // Edge cases + ['65534-65535', true], + ['65535-65535', true], + ])('should match regex %s to be %s', (string, expected) => { + expect(sgPortRange.test(string)).toBe(expected) + }) + }) }) diff --git a/packages/regex/src/index.ts b/packages/regex/src/index.ts index 6997ac154..2cad314ba 100644 --- a/packages/regex/src/index.ts +++ b/packages/regex/src/index.ts @@ -88,3 +88,7 @@ export const dashedIpv4 = export const pathSegment = /^[_a-zA-Z0-9]([-_.a-zA-Z0-9]*[_a-zA-Z0-9])?$/ export const absolutePath = /^\/(([\w. -]*)[^\s?]\/?)+$/ + +// A port range between 1 to 65535 separated by an hypen or a single number +export const sgPortRange = + /^(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5]?[0-9]{1,4})(-(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5]?[0-9]{1,4}))?$/