Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ LightningCSS.transform(".a { color: oklch(60% .2 30) }", targets: { safari: "15.

Prefer a `String` for a minor version above 9, since `16.10` as a `Float` is `16.1`.

The browsers it reads are `android`, `chrome`, `edge`, `firefox`, `ie`, `ios_saf` (or `ios`), `opera`, `safari`, and `samsung`. Any other name raises a `LightningCSS::OptionError`.

#### Bundling

`bundle` resolves the `@import` statements a stylesheet was written with by reading the files they name, so it takes a path on disk to the entry stylesheet.
Expand Down
22 changes: 21 additions & 1 deletion rust/src/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,12 +102,32 @@ impl Version {
}
}

const BROWSERS: [&str; 10] = [
"android", "chrome", "edge", "firefox", "ie", "ios", "ios_saf", "opera", "safari", "samsung",
];

impl TransformOptions {
pub fn to_targets(&self) -> Result<Targets, String> {
let Some(versions) = &self.targets else {
return Ok(Targets::default());
};

let mut unknown: Vec<&str> = versions
.keys()
.map(String::as_str)
.filter(|name| !BROWSERS.contains(name))
.collect();

if !unknown.is_empty() {
unknown.sort_unstable();

return Err(format!(
"Unknown browser{} in targets: {}",
if unknown.len() > 1 { "s" } else { "" },
unknown.join(", ")
));
}

let mut browsers = Browsers::default();

for (name, version) in versions {
Expand All @@ -127,7 +147,7 @@ impl TransformOptions {
"opera" => browsers.opera = encoded,
"safari" => browsers.safari = encoded,
"samsung" => browsers.samsung = encoded,
_ => {}
_ => unreachable!(),
}
}

Expand Down
24 changes: 24 additions & 0 deletions test/lightningcss/targets_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,30 @@ class TargetsTest < Minitest::Spec
end
end

test "raises an option error for a browser it does not know" do
error = assert_raises(OptionError) { LightningCSS.transform(".a{}", targets: { safar: 15 }) }

assert_equal "Unknown browser in targets: safar", error.message
end

test "names every browser it does not know, in order" do
error = assert_raises(OptionError) { LightningCSS.transform(".a{}", targets: { netscape: 4, chrome: 100, mosaic: 1 }) }

assert_equal "Unknown browsers in targets: mosaic, netscape", error.message
end

test "raises for a browser it does not know before reading any version" do
error = assert_raises(OptionError) { LightningCSS.transform(".a{}", targets: { safari: "x", safar: 15 }) }

assert_equal "Unknown browser in targets: safar", error.message
end

test "reads ios as ios_saf" do
code = LightningCSS.transform(".a { color: oklch(60% .2 30) }", targets: { ios: "15.4" }, minify: true).code

assert_equal ".a{color:oklch(60% .2 30)}", code
end

test "raises an option error for a negative version" do
error = assert_raises(OptionError) { LightningCSS.transform(".a{}", targets: { safari: -1 }) }

Expand Down
Loading