From 09c90b79e8b3025109fae0e633080b484b8fceec Mon Sep 17 00:00:00 2001 From: Yiffy Dev Date: Fri, 13 Dec 2024 01:26:23 +0500 Subject: [PATCH] fix: allow duplicate selectors in scope, coz its safe to have them, coz hashing isnt affected by selector position --- sabry_intrnl/src/compiler/mod.rs | 7 +----- sabry_intrnl/src/scoper/mod.rs | 3 +++ sabry_procmacro_impl/Cargo.toml | 1 + sabry_procmacro_impl/src/impls/styly.rs | 3 +++ tests/assets/repeating-selector.sass | 17 +++++++++++++ tests/assets/repeating-selector.scss | 24 +++++++++++++++++++ tests/macros.rs | 6 ++--- .../compilation_with_buildy@bundle.css.snap | 4 ++-- ...y@scopes__repeating_selector_sass.css.snap | 7 ++++++ ...y@scopes__repeating_selector_scss.css.snap | 7 ++++++ 10 files changed, 68 insertions(+), 11 deletions(-) create mode 100644 tests/assets/repeating-selector.sass create mode 100644 tests/assets/repeating-selector.scss create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__repeating_selector_sass.css.snap create mode 100644 tests/sabry_output_snapshots/compilation_with_buildy@scopes__repeating_selector_scss.css.snap diff --git a/sabry_intrnl/src/compiler/mod.rs b/sabry_intrnl/src/compiler/mod.rs index a789585..374d527 100644 --- a/sabry_intrnl/src/compiler/mod.rs +++ b/sabry_intrnl/src/compiler/mod.rs @@ -28,12 +28,7 @@ impl CompilerAdapter { ) -> Result { let options = grass::Options::from(&self.config).input_syntax(syntax.into()); - let mut css = grass::from_string(code, &options)?; - - css = match self.lightningcss(&css) { - Ok(c) => c, - Err(e) => return Err(e), - }; + let css = self.lightningcss(&grass::from_string(code, &options)?)?; Ok(css) } diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index fdfb84e..112ffe3 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -140,6 +140,7 @@ impl<'s> HashedScope<'s> { /// Struct which represents hashed selector inside of [HashedScope]. /// /// Does not hold information about hash itself, as meant to be inside of scope. +#[derive(PartialEq, Eq, Hash)] pub struct HashedSelector { /// Basic unrelated to hash info about this selector pub sel: ScopedSelector, @@ -258,6 +259,7 @@ impl HashedSelector { } /// Just any unary CSS-ish selector +#[derive(PartialEq, Eq, Hash)] pub struct ArbitrarySelector { /// CSS-ish identifier pub ident: String, @@ -266,6 +268,7 @@ pub struct ArbitrarySelector { } /// Any unary CSS-ish selector, that's able to be scoped, and then hashed +#[derive(PartialEq, Eq, Hash)] pub enum ScopedSelector { Class(ArbitrarySelector), Id(ArbitrarySelector), diff --git a/sabry_procmacro_impl/Cargo.toml b/sabry_procmacro_impl/Cargo.toml index 522fa2f..e4a2b50 100644 --- a/sabry_procmacro_impl/Cargo.toml +++ b/sabry_procmacro_impl/Cargo.toml @@ -16,6 +16,7 @@ quote = {version = "^1.0"} proc-macro2 = {version = "^1.0", features = ["span-locations"]} raffia = {version = "^0.9"} regex = {version = "^1.11"} +itertools = {version = "^0.13"} [features] nightly = [] diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 8231201..5d896d3 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -1,5 +1,6 @@ use std::path::PathBuf; +use itertools::Itertools; use proc_macro2::{Span, TokenStream}; use quote::quote; use sabry_intrnl::{ @@ -94,6 +95,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option) -> Tok interp }) }) + .unique() .map(|s| { let ident = apply_basic_rusty_member_gen_rules(&s); let fnident = syn::parse_str::(format!("_{ident}").as_str()) @@ -110,6 +112,7 @@ pub fn styly_macro_impl(input: TokenStream, source_path: Option) -> Tok let scope_members = scope .hashed_selectors .iter() + .unique() .filter_map(|hs| { hs.html_ident.clone().map(|html| { let name = match hs.sel { diff --git a/tests/assets/repeating-selector.sass b/tests/assets/repeating-selector.sass new file mode 100644 index 0000000..0fe3aef --- /dev/null +++ b/tests/assets/repeating-selector.sass @@ -0,0 +1,17 @@ +.el1 + color: red + &-mob + color: blue + + &__blist + list-style: none + +.el2 + color: white + &-mob + color: black + + &__blist + background: white + &-mob + background: black diff --git a/tests/assets/repeating-selector.scss b/tests/assets/repeating-selector.scss new file mode 100644 index 0000000..7cf81f6 --- /dev/null +++ b/tests/assets/repeating-selector.scss @@ -0,0 +1,24 @@ +.el1 { + color: red; + &-mob { + color: blue; + } + + &__blist { + list-style: none; + } +} + +.el2 { + color: white; + &-mob { + color: black; + } + + &__blist { + background: white; + &-mob { + background: black; + } + } +} diff --git a/tests/macros.rs b/tests/macros.rs index bcb013a..765a63b 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -82,6 +82,8 @@ styly!(module_usage_sass:sass "tests/assets/module-usage.sass"); styly!(module_usage_scss:scss "tests/assets/module-usage.scss"); styly!(use_forwarded_sass:sass "tests/assets/use-forwarded.sass"); styly!(use_forwarded_scss:scss "tests/assets/use-forwarded.scss"); +styly!(repeating_selector_sass:sass "tests/assets/repeating-selector.sass"); +styly!(repeating_selector_scss:scss "tests/assets/repeating-selector.scss"); #[test] fn ensure_inline_matches_file() { @@ -154,9 +156,7 @@ mod build_tests { fn gen_builder() -> SabryBuilder { let config = gen_config(); - let builder = SabryBuilder::new(config); - - builder + SabryBuilder::new(config) } #[test] diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap index e0d861c..a577331 100644 --- a/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap +++ b/tests/sabry_output_snapshots/compilation_with_buildy@bundle.css.snap @@ -1,7 +1,7 @@ --- source: tests/macros.rs -assertion_line: 170 +assertion_line: 183 input_file: tests/sabry_output/bundle.css snapshot_kind: text --- -.smfXzGrnTs2kl9jPP0nk6w.fuzz{background-color:red;display:block}.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark{color:#fff;background-color:#000}.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w{text-transform:uppercase}.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w img.smfXzGrnTs2kl9jPP0nk6w{position:absolute;top:0;left:10rem}.smfXzGrnTs2kl9jPP0nk6w.fuzz span.smfXzGrnTs2kl9jPP0nk6w{grid-template-areas:"a b c""d e f""x x x";display:block;position:relative}.FT5yVVwswyLvNU3dIk0qw.fuzz{background-color:red;display:block}.FT5yVVwswyLvNU3dIk0qw.fuzz-dark{color:#fff;background-color:#000}.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw{text-transform:uppercase}.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw img.FT5yVVwswyLvNU3dIk0qw{position:absolute;top:0;left:10rem}.FT5yVVwswyLvNU3dIk0qw.fuzz span.FT5yVVwswyLvNU3dIk0qw{grid-template-areas:"a b c""d e f""x x x";display:block;position:relative}.n5vGKZlIscA58H8d7ZMOhSw.coated{color:#fff;background-color:green}.n5vGKZlIscA58H8d7ZMOhSw.coated:after{content:"Colored";color:#000;background-color:#00f}.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover{-ms-transform:scale(2);transform:scale(2)}.n5vGKZlIscA58H8d7ZMOhSw.coated:hover{-ms-transform:translate(10%);transform:translate(10%)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark{color:#c6c6c6;background-color:#0ff}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after{content:"Colored";color:red;background-color:#00f}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after:hover{-ms-transform:scale(2);transform:scale(2)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:hover{-ms-transform:translate(10%);transform:translate(10%)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw{color:#c6c6c6;background-color:#0ff}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after{content:"Colored";color:#00f;background-color:#00f}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after:hover{-ms-transform:scale(2);transform:scale(2)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:hover{-ms-transform:translate(10%);transform:translate(10%)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw{color:#fff;background-color:green}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after{content:"Colored";color:#000;background-color:#00f}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after:hover{-ms-transform:scale(2);transform:scale(2)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:hover{-ms-transform:translate(10%);transform:translate(10%)}.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw{color:#c6c6c6;background-color:#0ff;display:block}.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after{content:"Colored";color:green;background-color:#00f}.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after:hover{-ms-transform:scale(2);transform:scale(2)}.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:hover{-ms-transform:translate(10%);transform:translate(10%)}.n6ROVrVzYikGtxgKBYy11kA.coated{color:#fff;background-color:green}.n6ROVrVzYikGtxgKBYy11kA.coated:after{content:"Colored";color:#000;background-color:#00f}.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover{-ms-transform:scale(2);transform:scale(2)}.n6ROVrVzYikGtxgKBYy11kA.coated:hover{-ms-transform:translate(10%);transform:translate(10%)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark{color:#c6c6c6;background-color:#0ff}.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after{content:"Colored";color:red;background-color:#00f}.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after:hover{-ms-transform:scale(2);transform:scale(2)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark:hover{-ms-transform:translate(10%);transform:translate(10%)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA{color:#c6c6c6;background-color:#0ff}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after{content:"Colored";color:#00f;background-color:#00f}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after:hover{-ms-transform:scale(2);transform:scale(2)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:hover{-ms-transform:translate(10%);transform:translate(10%)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA{color:#fff;background-color:green}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after{content:"Colored";color:#000;background-color:#00f}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after:hover{-ms-transform:scale(2);transform:scale(2)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:hover{-ms-transform:translate(10%);transform:translate(10%)}.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA{color:#c6c6c6;background-color:#0ff;display:block}.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after{content:"Colored";color:green;background-color:#00f}.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after:hover{-ms-transform:scale(2);transform:scale(2)}.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:hover{-ms-transform:translate(10%);transform:translate(10%)}.qK4fsMeZRSTGObSesXXRBA.coated{color:#fff;background-color:green}.qK4fsMeZRSTGObSesXXRBA.coated:after{content:"Colored";color:#000;background-color:#00f}.qK4fsMeZRSTGObSesXXRBA.coated:after:hover{-ms-transform:scale(2);transform:scale(2)}.qK4fsMeZRSTGObSesXXRBA.coated:hover{-ms-transform:translate(10%);transform:translate(10%)}.qK4fsMeZRSTGObSesXXRBA.coated-dark{color:#c6c6c6;background-color:#0ff}.qK4fsMeZRSTGObSesXXRBA.coated-dark:after{content:"Colored";color:red;background-color:#00f}.qK4fsMeZRSTGObSesXXRBA.coated-dark:after:hover{-ms-transform:scale(2);transform:scale(2)}.qK4fsMeZRSTGObSesXXRBA.coated-dark:hover{-ms-transform:translate(10%);transform:translate(10%)}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA{color:#c6c6c6;background-color:#0ff}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after{content:"Colored";color:#00f;background-color:#00f}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after:hover{-ms-transform:scale(2);transform:scale(2)}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:hover{-ms-transform:translate(10%);transform:translate(10%)}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA{color:#fff;background-color:green}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after{content:"Colored";color:#000;background-color:#00f}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after:hover{-ms-transform:scale(2);transform:scale(2)}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:hover{-ms-transform:translate(10%);transform:translate(10%)}.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA{color:#c6c6c6;background-color:#0ff;display:block}.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after{content:"Colored";color:green;background-color:#00f}.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after:hover{-ms-transform:scale(2);transform:scale(2)}.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:hover{-ms-transform:translate(10%);transform:translate(10%)}.FMHIHNH4_QHxbUqdVmS1A.coated{color:#fff;background-color:green}.FMHIHNH4_QHxbUqdVmS1A.coated:after{content:"Colored";color:#000;background-color:#00f}.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover{-ms-transform:scale(2);transform:scale(2)}.FMHIHNH4_QHxbUqdVmS1A.coated:hover{-ms-transform:translate(10%);transform:translate(10%)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark{color:#c6c6c6;background-color:#0ff}.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after{content:"Colored";color:red;background-color:#00f}.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after:hover{-ms-transform:scale(2);transform:scale(2)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark:hover{-ms-transform:translate(10%);transform:translate(10%)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A{color:#c6c6c6;background-color:#0ff}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after{content:"Colored";color:#00f;background-color:#00f}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after:hover{-ms-transform:scale(2);transform:scale(2)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:hover{-ms-transform:translate(10%);transform:translate(10%)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A{color:#fff;background-color:green}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after{content:"Colored";color:#000;background-color:#00f}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after:hover{-ms-transform:scale(2);transform:scale(2)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:hover{-ms-transform:translate(10%);transform:translate(10%)}.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A{color:#c6c6c6;background-color:#0ff;display:block}.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after{content:"Colored";color:green;background-color:#00f}.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after:hover{-ms-transform:scale(2);transform:scale(2)}.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover{-ms-transform:translate(10%);transform:translate(10%)} +.smfXzGrnTs2kl9jPP0nk6w.fuzz{background-color:red;display:block}.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark{color:#fff;background-color:#000}.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w{text-transform:uppercase}.smfXzGrnTs2kl9jPP0nk6w.fuzz-dark a.smfXzGrnTs2kl9jPP0nk6w img.smfXzGrnTs2kl9jPP0nk6w{position:absolute;top:0;left:10rem}.smfXzGrnTs2kl9jPP0nk6w.fuzz span.smfXzGrnTs2kl9jPP0nk6w{grid-template-areas:"a b c""d e f""x x x";display:block;position:relative}.FT5yVVwswyLvNU3dIk0qw.fuzz{background-color:red;display:block}.FT5yVVwswyLvNU3dIk0qw.fuzz-dark{color:#fff;background-color:#000}.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw{text-transform:uppercase}.FT5yVVwswyLvNU3dIk0qw.fuzz-dark a.FT5yVVwswyLvNU3dIk0qw img.FT5yVVwswyLvNU3dIk0qw{position:absolute;top:0;left:10rem}.FT5yVVwswyLvNU3dIk0qw.fuzz span.FT5yVVwswyLvNU3dIk0qw{grid-template-areas:"a b c""d e f""x x x";display:block;position:relative}.n5vGKZlIscA58H8d7ZMOhSw.coated{color:#fff;background-color:green}.n5vGKZlIscA58H8d7ZMOhSw.coated:after{content:"Colored";color:#000;background-color:#00f}.n5vGKZlIscA58H8d7ZMOhSw.coated:after:hover{-ms-transform:scale(2);transform:scale(2)}.n5vGKZlIscA58H8d7ZMOhSw.coated:hover{-ms-transform:translate(10%);transform:translate(10%)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark{color:#c6c6c6;background-color:#0ff}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after{content:"Colored";color:red;background-color:#00f}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:after:hover{-ms-transform:scale(2);transform:scale(2)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark:hover{-ms-transform:translate(10%);transform:translate(10%)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw{color:#c6c6c6;background-color:#0ff}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after{content:"Colored";color:#00f;background-color:#00f}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:after:hover{-ms-transform:scale(2);transform:scale(2)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw:hover{-ms-transform:translate(10%);transform:translate(10%)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw{color:#fff;background-color:green}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after{content:"Colored";color:#000;background-color:#00f}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:after:hover{-ms-transform:scale(2);transform:scale(2)}.n5vGKZlIscA58H8d7ZMOhSw.coated-dark a.n5vGKZlIscA58H8d7ZMOhSw img.n5vGKZlIscA58H8d7ZMOhSw:hover{-ms-transform:translate(10%);transform:translate(10%)}.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw{color:#c6c6c6;background-color:#0ff;display:block}.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after{content:"Colored";color:green;background-color:#00f}.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:after:hover{-ms-transform:scale(2);transform:scale(2)}.n5vGKZlIscA58H8d7ZMOhSw.coated span.n5vGKZlIscA58H8d7ZMOhSw:hover{-ms-transform:translate(10%);transform:translate(10%)}.n6ROVrVzYikGtxgKBYy11kA.coated{color:#fff;background-color:green}.n6ROVrVzYikGtxgKBYy11kA.coated:after{content:"Colored";color:#000;background-color:#00f}.n6ROVrVzYikGtxgKBYy11kA.coated:after:hover{-ms-transform:scale(2);transform:scale(2)}.n6ROVrVzYikGtxgKBYy11kA.coated:hover{-ms-transform:translate(10%);transform:translate(10%)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark{color:#c6c6c6;background-color:#0ff}.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after{content:"Colored";color:red;background-color:#00f}.n6ROVrVzYikGtxgKBYy11kA.coated-dark:after:hover{-ms-transform:scale(2);transform:scale(2)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark:hover{-ms-transform:translate(10%);transform:translate(10%)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA{color:#c6c6c6;background-color:#0ff}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after{content:"Colored";color:#00f;background-color:#00f}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:after:hover{-ms-transform:scale(2);transform:scale(2)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA:hover{-ms-transform:translate(10%);transform:translate(10%)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA{color:#fff;background-color:green}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after{content:"Colored";color:#000;background-color:#00f}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:after:hover{-ms-transform:scale(2);transform:scale(2)}.n6ROVrVzYikGtxgKBYy11kA.coated-dark a.n6ROVrVzYikGtxgKBYy11kA img.n6ROVrVzYikGtxgKBYy11kA:hover{-ms-transform:translate(10%);transform:translate(10%)}.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA{color:#c6c6c6;background-color:#0ff;display:block}.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after{content:"Colored";color:green;background-color:#00f}.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:after:hover{-ms-transform:scale(2);transform:scale(2)}.n6ROVrVzYikGtxgKBYy11kA.coated span.n6ROVrVzYikGtxgKBYy11kA:hover{-ms-transform:translate(10%);transform:translate(10%)}.qK4fsMeZRSTGObSesXXRBA.coated{color:#fff;background-color:green}.qK4fsMeZRSTGObSesXXRBA.coated:after{content:"Colored";color:#000;background-color:#00f}.qK4fsMeZRSTGObSesXXRBA.coated:after:hover{-ms-transform:scale(2);transform:scale(2)}.qK4fsMeZRSTGObSesXXRBA.coated:hover{-ms-transform:translate(10%);transform:translate(10%)}.qK4fsMeZRSTGObSesXXRBA.coated-dark{color:#c6c6c6;background-color:#0ff}.qK4fsMeZRSTGObSesXXRBA.coated-dark:after{content:"Colored";color:red;background-color:#00f}.qK4fsMeZRSTGObSesXXRBA.coated-dark:after:hover{-ms-transform:scale(2);transform:scale(2)}.qK4fsMeZRSTGObSesXXRBA.coated-dark:hover{-ms-transform:translate(10%);transform:translate(10%)}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA{color:#c6c6c6;background-color:#0ff}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after{content:"Colored";color:#00f;background-color:#00f}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:after:hover{-ms-transform:scale(2);transform:scale(2)}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA:hover{-ms-transform:translate(10%);transform:translate(10%)}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA{color:#fff;background-color:green}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after{content:"Colored";color:#000;background-color:#00f}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:after:hover{-ms-transform:scale(2);transform:scale(2)}.qK4fsMeZRSTGObSesXXRBA.coated-dark a.qK4fsMeZRSTGObSesXXRBA img.qK4fsMeZRSTGObSesXXRBA:hover{-ms-transform:translate(10%);transform:translate(10%)}.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA{color:#c6c6c6;background-color:#0ff;display:block}.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after{content:"Colored";color:green;background-color:#00f}.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:after:hover{-ms-transform:scale(2);transform:scale(2)}.qK4fsMeZRSTGObSesXXRBA.coated span.qK4fsMeZRSTGObSesXXRBA:hover{-ms-transform:translate(10%);transform:translate(10%)}.FMHIHNH4_QHxbUqdVmS1A.coated{color:#fff;background-color:green}.FMHIHNH4_QHxbUqdVmS1A.coated:after{content:"Colored";color:#000;background-color:#00f}.FMHIHNH4_QHxbUqdVmS1A.coated:after:hover{-ms-transform:scale(2);transform:scale(2)}.FMHIHNH4_QHxbUqdVmS1A.coated:hover{-ms-transform:translate(10%);transform:translate(10%)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark{color:#c6c6c6;background-color:#0ff}.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after{content:"Colored";color:red;background-color:#00f}.FMHIHNH4_QHxbUqdVmS1A.coated-dark:after:hover{-ms-transform:scale(2);transform:scale(2)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark:hover{-ms-transform:translate(10%);transform:translate(10%)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A{color:#c6c6c6;background-color:#0ff}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after{content:"Colored";color:#00f;background-color:#00f}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:after:hover{-ms-transform:scale(2);transform:scale(2)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A:hover{-ms-transform:translate(10%);transform:translate(10%)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A{color:#fff;background-color:green}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after{content:"Colored";color:#000;background-color:#00f}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:after:hover{-ms-transform:scale(2);transform:scale(2)}.FMHIHNH4_QHxbUqdVmS1A.coated-dark a.FMHIHNH4_QHxbUqdVmS1A img.FMHIHNH4_QHxbUqdVmS1A:hover{-ms-transform:translate(10%);transform:translate(10%)}.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A{color:#c6c6c6;background-color:#0ff;display:block}.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after{content:"Colored";color:green;background-color:#00f}.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:after:hover{-ms-transform:scale(2);transform:scale(2)}.FMHIHNH4_QHxbUqdVmS1A.coated span.FMHIHNH4_QHxbUqdVmS1A:hover{-ms-transform:translate(10%);transform:translate(10%)}.rWkBO00R__2y_lbRfXlyg.el1{color:red}.rWkBO00R__2y_lbRfXlyg.el1-mob{color:#00f}.rWkBO00R__2y_lbRfXlyg.el1__blist{list-style:none}.rWkBO00R__2y_lbRfXlyg.el2{color:#fff}.rWkBO00R__2y_lbRfXlyg.el2-mob{color:#000}.rWkBO00R__2y_lbRfXlyg.el2__blist{background:#fff}.rWkBO00R__2y_lbRfXlyg.el2__blist-mob{background:#000}.YYYksiQMfU3exD720ckMbA.el1{color:red}.YYYksiQMfU3exD720ckMbA.el1-mob{color:#00f}.YYYksiQMfU3exD720ckMbA.el1__blist{list-style:none}.YYYksiQMfU3exD720ckMbA.el2{color:#fff}.YYYksiQMfU3exD720ckMbA.el2-mob{color:#000}.YYYksiQMfU3exD720ckMbA.el2__blist{background:#fff}.YYYksiQMfU3exD720ckMbA.el2__blist-mob{background:#000} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__repeating_selector_sass.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__repeating_selector_sass.css.snap new file mode 100644 index 0000000..904488c --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__repeating_selector_sass.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 183 +input_file: tests/sabry_output/scopes/repeating_selector_sass.css +snapshot_kind: text +--- +.rWkBO00R__2y_lbRfXlyg.el1{color:red}.rWkBO00R__2y_lbRfXlyg.el1-mob{color:#00f}.rWkBO00R__2y_lbRfXlyg.el1__blist{list-style:none}.rWkBO00R__2y_lbRfXlyg.el2{color:#fff}.rWkBO00R__2y_lbRfXlyg.el2-mob{color:#000}.rWkBO00R__2y_lbRfXlyg.el2__blist{background:#fff}.rWkBO00R__2y_lbRfXlyg.el2__blist-mob{background:#000} diff --git a/tests/sabry_output_snapshots/compilation_with_buildy@scopes__repeating_selector_scss.css.snap b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__repeating_selector_scss.css.snap new file mode 100644 index 0000000..efc723b --- /dev/null +++ b/tests/sabry_output_snapshots/compilation_with_buildy@scopes__repeating_selector_scss.css.snap @@ -0,0 +1,7 @@ +--- +source: tests/macros.rs +assertion_line: 183 +input_file: tests/sabry_output/scopes/repeating_selector_scss.css +snapshot_kind: text +--- +.YYYksiQMfU3exD720ckMbA.el1{color:red}.YYYksiQMfU3exD720ckMbA.el1-mob{color:#00f}.YYYksiQMfU3exD720ckMbA.el1__blist{list-style:none}.YYYksiQMfU3exD720ckMbA.el2{color:#fff}.YYYksiQMfU3exD720ckMbA.el2-mob{color:#000}.YYYksiQMfU3exD720ckMbA.el2__blist{background:#fff}.YYYksiQMfU3exD720ckMbA.el2__blist-mob{background:#000}