diff --git a/src/project.rs b/src/project.rs
index 220b9e35..bde4ac14 100644
--- a/src/project.rs
+++ b/src/project.rs
@@ -16,7 +16,8 @@ use crate::{
};
/// Represents 'default' project names that act as `init` files
-pub static DEFAULT_PROJECT_NAMES: [&str; 1] = ["default.project.json5"];
+/// Includes legacy `.json` extension as fallback for backwards compatibility.
+pub static DEFAULT_PROJECT_NAMES: [&str; 2] = ["default.project.json5", "default.project.json"];
/// Error type returned by any function that handles projects.
#[derive(Debug, Error)]
@@ -140,7 +141,7 @@ impl Project {
pub fn is_project_file(path: &Path) -> bool {
path.file_name()
.and_then(|name| name.to_str())
- .map(|name| name.ends_with(".project.json5"))
+ .map(|name| name.ends_with(".project.json5") || name.ends_with(".project.json"))
.unwrap_or(false)
}
diff --git a/src/snapshot_middleware/dir.rs b/src/snapshot_middleware/dir.rs
index c610824e..ab541014 100644
--- a/src/snapshot_middleware/dir.rs
+++ b/src/snapshot_middleware/dir.rs
@@ -68,12 +68,17 @@ pub fn snapshot_dir_no_meta(
// TODO: We shouldn't need to know about Lua existing in this
// middleware. Should we figure out a way for that function to add
// relevant paths to this middleware?
+ // Modern extensions (preferred)
normalized_path.join("init.luau"),
normalized_path.join("init.server.luau"),
normalized_path.join("init.client.luau"),
normalized_path.join("init.local.luau"),
normalized_path.join("init.legacy.luau"),
normalized_path.join("init.csv"),
+ // Legacy extensions (for backwards compatibility)
+ normalized_path.join("init.lua"),
+ normalized_path.join("init.server.lua"),
+ normalized_path.join("init.client.lua"),
];
let snapshot = InstanceSnapshot::new()
diff --git a/src/snapshot_middleware/meta_file.rs b/src/snapshot_middleware/meta_file.rs
index b60dbf9a..d69798e0 100644
--- a/src/snapshot_middleware/meta_file.rs
+++ b/src/snapshot_middleware/meta_file.rs
@@ -64,15 +64,22 @@ impl AdjacentMetadata {
.or_else(|| file_stem.strip_suffix(".local"))
.or_else(|| file_stem.strip_suffix(".legacy"))
.unwrap_or(file_stem);
- let meta_path = path.with_file_name(format!("{base_name}.meta.json5"));
+
+ // Try modern extension first, then fall back to legacy
+ let meta_path_json5 = path.with_file_name(format!("{base_name}.meta.json5"));
+ let meta_path_json = path.with_file_name(format!("{base_name}.meta.json"));
- if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? {
- let mut metadata = Self::from_slice(&meta_contents, meta_path.clone())?;
+ if let Some(meta_contents) = vfs.read(&meta_path_json5).with_not_found()? {
+ let mut metadata = Self::from_slice(&meta_contents, meta_path_json5.clone())?;
+ metadata.apply_all(snapshot)?;
+ } else if let Some(meta_contents) = vfs.read(&meta_path_json).with_not_found()? {
+ // Legacy fallback: .meta.json
+ let mut metadata = Self::from_slice(&meta_contents, meta_path_json.clone())?;
metadata.apply_all(snapshot)?;
}
// Rather than pushing these in the snapshot middleware, we can just do it here.
- snapshot.metadata.relevant_paths.push(meta_path);
+ snapshot.metadata.relevant_paths.push(meta_path_json5);
Ok(())
}
@@ -282,15 +289,21 @@ impl DirectoryMetadata {
path: &Path,
snapshot: &mut InstanceSnapshot,
) -> anyhow::Result<()> {
- let meta_path = path.join("init.meta.json5");
+ // Try modern extension first, then fall back to legacy
+ let meta_path_json5 = path.join("init.meta.json5");
+ let meta_path_json = path.join("init.meta.json");
- if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? {
- let mut metadata = Self::from_slice(&meta_contents, meta_path.clone())?;
+ if let Some(meta_contents) = vfs.read(&meta_path_json5).with_not_found()? {
+ let mut metadata = Self::from_slice(&meta_contents, meta_path_json5.clone())?;
+ metadata.apply_all(snapshot)?;
+ } else if let Some(meta_contents) = vfs.read(&meta_path_json).with_not_found()? {
+ // Legacy fallback: init.meta.json
+ let mut metadata = Self::from_slice(&meta_contents, meta_path_json.clone())?;
metadata.apply_all(snapshot)?;
}
// Rather than pushing these in the snapshot middleware, we can just do it here.
- snapshot.metadata.relevant_paths.push(meta_path);
+ snapshot.metadata.relevant_paths.push(meta_path_json5);
Ok(())
}
@@ -484,11 +497,20 @@ impl DirectoryMetadata {
/// Retrieves the meta file that should be applied for the provided directory,
/// if it exists.
pub fn dir_meta(vfs: &Vfs, path: &Path) -> anyhow::Result