From dd2e2ae9d035bb8ad97b92cb122a69c5dd7c232d Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Fri, 22 May 2026 12:46:41 +0200 Subject: [PATCH] feat: Added minification to CSS --- compiled.js | 56 ------------------------------------- src/compiler/models_impl.rs | 27 ++++++++---------- src/css.rs | 29 +++++++++++++++++++ src/route | 0 4 files changed, 41 insertions(+), 71 deletions(-) delete mode 100644 compiled.js delete mode 100644 src/route diff --git a/compiled.js b/compiled.js deleted file mode 100644 index 549ec48..0000000 --- a/compiled.js +++ /dev/null @@ -1,56 +0,0 @@ -(function() { - if (typeof Handlebars === 'undefined') { - const script = document.createElement('script'); - script.src = 'https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js'; - document.head.appendChild(script); - } - - const tempDefine = window.define; - window.define = undefined; - - const script = document.createElement('script'); - script.src = 'https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js'; - - script.onload = function() { - window.define = tempDefine; - - if (eval("(function() {\n return window.location.pathname === \"\";\n})()\n")) { - (function() { - - - const parsedData = eval("" || "(() => ({}))"); - const template = Handlebars.compile(""); - const rendered = template(parsedData); - const targetElement = document.querySelector(".foo { color: red; }"); - - const temp = document.createElement('template'); - temp.innerHTML = rendered; - - const newElement = temp.content.firstElementChild; - - targetElement.replaceWith(newElement); - - newElement.classList.add("template-style-762112231"); - - (function() { - - })(); -})(); - -} -if (eval("(function() {\n return window.location.pathname === \"\";\n})()\n")) { - -} - - - const domReadyEvent = new Event('DOMContentLoaded', { - bubbles: true, - cancelable: true, - }); - - document.dispatchEvent(domReadyEvent); - window.dispatchEvent(domReadyEvent); - }; - - document.head.appendChild(script); -})() diff --git a/src/compiler/models_impl.rs b/src/compiler/models_impl.rs index fb8bf6d..f01f932 100644 --- a/src/compiler/models_impl.rs +++ b/src/compiler/models_impl.rs @@ -1,7 +1,7 @@ use indoc::indoc; use serde_json; -use crate::css::scope_css; +use crate::css::{minify_css, scope_css}; use crate::compiler::models::{PageRoute, Project, Template}; use crate::js::minify_javascript; @@ -24,6 +24,9 @@ impl Project { script.onload = function() { window.define = tempDefine; + window.Handlebars.registerHelper('eq', function (a, b) { + return a === b; + }); {pages_script} @@ -42,21 +45,18 @@ impl Project { let mut script = String::new(); for page in &self.pages { - let style_script = page - .style - .as_ref() - .map_or(String::new(), |s| { - format!( - r#" + let style_script = page.style.as_ref().map_or(String::new(), |s| { + format!( + r#" (function() {{ const styleElement = document.createElement('style'); styleElement.textContent = {style}; document.head.appendChild(styleElement); }})(); "#, - style = serde_json::to_string(s).unwrap() - ) - }); + style = serde_json::to_string(&minify_css(s)).unwrap() + ) + }); let template_script = indoc! { r#" if (eval({page_route})) { @@ -130,7 +130,7 @@ impl Template { styleElement.textContent = {style}; document.head.appendChild(styleElement); "#, - style = serde_json::to_string(s).unwrap() + style = serde_json::to_string(&minify_css(s)).unwrap() ) }); @@ -200,10 +200,7 @@ impl Template { "# }; script_template - .replace( - "{style_script}", - &style_script.trim(), - ) + .replace("{style_script}", &style_script.trim()) .replace("{script}", &script) .replace( "{template}", diff --git a/src/css.rs b/src/css.rs index 42c1e1d..fcfcc7a 100644 --- a/src/css.rs +++ b/src/css.rs @@ -3,6 +3,35 @@ use lightningcss::{ targets::{Browsers, Targets}, }; +pub fn minify_css(raw_css: &str) -> String { + let stylesheet = StyleSheet::parse( + raw_css, + ParserOptions { + flags: ParserFlags::NESTING, + ..ParserOptions::default() + }, + ) + .expect("Failed to parse CSS"); + + let targets = Targets { + browsers: Some(Browsers { + chrome: Some(90 << 16), + ..Browsers::default() + }), + ..Targets::default() + }; + + let printed = stylesheet + .to_css(PrinterOptions { + minify: true, + targets, + ..PrinterOptions::default() + }) + .expect("Failed to serialize CSS"); + + printed.code +} + pub fn scope_css(raw_css: &str, scope_class: &str) -> String { let nested_css = format!(".{} {{\n{}\n}}", scope_class, raw_css); diff --git a/src/route b/src/route deleted file mode 100644 index e69de29..0000000