@@ -34,6 +34,7 @@ pub use loader::TurboJsonLoader;
34
34
use crate :: { boundaries:: BoundariesConfig , config:: UnnecessaryPackageTaskSyntaxError } ;
35
35
36
36
const TURBO_ROOT : & str = "$TURBO_ROOT$" ;
37
+ const TURBO_ROOT_SLASH : & str = "$TURBO_ROOT$/" ;
37
38
38
39
#[ derive( Serialize , Deserialize , Debug , Default , PartialEq , Clone , Deserializable ) ]
39
40
#[ serde( rename_all = "camelCase" ) ]
@@ -777,7 +778,14 @@ fn replace_turbo_root_token_in_string(
777
778
input : & mut Spanned < UnescapedString > ,
778
779
path_to_repo_root : & RelativeUnixPath ,
779
780
) -> Result < ( ) , Error > {
780
- match input. find ( TURBO_ROOT ) {
781
+ let turbo_root_index = input. find ( TURBO_ROOT ) ;
782
+ if let Some ( index) = turbo_root_index {
783
+ if !input. as_inner ( ) [ index..] . starts_with ( TURBO_ROOT_SLASH ) {
784
+ let ( span, text) = input. span_and_text ( "turbo.json" ) ;
785
+ return Err ( Error :: InvalidTurboRootNeedsSlash { span, text } ) ;
786
+ }
787
+ }
788
+ match turbo_root_index {
781
789
Some ( 0 ) => {
782
790
// Replace
783
791
input
@@ -1283,7 +1291,8 @@ mod tests {
1283
1291
#[ test_case( "index.ts" , Ok ( "index.ts" ) ; "no token" ) ]
1284
1292
#[ test_case( "$TURBO_ROOT$/config.txt" , Ok ( "../../config.txt" ) ; "valid token" ) ]
1285
1293
#[ test_case( "!$TURBO_ROOT$/README.md" , Ok ( "!../../README.md" ) ; "negation" ) ]
1286
- #[ test_case( "../$TURBO_ROOT$/config.txt" , Err ( "Cannot use '$TURBO_ROOT$' anywhere besides start of string." ) ; "invalid token" ) ]
1294
+ #[ test_case( "../$TURBO_ROOT$/config.txt" , Err ( "\" $TURBO_ROOT$\" must be used at the start of glob." ) ; "invalid token" ) ]
1295
+ #[ test_case( "$TURBO_ROOT$config.txt" , Err ( "\" $TURBO_ROOT$\" must be followed by a '/'." ) ; "trailing slash" ) ]
1287
1296
fn test_replace_turbo_root ( input : & ' static str , expected : Result < & str , & str > ) {
1288
1297
let mut spanned_string = Spanned :: new ( UnescapedString :: from ( input) )
1289
1298
. with_path ( Arc :: from ( "turbo.json" ) )
0 commit comments