@@ -24,6 +24,7 @@ import {
2424 objectWithRest ,
2525 optional ,
2626 pipe ,
27+ regex ,
2728 strictObject ,
2829 string ,
2930 tuple ,
@@ -374,4 +375,38 @@ describe('constraint', () => {
374375 constraint [ 'conditions[0].conditions[1].conditions[2].type' ] ,
375376 ) . toEqual ( { required : true } ) ;
376377 } ) ;
378+
379+ test ( 'regex patterns' , ( ) => {
380+ const schema = object ( {
381+ empty : string ( ) ,
382+ singlePattern : pipe ( string ( ) , regex ( / ^ [ A - Z ] + $ / ) ) ,
383+ multiplePatterns : pipe (
384+ string ( ) ,
385+ regex ( / [ A - Z ] / , 'uppercase' ) ,
386+ regex ( / [ 0 - 9 ] / , 'digit' ) ,
387+ ) ,
388+ } ) ;
389+
390+ const constraint = getValibotConstraint ( schema ) ;
391+
392+ expect ( constraint . empty ?. required ) . toBe ( true ) ;
393+ expect ( constraint . singlePattern ?. required ) . toBe ( true ) ;
394+ expect ( constraint . multiplePatterns ?. required ) . toBe ( true ) ;
395+
396+ expect ( constraint . singlePattern ?. pattern ) . toBe ( '^(?=.*(?:^[A-Z]+$)).*$' ) ;
397+ expect ( constraint . multiplePatterns ?. pattern ) . toBe (
398+ '^(?=.*(?:[A-Z]))(?=.*(?:[0-9])).*$' ,
399+ ) ;
400+
401+ const singleRegex = new RegExp ( constraint . singlePattern ?. pattern ?? '' ) ;
402+ expect ( singleRegex . test ( 'ABC' ) ) . toBe ( true ) ;
403+ expect ( singleRegex . test ( 'abc' ) ) . toBe ( false ) ;
404+ expect ( singleRegex . test ( 'ABC123' ) ) . toBe ( false ) ;
405+
406+ const multiRegex = new RegExp ( constraint . multiplePatterns ?. pattern ?? '' ) ;
407+ expect ( multiRegex . test ( 'ABC' ) ) . toBe ( false ) ;
408+ expect ( multiRegex . test ( '123' ) ) . toBe ( false ) ;
409+ expect ( multiRegex . test ( 'ABC123' ) ) . toBe ( true ) ;
410+ expect ( multiRegex . test ( 'abc123' ) ) . toBe ( false ) ;
411+ } ) ;
377412} ) ;
0 commit comments