Feat: Manganis SCSS Support (#3294)
* feat: scss manganis support * revision: make ScssLogger private
This commit is contained in:
1 parent
e6f76c7e75
commit
bff5478fdf
5 files changed
+133
-1
No files matched your search
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,8 @@ use anyhow::Context;
|
||||
use manganis_core::{AssetOptions, CssAssetOptions, ImageAssetOptions, JsAssetOptions};
|
||||
use std::path::Path;
|
||||
|
||||
use crate::css::process_scss;
|
||||
|
||||
use super::{
|
||||
css::process_css, folder::process_folder, image::process_image, js::process_js,
|
||||
json::process_json,
|
||||
@@ -29,6 +31,9 @@ pub fn process_file_to(
|
||||
Some("css") => {
|
||||
process_css(&CssAssetOptions::new(), source, output_path)?;
|
||||
}
|
||||
Some("scss" | "sass") => {
|
||||
process_scss(&CssAssetOptions::new(), source, output_path)?;
|
||||
}
|
||||
Some("js") => {
|
||||
process_js(&JsAssetOptions::new(), source, output_path)?;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user