From 765658be9b535e2f1e71372e511b31255362b83b Mon Sep 17 00:00:00 2001 From: Stefan Maric Date: Thu, 27 Jun 2024 17:59:28 +0200 Subject: [PATCH 1/2] Add bundle_css method --- src/lib.rs | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index ef219bc..6d6421a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,14 @@ use std::collections::HashSet; +use std::path::Path; use pyo3::exceptions::PyValueError; use pyo3::prelude::*; use browserslist::Error as BrowserslistError; -use lightningcss::stylesheet::{StyleSheet, MinifyOptions, ParserFlags, ParserOptions, PrinterOptions}; +use lightningcss::bundler::{Bundler, FileProvider}; +use lightningcss::stylesheet::{ + MinifyOptions, ParserFlags, ParserOptions, PrinterOptions, StyleSheet, +}; use lightningcss::targets::{Browsers, Targets}; /// Processes provided CSS and returns as a string. @@ -109,11 +113,71 @@ fn mk_printer_options<'a>(targets: &Targets, }; } +/// Bundles a CSS file and returns as a string. +#[pyfunction] +#[pyo3(signature = ( + path="", + /, + error_recovery=false, + parser_flags=0, + unused_symbols=None, + browsers_list=None, + minify=true, +))] +fn bundle_css( + path: &str, + error_recovery: bool, + parser_flags: u8, + unused_symbols: Option>, + browsers_list: Option>, + minify: bool, +) -> PyResult { + let fs = FileProvider::new(); + let mut bundler = Bundler::new( + &fs, + None, + ParserOptions { + error_recovery: error_recovery, + flags: ParserFlags::from_bits_truncate(parser_flags), + ..Default::default() + }, + ); + let mut stylesheet = bundler.bundle(Path::new(path)).unwrap(); + + let targets = match mk_targets(browsers_list) { + Ok(val) => val, + Err(e) => { + return Err(PyValueError::new_err(format!( + "browsers_list failed validation: {}", + e.to_string() + ))) + } + }; + + match stylesheet.minify(mk_minify_options(unused_symbols, &targets)) { + Ok(_) => {} + Err(e) => { + return Err(PyValueError::new_err(format!( + "Minifying stylesheet failed: {}", + e.to_string() + ))); + } + } + return match stylesheet.to_css(mk_printer_options(&targets, minify)) { + Ok(val) => Ok(val.code), + Err(e) => Err(PyValueError::new_err(format!( + "Printing stylesheet failed: {}", + e.to_string() + ))), + }; +} + /// A python wrapper for core functionality of lightningcss. #[pymodule] #[pyo3(name = "lightningcss")] fn pylightningcss(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(process_stylesheet, m)?)?; m.add_function(wrap_pyfunction!(calc_parser_flags, m)?)?; + m.add_function(wrap_pyfunction!(bundle_css, m)?)?; Ok(()) } From b2dc26bce311358b548b1d341ea5ec80b35d9e92 Mon Sep 17 00:00:00 2001 From: Daniel Foerster Date: Sun, 14 Dec 2025 08:56:07 -0600 Subject: [PATCH 2/2] Update pyo3 dependency version to 0.27.2 Adds Python 3.14 support --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 563d683..2c76cf2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,6 @@ name = "lightningcss" crate-type = ["cdylib"] [dependencies] -pyo3 = { version = "0.24.0", features = ["extension-module"] } +pyo3 = { version = "0.27.2", features = ["extension-module"] } browserslist-rs = "0.17.0" lightningcss = { version = "1.0.0-alpha.65", features = ["browserslist"] }