@@ -607,25 +607,31 @@ function negate(delimiter: string, backtrack: string) {
607607 * Stringify token data into a path string.
608608 */
609609export 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+ }
618616
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 ) ;
621620
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 ( "" ) ;
625626}
626627
627628function isNameSafe ( name : string ) {
628629 const [ first , ...rest ] = name ;
629630 if ( ! ID_START . test ( first ) ) return false ;
630631 return rest . every ( ( char ) => ID_CONTINUE . test ( char ) ) ;
631632}
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