@@ -607,25 +607,31 @@ function negate(delimiter: string, backtrack: string) {
607
607
* Stringify token data into a path string.
608
608
*/
609
609
export function stringify ( data : TokenData ) {
610
- return data . tokens . map ( stringifyToken ) . join ( "" ) ;
611
- }
612
-
613
- function stringifyToken ( token : Token ) : string {
614
- if ( token . type === "text" ) return escapeText ( token . value ) ;
615
- if ( token . type === "group" ) {
616
- return `{${ token . tokens . map ( stringifyToken ) . join ( "" ) } }` ;
617
- }
610
+ return data . tokens
611
+ . map ( function stringifyToken ( token , index , tokens ) : string {
612
+ if ( token . type === "text" ) return escapeText ( token . value ) ;
613
+ if ( token . type === "group" ) {
614
+ return `{${ token . tokens . map ( stringifyToken ) . join ( "" ) } }` ;
615
+ }
618
616
619
- const isSafe = isNameSafe ( token . name ) ;
620
- const key = isSafe ? token . name : JSON . stringify ( token . name ) ;
617
+ const isSafe =
618
+ isNameSafe ( token . name ) && isNextNameSafe ( tokens [ index + 1 ] ) ;
619
+ const key = isSafe ? token . name : JSON . stringify ( token . name ) ;
621
620
622
- if ( token . type === "param" ) return `:${ key } ` ;
623
- if ( token . type === "wildcard" ) return `*${ key } ` ;
624
- throw new TypeError ( `Unexpected token: ${ token } ` ) ;
621
+ if ( token . type === "param" ) return `:${ key } ` ;
622
+ if ( token . type === "wildcard" ) return `*${ key } ` ;
623
+ throw new TypeError ( `Unexpected token: ${ token } ` ) ;
624
+ } )
625
+ . join ( "" ) ;
625
626
}
626
627
627
628
function isNameSafe ( name : string ) {
628
629
const [ first , ...rest ] = name ;
629
630
if ( ! ID_START . test ( first ) ) return false ;
630
631
return rest . every ( ( char ) => ID_CONTINUE . test ( char ) ) ;
631
632
}
633
+
634
+ function isNextNameSafe ( token : Token | undefined ) {
635
+ if ( token ?. type !== "text" ) return true ;
636
+ return ! ID_CONTINUE . test ( token . value [ 0 ] ) ;
637
+ }
0 commit comments