browserslist/queries/
node_bounded_range.rs

1use super::{Distrib, QueryResult};
2use crate::semver::loose_compare;
3use browserslist_data::node;
4use std::cmp::Ordering;
5
6pub(super) fn node_bounded_range(from: &str, to: &str) -> QueryResult {
7    let distribs = node::versions()
8        .iter()
9        .filter(|version| {
10            matches!(
11                loose_compare(version, from),
12                Ordering::Greater | Ordering::Equal
13            ) && matches!(loose_compare(version, to), Ordering::Less | Ordering::Equal)
14        })
15        .map(|version| Distrib::new("node", *version))
16        .collect();
17    Ok(distribs)
18}
19
20#[cfg(test)]
21mod tests {
22    use crate::{
23        error::Error,
24        opts::Opts,
25        test::{run_compare, should_failed},
26    };
27    use test_case::test_case;
28
29    #[test_case("node 4-6"; "semver major only")]
30    #[test_case("node 4-6.0.0"; "different semver formats")]
31    #[test_case("node 6.5-7.5"; "with semver minor")]
32    #[test_case("node 6.6.4-7.7.5"; "with semver patch")]
33    #[test_case("Node 4   -    6"; "more spaces 1")]
34    #[test_case("node 6.5    -  7.5"; "more spaces 2")]
35    #[test_case("node 6.6.4    -    7.7.5"; "more spaces 3")]
36    #[test_case("node 8.8.8.8-9.9.9.9"; "malformed version")]
37    fn valid(query: &str) {
38        run_compare(query, &Opts::default(), None);
39    }
40
41    #[test_case(
42        "node 6-8.a", Error::Nom(String::from("a"));
43        "malformed version"
44    )]
45    fn invalid(query: &str, error: Error) {
46        assert_eq!(should_failed(query, &Opts::default()), error);
47    }
48}