diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__slugified_name-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__slugified_name-stdout.snap index b50c2448..13188a47 100644 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__slugified_name-stdout.snap +++ b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__slugified_name-stdout.snap @@ -7,8 +7,7 @@ Writing default.project.json Writing src/Camera.rbxm Writing src/Terrain.rbxm Writing src/_Folder/init.meta.json -Writing src/_Script/init.meta.json -Writing src/_Script/init.server.luau +Writing src/_Script.meta.json +Writing src/_Script.server.luau Writing src Writing src/_Folder -Writing src/_Script diff --git a/src/syncback/mod.rs b/src/syncback/mod.rs index 57d86f24..8e0d7d03 100644 --- a/src/syncback/mod.rs +++ b/src/syncback/mod.rs @@ -360,16 +360,25 @@ pub fn get_best_middleware(snapshot: &SyncbackSnapshot) -> Middleware { } } - // If the instance name is invalid for the filesystem, use directory middleware - // to allow preserving the name in meta.json + // If the name is invalid but the instance has no descendants and isn't a + // folder/config/tool, prefer slugified files over creating a directory. + // Only promote to directory when there are children (or dir-like classes). if crate::syncback::file_names::validate_file_name(&inst.name).is_err() { middleware = match middleware { - Middleware::ServerScript => Middleware::ServerScriptDir, - Middleware::ClientScript => Middleware::ClientScriptDir, - Middleware::ModuleScript => Middleware::ModuleScriptDir, - Middleware::Csv => Middleware::CsvDir, - Middleware::JsonModel | Middleware::Text => Middleware::Dir, - _ => middleware, + Middleware::ServerScript | Middleware::ClientScript | Middleware::ModuleScript + if inst.children().is_empty() => + { + middleware + } + Middleware::JsonModel | Middleware::Text if inst.children().is_empty() => middleware, + _ => match middleware { + Middleware::ServerScript => Middleware::ServerScriptDir, + Middleware::ClientScript => Middleware::ClientScriptDir, + Middleware::ModuleScript => Middleware::ModuleScriptDir, + Middleware::Csv => Middleware::CsvDir, + Middleware::JsonModel | Middleware::Text => Middleware::Dir, + _ => middleware, + }, } } diff --git a/tests/tests/syncback.rs b/tests/tests/syncback.rs index e2b1f6f5..10be92a8 100644 --- a/tests/tests/syncback.rs +++ b/tests/tests/syncback.rs @@ -87,8 +87,8 @@ syncback_tests! { // Ensures that the `syncUnscriptable` setting works unscriptable_properties => ["default.project.json"], // Ensures that instances with names containing illegal characters get slugified filenames - // and preserve their original names in meta.json - slugified_name => ["src/_Script/init.meta.json", "src/_Script/init.server.luau", "src/_Folder/init.meta.json"], + // and preserve their original names in meta.json without forcing directories for leaf scripts + slugified_name => ["src/_Script.meta.json", "src/_Script.server.luau", "src/_Folder/init.meta.json"], // Ensures that .model.json files preserve the name property model_json_name => ["src/foo.model.json"], }