pub mod extra_args_warning;
pub mod formatting;
pub mod get_default_tsconfig_path;
pub mod gracefully_exit_on_prompt_error;
pub mod is_module_available;
pub mod load_configuration;
pub mod local_binaries;
pub mod os_info_utils;
pub mod project_utils;
pub mod remaining_flags;
pub mod tree_kill;
pub mod type_assertions;
pub use formatting::normalize_to_kebab_or_snake_case;
pub use get_default_tsconfig_path::get_default_tsconfig_path;
pub use is_module_available::is_module_available;
pub use remaining_flags::{
CommanderOption, camel_case_flag, get_remaining_flags, get_remaining_flags_simple,
};
pub fn normalize_to_path_case(value: &str) -> String {
let mut output = String::with_capacity(value.len());
let mut previous: Option<char> = None;
for character in value.chars() {
if character.is_ascii_uppercase()
&& previous
.is_some_and(|previous| previous.is_ascii_lowercase() || previous.is_ascii_digit())
{
output.push('-');
}
match character {
c if c.is_whitespace() => output.push('-'),
c if c.is_ascii_alphanumeric() || c == '_' || c == '-' => {
output.push(c.to_ascii_lowercase())
}
_ if !output.ends_with('-') => output.push('-'),
_ => {}
}
previous = Some(character);
}
output.trim_matches('-').to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn normalizes_camel_case() {
assert_eq!(normalize_to_kebab_or_snake_case("dryRun"), "dry-run");
}
#[test]
fn filters_consumed_remaining_flags() {
let args = vec![
"nest".to_string(),
"build".to_string(),
"--watch".to_string(),
"--webpack".to_string(),
];
assert_eq!(
get_remaining_flags_simple(&args, &["--watch"]),
vec!["--webpack".to_string()]
);
}
}