@@ -3,16 +3,31 @@ import { trimEnd, trimStart, truncate } from './strings.js';
33describe ( 'helpers' , ( ) => {
44 describe ( 'trimStart' , ( ) => {
55 it ( 'should remove invisible characters from the start of a string' , ( ) => {
6- const input = '\u034f\u034fHello' ;
7- const result = trimStart ( input ) ;
8- expect ( result ) . toBe ( 'Hello' ) ;
6+ expect ( trimStart ( ' A' ) ) . toBe ( 'A' ) ;
7+ expect ( trimStart ( '\nB' ) ) . toBe ( 'B' ) ;
8+ expect ( trimStart ( '\tC' ) ) . toBe ( 'C' ) ;
9+ expect ( trimStart ( '\rD' ) ) . toBe ( 'D' ) ;
10+ expect ( trimStart ( '\u034fE' ) ) . toBe ( 'E' ) ;
11+ expect ( trimStart ( '\u17b4F' ) ) . toBe ( 'F' ) ;
12+ expect ( trimStart ( '\u17b5G' ) ) . toBe ( 'G' ) ;
13+ expect ( trimStart ( '\u2800F' ) ) . toBe ( 'F' ) ;
14+ expect ( trimStart ( '\u115fH' ) ) . toBe ( 'H' ) ;
15+ expect ( trimStart ( '\u1160I' ) ) . toBe ( 'I' ) ;
16+ expect ( trimStart ( '\u3164J' ) ) . toBe ( 'J' ) ;
17+ expect ( trimStart ( '\uffa0K' ) ) . toBe ( 'K' ) ;
918 } ) ;
1019
1120 it ( 'should return the same string if no invisible characters are at the start' , ( ) => {
1221 const input = 'Hello' ;
1322 const result = trimStart ( input ) ;
1423 expect ( result ) . toBe ( 'Hello' ) ;
1524 } ) ;
25+
26+ it ( 'should not hang (ReDoS) on long string of invisible chars' , ( ) => {
27+ const long = '\u034f' . repeat ( 1_000_000 ) + 'Hello' ;
28+ const result = trimStart ( long ) ;
29+ expect ( result ) . toBe ( 'Hello' ) ;
30+ } , 200 ) ;
1631 } ) ;
1732
1833 describe ( 'trimEnd' , ( ) => {
0 commit comments