Skip to content

Commit 0f11a7d

Browse files
authored
Merge pull request #8 from mafr/feature/bundle
Add bundle_css method
2 parents 1ed867c + b2dc26b commit 0f11a7d

2 files changed

Lines changed: 66 additions & 2 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ name = "lightningcss"
99
crate-type = ["cdylib"]
1010

1111
[dependencies]
12-
pyo3 = { version = "0.24.0", features = ["extension-module"] }
12+
pyo3 = { version = "0.27.2", features = ["extension-module"] }
1313
browserslist-rs = "0.17.0"
1414
lightningcss = { version = "1.0.0-alpha.65", features = ["browserslist"] }

src/lib.rs

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
use std::collections::HashSet;
2+
use std::path::Path;
23

34
use pyo3::exceptions::PyValueError;
45
use pyo3::prelude::*;
56

67
use browserslist::Error as BrowserslistError;
7-
use lightningcss::stylesheet::{StyleSheet, MinifyOptions, ParserFlags, ParserOptions, PrinterOptions};
8+
use lightningcss::bundler::{Bundler, FileProvider};
9+
use lightningcss::stylesheet::{
10+
MinifyOptions, ParserFlags, ParserOptions, PrinterOptions, StyleSheet,
11+
};
812
use lightningcss::targets::{Browsers, Targets};
913

1014
/// Processes provided CSS and returns as a string.
@@ -109,11 +113,71 @@ fn mk_printer_options<'a>(targets: &Targets,
109113
};
110114
}
111115

116+
/// Bundles a CSS file and returns as a string.
117+
#[pyfunction]
118+
#[pyo3(signature = (
119+
path="",
120+
/,
121+
error_recovery=false,
122+
parser_flags=0,
123+
unused_symbols=None,
124+
browsers_list=None,
125+
minify=true,
126+
))]
127+
fn bundle_css(
128+
path: &str,
129+
error_recovery: bool,
130+
parser_flags: u8,
131+
unused_symbols: Option<HashSet<String>>,
132+
browsers_list: Option<Vec<String>>,
133+
minify: bool,
134+
) -> PyResult<String> {
135+
let fs = FileProvider::new();
136+
let mut bundler = Bundler::new(
137+
&fs,
138+
None,
139+
ParserOptions {
140+
error_recovery: error_recovery,
141+
flags: ParserFlags::from_bits_truncate(parser_flags),
142+
..Default::default()
143+
},
144+
);
145+
let mut stylesheet = bundler.bundle(Path::new(path)).unwrap();
146+
147+
let targets = match mk_targets(browsers_list) {
148+
Ok(val) => val,
149+
Err(e) => {
150+
return Err(PyValueError::new_err(format!(
151+
"browsers_list failed validation: {}",
152+
e.to_string()
153+
)))
154+
}
155+
};
156+
157+
match stylesheet.minify(mk_minify_options(unused_symbols, &targets)) {
158+
Ok(_) => {}
159+
Err(e) => {
160+
return Err(PyValueError::new_err(format!(
161+
"Minifying stylesheet failed: {}",
162+
e.to_string()
163+
)));
164+
}
165+
}
166+
return match stylesheet.to_css(mk_printer_options(&targets, minify)) {
167+
Ok(val) => Ok(val.code),
168+
Err(e) => Err(PyValueError::new_err(format!(
169+
"Printing stylesheet failed: {}",
170+
e.to_string()
171+
))),
172+
};
173+
}
174+
112175
/// A python wrapper for core functionality of lightningcss.
113176
#[pymodule]
114177
#[pyo3(name = "lightningcss")]
115178
fn pylightningcss(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
116179
m.add_function(wrap_pyfunction!(process_stylesheet, m)?)?;
117180
m.add_function(wrap_pyfunction!(calc_parser_flags, m)?)?;
181+
m.add_function(wrap_pyfunction!(bundle_css, m)?)?;
118182
Ok(())
119183
}

0 commit comments

Comments
 (0)