diff --git a/plugins/react-native/plugin.json b/plugins/react-native/plugin.json index 1743c62..d559181 100644 --- a/plugins/react-native/plugin.json +++ b/plugins/react-native/plugin.json @@ -51,22 +51,22 @@ "bash {{ .Virtenv }}/scripts/user/setup.sh" ], "start:metro": [ - "metro.sh start ${1:-default}" + "segkit metro start ${1:-default}" ], "stop:metro": [ - "metro.sh stop ${1:-default}" + "segkit metro stop ${1:-default}" ], "start:android": [ - "android.sh run \"${1:-}\"" + "segkit android run \"${1:-}\"" ], "start:ios": [ - "ios.sh run \"${1:-}\"" + "segkit ios run \"${1:-}\"" ], "rn:metro:port": [ - "rn.sh metro port ${1:-default}" + "segkit rn metro port ${1:-default}" ], "rn:metro:clean": [ - "rn.sh metro clean ${1:-default}" + "segkit rn metro clean ${1:-default}" ], "doctor": [ "bash {{ .Virtenv }}/scripts/user/doctor.sh" diff --git a/segkit/src/delegate.rs b/segkit/src/delegate.rs index 6e514d0..083f630 100644 --- a/segkit/src/delegate.rs +++ b/segkit/src/delegate.rs @@ -15,25 +15,27 @@ fn resolve_script(name: &str) -> Result { "invalid script name: {name}" ); - let platform = if name.starts_with("android") { - "ANDROID" + let env_keys: &[&str] = if name.starts_with("android") { + &["ANDROID_SCRIPTS_DIR"] } else if name.starts_with("ios") { - "IOS" + &["IOS_SCRIPTS_DIR"] } else { - "RN" + &["REACT_NATIVE_SCRIPTS_DIR"] }; - let env_key = format!("{}_SCRIPTS_DIR", platform); - if let Ok(scripts_dir) = std::env::var(&env_key) { - let path = format!("{}/user/{}", scripts_dir, name); - if std::path::Path::new(&path).exists() { - return Ok(path); + for env_key in env_keys { + if let Ok(scripts_dir) = std::env::var(env_key) { + let path = format!("{}/user/{}", scripts_dir, name); + if std::path::Path::new(&path).exists() { + return Ok(path); + } } } + let primary_key = env_keys[0]; which::which(name) .map(|p| p.to_string_lossy().into_owned()) - .with_context(|| format!("{name} not found in PATH or ${env_key}")) + .with_context(|| format!("{name} not found in PATH or ${primary_key}")) } fn append_timing(script: &str, args: &[String], duration_ms: u128, exit_code: i32) { diff --git a/segkit/src/main.rs b/segkit/src/main.rs index f9f913e..465b825 100644 --- a/segkit/src/main.rs +++ b/segkit/src/main.rs @@ -29,6 +29,11 @@ enum Commands { #[arg(trailing_var_arg = true, allow_hyphen_values = true)] args: Vec, }, + /// Metro bundler commands (delegates to metro.sh) + Metro { + #[arg(trailing_var_arg = true, allow_hyphen_values = true)] + args: Vec, + }, /// Check and install required dependencies (devbox) Setup, } @@ -40,6 +45,7 @@ fn main() -> ExitCode { Some(Commands::Android { args }) => delegate::run("android.sh", &args), Some(Commands::Ios { args }) => delegate::run("ios.sh", &args), Some(Commands::Rn { args }) => delegate::run("rn.sh", &args), + Some(Commands::Metro { args }) => delegate::run("metro.sh", &args), Some(Commands::Setup) => setup::run(), None => { println!("segkit {}", env!("CARGO_PKG_VERSION")); diff --git a/segkit/tests/cli.rs b/segkit/tests/cli.rs index 9a86b53..2d3f418 100644 --- a/segkit/tests/cli.rs +++ b/segkit/tests/cli.rs @@ -23,6 +23,7 @@ fn help_flag() { .stdout(predicate::str::contains("android")) .stdout(predicate::str::contains("ios")) .stdout(predicate::str::contains("rn")) + .stdout(predicate::str::contains("metro")) .stdout(predicate::str::contains("setup")); } @@ -61,13 +62,24 @@ fn ios_subcommand_without_script_fails_gracefully() { fn rn_subcommand_without_script_fails_gracefully() { segkit() .args(["rn", "doctor"]) - .env_remove("RN_SCRIPTS_DIR") + .env_remove("REACT_NATIVE_SCRIPTS_DIR") .env("PATH", "") .assert() .failure() .stderr(predicate::str::contains("rn.sh not found")); } +#[test] +fn metro_subcommand_without_script_fails_gracefully() { + segkit() + .args(["metro", "start", "ios"]) + .env_remove("REACT_NATIVE_SCRIPTS_DIR") + .env("PATH", "") + .assert() + .failure() + .stderr(predicate::str::contains("metro.sh not found")); +} + #[test] fn setup_detects_devbox() { segkit()