Feat: Manganis SCSS Support (#3294)

* feat: scss manganis support

* revision: make ScssLogger private
This commit is contained in:
Miles Murgaw authored and GitHub committed 2024-12-05 10:41:44 -08:00
1 parent e6f76c7e75
commit bff5478fdf
5 files changed
+133 -1

No files matched your search

+57
View File
@@ -1,11 +1,14 @@
use std::path::Path;
use anyhow::Context;
use codemap::SpanLoc;
use grass::OutputStyle;
use lightningcss::{
printer::PrinterOptions,
stylesheet::{MinifyOptions, ParserOptions, StyleSheet},
};
use manganis_core::CssAssetOptions;
use tracing::{debug, warn};
pub(crate) fn process_css(
css_options: &CssAssetOptions,
@@ -40,3 +43,57 @@ pub(crate) fn minify_css(css: &str) -> String {
let res = stylesheet.to_css(printer).unwrap();
res.code
}
/// Process an scss/sass file into css.
pub(crate) fn process_scss(
scss_options: &CssAssetOptions,
source: &Path,
output_path: &Path,
) -> anyhow::Result<()> {
let style = match scss_options.minified() {
true => OutputStyle::Compressed,
false => OutputStyle::Expanded,
};
let options = grass::Options::default()
.style(style)
.quiet(false)
.logger(&ScssLogger {});
let css = grass::from_path(source, &options)?;
let minified = minify_css(&css);
std::fs::write(output_path, minified).with_context(|| {
format!(
"Failed to write css to output location: {}",
output_path.display()
)
})?;
Ok(())
}
/// Logger for Grass that re-uses their StdLogger formatting but with tracing.
#[derive(Debug)]
struct ScssLogger {}
impl grass::Logger for ScssLogger {
fn debug(&self, location: SpanLoc, message: &str) {
debug!(
"{}:{} DEBUG: {}",
location.file.name(),
location.begin.line + 1,
message
);
}
fn warn(&self, location: SpanLoc, message: &str) {
warn!(
"Warning: {}\n ./{}:{}:{}",
message,
location.file.name(),
location.begin.line + 1,
location.begin.column + 1
);
}
}